1# 2022 August 28 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# 12 13source [file join [file dirname [info script]] recover_common.tcl] 14set testprefix recoverfault 15 16 17#-------------------------------------------------------------------------- 18proc compare_result {db1 db2 sql} { 19 set r1 [$db1 eval $sql] 20 set r2 [$db2 eval $sql] 21 if {$r1 != $r2} { 22 puts "r1: $r1" 23 puts "r2: $r2" 24 error "mismatch for $sql" 25 } 26 return "" 27} 28 29proc compare_dbs {db1 db2} { 30 compare_result $db1 $db2 "SELECT sql FROM sqlite_master ORDER BY 1" 31 foreach tbl [$db1 eval {SELECT name FROM sqlite_master WHERE type='table'}] { 32 compare_result $db1 $db2 "SELECT * FROM $tbl" 33 } 34} 35#-------------------------------------------------------------------------- 36 37do_execsql_test 1.0 { 38 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); 39 INSERT INTO t1 VALUES(1, 2, 3); 40 INSERT INTO t1 VALUES(2, hex(randomblob(1000)), randomblob(2000)); 41 CREATE INDEX i1 ON t1(b, c); 42 ANALYZE; 43} 44faultsim_save_and_close 45 46do_faultsim_test 1 -faults oom* -prep { 47 catch { db2 close } 48 faultsim_restore_and_reopen 49} -body { 50 set R [sqlite3_recover_init db main test.db2] 51 $R run 52 $R finish 53} -test { 54 faultsim_test_result {0 {}} {1 {}} 55 if {$testrc==0} { 56 sqlite3 db2 test.db2 57 compare_dbs db db2 58 db2 close 59 } 60} 61 62faultsim_restore_and_reopen 63do_execsql_test 2.0 { 64 CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c); 65 INSERT INTO t2 VALUES(1, 2, 3); 66 INSERT INTO t2 VALUES(2, hex(randomblob(1000)), hex(randomblob(2000))); 67 PRAGMA writable_schema = 1; 68 DELETE FROM sqlite_schema WHERE name='t2'; 69} 70faultsim_save_and_close 71 72do_faultsim_test 2 -faults oom* -prep { 73 faultsim_restore_and_reopen 74} -body { 75 set R [sqlite3_recover_init db main test.db2] 76 $R config lostandfound lost_and_found 77 $R run 78 $R finish 79} -test { 80 faultsim_test_result {0 {}} {1 {}} 81} 82 83finish_test 84 85