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
This commit is contained in:
parent
1435ccd52b
commit
f2a79f2248
16
manifest
16
manifest
@ -1,5 +1,5 @@
|
||||
C Modify\slock.test\sto\saccount\sfor\s"PRAGMA\slock_status"\sreturning\s"unknown"\sfor\sin-memory\sdatabases.\s(CVS\s6287)
|
||||
D 2009-02-12T09:36:16
|
||||
C Fix\ssome\sedge\scases\swith\sbacking\sup\sdatabases\sthat\sare\sexactly\sPENDING_BYTE\sbytes\sin\ssize,\sor\sjust\sslightly\slarger.\s(CVS\s6288)
|
||||
D 2009-02-12T17:01:50
|
||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||
F Makefile.in c7a5a30fb6852bd7839b1024e1661da8549878ee
|
||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||
@ -101,7 +101,7 @@ F src/alter.c 0ec29744c36c6e976596ce38c16289ebc5dc94db
|
||||
F src/analyze.c c86fd6a1425b22b3a46ce72ad403e4280026364f
|
||||
F src/attach.c 81d37d1948f409146a7b22b96998fd90649d1fd3
|
||||
F src/auth.c c8b2ab5c8bad4bd90ed7c294694f48269162c627
|
||||
F src/backup.c 7aff2b795c4a001716c40fff7e3928750e2f6b8f
|
||||
F src/backup.c 0fb3c8d9ba8345c06d8c8fa2bd753babf443e091
|
||||
F src/bitvec.c 44f7059ac1f874d364b34af31b9617e52223ba75
|
||||
F src/btmutex.c 63c5cc4ad5715690767ffcb741e185d7bc35ec1a
|
||||
F src/btree.c 71f30e74389aa7ae51421592dfaf69511152677c
|
||||
@ -143,7 +143,7 @@ F src/os_common.h 24525d8b7bce66c374dfc1810a6c9043f3359b60
|
||||
F src/os_os2.c bed77dc26e3a95ce4a204936b9a1ca6fe612fcc5
|
||||
F src/os_unix.c 4e916cafbf5ec0166213ac62d680ebbe12b8c5a7
|
||||
F src/os_win.c 45cb430884da7e9360a55a0fcd5c2c44c22dd79d
|
||||
F src/pager.c 57665d91e54da810df27176093936bdee02256b9
|
||||
F src/pager.c d8d10a4108d0657b7355a2a9e06a4d6d1dea2b95
|
||||
F src/pager.h 0c9f3520c00d8a3b8e792ca56c9a11b6b02b4b0f
|
||||
F src/parse.y 4f4d16aee0d11f69fec2adb77dac88878043ed8d
|
||||
F src/pcache.c fcf7738c83c4d3e9d45836b2334c8a368cc41274
|
||||
@ -233,7 +233,7 @@ F test/autoinc.test ab549b48b389cabd92967b86c379ec8b31fa6c16
|
||||
F test/autovacuum.test 61260e25744189ff766f61ca3df23c1eeec0060e
|
||||
F test/autovacuum_ioerr2.test 598b0663074d3673a9c1bc9a16e80971313bafe6
|
||||
F test/avtrans.test 1e901d8102706b63534dbd2bdd4d8f16c4082650
|
||||
F test/backup.test 6ab95bf9ff6067f09c37172977f2463972e82fd9
|
||||
F test/backup.test 9542691cb9199b1d27051756377ef12e27404cd5
|
||||
F test/backup2.test 04b84c97b4b5d63b6756592c6d7afe578b52c3cf
|
||||
F test/backup_ioerr.test a9b8084e488154341719833783ac9db321e14284
|
||||
F test/backup_malloc.test 1e063c6d75143d0d6e0ae77971dd690070369387
|
||||
@ -701,7 +701,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
|
||||
F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||
P 315a6692f9a03a470871cce4f74567683546f343
|
||||
R 1abda3a7b35e49a2059fb89335dadc90
|
||||
P 9a6e558ba6fe0b38376a85a6c1e2cea5570ea283
|
||||
R c29b76c7d0882570dd5d4b31c9bb2e6f
|
||||
U danielk1977
|
||||
Z c133c9a064c489558fdd1f698bbbb675
|
||||
Z a3d6d2ad2218627e8108430b2434ce04
|
||||
|
@ -1 +1 @@
|
||||
9a6e558ba6fe0b38376a85a6c1e2cea5570ea283
|
||||
2fc450e8e60248d6111d0b0d2b8f2344f5b89bca
|
10
src/backup.c
10
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))
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -11,7 +11,7 @@
|
||||
# This file implements regression tests for SQLite library. The
|
||||
# focus of this file is testing the sqlite3_backup_XXX API.
|
||||
#
|
||||
# $Id: backup.test,v 1.7 2009/02/11 16:06:19 shane Exp $
|
||||
# $Id: backup.test,v 1.8 2009/02/12 17:01:50 danielk1977 Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@ -320,6 +320,35 @@ foreach nDestPgsz {512 1024 2048 4096} {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
do_test backup-3.$iTest.1 {
|
||||
catch { file delete -force test.db }
|
||||
catch { file delete -force test2.db }
|
||||
sqlite3 db test.db
|
||||
set iTab 1
|
||||
|
||||
db eval { PRAGMA page_size = 512 }
|
||||
while {[file size test.db] <= $::sqlite_pending_byte} {
|
||||
db eval "CREATE TABLE t${iTab}(a, b, c)"
|
||||
incr iTab
|
||||
}
|
||||
|
||||
sqlite3 db2 test2.db
|
||||
db2 eval { PRAGMA page_size = 4096 }
|
||||
while {[file size test2.db] < $::sqlite_pending_byte} {
|
||||
db2 eval "CREATE TABLE t${iTab}(a, b, c)"
|
||||
incr iTab
|
||||
}
|
||||
|
||||
sqlite3_backup B db2 main db main
|
||||
B step -1
|
||||
} {SQLITE_DONE}
|
||||
|
||||
do_test backup-3.$iTest.2 {
|
||||
B finish
|
||||
} {SQLITE_OK}
|
||||
|
||||
#
|
||||
# End of backup-3.* tests.
|
||||
#---------------------------------------------------------------------
|
||||
|
Loading…
x
Reference in New Issue
Block a user