Index: src/build.c ================================================================== --- src/build.c +++ src/build.c @@ -20,11 +20,11 @@ ** creating ID lists ** BEGIN TRANSACTION ** COMMIT ** ROLLBACK ** -** $Id: build.c,v 1.284 2004/11/19 08:41:34 danielk1977 Exp $ +** $Id: build.c,v 1.285 2004/11/20 18:13:10 drh Exp $ */ #include "sqliteInt.h" #include /* @@ -134,10 +134,13 @@ if( pParse->nErr ) return; assert( pParse->nested<10 ); /* Nesting should only be of limited depth */ va_start(ap, zFormat); zSql = sqlite3VMPrintf(zFormat, ap); va_end(ap); + if( zSql==0 ){ + return; /* A malloc must have failed */ + } pParse->nested++; memcpy(saveBuf, &pParse->nVar, SAVE_SZ); memset(&pParse->nVar, 0, SAVE_SZ); rc = sqlite3RunParser(pParse, zSql, 0); sqliteFree(zSql); @@ -514,21 +517,26 @@ ** "temp" or the name of an attached db). This routine returns the ** index of the named database in db->aDb[], or -1 if the named db ** does not exist. */ int findDb(sqlite3 *db, Token *pName){ - int i; - Db *pDb; - char *zName = sqlite3NameFromToken(pName); - int n = strlen(zName); - for(pDb=db->aDb, i=0; inDb; i++, pDb++){ - if( n==strlen(pDb->zName) && 0==sqlite3StrICmp(pDb->zName, zName) ){ - sqliteFree(zName); - return i; - } - } - sqliteFree(zName); + int i; /* Database number */ + int n; /* Number of characters in the name */ + Db *pDb; /* A database whose name space is being searched */ + char *zName; /* Name we are searching for */ + + zName = sqlite3NameFromToken(pName); + if( zName ){ + n = strlen(zName); + for(pDb=db->aDb, i=0; inDb; i++, pDb++){ + if( n==strlen(pDb->zName) && 0==sqlite3StrICmp(pDb->zName, zName) ){ + sqliteFree(zName); + return i; + } + } + sqliteFree(zName); + } return -1; } /* The table or view or trigger name is passed to this routine via tokens ** pName1 and pName2. If the table name was fully qualified, for example: Index: src/expr.c ================================================================== --- src/expr.c +++ src/expr.c @@ -10,11 +10,11 @@ ** ************************************************************************* ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** -** $Id: expr.c,v 1.170 2004/11/12 03:56:15 drh Exp $ +** $Id: expr.c,v 1.171 2004/11/20 18:13:10 drh Exp $ */ #include "sqliteInt.h" #include /* @@ -218,10 +218,13 @@ if( pParse->nested==0 ){ sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", pToken); return 0; } p = sqlite3Expr(TK_REGISTER, 0, 0, pToken); + if( p==0 ){ + return 0; /* Malloc failed */ + } depth = atoi(&pToken->z[1]); if( depth>=0 ){ p->iTable = pParse->nMem++; sqlite3VdbeAddOp(v, OP_Dup, depth, 0); sqlite3VdbeAddOp(v, OP_MemStore, p->iTable, 1);