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 recoverfault2
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);
39  INSERT INTO t1 VALUES(2, '\012hello\015world\012today\n');
40"
41faultsim_save_and_close
42
43proc my_sql_hook {sql} {
44  lappend ::lSql $sql
45  return 0
46}
47
48do_faultsim_test 1 -faults oom* -prep {
49  catch { db2 close }
50  faultsim_restore_and_reopen
51  set ::lSql [list]
52} -body {
53  set R [sqlite3_recover_init_sql db main my_sql_hook]
54  $R run
55  $R finish
56} -test {
57  faultsim_test_result {0 {}} {1 {}}
58  if {$testrc==0} {
59    sqlite3 db2 ""
60    db2 eval [join $::lSql ";"]
61    compare_dbs db db2
62    db2 close
63  }
64}
65
66ifcapable utf16 {
67  reset_db
68  do_execsql_test 2.0 "
69    PRAGMA encoding='utf-16';
70    CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
71    INSERT INTO t1 VALUES(2, '\012hello\015world\012today\n');
72  "
73  faultsim_save_and_close
74
75  proc my_sql_hook {sql} {
76    lappend ::lSql $sql
77    return 0
78  }
79
80  do_faultsim_test 2 -faults oom-t* -prep {
81    catch { db2 close }
82    faultsim_restore_and_reopen
83    set ::lSql [list]
84  } -body {
85    set R [sqlite3_recover_init_sql db main my_sql_hook]
86    $R run
87    $R finish
88  } -test {
89    faultsim_test_result {0 {}} {1 {}}
90    if {$testrc==0} {
91      sqlite3 db2 ""
92      db2 eval [join $::lSql ";"]
93      compare_dbs db db2
94      db2 close
95    }
96  }
97}
98
99
100
101finish_test
102
103