From: drh <> Date: Sat, 18 Jul 2026 17:47:25 +0000 (+0000) Subject: Disqualify the count-of-view optimization if the view is really X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=a5e160582ffc2ed22576e32a066340bc04119202;p=thirdparty%2Fsqlite.git Disqualify the count-of-view optimization if the view is really a correlated subquery. [forum:/info/2026-07-18T10:23:43Z|Forum post 2026-07-18T10:23:43Z]. FossilOrigin-Name: bb65c3adcd79581715f90d287807a3f03b375f69957c7d0202d31b23cf627da0 --- diff --git a/manifest b/manifest index e04c7fa0ba..5ce9c0f5b4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\stcl\stest\scommand\s"optimization_control"\sto\ssupport\sthe\s"count-of-view"\soptimization. -D 2026-07-18T13:34:51.657 +C Disqualify\sthe\scount-of-view\soptimization\sif\sthe\sview\sis\sreally\na\scorrelated\ssubquery.\n[forum:/info/2026-07-18T10:23:43Z|Forum\spost\s2026-07-18T10:23:43Z]. +D 2026-07-18T17:47:25.063 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 54395ee97eb710e695202d4112cf2b1c1c7767a57afcea745df71abb1c917768 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c f553420eaf5c72a49cef786621eea79dd8c4411671839fb05250bb49ca74a0a0 +F src/select.c 586ccc75f2fa289c51554330f9ff549d00dae4122ac7e2af712437e2ef737cc8 F src/shell.c.in ce9ef76da7cc153afaa6aa233a155be885859f41c803a20bdc42d1c628b8ccab F src/sqlite.h.in 2101a2b494cbc282d0dc1c3f631c4fb83060c52876cc9d7615b091ad66d932b1 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 @@ -834,7 +834,7 @@ F test/affinity2.test 4d7a34d328e58ca2a2d78fd76c27614a41ca7ddf4312ded9c68c04f430 F test/affinity3.test 9b7d1133e11d5edd7805573c4ab6f3ba73b0b74a1f280d5b130d4bf3506a93ff F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggfault.test 777f269d0da5b0c2524c7ff6d99ae9a93db4f1b1839a914dd2a12e3035c29829 -F test/aggnested.test 610b0ce2c3e8f3daee25f9752800ee8d785db10da4aa1fbeea0ea1aabaf1d704 +F test/aggnested.test dd6d08de1e950da299db705dcc6cfcbc52c2a4a009996cf92020d0436e174af5 F test/aggorderby.test 7be65e743f82ee49ba62da1c799e59341d23884a99edfe093df0cdfaac94cbbb F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test cf929f721e20960ca9db89471fa44f9176322ba8f25e97193f91881c223643b3 @@ -2215,8 +2215,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 6924895d2cbc50971d8da1810423ad15c638dabc31b4f1083dd6076e20492ef4 -R 86a4a4480d0a33f3221eb8d04beeb46a -U dan -Z 0b024a6f5b73f2d713e1af20ba62be25 +P b14c3f8fec5123b1faa6d88dee2740ee4acb10dd522207531567d46f4714e227 +R 6a7be0c63bdb75b04e2382e006b2cd5f +U drh +Z 474e172c65658296edc69a02e1046ccd # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6263a8b4bc..7e16e7de07 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b14c3f8fec5123b1faa6d88dee2740ee4acb10dd522207531567d46f4714e227 +bb65c3adcd79581715f90d287807a3f03b375f69957c7d0202d31b23cf627da0 diff --git a/src/select.c b/src/select.c index e29ad6e436..073b30f7e6 100644 --- a/src/select.c +++ b/src/select.c @@ -7155,7 +7155,8 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ if( p->pSrc->nSrc!=1 ) return 0; /* One table in FROM */ if( ExprHasProperty(pExpr, EP_WinFunc) ) return 0;/* Not a window function */ pFrom = p->pSrc->a; - if( pFrom->fg.isSubquery==0 ) return 0; /* FROM is a subquery */ + if( pFrom->fg.isSubquery==0 ) return 0; /* FROM is a subquery */ + if( (p->selFlags & SF_Correlated)!=0 ) return 0; /* Not a correlated subq */ pSub = pFrom->u4.pSubq->pSelect; if( pSub->pPrior==0 ) return 0; /* Must be a compound */ if( pSub->selFlags & SF_CopyCte ) return 0; /* Not a CTE */ diff --git a/test/aggnested.test b/test/aggnested.test index f3539076bd..74376a5f25 100644 --- a/test/aggnested.test +++ b/test/aggnested.test @@ -476,12 +476,44 @@ do_execsql_test 9.5 { # New test case for check-in [4470f657d2069972] from 2023-11-02 # https://bugs.chromium.org/p/chromium/issues/detail?id=1511689 # -do_execsql_test 10.1 { +do_catchsql_test 10.1 { DROP TABLE IF EXISTS t0; DROP TABLE IF EXISTS t1; CREATE TABLE t0(c1, c2); INSERT INTO t0 VALUES(1,2); CREATE TABLE t1(c3, c4); INSERT INTO t1 VALUES(3,4); SELECT * FROM t0 WHERE EXISTS (SELECT 1 FROM t1 GROUP BY c3 HAVING ( SELECT count(*) FROM (SELECT 1 UNION ALL SELECT sum(DISTINCT c1) ) ) ) BETWEEN 1 AND 1; -} {1 2} +} {1 {misuse of aggregate: sum()}} + +# Forum post 2026-07-18T10:23:43Z +# +do_execsql_test 11.1 { + DROP TABLE t1; + CREATE TABLE t1(c1); INSERT INTO t1 VALUES(11); + DROP TABLE t2; + CREATE TABLE t2(c2); +} +do_catchsql_test 11.2 { + SELECT * FROM t1 WHERE EXISTS( + SELECT 1 FROM t2 WHERE ( + SELECT COUNT(*) FROM ( + SELECT 1 + UNION ALL + SELECT SUM(c1) + ) + ) + ); +} {1 {misuse of aggregate: SUM()}} +do_catchsql_test 11.3 { + SELECT * FROM t1 WHERE EXISTS( + SELECT 1 FROM t2 WHERE ( + SELECT COUNT(*) FROM ( + SELECT 1 WHERE true + UNION ALL + SELECT SUM(c1) + ) + ) + ); +} {1 {misuse of aggregate: SUM()}} + finish_test