# 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. # #*********************************************************************** # source [file join [file dirname [info script]] recover_common.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" execsql "PRAGMA auto_vacuum = 0" 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