Changeset: 9ec7b4df5e8d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9ec7b4df5e8d
Added Files:
        sql/test/BugTracker-2022/Tests/empty-MAL.Bug-7259.test
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/BugTracker-2022/Tests/All
Branch: default
Log Message:

Added test and fix for bug #7259. Don't forget to copy attributes when pushing 
down joins


diffs (153 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
@@ -4784,7 +4784,7 @@ rel_push_semijoin_down_or_up(visitor *v,
                node *n;
                sql_rel *l = rel->l, *ll = NULL, *lr = NULL;
                sql_rel *r = rel->r;
-               list *exps = rel->exps, *nsexps, *njexps;
+               list *exps = rel->exps, *nsexps, *njexps, *nsattr, *njattr;
                int left = 1, right = 1;
 
                /* handle project
@@ -4829,18 +4829,22 @@ rel_push_semijoin_down_or_up(visitor *v,
                if (right && is_left(lop))
                        return rel;
                nsexps = exps_copy(v->sql, rel->exps);
+               nsattr = exps_copy(v->sql, rel->attr);
                njexps = exps_copy(v->sql, l->exps);
+               njattr = exps_copy(v->sql, l->attr);
                if (left)
                        l = rel_crossproduct(v->sql->sa, rel_dup(ll), 
rel_dup(r), op);
                else
                        l = rel_crossproduct(v->sql->sa, rel_dup(lr), 
rel_dup(r), op);
                l->exps = nsexps;
+               l->attr = nsattr;
                set_processed(l);
                if (left)
                        l = rel_crossproduct(v->sql->sa, l, rel_dup(lr), lop);
                else
                        l = rel_crossproduct(v->sql->sa, rel_dup(ll), l, lop);
                l->exps = njexps;
+               l->attr = njattr;
                set_processed(l);
                rel_destroy(rel);
                rel = l;
@@ -4914,7 +4918,7 @@ rel_push_join_down_union(visitor *v, sql
 {
        if ((is_join(rel->op) && !is_outerjoin(rel->op) && !is_single(rel)) || 
is_semi(rel->op)) {
                sql_rel *l = rel->l, *r = rel->r, *ol = l, *or = r;
-               list *exps = rel->exps;
+               list *exps = rel->exps, *attr = rel->attr;
                sql_exp *je = NULL;
 
                if (!l || !r || need_distinct(l) || need_distinct(r) || 
rel_is_ref(l) || rel_is_ref(r))
@@ -4955,7 +4959,9 @@ rel_push_join_down_union(visitor *v, sql
                        nl = rel_crossproduct(v->sql->sa, ll, rel_dup(or), 
rel->op);
                        nr = rel_crossproduct(v->sql->sa, lr, rel_dup(or), 
rel->op);
                        nl->exps = exps_copy(v->sql, exps);
+                       nl->attr = exps_copy(v->sql, attr);
                        nr->exps = exps_copy(v->sql, exps);
+                       nr->attr = exps_copy(v->sql, attr);
                        set_processed(nl);
                        set_processed(nr);
                        nl = rel_project(v->sql->sa, nl, 
rel_projections(v->sql, nl, NULL, 1, 1));
@@ -5004,7 +5010,9 @@ rel_push_join_down_union(visitor *v, sql
                        nl = rel_crossproduct(v->sql->sa, ll, rl, rel->op);
                        nr = rel_crossproduct(v->sql->sa, lr, rr, rel->op);
                        nl->exps = exps_copy(v->sql, exps);
+                       nl->attr = exps_copy(v->sql, attr);
                        nr->exps = exps_copy(v->sql, exps);
+                       nr->attr = exps_copy(v->sql, attr);
                        set_processed(nl);
                        set_processed(nr);
                        nl = rel_project(v->sql->sa, nl, 
rel_projections(v->sql, nl, NULL, 1, 1));
@@ -5037,7 +5045,9 @@ rel_push_join_down_union(visitor *v, sql
                        nl = rel_crossproduct(v->sql->sa, rel_dup(ol), rl, 
rel->op);
                        nr = rel_crossproduct(v->sql->sa, rel_dup(ol), rr, 
rel->op);
                        nl->exps = exps_copy(v->sql, exps);
+                       nl->attr = exps_copy(v->sql, attr);
                        nr->exps = exps_copy(v->sql, exps);
+                       nr->attr = exps_copy(v->sql, attr);
                        set_processed(nl);
                        set_processed(nr);
                        nl = rel_project(v->sql->sa, nl, 
rel_projections(v->sql, nl, NULL, 1, 1));
@@ -5086,6 +5096,7 @@ rel_push_join_down_union(visitor *v, sql
                                }
                                nl = rel_crossproduct(v->sql->sa, rel_dup(ol), 
rl, rel->op);
                                nl->exps = exps_copy(v->sql, exps);
+                               nl->attr = exps_copy(v->sql, attr);
                                set_processed(nl);
                                v->changes++;
                                return rel_inplace_project(v->sql->sa, rel, nl, 
rel_projections(v->sql, rel, NULL, 1, 1));
@@ -5106,6 +5117,7 @@ rel_push_join_down_union(visitor *v, sql
                                }
                                nl = rel_crossproduct(v->sql->sa, rel_dup(ol), 
rr, rel->op);
                                nl->exps = exps_copy(v->sql, exps);
+                               nl->attr = exps_copy(v->sql, attr);
                                set_processed(nl);
                                v->changes++;
                                return rel_inplace_project(v->sql->sa, rel, nl, 
rel_projections(v->sql, rel, NULL, 1, 1));
@@ -5144,6 +5156,8 @@ rel_push_join_down_outer(visitor *v, sql
                        sql_rel *nl = rel_crossproduct(v->sql->sa, rel_dup(l), 
rl, rel->op);
                        r->l = nl;
                        nl->exps = njexps;
+                       nl->attr = rel->attr;
+                       rel->attr = NULL;
                        set_processed(nl);
                        rel_dup(r);
                        rel_destroy(rel);
@@ -8410,6 +8424,8 @@ rel_rewrite_semijoin(visitor *v, sql_rel
 
                        rel->exps = r->exps;
                        r->exps = NULL;
+                       rel->attr = r->attr;
+                       r->attr = NULL;
                        rel_destroy(or);
                        v->changes++;
                }
@@ -8520,6 +8536,7 @@ rel_rewrite_antijoin(visitor *v, sql_rel
 
                nl = rel_crossproduct(v->sql->sa, rel->l, rl, op_anti);
                nl->exps = exps_copy(v->sql, rel->exps);
+               nl->attr = exps_copy(v->sql, rel->attr);
                set_processed(nl);
                rel->l = nl;
                rel->r = rr;
diff --git a/sql/test/BugTracker-2022/Tests/All 
b/sql/test/BugTracker-2022/Tests/All
--- a/sql/test/BugTracker-2022/Tests/All
+++ b/sql/test/BugTracker-2022/Tests/All
@@ -3,3 +3,4 @@ transaction-conflict.Bug-7228
 insert-not-null.Bug-7232
 recreate-view.Bug-7241
 HAVE_LIBPY3?python-udf-inside-udf.Bug-7252
+empty-MAL.Bug-7259
diff --git a/sql/test/BugTracker-2022/Tests/empty-MAL.Bug-7259.test 
b/sql/test/BugTracker-2022/Tests/empty-MAL.Bug-7259.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2022/Tests/empty-MAL.Bug-7259.test
@@ -0,0 +1,24 @@
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE Test (x int)
+
+query I nosort
+SELECT * FROM Test
+WHERE x IN (SELECT x FROM Test) AND (x IN (SELECT x FROM Test) OR (x IN 
(SELECT x FROM Test)))
+----
+
+statement ok rowcount 3
+INSERT INTO Test VALUES (1),(2),(3)
+
+query I rowsort
+SELECT * FROM Test
+WHERE x IN (SELECT x FROM Test) AND (x IN (SELECT x FROM Test) OR (x IN 
(SELECT x FROM Test)))
+----
+1
+2
+3
+
+statement ok
+ROLLBACK
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to