mirror of
https://github.com/sqlite/sqlite.git
synced 2024-12-01 09:12:16 +01:00
0f0d3ddf71
turning DEFENSIVE off in order to dodgy things to the database for testing purposes. No all of those cases are yet handled, so "make test" does not run to completion. FossilOrigin-Name: a1d6c6712c3304fd736077432c8c180692cf7d79be7f3a073510b6dab0eb951f
101 lines
2.8 KiB
Plaintext
101 lines
2.8 KiB
Plaintext
# 2014 Dec 20
|
|
#
|
|
# 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.
|
|
#
|
|
#***********************************************************************
|
|
#
|
|
# This file tests that the FTS5 'integrity-check' command detects
|
|
# inconsistencies (corruption) in the on-disk backing tables.
|
|
#
|
|
|
|
source [file join [file dirname [info script]] fts5_common.tcl]
|
|
set testprefix fts5corrupt
|
|
|
|
# If SQLITE_ENABLE_FTS5 is defined, omit this file.
|
|
ifcapable !fts5 {
|
|
finish_test
|
|
return
|
|
}
|
|
|
|
do_execsql_test 1.0 {
|
|
CREATE VIRTUAL TABLE t1 USING fts5(x);
|
|
INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
|
|
}
|
|
|
|
do_test 1.1 {
|
|
db transaction {
|
|
for {set i 1} {$i < 200} {incr i} {
|
|
set doc [list [string repeat x $i] [string repeat y $i]]
|
|
execsql { INSERT INTO t1(rowid, x) VALUES($i, $doc) }
|
|
}
|
|
}
|
|
fts5_level_segs t1
|
|
} {1}
|
|
db_save
|
|
|
|
do_execsql_test 1.2 { INSERT INTO t1(t1) VALUES('integrity-check') }
|
|
set segid [lindex [fts5_level_segids t1] 0]
|
|
|
|
sqlite3_db_config db DEFENSIVE 0
|
|
do_test 1.3 {
|
|
execsql {
|
|
DELETE FROM t1_data WHERE rowid = fts5_rowid('segment', $segid, 4);
|
|
}
|
|
catchsql { INSERT INTO t1(t1) VALUES('integrity-check') }
|
|
} {1 {database disk image is malformed}}
|
|
|
|
do_test 1.4 {
|
|
db_restore_and_reopen
|
|
sqlite3_db_config db DEFENSIVE 0
|
|
execsql {
|
|
UPDATE t1_data set block = X'00000000' || substr(block, 5) WHERE
|
|
rowid = fts5_rowid('segment', $segid, 4);
|
|
}
|
|
catchsql { INSERT INTO t1(t1) VALUES('integrity-check') }
|
|
} {1 {database disk image is malformed}}
|
|
|
|
db_restore_and_reopen
|
|
#db eval {SELECT rowid, fts5_decode(rowid, block) aS r FROM t1_data} {puts $r}
|
|
|
|
|
|
#--------------------------------------------------------------------
|
|
#
|
|
do_execsql_test 2.0 {
|
|
CREATE VIRTUAL TABLE t2 USING fts5(x);
|
|
INSERT INTO t2(t2, rank) VALUES('pgsz', 64);
|
|
}
|
|
db func rnddoc fts5_rnddoc
|
|
do_test 2.1 {
|
|
for {set i 0} {$i < 500} {incr i} {
|
|
execsql { INSERT INTO t2 VALUES(rnddoc(50)) }
|
|
}
|
|
execsql { INSERT INTO t2(t2) VALUES('integrity-check') }
|
|
} {}
|
|
|
|
#--------------------------------------------------------------------
|
|
# A mundane test - missing row in the %_content table.
|
|
#
|
|
do_execsql_test 3.0 {
|
|
CREATE VIRTUAL TABLE t3 USING fts5(x);
|
|
INSERT INTO t3 VALUES('one o');
|
|
INSERT INTO t3 VALUES('two e');
|
|
INSERT INTO t3 VALUES('three o');
|
|
INSERT INTO t3 VALUES('four e');
|
|
INSERT INTO t3 VALUES('five o');
|
|
}
|
|
do_execsql_test 3.1 {
|
|
SELECT * FROM t3 WHERE t3 MATCH 'o'
|
|
} {{one o} {three o} {five o}}
|
|
sqlite3_db_config db DEFENSIVE 0
|
|
do_catchsql_test 3.1 {
|
|
DELETE FROM t3_content WHERE rowid = 3;
|
|
SELECT * FROM t3 WHERE t3 MATCH 'o';
|
|
} {1 {database disk image is malformed}}
|
|
|
|
finish_test
|