Changeset: dfea84d65090 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dfea84d65090
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_unnest.c
        sql/test/BugTracker-2025/Tests/All
        sql/test/bugs/Tests/rtrim_bug.test
Branch: Mar2025
Log Message:

handle in vs exists semantics properly fixes bug #7688


diffs (83 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -3530,7 +3530,13 @@ rel2bin_antijoin(backend *be, sql_rel *r
        list *l, *jexps = NULL, *sexps = NULL;
        node *en = NULL, *n;
        stmt *left = NULL, *right = NULL, *join = NULL, *sel = NULL, *sub = 
NULL;
-
+       bool any = false;
+
+       if (rel->exps)
+               for (node *n = rel->exps->h; n && !any; n = n->next) {
+                       sql_exp *e = n->data;
+                       any = is_any(e);
+               }
        if (rel->l) /* first construct the left sub relation */
                left = subrel_bin(be, rel->l, refs);
        if (rel->r) /* first construct the right sub relation */
@@ -3603,7 +3609,7 @@ rel2bin_antijoin(backend *be, sql_rel *r
                stmt *jr = stmt_result(be, join, 1);
                stmt *nulls = NULL;
 
-               if (li && stmt_has_null(li)) {
+               if (li && stmt_has_null(li) && any) {
                        nulls = stmt_selectnil(be, li);
                }
                /* construct relation */
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
@@ -3301,6 +3301,7 @@ rewrite_anyequal(visitor *v, sql_rel *re
                                }
                                if (!rewrite)
                                        return NULL;
+                               sql_exp *inexp;
                                if (is_tuple) {
                                        list *t = le->f;
                                        int s1 = list_length(t), s2 = 
list_length(rsq->exps);
@@ -3310,8 +3311,11 @@ rewrite_anyequal(visitor *v, sql_rel *re
                                                return sql_error(sql, 02, 
SQLSTATE(42000) "Subquery has too %s columns", (s2 < s1) ? "few" : "many");
                                        if (!rewrite->exps)
                                                rewrite->exps = 
sa_list(sql->sa);
-                                       for (node *n = t->h, *m = rsq->exps->h; 
n && m; n = n->next, m = m->next )
-                                               append(rewrite->exps, 
exp_compare(sql->sa, n->data, exp_ref(sql, m->data), cmp_equal));
+                                       for (node *n = t->h, *m = rsq->exps->h; 
n && m; n = n->next, m = m->next ) {
+                                               append(rewrite->exps, inexp = 
exp_compare(sql->sa, n->data, exp_ref(sql, m->data), cmp_equal));
+                                               if (inexp)
+                                                       set_any(inexp);
+                                       }
                                        v->changes++;
                                        return exp_atom_bool(sql->sa, 1);
                                } else {
@@ -3321,7 +3325,9 @@ rewrite_anyequal(visitor *v, sql_rel *re
                                                return NULL;
                                        if (!rewrite->exps)
                                                rewrite->exps = 
sa_list(sql->sa);
-                                       append(rewrite->exps, 
exp_compare(sql->sa, le, exp_ref(sql, re), cmp_equal));
+                                       append(rewrite->exps, 
inexp=exp_compare(sql->sa, le, exp_ref(sql, re), cmp_equal));
+                                       if (inexp)
+                                               set_any(inexp);
                                        v->changes++;
                                        return exp_atom_bool(sql->sa, 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
@@ -27,3 +27,4 @@ 7674-rel_find_designated_index_crash
 7680-union-all
 7682_trigger_crash
 7686-delete-all-empty-table
+7688_not_exists_null
diff --git a/sql/test/bugs/Tests/rtrim_bug.test 
b/sql/test/bugs/Tests/rtrim_bug.test
--- a/sql/test/bugs/Tests/rtrim_bug.test
+++ b/sql/test/bugs/Tests/rtrim_bug.test
@@ -55,7 +55,7 @@ project (
 | | project (
 | | | table("sys"."t1") [ "t1"."m" NOT NULL UNIQUE ]
 | | ) [ "sys"."rtrim"("t1"."m" NOT NULL UNIQUE) NOT NULL as "%1"."%1" ]
-| ) [ ("%4"."%4" NOT NULL) = ("%1"."%1" NOT NULL) ]
+| ) [ ("%4"."%4" NOT NULL) + = ("%1"."%1" NOT NULL) ]
 ) [ "sys"."length"("t1"."m" NOT NULL UNIQUE) NOT NULL as "data_length", 
"t1"."m" NOT NULL UNIQUE as "data_value" ]
 
 statement ok
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to