1c5a93d4cSdrh# 2019-08-12 2c5a93d4cSdrh# 3c5a93d4cSdrh# The author disclaims copyright to this source code. In place of 4c5a93d4cSdrh# a legal notice, here is a blessing: 5c5a93d4cSdrh# 6c5a93d4cSdrh# May you do good and not evil. 7c5a93d4cSdrh# May you find forgiveness for yourself and forgive others. 8c5a93d4cSdrh# May you share freely, never taking more than you give. 9c5a93d4cSdrh# 10c5a93d4cSdrh#*********************************************************************** 11c5a93d4cSdrh# 12c5a93d4cSdrh# Check to ensure that the type, name, and tbl_name fields of the 13c5a93d4cSdrh# sqlite_master table are validated and errors are reported if they 14c5a93d4cSdrh# are inconsistent with the sql. 15c5a93d4cSdrh# 16c5a93d4cSdrh 17c5a93d4cSdrhset testdir [file dirname $argv0] 18c5a93d4cSdrhsource $testdir/tester.tcl 19c5a93d4cSdrhset testprefix corruptM 20c5a93d4cSdrh 21c5a93d4cSdrh# These tests deal with corrupt database files 22c5a93d4cSdrh# 23c5a93d4cSdrhdatabase_may_be_corrupt 24c5a93d4cSdrh 25*f0578823Sdanproc open_db2_and_catchsql {sql} { 26*f0578823Sdan set rc [catch { sqlite3 db2 test.db } msg] 27*f0578823Sdan if {$rc} { 28*f0578823Sdan return [list $rc $msg] 29*f0578823Sdan } 30*f0578823Sdan set res [catchsql $sql db2] 31*f0578823Sdan db2 close 32*f0578823Sdan set res 33*f0578823Sdan} 34*f0578823Sdan 35c5a93d4cSdrhdb close 36c5a93d4cSdrhforcedelete test.db 37c5a93d4cSdrhsqlite3 db test.db 38c5a93d4cSdrhdo_execsql_test corruptM-100 { 39c5a93d4cSdrh CREATE TABLE t1(a,b,c); 40c5a93d4cSdrh INSERT INTO t1 VALUES(111,222,333); 41c5a93d4cSdrh CREATE INDEX i1 ON t1(b); 42c5a93d4cSdrh CREATE VIEW v2 AS SELECT 15,22; 43c5a93d4cSdrh CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN SELECT 5; END; 44c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 45c5a93d4cSdrh} {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |} 46c5a93d4cSdrhdo_execsql_test corruptM-101 { 47c5a93d4cSdrh PRAGMA writable_schema=on; 48c5a93d4cSdrh UPDATE sqlite_master SET tbl_name=NULL WHERE name='t1'; 49c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 50c5a93d4cSdrh} {table t1 {} | index i1 t1 | view v2 v2 | trigger r1 t1 |} 51c5a93d4cSdrhdo_test corruptM-102 { 52*f0578823Sdan open_db2_and_catchsql { 53c5a93d4cSdrh PRAGMA quick_check; 54*f0578823Sdan } 55c5a93d4cSdrh} {1 {malformed database schema (t1)}} 56c5a93d4cSdrh 57c5a93d4cSdrhdo_execsql_test corruptM-110 { 58c5a93d4cSdrh UPDATE sqlite_master SET tbl_name='tx' WHERE name='t1'; 59c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 60c5a93d4cSdrh} {table t1 tx | index i1 t1 | view v2 v2 | trigger r1 t1 |} 61c5a93d4cSdrhdo_test corruptM-111 { 62*f0578823Sdan open_db2_and_catchsql { 63c5a93d4cSdrh PRAGMA quick_check; 64*f0578823Sdan } 65c5a93d4cSdrh} {1 {malformed database schema (t1)}} 66c5a93d4cSdrhdo_execsql_test corruptM-112 { 67c5a93d4cSdrh UPDATE sqlite_master SET tbl_name='t1', type='tabl' WHERE name='t1'; 68c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 69c5a93d4cSdrh} {tabl t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |} 70c5a93d4cSdrhdo_test corruptM-113 { 71*f0578823Sdan open_db2_and_catchsql { 72c5a93d4cSdrh PRAGMA quick_check; 73*f0578823Sdan } 74c5a93d4cSdrh} {1 {malformed database schema (t1)}} 75c5a93d4cSdrhdo_execsql_test corruptM-114 { 76c5a93d4cSdrh UPDATE sqlite_master SET tbl_name='t9',type='table',name='t9'WHERE name='t1'; 77c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 78c5a93d4cSdrh} {table t9 t9 | index i1 t1 | view v2 v2 | trigger r1 t1 |} 79c5a93d4cSdrhdo_test corruptM-114 { 80*f0578823Sdan open_db2_and_catchsql { 81c5a93d4cSdrh PRAGMA quick_check; 82*f0578823Sdan } 83c5a93d4cSdrh} {1 {malformed database schema (t9)}} 84c5a93d4cSdrh 85c5a93d4cSdrhdo_execsql_test corruptM-120 { 86c5a93d4cSdrh UPDATE sqlite_master SET name='t1',tbl_name='T1' WHERE name='t9'; 87c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 88c5a93d4cSdrh} {table t1 T1 | index i1 t1 | view v2 v2 | trigger r1 t1 |} 89c5a93d4cSdrhdo_test corruptM-121 { 90*f0578823Sdan open_db2_and_catchsql { 91c5a93d4cSdrh PRAGMA quick_check; 92c5a93d4cSdrh SELECT * FROM t1, v2; 93*f0578823Sdan } 94c5a93d4cSdrh} {0 {ok 111 222 333 15 22}} 95c5a93d4cSdrh 96c5a93d4cSdrhdo_execsql_test corruptM-130 { 97c5a93d4cSdrh UPDATE sqlite_master SET type='view' WHERE name='t1'; 98c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 99c5a93d4cSdrh} {view t1 T1 | index i1 t1 | view v2 v2 | trigger r1 t1 |} 100c5a93d4cSdrhdo_test corruptM-131 { 101*f0578823Sdan open_db2_and_catchsql { 102c5a93d4cSdrh PRAGMA quick_check; 103c5a93d4cSdrh SELECT * FROM t1, v2; 104*f0578823Sdan } 105c5a93d4cSdrh} {1 {malformed database schema (t1)}} 106c5a93d4cSdrh 107c5a93d4cSdrhdo_execsql_test corruptM-140 { 108c5a93d4cSdrh UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='t1'; 109c5a93d4cSdrh UPDATE sqlite_master SET tbl_name='tx' WHERE name='i1'; 110c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 111c5a93d4cSdrh} {table t1 t1 | index i1 tx | view v2 v2 | trigger r1 t1 |} 112c5a93d4cSdrhdo_test corruptM-141 { 113*f0578823Sdan open_db2_and_catchsql { 114c5a93d4cSdrh PRAGMA quick_check; 115c5a93d4cSdrh SELECT * FROM t1, v2; 116*f0578823Sdan } 117c5a93d4cSdrh} {1 {malformed database schema (i1)}} 118c5a93d4cSdrh 119c5a93d4cSdrhdo_execsql_test corruptM-150 { 120c5a93d4cSdrh UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='i1'; 121c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 122c5a93d4cSdrh} {table t1 t1 | table i1 t1 | view v2 v2 | trigger r1 t1 |} 123c5a93d4cSdrhdo_test corruptM-151 { 124*f0578823Sdan open_db2_and_catchsql { 125c5a93d4cSdrh PRAGMA quick_check; 126c5a93d4cSdrh SELECT * FROM t1, v2; 127*f0578823Sdan } 128c5a93d4cSdrh} {1 {malformed database schema (i1)}} 129c5a93d4cSdrh 130c5a93d4cSdrhdo_execsql_test corruptM-160 { 131c5a93d4cSdrh UPDATE sqlite_master SET type='view', tbl_name='t1' WHERE name='i1'; 132c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 133c5a93d4cSdrh} {table t1 t1 | view i1 t1 | view v2 v2 | trigger r1 t1 |} 134c5a93d4cSdrhdo_test corruptM-161 { 135*f0578823Sdan open_db2_and_catchsql { 136c5a93d4cSdrh PRAGMA quick_check; 137c5a93d4cSdrh SELECT * FROM t1, v2; 138*f0578823Sdan } 139c5a93d4cSdrh} {1 {malformed database schema (i1)}} 140c5a93d4cSdrh 141c5a93d4cSdrhdo_execsql_test corruptM-170 { 142c5a93d4cSdrh UPDATE sqlite_master SET type='index', tbl_name='t1' WHERE name='i1'; 143c5a93d4cSdrh UPDATE sqlite_master SET type='table', tbl_name='v2' WHERE name='v2'; 144c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 145c5a93d4cSdrh} {table t1 t1 | index i1 t1 | table v2 v2 | trigger r1 t1 |} 146c5a93d4cSdrhdo_test corruptM-171 { 147*f0578823Sdan open_db2_and_catchsql { 148c5a93d4cSdrh PRAGMA quick_check; 149c5a93d4cSdrh SELECT * FROM t1, v2; 150*f0578823Sdan } 151c5a93d4cSdrh} {1 {malformed database schema (v2)}} 152c5a93d4cSdrh 153c5a93d4cSdrhdo_execsql_test corruptM-180 { 154c5a93d4cSdrh UPDATE sqlite_master SET type='view',name='v3',tbl_name='v3' WHERE name='v2'; 155c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 156c5a93d4cSdrh} {table t1 t1 | index i1 t1 | view v3 v3 | trigger r1 t1 |} 157c5a93d4cSdrhdo_test corruptM-181 { 158*f0578823Sdan open_db2_and_catchsql { 159c5a93d4cSdrh PRAGMA quick_check; 160c5a93d4cSdrh SELECT * FROM t1, v2; 161*f0578823Sdan } 162c5a93d4cSdrh} {1 {malformed database schema (v3)}} 163c5a93d4cSdrh 164c5a93d4cSdrhdo_execsql_test corruptM-190 { 165c5a93d4cSdrh UPDATE sqlite_master SET type='view',name='v2',tbl_name='v2' WHERE name='v3'; 166c5a93d4cSdrh UPDATE sqlite_master SET type='view' WHERE name='r1'; 167c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 168c5a93d4cSdrh} {table t1 t1 | index i1 t1 | view v2 v2 | view r1 t1 |} 169c5a93d4cSdrhdo_test corruptM-191 { 170*f0578823Sdan open_db2_and_catchsql { 171c5a93d4cSdrh PRAGMA quick_check; 172c5a93d4cSdrh SELECT * FROM t1, v2; 173*f0578823Sdan } 174c5a93d4cSdrh} {1 {malformed database schema (r1)}} 175c5a93d4cSdrhdo_execsql_test corruptM-192 { 176c5a93d4cSdrh UPDATE sqlite_master SET type='trigger',tbl_name='v2' WHERE name='r1'; 177c5a93d4cSdrh SELECT type, name, tbl_name, '|' FROM sqlite_master; 178c5a93d4cSdrh} {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 v2 |} 179c5a93d4cSdrhdo_test corruptM-193 { 180*f0578823Sdan open_db2_and_catchsql { 181c5a93d4cSdrh PRAGMA quick_check; 182c5a93d4cSdrh SELECT * FROM t1, v2; 183*f0578823Sdan } 184c5a93d4cSdrh} {1 {malformed database schema (r1)}} 185c5a93d4cSdrh 186c5a93d4cSdrhfinish_test 187