Changeset: 70cd8aa37380 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=70cd8aa37380
Added Files:
sql/test/BugTracker-2019/Tests/correlated-subquery-aggregation.Bug-6714.sql
sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.sql
sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.stable.err
sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.stable.out
sql/test/emptydb-upgrade-chain-hge/Tests/check.timeout
sql/test/emptydb-upgrade-chain/Tests/check.timeout
sql/test/emptydb-upgrade-hge/Tests/check.timeout
sql/test/emptydb-upgrade/Tests/check.timeout
sql/test/emptydb/Tests/check.timeout
Modified Files:
sql/backends/monet5/sql_scenario.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_updates.c
sql/test/BugTracker-2019/Tests/All
sql/test/SQLite_regress/sqllogictest/Tests/select1.test.timeout
sql/test/SQLite_regress/sqllogictest/Tests/select2.test.timeout
sql/test/SQLite_regress/sqllogictest/Tests/select4.test.timeout
sql/test/SQLite_regress/sqllogictest/Tests/select5.test.timeout
sql/test/testdb-reload/Tests/reload.timeout
Branch: default
Log Message:
Merge with Apr2019.
diffs (truncated from 718 to 300 lines):
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -1352,6 +1352,7 @@ SQLcallback(Client c, str msg){
m = n;
}
*p = 0;
+ freeException(msg);
msg = GDKstrdup(newerr);
}
return MALcallback(c,msg);
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1588,7 +1588,7 @@ exp_has_sideeffect( sql_exp *e )
}
int
-exp_unsafe( sql_exp *e)
+exp_unsafe( sql_exp *e, int allow_identity)
{
if (!e)
return 0;
@@ -1597,18 +1597,18 @@ exp_unsafe( sql_exp *e)
return 0;
if (e->type == e_convert && e->l)
- return exp_unsafe(e->l);
+ return exp_unsafe(e->l, allow_identity);
if (e->type == e_func && e->l) {
sql_subfunc *f = e->f;
list *args = e->l;
node *n;
- if (IS_ANALYTIC(f->func) || is_identity(e, NULL))
+ if (IS_ANALYTIC(f->func) || (!allow_identity && is_identity(e,
NULL)))
return 1;
for(n = args->h; n; n = n->next) {
sql_exp *e = n->data;
- if (exp_unsafe(e))
+ if (exp_unsafe(e, allow_identity))
return 1;
}
}
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -127,7 +127,7 @@ extern int exp_is_not_null(mvc *sql, sql
extern int exp_is_null(mvc *sql, sql_exp *e);
extern int exps_are_atoms(list *exps);
extern int exp_has_func(sql_exp *e);
-extern int exp_unsafe(sql_exp *e);
+extern int exp_unsafe(sql_exp *e, int allow_identity);
extern int exp_has_sideeffect(sql_exp *e);
/* returns 0 when the relation contain the passed expression else < 0 */
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
@@ -1450,7 +1450,7 @@ exp_push_down(mvc *sql, sql_exp *e, sql_
/* some projections results are order dependend (row_number etc) */
static int
-project_unsafe(sql_rel *rel)
+project_unsafe(sql_rel *rel, int allow_identity)
{
sql_rel *sub = rel->l;
node *n;
@@ -1466,7 +1466,7 @@ project_unsafe(sql_rel *rel)
sql_exp *e = n->data;
/* aggr func in project ! */
- if (exp_unsafe(e))
+ if (exp_unsafe(e, allow_identity))
return 1;
}
return 0;
@@ -2355,7 +2355,7 @@ exp_push_down_prj(mvc *sql, sql_exp *e,
list *l = e->l, *nl = NULL;
sql_exp *ne = NULL;
- if (e->type == e_func && exp_unsafe(e))
+ if (e->type == e_func && exp_unsafe(e,0))
return NULL;
if (!l) {
return e;
@@ -2666,7 +2666,7 @@ rel_merge_projects(int *changes, mvc *sq
prj && prj->op == op_project && !(rel_is_ref(prj)) && !prj->r) {
int all = 1;
- if (project_unsafe(rel) || project_unsafe(prj) ||
exps_share_expensive_exp(rel->exps, prj->exps))
+ if (project_unsafe(rel,0) || project_unsafe(prj,0) ||
exps_share_expensive_exp(rel->exps, prj->exps))
return rel;
/* here we need to fix aliases */
@@ -3421,8 +3421,8 @@ rel_merge_union(int *changes, mvc *sql,
sql_rel *ref = NULL;
if (is_union(rel->op) &&
- l && is_project(l->op) && !project_unsafe(l) &&
- r && is_project(r->op) && !project_unsafe(r) &&
+ l && is_project(l->op) && !project_unsafe(l,0) &&
+ r && is_project(r->op) && !project_unsafe(r,0) &&
(ref = rel_find_ref(l)) != NULL && ref == rel_find_ref(r)) {
/* Find selects and try to merge */
sql_rel *ls = rel_find_select(l);
@@ -4483,7 +4483,7 @@ rel_push_select_down(int *changes, mvc *
sql_rel *pl;
/* we cannot push through rank (row_number etc) functions or
projects with distinct */
- if (!r->l || project_unsafe(r))
+ if (!r->l || project_unsafe(r,1))
return rel;
/* here we need to fix aliases */
@@ -5242,7 +5242,7 @@ rel_push_project_down_union(int *changes
sql_rel *ul = u->l;
sql_rel *ur = u->r;
- if (!u || !is_union(u->op) || need_distinct(u) || !u->exps ||
rel_is_ref(u) || project_unsafe(rel))
+ if (!u || !is_union(u->op) || need_distinct(u) || !u->exps ||
rel_is_ref(u) || project_unsafe(rel,0))
return rel;
/* don't push project down union of single values */
if ((is_project(ul->op) && !ul->l) || (is_project(ur->op) &&
!ur->l))
@@ -5988,9 +5988,9 @@ rel_push_project_up(int *changes, mvc *s
(is_join(rel->op) && (!r || rel_is_ref(r))) ||
(is_select(rel->op) && l->op != op_project) ||
(is_join(rel->op) && l->op != op_project && r->op !=
op_project) ||
- ((l->op == op_project && (!l->l || l->r ||
project_unsafe(l))) ||
+ ((l->op == op_project && (!l->l || l->r ||
project_unsafe(l,is_select(rel->op)))) ||
(is_join(rel->op) && (is_subquery(r) ||
- (r->op == op_project && (!r->l || r->r ||
project_unsafe(r)))))))
+ (r->op == op_project && (!r->l || r->r ||
project_unsafe(r,0)))))))
return rel;
if (l->op == op_project && l->l) {
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -96,7 +96,7 @@ get_inserts( sql_rel *ins )
}
static sql_rel *
-rel_insert_hash_idx(sql_query *query, sql_idx *i, sql_rel *inserts)
+rel_insert_hash_idx(sql_query *query, const char* alias, sql_idx *i, sql_rel
*inserts)
{
mvc *sql = query->sql;
char *iname = sa_strconcat( sql->sa, "%", i->base.name);
@@ -143,12 +143,12 @@ rel_insert_hash_idx(sql_query *query, sq
}
/* append inserts to hash */
append(get_inserts(inserts), h);
- exp_setname(sql->sa, h, i->t->base.name, iname);
+ exp_setname(sql->sa, h, alias, iname);
return inserts;
}
static sql_rel *
-rel_insert_join_idx(sql_query *query, sql_idx *i, sql_rel *inserts)
+rel_insert_join_idx(sql_query *query, const char* alias, sql_idx *i, sql_rel
*inserts)
{
mvc *sql = query->sql;
char *iname = sa_strconcat( sql->sa, "%", i->base.name);
@@ -187,12 +187,12 @@ rel_insert_join_idx(sql_query *query, sq
lnl = exp_unop(sql->sa, _is, isnil);
rnl = exp_unop(sql->sa, _is, isnil);
if (need_nulls) {
- if (lnll_exps) {
- lnll_exps = exp_binop(sql->sa, lnll_exps, lnl, or);
- rnll_exps = exp_binop(sql->sa, rnll_exps, rnl, or);
- } else {
- lnll_exps = lnl;
- rnll_exps = rnl;
+ if (lnll_exps) {
+ lnll_exps = exp_binop(sql->sa, lnll_exps, lnl,
or);
+ rnll_exps = exp_binop(sql->sa, rnll_exps, rnl,
or);
+ } else {
+ lnll_exps = lnl;
+ rnll_exps = rnl;
}
}
@@ -202,14 +202,14 @@ rel_insert_join_idx(sql_query *query, sq
append(join_exps, je);
}
if (need_nulls) {
- _nlls = rel_select( sql->sa, rel_dup(ins),
+ _nlls = rel_select( sql->sa, rel_dup(ins),
exp_compare(sql->sa, lnll_exps,
exp_atom_bool(sql->sa, 1), cmp_equal ));
- nnlls = rel_select( sql->sa, rel_dup(ins),
+ nnlls = rel_select( sql->sa, rel_dup(ins),
exp_compare(sql->sa, rnll_exps,
exp_atom_bool(sql->sa, 0), cmp_equal ));
_nlls = rel_project(sql->sa, _nlls, rel_projections(sql, _nlls,
NULL, 1, 1));
/* add constant value for NULLS */
e = exp_atom(sql->sa, atom_general(sql->sa,
sql_bind_localtype("oid"), NULL));
- exp_setname(sql->sa, e, i->t->base.name, iname);
+ exp_setname(sql->sa, e, alias, iname);
append(_nlls->exps, e);
} else {
nnlls = ins;
@@ -221,7 +221,7 @@ rel_insert_join_idx(sql_query *query, sq
nnlls = rel_project(sql->sa, nnlls, pexps);
/* add row numbers */
e = exp_column(sql->sa, rel_name(rt), TID, sql_bind_localtype("oid"),
CARD_MULTI, 0, 1);
- exp_setname(sql->sa, e, i->t->base.name, iname);
+ exp_setname(sql->sa, e, alias, iname);
append(nnlls->exps, e);
if (need_nulls) {
@@ -236,7 +236,7 @@ rel_insert_join_idx(sql_query *query, sq
}
static sql_rel *
-rel_insert_idxs(sql_query *query, sql_table *t, sql_rel *inserts)
+rel_insert_idxs(sql_query *query, sql_table *t, const char* alias, sql_rel
*inserts)
{
mvc *sql = query->sql;
sql_rel *p = inserts->r;
@@ -253,9 +253,9 @@ rel_insert_idxs(sql_query *query, sql_ta
if (ins->op == op_union)
inserts->r = rel_project(sql->sa, ins,
rel_projections(sql, ins, NULL, 0, 1));
if (hash_index(i->type) || i->type == no_idx) {
- rel_insert_hash_idx(query, i, inserts);
+ rel_insert_hash_idx(query, alias, i, inserts);
} else if (i->type == join_idx) {
- rel_insert_join_idx(query, i, inserts);
+ rel_insert_join_idx(query, alias, i, inserts);
}
}
if (inserts->r != p) {
@@ -284,8 +284,8 @@ rel_insert(sql_query *query, sql_rel *t,
r->l = t;
r->r = inserts;
/* insert indices */
- if (tab)
- return rel_insert_idxs(query, tab, r);
+ if (tab)
+ return rel_insert_idxs(query, tab, rel_name(t), r);
return r;
}
@@ -399,7 +399,6 @@ rel_inserts(mvc *sql, sql_table *t, sql_
return exps;
}
-
sql_table *
insert_allowed(mvc *sql, sql_table *t, char *tname, char *op, char *opname)
{
@@ -679,7 +678,7 @@ is_idx_updated(sql_idx * i, list *exps)
}
static sql_rel *
-rel_update_hash_idx(mvc *sql, sql_idx *i, sql_rel *updates)
+rel_update_hash_idx(mvc *sql, const char* alias, sql_idx *i, sql_rel *updates)
{
char *iname = sa_strconcat( sql->sa, "%", i->base.name);
node *m;
@@ -696,12 +695,12 @@ rel_update_hash_idx(mvc *sql, sql_idx *i
sql_kc *c = m->data;
sql_exp *e;
- e = list_fetch(get_inserts(updates), c->c->colnr+1);
-
+ e = list_fetch(get_inserts(updates), c->c->colnr+1);
+
if (h && i->type == hash_idx) {
list *exps = new_exp_list(sql->sa);
sql_subfunc *xor =
sql_bind_func_result3(sql->sa, sql->session->schema, "rotate_xor_hash", lng,
it, &c->c->type, lng);
-
+
append(exps, h);
append(exps, exp_atom_int(sql->sa, bits));
append(exps, e);
@@ -711,7 +710,7 @@ rel_update_hash_idx(mvc *sql, sql_idx *i
sql_subfunc *lsh =
sql_bind_func_result(sql->sa, sql->session->schema, "left_shift", lng, it, lng);
sql_subfunc *lor =
sql_bind_func_result(sql->sa, sql->session->schema, "bit_or", lng, lng, lng);
sql_subfunc *hf = sql_bind_func_result(sql->sa,
sql->session->schema, "hash", &c->c->type, NULL, lng);
-
+
h = exp_binop(sql->sa, h, exp_atom_int(sql->sa,
bits), lsh);
h2 = exp_unop(sql->sa, e, hf);
h = exp_binop(sql->sa, h, h2, lor);
@@ -725,11 +724,11 @@ rel_update_hash_idx(mvc *sql, sql_idx *i
}
/* append hash to updates */
append(get_inserts(updates), h);
- exp_setname(sql->sa, h, i->t->base.name, iname);
+ exp_setname(sql->sa, h, alias, iname);
if (!updates->exps)
updates->exps = new_exp_list(sql->sa);
- append(updates->exps, exp_column(sql->sa, i->t->base.name, iname, lng,
CARD_MULTI, 0, 0));
+ append(updates->exps, exp_column(sql->sa, alias, iname, lng,
CARD_MULTI, 0, 0));
return updates;
}
@@ -760,7 +759,7 @@ rel_update_hash_idx(mvc *sql, sql_idx *i
referenced column in R2.
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list