Changeset: 22ebb0b44a80 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/22ebb0b44a80
Added Files:
        sql/test/BugTracker-2025/Tests/7648_rightjoin_crash.test
Modified Files:
        sql/server/rel_unnest.c
        sql/test/BugTracker-2025/Tests/All
Branch: Mar2025
Log Message:

fixed corner case of rewriting exists with right outerjoin
fixes issue #7648
added test


diffs (88 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
@@ -931,13 +931,18 @@ push_up_project(mvc *sql, sql_rel *rel, 
                                        l = rel_project( sql->sa, l, 
rel_projections(sql, l, NULL, 1, 1));
 
                                if (is_left(rel->op) && !list_empty(rel->attr)) 
{
-                                       assert(list_length(rel->exps)==1);
-                                       sql_exp *e = rel->exps->h->data;
-                                       sql_exp *oe = rel->attr->h->data;
-                                       rel_project_add_exp(sql, l, e);
-                                       if (exp_is_atom(oe) && exp_is_false(oe))
-                                               e->flag = cmp_notequal;
-                                       exp_setalias(e, oe->alias.label, 
exp_relname(oe), exp_name(oe));
+                                       if (list_empty(rel->exps)) {
+                                               sql_exp *oe = 
rel->attr->h->data;
+                                               rel_project_add_exp(sql, l, oe);
+                                       } else {
+                                               
assert(list_length(rel->exps)==1);
+                                               sql_exp *e = rel->exps->h->data;
+                                               sql_exp *oe = 
rel->attr->h->data;
+                                               rel_project_add_exp(sql, l, e);
+                                               if (exp_is_atom(oe) && 
exp_is_false(oe))
+                                                       e->flag = cmp_notequal;
+                                               exp_setalias(e, 
oe->alias.label, exp_relname(oe), exp_name(oe));
+                                       }
                                }
                                if (!list_empty(r->exps)) {
                                        for (m=r->exps->h; m; m = m->next) {
@@ -3674,19 +3679,18 @@ rewrite_exists(visitor *v, sql_rel *rel,
                                return exp_rel(v->sql, sq);
                        }
                        if (is_project(rel->op) || depth > 0 || 
is_outerjoin(rel->op)) {
-                               sql_rel *join = NULL, *rewrite = NULL;
+                               sql_rel *rewrite = NULL;
 
                                (void)rewrite_inner(v->sql, rel, sq, op_left, 
&rewrite);
                                exp_reset_props(rewrite, le, 
is_left(rewrite->op));
-                               join = 
(is_full(rel->op)||is_left(rel->op))?rel->r:rel->l;
-                               if (!join)
+                               if (!rewrite)
                                        return NULL;
-                               if (join && !join->exps)
-                                       join->exps = sa_list(v->sql->sa);
+                               if (rewrite && !rewrite->exps)
+                                       rewrite->exps = sa_list(v->sql->sa);
                                v->changes++;
-                               if (join) {
-                                       if (!join->attr)
-                                               join->attr = 
sa_list(v->sql->sa);
+                               if (rewrite) {
+                                       if (!rewrite->attr)
+                                               rewrite->attr = 
sa_list(v->sql->sa);
                                        sql_exp *a = exp_atom_bool(v->sql->sa, 
is_exists(sf));
                                        set_no_nil(a);
                                        if (!e->alias.label)
@@ -3695,7 +3699,7 @@ rewrite_exists(visitor *v, sql_rel *rel,
                                                exp_setalias(a, e->alias.label, 
exp_relname(e), exp_name(e));
                                        le = exp_ref(v->sql, a);
                                        le->card = CARD_MULTI; /* mark as multi 
value, the real attribute is introduced later */
-                                       append(join->attr, a);
+                                       append(rewrite->attr, a);
                                        if ((is_project(rel->op) || depth))
                                                return le;
                                }
diff --git a/sql/test/BugTracker-2025/Tests/7648_rightjoin_crash.test 
b/sql/test/BugTracker-2025/Tests/7648_rightjoin_crash.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7648_rightjoin_crash.test
@@ -0,0 +1,8 @@
+statement ok
+CREATE TABLE IF NOT EXISTS t0(c0 INT)
+
+query II
+SELECT * FROM t0 RIGHT JOIN (VALUES (1)) AS subQuery1(col_1) ON EXISTS (VALUES 
(CASE subQuery1.col_1 WHEN subQuery1.col_1 THEN 1 END))
+----
+NULL
+1
diff --git a/sql/test/BugTracker-2025/Tests/All 
b/sql/test/BugTracker-2025/Tests/All
--- a/sql/test/BugTracker-2025/Tests/All
+++ b/sql/test/BugTracker-2025/Tests/All
@@ -14,5 +14,6 @@ 7636_antijoin_crash
 7643_select_0_optimizer_bug
 7644_antijoin_crash
 7646_leftjoin_crash
+7648_rightjoin_crash
 7654_non_monetdb_user_remote_table_exec
 7656_incorrect_error
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to