diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/expr.c | 4 | ||||
-rw-r--r-- | src/main.c | 9 | ||||
-rw-r--r-- | src/trigger.c | 17 | ||||
-rw-r--r-- | src/vdbe.c | 18 |
4 files changed, 31 insertions, 17 deletions
diff --git a/src/expr.c b/src/expr.c index eafd09592..54b733424 100644 --- a/src/expr.c +++ b/src/expr.c @@ -12,7 +12,7 @@ ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** -** $Id: expr.c,v 1.61 2002/05/21 13:43:04 drh Exp $ +** $Id: expr.c,v 1.62 2002/05/23 02:09:04 drh Exp $ */ #include "sqliteInt.h" @@ -186,6 +186,7 @@ ExprList *sqliteExprListDup(ExprList *p){ if( pNew==0 ) return 0; pNew->nExpr = p->nExpr; pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) ); + if( pNew->a==0 ) return 0; for(i=0; i<p->nExpr; i++){ pNew->a[i].pExpr = sqliteExprDup(p->a[i].pExpr); pNew->a[i].zName = sqliteStrDup(p->a[i].zName); @@ -203,6 +204,7 @@ IdList *sqliteIdListDup(IdList *p){ if( pNew==0 ) return 0; pNew->nId = p->nId; pNew->a = sqliteMalloc( p->nId*sizeof(p->a[0]) ); + if( pNew->a==0 ) return 0; for(i=0; i<p->nId; i++){ pNew->a[i].zName = sqliteStrDup(p->a[i].zName); pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias); diff --git a/src/main.c b/src/main.c index 6d0f1be2d..c1754bd58 100644 --- a/src/main.c +++ b/src/main.c @@ -14,7 +14,7 @@ ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** -** $Id: main.c,v 1.75 2002/05/19 23:43:14 danielk1977 Exp $ +** $Id: main.c,v 1.76 2002/05/23 02:09:04 drh Exp $ */ #include "sqliteInt.h" #include "os.h" @@ -387,8 +387,11 @@ static void clearHashTable(sqlite *db, int preserveTemps){ HashElem *pElem; Hash temp1; Hash temp2; - assert( sqliteHashFirst(&db->tblDrop)==0 ); /* There can not be uncommitted */ - assert( sqliteHashFirst(&db->idxDrop)==0 ); /* DROP TABLEs or DROP INDEXs */ + + /* Make sure there are no uncommited DROPs */ + assert( sqliteHashFirst(&db->tblDrop)==0 || sqlite_malloc_failed ); + assert( sqliteHashFirst(&db->idxDrop)==0 || sqlite_malloc_failed ); + assert( sqliteHashFirst(&db->trigDrop)==0 || sqlite_malloc_failed ); temp1 = db->tblHash; temp2 = db->trigHash; sqliteHashInit(&db->trigHash, SQLITE_HASH_STRING, 0); diff --git a/src/trigger.c b/src/trigger.c index 5864b7d8c..81a750686 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -52,6 +52,7 @@ void sqliteCreateTrigger( } { char *tmp_str = sqliteStrNDup(pTableName->z, pTableName->n); + if( tmp_str==0 ) goto trigger_cleanup; tab = sqliteFindTable(pParse->db, tmp_str); sqliteFree(tmp_str); if( !tab ){ @@ -70,8 +71,11 @@ void sqliteCreateTrigger( /* Build the Trigger object */ nt = (Trigger*)sqliteMalloc(sizeof(Trigger)); + if( nt==0 ) goto trigger_cleanup; nt->name = sqliteStrNDup(pName->z, pName->n); nt->table = sqliteStrNDup(pTableName->z, pTableName->n); + nt->strings = sqliteStrNDup(zData, zDataLen); + if( sqlite_malloc_failed ) goto trigger_cleanup; nt->op = op; nt->tr_tm = tr_tm; nt->pWhen = pWhen; @@ -79,10 +83,7 @@ void sqliteCreateTrigger( nt->foreach = foreach; nt->step_list = pStepList; nt->isCommit = 0; - - nt->strings = sqliteStrNDup(zData, zDataLen); offset = (int)(nt->strings - zData); - sqliteExprMoveStrings(nt->pWhen, offset); ss = nt->step_list; @@ -120,6 +121,7 @@ void sqliteCreateTrigger( /* Make an entry in the sqlite_master table */ v = sqliteGetVdbe(pParse); + if( v==0 ) goto trigger_cleanup; sqliteBeginWriteOperation(pParse, 0); addr = sqliteVdbeAddOpList(v, ArraySize(insertTrig), insertTrig); sqliteVdbeChangeP3(v, addr+3, nt->name, 0); @@ -175,6 +177,7 @@ trigger_cleanup: */ TriggerStep *sqliteTriggerSelectStep(Select *pSelect){ TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep)); + if( pTriggerStep==0 ) return 0; pTriggerStep->op = TK_SELECT; pTriggerStep->pSelect = pSelect; @@ -198,6 +201,7 @@ TriggerStep *sqliteTriggerInsertStep( int orconf /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */ ){ TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep)); + if( pTriggerStep==0 ) return 0; assert(pEList == 0 || pSelect == 0); assert(pEList != 0 || pSelect != 0); @@ -224,6 +228,7 @@ TriggerStep *sqliteTriggerUpdateStep( int orconf /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */ ){ TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep)); + if( pTriggerStep==0 ) return 0; pTriggerStep->op = TK_UPDATE; pTriggerStep->target = *pTableName; @@ -240,7 +245,8 @@ TriggerStep *sqliteTriggerUpdateStep( ** sees a DELETE statement inside the body of a CREATE TRIGGER. */ TriggerStep *sqliteTriggerDeleteStep(Token *pTableName, Expr *pWhere){ - TriggerStep * pTriggerStep = sqliteMalloc(sizeof(TriggerStep)); + TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep)); + if( pTriggerStep==0 ) return 0; pTriggerStep->op = TK_DELETE; pTriggerStep->target = *pTableName; @@ -563,7 +569,7 @@ int sqliteCodeRowTrigger( } } - if( fire_this ){ + if( fire_this && (pTriggerStack = sqliteMalloc(sizeof(TriggerStack)))!=0 ){ int endTrigger; IdList dummyTablist; Expr * whenExpr; @@ -572,7 +578,6 @@ int sqliteCodeRowTrigger( dummyTablist.a = 0; /* Push an entry on to the trigger stack */ - pTriggerStack = sqliteMalloc(sizeof(TriggerStack)); pTriggerStack->pTrigger = pTrigger; pTriggerStack->newIdx = newIdx; pTriggerStack->oldIdx = oldIdx; diff --git a/src/vdbe.c b/src/vdbe.c index 96ca65d9c..399369d99 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -30,7 +30,7 @@ ** But other routines are also provided to help in building up ** a program instruction by instruction. ** -** $Id: vdbe.c,v 1.144 2002/05/19 23:43:14 danielk1977 Exp $ +** $Id: vdbe.c,v 1.145 2002/05/23 02:09:04 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> @@ -967,9 +967,11 @@ static void Cleanup(Vdbe *p){ sqliteFree(p->azColName); p->azColName = 0; closeAllCursors(p); - for(i=0; i<p->nMem; i++){ - if( p->aMem[i].s.flags & STK_Dyn ){ - sqliteFree(p->aMem[i].z); + if( p->aMem ){ + for(i=0; i<p->nMem; i++){ + if( p->aMem[i].s.flags & STK_Dyn ){ + sqliteFree(p->aMem[i].z); + } } } sqliteFree(p->aMem); @@ -995,13 +997,15 @@ static void Cleanup(Vdbe *p){ } p->nLineAlloc = 0; AggReset(&p->agg); - for(i=0; i<p->nSet; i++){ - sqliteHashClear(&p->aSet[i].hash); + if( p->aSet ){ + for(i=0; i<p->nSet; i++){ + sqliteHashClear(&p->aSet[i].hash); + } } sqliteFree(p->aSet); p->aSet = 0; p->nSet = 0; - if( p->keylistStackDepth > 0 ){ + if( p->keylistStack ){ int ii; for(ii = 0; ii < p->keylistStackDepth; ii++){ KeylistFree(p->keylistStack[ii]); |