]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Avoid opening cursors only required for reads that are optimized away by the exists...
authordan <Dan Kennedy>
Sat, 25 Jul 2026 17:13:30 +0000 (17:13 +0000)
committerdan <Dan Kennedy>
Sat, 25 Jul 2026 17:13:30 +0000 (17:13 +0000)
FossilOrigin-Name: c81ec73a3780cf7a44965f1763f1e6e2c324b60132197756fdb351e98052fd02

manifest
manifest.uuid
src/select.c
test/eqp.test
test/existsexpr2.test

index 4f6aa2de5de7b8a1ea58eb73a05c4ed942916ca1..dbdc848088aceaea9662dd5e3228ac27b7b8e264 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Ignore\sany\sDISTINCT\squalifier\son\sa\sSELECT\sstatement\son\sthe\sRHS\sof\san\sIN(...)\sexpression.\sForum\spost\s[bugs:/info/2026-07-25T08:40:13Z\s|\s2026-07-25T08:40:13Z].
-D 2026-07-25T14:49:40.062
+C Avoid\sopening\scursors\sonly\srequired\sfor\sreads\sthat\sare\soptimized\saway\sby\sthe\sexists-to-join\soptimization.\sAddresses\sreport\s[bugs:/info/2026-07-25T08:39:23Z\s|\s2026-07-25T08:39:23Z].
+D 2026-07-25T17:13:30.874
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -742,7 +742,7 @@ F src/printf.c b480176bd0aaed9d64e804cfa3ca27fc585f65a73e7c7ca2fe9b9016db2cf6d5
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c 7145e41ad75e04a811b326aa5faf83c2e071480fabd9fc825055a6b889e6cb86
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c d2ad83d49c41c30d213873bac8481c6bf099438c61dcb597de52ddb55a6324fb
+F src/select.c 6e3ee525a82bb1800b0b464bc6ed5532e97e484eec336004ab1842cb298be61c
 F src/shell.c.in 0df571dd1eae1a15577361902eb5487a072d3290ea94e1e72e757050b641f870
 F src/sqlite.h.in 2101a2b494cbc282d0dc1c3f631c4fb83060c52876cc9d7615b091ad66d932b1
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
@@ -1103,7 +1103,7 @@ F test/enc.test b5503a87b31cea8a5084c6e447383f9ca08933bd2f29d97b6b6201081b2343eb
 F test/enc2.test 872afe58db772e7dfa1ad8e0759f8cc820e9efc8172d460fae83023101c2e435
 F test/enc3.test 55ef64416d72975c66167310a51dc9fc544ba3ae4858b8d5ab22f4cb6500b087
 F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020
-F test/eqp.test 1d653fe8d2612cd6764e5ea2f16dcf5f13a9f50448b9233bb1573804bccd7579
+F test/eqp.test 472e1cb356f5c9eef821d115c7589dd463f49e9ab249183fe34712da157d7dda
 F test/eqp2.test 188bc2293b9dab0932b6ac50c3fec62976815df072d7814d5547c821a8630819
 F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9
 F test/errofst1.test 6da78363739ba8991f498396ab331b5d64e7ab5c4172c12b5884683ef523ac53
@@ -1113,7 +1113,7 @@ F test/exclusive2.test cd70b1d9c6fffd336f9795b711dcc5d9ceba133ad3f7001da3fda6361
 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7
 F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac
 F test/existsexpr.test 1ce70ac41fb6d52525774388aa23e982428e883a850f9d56d49776d234865552
-F test/existsexpr2.test dc23e76389eff3d29f6488ff733012a3560cd67ec8cfaecbecd52cced5d5af11
+F test/existsexpr2.test 7f05f15695426d5ac54afdd60bdc0d62d05dfcf8fbe513d3fe5423dcfd621d6d
 F test/existsfault.test ff41c11f3052c1bbd4f8dd557802310026253d67d7c4e3a180c16d2f0862973e
 F test/expr.test db981f8a85520e99ae20aab7ad2e9b5b0437ed09159b57ced434c672075d2e61
 F test/expr2.test c27327ae9c017a7ff6280123f67aff496f912da74d78c888926d68b46ec75fd8
@@ -2217,8 +2217,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 2f1f4f73535386549c12694dc57cfe555eec689ae6824c6241aaf8d5befcd74d
-R 281ba175d7dc74451cfbb28c113fac8a
+P c54858eab45f71a77249c8ecdc8e107cf631e743b8b883f2b6db60e0bf7e908a
+R 528d47fc0fabfd6337e81b14515c98d0
 U dan
-Z 48fef5873d55c06851c436c4fd093680
+Z 6c13a8261c5395d3405eca89304ed3b7
 # Remove this line to create a well-formed Fossil manifest.
index e18d6760094a7658d628ae723a02035a431839e1..17c83bb22909bfb999fd08d4e369d2b13620b1fd 100644 (file)
@@ -1 +1 @@
-c54858eab45f71a77249c8ecdc8e107cf631e743b8b883f2b6db60e0bf7e908a
+c81ec73a3780cf7a44965f1763f1e6e2c324b60132197756fdb351e98052fd02
index b8854519ee15d49530de4bd21fab03c62ac3cb74..364da8b798e86ab40fdbc21484f590caadae43a0 100644 (file)
@@ -7419,6 +7419,7 @@ static SQLITE_NOINLINE void existsToJoin(
         }
         pSub->pSrc = 0;
         sqlite3ParserAddCleanup(pParse, sqlite3SelectDeleteGeneric, pSub);
+        recomputeColumnsUsed(p, &p->pSrc->a[p->pSrc->nSrc-1]);
 #if TREETRACE_ENABLED
         if( sqlite3TreeTrace & 0x100000 ){
           TREETRACE(0x100000,pParse,p,
index d2bdc49e3b42a0a47b7a94fa4a235a4c7d13302c..f22ac3783d85ecf93e989f00c7a7a51b61bccd3e 100644 (file)
@@ -340,7 +340,7 @@ det 3.3.3 {
 } {
   QUERY PLAN
   |--SCAN t1
-  `--SCAN t2 EXISTS
+  `--SCAN t2 EXISTS USING COVERING INDEX t2i1
 }
 
 #-------------------------------------------------------------------------
index f7644bf8028d4824b7d198a2a2b75c3c23855a9b..3c77e823559694ff5bcae19922fdb54fa2bc4002 100644 (file)
@@ -89,6 +89,23 @@ do_execsql_test 2.2 {
   2 2
 }
 
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 3.0 {
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
+  CREATE TABLE t2(c INTEGER PRIMARY KEY, d, e);
+  CREATE INDEX t2b ON t2(d);
+}
+
+do_execsql_test 3.1 {
+  EXPLAIN SELECT * FROM t1 WHERE EXISTS (
+      SELECT 1 FROM t2 WHERE b=d
+  );
+} [execsql {
+  EXPLAIN SELECT * FROM t1 WHERE EXISTS (
+      SELECT 1 FROM t2 WHERE b=d ORDER BY e
+  );
+}]
 
 
 finish_test