Changeset: 297226fc5337 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/297226fc5337
Modified Files:
        sql/server/rel_optimize_proj.c
Branch: const_aggr_elim
Log Message:

Combine const_aggr_elim optimizers into one


diffs (141 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
@@ -2501,23 +2501,51 @@ rel_distinct_aggregate_on_unique_values(
        return rel;
 }
 
-// Triggers On...
-// select 1 having true;
-// select 42 from foo group by ();
-// select n from foo group by rollup(n);
-
-// Does this also trigger?
-// plan SELECT avg(a) FROM baz GROUP BY pass HAVING pass = 1439;
-
-// Expiriment with ROLL UP!
-
 static inline sql_rel *
 rel_remove_const_aggr(visitor *v, sql_rel *rel)
 {
-       if (!rel) {
+       if(!rel) {
+               return rel;
+       }
+
+       list *exps = rel->exps;
+
+       if(rel->op != op_groupby || list_empty(exps)) {
                return rel;
        }
-       if (rel && is_groupby(rel->op) && list_length(rel->exps) >= 1 && 
!rel_is_ref(rel)) {
+
+       if(!list_empty(rel->r)) {
+               for(node *n = exps->h; n; n = n->next) {
+                       sql_exp *e = n->data;
+
+                       if(e->type == e_aggr &&
+                          !((sql_subfunc *)e->f)->func->s &&
+                          strcmp(((sql_subfunc *)e->f)->func->base.name, 
"count") != 0 && 
+                          ((sql_subfunc *)e->f)->func->system == 1
+                       ) {
+                               list *se = e->l;
+
+                               for(node *m = se->h; m; m = m->next) {
+                                       sql_exp *w = m->data;
+
+                                       if(w->type == e_atom && w->card == 
CARD_ATOM) {
+                                               
exp_setalias(w,e->alias.label,e->alias.rname,e->alias.name);
+
+                                               n->data = w;
+                                               v->changes++;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /* 
+        * Below code replaces GROUP BY with PROJECT in some cases;
+        * Triggers on... 
+        * select 1 having true; select 42 from foo group by x; select n from 
foo group by rollup(n);
+       */
+
+       if (!rel_is_ref(rel)) {
                int needed = 0;
                for (node *n = rel->exps->h; n; n = n->next) {
                        sql_exp *exp = (sql_exp*) n->data;
@@ -2600,6 +2628,7 @@ rel_remove_const_aggr(visitor *v, sql_re
                        return nrel;
                }
        }
+
        return rel;
 }
 
@@ -3037,64 +3066,17 @@ rel_project_select_exp(visitor *v, sql_r
        return rel;
 }
 
-static inline sql_rel *
-rel_const_aggr_elimination(visitor *v, sql_rel *rel)
-{
-       sql_rel *g = rel->l;
-       
-       if(rel->op != op_project || !g)
-       {
-               return rel;
-       }
-
-       list *exps = g->exps;
-
-       if(g->op != op_groupby || list_empty(exps) || list_empty(g->r))
-       {
-               return rel;
-       }
-
-       for(node *n = exps->h; n; n = n->next)
-       {
-               sql_exp *e = n->data;
-
-               if(e->type == e_aggr &&
-                  !((sql_subfunc *)e->f)->func->s &&
-                  strcmp(((sql_subfunc *)e->f)->func->base.name, "count") != 0 
&& 
-                  ((sql_subfunc *)e->f)->func->system == 1
-                 )
-               {
-                       list *se = e->l;
-
-                       for(node *m = se->h; m; m = m->next)
-                       {
-                               sql_exp *w = m->data;
-
-                               if(w->type == e_atom && w->card == CARD_ATOM)
-                               {
-                                       
exp_setalias(w,e->alias.label,e->alias.rname,e->alias.name);
-
-                                       n->data = w;
-                                       v->changes++;
-                               }
-                       }
-               }
-       }
-
-       return rel;
-}
-
 static sql_rel *
 rel_optimize_projections_(visitor *v, sql_rel *rel)
 {
        rel = rel_project_cse(v, rel);
        rel = rel_project_select_exp(v, rel);
-       rel = rel_const_aggr_elimination(v, rel);
 
        if (!rel || !is_groupby(rel->op))
                return rel;
 
        rel = rel_remove_const_aggr(v, rel);
+
        if (v->value_based_opt) {
                rel = rel_simplify_sum(v, rel);
                rel = rel_simplify_groupby_columns(v, rel);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to