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