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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list