diff options
author | dan <dan@noemail.net> | 2010-08-12 16:36:34 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2010-08-12 16:36:34 +0000 |
commit | 1879b088bd447dc8fcb50a63dba84e4d462e44f9 (patch) | |
tree | 15e9534fb4b56c7f11f2e53bf80cd02cfad3ff07 /src | |
parent | 5653e4da365d8f27e9f2e91baaee5d6a08ebb279 (diff) | |
download | sqlite-1879b088bd447dc8fcb50a63dba84e4d462e44f9.tar.gz sqlite-1879b088bd447dc8fcb50a63dba84e4d462e44f9.zip |
If an error occurs in PagerSetPagesize(), set the output variable to the unmodified page-size before returning.
FossilOrigin-Name: 02def8f92588b8a45dff3976d1e7f9e3f0359b3b
Diffstat (limited to 'src')
-rw-r--r-- | src/pager.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/pager.c b/src/pager.c index 3a7afd17c..0ad95b123 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3354,6 +3354,8 @@ void sqlite3PagerSetBusyhandler( ** then *pPageSize is set to the old, retained page size before returning. */ int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ + int rc = SQLITE_OK; + /* It is not possible to do a full assert_pager_state() here, as this ** function may be called from within PagerOpen(), before the state ** of the Pager object is internally consistent. @@ -3372,14 +3374,16 @@ int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ ){ char *pNew; /* New temp space */ i64 nByte = 0; + if( pPager->eState>PAGER_OPEN && isOpen(pPager->fd) ){ - int rc = sqlite3OsFileSize(pPager->fd, &nByte); - if( rc!=SQLITE_OK ) return rc; + rc = sqlite3OsFileSize(pPager->fd, &nByte); } - pNew = (char *)sqlite3PageMalloc(pageSize); - if( !pNew ){ - return SQLITE_NOMEM; - }else{ + if( rc==SQLITE_OK ){ + pNew = (char *)sqlite3PageMalloc(pageSize); + if( !pNew ) rc = SQLITE_NOMEM; + } + + if( rc==SQLITE_OK ){ pager_reset(pPager); pPager->dbSize = nByte/pageSize; pPager->pageSize = pageSize; @@ -3390,11 +3394,13 @@ int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ } *pPageSize = pPager->pageSize; - if( nReserve<0 ) nReserve = pPager->nReserve; - assert( nReserve>=0 && nReserve<1000 ); - pPager->nReserve = (i16)nReserve; - pagerReportSize(pPager); - return SQLITE_OK; + if( rc==SQLITE_OK ){ + if( nReserve<0 ) nReserve = pPager->nReserve; + assert( nReserve>=0 && nReserve<1000 ); + pPager->nReserve = (i16)nReserve; + pagerReportSize(pPager); + } + return rc; } /* |