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