Changeset: 29da7583caf3 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=29da7583caf3 Added Files: sql/test/Tests/comment-on-column.sql sql/test/Tests/comment-on-column.stable.err sql/test/Tests/comment-on-column.stable.out Modified Files: sql/server/rel_schema.c sql/server/sql_parser.y sql/storage/store.c sql/test/Tests/comment-on-schema.sql sql/test/Tests/comment-on-table.sql Branch: comment-on Log Message:
Support COMMENT ON COLUMN diffs (truncated from 340 to 300 lines): diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -1961,6 +1961,41 @@ rel_commentable_object(mvc *sql, symbol } return t->base.id; } + case SQL_COLUMN: { + char *sname, *tname, *cname; + assert(catalog_object->type == type_list); + dlist *colname = catalog_object->data.lval; + assert(colname->cnt == 2 || colname->cnt == 3); + assert(colname->h->type == type_string); + assert(colname->h->next->type == type_string); + if (colname->cnt == 2) { + sname = NULL; + tname = colname->h->data.sval; + cname = colname->h->next->data.sval; + } else { + // cnt == 3 + sname = colname->h->data.sval; + tname = colname->h->next->data.sval; + assert(colname->h->next->next->type == type_string); + cname = colname->h->next->next->data.sval; + } + sql_schema *s = cur_schema(sql); + if (sname && !(s = mvc_bind_schema(sql, sname))) { + sql_error(sql, 02, "3F000!COMMENT ON:no such schema: %s", sname); + return 0; + } + sql_table *t; + if (!(t = mvc_bind_table(sql, s, tname))) { + sql_error(sql, 02, "3F000!COMMENT ON:no such table: %s.%s", s->base.name, tname); + return 0; + } + sql_column *c; + if (!(c = mvc_bind_column(sql, t, cname))) { + sql_error(sql, 02, "3F000!COMMENT ON:no such column: %s.%s", tname, cname); + return 0; + } + return c->base.id; + } default: { sql_error(sql, 2, "!COMMENT ON %s is not supported", token2string(catalog_object->token)); return 0; diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y --- a/sql/server/sql_parser.y +++ b/sql/server/sql_parser.y @@ -5432,6 +5432,19 @@ comment_on_statement: catalog_object: TABLE qname { $$ = _symbol_create_list( SQL_TABLE, $2); } | SCHEMA ident { $$ = _symbol_create( SQL_SCHEMA, $2); } + | COLUMN ident '.' ident + { dlist *l = L(); + append_string(l, $2); + append_string(l, $4); + $$ = _symbol_create_list( SQL_COLUMN, l ); + } + | COLUMN ident '.' ident '.' ident + { dlist *l = L(); + append_string(l, $2); + append_string(l, $4); + append_string(l, $6); + $$ = _symbol_create_list( SQL_COLUMN, l ); + } ; XML_value_expression: diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3835,6 +3835,7 @@ sys_drop_column(sql_trans *tr, sql_colum return ; table_funcs.table_delete(tr, syscolumn, rid); sql_trans_drop_dependencies(tr, col->base.id); + sql_trans_drop_any_comment(tr, col->base.id); if (col->def && (seq_pos = strstr(col->def, next_value_for))) { sql_sequence * seq = NULL; diff --git a/sql/test/Tests/comment-on-column.sql b/sql/test/Tests/comment-on-column.sql new file mode 100644 --- /dev/null +++ b/sql/test/Tests/comment-on-column.sql @@ -0,0 +1,47 @@ +DROP SCHEMA IF EXISTS sch; +CREATE SCHEMA sch; +SET SCHEMA sch; + +CREATE TABLE origs AS SELECT id FROM sys.comments; + +CREATE FUNCTION all_kinds_of_object() +RETURNS TABLE (id INTEGER, name VARCHAR(50), type VARCHAR(20)) +RETURN TABLE ( + SELECT id, name, table_type_name + FROM sys.tables, sys.table_types + WHERE type = table_type_id + UNION ALL + SELECT id, name, 'SCHEMA' + FROM sys.schemas + UNION ALL + SELECT c.id, t.name || '.' || c.name, 'COLUMN' + FROM sys.columns AS c, sys.tables AS t + WHERE c.table_id = t.id +); + +CREATE FUNCTION new_comments() +RETURNS TABLE (name VARCHAR(30), source VARCHAR(20), remark CLOB) +RETURN TABLE ( + SELECT o.name, o.type, c.remark + FROM sys.comments AS c LEFT JOIN all_kinds_of_object() AS o ON c.id = o.id + WHERE c.id NOT IN (SELECT id FROM origs) +); + +------------------------------------------------------------------------ + +-- create a table and comment on a column +CREATE TABLE tab (i integer, j integer); +COMMENT ON COLUMN tab.i IS 'A column'; +SELECT * FROM new_comments(); + +-- again, with an explicit schema reference +COMMENT ON COLUMN sch.tab.j IS 'Another comment'; +SELECT * FROM new_comments(); + +-- it's dropped if the column is dropped +ALTER TABLE tab DROP COLUMN i; +SELECT * FROM new_comments(); + +-- and if the table is dropped +DROP TABLE tab; +SELECT * FROM new_comments(); diff --git a/sql/test/Tests/comment-on-column.stable.err b/sql/test/Tests/comment-on-column.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/Tests/comment-on-column.stable.err @@ -0,0 +1,34 @@ +stderr of test 'comment-on-column` in directory 'sql/test` itself: + + +# 14:33:08 > +# 14:33:08 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=32241" "--set" "mapi_usock=/var/tmp/mtest-62023/.s.monetdb.32241" "--set" "monet_prompt=" "--forcemito" "--dbpath=/Users/joeri/monets/default/var/MonetDB/mTests_sql_test" +# 14:33:08 > + +# builtin opt gdk_dbpath = /Users/joeri/monets/default/var/monetdb5/dbfarm/demo +# builtin opt gdk_debug = 0 +# builtin opt gdk_vmtrim = no +# builtin opt monet_prompt = > +# builtin opt monet_daemon = no +# builtin opt mapi_port = 50000 +# builtin opt mapi_open = false +# builtin opt mapi_autosense = false +# builtin opt sql_optimizer = default_pipe +# builtin opt sql_debug = 0 +# cmdline opt gdk_nr_threads = 0 +# cmdline opt mapi_open = true +# cmdline opt mapi_port = 32241 +# cmdline opt mapi_usock = /var/tmp/mtest-62023/.s.monetdb.32241 +# cmdline opt monet_prompt = +# cmdline opt gdk_dbpath = /Users/joeri/monets/default/var/MonetDB/mTests_sql_test +# cmdline opt gdk_debug = 536870922 + +# 14:33:08 > +# 14:33:08 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-62023" "--port=32241" +# 14:33:08 > + + +# 14:33:09 > +# 14:33:09 > "Done." +# 14:33:09 > + diff --git a/sql/test/Tests/comment-on-column.stable.out b/sql/test/Tests/comment-on-column.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/Tests/comment-on-column.stable.out @@ -0,0 +1,119 @@ +stdout of test 'comment-on-column` in directory 'sql/test` itself: + + +# 14:33:08 > +# 14:33:08 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=32241" "--set" "mapi_usock=/var/tmp/mtest-62023/.s.monetdb.32241" "--set" "monet_prompt=" "--forcemito" "--dbpath=/Users/joeri/monets/default/var/MonetDB/mTests_sql_test" +# 14:33:08 > + +# MonetDB 5 server v11.26.0 +# This is an unreleased version +# Serving database 'mTests_sql_test', using 8 threads +# Compiled for x86_64-apple-darwin16.5.0/64bit with 128bit integers +# Found 16.000 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2017 MonetDB B.V., all rights reserved +# Visit http://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://dhcp-21.eduroam.cwi.nl:32241/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-62023/.s.monetdb.32241 +# MonetDB/GIS module loaded +# MonetDB/SQL module loaded + +Ready. +# SQL catalog created, loading sql scripts once +# loading sql script: 09_like.sql +# loading sql script: 10_math.sql +# loading sql script: 11_times.sql +# loading sql script: 12_url.sql +# loading sql script: 13_date.sql +# loading sql script: 14_inet.sql +# loading sql script: 15_querylog.sql +# loading sql script: 16_tracelog.sql +# loading sql script: 17_temporal.sql +# loading sql script: 18_index.sql +# loading sql script: 20_vacuum.sql +# loading sql script: 21_dependency_functions.sql +# loading sql script: 22_clients.sql +# loading sql script: 23_skyserver.sql +# loading sql script: 25_debug.sql +# loading sql script: 26_sysmon.sql +# loading sql script: 27_rejects.sql +# loading sql script: 39_analytics.sql +# loading sql script: 39_analytics_hge.sql +# loading sql script: 40_geom.sql +# loading sql script: 40_json.sql +# loading sql script: 40_json_hge.sql +# loading sql script: 41_md5sum.sql +# loading sql script: 45_uuid.sql +# loading sql script: 46_profiler.sql +# loading sql script: 51_sys_schema_extension.sql +# loading sql script: 72_fits.sql +# loading sql script: 75_storagemodel.sql +# loading sql script: 80_statistics.sql +# loading sql script: 80_udf.sql +# loading sql script: 80_udf_hge.sql +# loading sql script: 90_generator.sql +# loading sql script: 90_generator_hge.sql +# loading sql script: 97_comments.sql +# loading sql script: 99_system.sql + +# 14:33:08 > +# 14:33:08 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-62023" "--port=32241" +# 14:33:08 > + +#DROP SCHEMA IF EXISTS sch; +#CREATE SCHEMA sch; +#SET SCHEMA sch; +#CREATE TABLE origs AS SELECT id FROM sys.comments; +#CREATE FUNCTION all_kinds_of_object() +#RETURNS TABLE (id INTEGER, name VARCHAR(50), type VARCHAR(20)) +#RETURN TABLE ( +# SELECT id, name, table_type_name +# FROM sys.tables, sys.table_types +# WHERE type = table_type_id +# UNION ALL +# SELECT id, name, 'SCHEMA' +# FROM sys.schemas +# UNION ALL +# SELECT c.id, t.name || '.' || c.name, 'COLUMN' +# FROM sys.columns AS c, sys.tables AS t +# WHERE c.table_id = t.id +#); +#CREATE FUNCTION new_comments() +#RETURNS TABLE (name VARCHAR(30), source VARCHAR(20), remark CLOB) +#RETURN TABLE ( +# SELECT o.name, o.type, c.remark +# FROM sys.comments AS c LEFT JOIN all_kinds_of_object() AS o ON c.id = o.id +# WHERE c.id NOT IN (SELECT id FROM origs) +#); +#CREATE TABLE tab (i integer, j integer); +#SELECT * FROM new_comments(); +% .L1, .L1, .L1 # table_name +% name, source, remark # name +% varchar, varchar, clob # type +% 5, 6, 8 # length +[ "tab.i", "COLUMN", "A column" ] +#SELECT * FROM new_comments(); +% .L1, .L1, .L1 # table_name +% name, source, remark # name +% varchar, varchar, clob # type +% 5, 6, 15 # length +[ "tab.i", "COLUMN", "A column" ] +[ "tab.j", "COLUMN", "Another comment" ] +#ALTER TABLE tab DROP COLUMN i; +#SELECT * FROM new_comments(); +% .L1, .L1, .L1 # table_name +% name, source, remark # name +% varchar, varchar, clob # type +% 5, 6, 15 # length +[ "tab.j", "COLUMN", "Another comment" ] +#DROP TABLE tab; +#SELECT * FROM new_comments(); +% .L1, .L1, .L1 # table_name +% name, source, remark # name +% varchar, varchar, clob # type +% 0, 0, 0 # length + +# 14:33:09 > +# 14:33:09 > "Done." +# 14:33:09 > + diff --git a/sql/test/Tests/comment-on-schema.sql b/sql/test/Tests/comment-on-schema.sql --- a/sql/test/Tests/comment-on-schema.sql +++ b/sql/test/Tests/comment-on-schema.sql @@ -5,7 +5,7 @@ SET SCHEMA sch; CREATE TABLE origs AS SELECT id FROM sys.comments; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list