Changeset: eab2a70b3618 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=eab2a70b3618
Added Files:
sql/test/BugTracker-2019/Tests/correlated-subquery-aggregation.Bug-6714.sql
sql/test/BugTracker-2019/Tests/correlated-subquery-aggregation.Bug-6714.stable.err
sql/test/BugTracker-2019/Tests/correlated-subquery-aggregation.Bug-6714.stable.out
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_partition.c
sql/server/rel_propagate.c
sql/server/rel_select.c
sql/server/rel_updates.c
sql/server/sql_atom.c
sql/server/sql_partition.c
sql/server/sql_semantic.c
sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out
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: mtime
Log Message:
Merge with default branch.
diffs (truncated from 1189 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
@@ -1344,6 +1344,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_partition.c b/sql/server/rel_partition.c
--- a/sql/server/rel_partition.c
+++ b/sql/server/rel_partition.c
@@ -42,8 +42,13 @@ rel_getcount(mvc *sql, sql_rel *rel)
}
static void
-find_basetables( sql_rel *rel, list *tables )
+find_basetables(mvc *sql, sql_rel *rel, list *tables )
{
+ if (THRhighwater()) {
+ (void) sql_error(sql, 10, SQLSTATE(42000) "query too complex:
running out of stack space");
+ return;
+ }
+
if (!rel)
return;
switch (rel->op) {
@@ -68,9 +73,9 @@ find_basetables( sql_rel *rel, list *tab
case op_inter:
case op_except:
if (rel->l)
- find_basetables(rel->l, tables);
+ find_basetables(sql, rel->l, tables);
if (rel->r)
- find_basetables(rel->r, tables);
+ find_basetables(sql, rel->r, tables);
break;
case op_groupby:
case op_project:
@@ -78,7 +83,7 @@ find_basetables( sql_rel *rel, list *tab
case op_topn:
case op_sample:
if (rel->l)
- find_basetables(rel->l, tables);
+ find_basetables(sql, rel->l, tables);
break;
case op_ddl:
break;
@@ -87,7 +92,7 @@ find_basetables( sql_rel *rel, list *tab
case op_delete:
case op_truncate:
if (rel->r)
- find_basetables(rel->r, tables);
+ find_basetables(sql, rel->r, tables);
break;
}
}
@@ -98,7 +103,7 @@ static sql_rel *
list *tables = sa_list(sql->sa);
/* find basetable relations */
/* mark one (largest) with REL_PARTITION */
- find_basetables(rel, tables);
+ find_basetables(sql, rel, tables);
if (list_length(tables)) {
sql_rel *r;
node *n;
@@ -137,6 +142,8 @@ has_groupby(sql_rel *rel)
sql_rel *
rel_partition(mvc *sql, sql_rel *rel)
{
+ if (THRhighwater())
+ return sql_error(sql, 10, SQLSTATE(42000) "query too complex:
running out of stack space");
(void)sql;
if (rel->op == op_basetable) {
rel->flag = REL_PARTITION;
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -418,6 +418,9 @@ static sql_rel* rel_change_base_table(mv
static sql_exp*
exp_change_column_table(mvc *sql, sql_exp *e, sql_table* oldt, sql_table* newt)
{
+ if (THRhighwater())
+ return sql_error(sql, 10, SQLSTATE(42000) "query too complex:
running out of stack space");
+
if (!e)
return NULL;
switch(e->type) {
@@ -491,44 +494,53 @@ exp_change_column_table(mvc *sql, sql_ex
static sql_rel*
rel_change_base_table(mvc* sql, sql_rel* rel, sql_table* oldt, sql_table* newt)
{
- if(!rel)
+ if (THRhighwater())
+ return sql_error(sql, 10, SQLSTATE(42000) "query too complex:
running out of stack space");
+
+ if (!rel)
return NULL;
if(rel->exps)
for(node *n = rel->exps->h ; n ; n = n->next)
n->data = exp_change_column_table(sql, (sql_exp*)
n->data, oldt, newt);
- switch(rel->op) {
- case op_basetable:
- if(rel->l == oldt)
- rel->l = newt;
- if(rel->r)
- rel->r = rel_change_base_table(sql, rel->r,
oldt, newt);
+ switch (rel->op) {
+ case op_ddl:
break;
case op_table:
- case op_topn:
- case op_sample:
- case op_project:
- case op_groupby:
- case op_select:
- case op_insert:
- case op_ddl:
- case op_update:
- case op_delete:
- case op_truncate:
- case op_union:
- case op_inter:
- case op_except:
+ case op_basetable:
+ if (rel->l == oldt)
+ rel->l = newt;
+ break;
case op_join:
case op_left:
case op_right:
case op_full:
case op_semi:
case op_anti:
- if(rel->l)
+ case op_union:
+ case op_inter:
+ case op_except:
+ if (rel->l)
rel->l = rel_change_base_table(sql, rel->l,
oldt, newt);
- if(rel->r)
+ if (rel->r)
rel->r = rel_change_base_table(sql, rel->r,
oldt, newt);
+ break;
+ case op_groupby:
+ case op_project:
+ case op_select:
+ case op_topn:
+ case op_sample:
+ if (rel->l)
+ rel->l = rel_change_base_table(sql, rel->l,
oldt, newt);
+ break;
+ case op_insert:
+ case op_update:
+ case op_delete:
+ case op_truncate:
+ if (rel->r)
+ rel->r = rel_change_base_table(sql, rel->r,
oldt, newt);
+ break;
}
return rel;
}
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
@@ -3786,8 +3786,7 @@ rel_intermediates_add_exp(mvc *sql, sql_
while(pp->l && pp->l != p)
pp = pp->l;
- if (pp && pp->l == p) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list