Changeset: 6b5eafd51c81 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6b5eafd51c81
Modified Files:
sql/server/rel_optimizer.c
Branch: Jul2015
Log Message:
properly handle apply on a join with references in both sides.
diffs (46 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
@@ -3601,16 +3601,19 @@ rel_push_select_down_join(int *changes,
for (n = exps->h; n; n = n->next) {
sql_exp *e = n->data;
if (e->type == e_cmp && !e->f &&
!is_complex_exp(e->flag)) {
+ sql_rel *nr = NULL;
sql_exp *re = e->r, *ne = rel_find_exp(r, re);
if (ne && ne->card >= CARD_AGGR) /* possibly
changed because of apply rewrites */
re->card = ne->card;
if (re->card >= CARD_AGGR) {
- rel->l = rel_push_join(sql, r, e->l,
re, NULL, e);
+ nr = rel_push_join(sql, r, e->l, re,
NULL, e);
} else {
- rel->l = rel_push_select(sql, r, e->l,
e);
+ nr = rel_push_select(sql, r, e->l, e);
}
+ if (nr)
+ rel->l = nr;
/* only pushed down selects are counted */
if (r == rel->l) {
(*changes)++;
@@ -7464,7 +7467,19 @@ rel_apply_rewrite(int *changes, mvc *sql
r->r = r->l;
r->l = rel;
rel = r;
- } else { /* both used or unused */
+ } else if (rused && lused) { /* both used */
+ sql_rel *la = rel, *ra = rel_create(sql->sa);
+
+ ra->l = la->l;
+ ra->op = la->op;
+ ra->flag = la->flag;
+ la->r = r->l;
+ ra->r = r->r;
+
+ r->l = la;
+ r->r = ra;
+ rel = r;
+ } else { /* both unused */
int flag = rel->flag;
node *n;
/* rewrite apply into join (later use flag, loj, join
or exists (which is antijoin)) */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list