aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/expr.c4
-rw-r--r--src/main.c9
-rw-r--r--src/trigger.c17
-rw-r--r--src/vdbe.c18
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]);