Changeset: b91355e26ddc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b91355e26ddc
Modified Files:
sql/benchmarks/tpcds/Tests/45.stable.out
sql/benchmarks/tpcds/Tests/53.stable.out
sql/server/rel_optimizer.c
sql/server/rel_select.c
sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.stable.out
sql/test/analytics/Tests/analytics09.stable.err
Branch: default
Log Message:
some more fixes for the tpcds and crash fixes
diffs (truncated from 486 to 300 lines):
diff --git a/sql/benchmarks/tpcds/Tests/45.stable.out
b/sql/benchmarks/tpcds/Tests/45.stable.out
--- a/sql/benchmarks/tpcds/Tests/45.stable.out
+++ b/sql/benchmarks/tpcds/Tests/45.stable.out
@@ -70,25 +70,25 @@ Ready.
%
%
%
-[ 10150, "Bunker Hill", 20.25 ]
-[ 16098, "Five Points", 18.05 ]
-[ 28048, "Salem", 9.81 ]
-[ 29584, "Oakdale", 41.21 ]
-[ 31289, "Lincoln", 1.26 ]
-[ 34975, "Kingston", 56.67 ]
-[ 36971, "Wilson", 202.63 ]
-[ 38354, "Sulphur Springs", 25.68 ]
-[ 44975, "Kingston", 12.62 ]
-[ 62808, "Hamilton", 85.39 ]
-[ 62812, "Shady Grove", 48.77 ]
-[ 66557, "Arlington", 2.68 ]
-[ 68252, "Maple Grove", 11.37 ]
-[ 69583, "Jackson", 54.42 ]
-[ 73003, "Hillcrest", 36.03 ]
-[ 78222, "Clinton", 85.87 ]
-[ 83683, "Plainview", 43.82 ]
-[ 84536, "Friendship", 64.44 ]
-[ 88370, "Oak Grove", NULL ]
+[ "10150", "Bunker Hill", 20.25 ]
+[ "16098", "Five Points", 18.05 ]
+[ "28048", "Salem", 9.81 ]
+[ "29584", "Oakdale", 41.21 ]
+[ "31289", "Lincoln", 1.26 ]
+[ "34975", "Kingston", 56.67 ]
+[ "36971", "Wilson", 202.63 ]
+[ "38354", "Sulphur Springs", 25.68 ]
+[ "44975", "Kingston", 12.62 ]
+[ "62808", "Hamilton", 85.39 ]
+[ "62812", "Shady Grove", 48.77 ]
+[ "66557", "Arlington", 2.68 ]
+[ "68252", "Maple Grove", 11.37 ]
+[ "69583", "Jackson", 54.42 ]
+[ "73003", "Hillcrest", 36.03 ]
+[ "78222", "Clinton", 85.87 ]
+[ "83683", "Plainview", 43.82 ]
+[ "84536", "Friendship", 64.44 ]
+[ "88370", "Oak Grove", NULL ]
# 11:40:04 >
# 11:40:04 > "Done."
diff --git a/sql/benchmarks/tpcds/Tests/53.stable.out
b/sql/benchmarks/tpcds/Tests/53.stable.out
--- a/sql/benchmarks/tpcds/Tests/53.stable.out
+++ b/sql/benchmarks/tpcds/Tests/53.stable.out
@@ -42,40 +42,10 @@ Ready.
# 1200+3,
# 1200+4,
# 1200+5,
-# 1200+6,
-# 1200+7,
-# 1200+8,
-# 1200+9,
-# 1200+10,
-# 1200+11)
-# AND ((i_category IN ('Books',
-# 'Children',
-# 'Electronics')
-# AND i_class IN ('personal',
-# 'portable',
-# 'reference',
-# 'self-help')
-# AND i_brand IN ('scholaramalgamalg #14',
-# 'scholaramalgamalg #7',
-# 'exportiunivamalg #9',
-# 'scholaramalgamalg #9')) or(i_category IN
('Women','Music','Men')
-# AND i_class IN
('accessories','classical','fragrances','pants')
-# AND i_brand IN
('amalgimporto #1','edu packscholar #1','exportiimporto #1', 'importoamalg
#1')))
-# GROUP BY i_manufact_id,
-# d_qoy) tmp1
-#WHERE CASE
-# WHEN avg_quarterly_sales > 0 THEN ABS (sum_sales -
avg_quarterly_sales)/ avg_quarterly_sales
-# ELSE NULL
-# END > 0.1
-#ORDER BY avg_quarterly_sales,
-# sum_sales,
-# i_manufact_id
-#LIMIT 100;
-#
-%
-%
-%
-%
+% sys.tmp1, sys.tmp1, sys.tmp1 # table_name
+% i_manufact_id, sum_sales, avg_quarterly_sales # name
+% int, decimal, double # type
+% 3, 40, 24 # length
[ 30, 165.67, 340.635000 ]
[ 30, 247.07, 340.635000 ]
[ 30, 627.63, 340.635000 ]
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
@@ -2874,7 +2874,7 @@ rewrite_case_exp(mvc *sql, sql_exp *e, i
e->f = rewrite_case_exps(sql, e->f, has_changes);
return e;
}
- if (e->flag & PSM_REL)
+ if ((e->flag & PSM_REL) && e->l)
e->l = rel_case_fixup_top(has_changes, sql, e->l);
if (e->flag & PSM_EXCEPTION)
e->l = rewrite_case_exp(sql, e->l, has_changes);
@@ -3982,7 +3982,7 @@ gen_push_groupby_down(int *changes, mvc
list *gbe = rel->r;
(void)changes;
- if (rel->op == op_groupby && list_length(gbe) == 1 &&
is_outerjoin(j->op)) {
+ if (rel->op == op_groupby && list_length(gbe) == 1 && j->op ==
op_join){ //&& is_join(j->op)) {
sql_rel *jl = j->l, *jr = j->r, *cr;
sql_exp *gb = gbe->h->data, *e;
node *n;
@@ -4062,6 +4062,8 @@ rel_push_groupby_down(int *changes, mvc
sql_rel *p = rel->l;
list *gbe = rel->r;
+ if (rel->op == op_groupby && gbe && p && is_join(p->op))
+ return gen_push_groupby_down(changes, sql, rel);
if (rel->op == op_groupby && gbe && p && p->op == op_project) {
sql_rel *j = p->l;
sql_rel *jl, *jr;
@@ -7197,12 +7199,11 @@ split_exp(mvc *sql, sql_exp *e, sql_rel
e->l = split_exp(sql, e->l, rel);
e->r = split_exp(sql, e->r, rel);
if (e->f) {
- assert(0);
e->f = split_exp(sql, e->f, rel);
}
}
return e;
- case e_psm:
+ case e_psm:
case e_atom:
return e;
}
@@ -7278,6 +7279,115 @@ rel_split_project(int *changes, mvc *sql
return rel;
}
+static void select_split_exps(mvc *sql, list *exps, sql_rel *rel);
+
+static sql_exp *
+select_split_exp(mvc *sql, sql_exp *e, sql_rel *rel)
+{
+ switch(e->type) {
+ case e_column:
+ return e;
+ case e_convert:
+ e->l = select_split_exp(sql, e->l, rel);
+ return e;
+ case e_aggr:
+ case e_func:
+ if (!is_analytic(e) && !exp_has_sideeffect(e)) {
+ sql_subfunc *f = e->f;
+ if (e->type == e_func && !f->func->s &&
!strcmp(f->func->base.name, "ifthenelse"))
+ return add_exp_too_project(sql, e, rel);
+ }
+ return e;
+ case e_cmp:
+ if (get_cmp(e) == cmp_or) {
+ select_split_exps(sql, e->l, rel);
+ select_split_exps(sql, e->r, rel);
+ } else if (e->flag == cmp_in || e->flag == cmp_notin ||
get_cmp(e) == cmp_filter) {
+ e->l = select_split_exp(sql, e->l, rel);
+ select_split_exps(sql, e->r, rel);
+ } else {
+ e->l = select_split_exp(sql, e->l, rel);
+ e->r = select_split_exp(sql, e->r, rel);
+ if (e->f) {
+ e->f = select_split_exp(sql, e->f, rel);
+ }
+ }
+ return e;
+ case e_psm:
+ case e_atom:
+ return e;
+ }
+ return e;
+}
+
+static void
+select_split_exps(mvc *sql, list *exps, sql_rel *rel)
+{
+ node *n;
+
+ if (!exps)
+ return;
+ for(n=exps->h; n; n = n->next){
+ sql_exp *e = n->data;
+
+ e = select_split_exp(sql, e, rel);
+ n->data = e;
+ }
+}
+
+static sql_rel *
+rel_split_select(int *changes, mvc *sql, sql_rel *rel, int top)
+{
+ if (is_select(rel->op) && list_length(rel->exps) && rel->l) {
+ list *exps = rel->exps;
+ node *n;
+ int funcs = 0;
+ sql_rel *nrel;
+
+ /* are there functions */
+ for (n=exps->h; n && !funcs; n = n->next) {
+ sql_exp *e = n->data;
+
+ funcs = exp_has_func(e);
+ }
+ /* introduce extra project */
+ if (funcs && rel->op != op_project) {
+ nrel = rel_project(sql->sa, rel->l,
+ rel_projections(sql, rel->l, NULL, 1, 1));
+ rel->l = nrel;
+ /* recursively split all functions and add those to the
projection list */
+ select_split_exps(sql, rel->exps, nrel);
+ if (nrel->l)
+ nrel->l = rel_split_project(changes, sql,
nrel->l, is_topn(rel->op)?top:0);
+ return rel;
+ } else if (funcs && !top && !rel->r) {
+ /* projects can have columns point back into the
expression list, ie
+ * create a new list including the split expressions */
+ node *n;
+ list *exps = rel->exps;
+
+ rel->exps = sa_list(sql->sa);
+ for (n=exps->h; n; n = n->next)
+ append(rel->exps, select_split_exp(sql,
n->data, rel));
+ } else if (funcs && top && rel_is_ref(rel) && !rel->r) {
+ /* inplace */
+ list *exps = rel_projections(sql, rel, NULL, 1, 1);
+ sql_rel *l = rel_project(sql->sa, rel->l, NULL);
+ rel->l = l;
+ l->exps = rel->exps;
+ rel->exps = exps;
+ }
+ }
+ if (is_set(rel->op) || is_basetable(rel->op))
+ return rel;
+ if (rel->l)
+ rel->l = rel_split_select(changes, sql, rel->l,
+
(is_topn(rel->op)||is_ddl(rel->op)||is_modify(rel->op))?top:0);
+ if (is_join(rel->op) && rel->r)
+ rel->r = rel_split_select(changes, sql, rel->r,
+
(is_topn(rel->op)||is_ddl(rel->op)||is_modify(rel->op))?top:0);
+ return rel;
+}
static list *
exp_merge_range(sql_allocator *sa, list *exps)
@@ -9321,6 +9431,8 @@ optimize_rel(mvc *sql, sql_rel *rel, int
}
}
#endif
+ if (level <= 0 && gp.cnt[op_select])
+ rel = rel_split_select(&changes, sql, rel, 1);
/* simple merging of projects */
if (gp.cnt[op_project] || gp.cnt[op_groupby] || gp.cnt[op_ddl]) {
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
@@ -2459,13 +2459,50 @@ rel_logical_exp(mvc *sql, sql_rel *rel,
}
case SQL_AND:
{
+ /* split into 2 lists, simle logical expressions and or's */
+ list *nors = sa_list(sql->sa);
+ list *ors = sa_list(sql->sa);
+
symbol *lo = sc->data.lval->h->data.sym;
symbol *ro = sc->data.lval->h->next->data.sym;
-
+ node *n;
+
+ while (lo->token == SQL_AND) {
+ symbol *s;
+
+ sc = lo;
+ lo = sc->data.lval->h->data.sym;
+ s = sc->data.lval->h->next->data.sym;
+
+ if (s->token != SQL_OR)
+ list_prepend(nors, s);
+ else
+ list_prepend(ors, s);
+ }
+ if (lo->token != SQL_OR)
+ list_prepend(nors, lo);
+ else
+ list_prepend(ors, lo);
+ if (ro->token != SQL_OR)
+ append(nors, ro);
+ else
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list