Changeset: 6a9b850bc58f for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6a9b850bc58f Added Files: sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.sql sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.stable.err sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.stable.out Modified Files: sql/server/rel_select.c sql/server/sql_mvc.c sql/server/sql_mvc.h sql/test/BugTracker-2012/Tests/All Branch: Jul2012 Log Message:
fix bug 3099. ie don't lookup views outside the from. diffs (295 lines): diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1612,7 +1612,7 @@ table_ref(mvc *sql, sql_rel *rel, symbol tpe->comp_type) { temp_table = stack_find_rel_var(sql, tname); t = tpe->comp_type; - } else { + } else if (sql->use_views){ temp_table = stack_find_rel_view(sql, tname); } if (temp_table) @@ -1771,7 +1771,7 @@ rel_column_ref(mvc *sql, sql_rel **rel, /* some views are just in the stack, like before and after updates views */ - if (!exp) { + if (!exp && sql->use_views) { sql_rel *v = stack_find_rel_view(sql, tname); if (v) { @@ -5067,6 +5067,7 @@ rel_query(mvc *sql, sql_rel *rel, symbol sql_rel *res = NULL; SelectNode *sn = NULL; int used = 0; + int old = sql->use_views; if (sq->token != SQL_SELECT) return table_ref(sql, rel, sq); @@ -5080,6 +5081,7 @@ rel_query(mvc *sql, sql_rel *rel, symbol return sql_error(sql, 01, "SELECT: ORDER BY only allowed on outermost SELECT"); + sql->use_views = 1; if (sn->from) { /* keep variable list with tables and names */ dlist *fl = sn->from->data.lval; dnode *n = NULL; @@ -5111,8 +5113,10 @@ rel_query(mvc *sql, sql_rel *rel, symbol res = rel_crossproduct(sql->sa, rel, res, op_join); } } else if (toplevel || !res) { /* only on top level query */ + sql->use_views = old; return rel_simple_select(sql, rel, sn->where, sn->selection, sn->distinct); } + sql->use_views = old; if (res) rel = rel_select_exp(sql, res, rel, sn, ek); return rel; diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c --- a/sql/server/sql_mvc.c +++ b/sql/server/sql_mvc.c @@ -409,6 +409,7 @@ mvc_create(int clientid, backend_stack s m->vars = NEW_ARRAY(sql_var, m->sizevars); m->topvars = 0; m->frame = 1; + m->use_views = 0; m->argmax = MAXPARAMS; m->args = NEW_ARRAY(atom*,m->argmax); m->argc = 0; 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 @@ -90,6 +90,7 @@ typedef struct mvc { int topvars; int sizevars; int frame; + int use_views; atom **args; int argc; int argmax; diff --git a/sql/test/BugTracker-2012/Tests/All b/sql/test/BugTracker-2012/Tests/All --- a/sql/test/BugTracker-2012/Tests/All +++ b/sql/test/BugTracker-2012/Tests/All @@ -44,3 +44,4 @@ predicate_select.Bug-3090 hash_join_crash.Bug-3089 row-number-nyi.Bug-3087 insert_serial_with_unique_key.Bug-3091 +with_and_exists.Bug-3099 diff --git a/sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.sql b/sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.sql @@ -0,0 +1,56 @@ +CREATE TABLE rank (pre INTEGER, post INTEGER); +INSERT INTO rank VALUES (1, 6); +INSERT INTO rank VALUES (2, 3); +INSERT INTO rank VALUES (4, 5); + +WITH + span1 AS ( SELECT pre FROM rank ), + span2 AS ( SELECT pre FROM rank ) +SELECT span1.pre AS pre1, span2.pre AS pre2 +FROM span1, span2 +WHERE EXISTS ( + SELECT 1 + FROM rank as ancestor + WHERE ancestor.pre < span1.pre + AND span1.pre < ancestor.post + AND ancestor.pre < span2.pre + AND span2.pre < ancestor.post) +AND span1.pre <> span2.pre; + +WITH + span1 AS ( SELECT pre AS pre1 FROM rank ), + span2 AS ( SELECT pre AS pre2 FROM rank ) +SELECT DISTINCT span1.pre1, span2.pre2 +FROM span1, span2 +WHERE EXISTS ( + SELECT 1 + FROM rank as ancestor + WHERE ancestor.pre < span1.pre1 + AND span1.pre1 < ancestor.post + AND ancestor.pre < span2.pre2 + AND span2.pre2 < ancestor.post) +AND span1.pre1 <> span2.pre2; + +SELECT DISTINCT span1.pre, span2.pre +FROM rank AS span1, rank AS span2 +WHERE EXISTS ( + SELECT ancestor.pre + FROM rank as ancestor + WHERE ancestor.pre < span1.pre + AND span1.pre < ancestor.post + AND ancestor.pre < span2.pre + AND span2.pre < ancestor.post) +AND span1.pre <> span2.pre; + +WITH + span1 AS ( SELECT pre FROM rank ), + span2 AS ( SELECT pre FROM rank ) +SELECT DISTINCT span1.pre, span2.pre +FROM span1, span2, rank AS ancestor +WHERE ancestor.pre < span1.pre +AND span1.pre < ancestor.post +AND ancestor.pre < span2.pre +AND span2.pre < ancestor.post +AND span1.pre <> span2.pre; + +drop table rank; diff --git a/sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.stable.err b/sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.stable.err @@ -0,0 +1,37 @@ +stderr of test 'with_and_exists.Bug-3099` in directory 'test/BugTracker-2012` itself: + + +# 14:21:26 > +# 14:21:26 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "gdk_dbfarm=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB" "--set" "mapi_open=true" "--set" "mapi_port=34975" "--set" "monet_prompt=" "--trace" "--forcemito" "--set" "mal_listing=2" "--dbname=mTests_test_BugTracker-2012" "--set" "mal_listing=0" +# 14:21:26 > + +# builtin opt gdk_dbname = demo +# builtin opt gdk_dbfarm = /home/niels/scratch/rc-clean/Linux-x86_64/var/monetdb5/dbfarm +# builtin opt gdk_debug = 0 +# builtin opt gdk_alloc_map = no +# builtin opt gdk_vmtrim = yes +# 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 gdk_dbfarm = /home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB +# cmdline opt mapi_open = true +# cmdline opt mapi_port = 34975 +# cmdline opt monet_prompt = +# cmdline opt mal_listing = 2 +# cmdline opt gdk_dbname = mTests_test_BugTracker-2012 +# cmdline opt mal_listing = 0 + +# 14:21:26 > +# 14:21:26 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=niels" "--port=34975" +# 14:21:26 > + + +# 14:21:27 > +# 14:21:27 > "Done." +# 14:21:27 > + diff --git a/sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.stable.out b/sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.stable.out @@ -0,0 +1,109 @@ +stdout of test 'with_and_exists.Bug-3099` in directory 'test/BugTracker-2012` itself: + + +# 14:21:26 > +# 14:21:26 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "gdk_dbfarm=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB" "--set" "mapi_open=true" "--set" "mapi_port=34975" "--set" "monet_prompt=" "--trace" "--forcemito" "--set" "mal_listing=2" "--dbname=mTests_test_BugTracker-2012" "--set" "mal_listing=0" +# 14:21:26 > + +# MonetDB 5 server v11.11.0 +# This is an unreleased version +# Serving database 'mTests_test_BugTracker-2012', using 4 threads +# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically linked +# Found 3.778 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2012 MonetDB B.V., all rights reserved +# Visit http://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://niels.nesco.mine.nu:34975/ +# MonetDB/GIS module loaded +# MonetDB/JAQL module loaded +# MonetDB/SQL module loaded + +Ready. + +# 14:21:26 > +# 14:21:26 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=niels" "--port=34975" +# 14:21:26 > + +#CREATE TABLE rank (pre INTEGER, post INTEGER); +#INSERT INTO rank VALUES (1, 6); +[ 1 ] +#INSERT INTO rank VALUES (2, 3); +[ 1 ] +#INSERT INTO rank VALUES (4, 5); +[ 1 ] +#WITH +# span1 AS ( SELECT pre FROM rank ), +# span2 AS ( SELECT pre FROM rank ) +#SELECT span1.pre AS pre1, span2.pre AS pre2 +#FROM span1, span2 +#WHERE EXISTS ( +# SELECT 1 +# FROM rank as ancestor +# WHERE ancestor.pre < span1.pre +# AND span1.pre < ancestor.post +# AND ancestor.pre < span2.pre +# AND span2.pre < ancestor.post) +#AND span1.pre <> span2.pre; +% sys.span1, sys.span2 # table_name +% pre1, pre2 # name +% int, int # type +% 1, 1 # length +[ 2, 4 ] +[ 4, 2 ] +#WITH +# span1 AS ( SELECT pre AS pre1 FROM rank ), +# span2 AS ( SELECT pre AS pre2 FROM rank ) +#SELECT DISTINCT span1.pre1, span2.pre2 +#FROM span1, span2 +#WHERE EXISTS ( +# SELECT 1 +# FROM rank as ancestor +# WHERE ancestor.pre < span1.pre1 +# AND span1.pre1 < ancestor.post +# AND ancestor.pre < span2.pre2 +# AND span2.pre2 < ancestor.post) +#AND span1.pre1 <> span2.pre2; +% sys.span1, sys.span2 # table_name +% pre1, pre2 # name +% int, int # type +% 1, 1 # length +[ 2, 4 ] +[ 4, 2 ] +#SELECT DISTINCT span1.pre, span2.pre +#FROM rank AS span1, rank AS span2 +#WHERE EXISTS ( +# SELECT ancestor.pre +# FROM rank as ancestor +# WHERE ancestor.pre < span1.pre +# AND span1.pre < ancestor.post +# AND ancestor.pre < span2.pre +# AND span2.pre < ancestor.post) +#AND span1.pre <> span2.pre; +% sys.span1, sys.span2 # table_name +% pre, pre # name +% int, int # type +% 1, 1 # length +[ 2, 4 ] +[ 4, 2 ] +#WITH +# span1 AS ( SELECT pre FROM rank ), +# span2 AS ( SELECT pre FROM rank ) +#SELECT DISTINCT span1.pre, span2.pre +#FROM span1, span2, rank AS ancestor +#WHERE ancestor.pre < span1.pre +#AND span1.pre < ancestor.post +#AND ancestor.pre < span2.pre +#AND span2.pre < ancestor.post +#AND span1.pre <> span2.pre; +% sys.span1, sys.span2 # table_name +% pre, pre # name +% int, int # type +% 1, 1 # length +[ 2, 4 ] +[ 4, 2 ] +#drop table rank; + +# 14:21:27 > +# 14:21:27 > "Done." +# 14:21:27 > + _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list