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