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 -- [email protected]
To unsubscribe send an email to [email protected]