Changeset: ea8328068477 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ea8328068477
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_optimizer.c
sql/server/rel_propagate.c
sql/server/rel_psm.c
sql/server/rel_rewriter.c
sql/server/rel_schema.c
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/server/rel_updates.c
sql/test/BugDay_2005-10-06_2.9.3/Tests/bool_boolean.SF-935601.stable.out
sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.stable.out
sql/test/miscellaneous/Tests/groupby_error.sql
sql/test/miscellaneous/Tests/groupby_error.stable.out
sql/test/miscellaneous/Tests/simple_plans.stable.out
sql/test/subquery/Tests/subquery3.stable.err
sql/test/subquery/Tests/subquery3.stable.out
sql/test/subquery/Tests/subquery5.sql
sql/test/subquery/Tests/subquery5.stable.err
sql/test/subquery/Tests/subquery5.stable.out
tools/merovingian/client/monetdb.c
tools/merovingian/daemon/merovingian.c
tools/merovingian/utils/control.c
tools/merovingian/utils/control.h
tools/merovingian/utils/properties.c
tools/merovingian/utils/utils.c
tools/merovingian/utils/utils.h
Branch: out2in
Log Message:
Merge with default.
diffs (truncated from 2060 to 300 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -24,7 +24,7 @@
#define OUTER_ZERO 64
-static stmt * exp_bin(backend *be, sql_exp *e, stmt *left, stmt *right, stmt
*grp, stmt *ext, stmt *cnt, stmt *sel);
+static stmt * exp_bin(backend *be, sql_exp *e, stmt *left, stmt *right, stmt
*grp, stmt *ext, stmt *cnt, stmt *sel, int depth, int reduce);
static stmt * rel_bin(backend *be, sql_rel *rel);
static stmt * subrel_bin(backend *be, sql_rel *rel, list *refs);
@@ -288,7 +288,7 @@ distinct_value_list(backend *be, list *v
s = stmt_temp(be, exp_subtype(vals->h->data));
for( n = vals->h; n; n = n->next) {
sql_exp *e = n->data;
- stmt *i = exp_bin(be, e, NULL, NULL, NULL, NULL, NULL, NULL);
+ stmt *i = exp_bin(be, e, NULL, NULL, NULL, NULL, NULL, NULL, 0,
0);
if (exp_is_null(be->mvc, e))
*last_null_value = i;
@@ -362,16 +362,16 @@ subrel_project( backend *be, stmt *s, li
}
static stmt *
-handle_in_exps(backend *be, sql_exp *ce, list *nl, stmt *left, stmt *right,
stmt *grp, stmt *ext, stmt *cnt, stmt *sel, int in, int use_r)
+handle_in_exps(backend *be, sql_exp *ce, list *nl, stmt *left, stmt *right,
stmt *grp, stmt *ext, stmt *cnt, stmt *sel, int in, int use_r, int depth, int
reduce)
{
mvc *sql = be->mvc;
node *n;
- stmt *s = NULL, *c = exp_bin(be, ce, left, right, grp, ext, cnt, NULL);
+ stmt *s = NULL, *c = exp_bin(be, ce, left, right, grp, ext, cnt, NULL,
0, 0);
if(!c)
return NULL;
- if (c->nrcols == 0) {
+ if (c->nrcols == 0 || (depth && !reduce)) {
sql_subtype *bt = sql_bind_localtype("bit");
sql_subfunc *cmp = (in)
?sql_bind_func(sql->sa, sql->session->schema, "=",
tail_type(c), tail_type(c), F_FUNC)
@@ -381,7 +381,7 @@ handle_in_exps(backend *be, sql_exp *ce,
for( n = nl->h; n; n = n->next) {
sql_exp *e = n->data;
- stmt *i = exp_bin(be, use_r?e->r:e, left, right, grp,
ext, cnt, NULL);
+ stmt *i = exp_bin(be, use_r?e->r:e, left, right, grp,
ext, cnt, NULL, 0, 0);
if(!i)
return NULL;
@@ -392,7 +392,7 @@ handle_in_exps(backend *be, sql_exp *ce,
s = i;
}
- if (sel)
+ if (sel && !(depth && !reduce))
s = stmt_uselect(be,
stmt_const(be, bin_first_column(be, left), s),
stmt_bool(be, 1), cmp_equal, sel, 0, 0);
@@ -403,7 +403,7 @@ handle_in_exps(backend *be, sql_exp *ce,
s = sel;
for( n = nl->h; n; n = n->next) {
sql_exp *e = n->data;
- stmt *i = exp_bin(be, use_r?e->r:e, left, right, grp,
ext, cnt, NULL);
+ stmt *i = exp_bin(be, use_r?e->r:e, left, right, grp,
ext, cnt, NULL, 0, 0);
if(!i)
return NULL;
@@ -482,7 +482,7 @@ value_list(backend *be, list *vals, stmt
s = stmt_temp(be, type);
for( n = vals->h; n; n = n->next) {
sql_exp *e = n->data;
- stmt *i = exp_bin(be, e, left, NULL, NULL, NULL, NULL, sel);
+ stmt *i = exp_bin(be, e, left, NULL, NULL, NULL, NULL, sel, 0,
0);
if (!i)
return NULL;
@@ -503,7 +503,7 @@ exp_list(backend *be, list *exps, stmt *
for( n = exps->h; n; n = n->next) {
sql_exp *e = n->data;
- stmt *i = exp_bin(be, e, l, r, grp, ext, cnt, sel);
+ stmt *i = exp_bin(be, e, l, r, grp, ext, cnt, sel, 0, 0);
if(!i)
return NULL;
@@ -533,7 +533,7 @@ exp_count_no_nil_arg( sql_exp *e, stmt *
}
stmt *
-exp_bin(backend *be, sql_exp *e, stmt *left, stmt *right, stmt *grp, stmt
*ext, stmt *cnt, stmt *sel)
+exp_bin(backend *be, sql_exp *e, stmt *left, stmt *right, stmt *grp, stmt
*ext, stmt *cnt, stmt *sel, int depth, int reduce)
{
mvc *sql = be->mvc;
stmt *s = NULL;
@@ -549,7 +549,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
switch(e->type) {
case e_psm:
if (e->flag & PSM_SET) {
- stmt *r = exp_bin(be, e->l, left, right, grp, ext, cnt,
sel);
+ stmt *r = exp_bin(be, e->l, left, right, grp, ext, cnt,
sel, 0, 0);
if(!r)
return NULL;
if (e->card <= CARD_ATOM && r->nrcols > 0) /* single
value, get result from bat */
@@ -562,7 +562,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
return stmt_var(be, exp_name(e), &e->tpe, 1,
GET_PSM_LEVEL(e->flag));
} else if (e->flag & PSM_RETURN) {
sql_exp *l = e->l;
- stmt *r = exp_bin(be, l, left, right, grp, ext, cnt,
sel);
+ stmt *r = exp_bin(be, l, left, right, grp, ext, cnt,
sel, 0, 0);
if (!r)
return NULL;
@@ -590,7 +590,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
/* while is a if - block true with leave statement
* needed because the condition needs to be inside this
outer block */
stmt *ifstmt = stmt_cond(be, stmt_bool(be, 1), NULL, 0,
0);
- stmt *cond = exp_bin(be, e->l, left, right, grp, ext,
cnt, sel);
+ stmt *cond = exp_bin(be, e->l, left, right, grp, ext,
cnt, sel, 0, 0);
stmt *wstmt;
if(!cond)
@@ -602,7 +602,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
(void)stmt_control_end(be, wstmt);
return stmt_control_end(be, ifstmt);
} else if (e->flag & PSM_IF) {
- stmt *cond = exp_bin(be, e->l, left, right, grp, ext,
cnt, sel);
+ stmt *cond = exp_bin(be, e->l, left, right, grp, ext,
cnt, sel, 0, 0);
stmt *ifstmt, *res;
if(!cond)
@@ -629,7 +629,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
return r;
return stmt_table(be, r, 1);
} else if (e->flag & PSM_EXCEPTION) {
- stmt *cond = exp_bin(be, e->l, left, right, grp, ext,
cnt, sel);
+ stmt *cond = exp_bin(be, e->l, left, right, grp, ext,
cnt, sel, 0, 0);
if (!cond)
return NULL;
return stmt_exception(be, cond, (const char *) e->r, 0);
@@ -657,7 +657,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
if (from->type->localtype == 0) {
l = stmt_atom(be, atom_general(sql->sa, to, NULL));
} else {
- l = exp_bin(be, e->l, left, right, grp, ext, cnt, sel);
+ l = exp_bin(be, e->l, left, right, grp, ext, cnt, sel,
depth+1, 0);
}
if (!l)
return NULL;
@@ -693,7 +693,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
sql_exp *e = en->data;
stmt *es;
- es = exp_bin(be, e, left, right, grp, ext, cnt,
(push_cands)?sel:NULL);
+ es = exp_bin(be, e, left, right, grp, ext, cnt,
(push_cands)?sel:NULL, depth+1, 0);
if (!es)
return NULL;
@@ -787,7 +787,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
for (en = attr->h; en; en = en->next) {
sql_exp *at = en->data;
- as = exp_bin(be, at, left, right, NULL, NULL,
NULL, sel);
+ as = exp_bin(be, at, left, right, NULL, NULL,
NULL, sel, depth+1, 0);
if (as && as->nrcols <= 0 && left)
as = stmt_const(be,
bin_first_column(be, left), as);
@@ -851,6 +851,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
int swapped = 0, is_select = 0;
sql_exp *re = e->r, *re2 = e->f;
+ assert((reduce && !depth) || e->flag == cmp_in || e->flag ==
cmp_notin);
+
/* general predicate, select and join */
if (e->flag == cmp_filter) {
list *args;
@@ -863,9 +865,9 @@ exp_bin(backend *be, sql_exp *e, stmt *l
for( n = args->h; n; n = n->next ) {
s = NULL;
if (!swapped)
- s = exp_bin(be, n->data, left, NULL,
grp, ext, cnt, NULL);
+ s = exp_bin(be, n->data, left, NULL,
grp, ext, cnt, NULL, depth+1, reduce);
if (!s && (first || swapped)) {
- s = exp_bin(be, n->data, right, NULL,
grp, ext, cnt, NULL);
+ s = exp_bin(be, n->data, right, NULL,
grp, ext, cnt, NULL, depth+1, reduce);
swapped = 1;
}
if (!s)
@@ -879,7 +881,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
ops = sa_list(sql->sa);
args = e->r;
for( n = args->h; n; n = n->next ) {
- s = exp_bin(be, n->data, (swapped ||
!right)?left:right, NULL, grp, ext, cnt, NULL);
+ s = exp_bin(be, n->data, (swapped ||
!right)?left:right, NULL, grp, ext, cnt, NULL, depth+1, reduce);
if (!s)
return s;
list_append(ops, s);
@@ -895,7 +897,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
return s;
}
if (e->flag == cmp_in || e->flag == cmp_notin) {
- return handle_in_exps(be, e->l, e->r, left, right, grp,
ext, cnt, sel, (e->flag == cmp_in), 0);
+ return handle_in_exps(be, e->l, e->r, left, right, grp,
ext, cnt, sel, (e->flag == cmp_in), 0, depth, reduce);
}
if (e->flag == cmp_or && (!right || right->nrcols == 1)) {
sql_subtype *bt = sql_bind_localtype("bit");
@@ -913,7 +915,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
/* propagate the anti flag */
if (anti)
set_anti(c);
- s = exp_bin(be, c, left, right, grp, ext, cnt,
sin);
+ s = exp_bin(be, c, left, right, grp, ext, cnt,
sin, depth, reduce);
if (!s)
return s;
@@ -940,7 +942,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
/* propagate the anti flag */
if (anti)
set_anti(c);
- s = exp_bin(be, c, left, right, grp, ext, cnt,
sin);
+ s = exp_bin(be, c, left, right, grp, ext, cnt,
sin, depth, reduce);
if (!s)
return s;
@@ -989,27 +991,27 @@ exp_bin(backend *be, sql_exp *e, stmt *l
sql->opt_stats[0]++;
if (!l) {
- l = exp_bin(be, e->l, left, NULL, grp, ext, cnt, sel);
+ l = exp_bin(be, e->l, left, NULL, grp, ext, cnt, sel,
depth+1, reduce);
swapped = 0;
}
if (!l && right) {
- l = exp_bin(be, e->l, right, NULL, grp, ext, cnt, sel);
+ l = exp_bin(be, e->l, right, NULL, grp, ext, cnt, sel,
depth+1, reduce);
swapped = 1;
}
if (swapped || !right)
- r = exp_bin(be, re, left, NULL, grp, ext, cnt, sel);
+ r = exp_bin(be, re, left, NULL, grp, ext, cnt, sel,
depth+1, reduce);
else
- r = exp_bin(be, re, right, NULL, grp, ext, cnt, sel);
+ r = exp_bin(be, re, right, NULL, grp, ext, cnt, sel,
depth+1, reduce);
if (!r && !swapped) {
- r = exp_bin(be, re, left, NULL, grp, ext, cnt, sel);
+ r = exp_bin(be, re, left, NULL, grp, ext, cnt, sel,
depth+1, reduce);
is_select = 1;
}
if (!r && swapped) {
- r = exp_bin(be, re, right, NULL, grp, ext, cnt, sel);
+ r = exp_bin(be, re, right, NULL, grp, ext, cnt, sel,
depth+1, reduce);
is_select = 1;
}
if (re2)
- r2 = exp_bin(be, re2, left, right, grp, ext, cnt, sel);
+ r2 = exp_bin(be, re2, left, right, grp, ext, cnt, sel,
depth+1, reduce);
if (!l || !r || (re2 && !r2)) {
TRC_ERROR(SQL_EXECUTION, "Query: '%s'\n", sql->query);
@@ -1421,7 +1423,7 @@ rel_parse_value(backend *be, char *query
sql_exp *e = rel_value_exp2(query, &rel,
sn->selection->h->data.sym->data.lval->h->data.sym, sql_sel | sql_values, ek);
if (!rel)
- s = exp_bin(be, e, NULL, NULL, NULL, NULL,
NULL, NULL);
+ s = exp_bin(be, e, NULL, NULL, NULL, NULL,
NULL, NULL, 0, 0);
}
}
GDKfree(query);
@@ -1558,7 +1560,7 @@ rel2bin_basetable(backend *be, sql_rel *
append(l, s);
if (exps->h->next) {
sql_exp *at = exps->h->next->data;
- stmt *u = exp_bin(be, at, NULL, NULL, NULL,
NULL, NULL, NULL);
+ stmt *u = exp_bin(be, at, NULL, NULL, NULL,
NULL, NULL, NULL, 0, 0);
if(!u)
return NULL;
@@ -1810,7 +1812,7 @@ rel2bin_table(backend *be, sql_rel *rel,
sql_exp *e = en->data;
/* find column */
- stmt *s = exp_bin(be, e, sub, NULL,
NULL, NULL, NULL, NULL);
+ stmt *s = exp_bin(be, e, sub, NULL,
NULL, NULL, NULL, NULL, 0, 0);
if (!s)
return NULL;
if (en->next)
@@ -1820,7 +1822,7 @@ rel2bin_table(backend *be, sql_rel *rel,
}
}
} else {
- psub = exp_bin(be, op, sub, NULL, NULL, NULL, NULL,
NULL); /* table function */
+ psub = exp_bin(be, op, sub, NULL, NULL, NULL, NULL,
NULL, 0, 0); /* table function */
if (!psub)
return NULL;
}
@@ -2007,9 +2009,9 @@ rel2bin_hash_lookup(backend *be, sql_rel
if (e->type == e_cmp && e->flag == cmp_equal) {
sql_exp *ee = (swap_exp)?e->l:e->r;
if (swap_rel)
- s = exp_bin(be, ee, left, NULL, NULL, NULL,
NULL, NULL);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list