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