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

Reply via email to