aboutsummaryrefslogtreecommitdiff
path: root/src/wherecode.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2016-08-26 18:17:08 +0000
committerdrh <drh@noemail.net>2016-08-26 18:17:08 +0000
commit0c36fca004ee51ef626a3df0e74d191fbdc609fe (patch)
tree7a7b7bf83ddda098a11fc56c673670255310e8e2 /src/wherecode.c
parentb7ca2177d7ddcf5dbf06d1b210fa92750324249b (diff)
downloadsqlite-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.c12
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 );