Changeset: c5d5276e6165 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c5d5276e6165 Added Files: sql/test/Tests/comment-on-routine.sql sql/test/Tests/comment-on-routine.stable.err sql/test/Tests/comment-on-routine.stable.out Modified Files: sql/server/rel_schema.c sql/server/sql_parser.h sql/server/sql_parser.y sql/storage/store.c sql/test/Tests/All sql/test/Tests/comment-on-column.sql sql/test/Tests/comment-on-index.sql sql/test/Tests/comment-on-schema.sql sql/test/Tests/comment-on-sequence.sql sql/test/Tests/comment-on-table.sql sql/test/Tests/comment-on-view.sql Branch: comment-on Log Message:
Comment on functions, procedures, etc diffs (truncated from 540 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 @@ -2082,6 +2082,49 @@ rel_find_designated_sequence(mvc *sql, s return 0; } + +static sqlid +rel_find_designated_routine(mvc *sql, symbol *sym) { + (void)sql; + (void)sym; + dlist *designator; + dlist *qname; + dlist *typelist; + int func_type; + char *sname; + sql_schema *s; + char *fname; + sql_func *func; + + + assert(sym->type == type_list); + designator = sym->data.lval; + assert(designator->cnt == 3); + qname = designator->h->data.lval; + typelist = designator->h->next->data.lval; + func_type = designator->h->next->next->data.i_val; + + s = cur_schema(sql); + sname = qname_schema(qname); + if (sname && !(s = mvc_bind_schema(sql, sname))) { + sql_error(sql, 02, "3F000!COMMENT ON:no such schema: %s", sname); + return 0; + } + + fname = qname_func(qname); + func = resolve_func(sql, s, fname, typelist, func_type, "COMMENT"); + if (!func && func_type == F_FUNC) { + // functions returning a table have a special type + func = resolve_func(sql, s, fname, typelist, F_UNION, "COMMENT"); + } + if (func) + return func->base.id; + + if (sql->errstr[0] == '\0') + sql_error(sql, 02, "3F000!COMMENT ON:no such routine: %s.%s", s->base.name, fname); + return 0; +} + static sqlid rel_find_designated_object(mvc *sql, symbol *sym) { @@ -2098,6 +2141,8 @@ rel_find_designated_object(mvc *sql, sym return rel_find_designated_index(sql, sym); case SQL_SEQUENCE: return rel_find_designated_sequence(sql, sym); + case SQL_ROUTINE: + return rel_find_designated_routine(sql, sym); default: sql_error(sql, 2, "!COMMENT ON %s is not supported", token2string(sym->token)); return 0; diff --git a/sql/server/sql_parser.h b/sql/server/sql_parser.h --- a/sql/server/sql_parser.h +++ b/sql/server/sql_parser.h @@ -144,6 +144,7 @@ typedef enum tokens { SQL_FRAME, SQL_COMPARE, SQL_FILTER, + SQL_ROUTINE, SQL_TEMP_LOCAL, SQL_TEMP_GLOBAL, SQL_INT_VALUE, 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 @@ -5485,6 +5485,7 @@ catalog_object: } | INDEX qname { $$ = _symbol_create_list( SQL_INDEX, $2 ); } | SEQUENCE qname { $$ = _symbol_create_list( SQL_SEQUENCE, $2 ); } + | routine_designator { $$ = _symbol_create_list( SQL_ROUTINE, $1 ); } ; XML_value_expression: @@ -6151,6 +6152,7 @@ char *token2string(int token) SQL(FRAME); SQL(COMPARE); SQL(FILTER); + SQL(ROUTINE); SQL(TEMP_LOCAL); SQL(TEMP_GLOBAL); SQL(INT_VALUE); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3937,6 +3937,7 @@ sys_drop_func(sql_trans *tr, sql_func *f table_funcs.table_delete(tr, sys_tab_func, rid_func); sql_trans_drop_dependencies(tr, func->base.id); + sql_trans_drop_any_comment(tr, func->base.id); tr->schema_updates ++; diff --git a/sql/test/Tests/All b/sql/test/Tests/All --- a/sql/test/Tests/All +++ b/sql/test/Tests/All @@ -107,6 +107,7 @@ comment-on-view comment-on-column comment-on-index comment-on-sequence +comment-on-routine #HAVE_GEOM?trace diff --git a/sql/test/Tests/comment-on-column.sql b/sql/test/Tests/comment-on-column.sql --- a/sql/test/Tests/comment-on-column.sql +++ b/sql/test/Tests/comment-on-column.sql @@ -5,7 +5,7 @@ SET SCHEMA sch; CREATE TABLE origs AS SELECT id FROM sys.comments; CREATE FUNCTION all_kinds_of_object() -RETURNS TABLE (id INTEGER, name VARCHAR(80), type VARCHAR(20)) +RETURNS TABLE (id INTEGER, name VARCHAR(80), type VARCHAR(30)) RETURN TABLE ( SELECT id, name, table_type_name FROM sys.tables, sys.table_types @@ -23,10 +23,14 @@ RETURN TABLE ( UNION ALL SELECT id, name, 'SEQUENCE' FROM sys.sequences + UNION ALL + SELECT id, name, function_type_name + FROM sys.functions, sys.function_types + WHERE type = function_type_id ); CREATE FUNCTION new_comments() -RETURNS TABLE (name VARCHAR(80), source VARCHAR(20), remark CLOB) +RETURNS TABLE (name VARCHAR(80), source VARCHAR(30), 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 diff --git a/sql/test/Tests/comment-on-index.sql b/sql/test/Tests/comment-on-index.sql --- a/sql/test/Tests/comment-on-index.sql +++ b/sql/test/Tests/comment-on-index.sql @@ -5,7 +5,7 @@ SET SCHEMA sch; CREATE TABLE origs AS SELECT id FROM sys.comments; CREATE FUNCTION all_kinds_of_object() -RETURNS TABLE (id INTEGER, name VARCHAR(80), type VARCHAR(20)) +RETURNS TABLE (id INTEGER, name VARCHAR(80), type VARCHAR(30)) RETURN TABLE ( SELECT id, name, table_type_name FROM sys.tables, sys.table_types @@ -23,10 +23,14 @@ RETURN TABLE ( UNION ALL SELECT id, name, 'SEQUENCE' FROM sys.sequences + UNION ALL + SELECT id, name, function_type_name + FROM sys.functions, sys.function_types + WHERE type = function_type_id ); CREATE FUNCTION new_comments() -RETURNS TABLE (name VARCHAR(80), source VARCHAR(20), remark CLOB) +RETURNS TABLE (name VARCHAR(80), source VARCHAR(30), 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 diff --git a/sql/test/Tests/comment-on-routine.sql b/sql/test/Tests/comment-on-routine.sql new file mode 100644 --- /dev/null +++ b/sql/test/Tests/comment-on-routine.sql @@ -0,0 +1,69 @@ +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(80), type VARCHAR(30)) +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 + UNION ALL + SELECT id, name, 'INDEX' + FROM sys.idxs + UNION ALL + SELECT id, name, 'SEQUENCE' + FROM sys.sequences + UNION ALL + SELECT id, name, function_type_name + FROM sys.functions, sys.function_types + WHERE type = function_type_id +); + +CREATE FUNCTION new_comments() +RETURNS TABLE (name VARCHAR(80), source VARCHAR(30), 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 FUNCTION f() RETURNS INT RETURN 42; +CREATE FUNCTION f(i INT) RETURNS INT RETURN 2 * i; +CREATE FUNCTION f(i INT, j INT) RETURNS INT RETURN i + j; +CREATE FUNCTION g(i INT) RETURNS TABLE (j INT) RETURN SELECT i; + +COMMENT ON FUNCTION f() IS 'function with no parameters'; +COMMENT ON FUNCTION f(INT) IS 'function with one parameter'; +COMMENT ON FUNCTION f(INT, INT) IS 'function with two parameters'; +COMMENT ON FUNCTION g IS 'table returning function'; +COMMENT ON PROCEDURE sys.comment_on(int, varchar(65000)) IS 'sys comment_on'; +SELECT * FROM new_comments(); + +-- drop one, check if the right one disappears +COMMENT ON FUNCTION f(INT) is NULL; +SELECT * FROM new_comments(); + +-- if there is no ambiguity we can leave out the parameter list +COMMENT ON PROCEDURE sys.comment_on IS NULL; +SELECT * FROM new_comments(); + +-- if there is ambiguity we can't +COMMENT ON FUNCTION f IS 'ambiguous'; + +-- dropping the functions cascades to the comments +DROP FUNCTION f(INT); +DROP FUNCTION f(INT, INT); +DROP FUNCTION f(); +SELECT * FROM new_comments(); diff --git a/sql/test/Tests/comment-on-routine.stable.err b/sql/test/Tests/comment-on-routine.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/Tests/comment-on-routine.stable.err @@ -0,0 +1,39 @@ +stderr of test 'comment-on-routine` in directory 'sql/test` itself: + + +# 14:09:09 > +# 14:09:09 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=31366" "--set" "mapi_usock=/var/tmp/mtest-70902/.s.monetdb.31366" "--set" "monet_prompt=" "--forcemito" "--dbpath=/Users/joeri/monets/default/var/MonetDB/mTests_sql_test" "--set" "embedded_r=yes" +# 14:09:09 > + +# 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 = 31366 +# cmdline opt mapi_usock = /var/tmp/mtest-70902/.s.monetdb.31366 +# cmdline opt monet_prompt = +# cmdline opt gdk_dbpath = /Users/joeri/monets/default/var/MonetDB/mTests_sql_test +# cmdline opt embedded_r = yes +# cmdline opt gdk_debug = 536870922 + +# 14:09:10 > +# 14:09:10 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-70902" "--port=31366" +# 14:09:10 > + +MAPI = (monetdb) /var/tmp/mtest-70902/.s.monetdb.31366 +QUERY = COMMENT ON FUNCTION f IS 'ambiguous'; +ERROR = !COMMENT FUNCTION: there are more than one function called 'f', please use the full signature +CODE = 42000 + +# 14:09:10 > +# 14:09:10 > "Done." +# 14:09:10 > + diff --git a/sql/test/Tests/comment-on-routine.stable.out b/sql/test/Tests/comment-on-routine.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/Tests/comment-on-routine.stable.out @@ -0,0 +1,135 @@ +stdout of test 'comment-on-routine` in directory 'sql/test` itself: + + +# 14:09:09 > +# 14:09:09 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=31366" "--set" "mapi_usock=/var/tmp/mtest-70902/.s.monetdb.31366" "--set" "monet_prompt=" "--forcemito" "--dbpath=/Users/joeri/monets/default/var/MonetDB/mTests_sql_test" "--set" "embedded_r=yes" +# 14:09:09 > + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list