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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list