2019-08-12 03:08:07 +03:00
|
|
|
# 2019-08-12
|
|
|
|
#
|
|
|
|
# The author disclaims copyright to this source code. In place of
|
|
|
|
# a legal notice, here is a blessing:
|
|
|
|
#
|
|
|
|
# May you do good and not evil.
|
|
|
|
# May you find forgiveness for yourself and forgive others.
|
|
|
|
# May you share freely, never taking more than you give.
|
|
|
|
#
|
|
|
|
#***********************************************************************
|
|
|
|
#
|
|
|
|
# Check to ensure that the type, name, and tbl_name fields of the
|
|
|
|
# sqlite_master table are validated and errors are reported if they
|
|
|
|
# are inconsistent with the sql.
|
|
|
|
#
|
|
|
|
|
|
|
|
set testdir [file dirname $argv0]
|
|
|
|
source $testdir/tester.tcl
|
|
|
|
set testprefix corruptM
|
|
|
|
|
|
|
|
# These tests deal with corrupt database files
|
|
|
|
#
|
|
|
|
database_may_be_corrupt
|
|
|
|
|
2019-10-02 22:43:38 +03:00
|
|
|
proc open_db2_and_catchsql {sql} {
|
|
|
|
set rc [catch { sqlite3 db2 test.db } msg]
|
|
|
|
if {$rc} {
|
|
|
|
return [list $rc $msg]
|
|
|
|
}
|
|
|
|
set res [catchsql $sql db2]
|
|
|
|
db2 close
|
|
|
|
set res
|
|
|
|
}
|
|
|
|
|
2019-08-12 03:08:07 +03:00
|
|
|
db close
|
|
|
|
forcedelete test.db
|
|
|
|
sqlite3 db test.db
|
|
|
|
do_execsql_test corruptM-100 {
|
|
|
|
CREATE TABLE t1(a,b,c);
|
|
|
|
INSERT INTO t1 VALUES(111,222,333);
|
|
|
|
CREATE INDEX i1 ON t1(b);
|
|
|
|
CREATE VIEW v2 AS SELECT 15,22;
|
|
|
|
CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN SELECT 5; END;
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
|
|
|
|
do_execsql_test corruptM-101 {
|
|
|
|
PRAGMA writable_schema=on;
|
|
|
|
UPDATE sqlite_master SET tbl_name=NULL WHERE name='t1';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t1 {} | index i1 t1 | view v2 v2 | trigger r1 t1 |}
|
|
|
|
do_test corruptM-102 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (t1)}}
|
|
|
|
|
|
|
|
do_execsql_test corruptM-110 {
|
|
|
|
UPDATE sqlite_master SET tbl_name='tx' WHERE name='t1';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t1 tx | index i1 t1 | view v2 v2 | trigger r1 t1 |}
|
|
|
|
do_test corruptM-111 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (t1)}}
|
|
|
|
do_execsql_test corruptM-112 {
|
|
|
|
UPDATE sqlite_master SET tbl_name='t1', type='tabl' WHERE name='t1';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {tabl t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
|
|
|
|
do_test corruptM-113 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (t1)}}
|
|
|
|
do_execsql_test corruptM-114 {
|
|
|
|
UPDATE sqlite_master SET tbl_name='t9',type='table',name='t9'WHERE name='t1';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t9 t9 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
|
|
|
|
do_test corruptM-114 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (t9)}}
|
|
|
|
|
|
|
|
do_execsql_test corruptM-120 {
|
|
|
|
UPDATE sqlite_master SET name='t1',tbl_name='T1' WHERE name='t9';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t1 T1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
|
|
|
|
do_test corruptM-121 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
|
|
|
SELECT * FROM t1, v2;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {0 {ok 111 222 333 15 22}}
|
|
|
|
|
|
|
|
do_execsql_test corruptM-130 {
|
|
|
|
UPDATE sqlite_master SET type='view' WHERE name='t1';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {view t1 T1 | index i1 t1 | view v2 v2 | trigger r1 t1 |}
|
|
|
|
do_test corruptM-131 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
|
|
|
SELECT * FROM t1, v2;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (t1)}}
|
|
|
|
|
|
|
|
do_execsql_test corruptM-140 {
|
|
|
|
UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='t1';
|
|
|
|
UPDATE sqlite_master SET tbl_name='tx' WHERE name='i1';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t1 t1 | index i1 tx | view v2 v2 | trigger r1 t1 |}
|
|
|
|
do_test corruptM-141 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
|
|
|
SELECT * FROM t1, v2;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (i1)}}
|
|
|
|
|
|
|
|
do_execsql_test corruptM-150 {
|
|
|
|
UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='i1';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t1 t1 | table i1 t1 | view v2 v2 | trigger r1 t1 |}
|
|
|
|
do_test corruptM-151 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
|
|
|
SELECT * FROM t1, v2;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (i1)}}
|
|
|
|
|
|
|
|
do_execsql_test corruptM-160 {
|
|
|
|
UPDATE sqlite_master SET type='view', tbl_name='t1' WHERE name='i1';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t1 t1 | view i1 t1 | view v2 v2 | trigger r1 t1 |}
|
|
|
|
do_test corruptM-161 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
|
|
|
SELECT * FROM t1, v2;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (i1)}}
|
|
|
|
|
|
|
|
do_execsql_test corruptM-170 {
|
|
|
|
UPDATE sqlite_master SET type='index', tbl_name='t1' WHERE name='i1';
|
|
|
|
UPDATE sqlite_master SET type='table', tbl_name='v2' WHERE name='v2';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t1 t1 | index i1 t1 | table v2 v2 | trigger r1 t1 |}
|
|
|
|
do_test corruptM-171 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
|
|
|
SELECT * FROM t1, v2;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (v2)}}
|
|
|
|
|
|
|
|
do_execsql_test corruptM-180 {
|
|
|
|
UPDATE sqlite_master SET type='view',name='v3',tbl_name='v3' WHERE name='v2';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t1 t1 | index i1 t1 | view v3 v3 | trigger r1 t1 |}
|
|
|
|
do_test corruptM-181 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
|
|
|
SELECT * FROM t1, v2;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (v3)}}
|
|
|
|
|
|
|
|
do_execsql_test corruptM-190 {
|
|
|
|
UPDATE sqlite_master SET type='view',name='v2',tbl_name='v2' WHERE name='v3';
|
|
|
|
UPDATE sqlite_master SET type='view' WHERE name='r1';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t1 t1 | index i1 t1 | view v2 v2 | view r1 t1 |}
|
|
|
|
do_test corruptM-191 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
|
|
|
SELECT * FROM t1, v2;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (r1)}}
|
|
|
|
do_execsql_test corruptM-192 {
|
|
|
|
UPDATE sqlite_master SET type='trigger',tbl_name='v2' WHERE name='r1';
|
|
|
|
SELECT type, name, tbl_name, '|' FROM sqlite_master;
|
|
|
|
} {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 v2 |}
|
|
|
|
do_test corruptM-193 {
|
2019-10-02 22:43:38 +03:00
|
|
|
open_db2_and_catchsql {
|
2019-08-12 03:08:07 +03:00
|
|
|
PRAGMA quick_check;
|
|
|
|
SELECT * FROM t1, v2;
|
2019-10-02 22:43:38 +03:00
|
|
|
}
|
2019-08-12 03:08:07 +03:00
|
|
|
} {1 {malformed database schema (r1)}}
|
|
|
|
|
|
|
|
finish_test
|