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

make sure we fallback to the general unnest when push up of select/join 
expressions isn't enough


diffs (63 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
@@ -82,13 +82,11 @@ exps_set_freevar(mvc *sql, list *exps, s
                exp_set_freevar(sql, n->data, r);
 }
 
-/* check if the set is distinct for the set of free variables */
+/* check if the set is distinct (ie we did a domain reduction for the general 
unnest) for the set of free variables */
 static int
 is_distinct_set(mvc *sql, sql_rel *rel, list *ad)
 {
        int distinct = 0;
-       if (ad && exps_unique(sql, rel, ad) && !have_nil(ad))
-               return 1;
        if (ad && is_groupby(rel->op) && exp_match_list(rel->r, ad))
                return 1;
        distinct = need_distinct(rel);
@@ -1285,17 +1283,6 @@ bind_join_vars(mvc *sql, sql_rel *rel)
 static sql_rel *
 push_up_join(mvc *sql, sql_rel *rel, list *ad)
 {
-       if (rel && (is_join(rel->op) || is_semi(rel->op)) && is_dependent(rel)) 
{
-               sql_rel *j = rel->r;
-
-               if (j->op == op_join && !rel_is_ref(rel) && !rel_is_ref(j) && 
j->exps) {
-                       rel->exps =     rel->exps?list_merge(rel->exps, 
j->exps, (fdup)NULL):j->exps;
-                       j->exps = NULL;
-                       bind_join_vars(sql, rel);
-                       return rel;
-               }
-       }
-
        /* input rel is dependent join */
        if (rel && (is_join(rel->op) || is_semi(rel->op)) && is_dependent(rel)) 
{
                sql_rel *d = rel->l, *j = rel->r;
@@ -1596,6 +1583,17 @@ rel_unnest_dependent(mvc *sql, sql_rel *
                                }
                        }
 
+                       if (rel && (is_join(rel->op) || is_semi(rel->op)) && 
is_dependent(rel)) {
+                               sql_rel *j = rel->r;
+
+                               if (j->op == op_join && !rel_is_ref(rel) && 
!rel_is_ref(j) && j->exps) {
+                                       rel->exps =     
rel->exps?list_merge(rel->exps, j->exps, (fdup)NULL):j->exps;
+                                       j->exps = NULL;
+                                       bind_join_vars(sql, rel);
+                                       return rel_unnest_dependent(sql, rel);
+                               }
+                       }
+
                        if (r && is_simple_project(r->op) && 
((!exps_have_freevar(sql, r->exps) && !exps_have_unsafe(r->exps, 1)) || 
is_distinct_set(sql, l, ad))) {
                                rel = push_up_project(sql, rel, ad);
                                return rel_unnest_dependent(sql, rel);
@@ -3714,7 +3712,7 @@ include_tid(sql_rel *r)
 static inline sql_rel *
 rewrite_outer2inner_union(visitor *v, sql_rel *rel)
 {
-       if (is_outerjoin(rel->op) && !is_rewrite_outer_used(rel->used) && 
!list_empty(rel->exps) && (((/*is_left(rel->op) ||*/ is_full(rel->op)) && 
rel_has_freevar(v->sql,rel->l)) ||
+       if (is_outerjoin(rel->op) && !is_rewrite_outer_used(rel->used) && 
rel->flag != MERGE_LEFT && !list_empty(rel->exps) && (((/*is_left(rel->op) ||*/ 
is_full(rel->op)) && rel_has_freevar(v->sql,rel->l)) ||
                ((/*is_right(rel->op) ||*/ is_full(rel->op)) && 
rel_has_freevar(v->sql,rel->r)) || exps_have_freevar(v->sql, rel->exps) || 
exps_have_rel_exp(rel->exps))) {
                /* the join relation may have more than 1 reference, a 
replacement is needed */
                sql_rel *nr = rel_dup_copy(v->sql->sa, rel);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to