Changeset: 12beaba33108 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=12beaba33108 Added Files: sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.sql sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.stable.err sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.stable.out sql/test/mergetables/Tests/mergemergeload.sql sql/test/mergetables/Tests/mergemergeload.stable.err sql/test/mergetables/Tests/mergemergeload.stable.out Modified Files: sql/include/sql_catalog.h sql/server/rel_optimizer.c sql/server/rel_updates.c sql/test/mergetables/Tests/All Branch: default Log Message:
merged with jul2015 diffs (truncated from 499 to 300 lines): diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -107,14 +107,14 @@ extern char *TID; typedef enum temp_t { - SQL_PERSIST, - SQL_LOCAL_TEMP, - SQL_GLOBAL_TEMP, - SQL_DECLARED_TABLE, /* variable inside a stored procedure */ - SQL_MERGE_TABLE, - SQL_STREAM, - SQL_REMOTE, - SQL_REPLICA_TABLE + SQL_PERSIST = 0, + SQL_LOCAL_TEMP = 1, + SQL_GLOBAL_TEMP = 2, + SQL_DECLARED_TABLE = 3, /* variable inside a stored procedure */ + SQL_MERGE_TABLE = 4, + SQL_STREAM = 5, + SQL_REMOTE = 6, + SQL_REPLICA_TABLE = 7 } temp_t; typedef enum comp_type { diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -7351,6 +7351,7 @@ rewrite(mvc *sql, sql_rel *rel, rewrite_ case op_insert: case op_update: case op_delete: + rel->l = rewrite(sql, rel->l, rewriter, has_changes); rel->r = rewrite(sql, rel->r, rewriter, has_changes); break; } @@ -7403,6 +7404,7 @@ rewrite_topdown(mvc *sql, sql_rel *rel, case op_insert: case op_update: case op_delete: + rel->l = rewrite_topdown(sql, rel->l, rewriter, has_changes); rel->r = rewrite_topdown(sql, rel->r, rewriter, has_changes); break; } diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -369,6 +369,47 @@ rel_inserts(mvc *sql, sql_table *t, sql_ return exps; } + +static sql_table * +insert_allowed(mvc *sql, sql_table *t, char *tname, char *op, char *opname) +{ + if (!t) { + return sql_error(sql, 02, "42S02!%s: no such table '%s'", op, tname); + } else if (isView(t)) { + return sql_error(sql, 02, "%s: cannot %s view '%s'", op, opname, tname); + } else if (isMergeTable(t)) { + return sql_error(sql, 02, "%s: cannot %s merge table '%s'", op, opname, tname); + } else if (t->access == TABLE_READONLY) { + return sql_error(sql, 02, "%s: cannot %s read only table '%s'", op, opname, tname); + } + if (t && !isTempTable(t) && STORE_READONLY) + return sql_error(sql, 02, "%s: %s table '%s' not allowed in readonly mode", op, opname, tname); + + if (!table_privs(sql, t, PRIV_INSERT)) { + return sql_error(sql, 02, "%s: insufficient privileges for user '%s' to %s table '%s'", op, stack_get_string(sql, "current_user"), opname, tname); + } + return t; +} + +static sql_table * +update_allowed(mvc *sql, sql_table *t, char *tname, char *op, char *opname, int is_delete) +{ + if (!t) { + return sql_error(sql, 02, "42S02!%s: no such table '%s'", op, tname); + } else if (isView(t)) { + return sql_error(sql, 02, "%s: cannot %s view '%s'", op, opname, tname); + } else if (isMergeTable(t)) { + return sql_error(sql, 02, "%s: cannot %s merge table '%s'", op, opname, tname); + } else if (t->access == TABLE_READONLY || t->access == TABLE_APPENDONLY) { + return sql_error(sql, 02, "%s: cannot %s read or append only table '%s'", op, opname, tname); + } + if (t && !isTempTable(t) && STORE_READONLY) + return sql_error(sql, 02, "%s: %s table '%s' not allowed in readonly mode", op, opname, tname); + if (is_delete && !table_privs(sql, t, PRIV_DELETE)) + return sql_error(sql, 02, "%s: insufficient privileges for user '%s' to %s table '%s'", op, stack_get_string(sql, "current_user"), opname, tname); + return t; +} + static sql_rel * insert_into(mvc *sql, dlist *qname, dlist *columns, symbol *val_or_q) { @@ -393,22 +434,8 @@ insert_into(mvc *sql, dlist *qname, dlis if (!t) t = mvc_bind_table(sql, NULL, tname); } - if (!t) { - return sql_error(sql, 02, "42S02!INSERT INTO: no such table '%s'", tname); - } else if (isView(t)) { - return sql_error(sql, 02, "INSERT INTO: cannot insert into view '%s'", tname); - } else if (isMergeTable(t)) { - return sql_error(sql, 02, "INSERT INTO: cannot insert into merge table '%s'", tname); - } else if (t->access == TABLE_READONLY) { - return sql_error(sql, 02, "INSERT INTO: cannot insert into read only table '%s'", tname); - } - if (t && !isTempTable(t) && STORE_READONLY) - return sql_error(sql, 02, "INSERT INTO: insert into table '%s' not allowed in readonly mode", tname); - - if (!table_privs(sql, t, PRIV_INSERT)) { - return sql_error(sql, 02, "INSERT INTO: insufficient privileges for user '%s' to insert into table '%s'", stack_get_string(sql, "current_user"), tname); - } - + if (insert_allowed(sql, t, tname, "INSERT INTO", "insert into") == NULL) + return NULL; collist = check_table_columns(sql, t, columns, "INSERT", tname); if (!collist) return NULL; @@ -821,24 +848,13 @@ update_table(mvc *sql, dlist *qname, dli if (!t) t = stack_find_table(sql, tname); } - if (!t) { - return sql_error(sql, 02, "42S02!UPDATE: no such table '%s'", tname); - } else if (isView(t)) { - return sql_error(sql, 02, "UPDATE: cannot update view '%s'", tname); - } else if (isMergeTable(t)) { - return sql_error(sql, 02, "UPDATE: cannot update merge table '%s'", tname); - } else if (t->access == TABLE_READONLY || t->access == TABLE_APPENDONLY) { - return sql_error(sql, 02, "UPDATE: cannot update read or append only table '%s'", tname); - } else { + if (update_allowed(sql, t, tname, "UPDATE", "update", 0) != NULL) { sql_exp *e = NULL, **updates; sql_rel *r = NULL; list *exps; dnode *n; char *rname = NULL; - if (t && !isTempTable(t) && STORE_READONLY) - return sql_error(sql, 02, "UPDATE: update table '%s' not allowed in readonly mode", tname); - if (opt_where) { int status = sql->session->status; @@ -971,6 +987,7 @@ update_table(mvc *sql, dlist *qname, dli r = rel_update(sql, bt, r, updates, exps); return r; } + return NULL; } sql_rel * @@ -1007,20 +1024,7 @@ delete_table(mvc *sql, dlist *qname, sym if (!t) t = stack_find_table(sql, tname); } - if (!t) { - return sql_error(sql, 02, "42S02!DELETE FROM: no such table '%s'", tname); - } else if (isView(t)) { - return sql_error(sql, 02, "DELETE FROM: cannot delete from view '%s'", tname); - } else if (isMergeTable(t)) { - return sql_error(sql, 02, "DELETE FROM: cannot delete from merge table '%s'", tname); - } else if (t->access == TABLE_READONLY || t->access == TABLE_APPENDONLY) { - return sql_error(sql, 02, "DELETE FROM: cannot delete from read or append only table '%s'", tname); - } - if (t && !isTempTable(t) && STORE_READONLY) - return sql_error(sql, 02, "DELETE FROM: delete from table '%s' not allowed in readonly mode", tname); - if (!table_privs(sql, t, PRIV_DELETE)) { - return sql_error(sql, 02, "DELETE FROM: insufficient privileges for user '%s' to delete from table '%s'", stack_get_string(sql, "current_user"), tname); - } else { + if (update_allowed(sql, t, tname, "DELETE FROM", "delete from", 1) != NULL) { sql_rel *r = NULL; if (opt_where) { @@ -1051,6 +1055,7 @@ delete_table(mvc *sql, dlist *qname, sym } return r; } + return NULL; } static list * @@ -1141,13 +1146,8 @@ copyfrom(mvc *sql, dlist *qname, dlist * if (!t) t = stack_find_table(sql, tname); } - if (!t) - return sql_error(sql, 02, "42S02!COPY INTO: no such table '%s'", tname); - if (t->access == TABLE_READONLY) - return sql_error(sql, 02, "COPY INTO: cannot copy into read only table '%s'", tname); - if (t && !isTempTable(t) && STORE_READONLY) - return sql_error(sql, 02, "COPY INTO: copy into table '%s' not allowed in readonly mode", tname); - + if (insert_allowed(sql, t, tname, "COPY INTO", "copy into") == NULL) + return NULL; /* Only the MONETDB user is allowed copy into with a lock and only on tables without idx */ if (locked && sql->user_id != USER_MONETDB) { @@ -1332,12 +1332,8 @@ bincopyfrom(mvc *sql, dlist *qname, dlis if (!t) t = stack_find_table(sql, tname); } - if (!t) - return sql_error(sql, 02, "42S02!COPY INTO: no such table '%s'", tname); - if (t->access == TABLE_READONLY) - return sql_error(sql, 02, "COPY INTO: cannot copy into read only table '%s'", tname); - if (t && !isTempTable(t) && STORE_READONLY) - return sql_error(sql, 02, "COPY INTO: copy into table '%s' not allowed in readonly mode", tname); + if (insert_allowed(sql, t, tname, "COPY INTO", "copy into") == NULL) + return NULL; if (files == NULL) return sql_error(sql, 02, "COPY INTO: must specify files"); diff --git a/sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.sql b/sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.sql @@ -0,0 +1,3 @@ +CREATE TABLE t1 (i int); +CREATE REMOTE TABLE rt (LIKE t1) ON 'mapi:monetdb://localhost:50000/test'; +SELECT * FROM rt; diff --git a/sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.stable.err b/sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.stable.err @@ -0,0 +1,40 @@ +stderr of test 'local-remotetable-crash.Bug-3754` in directory 'sql/test/BugTracker-2015` itself: + + +# 18:16:19 > +# 18:16:19 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=37515" "--set" "mapi_usock=/var/tmp/mtest-19202/.s.monetdb.37515" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/export/scratch2/zhang/monet-install/Jul2015/debug/var/MonetDB/mTests_sql_test_BugTracker-2015" "--set" "mal_listing=0" "--set" "embedded_r=yes" +# 18:16:19 > + +# builtin opt gdk_dbpath = /export/scratch2/zhang/monet-install/Jul2015/debug/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 = 37515 +# cmdline opt mapi_usock = /var/tmp/mtest-19202/.s.monetdb.37515 +# cmdline opt monet_prompt = +# cmdline opt mal_listing = 2 +# cmdline opt gdk_dbpath = /export/scratch2/zhang/monet-install/Jul2015/debug/var/MonetDB/mTests_sql_test_BugTracker-2015 +# cmdline opt mal_listing = 0 +# cmdline opt embedded_r = yes +# cmdline opt gdk_debug = 536870922 + +# 18:16:20 > +# 18:16:20 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-19202" "--port=37515" +# 18:16:20 > + +MAPI = (monetdb) /var/tmp/mtest-19202/.s.monetdb.37515 +QUERY = SELECT * FROM rt; + + +# 18:16:20 > +# 18:16:20 > "Done." +# 18:16:20 > + diff --git a/sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.stable.out b/sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.stable.out @@ -0,0 +1,75 @@ +stdout of test 'local-remotetable-crash.Bug-3754` in directory 'sql/test/BugTracker-2015` itself: + + +# 18:16:19 > +# 18:16:19 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=37515" "--set" "mapi_usock=/var/tmp/mtest-19202/.s.monetdb.37515" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/export/scratch2/zhang/monet-install/Jul2015/debug/var/MonetDB/mTests_sql_test_BugTracker-2015" "--set" "mal_listing=0" "--set" "embedded_r=yes" +# 18:16:19 > + +# MonetDB 5 server v11.21.0 +# This is an unreleased version +# Serving database 'mTests_sql_test_BugTracker-2015', using 8 threads +# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs and 128bit integers dynamically linked +# Found 15.590 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2015 MonetDB B.V., all rights reserved +# Visit http://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://riga.ins.cwi.nl:37515/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-19202/.s.monetdb.37515 +# MonetDB/GIS module loaded +# Start processing logs sql/sql_logs version 52200 +# Finished processing logs sql/sql_logs +# MonetDB/SQL module loaded +# MonetDB/R module loaded + +Ready. +# SQL catalog created, loading sql scripts once +# loading sql script: 09_like.sql _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list