diff options
author | drh <> | 2021-12-04 18:45:08 +0000 |
---|---|---|
committer | drh <> | 2021-12-04 18:45:08 +0000 |
commit | 067c60cfc9aa3ec493f3bdd8f62d225846743a2a (patch) | |
tree | 6df98f942e6d38b1f9517e952d44fab3ca69ac81 /src | |
parent | 770dade262f88ec531d7708ac2d0f2e7882dcb16 (diff) | |
download | sqlite-067c60cfc9aa3ec493f3bdd8f62d225846743a2a.tar.gz sqlite-067c60cfc9aa3ec493f3bdd8f62d225846743a2a.zip |
Add VdbeCoverage() macros. Adjust the Bloom-filter hash function so that it
correctly deals with zero-blobs.
FossilOrigin-Name: 629ee2e3e3125bfd2af435c6713d49e46691213ad15db0a5e93a63a77f1130c2
Diffstat (limited to 'src')
-rw-r--r-- | src/vdbe.c | 8 | ||||
-rw-r--r-- | src/where.c | 5 | ||||
-rw-r--r-- | src/wherecode.c | 2 |
3 files changed, 12 insertions, 3 deletions
diff --git a/src/vdbe.c b/src/vdbe.c index 9b6a4106d..acbbee892 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -695,6 +695,7 @@ static unsigned int filterHash(const Mem *aMem, const Op *pOp){ h += (u32)(sqlite3VdbeIntValue(p)&0xffffffff); }else if( p->flags & (MEM_Str|MEM_Blob) ){ h += p->n; + if( p->flags & MEM_Zero ) h += p->u.nZero; } } return h % (SQLITE_BLOOM_SZ*8); @@ -8229,7 +8230,12 @@ case OP_Filter: { /* jump */ } #endif assert( h>=0 && h<SQLITE_BLOOM_SZ*8 ); - if( (pIn1->z[h/8] & (1<<(h&7)))==0 ) goto jump_to_p2; + if( (pIn1->z[h/8] & (1<<(h&7)))==0 ){ + VdbeBranchTaken(1, 2); + goto jump_to_p2; + }else{ + VdbeBranchTaken(0, 2); + } break; } diff --git a/src/where.c b/src/where.c index 87a00ef20..0d205125c 100644 --- a/src/where.c +++ b/src/where.c @@ -986,10 +986,10 @@ static SQLITE_NOINLINE void constructBloomFilter( assert( v!=0 ); iCur = pLevel->iTabCur; addrCont = sqlite3VdbeMakeLabel(pParse); - addrTop = sqlite3VdbeAddOp0(v, OP_Once); + addrTop = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); pLevel->regFilter = ++pParse->nMem; sqlite3VdbeAddOp1(v, OP_FilterInit, pLevel->regFilter); - sqlite3VdbeAddOp1(v, OP_Rewind, iCur); + sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); pWCEnd = &pWInfo->sWC.a[pWInfo->sWC.nTerm]; for(pTerm=pWInfo->sWC.a; pTerm<pWCEnd; pTerm++){ Expr *pExpr = pTerm->pExpr; @@ -1016,6 +1016,7 @@ static SQLITE_NOINLINE void constructBloomFilter( } sqlite3VdbeResolveLabel(v, addrCont); sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+3); + VdbeCoverage(v); sqlite3VdbeJumpHere(v, addrTop); sqlite3VdbeJumpHere(v, addrTop+2); } diff --git a/src/wherecode.c b/src/wherecode.c index fbb40ad4e..e02a73642 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1517,6 +1517,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( pLevel->regFilter ){ sqlite3VdbeAddOp4Int(v, OP_Filter, pLevel->regFilter, addrNxt, iRowidReg, 1); + VdbeCoverage(v); } sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); VdbeCoverage(v); @@ -1846,6 +1847,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( pLevel->regFilter ){ sqlite3VdbeAddOp4Int(v, OP_Filter, pLevel->regFilter, addrNxt, regBase, nEq); + VdbeCoverage(v); } op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; |