Changeset: ecd7d617bfdf for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ecd7d617bfdf
Added Files:
sql/test/BugTracker-2015/Tests/alias.Bug-3704.sql
sql/test/BugTracker-2015/Tests/alias.Bug-3704.stable.err
sql/test/BugTracker-2015/Tests/alias.Bug-3704.stable.out
sql/test/BugTracker-2015/Tests/assertHead.Bug-3706.sql
sql/test/BugTracker-2015/Tests/assertHead.Bug-3706.stable.err
sql/test/BugTracker-2015/Tests/assertHead.Bug-3706.stable.out
sql/test/BugTracker-2015/Tests/case_aggr.Bug-3705.sql
sql/test/BugTracker-2015/Tests/case_aggr.Bug-3705.stable.err
sql/test/BugTracker-2015/Tests/case_aggr.Bug-3705.stable.out
sql/test/BugTracker-2015/Tests/ifthenelse.Bug-3699.sql
sql/test/BugTracker-2015/Tests/ifthenelse.Bug-3699.stable.err
sql/test/BugTracker-2015/Tests/ifthenelse.Bug-3699.stable.out
sql/test/BugTracker-2015/Tests/insert_into_merge_table_crash.Bug-3703.sql
sql/test/BugTracker-2015/Tests/insert_into_merge_table_crash.Bug-3703.stable.err
sql/test/BugTracker-2015/Tests/insert_into_merge_table_crash.Bug-3703.stable.out
sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693_2.sql
sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693_2.stable.err
sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693_2.stable.out
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_psm.c
sql/server/rel_select.c
sql/server/rel_updates.c
sql/test/BugTracker-2015/Tests/All
tools/merovingian/daemon/merovingian.c
Branch: default
Log Message:
Merge with Oct2014 branch.
diffs (truncated from 1297 to 300 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1894,6 +1894,8 @@ exp_push_down_prj(mvc *sql, sql_exp *e,
ne = exps_bind_column(f->exps, e->r, NULL);
if (!ne || (ne->type != e_column && ne->type != e_atom))
return NULL;
+ if (ne && list_position(f->exps, ne) >= list_position(f->exps,
e))
+ return NULL;
while (ne && f->op == op_project && ne->type == e_column) {
sql_exp *oe = e, *one = ne;
@@ -1903,7 +1905,7 @@ exp_push_down_prj(mvc *sql, sql_exp *e,
ne = exps_bind_column2(f->exps, e->l, e->r);
if (!ne && !e->l)
ne = exps_bind_column(f->exps, e->r, NULL);
- if (ne && list_position(f->exps, ne) >=
list_position(f->exps, one))
+ if (ne && ne != one && list_position(f->exps, ne) >=
list_position(f->exps, one))
ne = NULL;
if (!ne || ne == one) {
ne = one;
@@ -2173,7 +2175,32 @@ rel_merge_projects(int *changes, mvc *sq
for (n = exps->h; n && all; n = n->next) {
sql_exp *e = n->data, *ne = NULL;
+ /* We do not handle expressions pointing back in the
list */
+ if (e->type == e_column) {
+ if (e->l)
+ ne = exps_bind_column2(exps, e->l,
e->r);
+ if (!ne && !e->l)
+ ne = exps_bind_column(exps, e->r, NULL);
+ if (ne && e != ne) {
+ all = 0;
+ break;
+ } else {
+ ne = NULL;
+ }
+ }
ne = exp_push_down_prj(sql, e, prj, prj->l);
+ if (ne && ne->type == e_column) { /* check if the
refered alias name isn't used twice */
+ sql_exp *nne = NULL;
+
+ if (ne->l)
+ nne = exps_bind_column2(rel->exps,
ne->l, ne->r);
+ if (!nne && !ne->l)
+ nne = exps_bind_column(rel->exps,
ne->r, NULL);
+ if (nne && ne != nne && nne != e) {
+ all = 0;
+ break;
+ }
+ }
if (ne) {
exp_setname(sql->sa, ne, exp_relname(e),
exp_name(e));
list_append(rel->exps, ne);
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -172,7 +172,7 @@ rel_psm_declare_table(mvc *sql, dnode *n
support for LEAVE and ITERATE (sql multi-level break and continue)
*/
static sql_exp *
-rel_psm_while_do( mvc *sql, sql_subtype *res, dnode *w, int is_func )
+rel_psm_while_do( mvc *sql, sql_subtype *res, list *restypelist, dnode *w, int
is_func )
{
if (!w)
return NULL;
@@ -184,7 +184,7 @@ rel_psm_while_do( mvc *sql, sql_subtype
cond = rel_logical_value_exp(sql, &rel, n->data.sym, sql_sel);
n = n->next;
- whilestmts = sequential_block(sql, res, NULL, n->data.lval,
n->next->data.sval, is_func);
+ whilestmts = sequential_block(sql, res, restypelist,
n->data.lval, n->next->data.sval, is_func);
if (sql->session->status || !cond || !whilestmts || rel)
return NULL;
@@ -200,7 +200,7 @@ rel_psm_while_do( mvc *sql, sql_subtype
end if
*/
static list *
-psm_if_then_else( mvc *sql, sql_subtype *res, dnode *elseif, int is_func)
+psm_if_then_else( mvc *sql, sql_subtype *res, list *restypelist, dnode
*elseif, int is_func)
{
if (!elseif)
return NULL;
@@ -213,9 +213,9 @@ psm_if_then_else( mvc *sql, sql_subtype
cond = rel_logical_value_exp(sql, &rel, n->data.sym, sql_sel);
n = n->next;
- ifstmts = sequential_block(sql, res, NULL, n->data.lval, NULL,
is_func);
+ ifstmts = sequential_block(sql, res, restypelist, n->data.lval,
NULL, is_func);
n = n->next;
- elsestmts = psm_if_then_else( sql, res, n, is_func);
+ elsestmts = psm_if_then_else( sql, res, restypelist, n,
is_func);
if (sql->session->status || !cond || !ifstmts || rel) {
if (rel)
@@ -228,12 +228,12 @@ psm_if_then_else( mvc *sql, sql_subtype
if (e==NULL || (e->token != SQL_ELSE))
return NULL;
- return sequential_block( sql, res, NULL, e->data.lval, NULL,
is_func);
+ return sequential_block( sql, res, restypelist, e->data.lval,
NULL, is_func);
}
}
static sql_exp *
-rel_psm_if_then_else( mvc *sql, sql_subtype *res, dnode *elseif, int is_func)
+rel_psm_if_then_else( mvc *sql, sql_subtype *res, list *restypelist, dnode
*elseif, int is_func)
{
if (!elseif)
return NULL;
@@ -245,9 +245,9 @@ rel_psm_if_then_else( mvc *sql, sql_subt
cond = rel_logical_value_exp(sql, &rel, n->data.sym, sql_sel);
n = n->next;
- ifstmts = sequential_block(sql, res, NULL, n->data.lval, NULL,
is_func);
+ ifstmts = sequential_block(sql, res, restypelist, n->data.lval,
NULL, is_func);
n = n->next;
- elsestmts = psm_if_then_else( sql, res, n, is_func);
+ elsestmts = psm_if_then_else( sql, res, restypelist, n,
is_func);
if (sql->session->status || !cond || !ifstmts || rel) {
if (rel)
return sql_error(sql, 02, "IF THEN ELSE: No
SELECT statements allowed within the IF condition");
@@ -273,7 +273,7 @@ rel_psm_if_then_else( mvc *sql, sql_subt
END CASE
*/
static list *
-rel_psm_case( mvc *sql, sql_subtype *res, dnode *case_when, int is_func )
+rel_psm_case( mvc *sql, sql_subtype *res, list *restypelist, dnode *case_when,
int is_func )
{
list *case_stmts = sa_list(sql->sa);
@@ -296,7 +296,7 @@ rel_psm_case( mvc *sql, sql_subtype *res
if (rel)
return sql_error(sql, 02, "CASE: No SELECT statements
allowed within the CASE condition");
if (else_statements) {
- else_stmt = sequential_block( sql, res, NULL,
else_statements, NULL, is_func);
+ else_stmt = sequential_block( sql, res, restypelist,
else_statements, NULL, is_func);
if (!else_stmt)
return NULL;
}
@@ -309,7 +309,7 @@ rel_psm_case( mvc *sql, sql_subtype *res
if (!when_value || rel ||
(cond = rel_binop_(sql, v, when_value, NULL, "=",
card_value)) == NULL ||
- (if_stmts = sequential_block( sql, res, NULL,
m->next->data.lval, NULL, is_func)) == NULL ) {
+ (if_stmts = sequential_block( sql, res, restypelist,
m->next->data.lval, NULL, is_func)) == NULL ) {
if (rel)
return sql_error(sql, 02, "CASE: No
SELECT statements allowed within the CASE condition");
return NULL;
@@ -329,7 +329,7 @@ rel_psm_case( mvc *sql, sql_subtype *res
list *else_stmt = NULL;
if (else_statements) {
- else_stmt = sequential_block( sql, res, NULL,
else_statements, NULL, is_func);
+ else_stmt = sequential_block( sql, res, restypelist,
else_statements, NULL, is_func);
if (!else_stmt)
return NULL;
}
@@ -342,7 +342,7 @@ rel_psm_case( mvc *sql, sql_subtype *res
sql_exp *case_stmt = NULL;
if (!cond || rel ||
- (if_stmts = sequential_block( sql, res, NULL,
m->next->data.lval, NULL, is_func)) == NULL ) {
+ (if_stmts = sequential_block( sql, res, restypelist,
m->next->data.lval, NULL, is_func)) == NULL ) {
if (rel)
return sql_error(sql, 02, "CASE: No
SELECT statements allowed within the CASE condition");
return NULL;
@@ -373,9 +373,9 @@ rel_psm_return( mvc *sql, sql_subtype *r
res = rel_value_exp2(sql, &rel, return_sym, sql_sel, ek, &is_last);
if (!res)
return NULL;
- if (ek.card != card_relation && (!res ||
+ if (ek.card != card_relation && (!res || !restype ||
(res = rel_check_type(sql, restype, res, type_equal)) == NULL))
- return NULL;
+ return (!restype)?sql_error(sql, 02, "RETURN: return type does
not match"):NULL;
else if (ek.card == card_relation && !rel)
return NULL;
@@ -542,13 +542,13 @@ sequential_block (mvc *sql, sql_subtype
res = rel_psm_declare_table(sql, s->data.lval->h);
break;
case SQL_WHILE:
- res = rel_psm_while_do(sql, restype, s->data.lval->h,
is_func);
+ res = rel_psm_while_do(sql, restype, restypelist,
s->data.lval->h, is_func);
break;
case SQL_IF:
- res = rel_psm_if_then_else(sql, restype,
s->data.lval->h, is_func);
+ res = rel_psm_if_then_else(sql, restype, restypelist,
s->data.lval->h, is_func);
break;
case SQL_CASE:
- reslist = rel_psm_case(sql, restype, s->data.lval->h,
is_func);
+ reslist = rel_psm_case(sql, restype, restypelist,
s->data.lval->h, is_func);
break;
case SQL_CALL:
res = rel_psm_call(sql, s->data.sym);
@@ -564,6 +564,7 @@ sequential_block (mvc *sql, sql_subtype
res = sql_error(sql, 01,
"Statement after return");
} else {
+ res = NULL;
reslist = rel_psm_return(sql, restype,
restypelist, s->data.sym);
}
}
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
@@ -1176,6 +1176,9 @@ rel_table_optname(mvc *sql, sql_rel *sq,
dnode *d = columnrefs->h;
node *ne = sq->exps->h;
+ MT_lock_set(&sq->exps->ht_lock, "rel_table_optname");
+ sq->exps->ht = NULL;
+ MT_lock_unset(&sq->exps->ht_lock, "rel_table_optname");
for (; d && ne; d = d->next, ne = ne->next) {
sql_exp *e = ne->data;
@@ -2767,8 +2770,11 @@ rel_logical_value_exp(mvc *sql, sql_rel
if (!l) {
l = *rel = rel_project(sql->sa, NULL,
new_exp_list(sql->sa));
rel_project_add_exp(sql, l, ls);
- } else if (f == sql_sel) /* allways add left
side in case of selections phase */
+ } else if (f == sql_sel) { /* allways add left
side in case of selections phase */
+ if (!l->exps || list_empty(l->exps)) /*
add all expressions to the project */
+ l->exps = rel_projections(sql,
l->l, NULL, 0, 1);
rel_project_add_exp(sql, l, ls);
+ }
rel_setsubquery(r);
rs = rel_lastexp(sql, r);
if (r->card > CARD_ATOM) {
diff --git a/sql/test/BugTracker-2015/Tests/All
b/sql/test/BugTracker-2015/Tests/All
--- a/sql/test/BugTracker-2015/Tests/All
+++ b/sql/test/BugTracker-2015/Tests/All
@@ -19,3 +19,8 @@ find_fk.Bug-3690
is_null_limit.Bug-3684
inf-nan-handling.Bug-3696
project_rewrite.Bug-3693
+project_rewrite.Bug-3693_2
+alias.Bug-3704
+case_aggr.Bug-3705
+assertHead.Bug-3706
+ifthenelse.Bug-3699
diff --git a/sql/test/BugTracker-2015/Tests/alias.Bug-3704.sql
b/sql/test/BugTracker-2015/Tests/alias.Bug-3704.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2015/Tests/alias.Bug-3704.sql
@@ -0,0 +1,3 @@
+create table foo (z int);
+select aaa from (select 0,0,0,0,0,foo.z from foo)as t(aaa,b,c,d,e,f);
+drop table foo;
diff --git a/sql/test/BugTracker-2015/Tests/alias.Bug-3704.stable.err
b/sql/test/BugTracker-2015/Tests/alias.Bug-3704.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2015/Tests/alias.Bug-3704.stable.err
@@ -0,0 +1,37 @@
+stderr of test 'alias.Bug-3704` in directory 'sql/test/BugTracker-2015` itself:
+
+
+# 22:58:10 >
+# 22:58:10 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=31851" "--set"
"mapi_usock=/var/tmp/mtest-26173/.s.monetdb.31851" "--set" "monet_prompt="
"--forcemito" "--set" "mal_listing=2"
"--dbpath=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2015"
"--set" "mal_listing=0" "--set" "embedded_r=yes"
+# 22:58:10 >
+
+# builtin opt gdk_dbpath =
/home/niels/scratch/rc-clean/Linux-x86_64/var/monetdb5/dbfarm/demo
+# builtin opt gdk_debug = 0
+# builtin opt gdk_vmtrim = no
+# 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 mapi_open = true
+# cmdline opt mapi_port = 31851
+# cmdline opt mapi_usock = /var/tmp/mtest-26173/.s.monetdb.31851
+# cmdline opt monet_prompt =
+# cmdline opt mal_listing = 2
+# cmdline opt gdk_dbpath =
/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2015
+# cmdline opt mal_listing = 0
+# cmdline opt embedded_r = yes
+# cmdline opt gdk_debug = 536870922
+
+# 22:58:11 >
+# 22:58:11 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-26173" "--port=31851"
+# 22:58:11 >
+
+
+# 22:58:11 >
+# 22:58:11 > "Done."
+# 22:58:11 >
+
diff --git a/sql/test/BugTracker-2015/Tests/alias.Bug-3704.stable.out
b/sql/test/BugTracker-2015/Tests/alias.Bug-3704.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2015/Tests/alias.Bug-3704.stable.out
@@ -0,0 +1,39 @@
+stdout of test 'alias.Bug-3704` in directory 'sql/test/BugTracker-2015` itself:
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list