Changeset: fe884f686c1d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fe884f686c1d
Modified Files:
        sql/server/rel_optimize_others.c
        sql/server/rel_optimize_sel.c
Branch: balanced_union
Log Message:

small fixes for munion and dce optimizer

push munion down select


diffs (94 lines):

diff --git a/sql/server/rel_optimize_others.c b/sql/server/rel_optimize_others.c
--- a/sql/server/rel_optimize_others.c
+++ b/sql/server/rel_optimize_others.c
@@ -491,6 +491,10 @@ rel_used(sql_rel *rel)
        if (is_join(rel->op) || is_set(rel->op) || is_semi(rel->op) || 
is_modify(rel->op)) {
                rel_used(rel->l);
                rel_used(rel->r);
+       } else if (rel->op == op_munion) {
+               list *l = rel->l;
+               for(node *n = l->h; n; n = n->next)
+                       rel_used(n->data);
        } else if (is_topn(rel->op) || is_select(rel->op) || 
is_sample(rel->op)) {
                rel_used(rel->l);
                rel = rel->l;
@@ -629,26 +633,27 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
 
        case op_munion:
                assert(rel->l);
-               for (node *n = ((list*)rel->l)->h; n; n = n->next) {
-                       // TODO: here we blindly follow the same logic as 
op_union. RE-evaluate
-                       if (proj && (need_distinct(rel) || !rel->exps)) {
-                               rel_used(rel);
-                               if (!rel->exps) {
+               // TODO: here we blindly follow the same logic as op_union. 
RE-evaluate
+               if (proj && (need_distinct(rel) || !rel->exps)) {
+                       rel_used(rel);
+                       if (!rel->exps) {
+                               for (node *n = ((list*)rel->l)->h; n; n = 
n->next) {
                                        rel_used(n->data);
+                                       rel_mark_used(sql, n->data, 0);
                                }
-                               rel_mark_used(sql, n->data, 0);
-                       } else if (proj && !need_distinct(rel)) {
+                       }
+               } else if (proj && !need_distinct(rel)) {
+                       bool first = true;
+                       for (node *n = ((list*)rel->l)->h; n; n = n->next) {
                                sql_rel *l = n->data;
 
                                positional_exps_mark_used(rel, l);
                                rel_exps_mark_used(sql->sa, rel, l);
                                rel_mark_used(sql, rel->l, 0);
                                /* based on child check set expression list */
-                               if (is_project(l->op) && need_distinct(l))
+                               if (first && is_project(l->op) && 
need_distinct(l))
                                        positional_exps_mark_used(l, rel);
-                               positional_exps_mark_used(rel, n->data);
-                               rel_exps_mark_used(sql->sa, rel, n->data);
-                               rel_mark_used(sql, n->data, 0);
+                               first = false;
                        }
                }
                break;
@@ -1038,6 +1043,7 @@ rel_add_projects(mvc *sql, sql_rel *rel)
                        if (!is_project(r->op) && !need_distinct(rel))
                                r = rel_project(sql->sa, r, 
rel_projections(sql, r, NULL, 1, 1));
                        r = rel_add_projects(sql, r);
+                       n->data = r;
                }
                return rel;
        case op_topn:
diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -3468,6 +3468,29 @@ rel_push_select_down(visitor *v, sql_rel
                        set_distinct(rel);
                v->changes++;
        }
+       if (is_select(rel->op) && r && is_munion(r->op) && !list_empty(r->exps) 
&& !rel_is_ref(r) && !is_single(r) && !list_empty(exps)) {
+               sql_rel *u = r;
+               list *rels = u->l, *nrels = sa_list(v->sql->sa);
+               for(node *n = rels->h; n; n = n->next) {
+                       sql_rel *ul = n->data;
+                       ul = rel_dup(ul);
+                       if (!is_project(ul->op))
+                               ul = rel_project(v->sql->sa, ul,
+                                       rel_projections(v->sql, ul, NULL, 1, 
1));
+                       rel_rename_exps(v->sql, u->exps, ul->exps);
+
+                       /* introduce selects under the set */
+                       ul = rel_select(v->sql->sa, ul, NULL);
+                       ul->exps = exps_copy(v->sql, exps);
+                       set_processed(ul);
+                       nrels = append(nrels, ul);
+               }
+
+               rel = rel_inplace_setop_n_ary(v->sql, rel, nrels, u->op, 
rel_projections(v->sql, rel, NULL, 1, 1));
+               if (need_distinct(u))
+                       set_distinct(rel);
+               v->changes++;
+       }
 
        return try_remove_empty_select(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