Changeset: c60937763cb1 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/c60937763cb1 Modified Files: sql/server/rel_optimize_proj.c Branch: const_aggr_elim Log Message:
new itteration, almost there. diffs (110 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 @@ -3022,11 +3022,88 @@ rel_project_select_exp(visitor *v, sql_r return rel; } - static inline sql_rel * rel_const_aggr_elimination(visitor *v, sql_rel *rel) { - (void)v; + sql_rel *g=rel->l; + + if (rel->op == op_project && g) + { + if(g->op == op_groupby) + { + printf("Found Groupby!\n"); + + list *exps=g->exps; + node *n,*m; + + for(n = exps->h; n; n = n->next) + { + sql_exp *e = n->data; + + if(e->type == e_aggr) + { + list *se=e->l; + struct sql_exp_name *en = &e->alias; + + // Check aggr type! exp_aggr_is_count(e) + + for(m = se->h; m; m = m->next) + { + // 1: Copy pointer to e_atom (not atom*); (already have it) + sql_exp *w = m->data; + + if(w->type == e_atom && w->card == CARD_ATOM) + { + printf("Atom Found Within!\n"); + + // 2: Insert step 1 e_atom ptr into (list*)rel->exps; + list_append(rel->exps,w); + + // 3: Remove e_col from (list*)rel->exps that contains ptr to e_aggr; list_remove_data((list*)rel->exps,NULL,FOUNDNODE) add_exp_too_project + list *ag = rel->exps; + node *b; + + for(b = ag->h; b; b = b->next) + { + sql_exp *a = b->data; + struct sql_exp_name *an = &a->alias; + + printf("Found Column?: %u\n",a->type); + printf("Label: %u\n",en->label); + + if(a->type == e_column && en->label == an->label && strcmp(en->name, an->name) == 0 && strcmp(en->rname, an->rname) == 0) + { + printf("Hit!\n"); + + // REF TO e_aggr IS a->alias = (label = 1, name = "%1", rname = "%1") + + list_remove_node(ag,NULL,b); + } + } + + // OR Something with ? + //add_exp_too_project(); + + // 4: Set to e_aggr->l to NULL then destroy e_aggr node; + e->l=NULL; + list_remove_node(exps,NULL,n); + + v->changes++; // Causes Assert Till Changed; + } + } + + //printf("Type: %u\n",((list*)e->l)); + } + } + } + } + + // What more? + + // Are they really aggregates? Or function check; + // Look at sql_subfunc and sql_func types and atom types. + + // return rel; } @@ -3036,6 +3113,7 @@ rel_optimize_projections_(visitor *v, sq { 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; @@ -3052,7 +3130,6 @@ rel_optimize_projections_(visitor *v, sq rel = rel_distinct_aggregate_on_unique_values(v, rel); rel = rel_groupby_distinct(v, rel); rel = rel_push_count_down(v, rel); - rel = rel_const_aggr_elimination(v, rel); /* only when value_based_opt is on, ie not for dependency resolution */ if (v->value_based_opt) { _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org