Changeset: c0f7bbcff9ec for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c0f7bbcff9ec
Modified Files:
        sql/server/rel_select.c
        sql/server/rel_select.h
        sql/server/rel_semantic.c
        sql/server/sql_parser.y
        sql/test/BugTracker-2012/Tests/All
        sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.sql
        sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.stable.err
        sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.stable.out
Branch: Dec2011
Log Message:

added with in 'derived tables' see bug 3043


diffs (253 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
@@ -1215,10 +1215,49 @@ rel_subquery_optname(mvc *sql, sql_rel *
        return rel_table_optname(sql, sq, sn->name);
 }
 
+sql_rel *
+rel_with_query(mvc *sql, symbol *q ) 
+{
+       dnode *d = q->data.lval->h;
+       symbol *select = d->next->data.sym;
+       sql_rel *rel;
+
+       stack_push_frame(sql, "WITH");
+       /* first handle all with's (ie inlined views) */
+       for (d = d->data.lval->h; d; d = d->next) {
+               symbol *sym = d->data.sym;
+               dnode *dn = sym->data.lval->h;
+               char *name = qname_table(dn->data.lval);
+               sql_rel *nrel;
+
+               if (frame_find_var(sql, name)) {
+                       return sql_error(sql, 01, "Variable '%s' allready 
declared", name);
+               }
+               nrel = rel_semantic(sql, sym);
+               if (!nrel) {  
+                       stack_pop_frame(sql);
+                       return NULL;
+               }
+               stack_push_rel_view(sql, name, nrel);
+               assert(is_project(nrel->op));
+               if (is_project(nrel->op) && nrel->exps) {
+                       node *ne = nrel->exps->h;
+
+                       for (; ne; ne = ne->next) 
+                               noninternexp_setname(sql->sa, ne->data, name, 
NULL );
+               }
+       }
+       rel = rel_semantic(sql, select);
+       stack_pop_frame(sql);
+       return rel;
+}
+
 static sql_rel *
 query_exp_optname(mvc *sql, sql_rel *r, symbol *q)
 {
        switch (q->token) {
+       case SQL_WITH:
+               return rel_with_query(sql, q);
        case SQL_UNION:
        case SQL_EXCEPT:
        case SQL_INTERSECT:
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -82,5 +82,6 @@ extern char * rel_name( sql_rel *r );
 extern sql_rel *rel_groupby(sql_allocator *sa, sql_rel *l, list *groupbyexps );
 extern sql_exp *rel_groupby_add_aggr(mvc *sql, sql_rel *rel, sql_exp *e);
 extern sql_rel *rel_inplace_groupby(sql_rel *rel, sql_rel *l, list 
*groupbyexps, list *exps );
+extern sql_rel *rel_with_query(mvc *sql, symbol *q);
 
 #endif /*_REL_SELECT_H_*/
diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c
--- a/sql/server/rel_semantic.c
+++ b/sql/server/rel_semantic.c
@@ -223,40 +223,7 @@ rel_semantic(mvc *sql, symbol *s)
                return rel_updates(sql, s);
 
        case SQL_WITH:
-       {
-               dnode *d = s->data.lval->h;
-               symbol *select = d->next->data.sym;
-               sql_rel *rel = NULL;
-
-               stack_push_frame(sql, "WITH");
-               /* first handle all with's (ie inlined views) */
-               for (d = d->data.lval->h; d; d = d->next) {
-                       symbol *sym = d->data.sym;
-                       dnode *dn = sym->data.lval->h;
-                       char *name = qname_table(dn->data.lval);
-                       sql_rel *nrel;
-
-                       if (frame_find_var(sql, name)) {
-                               return sql_error(sql, 01, "Variable '%s' 
allready declared", name);
-                       }
-                       nrel = rel_semantic(sql, sym);
-                       if (!nrel) {  
-                               stack_pop_frame(sql);
-                               return NULL;
-                       }
-                       stack_push_rel_view(sql, name, nrel);
-                       assert(is_project(nrel->op));
-                       if (is_project(nrel->op) && nrel->exps) {
-                               node *ne = nrel->exps->h;
-       
-                               for (; ne; ne = ne->next) 
-                                       noninternexp_setname(sql->sa, ne->data, 
name, NULL );
-                       }
-               }
-               rel = rel_semantic(sql, select);
-               stack_pop_frame(sql);
-               return rel;
-       }
+               return rel_with_query(sql, s);
 
        case SQL_MULSTMT: {
                dnode *d;
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -107,6 +107,7 @@ int yydebug=1;
        set_statement
        sql
        sqlstmt
+       with_query
        schema
        opt_schema_default_char_set
        opt_path_specification
@@ -2818,7 +2819,11 @@ join_spec:
 
 RECURSIVE and <search or cycle clause> are currently not supported
 */
-sql:
+
+sql: with_query
+       ;
+
+with_query:
        WITH with_list query_expression
        {
                dlist *l = L();
@@ -2826,7 +2831,7 @@ sql:
                append_symbol(l, $3);
                $$ = _symbol_create_list( SQL_WITH, l ); 
        }
- ;
+  ;
 
 with_list:
        with_list ',' with_list_element  { $$ = append_symbol($1, $3); }
@@ -3336,6 +3341,8 @@ subquery:
     '(' select_no_parens ')'   { $$ = $2; }
  |  '(' VALUES row_commalist ')'       
                                { $$ = _symbol_create_list( SQL_VALUES, $3); }
+ |  '(' with_query ')' 
+                               { $$ = $2; }
  ;
 
        /* simple_scalar expressions */
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
@@ -12,3 +12,4 @@ innerjoin_subquery.Bug-3034
 rangejoin.Bug-3017
 outerjoin_select.Bug-2946
 leftjoin-Bug.3041
+with_in_derived_table.Bug-3043
diff --git a/sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.sql 
b/sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.sql
@@ -0,0 +1,4 @@
+SELECT * FROM (
+    WITH x AS (SELECT 1)
+        SELECT * FROM x
+) y;
diff --git 
a/sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.stable.err 
b/sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.stable.err
@@ -0,0 +1,37 @@
+stderr of test 'with_in_derived_table.Bug-3043` in directory 
'test/BugTracker-2012` itself:
+
+
+# 22:12:58 >  
+# 22:12:58 >  "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=32544" "--set" "monet_prompt=" "--trace" 
"--forcemito" "--set" "mal_listing=2" "--dbname=mTests_test_BugTracker-2012" 
"--set" "mal_listing=0"
+# 22:12:58 >  
+
+# 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 = 32544
+# cmdline opt  monet_prompt = 
+# cmdline opt  mal_listing = 2
+# cmdline opt  gdk_dbname = mTests_test_BugTracker-2012
+# cmdline opt  mal_listing = 0
+
+# 22:12:59 >  
+# 22:12:59 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=niels" 
"--port=32544"
+# 22:12:59 >  
+
+
+# 22:12:59 >  
+# 22:12:59 >  "Done."
+# 22:12:59 >  
+
diff --git 
a/sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.stable.out 
b/sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.stable.out
@@ -0,0 +1,39 @@
+stdout of test 'with_in_derived_table.Bug-3043` in directory 
'test/BugTracker-2012` itself:
+
+
+# 22:12:58 >  
+# 22:12:58 >  "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=32544" "--set" "monet_prompt=" "--trace" 
"--forcemito" "--set" "mal_listing=2" "--dbname=mTests_test_BugTracker-2012" 
"--set" "mal_listing=0"
+# 22:12:58 >  
+
+# MonetDB 5 server v11.7.8
+# 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.779 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:32544/
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+
+Ready.
+
+# 22:12:59 >  
+# 22:12:59 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=niels" 
"--port=32544"
+# 22:12:59 >  
+
+#SELECT * FROM (
+#    WITH x AS (SELECT 1)
+#        SELECT * FROM x
+#) y;
+% .x # table_name
+% L1 # name
+% tinyint # type
+% 1 # length
+[ 1    ]
+
+# 22:12:59 >  
+# 22:12:59 >  "Done."
+# 22:12:59 >  
+
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to