Changeset: 88deed3862f7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=88deed3862f7 Modified Files: sql/server/rel_schema.c sql/server/sql_mvc.h sql/test/Tests/comment-on-table.sql sql/test/Tests/comment-on-table.stable.err sql/test/Tests/comment-on-table.stable.out sql/test/Tests/comment-on-view.sql sql/test/Tests/comment-on-view.stable.err sql/test/Tests/comment-on-view.stable.out Branch: comment-on Log Message:
Check that a VIEW is a view and a TABLE is a table diffs (truncated from 339 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 @@ -1946,89 +1946,103 @@ rel_alter_user(sql_allocator *sa, char * return rel; } +static sqlid +rel_find_designated_schema(mvc *sql, symbol *sym) { + char *sname; + sql_schema *s; + + assert(sym->type == type_string); + sname = sym->data.sval; + if (!(s = mvc_bind_schema(sql, sname))) { + sql_error(sql, 02, "3F000!COMMENT ON:no such schema: %s", sname); + return 0; + } + return s->base.id; +} + +static sqlid +rel_find_designated_table(mvc *sql, symbol *sym) { + dlist *qname; + sql_schema *s; + char *sname; + char *tname; + sql_table *t; + int want_table = sym->token == SQL_TABLE; + + assert(sym->type == type_list); + qname = sym->data.lval; + 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; + } + tname = qname_table(qname); + t = mvc_bind_table(sql, s, tname); + if (t && !want_table == !isKindOfTable(t)) /* comparing booleans can be tricky */ + return t->base.id; + + sql_error(sql, 02, "3F000!COMMENT ON:no such %s: %s.%s", + want_table ? "table" : "view", + s->base.name, tname); + return 0; +} static sqlid -rel_commentable_object(mvc *sql, symbol *catalog_object) { - - switch (catalog_object->token) { - case SQL_SCHEMA: { - char *sname; - sql_schema *s; - - assert(catalog_object->type == type_string); - sname = catalog_object->data.sval; - if (!(s = mvc_bind_schema(sql, sname))) { - sql_error(sql, 02, "3F000!COMMENT ON:no such schema: %s", sname); - return 0; - } - return s->base.id; - } - case SQL_TABLE: - /* fall through */ - case SQL_VIEW: { - dlist *qname; - sql_schema *s; - char *sname; - char *tname; - sql_table *t; +rel_find_designated_column(mvc *sql, symbol *sym) { + char *sname, *tname, *cname; + dlist *colname; + sql_schema *s; + sql_table *t; + sql_column *c; - assert(catalog_object->type == type_list); - qname = catalog_object->data.lval; - 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; - } - tname = qname_table(qname); - if (!(t = mvc_bind_table(sql, s, tname))) { - sql_error(sql, 02, "3F000!COMMENT ON:no such table or view: %s.%s", s->base.name, tname); - return 0; - } - return t->base.id; - } - case SQL_COLUMN: { - char *sname, *tname, *cname; - dlist *colname; - sql_schema *s; - sql_table *t; - sql_column *c; + assert(sym->type == type_list); + colname = sym->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; + } + 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; + } + 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; + } + 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; +} - assert(catalog_object->type == type_list); - 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; - } - 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; - } - 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; - } - 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)); +static sqlid +rel_find_designated_object(mvc *sql, symbol *sym) { + + switch (sym->token) { + case SQL_SCHEMA: + return rel_find_designated_schema(sql, sym); + case SQL_TABLE: + return rel_find_designated_table(sql, sym); + case SQL_VIEW: + return rel_find_designated_table(sql, sym); + case SQL_COLUMN: + return rel_find_designated_column(sql, sym); + default: + sql_error(sql, 2, "!COMMENT ON %s is not supported", token2string(sym->token)); return 0; - } } } @@ -2260,9 +2274,9 @@ rel_schemas(mvc *sql, symbol *s) assert(l->cnt == 2); remark = l->h->next->data.sval; - id = rel_commentable_object(sql, catalog_object); + id = rel_find_designated_object(sql, catalog_object); if (!id) { - /* rel_commentable_object has already set the error message so we don't have to */ + /* rel_find_designated_object has already set the error message so we don't have to */ return NULL; } diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h --- a/sql/server/sql_mvc.h +++ b/sql/server/sql_mvc.h @@ -216,8 +216,6 @@ extern void mvc_create_dependency(mvc *m extern void mvc_create_dependencies(mvc *m, list *id_l, sqlid depend_id, int dep_type); extern int mvc_check_dependency(mvc * m, int id, int type, list *ignore_ids); -extern void mvc_comment_on(mvc *m, int id, const char *remark); - /* variable management */ extern void stack_push_var(mvc *sql, const char *name, sql_subtype *type); extern void stack_push_rel_var(mvc *sql, const char *name, sql_rel *var, sql_subtype *type); diff --git a/sql/test/Tests/comment-on-table.sql b/sql/test/Tests/comment-on-table.sql --- a/sql/test/Tests/comment-on-table.sql +++ b/sql/test/Tests/comment-on-table.sql @@ -38,6 +38,10 @@ SELECT * FROM new_comments(); COMMENT ON TABLE sch.tab IS 'a new comment'; SELECT * FROM new_comments(); +-- accessing it as a view doesn't work +COMMENT ON VIEW sch.tab IS 'a mistake'; +SELECT * FROM new_comments(); + -- drop it by setting it to NULL COMMENT ON TABLE tab IS NULL; SELECT * FROM new_comments(); @@ -51,3 +55,10 @@ SELECT * FROM new_comments(); COMMENT ON TABLE tab IS 'banana'; DROP TABLE tab; SELECT * FROM new_comments(); + +-- remote tables etc also work +CREATE REMOTE TABLE rem (i INT) ON 'mapi:monetdb://foo/bar'; +COMMENT ON TABLE rem IS 'remote table'; +CREATE MERGE TABLE mrg (i INT); +COMMENT ON TABLE mrg IS 'merge table'; +SELECT * FROM new_comments(); diff --git a/sql/test/Tests/comment-on-table.stable.err b/sql/test/Tests/comment-on-table.stable.err --- a/sql/test/Tests/comment-on-table.stable.err +++ b/sql/test/Tests/comment-on-table.stable.err @@ -23,14 +23,16 @@ stderr of test 'comment-on-table` in dir # cmdline opt gdk_dbpath = /Users/joeri/monets/default/var/MonetDB/mTests_sql_test # cmdline opt gdk_debug = 536870922 -# 13:09:12 > -# 13:09:12 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-44551" "--port=32134" -# 13:09:12 > - - +# 11:31:41 > +# 11:31:41 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-29570" "--port=39712" +# 11:31:41 > +MAPI = (monetdb) /var/tmp/mtest-29570/.s.monetdb.39712 +QUERY = COMMENT ON VIEW sch.tab IS 'a mistake'; +ERROR = !COMMENT ON:no such view: sch.tab +CODE = 3F000 -# 13:09:13 > -# 13:09:13 > "Done." -# 13:09:13 > +# 11:31:42 > +# 11:31:42 > "Done." +# 11:31:42 > diff --git a/sql/test/Tests/comment-on-table.stable.out b/sql/test/Tests/comment-on-table.stable.out --- a/sql/test/Tests/comment-on-table.stable.out +++ b/sql/test/Tests/comment-on-table.stable.out @@ -94,6 +94,12 @@ Ready. % .L1, .L1, .L1 # table_name % name, source, remark # name % varchar, varchar, clob # type +% 3, 5, 13 # length +[ "tab", "TABLE", "a new comment" ] +#SELECT * FROM new_comments(); +% .L1, .L1, .L1 # table_name +% name, source, remark # name +% varchar, varchar, clob # type % 0, 0, 0 # length #SELECT * FROM new_comments(); % .L1, .L1, .L1 # table_name @@ -106,6 +112,15 @@ Ready. % name, source, remark # name % varchar, varchar, clob # type % 0, 0, 0 # length +#CREATE REMOTE TABLE rem (i INT) ON 'mapi:monetdb://foo/bar'; +#CREATE MERGE TABLE mrg (i INT); +#SELECT * FROM new_comments(); +% .L1, .L1, .L1 # table_name +% name, source, remark # name +% varchar, varchar, clob # type +% 3, 12, 12 # length +[ "rem", "REMOTE TABLE", "remote table" ] +[ "mrg", "MERGE TABLE", "merge table" ] # 14:25:22 > # 14:25:22 > "Done." diff --git a/sql/test/Tests/comment-on-view.sql b/sql/test/Tests/comment-on-view.sql --- a/sql/test/Tests/comment-on-view.sql +++ b/sql/test/Tests/comment-on-view.sql @@ -35,6 +35,10 @@ COMMENT ON VIEW vivi IS 'a view to a kil COMMENT ON COLUMN vivi.remark IS 'remarkable'; SELECT * FROM new_comments(); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list