xref: /sqlite-3.40.0/test/corruptM.test (revision dac7e69d)
1# 2019-08-12
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# Check to ensure that the type, name, and tbl_name fields of the
13# sqlite_master table are validated and errors are reported if they
14# are inconsistent with the sql.
15#
16
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19set testprefix corruptM
20
21# These tests deal with corrupt database files
22#
23database_may_be_corrupt
24
25db close
26forcedelete test.db
27sqlite3 db test.db
28do_execsql_test corruptM-100 {
29  CREATE TABLE t1(a,b,c);
30  INSERT INTO t1 VALUES(111,222,333);
31  CREATE INDEX i1 ON t1(b);
32  CREATE VIEW v2 AS SELECT 15,22;
33  CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN SELECT 5; END;
34  SELECT type, name, tbl_name, '|' FROM sqlite_master;
35} {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
36do_execsql_test corruptM-101 {
37  PRAGMA writable_schema=on;
38  UPDATE sqlite_master SET tbl_name=NULL WHERE name='t1';
39  SELECT type, name, tbl_name, '|' FROM sqlite_master;
40} {table t1 {} | index i1 t1 | view v2 v2 | trigger r1 t1 |}
41sqlite3 db2 test.db
42do_test corruptM-102 {
43  catchsql {
44    PRAGMA quick_check;
45  } db2
46} {1 {malformed database schema (t1)}}
47db2 close
48
49do_execsql_test corruptM-110 {
50  UPDATE sqlite_master SET tbl_name='tx' WHERE name='t1';
51  SELECT type, name, tbl_name, '|' FROM sqlite_master;
52} {table t1 tx | index i1 t1 | view v2 v2 | trigger r1 t1 |}
53sqlite3 db2 test.db
54do_test corruptM-111 {
55  catchsql {
56    PRAGMA quick_check;
57  } db2
58} {1 {malformed database schema (t1)}}
59db2 close
60do_execsql_test corruptM-112 {
61  UPDATE sqlite_master SET tbl_name='t1', type='tabl' WHERE name='t1';
62  SELECT type, name, tbl_name, '|' FROM sqlite_master;
63} {tabl t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
64sqlite3 db2 test.db
65do_test corruptM-113 {
66  catchsql {
67    PRAGMA quick_check;
68  } db2
69} {1 {malformed database schema (t1)}}
70db2 close
71do_execsql_test corruptM-114 {
72  UPDATE sqlite_master SET tbl_name='t9',type='table',name='t9'WHERE name='t1';
73  SELECT type, name, tbl_name, '|' FROM sqlite_master;
74} {table t9 t9 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
75sqlite3 db2 test.db
76do_test corruptM-114 {
77  catchsql {
78    PRAGMA quick_check;
79  } db2
80} {1 {malformed database schema (t9)}}
81db2 close
82
83do_execsql_test corruptM-120 {
84  UPDATE sqlite_master SET name='t1',tbl_name='T1' WHERE name='t9';
85  SELECT type, name, tbl_name, '|' FROM sqlite_master;
86} {table t1 T1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
87sqlite3 db2 test.db
88do_test corruptM-121 {
89  catchsql {
90    PRAGMA quick_check;
91    SELECT * FROM t1, v2;
92  } db2
93} {0 {ok 111 222 333 15 22}}
94db2 close
95
96do_execsql_test corruptM-130 {
97  UPDATE sqlite_master SET type='view' WHERE name='t1';
98  SELECT type, name, tbl_name, '|' FROM sqlite_master;
99} {view t1 T1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
100sqlite3 db2 test.db
101do_test corruptM-131 {
102  catchsql {
103    PRAGMA quick_check;
104    SELECT * FROM t1, v2;
105  } db2
106} {1 {malformed database schema (t1)}}
107db2 close
108
109do_execsql_test corruptM-140 {
110  UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='t1';
111  UPDATE sqlite_master SET tbl_name='tx' WHERE name='i1';
112  SELECT type, name, tbl_name, '|' FROM sqlite_master;
113} {table t1 t1 | index i1 tx | view v2 v2 | trigger r1 t1 |}
114sqlite3 db2 test.db
115do_test corruptM-141 {
116  catchsql {
117    PRAGMA quick_check;
118    SELECT * FROM t1, v2;
119  } db2
120} {1 {malformed database schema (i1)}}
121db2 close
122
123do_execsql_test corruptM-150 {
124  UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='i1';
125  SELECT type, name, tbl_name, '|' FROM sqlite_master;
126} {table t1 t1 | table i1 t1 | view v2 v2 | trigger r1 t1 |}
127sqlite3 db2 test.db
128do_test corruptM-151 {
129  catchsql {
130    PRAGMA quick_check;
131    SELECT * FROM t1, v2;
132  } db2
133} {1 {malformed database schema (i1)}}
134db2 close
135
136do_execsql_test corruptM-160 {
137  UPDATE sqlite_master SET type='view', tbl_name='t1' WHERE name='i1';
138  SELECT type, name, tbl_name, '|' FROM sqlite_master;
139} {table t1 t1 | view i1 t1 | view v2 v2 | trigger r1 t1 |}
140sqlite3 db2 test.db
141do_test corruptM-161 {
142  catchsql {
143    PRAGMA quick_check;
144    SELECT * FROM t1, v2;
145  } db2
146} {1 {malformed database schema (i1)}}
147db2 close
148
149do_execsql_test corruptM-170 {
150  UPDATE sqlite_master SET type='index', tbl_name='t1' WHERE name='i1';
151  UPDATE sqlite_master SET type='table', tbl_name='v2' WHERE name='v2';
152  SELECT type, name, tbl_name, '|' FROM sqlite_master;
153} {table t1 t1 | index i1 t1 | table v2 v2 | trigger r1 t1 |}
154sqlite3 db2 test.db
155do_test corruptM-171 {
156  catchsql {
157    PRAGMA quick_check;
158    SELECT * FROM t1, v2;
159  } db2
160} {1 {malformed database schema (v2)}}
161db2 close
162
163do_execsql_test corruptM-180 {
164  UPDATE sqlite_master SET type='view',name='v3',tbl_name='v3' WHERE name='v2';
165  SELECT type, name, tbl_name, '|' FROM sqlite_master;
166} {table t1 t1 | index i1 t1 | view v3 v3 | trigger r1 t1 |}
167sqlite3 db2 test.db
168do_test corruptM-181 {
169  catchsql {
170    PRAGMA quick_check;
171    SELECT * FROM t1, v2;
172  } db2
173} {1 {malformed database schema (v3)}}
174db2 close
175
176do_execsql_test corruptM-190 {
177  UPDATE sqlite_master SET type='view',name='v2',tbl_name='v2' WHERE name='v3';
178  UPDATE sqlite_master SET type='view' WHERE name='r1';
179  SELECT type, name, tbl_name, '|' FROM sqlite_master;
180} {table t1 t1 | index i1 t1 | view v2 v2 | view r1 t1 |}
181sqlite3 db2 test.db
182do_test corruptM-191 {
183  catchsql {
184    PRAGMA quick_check;
185    SELECT * FROM t1, v2;
186  } db2
187} {1 {malformed database schema (r1)}}
188db2 close
189do_execsql_test corruptM-192 {
190  UPDATE sqlite_master SET type='trigger',tbl_name='v2' WHERE name='r1';
191  SELECT type, name, tbl_name, '|' FROM sqlite_master;
192} {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 v2 |}
193sqlite3 db2 test.db
194do_test corruptM-193 {
195  catchsql {
196    PRAGMA quick_check;
197    SELECT * FROM t1, v2;
198  } db2
199} {1 {malformed database schema (r1)}}
200db2 close
201
202finish_test
203