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