Changeset: 97a03dcbf586 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=97a03dcbf586
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
Branch: Jul2015
Log Message:

fixes for outer join problems


diffs (81 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -3774,7 +3774,7 @@ rel_push_semijoin_down(int *changes, mvc
 {
        (void)*changes;
        if (is_semi(rel->op) && rel->exps && rel->l) {
-               operator_type op = rel->op;
+               operator_type op = rel->op, lop;
                node *n;
                sql_rel *l = rel->l, *ll = NULL, *lr = NULL;
                sql_rel *r = rel->r;
@@ -3789,6 +3789,7 @@ rel_push_semijoin_down(int *changes, mvc
                if (!is_join(l->op) || rel_is_ref(l))
                        return rel;
 
+               lop = l->op;
                ll = l->l;
                lr = l->r;
                /* semijoin shouldn't be based on right relation of join */
@@ -3820,9 +3821,9 @@ rel_push_semijoin_down(int *changes, mvc
                        l = rel_crossproduct(sql->sa, lr, r, op);
                l->exps = nsexps;
                if (right)
-                       rel = rel_crossproduct(sql->sa, l, lr, op_join);
+                       rel = rel_crossproduct(sql->sa, l, lr, lop);
                else
-                       rel = rel_crossproduct(sql->sa, l, ll, op_join);
+                       rel = rel_crossproduct(sql->sa, l, ll, lop);
                rel->exps = njexps;
        }
        return rel;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1081,7 +1081,7 @@ rel_push_join(mvc *sql, sql_rel *rel, sq
                        rrel = rn->data;
                        rrel2 = rn2->data;
                        
-                       if (rel_is_ref(lrel) || rel_is_ref(rrel) || 
rel_is_ref(rrel2))
+                       if (rel_is_ref(lrel) || rel_is_ref(rrel) || 
rel_is_ref(rrel2) || is_processed(lrel) || is_processed(rrel))
                                break;
 
                        /* push down as long as the operators allow this
@@ -1103,7 +1103,7 @@ rel_push_join(mvc *sql, sql_rel *rel, sq
                        lrel = ln->data;
                        rrel = rn->data;
                        
-                       if (rel_is_ref(lrel) || rel_is_ref(rrel))
+                       if (rel_is_ref(lrel) || rel_is_ref(rrel) || 
is_processed(lrel) || is_processed(rrel))
                                break;
 
                        /* push down as long as the operators allow this
@@ -1113,7 +1113,7 @@ rel_push_join(mvc *sql, sql_rel *rel, sq
                                (!is_select(lrel->op) &&
                                 !(is_semi(lrel->op) && !rel_is_ref(lrel->l)) &&
                                 lrel->op != op_join &&
-                                lrel->op != op_left))
+                                (lrel->op != op_left)))
                                break;
                        /* pushing through left head of a left join is allowed 
*/
                        if (lrel->op == op_left && (!ln->next || lrel->l != 
ln->next->data))
@@ -2510,7 +2510,7 @@ rel_compare_exp_(mvc *sql, sql_rel *rel,
                /* push select into the given relation */
                return rel_push_select(sql, rel, L, e);
        } else { /* join */
-               if (is_semi(rel->op) || is_outerjoin(rel->op)) {
+               if (is_semi(rel->op) || (is_outerjoin(rel->op) && 
!is_processed((rel)))) {
                        rel_join_add_exp(sql->sa, rel, e);
                        return rel;
                }
@@ -5823,9 +5823,6 @@ rel_joinquery_(mvc *sql, sql_rel *rel, s
 
        if (js && js->token != SQL_USING) {     /* On sql_logical_exp */
                rel = rel_logical_exp(sql, rel, js, sql_where);
-
-               if (!rel)
-                       return rel;
        } else if (js) {        /* using */
                char rname[16], *rnme;
                dnode *n = js->data.lval->h;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to