Changeset: b085a4d8ef5a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b085a4d8ef5a
Modified Files:
sql/server/rel_unnest.c
Branch: default
Log Message:
use correct side of the left/right outers to rewrite the inner relation into.
diffs (67 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
@@ -1744,7 +1744,13 @@ rewrite_inner(mvc *sql, sql_rel *rel, sq
op = op_left;
if (is_join(rel->op)){
- if (is_right(rel->op))
+ if (rel_has_freevar(sql, inner)) {
+ list *lv = rel_dependent_var(sql, rel->l, inner);
+ if (!list_empty(lv))
+ d = rel->l = rel_crossproduct(sql->sa, rel->l,
inner, op);
+ else
+ d = rel->r = rel_crossproduct(sql->sa, rel->r,
inner, op);
+ } else if (is_right(rel->op))
d = rel->l = rel_crossproduct(sql->sa, rel->l, inner,
op);
else
d = rel->r = rel_crossproduct(sql->sa, rel->r, inner,
op);
@@ -2246,24 +2252,6 @@ rewrite_aggregates(visitor *v, sql_rel *
return rel;
}
-static sql_exp*
-has_or(visitor *v, sql_rel *rel, sql_exp *e, int depth)
-{
- (void)rel;
- (void)depth;
- if(!v->data && e && is_compare(e->type) && e->flag == cmp_or)
- v->data = e;
- return e;
-}
-
-static bool
-exps_have_or_exp(mvc *sql, list *exps)
-{
- visitor v = { .sql = sql, .data = NULL };
- exps_exp_visitor_topdown(&v, NULL, exps, 0, &has_or, true);
- return v.data != NULL;
-}
-
static inline sql_rel *
rewrite_split_select_exps(visitor *v, sql_rel *rel)
{
@@ -2740,10 +2728,8 @@ rewrite_anyequal(visitor *v, sql_rel *re
join =
(is_full(rel->op)||is_left(rel->op))?rel->r:rel->l;
}
if (rsq) {
- sql_rel *rewrite = NULL;
- (void)rewrite_inner(sql, rel, rsq,
op_left, &rewrite);
- exp_reset_props(rewrite, re,
is_left(rewrite->op));
- join =
(is_full(rel->op)||is_left(rel->op))?rel->r:rel->l;
+ (void)rewrite_inner(sql, rel, rsq,
op_left, &join);
+ exp_reset_props(join, re,
is_left(join->op));
}
assert(join && is_join(join->op));
if (join && !join->exps)
@@ -3744,10 +3730,6 @@ rewrite_outer2inner_union_(visitor *v, s
static sql_rel *
rewrite_outer2inner_union(visitor *v, sql_rel *rel)
{
- if (is_outerjoin(rel->op) && !list_empty(rel->exps) &&
- (exps_have_freevar(v->sql, rel->exps) &&
exps_have_rel_exp(rel->exps) &&
- (exps_have_anyequal(rel->exps,
ANYEQUAL|NOT_ANYEQUAL) || exps_have_or_exp(v->sql, 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 -- [email protected]
To unsubscribe send an email to [email protected]