xref: /sqlite-3.40.0/test/corruptM.test (revision f0578823)
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
25proc open_db2_and_catchsql {sql} {
26  set rc [catch { sqlite3 db2 test.db } msg]
27  if {$rc} {
28    return [list $rc $msg]
29  }
30  set res [catchsql $sql db2]
31  db2 close
32  set res
33}
34
35db close
36forcedelete test.db
37sqlite3 db test.db
38do_execsql_test corruptM-100 {
39  CREATE TABLE t1(a,b,c);
40  INSERT INTO t1 VALUES(111,222,333);
41  CREATE INDEX i1 ON t1(b);
42  CREATE VIEW v2 AS SELECT 15,22;
43  CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN SELECT 5; END;
44  SELECT type, name, tbl_name, '|' FROM sqlite_master;
45} {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
46do_execsql_test corruptM-101 {
47  PRAGMA writable_schema=on;
48  UPDATE sqlite_master SET tbl_name=NULL WHERE name='t1';
49  SELECT type, name, tbl_name, '|' FROM sqlite_master;
50} {table t1 {} | index i1 t1 | view v2 v2 | trigger r1 t1 |}
51do_test corruptM-102 {
52  open_db2_and_catchsql {
53    PRAGMA quick_check;
54  }
55} {1 {malformed database schema (t1)}}
56
57do_execsql_test corruptM-110 {
58  UPDATE sqlite_master SET tbl_name='tx' WHERE name='t1';
59  SELECT type, name, tbl_name, '|' FROM sqlite_master;
60} {table t1 tx | index i1 t1 | view v2 v2 | trigger r1 t1 |}
61do_test corruptM-111 {
62  open_db2_and_catchsql {
63    PRAGMA quick_check;
64  }
65} {1 {malformed database schema (t1)}}
66do_execsql_test corruptM-112 {
67  UPDATE sqlite_master SET tbl_name='t1', type='tabl' WHERE name='t1';
68  SELECT type, name, tbl_name, '|' FROM sqlite_master;
69} {tabl t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
70do_test corruptM-113 {
71  open_db2_and_catchsql {
72    PRAGMA quick_check;
73  }
74} {1 {malformed database schema (t1)}}
75do_execsql_test corruptM-114 {
76  UPDATE sqlite_master SET tbl_name='t9',type='table',name='t9'WHERE name='t1';
77  SELECT type, name, tbl_name, '|' FROM sqlite_master;
78} {table t9 t9 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
79do_test corruptM-114 {
80  open_db2_and_catchsql {
81    PRAGMA quick_check;
82  }
83} {1 {malformed database schema (t9)}}
84
85do_execsql_test corruptM-120 {
86  UPDATE sqlite_master SET name='t1',tbl_name='T1' WHERE name='t9';
87  SELECT type, name, tbl_name, '|' FROM sqlite_master;
88} {table t1 T1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
89do_test corruptM-121 {
90  open_db2_and_catchsql {
91    PRAGMA quick_check;
92    SELECT * FROM t1, v2;
93  }
94} {0 {ok 111 222 333 15 22}}
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 |}
100do_test corruptM-131 {
101  open_db2_and_catchsql {
102    PRAGMA quick_check;
103    SELECT * FROM t1, v2;
104  }
105} {1 {malformed database schema (t1)}}
106
107do_execsql_test corruptM-140 {
108  UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='t1';
109  UPDATE sqlite_master SET tbl_name='tx' WHERE name='i1';
110  SELECT type, name, tbl_name, '|' FROM sqlite_master;
111} {table t1 t1 | index i1 tx | view v2 v2 | trigger r1 t1 |}
112do_test corruptM-141 {
113  open_db2_and_catchsql {
114    PRAGMA quick_check;
115    SELECT * FROM t1, v2;
116  }
117} {1 {malformed database schema (i1)}}
118
119do_execsql_test corruptM-150 {
120  UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='i1';
121  SELECT type, name, tbl_name, '|' FROM sqlite_master;
122} {table t1 t1 | table i1 t1 | view v2 v2 | trigger r1 t1 |}
123do_test corruptM-151 {
124  open_db2_and_catchsql {
125    PRAGMA quick_check;
126    SELECT * FROM t1, v2;
127  }
128} {1 {malformed database schema (i1)}}
129
130do_execsql_test corruptM-160 {
131  UPDATE sqlite_master SET type='view', tbl_name='t1' WHERE name='i1';
132  SELECT type, name, tbl_name, '|' FROM sqlite_master;
133} {table t1 t1 | view i1 t1 | view v2 v2 | trigger r1 t1 |}
134do_test corruptM-161 {
135  open_db2_and_catchsql {
136    PRAGMA quick_check;
137    SELECT * FROM t1, v2;
138  }
139} {1 {malformed database schema (i1)}}
140
141do_execsql_test corruptM-170 {
142  UPDATE sqlite_master SET type='index', tbl_name='t1' WHERE name='i1';
143  UPDATE sqlite_master SET type='table', tbl_name='v2' WHERE name='v2';
144  SELECT type, name, tbl_name, '|' FROM sqlite_master;
145} {table t1 t1 | index i1 t1 | table v2 v2 | trigger r1 t1 |}
146do_test corruptM-171 {
147  open_db2_and_catchsql {
148    PRAGMA quick_check;
149    SELECT * FROM t1, v2;
150  }
151} {1 {malformed database schema (v2)}}
152
153do_execsql_test corruptM-180 {
154  UPDATE sqlite_master SET type='view',name='v3',tbl_name='v3' WHERE name='v2';
155  SELECT type, name, tbl_name, '|' FROM sqlite_master;
156} {table t1 t1 | index i1 t1 | view v3 v3 | trigger r1 t1 |}
157do_test corruptM-181 {
158  open_db2_and_catchsql {
159    PRAGMA quick_check;
160    SELECT * FROM t1, v2;
161  }
162} {1 {malformed database schema (v3)}}
163
164do_execsql_test corruptM-190 {
165  UPDATE sqlite_master SET type='view',name='v2',tbl_name='v2' WHERE name='v3';
166  UPDATE sqlite_master SET type='view' WHERE name='r1';
167  SELECT type, name, tbl_name, '|' FROM sqlite_master;
168} {table t1 t1 | index i1 t1 | view v2 v2 | view r1 t1 |}
169do_test corruptM-191 {
170  open_db2_and_catchsql {
171    PRAGMA quick_check;
172    SELECT * FROM t1, v2;
173  }
174} {1 {malformed database schema (r1)}}
175do_execsql_test corruptM-192 {
176  UPDATE sqlite_master SET type='trigger',tbl_name='v2' WHERE name='r1';
177  SELECT type, name, tbl_name, '|' FROM sqlite_master;
178} {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 v2 |}
179do_test corruptM-193 {
180  open_db2_and_catchsql {
181    PRAGMA quick_check;
182    SELECT * FROM t1, v2;
183  }
184} {1 {malformed database schema (r1)}}
185
186finish_test
187