1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00

Performance improvements in PRAGMA integrity_check and in materialized CTEs.

FossilOrigin-Name: 52d0c0b3d18b032e2d2c006a5d60df4c65da3b95200eaaffddb0ede9ed63f29f
This commit is contained in:
drh
2026-10-22 20:03:37 +00:00
4 changed files with 20 additions and 15 deletions

View File

@@ -1,5 +1,5 @@
C Improve\sALTER\sTABLE\sDROP\sCONSTRAINT\sso\sthat\sit\sis\sbetter\sable\sto\sdeal\nwith\ssome\scorner\scase\sin\sthe\sconstraint\ssyntax.\nBugs\s[bugs:/info/2026-10-22T16:25:18Z|2026-10-22T16:25:18Z]\sand\n[bugs:/info/2026-10-22T16:30:48Z|2026-10-22T16:30:48Z].
D 2026-10-22T19:55:10.157
C Performance\simprovements\sin\sPRAGMA\sintegrity_check\sand\sin\smaterialized\sCTEs.
D 2026-10-22T20:03:37.533
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -801,13 +801,13 @@ F src/parse.y 21f92beded2b0e1f1826b7f140b679c159ca0922be94b0b675fc9dabdf2fa892
F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484
F src/pcache.h 00c5797ddf546ee0fe2828d7f75d1afbf1b40ba054f362905326c5ccca15e60c
F src/pcache1.c 6bc38b44961f767985ae5022fb7887eda206040f57475812473929c702f6799d
F src/pragma.c 78e1cf2aa4c260555a09c01e0e387c6ba14c85ff25b46e07b8d2c721ae7093a2
F src/pragma.c 593571dfd86c24e63a4d2fc1927dcf2901be454f318bb0abb64dedddefb53bdd
F src/prepare.c 8c4f4571668700664d0da6b6d2fe3e8d9d8808e3d1c643f14024e25d966df418
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,9 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
P fdf339d965aba5e35feaf3ef613e2e2ce0795338591f261998141a6d080bb0da
R 4cf4f7463265cefb4651b6bc760f0580
P 14d924c33ff11babef13e68f178c715bb8744a0134ee580715486b601d5738d8 d0b5bc53a9d828c425ea29bc418688aa7df20e8cc4b69b81acb0ac1a7c169b6a
R 9c27d1388fc21c7d73384c44f57158ba
T +closed d0b5bc53a9d828c425ea29bc418688aa7df20e8cc4b69b81acb0ac1a7c169b6a
U drh
Z 29402b27137f74b18959508a58afc75f
Z 8abe2cfbcb64db54b4e6f596a898f36f
# Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
14d924c33ff11babef13e68f178c715bb8744a0134ee580715486b601d5738d8
52d0c0b3d18b032e2d2c006a5d60df4c65da3b95200eaaffddb0ede9ed63f29f

View File

@@ -1850,14 +1850,9 @@ void sqlite3Pragma(
sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0,
1, 0, &iDataCur, &iIdxCur);
/* reg[7] counts the number of entries in the table.
** reg[8+i] counts the number of entries in the i-th index
*/
sqlite3VdbeAddOp2(v, OP_Integer, 0, 7);
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */
}
assert( pParse->nMem>=8+j );
assert( sqlite3NoTempsInRange(pParse,1,7+j) );
assert( sqlite3NoTempsInRange(pParse,1,7) );
sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v);
loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1);
@@ -2070,7 +2065,6 @@ void sqlite3Pragma(
r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3,
pPrior, r1);
pPrior = pIdx;
sqlite3VdbeAddOp2(v, OP_AddImm, 8+j, 1);/* increment entry count */
/* Verify that an index entry exists for the current table row */
sqlite3VdbeAddOp4Int(v, OP_Found, iIdxCur+j, ckUniq, r1,
pIdx->nColumn); VdbeCoverage(v);

View File

@@ -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