1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-11 01:42:22 +03:00

Attempt to rationalize the bits associated with ".wheretrace". Provide

a decoder key in sqliteInt.h for what each bit is intended to do.

FossilOrigin-Name: 8ec361695a107a94f2cf6a7fe509656a99d85d49bd7c74133c69903f059a2675
This commit is contained in:
drh
2022-11-30 19:11:31 +00:00
parent ec192e0659
commit 2a757658a0
5 changed files with 94 additions and 62 deletions

View File

@@ -1,5 +1,5 @@
C Rename\ssome\sJS\sfiles\sfrom\sX.js\sto\sX.c-pp.js\sto\skeep\sthe\smaintainer,\sand\sdownstream\sbuild\scustomizers,\saware\sthat\sthose\sfiles\scontain\sconstructs\sspecific\sto\sthe\sc-pp\spreprocessor\sand\swill\snot\srun\sas-is\sin\sJS. C Attempt\sto\srationalize\sthe\sbits\sassociated\swith\s".wheretrace".\s\sProvide\na\sdecoder\skey\sin\ssqliteInt.h\sfor\swhat\seach\sbit\sis\sintended\sto\sdo.
D 2022-11-30T18:21:01.774 D 2022-11-30T19:11:31.801
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -497,11 +497,11 @@ F ext/wasm/README.md ef39861aa21632fdbca0bdd469f78f0096f6449a720f3f39642594af503
F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api b4d68c97d14944b48d55e06aa44f544a6f56a7fa2bcb6f9e030936a5b2a9479a F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api b4d68c97d14944b48d55e06aa44f544a6f56a7fa2bcb6f9e030936a5b2a9479a
F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287 F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287
F ext/wasm/api/README.md 20a256f4aaae80035d2bb1c9e3e0a125570313a8d137d427471d7be10edde87a F ext/wasm/api/README.md 20a256f4aaae80035d2bb1c9e3e0a125570313a8d137d427471d7be10edde87a
F ext/wasm/api/extern-post-js.c-pp.js 8923f76c3d2213159e12d641dc750523ead5c848185dc4996fae5cc12397f88d w ext/wasm/api/extern-post-js.js F ext/wasm/api/extern-post-js.c-pp.js 8923f76c3d2213159e12d641dc750523ead5c848185dc4996fae5cc12397f88d
F ext/wasm/api/extern-pre-js.js cc61c09c7a24a07dbecb4c352453c3985170cec12b4e7e7e7a4d11d43c5c8f41 F ext/wasm/api/extern-pre-js.js cc61c09c7a24a07dbecb4c352453c3985170cec12b4e7e7e7a4d11d43c5c8f41
F ext/wasm/api/post-js-footer.js cd0a8ec768501d9bd45d325ab0442037fb0e33d1f3b4f08902f15c34720ee4a1 F ext/wasm/api/post-js-footer.js cd0a8ec768501d9bd45d325ab0442037fb0e33d1f3b4f08902f15c34720ee4a1
F ext/wasm/api/post-js-header.js 47b6b281f39ad59fa6e8b658308cd98ea292c286a68407b35ff3ed9cfd281a62 F ext/wasm/api/post-js-header.js 47b6b281f39ad59fa6e8b658308cd98ea292c286a68407b35ff3ed9cfd281a62
F ext/wasm/api/pre-js.c-pp.js b88499dc303c21fc3f55f2c364a0f814f587b60a95784303881169f9e91c1d5f w ext/wasm/api/pre-js.js F ext/wasm/api/pre-js.c-pp.js b88499dc303c21fc3f55f2c364a0f814f587b60a95784303881169f9e91c1d5f
F ext/wasm/api/sqlite3-api-cleanup.js 680d5ccfff54459db136a49b2199d9f879c8405d9c99af1dda0cc5e7c29056f4 F ext/wasm/api/sqlite3-api-cleanup.js 680d5ccfff54459db136a49b2199d9f879c8405d9c99af1dda0cc5e7c29056f4
F ext/wasm/api/sqlite3-api-glue.js 03c40b65530d67bb2748b7380aea5fd1534500f812b76a6b401066dcd7fc4116 F ext/wasm/api/sqlite3-api-glue.js 03c40b65530d67bb2748b7380aea5fd1534500f812b76a6b401066dcd7fc4116
F ext/wasm/api/sqlite3-api-oo1.js 06ad2079368e16cb9f182c18cd37bdc3932536856dff4f60582d0ca5f6c491a8 F ext/wasm/api/sqlite3-api-oo1.js 06ad2079368e16cb9f182c18cd37bdc3932536856dff4f60582d0ca5f6c491a8
@@ -510,7 +510,7 @@ F ext/wasm/api/sqlite3-api-worker1.js e94ba98e44afccfa482874cd9acb325883ade50ed1
F ext/wasm/api/sqlite3-license-version-header.js a661182fc93fc2cf212dfd0b987f8e138a3ac98f850b1112e29b5fbdaecc87c3 F ext/wasm/api/sqlite3-license-version-header.js a661182fc93fc2cf212dfd0b987f8e138a3ac98f850b1112e29b5fbdaecc87c3
F ext/wasm/api/sqlite3-opfs-async-proxy.js 9963c78bf6e5ccb5ba28e8597851bd9d980e86803b6d341cc985e586aef10c82 F ext/wasm/api/sqlite3-opfs-async-proxy.js 9963c78bf6e5ccb5ba28e8597851bd9d980e86803b6d341cc985e586aef10c82
F ext/wasm/api/sqlite3-vfs-helper.js 4ad4faf02e1524bf0296be8452c00b5708dce6faf649468d0377e26a0b299263 F ext/wasm/api/sqlite3-vfs-helper.js 4ad4faf02e1524bf0296be8452c00b5708dce6faf649468d0377e26a0b299263
F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 654f37fd6312d3bb0d067b21ad42f9dcfd629fd34ace892e67e06143a65dc6d0 w ext/wasm/api/sqlite3-vfs-opfs.js F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 654f37fd6312d3bb0d067b21ad42f9dcfd629fd34ace892e67e06143a65dc6d0
F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9 F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
F ext/wasm/api/sqlite3-wasm.c 8b32787a3b6bb2990cbaba2304bd5b75a9652acbc8d29909b3279019b6cbaef5 F ext/wasm/api/sqlite3-wasm.c 8b32787a3b6bb2990cbaba2304bd5b75a9652acbc8d29909b3279019b6cbaef5
F ext/wasm/api/sqlite3-worker1-promiser.js 0c7a9826dbf82a5ed4e4f7bf7816e825a52aff253afbf3350431f5773faf0e4b F ext/wasm/api/sqlite3-worker1-promiser.js 0c7a9826dbf82a5ed4e4f7bf7816e825a52aff253afbf3350431f5773faf0e4b
@@ -650,7 +650,7 @@ F src/shell.c.in 9fda74d40b206a707aaa69fc5dc38e2c6a9137a3f4a1dcd7af581d59d92c063
F src/sqlite.h.in 3439711b72cf1a541716da3671ac40f8d5957cdecfc192d47d32f7aed94207c2 F src/sqlite.h.in 3439711b72cf1a541716da3671ac40f8d5957cdecfc192d47d32f7aed94207c2
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h c4b9fa7a7e2bcdf850cfeb4b8a91d5ec47b7a00033bc996fd2ee96cbf2741f5f F src/sqlite3ext.h c4b9fa7a7e2bcdf850cfeb4b8a91d5ec47b7a00033bc996fd2ee96cbf2741f5f
F src/sqliteInt.h a8d507577ca5e6581abb65c30497f7b8cfc7c9feb0d768a081c1e4a6adfcd061 F src/sqliteInt.h 4ddd98e423276714479f9f22dbbda050e8ef99aa97e7e26bf0bdf58acef0ca42
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749 F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -732,9 +732,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d
F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
F src/where.c 81422870d17fdf3880fdb9d3b3965e1aa5efb7a72c6933cec3f1bc8081c463db F src/where.c bf470b5d1ba03af8d558a0c98cc1fa97b330e03a198a7af61895e5a2e8d93f20
F src/whereInt.h e25203e5bfee149f5f1225ae0166cfb4f1e65490c998a024249e98bb0647377c F src/whereInt.h e25203e5bfee149f5f1225ae0166cfb4f1e65490c998a024249e98bb0647377c
F src/wherecode.c 133a94f82858787217d073143617df19e4a6a7d0b771a1519f957608109ad5a5 F src/wherecode.c ee52c2781c36004d23c85bf111063b78fc16e5e1b6a0d424326af8bf90babb0b
F src/whereexpr.c 05295b44b54eea76d1ba766f0908928d0e20e990c249344c9521454d3d09c7ae F src/whereexpr.c 05295b44b54eea76d1ba766f0908928d0e20e990c249344c9521454d3d09c7ae
F src/window.c 14836767adb26573b50f528eb37f8b1336f2c430ab38de7cead1e5c546bb4d8c F src/window.c 14836767adb26573b50f528eb37f8b1336f2c430ab38de7cead1e5c546bb4d8c
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
@@ -2065,8 +2065,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 6620c57b9d3eae7226a412318b43393196df069b5b90aae0cf1743fdd2d102dd P 2eade7c7b17a186735c72974c11a34798a08364861d0f307e897ba765c0a93c7
R f73408d2fb9e184edb2374ed7b5424d1 R 017a8b97f0f146b3506618eca7867206
U stephan U drh
Z a35fbe212dde08194786732b15211922 Z b8ffdae4ce7e302410b9546e9e5b50f2
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
2eade7c7b17a186735c72974c11a34798a08364861d0f307e897ba765c0a93c7 8ec361695a107a94f2cf6a7fe509656a99d85d49bd7c74133c69903f059a2675

