diff options
author | drh <drh@noemail.net> | 2016-08-26 18:17:08 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2016-08-26 18:17:08 +0000 |
commit | 0c36fca004ee51ef626a3df0e74d191fbdc609fe (patch) | |
tree | 7a7b7bf83ddda098a11fc56c673670255310e8e2 /src/wherecode.c | |
parent | b7ca2177d7ddcf5dbf06d1b210fa92750324249b (diff) | |
download | sqlite-0c36fca004ee51ef626a3df0e74d191fbdc609fe.tar.gz sqlite-0c36fca004ee51ef626a3df0e74d191fbdc609fe.zip |
Fix a post-OOM crash in updateRangeAffinityStr(). Add several ALWAYS()
macros on unreachable branches.
FossilOrigin-Name: 87d40195ae5cc2abd9bae45073a615db81263285
Diffstat (limited to 'src/wherecode.c')
-rw-r--r-- | src/wherecode.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/wherecode.c b/src/wherecode.c index 34894fe1b..16ffb89db 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -294,7 +294,7 @@ void sqlite3WhereAddScanStatus( */ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ int nLoop = 0; - while( pTerm + while( ALWAYS(pTerm!=0) && (pTerm->wtFlags & TERM_CODED)==0 && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) && (pLevel->notReady & pTerm->prereqAll)==0 @@ -435,7 +435,7 @@ static int codeEqualityTerm( } } for(i=iEq;i<pLoop->nLTerm; i++){ - if( pLoop->aLTerm[i] && pLoop->aLTerm[i]->pExpr==pX ) nEq++; + if( ALWAYS(pLoop->aLTerm[i]) && pLoop->aLTerm[i]->pExpr==pX ) nEq++; } if( nEq>1 ){ @@ -1518,8 +1518,12 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); VdbeCoverage(v); } - updateRangeAffinityStr(pParse, pRight, nTop, zEndAff); - codeApplyAffinity(pParse, regBase+nEq, nTop, zEndAff); + if( zEndAff ){ + updateRangeAffinityStr(pParse, pRight, nTop, zEndAff); + codeApplyAffinity(pParse, regBase+nEq, nTop, zEndAff); + }else{ + assert( pParse->db->mallocFailed ); + } nConstraint += nTop; testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); |