mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Add tests for detecting page size of databases.
FossilOrigin-Name: 31f9e2369fcf59032b7c4c9f5bfc85e7ef7c174003b0b9e2757dad5a4c79b370
This commit is contained in:
103
ext/recover/recoverpgsz.test
Normal file
103
ext/recover/recoverpgsz.test
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
# 2022 October 14
|
||||||
|
#
|
||||||
|
# The author disclaims copyright to this source code. In place of
|
||||||
|
# a legal notice, here is a blessing:
|
||||||
|
#
|
||||||
|
# May you do good and not evil.
|
||||||
|
# May you find forgiveness for yourself and forgive others.
|
||||||
|
# May you share freely, never taking more than you give.
|
||||||
|
#
|
||||||
|
#***********************************************************************
|
||||||
|
#
|
||||||
|
|
||||||
|
if {![info exists testdir]} {
|
||||||
|
set testdir [file join [file dirname [info script]] .. .. test]
|
||||||
|
}
|
||||||
|
source [file join [file dirname [info script]] recover_common.tcl]
|
||||||
|
source $testdir/tester.tcl
|
||||||
|
|
||||||
|
db close
|
||||||
|
sqlite3_test_control_pending_byte 0x1000000
|
||||||
|
|
||||||
|
set testprefix recoverpgsz
|
||||||
|
|
||||||
|
foreach {pgsz bOverflow} {
|
||||||
|
512 0 1024 0 2048 0 4096 0 8192 0 16384 0 32768 0 65536 0
|
||||||
|
512 1 1024 1 2048 1 4096 1 8192 1 16384 1 32768 1 65536 1
|
||||||
|
} {
|
||||||
|
reset_db
|
||||||
|
execsql "PRAGMA page_size = $pgsz"
|
||||||
|
do_execsql_test 1.$pgsz.$bOverflow.1 {
|
||||||
|
CREATE TABLE t1(a, b, c);
|
||||||
|
CREATE INDEX i1 ON t1(b, a, c);
|
||||||
|
INSERT INTO t1(a, b) VALUES(1, 2), (3, 4), (5, 6);
|
||||||
|
DELETE FROM t1 WHERE a=3;
|
||||||
|
}
|
||||||
|
if {$bOverflow} {
|
||||||
|
do_execsql_test 1.$pgsz.$bOverflow.1a {
|
||||||
|
UPDATE t1 SET c = randomblob(100000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
db close
|
||||||
|
|
||||||
|
|
||||||
|
set fd [open test.db]
|
||||||
|
fconfigure $fd -encoding binary -translation binary
|
||||||
|
seek $fd $pgsz
|
||||||
|
set pg1 [read $fd $pgsz]
|
||||||
|
set pg2 [read $fd $pgsz]
|
||||||
|
close $fd
|
||||||
|
|
||||||
|
set fd2 [open test.db2 w]
|
||||||
|
fconfigure $fd2 -encoding binary -translation binary
|
||||||
|
seek $fd2 $pgsz
|
||||||
|
puts -nonewline $fd2 $pg1
|
||||||
|
close $fd2
|
||||||
|
|
||||||
|
sqlite3 db2 test.db2
|
||||||
|
do_test 1.$pgsz.$bOverflow.2 {
|
||||||
|
set R [sqlite3_recover_init db2 main test.db3]
|
||||||
|
$R run
|
||||||
|
$R finish
|
||||||
|
} {}
|
||||||
|
|
||||||
|
sqlite3 db3 test.db3
|
||||||
|
do_test 1.$pgsz.$bOverflow.3 {
|
||||||
|
db3 eval { SELECT * FROM sqlite_schema }
|
||||||
|
db3 eval { PRAGMA page_size }
|
||||||
|
} $pgsz
|
||||||
|
|
||||||
|
db2 close
|
||||||
|
db3 close
|
||||||
|
|
||||||
|
forcedelete test.db3
|
||||||
|
forcedelete test.db2
|
||||||
|
|
||||||
|
set fd2 [open test.db2 w]
|
||||||
|
fconfigure $fd2 -encoding binary -translation binary
|
||||||
|
seek $fd2 $pgsz
|
||||||
|
puts -nonewline $fd2 $pg2
|
||||||
|
close $fd2
|
||||||
|
|
||||||
|
sqlite3 db2 test.db2
|
||||||
|
do_test 1.$pgsz.$bOverflow.4 {
|
||||||
|
set R [sqlite3_recover_init db2 main test.db3]
|
||||||
|
$R run
|
||||||
|
$R finish
|
||||||
|
} {}
|
||||||
|
|
||||||
|
sqlite3 db3 test.db3
|
||||||
|
do_test 1.$pgsz.$bOverflow.5 {
|
||||||
|
db3 eval { SELECT * FROM sqlite_schema }
|
||||||
|
db3 eval { PRAGMA page_size }
|
||||||
|
} $pgsz
|
||||||
|
|
||||||
|
db2 close
|
||||||
|
db3 close
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
finish_test
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -193,6 +193,7 @@ struct sqlite3_recover {
|
|||||||
int bSlowIndexes; /* SQLITE_RECOVER_SLOWINDEXES setting */
|
int bSlowIndexes; /* SQLITE_RECOVER_SLOWINDEXES setting */
|
||||||
|
|
||||||
int pgsz;
|
int pgsz;
|
||||||
|
int detected_pgsz;
|
||||||
u8 *pPage1Disk;
|
u8 *pPage1Disk;
|
||||||
u8 *pPage1Cache;
|
u8 *pPage1Cache;
|
||||||
|
|
||||||
@ -1980,7 +1981,7 @@ static int recoverIsValidPage(u8 *aTmp, const u8 *a, int n){
|
|||||||
iNext = recoverGetU16(&a[iFree]);
|
iNext = recoverGetU16(&a[iFree]);
|
||||||
nByte = recoverGetU16(&a[iFree+2]);
|
nByte = recoverGetU16(&a[iFree+2]);
|
||||||
if( iFree+nByte>n ) return 0;
|
if( iFree+nByte>n ) return 0;
|
||||||
if( iNext<iFree+nByte ) return 0;
|
if( iNext && iNext<iFree+nByte ) return 0;
|
||||||
memset(&aUsed[iFree], 0xFF, nByte);
|
memset(&aUsed[iFree], 0xFF, nByte);
|
||||||
iFree = iNext;
|
iFree = iNext;
|
||||||
}
|
}
|
||||||
@ -2093,7 +2094,11 @@ static void recoverPutU32(u8 *a, u32 v){
|
|||||||
a[3] = (v>>0) & 0x00FF;
|
a[3] = (v>>0) & 0x00FF;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int recoverVfsDetectPagesize(sqlite3_file *pFd, i64 nSz, u32 *pPgsz){
|
static int recoverVfsDetectPagesize(
|
||||||
|
sqlite3_recover *p,
|
||||||
|
sqlite3_file *pFd,
|
||||||
|
i64 nSz
|
||||||
|
){
|
||||||
int rc = SQLITE_OK;
|
int rc = SQLITE_OK;
|
||||||
const int nMin = 512;
|
const int nMin = 512;
|
||||||
const int nMax = 65536;
|
const int nMax = 65536;
|
||||||
@ -2129,7 +2134,7 @@ static int recoverVfsDetectPagesize(sqlite3_file *pFd, i64 nSz, u32 *pPgsz){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*pPgsz = pgsz;
|
p->detected_pgsz = pgsz;
|
||||||
sqlite3_free(aPg);
|
sqlite3_free(aPg);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -2192,12 +2197,12 @@ static int recoverVfsRead(sqlite3_file *pFd, void *aBuf, int nByte, i64 iOff){
|
|||||||
if( pgsz==0x01 ) pgsz = 65536;
|
if( pgsz==0x01 ) pgsz = 65536;
|
||||||
rc = pFd->pMethods->xFileSize(pFd, &dbFileSize);
|
rc = pFd->pMethods->xFileSize(pFd, &dbFileSize);
|
||||||
|
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK && p->detected_pgsz==0 ){
|
||||||
u32 pgsz2 = 0;
|
u32 pgsz2 = 0;
|
||||||
rc = recoverVfsDetectPagesize(pFd, dbFileSize, &pgsz2);
|
rc = recoverVfsDetectPagesize(p, pFd, dbFileSize);
|
||||||
if( pgsz2!=0 ){
|
}
|
||||||
pgsz = pgsz2;
|
if( p->detected_pgsz ){
|
||||||
}
|
pgsz = p->detected_pgsz;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( pgsz ){
|
if( pgsz ){
|
||||||
|
13
manifest
13
manifest
@ -1,5 +1,5 @@
|
|||||||
C Ensure\sthe\spage-size,\sauto-vacuum\sand\sother\ssettings\sare\scopied\sinto\sthe\srecovered\sdatabase.
|
C Add\stests\sfor\sdetecting\spage\ssize\sof\sdatabases.
|
||||||
D 2022-10-06T21:00:23.727
|
D 2022-10-13T20:06:17.168
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@ -394,10 +394,11 @@ F ext/recover/recovercorrupt2.test a131d8005337c092e2dfa3b84909ed67ae82d22399a8c
|
|||||||
F ext/recover/recoverfault.test 3a0a32b9fc216592b97775d69220695b0926980c0f7424b7a59144e47d7cb568
|
F ext/recover/recoverfault.test 3a0a32b9fc216592b97775d69220695b0926980c0f7424b7a59144e47d7cb568
|
||||||
F ext/recover/recoverfault2.test 321036336af23e778a87f148c4cc4407f88fbdab1fd72ddb661669be9020d36b
|
F ext/recover/recoverfault2.test 321036336af23e778a87f148c4cc4407f88fbdab1fd72ddb661669be9020d36b
|
||||||
F ext/recover/recoverold.test 46e9d99b595fac583d4c67f74d7d89c20a435c752ef6eeb3e918b599940c88e0
|
F ext/recover/recoverold.test 46e9d99b595fac583d4c67f74d7d89c20a435c752ef6eeb3e918b599940c88e0
|
||||||
|
F ext/recover/recoverpgsz.test 93e970eab05e4e89f8fd6b1bd23f9ec137ea09857e66ba0d4d27a83cd1ba4a89
|
||||||
F ext/recover/recoverrowid.test 1694a1a5526d825f71279f3d02ab02a1ee4c5265de18858bf54cb8ec54487ac8
|
F ext/recover/recoverrowid.test 1694a1a5526d825f71279f3d02ab02a1ee4c5265de18858bf54cb8ec54487ac8
|
||||||
F ext/recover/recoverslowidx.test f356bb9fba7ffd6fc50e045e419464f0129ac6e24decf6e919584f79c3493727
|
F ext/recover/recoverslowidx.test f356bb9fba7ffd6fc50e045e419464f0129ac6e24decf6e919584f79c3493727
|
||||||
F ext/recover/recoversql.test f9872ff2114e13ffd8ee31e1de06919f62b9b48bc080191b5bd076d10becb60f
|
F ext/recover/recoversql.test f9872ff2114e13ffd8ee31e1de06919f62b9b48bc080191b5bd076d10becb60f
|
||||||
F ext/recover/sqlite3recover.c dcd00bbb95150b3d2a1ae75abd194fa863e4ed86971a3589da226c716fb5a6c0
|
F ext/recover/sqlite3recover.c 2e9244bcc552f84bb60ea67060b793af2eb050bcbb9c8caed13510308e2039fb
|
||||||
F ext/recover/sqlite3recover.h f698ccc94bd4da38761035415ad08c4549a408491ff9fd5f52d34d2214f64e36
|
F ext/recover/sqlite3recover.h f698ccc94bd4da38761035415ad08c4549a408491ff9fd5f52d34d2214f64e36
|
||||||
F ext/recover/test_recover.c 61ec931e47abca6b2210f46239cafd9f3060741605e3d3c45a7c7a53f63dd957
|
F ext/recover/test_recover.c 61ec931e47abca6b2210f46239cafd9f3060741605e3d3c45a7c7a53f63dd957
|
||||||
F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15
|
F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15
|
||||||
@ -2014,8 +2015,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P 0dbd0ccef532e076fa82c9fad4dc9fe632c0ef43e3483cc288cbb7eca336a9b9
|
P 078520f2825bcb82d01b30209409e9bf8b6c99084c192345df41c9f531d08f51
|
||||||
R c47f69833d79cdde413f6662a615cd06
|
R c9070f986a9313d4a9d177b6562a0478
|
||||||
U dan
|
U dan
|
||||||
Z b397112aade8ffe2182cfeaa2f331f80
|
Z 7bf274fb579b6c3146f808450c95f374
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@ -1 +1 @@
|
|||||||
078520f2825bcb82d01b30209409e9bf8b6c99084c192345df41c9f531d08f51
|
31f9e2369fcf59032b7c4c9f5bfc85e7ef7c174003b0b9e2757dad5a4c79b370
|
Reference in New Issue
Block a user