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

Reply via email to