| # 2024 May 15 |
| # |
| # 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] |
| set testprefix recovercorrupt4 |
| |
| database_may_be_corrupt |
| |
| if {[permutation]!="inmemory_journal"} { |
| # This test cannot be run with the inmemory_journal permutation, as it |
| # must open a truncated, corrupt, database file. With the inmemory_journal |
| # permutation, this fails (SQLITE_CORRUPT error) when the [sqlite3] wrapper |
| # executes "PRAGMA journal_mode = memory". |
| do_execsql_test 1.0 { |
| CREATE TABLE rows(indexed INTEGER NOT NULL, unindexed INTEGER NOT NULL, filler BLOB NOT NULL DEFAULT 13); |
| -- CREATE UNIQUE INDEX rows_index ON rows(indexed); |
| INSERT INTO rows(indexed, unindexed, filler) VALUES(1, 1, x'31'); |
| INSERT INTO rows(indexed, unindexed, filler) VALUES(2, 2, x'32'); |
| INSERT INTO rows(indexed, unindexed, filler) VALUES(4, 4, x'34'); |
| INSERT INTO rows(indexed, unindexed, filler) VALUES(8, 8, randomblob(2048)); |
| } |
| |
| db close |
| |
| do_test 1.1 { |
| set sz [expr [file size test.db] - 1024] |
| set fd [open test.db] |
| fconfigure $fd -translation binary |
| |
| set data [read $fd $sz] |
| set fd2 [open test.db2 w] |
| fconfigure $fd2 -translation binary |
| puts -nonewline $fd2 $data |
| close $fd2 |
| set {} {} |
| } {} |
| |
| do_test 1.2 { |
| forcedelete test.db3 |
| sqlite3 db test.db2 |
| set R [sqlite3_recover_init db main test.db3] |
| $R run |
| $R finish |
| } {} |
| |
| do_test 1.3 { |
| sqlite3 db test.db3 |
| execsql { |
| SELECT indexed, unindexed FROM rows |
| } |
| } {1 1 2 2 4 4 8 8} |
| } |
| |
| finish_test |