Changeset: 0b6b8d8fb329 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/0b6b8d8fb329 Modified Files: sql/server/rel_optimize_proj.c sql/test/miscellaneous/Tests/groupby_expressions.test sql/test/miscellaneous/Tests/simple_selects.test Branch: default Log Message:
Small fixes for new optimizers diffs (107 lines): diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c --- a/sql/server/rel_optimize_proj.c +++ b/sql/server/rel_optimize_proj.c @@ -1464,9 +1464,10 @@ rel_simplify_sum(visitor *v, sql_rel *re sql_rel *crel = NULL; sql_exp *colref = rel_find_exp_and_corresponding_rel(l, col, false, &crel, NULL); - if (colref && l == crel) { + /* col is already found in the inner relation. Also look for a new reference for col, eg sql_add(col, 1), 1 as col */ + if (colref && l == crel && list_position(l->exps, colref) < list_position(l->exps, oexp)) { add_col = false; - } else if (is_simple_project(l->op) && list_empty(l->r) && !rel_is_ref(l) && !need_distinct(l)) { + } else if (!colref && is_simple_project(l->op) && list_empty(l->r) && !rel_is_ref(l) && !need_distinct(l)) { list_prepend(l->exps, exp_ref(v->sql, col)); add_col = false; } @@ -1539,7 +1540,7 @@ rel_simplify_sum(visitor *v, sql_rel *re /* add column reference with new label, if 'col' was not found */ if (add_col) { - if (!is_simple_project(l->op) || !list_empty(l->r) || rel_is_ref(l) || need_distinct(l) || is_single(l)) + if (!is_simple_project(l->op) || !list_empty(l->r) || rel_is_ref(l) || need_distinct(l)) groupby->l = l = rel_project(v->sql->sa, l, rel_projections(v->sql, l, NULL, 1, 1)); list_append(l->exps, ocol); } @@ -1573,7 +1574,7 @@ rel_simplify_groupby_columns(visitor *v, if (e->type == e_column) { bool searching = true; sql_rel *efrel = NULL; - sql_exp *exp = rel_find_exp_and_corresponding_rel(l, e, false, &efrel, NULL), *col = NULL; + sql_exp *exp = rel_find_exp_and_corresponding_rel(l, e, false, &efrel, NULL), *col = NULL, *tope = exp; while (searching && !col) { sql_exp *exp_col = exp; @@ -1631,7 +1632,7 @@ rel_simplify_groupby_columns(visitor *v, if ((rname && name && (strcmp(rname, e->l) != 0 || strcmp(name, e->r) != 0)) || (!rname && name && strcmp(name, e->r) != 0)) { if (!has_label(e)) /* dangerous to merge, skip it */ continue; - if (!is_simple_project(l->op) || !list_empty(l->r) || rel_is_ref(l) || need_distinct(l) || is_single(l)) + if (!is_simple_project(l->op) || !list_empty(l->r) || rel_is_ref(l) || need_distinct(l)) rel->l = l = rel_project(v->sql->sa, l, rel_projections(v->sql, l, NULL, 1, 1)); list_append(l->exps, e); n->data = e = exp_ref(v->sql, e); @@ -1645,14 +1646,26 @@ rel_simplify_groupby_columns(visitor *v, } else { /* Use an unique reference to the column found. If there's another grouping column label pointing into it, rel_groupby_cse will hopefully remove it */ - sql_exp *ne = exp_ref(v->sql, col); - if (!has_label(ne)) - exp_label(v->sql->sa, ne, ++v->sql->label); - - if (!is_simple_project(l->op) || !list_empty(l->r) || rel_is_ref(l) || need_distinct(l) || is_single(l)) - rel->l = l = rel_project(v->sql->sa, l, rel_projections(v->sql, l, NULL, 1, 1)); - list_append(l->exps, ne); - n->data = exp_ref(v->sql, ne); + sql_rel *crel = NULL; + sql_exp *colf = rel_find_exp_and_corresponding_rel(l, col, false, &crel, NULL); + + /* col is already found in the inner relation. Also look for a new reference for col, eg sql_add(col, 1), 1 as col */ + if (colf && l == crel && list_position(l->exps, colf) < list_position(l->exps, tope)) { + n->data = exp_ref(v->sql, col); + } else if (!colf && is_simple_project(l->op) && list_empty(l->r) && !rel_is_ref(l) && !need_distinct(l)) { /* trivial case, it can be added */ + sql_exp *ne = exp_ref(v->sql, col); + list_prepend(l->exps, ne); + n->data = exp_ref(v->sql, ne); + } else { + sql_exp *ne = exp_ref(v->sql, col); + + if (colf) /* a col reference is already there, add a new label */ + exp_label(v->sql->sa, ne, ++v->sql->label); + if (!is_simple_project(l->op) || !list_empty(l->r) || rel_is_ref(l) || need_distinct(l)) + rel->l = l = rel_project(v->sql->sa, l, rel_projections(v->sql, l, NULL, 1, 1)); + list_append(l->exps, ne); + n->data = exp_ref(v->sql, ne); + } list_hash_clear(rel->r); } v->changes++; diff --git a/sql/test/miscellaneous/Tests/groupby_expressions.test b/sql/test/miscellaneous/Tests/groupby_expressions.test --- a/sql/test/miscellaneous/Tests/groupby_expressions.test +++ b/sql/test/miscellaneous/Tests/groupby_expressions.test @@ -26,8 +26,8 @@ project ( | group by ( | | project ( | | | table("sys"."groupings") [ "groupings"."aa" ] -| | ) [ bigint(33)["groupings"."aa"] as "%3"."%3", "sys"."sql_add"("%3"."%3", bigint(33) "1") as "%1"."%1", "groupings"."aa" as "%4"."%4" ] -| ) [ "%4"."%4" ] [ "%1"."%1" ] +| | ) [ "groupings"."aa", bigint(33)["groupings"."aa"] as "%3"."%3", "sys"."sql_add"("%3"."%3", bigint(33) "1") as "%1"."%1" ] +| ) [ "groupings"."aa" ] [ "%1"."%1" ] ) [ "%1"."%1" ] query I rowsort diff --git a/sql/test/miscellaneous/Tests/simple_selects.test b/sql/test/miscellaneous/Tests/simple_selects.test --- a/sql/test/miscellaneous/Tests/simple_selects.test +++ b/sql/test/miscellaneous/Tests/simple_selects.test @@ -964,6 +964,11 @@ project ( | ) [ "x"."x" ] [ "x"."x", "x1" ] ) [ "x"."x", "x1" ] +query I nosort +SELECT count(1) FROM (SELECT 0.642700575141694319114549216465093195438385009765 % 3) x(x) GROUP BY 2+(0+round(x.x, 1)) +---- +1 + statement ok create global temp table x(x int, y int) _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org