From 6884e5cbd3ff4602cbfe80744decc7205867435d Mon Sep 17 00:00:00 2001 From: "D. Richard Hipp" Date: Tue, 10 Jul 2018 17:10:44 +0000 Subject: [PATCH] Further improvements to bytecode branch testing. Fix cases where the macros said a branch could not be taken when in fact it could be. Alter some window function branch coverage macros to indicate that comparison operands cannot be NULL. --- src/analyze.c | 5 +---- src/update.c | 2 +- src/vdbe.c | 2 +- src/vdbe.h | 3 +++ src/window.c | 12 ++++++------ 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/analyze.c b/src/analyze.c index c3fa50b1c3..37b1eec0c7 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1274,10 +1274,7 @@ static void analyzeOneTable( callStatGet(v, regStat4, STAT_GET_NLT, regLt); callStatGet(v, regStat4, STAT_GET_NDLT, regDLt); sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0); - /* We know that the regSampleRowid row exists because it was read by - ** the previous loop. Thus the not-found jump of seekOp will never - ** be taken */ - VdbeCoverageNeverTaken(v); + VdbeCoverage(v); #ifdef SQLITE_ENABLE_STAT3 sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, 0, regSample); #else diff --git a/src/update.c b/src/update.c index 9860943c0e..926e29e754 100644 --- a/src/update.c +++ b/src/update.c @@ -523,7 +523,7 @@ void sqlite3Update( if( !isView && aiCurOnePass[0]!=iDataCur && aiCurOnePass[1]!=iDataCur ){ assert( pPk ); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey,nKey); - VdbeCoverageNeverTaken(v); + VdbeCoverage(v); } if( eOnePass!=ONEPASS_SINGLE ){ labelContinue = sqlite3VdbeMakeLabel(v); diff --git a/src/vdbe.c b/src/vdbe.c index 83f75ae309..f9c7eba91a 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -180,7 +180,7 @@ int sqlite3_found_count = 0; if( M==2 ) I |= 0x04; if( M==4 ){ I |= 0x08; - if( (I&0x05)!=0 ) I |= 0x05; + if( (mNever&0x08)!=0 && (I&0x05)!=0) I |= 0x05; /*NO_TEST*/ } sqlite3GlobalConfig.xVdbeBranch(sqlite3GlobalConfig.pVdbeBranchArg, iSrcLine&0xffffff, I, M); diff --git a/src/vdbe.h b/src/vdbe.h index 4725242c57..183242a7be 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -351,6 +351,8 @@ int sqlite3NotPureFunc(sqlite3_context*); sqlite3VdbeSetLineNumber(v,__LINE__|0x6000000); # define VdbeCoverageNeverNull(v) \ sqlite3VdbeSetLineNumber(v,__LINE__|0x4000000); +# define VdbeCoverageNeverNullIf(v,x) \ + if(x)sqlite3VdbeSetLineNumber(v,__LINE__|0x4000000); # define VdbeCoverageEqNe(v) \ sqlite3VdbeSetLineNumber(v,__LINE__|0x8000000); # define VDBE_OFFSET_LINENO(x) (__LINE__+x) @@ -360,6 +362,7 @@ int sqlite3NotPureFunc(sqlite3_context*); # define VdbeCoverageAlwaysTaken(v) # define VdbeCoverageNeverTaken(v) # define VdbeCoverageNeverNull(v) +# define VdbeCoverageNeverNullIf(v,x) # define VdbeCoverageEqNe(v) # define VDBE_OFFSET_LINENO(x) 0 #endif diff --git a/src/window.c b/src/window.c index 5caaaa6ddb..6a50d7c0a2 100644 --- a/src/window.c +++ b/src/window.c @@ -1038,9 +1038,9 @@ static void windowCheckIntValue(Parse *pParse, int reg, int eCond){ VdbeCoverageIf(v, eCond==1); VdbeCoverageIf(v, eCond==2); sqlite3VdbeAddOp3(v, aOp[eCond], regZero, sqlite3VdbeCurrentAddr(v)+2, reg); - VdbeCoverageIf(v, eCond==0); - VdbeCoverageIf(v, eCond==1); - VdbeCoverageIf(v, eCond==2); + VdbeCoverageNeverNullIf(v, eCond==0); + VdbeCoverageNeverNullIf(v, eCond==1); + VdbeCoverageNeverNullIf(v, eCond==2); sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_ERROR, OE_Abort); sqlite3VdbeAppendP4(v, (void*)azErr[eCond], P4_STATIC); sqlite3ReleaseTempReg(pParse, regZero); @@ -1308,7 +1308,7 @@ static void windowReturnOneRow( } sqlite3VdbeAddOp3(v, OP_Add, tmpReg, pWin->regApp, tmpReg); sqlite3VdbeAddOp3(v, OP_Gt, pWin->regApp+1, lbl, tmpReg); - VdbeCoverage(v); + VdbeCoverageNeverNull(v); sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, lbl, tmpReg); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); @@ -1621,7 +1621,7 @@ static void windowCodeRowExprStep( assert( pMWin->pStart!=0 ); assert( pMWin->eEnd==TK_FOLLOWING ); sqlite3VdbeAddOp3(v, OP_Ge, regStart, sqlite3VdbeCurrentAddr(v)+2, regEnd); - VdbeCoverage(v); + VdbeCoverageNeverNull(v); sqlite3VdbeAddOp2(v, OP_Copy, regSize, regStart); sqlite3VdbeAddOp3(v, OP_Subtract, regStart, regEnd, regEnd); } @@ -1630,7 +1630,7 @@ static void windowCodeRowExprStep( assert( pMWin->pEnd!=0 ); assert( pMWin->eStart==TK_PRECEDING ); sqlite3VdbeAddOp3(v, OP_Le, regStart, sqlite3VdbeCurrentAddr(v)+3, regEnd); - VdbeCoverage(v); + VdbeCoverageNeverNull(v); sqlite3VdbeAddOp2(v, OP_Copy, regSize, regStart); sqlite3VdbeAddOp2(v, OP_Copy, regSize, regEnd); } -- 2.11.4.GIT