aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <>2024-04-02 14:12:29 +0000
committerdrh <>2024-04-02 14:12:29 +0000
commit8ce73ce15b8f02b8e86c8a4d567dce42f40c70ba (patch)
treee21df098e8522910ed488cbc936a8682cb22cfd1 /src
parent7f7d0b19f8d2628466d8e25bbb0f7d10bfb98baf (diff)
downloadsqlite-8ce73ce15b8f02b8e86c8a4d567dce42f40c70ba.tar.gz
sqlite-8ce73ce15b8f02b8e86c8a4d567dce42f40c70ba.zip
Fix typos in comments. Provided ".wheretrace" debugging output for the
interstage heuristic module. Do omit automatic index loops in the interstage heuristic. FossilOrigin-Name: 186dcae19e249db36de15f295999cff25063b54ee3d5d481cd2ba99b6d13148e
Diffstat (limited to 'src')
-rw-r--r--src/sqliteInt.h2
-rw-r--r--src/where.c23
2 files changed, 20 insertions, 5 deletions
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index dba64c71b..365ff2c7f 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -1156,7 +1156,7 @@ extern u32 sqlite3WhereTrace;
** 0x00000010 Display sqlite3_index_info xBestIndex calls
** 0x00000020 Range an equality scan metrics
** 0x00000040 IN operator decisions
-** 0x00000080 WhereLoop cost adjustements
+** 0x00000080 WhereLoop cost adjustments
** 0x00000100
** 0x00000200 Covering index decisions
** 0x00000400 OR optimization
diff --git a/src/where.c b/src/where.c
index fe76f2c96..a4506602a 100644
--- a/src/where.c
+++ b/src/where.c
@@ -5561,15 +5561,15 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
** Except, if the first solver() call generated a full-table scan in an outer
** loop then stop this analysis at the first full-scan, since the second
** solver() run might try to swap that full-scan for another in order to
-** get the output into the correct order. In other words, we do *not* want
-** to inhibit a rewrites like this:
+** get the output into the correct order. In other words, we allow a
+** rewrite like this:
**
** First Solver() Second Solver()
** |-- SCAN t1 |-- SCAN t2
** |-- SEARCH t2 `-- SEARCH t1
** `-- SORT USING B-TREE
**
-** Rather, the purpose of this routine is to inhibit rewrites such as:
+** The purpose of this routine is to disallow rewrites such as:
**
** First Solver() Second Solver()
** |-- SEARCH t1 |-- SCAN t2 <--- bad!
@@ -5581,6 +5581,9 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
*/
static SQLITE_NOINLINE void whereInterstageHeuristic(WhereInfo *pWInfo){
int i;
+#ifdef WHERETRACE_ENABLED
+ int once = 0;
+#endif
for(i=0; i<pWInfo->nLevel; i++){
WhereLoop *p = pWInfo->a[i].pWLoop;
if( p==0 ) break;
@@ -5590,7 +5593,19 @@ static SQLITE_NOINLINE void whereInterstageHeuristic(WhereInfo *pWInfo){
WhereLoop *pLoop;
for(pLoop=pWInfo->pLoops; pLoop; pLoop=pLoop->pNextLoop){
if( pLoop->iTab!=iTab ) continue;
- if( (pLoop->wsFlags & WHERE_CONSTRAINT)!=0 ) continue;
+ if( (pLoop->wsFlags & (WHERE_CONSTRAINT|WHERE_AUTO_INDEX))!=0 ){
+ /* Auto-index and index-constrained loops allowed to remain */
+ continue;
+ }
+#ifdef WHERETRACE_ENABLED
+ if( sqlite3WhereTrace & 0x80 ){
+ if( once==0 ){
+ sqlite3DebugPrintf("Loops disabled by interstage heuristic:\n");
+ once = 1;
+ }
+ sqlite3WhereLoopPrint(pLoop, &pWInfo->sWC);
+ }
+#endif /* WHERETRACE_ENABLED */
pLoop->prereq = ALLBITS; /* Prevent 2nd solver() from using this one */
}
}else{