AryaWu/sqlite
0
1# 2019-08-122#3# The author disclaims copyright to this source code. In place of4# 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 the13# sqlite_master table are validated and errors are reported if they14# are inconsistent with the sql.15#16 17set testdir [file dirname $argv0]18source $testdir/tester.tcl19set testprefix corruptM20 21# These tests deal with corrupt database files22#23database_may_be_corrupt24 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 close32 set res33}34 35db close36forcedelete test.db37sqlite3 db test.db38do_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_test187 