Changeset: ae77acc88af6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ae77acc88af6
Modified Files:
        sql/server/rel_optimize_proj.c
Branch: optimizer-testing
Log Message:

WIP group-by CSE with alias instead of project injection and push down


diffs (75 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
@@ -1703,46 +1703,39 @@ rel_groupby_cse(visitor *v, sql_rel *rel
 {
        if (is_groupby(rel->op) && !list_empty(rel->r)) {
                sql_rel *l = rel->l;
-               int needed = 0;
-
-               for (node *n=((list*)rel->r)->h; n ; n = n->next) {
-                       sql_exp *e = n->data;
-                       e->used = 0; /* we need to use this flag, clean it 
first */
-               }
+
+               /* for every group expression e1 */
                for (node *n=((list*)rel->r)->h; n ; n = n->next) {
                        sql_exp *e1 = n->data;
+                       /* it's good to examine the same expression in the 
subrelation e.g. in case it's an alias */
                        /* TODO maybe cover more cases? Here I only look at the 
left relation */
-                       sql_exp *e3 = e1->type == e_column ? 
exps_find_exp(l->exps, e1) : NULL;
-
+                       sql_exp *e1_sub = e1->type == e_column ? 
exps_find_exp(l->exps, e1) : NULL;
+
+                       /* for every other group expression */
                        for (node *m=n->next; m; m = m->next) {
                                sql_exp *e2 = m->data;
-                               sql_exp *e4 = e2->type == e_column ? 
exps_find_exp(l->exps, e2) : NULL;
-
-                               if (exp_match_exp(e1, e2) || exp_refers(e1, e2) 
|| (e3 && e4 && (exp_match_exp(e3, e4) || exp_refers(e3, e4)))) {
-                                       e2->used = 1; /* flag it as being 
removed */
-                                       needed = 1;
+                               sql_exp *e2_sub = e2->type == e_column ? 
exps_find_exp(l->exps, e2) : NULL;
+
+                               /* check if the experssion are the same */
+                               if (exp_match_exp(e1, e2) || exp_refers(e1, e2) 
|| (e1_sub && e2_sub && (exp_match_exp(e1_sub, e2_sub) || exp_refers(e1_sub, 
e2_sub)))) {
+
+                                       /* TODO: return checks!! */
+                                       sql_exp *e2_in_exps = rel_find_exp(rel, 
e2);
+                                       node *e2_exps_node = 
list_find(rel->exps, e2_in_exps, NULL);
+
+                                       sql_exp* e2_as_e1_alias = 
exp_copy(v->sql, e1);
+                                       /* XXX: should we use e1 or e1_in_exps 
for the alias source ???? */
+                                       exp_setalias(e2_as_e1_alias, e2->l, 
e2->r);
+                                       list_append_before(rel->exps, 
e2_exps_node, e2_as_e1_alias);
+
+                                       list_remove_node(rel->exps, NULL, 
e2_exps_node);
+
+                                       node *e2_r_node = list_find(rel->r, e2, 
NULL);
+                                       list_remove_node(rel->r, NULL, 
e2_r_node);
+                                       v->changes++;
                                }
                        }
                }
-
-               if (!needed)
-                       return rel;
-
-               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));
-
-               for (node *n=((list*)rel->r)->h; n ; ) {
-                       node *next = n->next;
-                       sql_exp *e = n->data;
-
-                       if (e->used) { /* remove unecessary grouping columns */
-                               e->used = 0;
-                               list_append(l->exps, e);
-                               list_remove_node(rel->r, NULL, n);
-                               v->changes++;
-                       }
-                       n = next;
-               }
        }
        return rel;
 }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to