From fd8be0ca941a367e57191f48323099f7b9996ead Mon Sep 17 00:00:00 2001 From: jeffchen Date: Thu, 22 Oct 2026 14:03:19 +0000 Subject: [PATCH] Avoid repeated setup when reusing a materialized CTE. FossilOrigin-Name: 18bec552a0da979f32f7a5a024691ab2bbb09454c75a7e99a125a5bd7545584f --- manifest | 17 ++++++++++------- manifest.tags | 4 ++-- manifest.uuid | 2 +- src/select.c | 10 ++++++++++ 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 438266c859..004409a1f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sbranch-3.54\sfixes\sinto\strunk -D 2026-10-22T11:41:16.140 +C Avoid\srepeated\ssetup\swhen\sreusing\sa\smaterialized\sCTE. +D 2026-10-22T14:03:19.049 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -807,7 +807,7 @@ F src/printf.c 4bd228ed9e9346d558362be562757ee5eef6f9bf483b7f02751ca42cf95174d3 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 658d5d8f67b7565cbed56394d0fdbb124561a92c7455253186189db5e090e661 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c 7b82615d355666993b777da78a6892e3e48220efe9fd24eb0bb10fc3953c7bc0 +F src/select.c 114c5874d9c61bb4175831067b6f7c2542da72c9e5fba10ff944c9ebded8bcea F src/shell.c.in 808c0bd4a593a3552777c059e90c9c47e459f507fa25d2afd298edf09d3140f5 F src/sqlite.h.in 2bf0346991d5a6066581c57cc8a12554b22aec7d32630b493db564f0afd376b3 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 @@ -2297,8 +2297,11 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 03f699544e6b2040eda17e2f4b48813b10513fc05891a3dd4000867316413103 12285a3f4efdf41210fa3020127670b0d1fd8d740a5ac43db0c6641fec3e5142 -R 7e43ea42358511ef205f08b515ae9978 -U drh -Z 58fd7612be0ec62affd861745171369a +P fdf339d965aba5e35feaf3ef613e2e2ce0795338591f261998141a6d080bb0da +R de918b30fccfea7c2bb8696386a99983 +T *branch * performance +T *sym-performance * +T -sym-trunk * +U jeffchen +Z cd309b322a06c457f8360ef478882aff # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.tags b/manifest.tags index bec971799f..e27ea82c4a 100644 --- a/manifest.tags +++ b/manifest.tags @@ -1,2 +1,2 @@ -branch trunk -tag trunk +branch performance +tag performance diff --git a/manifest.uuid b/manifest.uuid index 20c71eafb1..91096873d3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fdf339d965aba5e35feaf3ef613e2e2ce0795338591f261998141a6d080bb0da +18bec552a0da979f32f7a5a024691ab2bbb09454c75a7e99a125a5bd7545584f diff --git a/src/select.c b/src/select.c index 582dc4d215..86f98f490e 100644 --- a/src/select.c +++ b/src/select.c @@ -8253,11 +8253,21 @@ int sqlite3Select( ** then make the pItem->iCursor be a copy of the ephemeral table that ** holds the result of the materialization. tag-select-0484 */ CteUse *pCteUse = pItem->u2.pCteUse; + /* The materialization is computed once per run of the statement or + ** trigger program and does not change after that. So the subroutine + ** call and the OP_OpenDup are needed on the first pass only. The + ** OP_NullRow runs on every pass and leaves the duplicate cursor not + ** positioned on a row, as OP_OpenDup does. */ + int addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Gosub, pCteUse->regRtn, pCteUse->addrM9e); if( pItem->iCursor!=pCteUse->iCur ){ sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pCteUse->iCur); VdbeComment((v, "%!S", pItem)); } + sqlite3VdbeJumpHere(v, addrOnce); + if( pItem->iCursor!=pCteUse->iCur ){ + sqlite3VdbeAddOp1(v, OP_NullRow, pItem->iCursor); + } pSub->nSelectRow = pCteUse->nRowEst; }else if( (pPrior = isSelfJoinView(pTabList, pItem, 0, i))!=0 ){ /* This view has already been materialized by a prior entry in