]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix another bug in EXISTS-to-JOIN - this one
authordrh <>
Tue, 21 Apr 2026 13:06:15 +0000 (13:06 +0000)
committerdrh <>
Tue, 21 Apr 2026 13:06:15 +0000 (13:06 +0000)
having to do with an OFFSET clause of a LIMIT.

FossilOrigin-Name: f91099ecee5413b3ab7261461e774436f5a9214101eea10d234135abe70bb444

manifest
manifest.uuid
src/select.c
test/existsexpr.test

index bdc868445b42bb9206bb9fe83fbf955f403d3527..a90571953bc8b5c5da098d43666ba17ee288f684 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Reformulate\show\sthe\sOPFS\sasync\sproxy\sWorker\sis\sloaded\sfor\sthe\sbundler-friendly\sbuilds\sto\swork\saround\sa\sbug\sin\sVite\sin\swhich\sit\sincompatibly\srewrites\sthe\sWorker's\sURL\sarguments.\sAddresses\sthe\sdiscussion\sat\s[https://github.com/sqlite/sqlite-wasm/pull/159|npm\spackage\sPR\s159]\sand\spatch\svalidated\sby\sJure\sRotar.
-D 2026-04-21T10:15:16.615
+C Fix\sanother\sbug\sin\sEXISTS-to-JOIN\s-\sthis\sone\nhaving\sto\sdo\swith\san\sOFFSET\sclause\sof\sa\sLIMIT.
+D 2026-04-21T13:06:15.482
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -734,7 +734,7 @@ F src/printf.c 50be92de0725e88c8b38978775ab46f9b42d74e21f65045c3423503173eb0566
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c 928ff887f2a7c64275182060d94d06fdddbe32226c569781cf7e7edc6f58d7fd
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c ffe199f025a0dd74670d2a77232bdea364a4d7b36f32c64a6572d39ba6a11576
+F src/select.c 2ef8d7c8d1bf8dfba18bd0264b2777c160e94941638de67a0f2ea9e422bfb390
 F src/shell.c.in 4edf6ba701a13c0b9c519a56b33548a6519d5e67ebb683ba7e253d28543d04d0
 F src/sqlite.h.in e2915e4a86d5e0783afb5cb72411df38d987c7f3c5aa2d5441b8e74d30b649d8
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
@@ -1097,7 +1097,7 @@ F test/exclusive.test 7ff63be7503990921838d5c9f77f6e33e68e48ed1a9d48cd28745bf650
 F test/exclusive2.test cd70b1d9c6fffd336f9795b711dcc5d9ceba133ad3f7001da3fda63615bdc91e
 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7
 F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac
-F test/existsexpr.test 75c1c13cda18b53f68c135fe644afc034d72a6de5b0774b0219ca4a6dc4b96b0
+F test/existsexpr.test 630b64d75002d7dc1aab46899073ef7cec57fb0893ec8ab14ff50e882c03b56e
 F test/existsexpr2.test dc23e76389eff3d29f6488ff733012a3560cd67ec8cfaecbecd52cced5d5af11
 F test/existsfault.test ff41c11f3052c1bbd4f8dd557802310026253d67d7c4e3a180c16d2f0862973e
 F test/expr.test db981f8a85520e99ae20aab7ad2e9b5b0437ed09159b57ced434c672075d2e61
@@ -2197,8 +2197,9 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P a4f27adb97f2fb8bf44931d3a44f9d05f0485e743ad086177b8f9471ee9dfff5
-R 5869d027752cbb7e6c85972889078829
-U stephan
-Z 85f0e94dfe6e3766a7d33cb5f24da021
+P 6215c9dd27ca446bf61d8ee7adcf455d35914853b19cb5f5feff5ce0f420e7b7
+Q +1dd3c6a5e50ac3f617683678223e42f48636c17e58905506c5c74cc4bf05845c
+R d3b0f34ce06fb693dab223e22f418668
+U drh
+Z d8512a94c63bc3f8fdf01b2fbc91167c
 # Remove this line to create a well-formed Fossil manifest.
index 18a4df0a7cc0504ab1ec357b69d96520677b1bfb..92c50ade13b04a8af3d234046e8470a3ab64f3bc 100644 (file)
@@ -1 +1 @@
-6215c9dd27ca446bf61d8ee7adcf455d35914853b19cb5f5feff5ce0f420e7b7
+f91099ecee5413b3ab7261461e774436f5a9214101eea10d234135abe70bb444
index e8e9f36a88f04aff2ed106ec7ed0f7fe93ec74cc..840d800c980a7ee7c4966145a8066de4561bbeb0 100644 (file)
@@ -7324,6 +7324,7 @@ static SQLITE_NOINLINE void existsToJoin(
    && !ExprHasProperty(pWhere, EP_OuterON|EP_InnerON) 
    && ALWAYS(p->pSrc!=0)
    && p->pSrc->nSrc<BMS
+   && (p->pLimit==0 || p->pLimit->pRight==0)
   ){
     if( pWhere->op==TK_AND ){
       Expr *pRight = pWhere->pRight;
index 28029359b8c0a7778a8793fd51f25901e1aaf1b7..724fa2574912f145c5a1a97f946f03a528eb7bfc 100644 (file)
@@ -476,6 +476,29 @@ catch { optimization_control db exists-to-join 0 }
 db cache flush
 do_execsql_test 9.6 $Q {{big string value}}
 
+#-------------------------------------------------------------------------
+# Forum post 2026-04-21T10:57:09Z
+do_execsql_test 9.7.1 {
+  DROP TABLE t3;
+  CREATE TABLE t3(x INT, y INT);
+  CREATE TABLE t4(z INT);
+  INSERT INTO t3 VALUES (1,0),(2,2),(3,3);
+  INSERT INTO t4 VALUES (4),(5);
+}
+set Q {
+  SELECT x FROM t3
+   WHERE EXISTS(SELECT 1 FROM t4 WHERE z>y)
+   LIMIT 1 OFFSET 1
+}
+catch { optimization_control db all 1 }
+db cache flush
+do_execsql_test 9.7.2 $Q {2}
+catch { optimization_control db exists-to-join 0 }
+db cache flush
+do_execsql_test 9.7.3 $Q {2}
+catch { optimization_control db all 1 }
+db cache flush
+
 #-------------------------------------------------------------------------
 reset_db