aboutsummaryrefslogtreecommitdiff
path: root/src/test_stat.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/test_stat.c')
-rw-r--r--src/test_stat.c114
1 files changed, 66 insertions, 48 deletions
diff --git a/src/test_stat.c b/src/test_stat.c
index daa84de2c..ff107ac79 100644
--- a/src/test_stat.c
+++ b/src/test_stat.c
@@ -140,15 +140,23 @@ static int statConnect(
sqlite3_vtab **ppVtab,
char **pzErr
){
- StatTable *pTab;
+ StatTable *pTab = 0;
+ int rc = SQLITE_OK;
- pTab = (StatTable *)sqlite3_malloc(sizeof(StatTable));
- memset(pTab, 0, sizeof(StatTable));
- pTab->db = db;
+ rc = sqlite3_declare_vtab(db, VTAB_SCHEMA);
+ if( rc==SQLITE_OK ){
+ pTab = (StatTable *)sqlite3_malloc(sizeof(StatTable));
+ if( pTab==0 ) rc = SQLITE_NOMEM;
+ }
- sqlite3_declare_vtab(db, VTAB_SCHEMA);
- *ppVtab = &pTab->base;
- return SQLITE_OK;
+ assert( rc==SQLITE_OK || pTab==0 );
+ if( rc==SQLITE_OK ){
+ memset(pTab, 0, sizeof(StatTable));
+ pTab->db = db;
+ }
+
+ *ppVtab = (sqlite3_vtab*)pTab;
+ return rc;
}
/*
@@ -196,32 +204,38 @@ static int statOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
int rc;
pCsr = (StatCursor *)sqlite3_malloc(sizeof(StatCursor));
- memset(pCsr, 0, sizeof(StatCursor));
- pCsr->base.pVtab = pVTab;
-
- rc = sqlite3_prepare_v2(pTab->db,
- "SELECT 'sqlite_master' AS name, 1 AS rootpage, 'table' AS type"
- " UNION ALL "
- "SELECT name, rootpage, type FROM sqlite_master WHERE rootpage!=0"
- " ORDER BY name", -1,
- &pCsr->pStmt, 0
- );
- if( rc!=SQLITE_OK ){
- sqlite3_free(pCsr);
- return rc;
+ if( pCsr==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ memset(pCsr, 0, sizeof(StatCursor));
+ pCsr->base.pVtab = pVTab;
+
+ rc = sqlite3_prepare_v2(pTab->db,
+ "SELECT 'sqlite_master' AS name, 1 AS rootpage, 'table' AS type"
+ " UNION ALL "
+ "SELECT name, rootpage, type FROM sqlite_master WHERE rootpage!=0"
+ " ORDER BY name", -1,
+ &pCsr->pStmt, 0
+ );
+ if( rc!=SQLITE_OK ){
+ sqlite3_free(pCsr);
+ pCsr = 0;
+ }
}
*ppCursor = (sqlite3_vtab_cursor *)pCsr;
- return SQLITE_OK;
+ return rc;
}
static void statClearPage(StatPage *p){
int i;
- for(i=0; i<p->nCell; i++){
- sqlite3_free(p->aCell[i].aOvfl);
+ if( p->aCell ){
+ for(i=0; i<p->nCell; i++){
+ sqlite3_free(p->aCell[i].aOvfl);
+ }
+ sqlite3_free(p->aCell);
}
sqlite3PagerUnref(p->pPg);
- sqlite3_free(p->aCell);
sqlite3_free(p->zPath);
memset(p, 0, sizeof(StatPage));
}
@@ -307,6 +321,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){
nUsable = szPage - sqlite3BtreeGetReserveNoMutex(pBt);
sqlite3BtreeLeave(pBt);
p->aCell = sqlite3_malloc((p->nCell+1) * sizeof(StatCell));
+ if( p->aCell==0 ) return SQLITE_NOMEM;
memset(p->aCell, 0, (p->nCell+1) * sizeof(StatCell));
for(i=0; i<p->nCell; i++){
@@ -339,6 +354,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){
pCell->nLastOvfl = (nPayload-nLocal) - (nOvfl-1) * (nUsable-4);
pCell->nOvfl = nOvfl;
pCell->aOvfl = sqlite3_malloc(sizeof(u32)*nOvfl);
+ if( pCell->aOvfl==0 ) return SQLITE_NOMEM;
pCell->aOvfl[0] = sqlite3Get4byte(&aData[iOff+nLocal]);
for(j=1; j<nOvfl; j++){
int rc;
@@ -486,31 +502,33 @@ statNextRestart:
pCsr->zName = (char *)sqlite3_column_text(pCsr->pStmt, 0);
pCsr->iPageno = p->iPgno;
- statDecodePage(pBt, p);
- statSizeAndOffset(pCsr);
-
- switch( p->flags ){
- case 0x05: /* table internal */
- case 0x02: /* index internal */
- pCsr->zPagetype = "internal";
- break;
- case 0x0D: /* table leaf */
- case 0x0A: /* index leaf */
- pCsr->zPagetype = "leaf";
- break;
- default:
- pCsr->zPagetype = "corrupted";
- break;
- }
- pCsr->nCell = p->nCell;
- pCsr->nUnused = p->nUnused;
- pCsr->nMxPayload = p->nMxPayload;
- pCsr->zPath = sqlite3_mprintf("%s", p->zPath);
- nPayload = 0;
- for(i=0; i<p->nCell; i++){
- nPayload += p->aCell[i].nLocal;
+ rc = statDecodePage(pBt, p);
+ if( rc==SQLITE_OK ){
+ statSizeAndOffset(pCsr);
+
+ switch( p->flags ){
+ case 0x05: /* table internal */
+ case 0x02: /* index internal */
+ pCsr->zPagetype = "internal";
+ break;
+ case 0x0D: /* table leaf */
+ case 0x0A: /* index leaf */
+ pCsr->zPagetype = "leaf";
+ break;
+ default:
+ pCsr->zPagetype = "corrupted";
+ break;
+ }
+ pCsr->nCell = p->nCell;
+ pCsr->nUnused = p->nUnused;
+ pCsr->nMxPayload = p->nMxPayload;
+ pCsr->zPath = sqlite3_mprintf("%s", p->zPath);
+ nPayload = 0;
+ for(i=0; i<p->nCell; i++){
+ nPayload += p->aCell[i].nLocal;
+ }
+ pCsr->nPayload = nPayload;
}
- pCsr->nPayload = nPayload;
}
return rc;