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