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

Reply via email to