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