Changeset: 039e6410c6c4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/039e6410c6c4
Added Files:
        sql/test/BugTracker-2025/Tests/7651-anti-join.test
Modified Files:
        gdk/gdk_join.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/test/BugTracker-2025/Tests/All
Branch: default
Log Message:

added fix for bug # 7651


diffs (104 lines):

diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -2095,7 +2095,7 @@ mergejoin(BAT **r1p, BAT **r2p, BAT **r3
                         !BATtvoid(l) && !BATtvoid(r));
                lordering = li.sorted && (ri.sorted || !equal_order) ? 1 : -1;
                rordering = equal_order ? lordering : -lordering;
-               if (!li.nonil && !nil_matches && !nil_on_miss && lvals != NULL) 
{
+               if (!li.nonil && !nil_matches && !nil_on_miss && lvals != NULL 
&& not_in) {
                        /* find first non-nil */
                        nl = binsearch(NULL, 0, li.type, lvals, lvars, 
li.width, 0, BATcount(l), nil, li.sorted ? 1 : -1, li.sorted ? 1 : 0);
                        nl = canditer_search(lci, nl + l->hseqbase, true);
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
@@ -3580,7 +3580,7 @@ rel2bin_antijoin(backend *be, sql_rel *r
                        li = ls;
 
                if (!en->next && (constval || stmt_has_null(ls) /*|| 
stmt_has_null(rs) (change into check for fk)*/)) {
-                       join = stmt_tdiff2(be, ls, rs, NULL);
+                       join = stmt_tdiff2(be, ls, rs, NULL, is_any(e));
                        jexps = NULL;
                } else {
                        join = stmt_join_cand(be, ls, rs, NULL, NULL, 
is_anti(e), (comp_type) e->flag, 0, is_semantics(e), false, true);
@@ -3654,7 +3654,7 @@ rel2bin_antijoin(backend *be, sql_rel *r
                        jl = stmt_project(be, sel, jl);
                        join = stmt_tdiff(be, c, jl, NULL);
                } else {
-                       join = stmt_tdiff2(be, c, jl, NULL);
+                       join = stmt_tdiff2(be, c, jl, NULL, true);
                }
                if (nulls)
                        join = stmt_project(be, join, c);
@@ -3662,7 +3662,7 @@ rel2bin_antijoin(backend *be, sql_rel *r
        } else if (jexps && list_empty(jexps)) {
                stmt *jl = stmt_result(be, join, 0);
                stmt *c = stmt_mirror(be, bin_find_smallest_column(be, left));
-               join = stmt_tdiff2(be, c, jl, NULL);
+               join = stmt_tdiff2(be, c, jl, NULL, true);
        }
 
        /* construct relation */
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -2331,7 +2331,7 @@ stmt_tdiff(backend *be, stmt *op1, stmt 
 }
 
 stmt *
-stmt_tdiff2(backend *be, stmt *op1, stmt *op2, stmt *lcand)
+stmt_tdiff2(backend *be, stmt *op1, stmt *op2, stmt *lcand, bool any)
 {
        InstrPtr q = NULL;
        MalBlkPtr mb = be->mb;
@@ -2349,7 +2349,7 @@ stmt_tdiff2(backend *be, stmt *op1, stmt
                q = pushNilBat(mb, q); /* left candidate */
        q = pushNilBat(mb, q); /* right candidate */
        q = pushBit(mb, q, FALSE);     /* nil matches */
-       q = pushBit(mb, q, TRUE);     /* not in */
+       q = pushBit(mb, q, any);     /* not in */
        q = pushNil(mb, q, TYPE_lng); /* estimate */
 
        bool enabled = sa_get_eb(be->mvc->sa)->enabled;
diff --git a/sql/backends/monet5/sql_statement.h 
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -209,7 +209,7 @@ extern stmt *stmt_markjoin(backend *be, 
 
 extern stmt *stmt_tunion(backend *be, stmt *op1, stmt *op2);
 extern stmt *stmt_tdiff(backend *be, stmt *op1, stmt *op2, stmt *lcand);
-extern stmt *stmt_tdiff2(backend *be, stmt *op1, stmt *op2, stmt *lcand);
+extern stmt *stmt_tdiff2(backend *be, stmt *op1, stmt *op2, stmt *lcand, bool 
any);
 extern stmt *stmt_tinter(backend *be, stmt *op1, stmt *op2, bool single);
 
 extern stmt *stmt_join(backend *be, stmt *op1, stmt *op2, int anti, comp_type 
cmptype, int need_left, int is_semantics, bool single);
diff --git a/sql/test/BugTracker-2025/Tests/7651-anti-join.test 
b/sql/test/BugTracker-2025/Tests/7651-anti-join.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7651-anti-join.test
@@ -0,0 +1,16 @@
+statement ok
+CREATE TABLE t0(c0 INT, c1 INT)
+
+statement ok
+CREATE TABLE t1(c0 INT)
+
+statement ok
+INSERT INTO t0(c0) VALUES(1)
+
+statement ok
+INSERT INTO t1(c0) VALUES(1)
+
+query I
+SELECT t0.c0 FROM t0 WHERE NOT EXISTS (SELECT 1 FROM t1 WHERE t0.c1);
+----
+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
@@ -30,3 +30,4 @@ 7680-union-all
 7682_trigger_crash
 7686-delete-all-empty-table
 7688_not_exists_null
+7651-anti-join
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to