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

Reply via email to