diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/trigger.c | 8 | ||||
-rw-r--r-- | src/vdbeaux.c | 47 |
2 files changed, 32 insertions, 23 deletions
diff --git a/src/trigger.c b/src/trigger.c index 4b3e4fd57..7093cbc7f 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -843,7 +843,9 @@ static CodedTrigger *codeRowTrigger( /* Code the WHEN clause. If it evaluates to false (or NULL) the ** sub-vdbe is immediately halted. */ pWhen = sqlite3ExprDup(db, pTrigger->pWhen, 0); - if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) ){ + if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) + && db->mallocFailed==0 + ){ iEndTrigger = sqlite3VdbeMakeLabel(v); sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); } @@ -859,7 +861,9 @@ static CodedTrigger *codeRowTrigger( VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf))); transferParseError(pParse, pSubParse); - pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pParse->nArg); + if( db->mallocFailed==0 ){ + pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pParse->nArg); + } pProgram->nMem = pSubParse->nMem; pProgram->nCsr = pSubParse->nTab; pProgram->token = (void *)pTrigger; diff --git a/src/vdbeaux.c b/src/vdbeaux.c index d3e0d9cd9..23acfef29 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -341,6 +341,7 @@ int sqlite3VdbeCurrentAddr(Vdbe *p){ VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg){ VdbeOp *aOp = p->aOp; + assert( aOp && !p->db->mallocFailed ); resolveP2Values(p, pnMaxArg); *pnOp = p->nOp; p->aOp = 0; @@ -512,16 +513,18 @@ static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){ } void sqlite3VdbeProgramDelete(sqlite3 *db, SubProgram *p, int freeop){ - assert( p->nRef>0 ); - if( freeop || p->nRef==1 ){ - Op *aOp = p->aOp; - p->aOp = 0; - vdbeFreeOpArray(db, aOp, p->nOp); - p->nOp = 0; - } - p->nRef--; - if( p->nRef==0 ){ - sqlite3DbFree(db, p); + if( p ){ + assert( p->nRef>0 ); + if( freeop || p->nRef==1 ){ + Op *aOp = p->aOp; + p->aOp = 0; + vdbeFreeOpArray(db, aOp, p->nOp); + p->nOp = 0; + } + p->nRef--; + if( p->nRef==0 ){ + sqlite3DbFree(db, p); + } } } @@ -1350,9 +1353,6 @@ int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){ ** open cursors. */ static void closeAllCursors(Vdbe *p){ - int i; - /* if( p->apCsr==0 ) return; */ - if( p->pFrame ){ VdbeFrame *pFrame = p->pFrame; for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); @@ -1361,14 +1361,19 @@ static void closeAllCursors(Vdbe *p){ p->pFrame = 0; p->nFrame = 0; - for(i=0; i<p->nCursor; i++){ - VdbeCursor *pC = p->apCsr[i]; - if( pC ){ - sqlite3VdbeFreeCursor(p, pC); - p->apCsr[i] = 0; + if( p->apCsr ){ + int i; + for(i=0; i<p->nCursor; i++){ + VdbeCursor *pC = p->apCsr[i]; + if( pC ){ + sqlite3VdbeFreeCursor(p, pC); + p->apCsr[i] = 0; + } } } - releaseMemArray(&p->aMem[1], p->nMem); + if( p->aMem ){ + releaseMemArray(&p->aMem[1], p->nMem); + } } /* @@ -1385,8 +1390,8 @@ static void Cleanup(Vdbe *p){ /* Execute assert() statements to ensure that the Vdbe.apCsr[] and ** Vdbe.aMem[] arrays have already been cleaned up. */ int i; - for(i=0; i<p->nCursor; i++){ assert( p->apCsr[i]==0 ); } - for(i=1; i<=p->nMem; i++){ assert( p->aMem[i].flags==MEM_Null ); } + for(i=0; i<p->nCursor; i++) assert( p->apCsr==0 || p->apCsr[i]==0 ); + for(i=1; i<=p->nMem; i++) assert( p->aMem==0 || p->aMem[i].flags==MEM_Null ); #endif sqlite3DbFree(db, p->zErrMsg); |