gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/recover.test (about) 1 # 2019 April 23 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 # Test the shell tool ".ar" command. 13 # 14 15 set testdir [file dirname $argv0] 16 source $testdir/tester.tcl 17 set testprefix recover 18 19 ifcapable !vtab { 20 finish_test; return 21 } 22 set CLI [test_find_cli] 23 24 proc compare_result {db1 db2 sql} { 25 set r1 [$db1 eval $sql] 26 set r2 [$db2 eval $sql] 27 if {$r1 != $r2} { 28 puts "r1: $r1" 29 puts "r2: $r2" 30 error "mismatch for $sql" 31 } 32 return "" 33 } 34 35 proc compare_dbs {db1 db2} { 36 compare_result $db1 $db2 "SELECT sql FROM sqlite_master ORDER BY 1" 37 foreach tbl [$db1 eval {SELECT name FROM sqlite_master WHERE type='table'}] { 38 compare_result $db1 $db2 "SELECT * FROM $tbl" 39 } 40 } 41 42 proc do_recover_test {tn {tsql {}} {res {}}} { 43 set fd [open "|$::CLI test.db .recover"] 44 fconfigure $fd -encoding binary 45 fconfigure $fd -translation binary 46 set sql [read $fd] 47 close $fd 48 49 forcedelete test.db2 50 sqlite3 db2 test.db2 51 execsql $sql db2 52 if {$tsql==""} { 53 uplevel [list do_test $tn [list compare_dbs db db2] {}] 54 } else { 55 uplevel [list do_execsql_test -db db2 $tn $tsql $res] 56 } 57 db2 close 58 } 59 60 set doc { 61 hello 62 world 63 } 64 do_execsql_test 1.1.1 { 65 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); 66 INSERT INTO t1 VALUES(1, 4, X'1234567800'); 67 INSERT INTO t1 VALUES(2, 'test', 8.1); 68 INSERT INTO t1 VALUES(3, $doc, 8.4); 69 } 70 do_recover_test 1.1.2 71 72 do_execsql_test 1.2.1 " 73 DELETE FROM t1; 74 INSERT INTO t1 VALUES(13, 'hello\r\nworld', 13); 75 " 76 do_recover_test 1.2.2 77 78 do_execsql_test 1.3.1 " 79 CREATE TABLE t2(i INTEGER PRIMARY KEY AUTOINCREMENT, b, c); 80 INSERT INTO t2 VALUES(NULL, 1, 2); 81 INSERT INTO t2 VALUES(NULL, 3, 4); 82 INSERT INTO t2 VALUES(NULL, 5, 6); 83 CREATE TABLE t3(i INTEGER PRIMARY KEY AUTOINCREMENT, b, c); 84 INSERT INTO t3 VALUES(NULL, 1, 2); 85 INSERT INTO t3 VALUES(NULL, 3, 4); 86 INSERT INTO t3 VALUES(NULL, 5, 6); 87 DELETE FROM t2; 88 " 89 do_recover_test 1.3.2 90 91 #------------------------------------------------------------------------- 92 reset_db 93 do_execsql_test 2.1.0 { 94 PRAGMA auto_vacuum = 0; 95 CREATE TABLE t1(a, b, c, PRIMARY KEY(b, c)) WITHOUT ROWID; 96 INSERT INTO t1 VALUES(1, 2, 3); 97 INSERT INTO t1 VALUES(4, 5, 6); 98 INSERT INTO t1 VALUES(7, 8, 9); 99 } 100 101 do_recover_test 2.1.1 102 103 do_execsql_test 2.2.0 { 104 PRAGMA writable_schema = 1; 105 DELETE FROM sqlite_master WHERE name='t1'; 106 } 107 do_recover_test 2.2.1 { 108 SELECT name FROM sqlite_master 109 } {lost_and_found} 110 111 do_execsql_test 2.3.0 { 112 CREATE TABLE lost_and_found(a, b, c); 113 } 114 do_recover_test 2.3.1 { 115 SELECT name FROM sqlite_master 116 } {lost_and_found lost_and_found_0} 117 118 do_execsql_test 2.4.0 { 119 CREATE TABLE lost_and_found_0(a, b, c); 120 } 121 do_recover_test 2.4.1 { 122 SELECT name FROM sqlite_master; 123 SELECT * FROM lost_and_found_1; 124 } {lost_and_found lost_and_found_0 lost_and_found_1 125 2 2 3 {} 2 3 1 126 2 2 3 {} 5 6 4 127 2 2 3 {} 8 9 7 128 } 129 130 #------------------------------------------------------------------------- 131 reset_db 132 do_recover_test 3.0 133 134 finish_test