diff --git a/manifest b/manifest index ee5ffc2012..ab0386202d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\scomments\sto\shelp\sremind\sdevelopers\sto\skeep\sthe\stable\sof\soptimization\ndisable\sbit\svalues\sin\ssync\swith\sthe\sCLI\sand\swith\sTH3. -D 2026-10-10T00:11:38.969 +C Minor\srefinements\sto\sthe\sTreeTracker\s(aka\s"JoinMiss")\soptimization. +D 2026-10-10T12:14:43.652 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -885,7 +885,7 @@ F src/wal.h c6251cfc1950643a976625ca452e46dc9b466b4f5dd2e85f244f29f79bf68ace F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c 68350b0498125555d715c40a6ac1472ac9afb1a910d328b27757afb631cc6a0e F src/whereInt.h 5d739acb94bf1fdf6edd502a919e3dcf2d340dda63cc1827304e119ea878f6f3 -F src/wherecode.c 057bbc97072eb69835ae4555de13f9262da998229e1c6682769f336ea377ce2a +F src/wherecode.c a49e12c4d8e24f231d16e94ad7953a39533433bed794047d8d328a36f5fae3b1 F src/whereexpr.c 76f72a95c5cf0e8a8edb679ca4fb7afa17ba45ff4effe73c414266510109e701 F src/window.c 79a17de595e62aa45961ef1cbe3392e7ebae69fdde3fd0b0200254bc4647025e F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -2280,8 +2280,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 77278079d9dddaff30a1862bf412329e91242a41be7eafc19d3fac8d872adeff -R 224c82c7380fb36f0b5af9a996090a94 +P 0e707e7dba7edadda9951549ae3aa34b713a0f2210ccc486e181e833c74e2fa6 +R e723081299e4a5ad576ea1133576fbb1 U drh -Z 36d1658b412bbe9570138470412f6227 +Z 87720fc95c4150289313a5d057eb4075 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f16040d048..c3339391ac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0e707e7dba7edadda9951549ae3aa34b713a0f2210ccc486e181e833c74e2fa6 +c1ad888eec410613fd5d8ce7e9192bafe4073ad56e87d0232b320b53d5e07120 diff --git a/src/wherecode.c b/src/wherecode.c index 8786c1e8c7..d1aff609e7 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1565,22 +1565,17 @@ static int findNoMatchContinuation( /* If there are less than two outer loops, this optimization is no help */ return 0; } - if( OptimizationDisabled(pWInfo->pParse->db, SQLITE_JoinMiss) ){ - return 0; - } /* The OP_SeekGE and OP_SeekLE opcodes only work right for this ** optimization on a pure equality constraint, so skip the optimization ** for anything else. */ pLoop = pWInfo->a[iLevel].pWLoop; -#if 1 if( (pLoop->wsFlags & WHERE_CONSTRAINT)!=WHERE_COLUMN_EQ ) return 0; if( pLoop->wsFlags & WHERE_SKIPSCAN ) return 0; if( pLoop->wsFlags & WHERE_BIGNULL_SORT ) return 0; assert( (pLoop->wsFlags & (WHERE_VIRTUALTABLE|WHERE_MULTI_OR))==0 ); assert( pLoop->u.btree.nEq>0 ); -#endif /* Find a mask of all outer tables that influence the key. At the same ** time, check to see if any keys values are computed from subqueries and @@ -1610,10 +1605,17 @@ static int findNoMatchContinuation( if( pTabList->a[pWInfo->a[i].iFrom].fg.jointype & JT_OUTER ) return 0; } + /* If we reach this point, that means the conditions of the optimization + ** have been met. Even so, disallow the optimization if it is disabled. + */ + if( OptimizationDisabled(pWInfo->pParse->db, SQLITE_JoinMiss) ){ + return 0; + } + /* If the inner-most outer loop that influences the key for iLevel - ** is controlled by an automatic index and if it is the only outer - ** loop that influences the key, then arrange to delete the automatic - ** index entry if there is no match on the iLevel key. + ** is controlled by an automatic index and if the automatic index is + ** the only outer loop that influences the key, then arrange to delete + ** the automatic index entry if there is no match on the key. */ pParent = &pWInfo->a[iParent]; if( (pParent->pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 @@ -1625,6 +1627,7 @@ static int findNoMatchContinuation( return pParent->addrDeleteCont; } + testcase( iParentaddrCont; }