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]