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