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