From 1d8eb1d9b6dc6d8e9db65e79d8e4d7144401e6a9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 31 Jan 2026 02:17:55 +0000 Subject: [PATCH] Fix a missed optimization opportunity due to a typo in check-in [898bfa1afd8260ea]. Reported by [forum:/forumpost/2026-01-31T00:49:53z|forum post 2026-01-31T00:49:53z]. FossilOrigin-Name: 3a4f9a323da90611d7eda51b90cb058175ddde0a128e1ff00ce58cc83af0f376 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 5 ++++- test/tkt-99378177930f87bd.test | 28 ++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index aa0bc802d0..4306bb47d0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sCROSS\sJOIN\sa\sjoin\sreorder\sbarrier\sagain,\sas\sthe\sSQLite\sdocumentation\ssays\sit\sis.\s\sIt\nmistakenly\sstopped\sbeing\sa\sjoin\sbarrier\swith\scheck-in\s[c1ea064948ba08c4]. -D 2026-01-30T17:10:22.815 +C Fix\sa\smissed\soptimization\sopportunity\sdue\sto\sa\stypo\sin\scheck-in\s[898bfa1afd8260ea].\nReported\sby\s[forum:/forumpost/2026-01-31T00:49:53z|forum\spost\s2026-01-31T00:49:53z]. +D 2026-01-31T02:17:55.945 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -689,7 +689,7 @@ F src/date.c e19e0cfff9a41bfdd884c655755f6f00bca4c1a22272b56e0dd6667b7ea893a2 F src/dbpage.c c9ea81c11727f27e02874611e92773e68e2a90a875ef2404b084564c235fd91f F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 901499bed747c3b4b2be45be1abe912ba50a3f6a40ba88cc006ccf279f2d0e97 -F src/expr.c 2857569c0f81c6b5bb6a5de824f6f8a6fcf974ff86604d5f43a7a7e71678e563 +F src/expr.c 1ca95a1f8d0ef5113ca948ffac815183e30d754403f871e91d9ebb94ec92ee0d F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c c065da737307a29e4d240ac727758dbf4102cb3218a1f651eb689b6a6fa12531 F src/func.c efbcfe7cb7fc92fe5299c9aaa141075eb60d2108253e99bc235384ed6a90d937 @@ -1764,7 +1764,7 @@ F test/tkt-8454a207b9.test ead80b7a01438ca1436cee029694a96c821346cf1e24f06de12f8 F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356 F test/tkt-8c63ff0ec.test 258b7fc8d7e4e1cb5362c7d65c143528b9c4cbed F test/tkt-91e2e8ba6f.test 08c4f94ae07696b05c9b822da0b4e5337a2f54c5 -F test/tkt-99378177930f87bd.test 9d6cff39b50d062c813ae1cb0ebbd1b7acf81ecc23ae5d5215e5bb05667dc137 +F test/tkt-99378177930f87bd.test 1ee631d155f0d51a4547e9405ef35a3a9a32977352a37a10bcbbacc5e38356ad F test/tkt-9a8b09f8e6.test b2ef151d0984b2ebf237760dbeaa50724e5a0667 F test/tkt-9d68c883.test 16f7cb96781ba579bc2e19bb14b4ad609d9774b6 F test/tkt-9f2eb3abac.test cb6123ac695a08b4454c3792fbe85108f67fabf8 @@ -2194,8 +2194,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P a5a1b69b3feedb507ecfe2e9ddc039d7c01e1bb54e3e881df5010481886cdef9 -R 2c69c84e0f52c569a5c3b3b4ea6a7f1a +P d294106ecb78d765305ab740007f4a678e28baa13ae403fe57ea9cbfc259620f +R 464b9c781876348fa88209b9bcbdb4fe U drh -Z fa98c5b69b350e02a0236ff7a868f9da +Z fade084440f5178d675ec00dcd7ba976 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 37ae2bd790..b6fb2c3daa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d294106ecb78d765305ab740007f4a678e28baa13ae403fe57ea9cbfc259620f +3a4f9a323da90611d7eda51b90cb058175ddde0a128e1ff00ce58cc83af0f376 diff --git a/src/expr.c b/src/expr.c index 1cd95f89b1..972dc14d2c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -7393,7 +7393,10 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ if( pIEpr==0 ) break; if( NEVER(!ExprUseYTab(pExpr)) ) break; for(i=0; inSrc; i++){ - if( pSrcList->a[0].iCursor==pIEpr->iDataCur ) break; + if( pSrcList->a[i].iCursor==pIEpr->iDataCur ){ + testcase( i>0 ); + break; + } } if( i>=pSrcList->nSrc ) break; if( NEVER(pExpr->pAggInfo!=0) ) break; /* Resolved by outer context */ diff --git a/test/tkt-99378177930f87bd.test b/test/tkt-99378177930f87bd.test index ba9fdc7027..4958672804 100644 --- a/test/tkt-99378177930f87bd.test +++ b/test/tkt-99378177930f87bd.test @@ -33,6 +33,8 @@ do_execsql_test tkt-99378-100 { (2, '{"x":2}', 4, 5), (3, '{"x":1}', 6, 7); CREATE INDEX t1x ON t1(d, a, b->>'x', c); + CREATE TABLE t2(y); + INSERT INTO t2(y) VALUES(9); } {} do_execsql_test tkt-99378-110 { SELECT a, @@ -48,6 +50,20 @@ do_execsql_test tkt-99378-110 { 2 2 1 26 22 3 1 1 6 6 } +do_execsql_test tkt-99378-111 { + SELECT if(a,a,y), + SUM(1) AS t1, + SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, + SUM(c) AS t3, + SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 + FROM t2 CROSS JOIN t1 + WHERE d BETWEEN 0 and 10 + GROUP BY a; +} { + 1 2 1 16 12 + 2 2 1 26 22 + 3 1 1 6 6 +} # The proof that the index on the expression is being used is in the # fact that the byte code contains no "Function" opcodes. In other words, @@ -65,6 +81,17 @@ do_execsql_test tkt-99378-120 { WHERE d BETWEEN 0 and 10 GROUP BY a; } {~/Function/} +do_execsql_test tkt-99378-121 { + EXPLAIN + SELECT if(a,a,y), + SUM(1) AS t1, + SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, + SUM(c) AS t3, + SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 + FROM t2 CROSS JOIN t1 + WHERE d BETWEEN 0 and 10 + GROUP BY a; +} {~/Function/} do_execsql_test tkt-99378-130 { @@ -182,6 +209,7 @@ do_execsql_test tkt-99378-310 { # do_execsql_test tkt-99378-400 { DROP TABLE t1; + DROP TABLE t2; CREATE TABLE t0(w); INSERT INTO t0(w) VALUES(1); CREATE TABLE t1(x); -- 2.47.3