From 7d7bb7b42c07762fff730ff4a693b4cc3b5e89be Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Fri, 2 Jan 2026 16:03:27 -0800 Subject: [PATCH 1/4] Remove check for nullRejecting filter in exists iterator --- sql/rowexec/join_iters.go | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/sql/rowexec/join_iters.go b/sql/rowexec/join_iters.go index 1d46c86d8d..739c607ed3 100644 --- a/sql/rowexec/join_iters.go +++ b/sql/rowexec/join_iters.go @@ -247,7 +247,6 @@ func newExistsIter(ctx *sql.Context, b sql.NodeExecBuilder, j *plan.JoinNode, ro cond: j.Filter, scopeLen: j.ScopeLen, rowSize: rowSize, - nullRej: j.Filter != nil && plan.IsNullRejecting(j.Filter), }, nil } @@ -262,7 +261,6 @@ type existsIter struct { scopeLen int rowSize int typ plan.JoinType - nullRej bool rightIterNonEmpty bool } @@ -308,14 +306,7 @@ func (i *existsIter) Next(ctx *sql.Context) (sql.Row, error) { // EXISTS with empty right is always false → skip this left row nextState = esIncLeft case i.typ.IsAnti(): - if i.nullRej { - // Filter is null-rejecting: need to run condition once with nil right so NULL can propagate - // and row may be excluded - nextState = esCompare - } else { - // Filter is not null-rejecting: no matches possible, row passes - nextState = esRet - } + nextState = esRet default: nextState = esCompare } From 404b373ef3a7e39566423197c8c8cebc1d66e152 Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Fri, 2 Jan 2026 16:20:09 -0800 Subject: [PATCH 2/4] empty right iterators should be treated as an EOF --- sql/rowexec/join_iters.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/sql/rowexec/join_iters.go b/sql/rowexec/join_iters.go index 739c607ed3..b9d4fe9ed2 100644 --- a/sql/rowexec/join_iters.go +++ b/sql/rowexec/join_iters.go @@ -301,15 +301,7 @@ func (i *existsIter) Next(ctx *sql.Context) (sql.Row, error) { return nil, err } if plan.IsEmptyIter(rIter) { - switch { - case i.typ.IsSemi(): - // EXISTS with empty right is always false → skip this left row - nextState = esIncLeft - case i.typ.IsAnti(): - nextState = esRet - default: - nextState = esCompare - } + nextState = esRightIterEOF } else { nextState = esIncRight } From 94fdfa537358d57ad544f71a007ef0a61283608f Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Mon, 5 Jan 2026 10:26:31 -0800 Subject: [PATCH 3/4] add test --- enginetest/queries/script_queries.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 83fb585946..79495f984d 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -14657,6 +14657,21 @@ select * from t1 except ( }, }, }, + { + // https://github.com/dolthub/dolt/issues/10258 + Name: "WHERE NOT EXISTS from empty view", + SetUpScript: []string{ + "CREATE TABLE t1(c0 boolean, c1 boolean);", + "insert into t1(c0) values (true), (false)", + "create view v0(c0) as select true having false", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "SELECT * from t1 where not exists (select 1 from v0 where (case t1.c1 when false then v0.c0 else t1.c0 end)) order by c0", + Expected: []sql.Row{{0, nil}, {1, nil}}, + }, + }, + }, } var SpatialScriptTests = []ScriptTest{ From 406c3197b1de68e48493d659befe766a40fa5840 Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Mon, 5 Jan 2026 18:29:05 +0000 Subject: [PATCH 4/4] [ga-format-pr] Run ./format_repo.sh to fix formatting --- enginetest/queries/script_queries.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 1ad604957c..999dbb685e 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -14669,10 +14669,10 @@ select * from t1 except ( { Query: "SELECT * from t1 where not exists (select 1 from v0 where (case t1.c1 when false then v0.c0 else t1.c0 end)) order by c0", Expected: []sql.Row{{0, nil}, {1, nil}}, - }, - }, - }, - { + }, + }, + }, + { // https://github.com/dolthub/dolt/issues/10246 Dialect: "mysql", Name: "boolean keys are not used for string column lookups",