aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/trigger.c8
-rw-r--r--src/vdbeaux.c47
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);