Changeset: e2e95e5b53bf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e2e95e5b53bf
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_rel.c
Branch: default
Log Message:

Use select inplace to push select above join with more than one reference


diffs (47 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
@@ -4584,7 +4584,7 @@ point_select_on_unique_column(sql_rel *r
 static sql_rel *
 rel_push_select_up(visitor *v, sql_rel *rel)
 {
-       if ((is_join(rel->op) || is_semi(rel->op)) && !rel_is_ref(rel) && 
!is_single(rel)) {
+       if ((is_join(rel->op) || is_semi(rel->op)) && !is_single(rel)) {
                sql_rel *l = rel->l, *r = rel->r;
                bool can_pushup_left = is_select(l->op) && !rel_is_ref(l) && 
!is_single(l),
                         can_pushup_right = is_select(r->op) && !rel_is_ref(r) 
&& !is_single(r) && !is_semi(rel->op);
@@ -4597,17 +4597,15 @@ rel_push_select_up(visitor *v, sql_rel *
 
                        /* if both selects retrieve one row each, it's not 
worth it to push both up */
                        if (can_pushup_left && !can_pushup_right) {
-                               sql_rel *ll = l->l;
-                               rel->l = ll;
-                               l->l = rel;
-                               rel = l;
+                               sql_rel *nrel = rel_dup_copy(v->sql->sa, rel);
+                               nrel->l = l->l;
+                               rel = rel_inplace_select(rel, nrel, l->exps);
                                assert(is_select(rel->op));
                                v->changes++;
                        } else if (!can_pushup_left && can_pushup_right) {
-                               sql_rel *rl = r->l;
-                               rel->r = rl;
-                               r->l = rel;
-                               rel = r;
+                               sql_rel *nrel = rel_dup_copy(v->sql->sa, rel);
+                               nrel->r = r->l;
+                               rel = rel_inplace_select(rel, nrel, r->exps);
                                assert(is_select(rel->op));
                                v->changes++;
                        }
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -529,7 +529,6 @@ rel_inplace_select(sql_rel *rel, sql_rel
        rel->r = NULL;
        rel->op = op_select;
        rel->exps = exps;
-       rel->card = exps_card(exps);
        rel->card = CARD_ATOM; /* no relation */
        if (l) {
                rel->card = l->card;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to