From: dan Date: Sat, 25 Jul 2026 17:13:30 +0000 (+0000) Subject: Avoid opening cursors only required for reads that are optimized away by the exists... X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=536ec8a99139c4d8795c746dce72a3de98e479da;p=thirdparty%2Fsqlite.git Avoid opening cursors only required for reads that are optimized away by the exists-to-join optimization. Addresses report [bugs:/info/2026-07-25T08:39:23Z | 2026-07-25T08:39:23Z]. FossilOrigin-Name: c81ec73a3780cf7a44965f1763f1e6e2c324b60132197756fdb351e98052fd02 --- diff --git a/manifest b/manifest index 4f6aa2de5d..dbdc848088 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index e18d676009..17c83bb229 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c54858eab45f71a77249c8ecdc8e107cf631e743b8b883f2b6db60e0bf7e908a +c81ec73a3780cf7a44965f1763f1e6e2c324b60132197756fdb351e98052fd02 diff --git a/src/select.c b/src/select.c index b8854519ee..364da8b798 100644 --- a/src/select.c +++ b/src/select.c @@ -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, diff --git a/test/eqp.test b/test/eqp.test index d2bdc49e3b..f22ac3783d 100644 --- a/test/eqp.test +++ b/test/eqp.test @@ -340,7 +340,7 @@ det 3.3.3 { } { QUERY PLAN |--SCAN t1 - `--SCAN t2 EXISTS + `--SCAN t2 EXISTS USING COVERING INDEX t2i1 } #------------------------------------------------------------------------- diff --git a/test/existsexpr2.test b/test/existsexpr2.test index f7644bf802..3c77e82355 100644 --- a/test/existsexpr2.test +++ b/test/existsexpr2.test @@ -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