aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <>2024-07-05 13:55:59 +0000
committerdrh <>2024-07-05 13:55:59 +0000
commit42123a294d38c5e25d2960f9f06e70b5850f39a0 (patch)
treecdfe5bcf9995cd913bf7460a59bbfca488ddb4b5 /src
parent635c6b8086834600f93c1002c7a0ffe3c34e9c51 (diff)
downloadsqlite-42123a294d38c5e25d2960f9f06e70b5850f39a0.tar.gz
sqlite-42123a294d38c5e25d2960f9f06e70b5850f39a0.zip
Use a mini Bloom filter to help reduce the number of pointless searches for
prior SubrtnSig objects when generating code for IN operators with subqueries as their right operand. FossilOrigin-Name: d8cedbe055b40a0ea4e5d47845b535162e9fcb0d0f88c03211797ab64d2d56fb
Diffstat (limited to 'src')
-rw-r--r--src/expr.c4
-rw-r--r--src/sqliteInt.h2
2 files changed, 3 insertions, 3 deletions
diff --git a/src/expr.c b/src/expr.c
index d012c3d5e..e7df61c86 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -3436,7 +3436,7 @@ static int findCompatibleInRhsSubrtn(
Vdbe *v;
if( pNewSig==0 ) return 0;
- if( pParse->bHasSubrtn==0 ) return 0;
+ if( (pParse->mSubrtnSig & (1<<(pNewSig->selId&7)))==0 ) return 0;
assert( pExpr->op==TK_IN );
assert( !ExprUseYSub(pExpr) );
assert( ExprUseXSelect(pExpr) );
@@ -3564,7 +3564,7 @@ void sqlite3CodeRhsOfIN(
pSig->regReturn = pExpr->y.sub.regReturn;
pSig->iTable = iTab;
sqlite3VdbeChangeP4(v, -1, (const char*)pSig, P4_SUBRTNSIG);
- pParse->bHasSubrtn = 1;
+ pParse->mSubrtnSig = 1 << (pSig->selId&7);
}
addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
}
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index 323a257f6..6a92befe0 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -3834,7 +3834,7 @@ struct Parse {
u8 prepFlags; /* SQLITE_PREPARE_* flags */
u8 withinRJSubrtn; /* Nesting level for RIGHT JOIN body subroutines */
u8 bHasWith; /* True if statement contains WITH */
- u8 bHasSubrtn; /* True if any P4_SUBRTNSIG has been set */
+ u8 mSubrtnSig; /* mini Bloom filter on available SubrtnSig.selId */
#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST)
u8 earlyCleanup; /* OOM inside sqlite3ParserAddCleanup() */
#endif