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 recovercorrupt2 15 16do_execsql_test 1.0 { 17 PRAGMA page_size = 512; 18 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); 19 INSERT INTO t1 VALUES(1, 2, 3); 20 INSERT INTO t1 VALUES(2, hex(randomblob(100)), randomblob(200)); 21 CREATE INDEX i1 ON t1(b, c); 22 CREATE TABLE t2(a PRIMARY KEY, b, c) WITHOUT ROWID; 23 INSERT INTO t2 VALUES(1, 2, 3); 24 INSERT INTO t2 VALUES(2, hex(randomblob(100)), randomblob(200)); 25 ANALYZE; 26 PRAGMA writable_schema = 1; 27 UPDATE sqlite_schema SET sql = 'CREATE INDEX i1 ON o(world)' WHERE name='i1'; 28 DELETE FROM sqlite_schema WHERE name='sqlite_stat4'; 29} 30 31do_test 1.1 { 32 set R [sqlite3_recover_init db main test.db2] 33 $R run 34 $R finish 35} {} 36 37sqlite3 db2 test.db2 38do_execsql_test -db db2 1.2 { 39 SELECT sql FROM sqlite_schema 40} { 41 {CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c)} 42 {CREATE TABLE t2(a PRIMARY KEY, b, c) WITHOUT ROWID} 43 {CREATE TABLE sqlite_stat1(tbl,idx,stat)} 44} 45db2 close 46 47do_execsql_test 1.3 { 48 PRAGMA writable_schema = 1; 49 UPDATE sqlite_schema SET sql = 'CREATE TABLE t2 syntax error!' WHERE name='t2'; 50} 51 52do_test 1.4 { 53 set R [sqlite3_recover_init db main test.db2] 54 $R run 55 $R finish 56} {} 57 58sqlite3 db2 test.db2 59do_execsql_test -db db2 1.5 { 60 SELECT sql FROM sqlite_schema 61} { 62 {CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c)} 63 {CREATE TABLE sqlite_stat1(tbl,idx,stat)} 64} 65db2 close 66 67#------------------------------------------------------------------------- 68# 69reset_db 70do_test 2.0 { 71 sqlite3 db {} 72 db deserialize [decode_hexdb { 73| size 8192 pagesize 4096 filename x3.db 74| page 1 offset 0 75| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. 76| 16: 10 00 01 01 00 40 20 20 00 00 00 02 00 00 00 02 .....@ ........ 77| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 ................ 78| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ 79| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 ................ 80| 96: 00 2e 63 00 0d 00 00 00 01 0f d8 00 0f d8 00 00 ..c............. 81| 4048: 00 00 00 00 00 00 00 00 26 01 06 17 11 11 01 39 ........&......9 82| 4064: 74 61 62 6c 65 74 31 74 31 02 43 52 45 41 54 45 tablet1t1.CREATE 83| 4080: 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 29 TABLE t1(a,b,c) 84| page 2 offset 4096 85| 0: 0d 00 00 00 01 0f ce 00 0f ce 00 00 00 00 00 00 ................ 86| 4032: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ..............(. 87| 4048: ff ff ff ff ff ff ff 28 04 27 25 23 61 61 61 61 .........'%#aaaa 88| 4064: 61 61 61 61 61 61 61 61 61 62 62 62 62 62 62 62 aaaaaaaaabbbbbbb 89| 4080: 62 62 62 62 62 63 63 63 63 63 63 63 63 63 63 63 bbbbbccccccccccc 90| end x3.db 91}]} {} 92 93do_test 2.1 { 94 set R [sqlite3_recover_init db main test.db2] 95 $R run 96 $R finish 97} {} 98 99sqlite3 db2 test.db2 100do_execsql_test -db db2 2.2 { 101 SELECT sql FROM sqlite_schema 102} { 103 {CREATE TABLE t1(a,b,c)} 104} 105do_execsql_test -db db2 2.3 { 106 SELECT * FROM t1 107} {} 108db2 close 109 110#------------------------------------------------------------------------- 111# 112reset_db 113do_test 3.0 { 114 sqlite3 db {} 115 db deserialize [decode_hexdb { 116 .open --hexdb 117 | size 4096 pagesize 1024 filename corrupt032.txt.db 118 | page 1 offset 0 119 | 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. 120 | 16: 04 00 01 01 08 40 20 20 00 00 00 02 00 00 00 03 .....@ ........ 121 | 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 ................ 122 | 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ 123 | 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 ................ 124 | 96: 00 2e 24 80 0d 00 00 00 01 03 d4 00 03 d4 00 00 ..$............. 125 | 976: 00 00 00 00 22 01 06 17 11 11 01 31 74 61 62 6c ...........1tabl 126 | 992: 65 74 31 74 31 02 43 52 45 41 54 45 20 54 41 42 et1t1.CREATE TAB 127 | 1008: 4c 45 20 74 31 28 78 29 00 00 00 00 00 00 00 00 LE t1(x)........ 128 | page 2 offset 1024 129 | 0: 0d 00 00 00 01 02 06 00 02 06 00 00 00 00 00 00 ................ 130 | 512: 00 00 00 00 00 00 8b 60 01 03 97 46 00 00 00 00 .......`...F.... 131 | 1008: 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 ................ 132 | end corrupt032.txt.db 133}]} {} 134 135do_test 3.1 { 136 set R [sqlite3_recover_init db main test.db2] 137 $R run 138 $R finish 139} {} 140 141#------------------------------------------------------------------------- 142# 143reset_db 144do_test 4.0 { 145 sqlite3 db {} 146 db deserialize [decode_hexdb { 147 .open --hexdb 148 | size 4096 pagesize 4096 filename crash-00f2d3627f1b43.db 149 | page 1 offset 0 150 | 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. 151 | 16: 00 01 01 02 00 40 20 20 01 00 ff 00 42 01 10 01 .....@ ....B... 152 | 32: ef 00 00 87 00 ff ff ff f0 01 01 10 ff ff 00 00 ................ 153 | end crash-00f2d3627f1b43.db 154}]} {} 155 156do_test 4.1 { 157 set R [sqlite3_recover_init db main test.db2] 158 catch { $R run } 159 list [catch { $R finish } msg] $msg 160} {1 {unable to open database file}} 161 162#------------------------------------------------------------------------- 163# 164reset_db 165do_test 5.0 { 166 sqlite3 db {} 167 db deserialize [decode_hexdb { 168.open --hexdb 169| size 16384 pagesize 4096 filename crash-7b75760a4c5f15.db 170| page 1 offset 0 171| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. 172| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 04 .....@ ........ 173| 32: 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 ................ 174| 96: 00 00 00 00 0d 00 00 00 03 0f 4e 00 0f bc 0f 90 ..........N..... 175| 112: 0f 4e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .N.............. 176| 3904: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 03 ..............@. 177| 3920: 06 17 11 11 01 6d 74 61 62 6c 65 74 32 74 32 04 .....mtablet2t2. 178| 3936: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 CREATE TABLE t2( 179| 3952: 78 2c 79 2c 7a 20 50 52 49 4d 41 52 59 20 4b 45 x,y,z PRIMARY KE 180| 3968: 59 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 Y) WITHOUT ROWID 181| 3984: 2a 02 06 17 13 11 01 3f 69 6e 64 65 78 74 31 61 *......?indext1a 182| 4000: 74 31 03 43 52 45 41 54 45 20 49 4e 44 45 58 20 t1.CREATE INDEX 183| 4016: 74 31 61 20 4f 4e 20 74 31 28 61 29 42 01 06 17 t1a ON t1(a)B... 184| 4032: 11 11 01 71 74 61 62 6c 65 74 31 74 31 02 43 52 ...qtablet1t1.CR 185| 4048: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 EATE TABLE t1(a 186| 4064: 49 4e 54 2c 62 20 54 45 58 54 2c 63 20 42 4c 4f INT,b TEXT,c BLO 187| 4080: 42 2c 64 20 52 45 41 4c 29 20 53 54 52 49 43 54 B,d REAL) STRICT 188| page 2 offset 4096 189| 0: 0d 00 00 00 14 0c ae 00 0f df 0f bd 0f 9a 0f 76 ...............v 190| 16: 0f 51 0f 2b 0f 04 0e dc 0e b3 0e 89 0e 5e 0e 32 .Q.+.........^.2 191| 32: 0e 05 0d 1a 0d a8 0d 78 0d 47 0d 15 0c e2 00 00 .......x.G...... 192| 3232: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 14 ..............2. 193| 3248: 05 06 3f 34 07 15 f4 c9 23 af e2 b3 b6 61 62 63 ..?4....#....abc 194| 3264: 30 32 30 78 79 7a 01 00 00 00 00 00 00 00 00 00 020xyz.......... 195| 3280: 00 00 00 00 00 00 00 00 00 00 c3 b0 96 7e fb 4e .............~.N 196| 3296: c5 4c 31 13 05 06 1f 32 07 dd f2 2a a5 7e b2 4d .L1....2...*.~.M 197| 3312: 82 61 62 63 30 31 39 78 79 7a 01 00 00 00 00 00 .abc019xyz...... 198| 3328: 00 00 00 00 00 00 00 00 00 00 00 00 00 c3 a3 d6 ................ 199| 3344: e9 f1 c2 fd f3 30 12 05 06 1f 30 07 8f 8f f5 c4 .....0....0..... 200| 3360: 35 b6 7f 8d 61 62 63 30 31 38 00 00 00 00 00 00 5...abc018...... 201| 3376: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 ...............C 202| 3392: b2 13 1f 9d 56 8a 47 21 b1 05 06 1f 2e 07 7f 46 ....V.G!.......F 203| 3408: 91 03 3f 97 fb f7 61 62 63 30 00 00 00 00 00 00 ..?...abc0...... 204| 3440: c3 bb d8 96 86 c2 e8 2b 2e 10 05 06 1f 2c 07 6d .......+.....,.m 205| 3456: 85 7b ce d0 32 d2 54 61 62 63 30 00 00 00 00 00 ....2.Tabc0..... 206| 3488: 43 a1 eb 44 14 dc 03 7b 2d 0f 05 06 1f 2a 07 d9 C..D....-....*.. 207| 3504: ab ec bf 34 51 70 f3 61 62 63 30 31 35 78 79 7a ...4Qp.abc015xyz 208| 3520: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c3 ................ 209| 3536: b6 3d f4 46 b1 6a af 2c 0e 05 06 1f 28 07 36 75 .=.F.j.,....(.6u 210| 3552: e9 a2 bd 05 04 ea 61 62 63 30 31 34 78 79 7a 00 ......abc014xyz. 211| 3568: 00 00 00 00 00 00 00 00 00 00 00 00 00 c3 ab 23 ...............# 212| 3584: a7 6a 34 ca f8 2b 0d 05 06 1f 26 07 48 45 ab e0 .j4..+....&.HE.. 213| 3600: 8c 7c ff 0c 61 62 63 30 31 33 78 79 7a 00 00 00 .|..abc013xyz... 214| 3616: 00 00 00 00 0d d0 00 00 00 00 43 b8 d3 93 f4 92 ..........C..... 215| 3632: 5b 7a 2a 0c 05 06 1f 24 07 be 6d 1e db 61 5d 80 [z*....$..m..a]. 216| 3648: 9f 61 62 63 30 31 32 78 79 7a 00 00 00 00 00 00 .abc012xyz...... 217| 3664: 00 00 00 00 00 00 43 b5 a1 a4 af 7b c6 60 29 0b ......C......`). 218| 3680: 05 06 1f 22 07 6e a2 a3 64 68 d4 a6 bd 61 62 63 .....n..dh...abc 219| 3696: 30 31 31 78 79 7a 00 00 00 00 00 00 00 00 00 00 011xyz.......... 220| 3712: 00 c3 c4 1e ff 0f fc e6 ff 28 0a 05 06 1f 20 07 .........(.... . 221| 3728: 50 f9 4a bb a5 7a 1e ca 61 62 63 30 31 30 78 79 P.J..z..abc010xy 222| 3744: 7a 00 00 00 00 00 00 00 00 00 00 c3 a7 90 ed d9 z............... 223| 3760: 5c 2c d5 27 09 05 06 1f 1e 07 90 8e 1d d9 1c 3a .,.'...........: 224| 3776: e8 c1 61 62 63 30 30 39 78 79 7a 00 00 00 00 00 ..abc009xyz..... 225| 3792: 00 00 00 00 43 a7 97 87 cf b0 ff 79 26 08 05 06 ....C......y&... 226| 3808: 1f 1c 07 86 65 f6 7c 50 7a 2c 76 61 62 63 30 30 ....e.|Pz,vabc00 227| 3824: 38 78 79 7a 00 00 00 00 00 00 00 00 c3 b0 e3 4c 8xyz...........L 228| 3840: 4f d3 41 b5 25 07 05 06 1f 1a 07 8b 20 e5 68 11 O.A.%....... .h. 229| 3856: 13 55 87 61 62 63 30 30 37 78 79 7a 00 00 00 00 .U.abc007xyz.... 230| 3872: 00 00 00 c3 b6 a3 74 f1 9c 33 f8 24 06 05 06 1f ......t..3.$.... 231| 3888: 18 07 97 3c bc 34 49 94 54 ab 61 62 63 30 30 36 ...<.4I.T.abc006 232| 3904: 78 79 7a 00 00 00 00 00 00 c3 88 00 c2 ca 4c 4d xyz...........LM 233| 3920: d3 23 05 05 06 1f 16 07 59 37 11 10 e9 e5 3d d5 .#......Y7....=. 234| 3936: 61 62 63 30 30 35 78 79 7a 00 00 00 00 00 c3 c0 abc005xyz....... 235| 3952: 15 12 67 ed 4b 79 22 04 05 06 1f 14 07 93 39 01 ..g.Ky........9. 236| 3968: 7f b8 c7 99 58 61 62 63 30 30 34 78 79 7a 00 00 ....Xabc004xyz.. 237| 3984: 09 c0 43 bf e0 e7 6d 70 fd 61 21 03 05 06 1f 12 ..C...mp.a!..... 238| 4000: 07 b6 df 8d 8b 27 08 22 5a 61 62 63 30 30 33 78 .....'..Zabc003x 239| 4016: 79 7a 00 00 00 c3 c7 ea 0f dc dd 32 22 20 02 05 yz.........2. .. 240| 4032: 06 1f 10 07 2f a6 da 71 df 66 b3 b5 61 62 63 30 ..../..q.f..abc0 241| 4048: 30 32 78 79 7a 00 00 c3 ce d9 8d e9 ec 20 45 1f 02xyz........ E. 242| 4064: 01 05 06 1f 0e 07 5a 47 53 20 3b 48 8f c0 61 62 ......ZGS ;H..ab 243| 4080: 63 30 30 31 78 79 7a 00 c3 c9 e6 81 f8 d9 24 04 c001xyz.......$. 244| page 3 offset 8192 245| 0: 0a 00 00 00 14 0e fd 00 0f f3 0f e6 0f d9 0f cc ................ 246| 16: 0f bf 0f b2 0f a5 0f 98 0f 8b 0f 7e 0f 71 0f 64 ...........~.q.d 247| 32: 0f 57 0f 4a 0f 3d 0f 30 0f 24 00 00 00 00 00 00 .W.J.=.0.$...... 248| 3824: 00 00 00 00 00 00 00 00 00 00 00 00 00 0c 03 06 ................ 249| 3840: 01 7f 46 91 03 3f 97 fb f7 11 0c 03 06 01 6e a2 ..F..?........n. 250| 3856: a3 64 68 d4 a6 bd 0b 0c 03 06 01 6d 85 7b ce d0 .dh........m.... 251| 3872: 32 d2 54 10 0b 03 06 09 5a 47 53 20 3b 48 8f c0 2.T.....ZGS ;H.. 252| 3888: 0c 03 06 01 59 37 11 10 e9 e5 3d d5 05 0c 03 06 ....Y7....=..... 253| 3904: 01 50 f9 4a bb a5 7a 1e ca 0a 0c 03 06 01 48 45 .P.J..z.......HE 254| 3920: ab e0 8c 7c ff 0c 0d 0c 03 06 01 36 75 e9 a2 bd ...|.......6u... 255| 3936: 05 04 ea 0e 0c 03 06 01 2f a6 da 71 df 66 b3 b5 ......../..q.f.. 256| 3952: 02 0c 03 06 01 15 f4 c9 23 af e2 b3 b6 14 0c 03 ........#....... 257| 3968: 06 01 dd f2 2a a5 7e b2 4d 82 13 0c 03 06 01 d9 ....*.~.M....... 258| 3984: ab ec bf 34 51 70 f3 0f 0c 03 06 01 be 6d 1e db ...4Qp.......m.. 259| 4000: 61 5d 80 9f 0c 0c 03 06 01 b6 df 8d 8b 27 08 22 a]...........'.. 260| 4016: 5a 03 0c 03 06 01 97 3c bc 34 49 94 54 ab 06 0c Z......<.4I.T... 261| 4032: 03 06 01 93 39 01 7f b8 c7 99 58 04 0c 03 06 01 ....9.....X..... 262| 4048: 90 8e 1d d9 1c 3a e8 c1 09 0c 03 06 01 8f 8f f5 .....:.......... 263| 4064: c4 35 b6 7f 8d 12 0c 03 06 01 8b 20 e5 68 11 13 .5......... .h.. 264| 4080: 55 87 07 0c 03 06 01 86 65 f6 7c 50 7a 2b 06 08 U.......e.|Pz+.. 265| page 4 offset 12288 266| 0: 0a 00 00 00 14 0f 62 00 0f 7a 0f a1 0f c9 0f d9 ......b..z...... 267| 16: 0f 81 0f d1 0f f1 0f f9 0f e1 0f 89 0e 6a 0f c1 .............j.. 268| 32: 0f 91 0f 99 0f b9 0f 72 0f 62 0f e9 0f b1 0f a9 .......r.b...... 269| 3936: 00 00 07 04 01 01 01 11 0e 9e 07 04 01 01 01 0b ................ 270| 3952: 31 16 07 04 01 01 01 10 37 36 06 04 09 01 01 ab 1.......76...... 271| 3968: 58 07 04 01 01 01 05 1c 28 07 04 01 01 01 0a 10 X.......(....... 272| 3984: cf 07 04 01 01 01 0d b2 e3 07 04 01 01 01 0e d3 ................ 273| 4000: f2 07 04 01 01 01 02 41 ad 07 04 01 01 01 14 3e .......A.......> 274| 4016: 22 07 04 01 01 01 13 27 45 07 04 01 01 01 0f ad .......'E....... 275| 4032: dd 07 04 01 01 01 0c 2e a1 07 04 01 01 01 03 df ................ 276| 4048: e1 07 04 01 01 01 06 59 a7 07 04 01 01 01 04 27 .......Y.......' 277| 4064: bd 07 04 01 01 01 09 d0 e0 07 04 01 01 01 12 39 ...............9 278| 4080: 4f 07 04 01 01 01 07 c4 11 06 04 00 00 00 00 00 O............... 279| end crash-7b75760a4c5f15.db 280}]} {} 281 282do_test 5.1 { 283 set R [sqlite3_recover_init db main test.db2] 284 catch { $R run } 285 list [catch { $R finish } msg] $msg 286} {0 {}} 287 288finish_test 289 290