aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <>2021-12-04 18:45:08 +0000
committerdrh <>2021-12-04 18:45:08 +0000
commit067c60cfc9aa3ec493f3bdd8f62d225846743a2a (patch)
tree6df98f942e6d38b1f9517e952d44fab3ca69ac81 /src
parent770dade262f88ec531d7708ac2d0f2e7882dcb16 (diff)
downloadsqlite-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.c8
-rw-r--r--src/where.c5
-rw-r--r--src/wherecode.c2
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];