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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list