Changeset: 2e3db18e21f2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2e3db18e21f2
Added Files:
        sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.stable.out.single
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-algebra-join-not-in.Bug-6519.stable.err
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-algebra-join-not-in.Bug-6519.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-count-not-in.Bug-6518.stable.err
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-count-not-in.Bug-6518.stable.out
        
sql/test/BugTracker-2018/Tests/update-with-correlated-subquery.Bug-6520.sql
        
sql/test/BugTracker-2018/Tests/update-with-correlated-subquery.Bug-6520.stable.err
        
sql/test/BugTracker-2018/Tests/update-with-correlated-subquery.Bug-6520.stable.out
Modified Files:
        sql/server/rel_rel.c
        sql/server/rel_select.c
        sql/test/BugTracker-2018/Tests/All
Branch: default
Log Message:

Merge with Jul2017 branch.


diffs (truncated from 636 to 300 lines):

diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -397,6 +397,7 @@ rel_setop_check_types(mvc *sql, sql_rel 
        list *nls = new_exp_list(sql->sa);
        list *nrs = new_exp_list(sql->sa);
        node *n, *m;
+
        if(!nls || !nrs)
                return NULL;
 
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
@@ -136,6 +136,17 @@ static sql_exp *
 }
 
 static sql_exp *
+rel_firstexp(sql_rel *rel )
+{
+       sql_exp *e;
+
+       assert(list_length(rel->exps));
+       assert(is_project(rel->op));
+       e = rel->exps->h->data;
+       return e;
+}
+
+static sql_exp *
 rel_lastexp(mvc *sql, sql_rel *rel )
 {
        sql_exp *e;
@@ -2520,7 +2531,7 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                symbol *lo = NULL;
                dnode *n = dl->h->next, *dn = NULL;
                sql_rel *left = NULL, *right = NULL, *select = NULL;
-               sql_exp *l = NULL, *e, *r = NULL;
+               sql_exp *l = NULL, *e, *r = NULL, *lident = NULL, *rident = 
NULL, *roident = NULL;
                list *vals = NULL, *ll = sa_list(sql->sa);
                int correlated = 0, l_is_value = 1;
                list *pexps = NULL;
@@ -2633,12 +2644,31 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                                                sql->session->status = 0;
                                                sql->errstr[0] = 0;
 
-                                               if (!l_is_value) 
+                                               if (!l_is_value) {
+                                                       if (!correlated) { /* 
first add identity */
+                                                               sql_rel *oleft 
= left;
+                                                               left = 
rel_add_identity(sql, left, &lident);
+                                                               if (left != 
oleft)
+                                                                       
reset_processed(left);
+                                                       }
                                                        rel = left = 
rel_dup(left);
+                                                       roident = rident = 
exp_column(sql->sa, exp_relname(lident), exp_name(lident), exp_subtype(lident), 
lident->card, has_nil(lident), is_intern(lident));
+                                               }
                                                r = rel_value_exp(sql, &rel, 
sval, f, ek);
                                                if (r && !l_is_value) {
+                                                       if (rident && 
!rel_bind_column(sql, rel, rident->name, 0) && is_project(rel->op)) {
+                                                               sql_exp *r = 
rel_bind_column(sql, rel->l, rident->name, 0);
+
+                                                               if (!r)
+                                                                       return 
NULL;
+                                                               
rel_project_add_exp(sql, rel, r);
+                                                               rident = r;
+                                                               rident = 
exp_column(sql->sa, exp_relname(lident), exp_name(lident), exp_subtype(lident), 
lident->card, has_nil(lident), is_intern(lident));
+                                                       }
                                                        rel = 
rel_project(sql->sa, rel, NULL);
                                                        
rel_project_add_exp(sql, rel, r);
+                                                       if (rident)
+                                                               
rel_project_add_exp(sql, rel, rident);
                                                }
                                                z = rel;
                                                correlated = 1;
@@ -2662,7 +2692,17 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                                        } else {
                                                if (rel_convert_types(sql, &l, 
&r, 1, type_equal) < 0) 
                                                        return NULL;
-                                               rl = rel_project_exp(sql->sa, 
exp_label(sql->sa, r, ++sql->label));
+                                               if (correlated) {
+                                                       rl = rel_dup(left);
+                                                       rl = 
rel_project(sql->sa, rl, NULL);
+                                                       
rel_project_add_exp(sql, rl, r);
+                                                       if (roident) {
+                                                               roident = 
exp_column(sql->sa, exp_relname(roident), exp_name(roident), 
exp_subtype(roident), roident->card, has_nil(roident), is_intern(roident));
+                                                               
rel_project_add_exp(sql, rl, roident);
+                                                       }
+                                               } else {
+                                                       rl = 
rel_project_exp(sql->sa, exp_label(sql->sa, r, ++sql->label));
+                                               }
                                                r = exp_column(sql->sa, 
exp_relname(r), exp_name(r), exp_subtype(r), r->card, has_nil(r), is_intern(r));
                                                if (l_is_value && r_is_rel) {
                                                        sql_exp *l = 
ll->h->data;
@@ -2676,7 +2716,16 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                                                }
                                        }
                                        if (right) {
-                                               rl = rel_setop(sql->sa, right, 
rl, op_union);
+                                               sql_exp *r1 = 
rel_firstexp(right);
+                                               sql_exp *r2 = rel_firstexp(rl);
+
+                                               if 
(subtype_cmp(exp_subtype(r1), exp_subtype(r2))) {
+                                                       list *ls = 
rel_projections(sql, right, NULL, 1, 1);
+                                                       list *rs = 
rel_projections(sql, rl, NULL, 1, 1);
+                                                       rl = 
rel_setop_check_types(sql, right, rl, ls, rs, op_union);
+                                               } else {
+                                                       rl = rel_setop(sql->sa, 
right, rl, op_union);
+                                               }
                                                rl->exps = rel_projections(sql, 
rl, NULL, 0, 1);
                                        }
                                        right = rl;
