Changeset: 62c3d802cf30 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/62c3d802cf30
Modified Files:
        sql/server/rel_unnest.c
Branch: default
Log Message:

delay outer2inner into push_up_join


diffs (55 lines):

diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -1282,6 +1282,8 @@ bind_join_vars(mvc *sql, sql_rel *rel)
        }
 }
 
+static sql_rel * rewrite_outer2inner_union_(visitor *v, sql_rel *rel);
+
 static sql_rel *
 push_up_join(mvc *sql, sql_rel *rel, list *ad)
 {
@@ -1307,6 +1309,12 @@ push_up_join(mvc *sql, sql_rel *rel, lis
                        rd = (j->op != op_full && j->op != 
op_right)?rel_dependent_var(sql, d, jr):(list*)1;
                        ld = ((j->op == op_join || j->op == 
op_right))?rel_dependent_var(sql, d, jl):(list*)1;
 
+                       if (is_outerjoin(j->op) && j->exps && 
!list_empty(rel->attr)) {
+                               visitor v = { .sql = sql };
+                               rel->r = j = rewrite_outer2inner_union_(&v, j);
+                               return rel;
+                       }
+
                        if (ld && rd) {
                                node *m;
                                sql_rel *n, *nr, *nj, *nl;
@@ -3733,29 +3741,11 @@ rewrite_outer2inner_union_(visitor *v, s
        return rel;
 }
 
-static bool
-vars_depends_on(mvc *sql, sql_rel *rel, list *vars)
-{
-       if (!vars)
-               return false;
-       for(node *n = vars->h; n; n = n->next) {
-               sql_exp *e = n->data;
-
-               if (exp_has_freevar(sql, e) && rel_rebind_exp(sql, rel, e))
-                       return true;
-       }
-       return false;
-}
-
 static sql_rel *
 rewrite_outer2inner_union(visitor *v, sql_rel *rel)
 {
        if (is_outerjoin(rel->op) && !list_empty(rel->exps) && 
(exps_have_anyequal(rel->exps, ANYEQUAL|NOT_ANYEQUAL) || 
(exps_have_freevar(v->sql, rel->exps) && exps_have_rel_exp(rel->exps) && 
exps_have_or_exp(v->sql, rel->exps))))
                return rewrite_outer2inner_union_(v, rel);
-       if (!is_dependent(rel) && is_outerjoin(rel->op) && rel->flag != 
MERGE_LEFT && !list_empty(rel->exps) && (
-                               ((is_left(rel->op) || is_full(rel->op)) && 
(exps_have_freevar(v->sql, rel->exps) && vars_depends_on(v->sql, rel->l, 
rel->exps))) ||
-                               ((is_right(rel->op) || is_full(rel->op)) && 
(exps_have_freevar(v->sql, rel->exps) && vars_depends_on(v->sql, rel->r, 
rel->exps)))))
-               return rewrite_outer2inner_union_(v, rel);
        if (is_full(rel->op) && rel_has_freevar(v->sql, rel->r)) { /* swap */
                sql_rel *s = rel->r;
                rel->r = rel->l;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to