aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordanielk1977 <danielk1977@noemail.net>2009-02-12 17:01:49 +0000
committerdanielk1977 <danielk1977@noemail.net>2009-02-12 17:01:49 +0000
commitf2a79f2248e18d9c28a18ff509b8b9a10f2c3d37 (patch)
tree5604a5a19eef9cef63e033371cb7c01e6f873ff9 /src
parent1435ccd52baed46a3c796160b15275a81f3e571a (diff)
downloadsqlite-f2a79f2248e18d9c28a18ff509b8b9a10f2c3d37.tar.gz
sqlite-f2a79f2248e18d9c28a18ff509b8b9a10f2c3d37.zip
Fix some edge cases with backing up databases that are exactly PENDING_BYTE bytes in size, or just slightly larger. (CVS 6288)
FossilOrigin-Name: 2fc450e8e60248d6111d0b0d2b8f2344f5b89bca
Diffstat (limited to 'src')
-rw-r--r--src/backup.c10
-rw-r--r--src/pager.c5
2 files changed, 9 insertions, 6 deletions
diff --git a/src/backup.c b/src/backup.c
index cda0263a3..aef1fd4b2 100644
--- a/src/backup.c
+++ b/src/backup.c
@@ -12,7 +12,7 @@
** This file contains the implementation of the sqlite3_backup_XXX()
** API functions and the related features.
**
-** $Id: backup.c,v 1.9 2009/02/09 18:55:46 danielk1977 Exp $
+** $Id: backup.c,v 1.10 2009/02/12 17:01:50 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "btreeInt.h"
@@ -373,6 +373,9 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){
if( nSrcPagesize<nDestPagesize ){
int ratio = nDestPagesize/nSrcPagesize;
nDestTruncate = (nSrcPage+ratio-1)/ratio;
+ if( nDestTruncate==PENDING_BYTE_PAGE(p->pDest->pBt) ){
+ nDestTruncate--;
+ }
}else{
nDestTruncate = nSrcPage * (nSrcPagesize/nDestPagesize);
}
@@ -392,7 +395,10 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){
sqlite3_file * const pFile = sqlite3PagerFile(pDestPager);
assert( pFile );
- assert( (i64)nDestTruncate*(i64)nDestPagesize >= iSize );
+ assert( (i64)nDestTruncate*(i64)nDestPagesize >= iSize || (
+ nDestTruncate==(PENDING_BYTE_PAGE(p->pDest->pBt)-1)
+ && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+nDestPagesize
+ ));
if( SQLITE_OK==(rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1))
&& SQLITE_OK==(rc = backupTruncateFile(pFile, iSize))
&& SQLITE_OK==(rc = sqlite3PagerSync(pDestPager))
diff --git a/src/pager.c b/src/pager.c
index 3376470fc..5125842ef 100644
--- a/src/pager.c
+++ b/src/pager.c
@@ -18,7 +18,7 @@
** file simultaneously, or one process from reading the database while
** another is writing.
**
-** @(#) $Id: pager.c,v 1.567 2009/02/12 09:11:56 danielk1977 Exp $
+** @(#) $Id: pager.c,v 1.568 2009/02/12 17:01:50 danielk1977 Exp $
*/
#ifndef SQLITE_OMIT_DISKIO
#include "sqliteInt.h"
@@ -4176,9 +4176,6 @@ static int pager_write(PgHdr *pPg){
assert( pPager->state>=PAGER_SHARED );
if( pPager->dbSize<pPg->pgno ){
pPager->dbSize = pPg->pgno;
- if( pPager->dbSize==(PAGER_MJ_PGNO(pPager)-1) ){
- pPager->dbSize++;
- }
}
return rc;
}