@@ -2741,12 +2790,24 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
 
                        /* list through all left/right expressions */
                        rexps = right->exps;
-                       if (!is_project(right->op) || list_length(ll) != 
list_length(rexps)) {
+                       if (!is_project(right->op) || list_length(ll) + 
correlated != list_length(rexps)) {
                                if (list_length(ll) == 1)
                                        return sql_error(sql, 02, 
SQLSTATE(42000) "IN: inner query should return a single column");
                                return NULL;
                        }
 
+                       if (correlated && lident) {
+                               sql_exp *r;
+                              
+                               right = rel_label(sql, right, 0);
+                               r = rel_bind_column(sql, right, rident->name, 
0);
+
+                               if (!r) /* error */
+                                       return NULL;
+                               e = exp_compare(sql->sa, lident, r, cmp_equal );
+                               append(jexps, e);
+                       }
+
                        for (n=ll->h, m=rexps->h; n && m; n = n->next, m = 
m->next) {
                                sql_exp *l = n->data;
                                sql_exp *r = m->data;
@@ -3478,7 +3539,7 @@ static sql_exp *
        exp_kind ek = {type_value, card_column, FALSE};
        sql_subaggr *a = NULL;
        int no_nil = 0;
-       sql_rel *groupby = *rel, *gr, *project = NULL;
+       sql_rel *groupby = *rel, *gr, *project = NULL, *iproject = NULL;
        list *exps = NULL;
 
        if (!groupby) {
@@ -3495,16 +3556,18 @@ static sql_exp *
 
        if (groupby->l && groupby->op == op_project) {
                sql_rel *r = groupby->l;        
+
                if (f == sql_having)
                        project = groupby;
-               if (r->op == op_groupby) {
+               if (f == sql_having && r->op == op_select && r->l) 
+                       r = r->l;
+               if (f == sql_having && r->op == op_project && r->l) {
+                       iproject = r;
+                       r = r->l;
+               }
+
+               if (r->op == op_groupby) 
                        groupby = r;
-               } else if (r->op == op_select && r->l) {
-                       /* a having after a groupby */
-                       r = r->l;
-                       if (r->op == op_groupby)
-                               groupby = r;
-               }
        }
 
        if (groupby->op != op_groupby)          /* implicit groupby */
@@ -3539,6 +3602,10 @@ static sql_exp *
                if (!project)
                        return rel_groupby_add_aggr(sql, groupby, e);
                e = rel_groupby_add_aggr(sql, groupby, e);
+               if (iproject) {
+                       rel_project_add_exp(sql, iproject, e);
+                       e = exp_column(sql->sa, exp_relname(e), exp_name(e), 
exp_subtype(e), exp_card(e), has_nil(e), is_intern(e));
+               }
                rel_project_add_exp(sql, project, e);
                return e;
        } 
@@ -3662,8 +3729,15 @@ static sql_exp *
 
                if (*rel != groupby || f != sql_sel) { /* selection */
                        e = rel_groupby_add_aggr(sql, groupby, e);
-                       if (project)
-                               rel_project_add_exp(sql, project, e);
+                       if (!e || !project)
+                               return e;
+                       if (iproject) {
+                               rel_project_add_exp(sql, iproject, e);
+                               e = exp_column(sql->sa, exp_relname(e), 
exp_name(e), exp_subtype(e), exp_card(e), has_nil(e), is_intern(e));
+                       }
+                       rel_project_add_exp(sql, project, e);
+                       if (iproject)
+                               e = exp_column(sql->sa, exp_relname(e), 
exp_name(e), exp_subtype(e), exp_card(e), has_nil(e), is_intern(e));
                }
                return e;
        } else {
diff --git 
a/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.stable.out.single 
b/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.stable.out.single
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.stable.out.single
@@ -0,0 +1,117 @@
+stdout of test 'side-effect.Bug-6397` in directory 'sql/test/BugTracker-2017` 
itself:
+
+
+# 10:56:59 >  
+# 10:56:59 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=34093" "--set" 
"mapi_usock=/var/tmp/mtest-13037/.s.monetdb.34093" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2017"
+# 10:56:59 >  
+
+# MonetDB 5 server v11.27.6
+# This is an unreleased version
+# Serving database 'mTests_sql_test_BugTracker-2017', using 4 threads
+# Compiled for x86_64-unknown-linux-gnu/64bit with 128bit integers
+# Found 7.330 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2017 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://localhost.nes.nl:34093/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-13037/.s.monetdb.34093
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+
+Ready.
+
+# 10:57:00 >  
+# 10:57:00 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-13037" "--port=34093"
+# 10:57:00 >  
+
+#CREATE FUNCTION my_generate_series(start INT, finish INT)
+#RETURNS TABLE (value INT)
+#BEGIN
+#    DECLARE TABLE tmp_generate_series(value INT);
+#    DECLARE i INT;
+#    SET i = start;
+#    WHILE (i <= finish) DO
+#        INSERT INTO tmp_generate_series VALUES(i);
+#        SET i = i + 1;
+#    END WHILE;
+#    RETURN tmp_generate_series;
+#END;
+#explain select count(*) from my_generate_series(1,5) as t1,
+#my_generate_series(1,100) as t2;
+% .explain # table_name
+% mal # name
+% clob # type
+% 153 # length
+function user.s4_1():void;
+    X_5:void := querylog.define("explain select count(*) from 
my_generate_series(1,5) as t1,\nmy_generate_series(1,100) as t2;", 
"default_pipe", 33:int);
+    X_31 := bat.new(nil:str);
+    X_37 := bat.new(nil:int);
+    X_35 := bat.new(nil:int);
+    X_34 := bat.new(nil:str);
+    X_33 := bat.new(nil:str);
+    X_13:bat[:int] := user.my_generate_series(1:int, 5:int);
+    X_14 := aggr.count(X_13);
+    X_21 := sql.single(X_14);
+    X_19:bat[:int] := user.my_generate_series(1:int, 100:int);
+    X_20 := aggr.count(X_19);
+    X_22 := sql.single(X_20);
+    (X_23, X_24) := algebra.crossproduct(X_21, X_22);
+    X_25 := algebra.projection(X_23, X_21);
+    X_26 := algebra.projection(X_24, X_22);
+    X_27:bat[:lng] := batcalc.*(X_25, X_26);
+    X_38 := bat.append(X_31, ".L10");
+    X_40 := bat.append(X_33, "L7");
+    X_42 := bat.append(X_34, "bigint");
+    X_44 := bat.append(X_35, 64:int);
+    X_46 := bat.append(X_37, 0:int);
+    sql.resultSet(X_38, X_40, X_42, X_44, X_46, X_27);
+end user.s4_1;
+#inline               actions= 0 time=4 usec 
+#remap                actions= 1 time=35 usec 
+#costmodel            actions= 1 time=17 usec 
+#coercion             actions= 0 time=4 usec 
+#evaluate             actions= 8 time=51 usec 
+#emptybind            actions= 0 time=1 usec 
+#pushselect           actions= 0 time=8 usec 
+#aliases              actions= 8 time=11 usec 
+#mergetable           actions= 0 time=67 usec 
+#deadcode             actions= 1 time=10 usec 
+#aliases              actions= 0 time=1 usec 
+#constants            actions= 4 time=10 usec 
+#commonTerms          actions= 0 time=7 usec 
+#projectionpath       actions= 0 time=6 usec 
+#deadcode             actions= 0 time=7 usec 
+#reorder              actions= 1 time=41 usec 
+#matpack              actions= 0 time=0 usec 
+#dataflow             actions= 1 time=27 usec 
+#multiplex            actions= 0 time=3 usec 
+#profiler             actions=1 time=2 usec 
+#candidates           actions=1 time=2 usec 
+#garbagecollector     actions= 1 time=85 usec 
+#total                actions=25 time=547 usec 
+#select count(*) from my_generate_series(1,5) as t1,
+#my_generate_series(1,100) as t2;
+% .L10 # table_name
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to