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

improved dce for unions


diffs (101 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
@@ -393,11 +393,14 @@ positional_exps_mark_used( sql_rel *rel,
                subrel = subrel->l;
        /* everything is used within the set operation */
        if (rel->exps && subrel->exps) {
-               node *m;
-               for (m=subrel->exps->h; m; m = m->next) {
-                       sql_exp *se = m->data;
+               for (node *n = rel->exps->h, *m=subrel->exps->h; n && m; n = 
n->next, m = m->next) {
+                       sql_exp *se = n->data;
+                       sql_exp *ie = m->data;
 
-                       se->used = 1;
+                       if (is_recursive(rel) || is_set(rel->op))
+                               ie->used =  1;
+                       else
+                               ie->used = se->used;
                }
        }
 }
@@ -584,8 +587,7 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
        case op_topn:
        case op_sample:
                if (proj) {
-                       rel = rel ->l;
-                       rel_mark_used(sql, rel, proj);
+                       rel_mark_used(sql, rel->l, proj);
                        break;
                }
                /* fall through */
@@ -657,20 +659,20 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
                                rel_used(rel->l);
                                rel_used(rel->r);
                        }
-                       rel_mark_used(sql, rel->l, 0);
-                       rel_mark_used(sql, rel->r, 0);
+                       rel_mark_used(sql, rel->l, proj);
+                       rel_mark_used(sql, rel->r, proj);
                } else if (proj && !need_distinct(rel)) {
                        sql_rel *l = rel->l;
 
                        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))
+                       rel_mark_used(sql, rel->l, proj);
+                       /* based on child check set expression list (which 
could have back refs with its exps list */
+                       if (is_project(l->op) /*&& need_distinct(l)*/)
                                positional_exps_mark_used(l, rel);
                        positional_exps_mark_used(rel, rel->r);
                        rel_exps_mark_used(sql->sa, rel, rel->r);
-                       rel_mark_used(sql, rel->r, 0);
+                       rel_mark_used(sql, rel->r, proj);
                }
                break;
 
@@ -681,7 +683,7 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
                        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, proj);
                                }
                        }
                } else if (proj && !need_distinct(rel)) {
@@ -691,9 +693,9 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
 
                                positional_exps_mark_used(rel, l);
                                rel_exps_mark_used(sql->sa, rel, l);
-                               rel_mark_used(sql, l, 0);
-                               /* based on child check set expression list */
-                               if (first && is_project(l->op) && 
need_distinct(l))
+                               rel_mark_used(sql, l, proj);
+                               /* based on child check set expression list 
(which could have back refs with its exps list */
+                               if (first && is_project(l->op) /*&& 
need_distinct(l)*/)
                                        positional_exps_mark_used(l, rel);
                                first = false;
                        }
@@ -767,6 +769,11 @@ rel_remove_unused(mvc *sql, sql_rel *rel
        case op_project:
        case op_groupby:
 
+       case op_munion:
+
+               if (is_recursive(rel))
+                       return rel;
+
                if (/*rel->l &&*/ rel->exps) {
                        for(node *n=rel->exps->h; n && !needed; n = n->next) {
                                sql_exp *e = n->data;
@@ -818,7 +825,6 @@ rel_remove_unused(mvc *sql, sql_rel *rel
 
        case op_inter:
        case op_except:
-       case op_munion:
 
        case op_insert:
        case op_update:
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to