View File

@@ -1073,6 +1073,36 @@ extern u32 sqlite3WhereTrace;
# define WHERETRACE(K,X) # define WHERETRACE(K,X)
#endif #endif
/*
** Bits for the sqlite3WhereTrace mask:
**
** (---any--) Top-level block structure
** 0x-------F High-level debug messages
** 0x----FFF- More detail
** 0xFFFF---- Low-level debug messages
**
** 0x00000001 Code generation
** 0x00000002 Solver
** 0x00000004 Solver costs
** 0x00000008 WhereLoop inserts
**
** 0x00000010 Display sqlite3_index_info xBestIndex calls
** 0x00000020 Range an equality scan metrics
** 0x00000040 IN operator decisions
** 0x00000080 WhereLoop cost adjustements
** 0x00000100
** 0x00000200 Covering index decisions
** 0x00000400 OR optimization
** 0x00000800 Index scanner
** 0x00001000 More details associated with code generation
** 0x00002000
** 0x00004000 Show all WHERE terms at key points
** 0x00008000 Show the full SELECT statement at key places
**
** 0x00010000 Show more detail when printing WHERE terms
** 0x00020000 Show WHERE terms returned from whereScanNext()
*/
/* /*
** An instance of the following structure is used to store the busy-handler ** An instance of the following structure is used to store the busy-handler

View File

@@ -705,7 +705,7 @@ static void translateColumnToCopy(
#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(WHERETRACE_ENABLED) #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(WHERETRACE_ENABLED)
static void whereTraceIndexInfoInputs(sqlite3_index_info *p){ static void whereTraceIndexInfoInputs(sqlite3_index_info *p){
int i; int i;
if( !sqlite3WhereTrace ) return; if( (sqlite3WhereTrace & 0x10)==0 ) return;
for(i=0; i<p->nConstraint; i++){ for(i=0; i<p->nConstraint; i++){
sqlite3DebugPrintf( sqlite3DebugPrintf(
" constraint[%d]: col=%d termid=%d op=%d usabled=%d collseq=%s\n", " constraint[%d]: col=%d termid=%d op=%d usabled=%d collseq=%s\n",
@@ -725,7 +725,7 @@ static void whereTraceIndexInfoInputs(sqlite3_index_info *p){
} }
static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){ static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){
int i; int i;
if( !sqlite3WhereTrace ) return; if( (sqlite3WhereTrace & 0x10)==0 ) return;
for(i=0; i<p->nConstraint; i++){ for(i=0; i<p->nConstraint; i++){
sqlite3DebugPrintf(" usage[%d]: argvIdx=%d omit=%d\n", sqlite3DebugPrintf(" usage[%d]: argvIdx=%d omit=%d\n",
i, i,
@@ -1742,7 +1742,7 @@ static int whereRangeSkipScanEst(
int nAdjust = (sqlite3LogEst(p->nSample) - sqlite3LogEst(nDiff)); int nAdjust = (sqlite3LogEst(p->nSample) - sqlite3LogEst(nDiff));
pLoop->nOut -= nAdjust; pLoop->nOut -= nAdjust;
*pbDone = 1; *pbDone = 1;
WHERETRACE(0x10, ("range skip-scan regions: %u..%u adjust=%d est=%d\n", WHERETRACE(0x20, ("range skip-scan regions: %u..%u adjust=%d est=%d\n",
nLower, nUpper, nAdjust*-1, pLoop->nOut)); nLower, nUpper, nAdjust*-1, pLoop->nOut));
} }
@@ -1920,7 +1920,7 @@ static int whereRangeScanEst(
if( nNew<nOut ){ if( nNew<nOut ){
nOut = nNew; nOut = nNew;
} }
WHERETRACE(0x10, ("STAT4 range scan: %u..%u est=%d\n", WHERETRACE(0x20, ("STAT4 range scan: %u..%u est=%d\n",
(u32)iLower, (u32)iUpper, nOut)); (u32)iLower, (u32)iUpper, nOut));
} }
}else{ }else{
@@ -1953,7 +1953,7 @@ static int whereRangeScanEst(
if( nNew<nOut ) nOut = nNew; if( nNew<nOut ) nOut = nNew;
#if defined(WHERETRACE_ENABLED) #if defined(WHERETRACE_ENABLED)
if( pLoop->nOut>nOut ){ if( pLoop->nOut>nOut ){
WHERETRACE(0x10,("Range scan lowers nOut from %d to %d\n", WHERETRACE(0x20,("Range scan lowers nOut from %d to %d\n",
pLoop->nOut, nOut)); pLoop->nOut, nOut));
} }
#endif #endif
@@ -2018,7 +2018,7 @@ static int whereEqualScanEst(
pBuilder->nRecValid = nEq; pBuilder->nRecValid = nEq;
whereKeyStats(pParse, p, pRec, 0, a); whereKeyStats(pParse, p, pRec, 0, a);
WHERETRACE(0x10,("equality scan regions %s(%d): %d\n", WHERETRACE(0x20,("equality scan regions %s(%d): %d\n",
p->zName, nEq-1, (int)a[1])); p->zName, nEq-1, (int)a[1]));
*pnRow = a[1]; *pnRow = a[1];
@@ -2068,7 +2068,7 @@ static int whereInScanEst(
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
if( nRowEst > nRow0 ) nRowEst = nRow0; if( nRowEst > nRow0 ) nRowEst = nRow0;
*pnRow = nRowEst; *pnRow = nRowEst;
WHERETRACE(0x10,("IN row estimate: est=%d\n", nRowEst)); WHERETRACE(0x20,("IN row estimate: est=%d\n", nRowEst));
} }
assert( pBuilder->nRecValid==nRecValid ); assert( pBuilder->nRecValid==nRecValid );
return rc; return rc;
@@ -2177,7 +2177,7 @@ void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC){
sqlite3DebugPrintf(" f %06x N %d", p->wsFlags, p->nLTerm); sqlite3DebugPrintf(" f %06x N %d", p->wsFlags, p->nLTerm);
} }
sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut); sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut);
if( p->nLTerm && (sqlite3WhereTrace & 0x100)!=0 ){ if( p->nLTerm && (sqlite3WhereTrace & 0x4000)!=0 ){
int i; int i;
for(i=0; i<p->nLTerm; i++){ for(i=0; i<p->nLTerm; i++){
sqlite3WhereTermPrint(p->aLTerm[i], i); sqlite3WhereTermPrint(p->aLTerm[i], i);
@@ -3055,7 +3055,7 @@ static int whereLoopAddBtreeIndex(
&& pNew->nOut+10 > pProbe->aiRowLogEst[0] && pNew->nOut+10 > pProbe->aiRowLogEst[0]
){ ){
#if WHERETRACE_ENABLED /* 0x01 */ #if WHERETRACE_ENABLED /* 0x01 */
if( sqlite3WhereTrace & 0x01 ){ if( sqlite3WhereTrace & 0x20 ){
sqlite3DebugPrintf( sqlite3DebugPrintf(
"STAT4 determines term has low selectivity:\n"); "STAT4 determines term has low selectivity:\n");
sqlite3WhereTermPrint(pTerm, 999); sqlite3WhereTermPrint(pTerm, 999);
@@ -3611,7 +3611,7 @@ static int whereLoopAddBtree(
if( m==TOPBIT || (pProbe->bHasExpr && !pProbe->bHasVCol && m!=0) ){ if( m==TOPBIT || (pProbe->bHasExpr && !pProbe->bHasVCol && m!=0) ){
u32 isCov = whereIsCoveringIndex(pWInfo, pProbe, pSrc->iCursor); u32 isCov = whereIsCoveringIndex(pWInfo, pProbe, pSrc->iCursor);
if( isCov==0 ){ if( isCov==0 ){
WHERETRACE(0xff, WHERETRACE(0x200,
("-> %s is not a covering index" ("-> %s is not a covering index"
" according to whereIsCoveringIndex()\n", pProbe->zName)); " according to whereIsCoveringIndex()\n", pProbe->zName));
assert( m!=0 ); assert( m!=0 );
@@ -3619,18 +3619,18 @@ static int whereLoopAddBtree(
m = 0; m = 0;
pNew->wsFlags |= isCov; pNew->wsFlags |= isCov;
if( isCov & WHERE_IDX_ONLY ){ if( isCov & WHERE_IDX_ONLY ){
WHERETRACE(0xff, WHERETRACE(0x200,
("-> %s is a covering expression index" ("-> %s is a covering expression index"
" according to whereIsCoveringIndex()\n", pProbe->zName)); " according to whereIsCoveringIndex()\n", pProbe->zName));
}else{ }else{
assert( isCov==WHERE_EXPRIDX ); assert( isCov==WHERE_EXPRIDX );
WHERETRACE(0xff, WHERETRACE(0x200,
("-> %s might be a covering expression index" ("-> %s might be a covering expression index"
" according to whereIsCoveringIndex()\n", pProbe->zName)); " according to whereIsCoveringIndex()\n", pProbe->zName));
} }
} }
}else if( m==0 ){ }else if( m==0 ){
WHERETRACE(0xff, WHERETRACE(0x200,
("-> %s a covering index according to bitmasks\n", ("-> %s a covering index according to bitmasks\n",
pProbe->zName, m==0 ? "is" : "is not")); pProbe->zName, m==0 ? "is" : "is not"));
pNew->wsFlags = WHERE_IDX_ONLY | WHERE_INDEXED; pNew->wsFlags = WHERE_IDX_ONLY | WHERE_INDEXED;
@@ -3807,7 +3807,7 @@ static int whereLoopAddVirtualOne(
** that the particular combination of parameters provided is unusable. ** that the particular combination of parameters provided is unusable.
** Make no entries in the loop table. ** Make no entries in the loop table.
*/ */
WHERETRACE(0xffff, (" ^^^^--- non-viable plan rejected!\n")); WHERETRACE(0xffffffff, (" ^^^^--- non-viable plan rejected!\n"));
return SQLITE_OK; return SQLITE_OK;
} }
return rc; return rc;
@@ -3918,7 +3918,7 @@ static int whereLoopAddVirtualOne(
sqlite3_free(pNew->u.vtab.idxStr); sqlite3_free(pNew->u.vtab.idxStr);
pNew->u.vtab.needFree = 0; pNew->u.vtab.needFree = 0;
} }
WHERETRACE(0xffff, (" bIn=%d prereqIn=%04llx prereqOut=%04llx\n", WHERETRACE(0xffffffff, (" bIn=%d prereqIn=%04llx prereqOut=%04llx\n",
*pbIn, (sqlite3_uint64)mPrereq, *pbIn, (sqlite3_uint64)mPrereq,
(sqlite3_uint64)(pNew->prereq & ~mPrereq))); (sqlite3_uint64)(pNew->prereq & ~mPrereq)));
@@ -4110,7 +4110,7 @@ static int whereLoopAddVirtual(
/* First call xBestIndex() with all constraints usable. */ /* First call xBestIndex() with all constraints usable. */
WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pTab->zName)); WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pTab->zName));
WHERETRACE(0x40, (" VirtualOne: all usable\n")); WHERETRACE(0x800, (" VirtualOne: all usable\n"));
rc = whereLoopAddVirtualOne( rc = whereLoopAddVirtualOne(
pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn, &bRetry pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn, &bRetry
); );
@@ -4135,7 +4135,7 @@ static int whereLoopAddVirtual(
/* If the plan produced by the earlier call uses an IN(...) term, call /* If the plan produced by the earlier call uses an IN(...) term, call
** xBestIndex again, this time with IN(...) terms disabled. */ ** xBestIndex again, this time with IN(...) terms disabled. */
if( bIn ){ if( bIn ){
WHERETRACE(0x40, (" VirtualOne: all usable w/o IN\n")); WHERETRACE(0x800, (" VirtualOne: all usable w/o IN\n"));
rc = whereLoopAddVirtualOne( rc = whereLoopAddVirtualOne(
pBuilder, mPrereq, ALLBITS, WO_IN, p, mNoOmit, &bIn, 0); pBuilder, mPrereq, ALLBITS, WO_IN, p, mNoOmit, &bIn, 0);
assert( bIn==0 ); assert( bIn==0 );
@@ -4161,7 +4161,7 @@ static int whereLoopAddVirtual(
mPrev = mNext; mPrev = mNext;
if( mNext==ALLBITS ) break; if( mNext==ALLBITS ) break;
if( mNext==mBest || mNext==mBestNoIn ) continue; if( mNext==mBest || mNext==mBestNoIn ) continue;
WHERETRACE(0x40, (" VirtualOne: mPrev=%04llx mNext=%04llx\n", WHERETRACE(0x800, (" VirtualOne: mPrev=%04llx mNext=%04llx\n",
(sqlite3_uint64)mPrev, (sqlite3_uint64)mNext)); (sqlite3_uint64)mPrev, (sqlite3_uint64)mNext));
rc = whereLoopAddVirtualOne( rc = whereLoopAddVirtualOne(
pBuilder, mPrereq, mNext|mPrereq, 0, p, mNoOmit, &bIn, 0); pBuilder, mPrereq, mNext|mPrereq, 0, p, mNoOmit, &bIn, 0);
@@ -4175,7 +4175,7 @@ static int whereLoopAddVirtual(
** that requires no source tables at all (i.e. one guaranteed to be ** that requires no source tables at all (i.e. one guaranteed to be
** usable), make a call here with all source tables disabled */ ** usable), make a call here with all source tables disabled */
if( rc==SQLITE_OK && seenZero==0 ){ if( rc==SQLITE_OK && seenZero==0 ){
WHERETRACE(0x40, (" VirtualOne: all disabled\n")); WHERETRACE(0x800, (" VirtualOne: all disabled\n"));
rc = whereLoopAddVirtualOne( rc = whereLoopAddVirtualOne(
pBuilder, mPrereq, mPrereq, 0, p, mNoOmit, &bIn, 0); pBuilder, mPrereq, mPrereq, 0, p, mNoOmit, &bIn, 0);
if( bIn==0 ) seenZeroNoIN = 1; if( bIn==0 ) seenZeroNoIN = 1;
@@ -4185,7 +4185,7 @@ static int whereLoopAddVirtual(
** that requires no source tables at all and does not use an IN(...) ** that requires no source tables at all and does not use an IN(...)
** operator, make a final call to obtain one here. */ ** operator, make a final call to obtain one here. */
if( rc==SQLITE_OK && seenZeroNoIN==0 ){ if( rc==SQLITE_OK && seenZeroNoIN==0 ){
WHERETRACE(0x40, (" VirtualOne: all disabled and w/o IN\n")); WHERETRACE(0x800, (" VirtualOne: all disabled and w/o IN\n"));
rc = whereLoopAddVirtualOne( rc = whereLoopAddVirtualOne(
pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn, 0); pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn, 0);
} }
@@ -4241,7 +4241,7 @@ static int whereLoopAddOr(
sSubBuild = *pBuilder; sSubBuild = *pBuilder;
sSubBuild.pOrSet = &sCur; sSubBuild.pOrSet = &sCur;
WHERETRACE(0x200, ("Begin processing OR-clause %p\n", pTerm)); WHERETRACE(0x400, ("Begin processing OR-clause %p\n", pTerm));
for(pOrTerm=pOrWC->a; pOrTerm<pOrWCEnd; pOrTerm++){ for(pOrTerm=pOrWC->a; pOrTerm<pOrWCEnd; pOrTerm++){
if( (pOrTerm->eOperator & WO_AND)!=0 ){ if( (pOrTerm->eOperator & WO_AND)!=0 ){
sSubBuild.pWC = &pOrTerm->u.pAndInfo->wc; sSubBuild.pWC = &pOrTerm->u.pAndInfo->wc;
@@ -4258,9 +4258,9 @@ static int whereLoopAddOr(
} }
sCur.n = 0; sCur.n = 0;
#ifdef WHERETRACE_ENABLED #ifdef WHERETRACE_ENABLED
WHERETRACE(0x200, ("OR-term %d of %p has %d subterms:\n", WHERETRACE(0x400, ("OR-term %d of %p has %d subterms:\n",
(int)(pOrTerm-pOrWC->a), pTerm, sSubBuild.pWC->nTerm)); (int)(pOrTerm-pOrWC->a), pTerm, sSubBuild.pWC->nTerm));
if( sqlite3WhereTrace & 0x400 ){ if( sqlite3WhereTrace & 0x20000 ){
sqlite3WhereClausePrint(sSubBuild.pWC); sqlite3WhereClausePrint(sSubBuild.pWC);
} }
#endif #endif
@@ -4322,7 +4322,7 @@ static int whereLoopAddOr(
pNew->prereq = sSum.a[i].prereq; pNew->prereq = sSum.a[i].prereq;
rc = whereLoopInsert(pBuilder, pNew); rc = whereLoopInsert(pBuilder, pNew);
} }
WHERETRACE(0x200, ("End processing OR-clause %p\n", pTerm)); WHERETRACE(0x400, ("End processing OR-clause %p\n", pTerm));
} }
} }
return rc; return rc;
@@ -5337,7 +5337,7 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){
pLoop->cId = '0'; pLoop->cId = '0';
#endif #endif
#ifdef WHERETRACE_ENABLED #ifdef WHERETRACE_ENABLED
if( sqlite3WhereTrace ){ if( sqlite3WhereTrace & 0x02 ){
sqlite3DebugPrintf("whereShortCut() used to compute solution\n"); sqlite3DebugPrintf("whereShortCut() used to compute solution\n");
} }
#endif #endif
@@ -5467,7 +5467,7 @@ static SQLITE_NOINLINE Bitmask whereOmitNoopJoin(
} }
} }
if( pTerm<pEnd ) continue; if( pTerm<pEnd ) continue;
WHERETRACE(0xffff, ("-> drop loop %c not used\n", pLoop->cId)); WHERETRACE(0xffffffff, ("-> drop loop %c not used\n", pLoop->cId));
notReady &= ~pLoop->maskSelf; notReady &= ~pLoop->maskSelf;
for(pTerm=pWInfo->sWC.a; pTerm<pEnd; pTerm++){ for(pTerm=pWInfo->sWC.a; pTerm<pEnd; pTerm++){
if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){ if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){
@@ -5527,7 +5527,7 @@ static SQLITE_NOINLINE void whereCheckIfBloomFilterIsUseful(
testcase( pItem->fg.jointype & JT_LEFT ); testcase( pItem->fg.jointype & JT_LEFT );
pLoop->wsFlags |= WHERE_BLOOMFILTER; pLoop->wsFlags |= WHERE_BLOOMFILTER;
pLoop->wsFlags &= ~WHERE_IDX_ONLY; pLoop->wsFlags &= ~WHERE_IDX_ONLY;
WHERETRACE(0xffff, ( WHERETRACE(0xffffffff, (
"-> use Bloom-filter on loop %c because there are ~%.1e " "-> use Bloom-filter on loop %c because there are ~%.1e "
"lookups into %s which has only ~%.1e rows\n", "lookups into %s which has only ~%.1e rows\n",
pLoop->cId, (double)sqlite3LogEstToInt(nSearch), pTab->zName, pLoop->cId, (double)sqlite3LogEstToInt(nSearch), pTab->zName,
@@ -5894,13 +5894,13 @@ WhereInfo *sqlite3WhereBegin(
/* Construct the WhereLoop objects */ /* Construct the WhereLoop objects */
#if defined(WHERETRACE_ENABLED) #if defined(WHERETRACE_ENABLED)
if( sqlite3WhereTrace & 0xffff ){ if( sqlite3WhereTrace & 0xffffffff ){
sqlite3DebugPrintf("*** Optimizer Start *** (wctrlFlags: 0x%x",wctrlFlags); sqlite3DebugPrintf("*** Optimizer Start *** (wctrlFlags: 0x%x",wctrlFlags);
if( wctrlFlags & WHERE_USE_LIMIT ){ if( wctrlFlags & WHERE_USE_LIMIT ){
sqlite3DebugPrintf(", limit: %d", iAuxArg); sqlite3DebugPrintf(", limit: %d", iAuxArg);
} }
sqlite3DebugPrintf(")\n"); sqlite3DebugPrintf(")\n");
if( sqlite3WhereTrace & 0x100 ){ if( sqlite3WhereTrace & 0x8000 ){
Select sSelect; Select sSelect;
memset(&sSelect, 0, sizeof(sSelect)); memset(&sSelect, 0, sizeof(sSelect));
sSelect.selFlags = SF_WhereBegin; sSelect.selFlags = SF_WhereBegin;
@@ -5910,10 +5910,10 @@ WhereInfo *sqlite3WhereBegin(
sSelect.pEList = pResultSet; sSelect.pEList = pResultSet;
sqlite3TreeViewSelect(0, &sSelect, 0); sqlite3TreeViewSelect(0, &sSelect, 0);
} }
} if( sqlite3WhereTrace & 0x4000 ){ /* Display all WHERE clause terms */
if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ sqlite3DebugPrintf("---- WHERE clause at start of analysis:\n");
sqlite3DebugPrintf("---- WHERE clause at start of analysis:\n"); sqlite3WhereClausePrint(sWLB.pWC);
sqlite3WhereClausePrint(sWLB.pWC); }
} }
#endif #endif
@@ -5929,7 +5929,7 @@ WhereInfo *sqlite3WhereBegin(
** loops will be built using the revised truthProb values. */ ** loops will be built using the revised truthProb values. */
if( sWLB.bldFlags2 & SQLITE_BLDF2_2NDPASS ){ if( sWLB.bldFlags2 & SQLITE_BLDF2_2NDPASS ){
WHERETRACE_ALL_LOOPS(pWInfo, sWLB.pWC); WHERETRACE_ALL_LOOPS(pWInfo, sWLB.pWC);
WHERETRACE(0xffff, WHERETRACE(0xffffffff,
("**** Redo all loop computations due to" ("**** Redo all loop computations due to"
" TERM_HIGHTRUTH changes ****\n")); " TERM_HIGHTRUTH changes ****\n"));
while( pWInfo->pLoops ){ while( pWInfo->pLoops ){
@@ -6015,11 +6015,11 @@ WhereInfo *sqlite3WhereBegin(
} }
#if defined(WHERETRACE_ENABLED) #if defined(WHERETRACE_ENABLED)
if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ if( sqlite3WhereTrace & 0x4000 ){ /* Display all terms of the WHERE clause */
sqlite3DebugPrintf("---- WHERE clause at end of analysis:\n"); sqlite3DebugPrintf("---- WHERE clause at end of analysis:\n");
sqlite3WhereClausePrint(sWLB.pWC); sqlite3WhereClausePrint(sWLB.pWC);
} }
WHERETRACE(0xffff,("*** Optimizer Finished ***\n")); WHERETRACE(0xffffffff,("*** Optimizer Finished ***\n"));
#endif #endif
pWInfo->pParse->nQueryLoop += pWInfo->nRowOut; pWInfo->pParse->nQueryLoop += pWInfo->nRowOut;

View File

@@ -359,7 +359,7 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
pTerm->wtFlags |= TERM_CODED; pTerm->wtFlags |= TERM_CODED;
} }
#ifdef WHERETRACE_ENABLED #ifdef WHERETRACE_ENABLED
if( sqlite3WhereTrace & 0x20000 ){ if( (sqlite3WhereTrace & 0x4001)==0x4001 ){
sqlite3DebugPrintf("DISABLE-"); sqlite3DebugPrintf("DISABLE-");
sqlite3WhereTermPrint(pTerm, (int)(pTerm - (pTerm->pWC->a))); sqlite3WhereTermPrint(pTerm, (int)(pTerm - (pTerm->pWC->a)));
} }
@@ -1346,13 +1346,15 @@ Bitmask sqlite3WhereCodeOneLoopStart(
pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur);
bRev = (pWInfo->revMask>>iLevel)&1; bRev = (pWInfo->revMask>>iLevel)&1;
VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName));
#if WHERETRACE_ENABLED /* 0x20800 */ #if WHERETRACE_ENABLED /* 0x4001 */
if( sqlite3WhereTrace & 0x800 ){ if( sqlite3WhereTrace & 0x1 ){
sqlite3DebugPrintf("Coding level %d of %d: notReady=%llx iFrom=%d\n", sqlite3DebugPrintf("Coding level %d of %d: notReady=%llx iFrom=%d\n",
iLevel, pWInfo->nLevel, (u64)notReady, pLevel->iFrom); iLevel, pWInfo->nLevel, (u64)notReady, pLevel->iFrom);
sqlite3WhereLoopPrint(pLoop, pWC); if( sqlite3WhereTrace & 0x1000 ){
sqlite3WhereLoopPrint(pLoop, pWC);
}
} }
if( sqlite3WhereTrace & 0x20000 ){ if( (sqlite3WhereTrace & 0x4001)==0x4001 ){
if( iLevel==0 ){ if( iLevel==0 ){
sqlite3DebugPrintf("WHERE clause being coded:\n"); sqlite3DebugPrintf("WHERE clause being coded:\n");
sqlite3TreeViewExpr(0, pWInfo->pWhere, 0); sqlite3TreeViewExpr(0, pWInfo->pWhere, 0);
@@ -2276,7 +2278,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
} }
/* Loop through table entries that match term pOrTerm. */ /* Loop through table entries that match term pOrTerm. */
ExplainQueryPlan((pParse, 1, "INDEX %d", ii+1)); ExplainQueryPlan((pParse, 1, "INDEX %d", ii+1));
WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); WHERETRACE(0xffffffff, ("Subplan for OR-clause:\n"));
pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, 0, pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, 0,
WHERE_OR_SUBCLAUSE, iCovCur); WHERE_OR_SUBCLAUSE, iCovCur);
assert( pSubWInfo || pParse->nErr ); assert( pSubWInfo || pParse->nErr );
@@ -2513,12 +2515,12 @@ Bitmask sqlite3WhereCodeOneLoopStart(
} }
#endif #endif
} }
#ifdef WHERETRACE_ENABLED /* 0xffff */ #ifdef WHERETRACE_ENABLED /* 0xffffffff */
if( sqlite3WhereTrace ){ if( sqlite3WhereTrace ){
VdbeNoopComment((v, "WhereTerm[%d] (%p) priority=%d", VdbeNoopComment((v, "WhereTerm[%d] (%p) priority=%d",
pWC->nTerm-j, pTerm, iLoop)); pWC->nTerm-j, pTerm, iLoop));
} }
if( sqlite3WhereTrace & 0x800 ){ if( sqlite3WhereTrace & 0x4000 ){
sqlite3DebugPrintf("Coding auxiliary constraint:\n"); sqlite3DebugPrintf("Coding auxiliary constraint:\n");
sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); sqlite3WhereTermPrint(pTerm, pWC->nTerm-j);
} }
@@ -2547,8 +2549,8 @@ Bitmask sqlite3WhereCodeOneLoopStart(
if( pTerm->leftCursor!=iCur ) continue; if( pTerm->leftCursor!=iCur ) continue;
if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT) ) continue; if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT) ) continue;
pE = pTerm->pExpr; pE = pTerm->pExpr;
#ifdef WHERETRACE_ENABLED /* 0x800 */ #ifdef WHERETRACE_ENABLED /* 0x4001 */
if( sqlite3WhereTrace & 0x800 ){ if( (sqlite3WhereTrace & 0x4001)==0x4001 ){
sqlite3DebugPrintf("Coding transitive constraint:\n"); sqlite3DebugPrintf("Coding transitive constraint:\n");
sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); sqlite3WhereTermPrint(pTerm, pWC->nTerm-j);
} }
@@ -2663,13 +2665,13 @@ Bitmask sqlite3WhereCodeOneLoopStart(
} }
} }
#if WHERETRACE_ENABLED /* 0x20800 */ #if WHERETRACE_ENABLED /* 0x4001 */
if( sqlite3WhereTrace & 0x20000 ){ if( sqlite3WhereTrace & 0x4000 ){
sqlite3DebugPrintf("All WHERE-clause terms after coding level %d:\n", sqlite3DebugPrintf("All WHERE-clause terms after coding level %d:\n",
iLevel); iLevel);
sqlite3WhereClausePrint(pWC); sqlite3WhereClausePrint(pWC);
} }
if( sqlite3WhereTrace & 0x800 ){ if( sqlite3WhereTrace & 0x1 ){
sqlite3DebugPrintf("End Coding level %d: notReady=%llx\n", sqlite3DebugPrintf("End Coding level %d: notReady=%llx\n",
iLevel, (u64)pLevel->notReady); iLevel, (u64)pLevel->notReady);
} }