1e25ac099Sdan# 2010 June 15 2e25ac099Sdan# 3e25ac099Sdan# The author disclaims copyright to this source code. In place of 4e25ac099Sdan# a legal notice, here is a blessing: 5e25ac099Sdan# 6e25ac099Sdan# May you do good and not evil. 7e25ac099Sdan# May you find forgiveness for yourself and forgive others. 8e25ac099Sdan# May you share freely, never taking more than you give. 9e25ac099Sdan# 10e25ac099Sdan#*********************************************************************** 11e25ac099Sdan# 12e25ac099Sdan 13e25ac099Sdanset testdir [file dirname $argv0] 14e25ac099Sdansource $testdir/tester.tcl 15e25ac099Sdan 16e25ac099Sdanset ::testprefix fts3fault 17e25ac099Sdan 18acf1987dSdan# If SQLITE_ENABLE_FTS3 is not defined, omit this file. 19acf1987dSdanifcapable !fts3 { finish_test ; return } 20acf1987dSdan 21*a90579dbSdanif 0 { 22*a90579dbSdan 23e25ac099Sdan# Test error handling in the sqlite3Fts3Init() function. This is the 24e25ac099Sdan# function that registers the FTS3 module and various support functions 25e25ac099Sdan# with SQLite. 26e25ac099Sdan# 27e25ac099Sdando_faultsim_test 1 -body { 28e25ac099Sdan sqlite3 db test.db 29e25ac099Sdan expr 0 30e25ac099Sdan} -test { 31e25ac099Sdan catch { db close } 32e25ac099Sdan} 33e25ac099Sdan 34e25ac099Sdan# Test error handling in an "ALTER TABLE ... RENAME TO" statement on an 35e25ac099Sdan# FTS3 table. Specifically, test renaming the table within a transaction 36e25ac099Sdan# after it has been written to. 37e25ac099Sdan# 38e25ac099Sdanfaultsim_delete_and_reopen 39e25ac099Sdando_execsql_test 2.0 { 40e25ac099Sdan CREATE VIRTUAL TABLE t1 USING fts3; 41e25ac099Sdan INSERT INTO t1 VALUES('test renaming the table'); 42e25ac099Sdan INSERT INTO t1 VALUES(' after it has been written'); 43e25ac099Sdan} 44e25ac099Sdando_faultsim_test 2 -prep { 45e25ac099Sdan sqlite3 db test.db 46e25ac099Sdan execsql { 47e25ac099Sdan BEGIN; 48e25ac099Sdan INSERT INTO t1 VALUES('registers the FTS3 module'); 49e25ac099Sdan INSERT INTO t1 VALUES('various support functions'); 50e25ac099Sdan } 51e25ac099Sdan} -body { 52e25ac099Sdan execsql { ALTER TABLE t1 RENAME TO t2 } 53e25ac099Sdan} -test { 54e25ac099Sdan faultsim_test_result {0 {}} 55e25ac099Sdan} 56e25ac099Sdan 57e25ac099Sdan# Test error handling in the special case where a single prefix query 58e25ac099Sdan# matches terms that reside on a large range of leaf nodes. 59e25ac099Sdan# 60e25ac099Sdando_test fts3fault-3.0 { 61e25ac099Sdan sqlite3 db test.db 62e25ac099Sdan execsql { CREATE VIRTUAL TABLE t3 USING fts4; } 63e25ac099Sdan execsql { INSERT INTO t3(t3) VALUES('nodesize=50') } 64e25ac099Sdan execsql { BEGIN } 65e25ac099Sdan for {set i 0} {$i < 1000} {incr i} { 66e25ac099Sdan execsql { INSERT INTO t3 VALUES('aaa' || $i) } 67e25ac099Sdan } 68e25ac099Sdan execsql { COMMIT } 69e25ac099Sdan} {} 70e25ac099Sdan 71e25ac099Sdando_faultsim_test 3 -faults oom-transient -prep { 72e25ac099Sdan sqlite3 db test.db 73e25ac099Sdan execsql { SELECT * FROM t3 WHERE t3 MATCH 'x' } 74e25ac099Sdan} -body { 75e25ac099Sdan execsql { SELECT count(rowid) FROM t3 WHERE t3 MATCH 'aa*' } 76e25ac099Sdan} -test { 77e25ac099Sdan faultsim_test_result {0 1000} 78e25ac099Sdan} 79e25ac099Sdan 80e25ac099Sdando_test fts3fault-4.0 { 81e25ac099Sdan faultsim_delete_and_reopen 82e25ac099Sdan execsql { 83e25ac099Sdan CREATE VIRTUAL TABLE t4 USING fts4; 84e25ac099Sdan INSERT INTO t4 VALUES('The British Government called on'); 85e25ac099Sdan INSERT INTO t4 VALUES('as pesetas then became much'); 86e25ac099Sdan } 87e25ac099Sdan} {} 88e25ac099Sdanfaultsim_save_and_close 89e25ac099Sdando_faultsim_test 4 -prep { 90e25ac099Sdan faultsim_restore_and_reopen 91e25ac099Sdan execsql { SELECT content FROM t4 } 92e25ac099Sdan} -body { 93e25ac099Sdan execsql { SELECT optimize(t4) FROM t4 LIMIT 1 } 94e25ac099Sdan} -test { 95e25ac099Sdan faultsim_test_result {0 {{Index optimized}}} 96e25ac099Sdan} 97e25ac099Sdan 98e25ac099Sdando_test fts3fault-5.0 { 99e25ac099Sdan faultsim_delete_and_reopen 100e25ac099Sdan execsql { 101e25ac099Sdan CREATE VIRTUAL TABLE t5 USING fts4; 102e25ac099Sdan INSERT INTO t5 VALUES('The British Government called on'); 103e25ac099Sdan INSERT INTO t5 VALUES('as pesetas then became much'); 104e25ac099Sdan } 105e25ac099Sdan} {} 106e25ac099Sdanfaultsim_save_and_close 107e25ac099Sdando_faultsim_test 5 -prep { 108e25ac099Sdan faultsim_restore_and_reopen 109e25ac099Sdan execsql { 110e25ac099Sdan BEGIN; 111e25ac099Sdan INSERT INTO t5 VALUES('influential in shaping his future outlook'); 112e25ac099Sdan INSERT INTO t5 VALUES('might be acceptable to the British electorate'); 113e25ac099Sdan } 114e25ac099Sdan} -body { 115e25ac099Sdan execsql { SELECT rowid FROM t5 WHERE t5 MATCH 'british' } 116e25ac099Sdan} -test { 117e25ac099Sdan faultsim_test_result {0 {1 4}} 118e25ac099Sdan} 119e25ac099Sdan 120e25ac099Sdando_test fts3fault-6.0 { 121e25ac099Sdan faultsim_delete_and_reopen 122e25ac099Sdan execsql { CREATE VIRTUAL TABLE t6 USING fts4 } 123e25ac099Sdan} {} 124e25ac099Sdanfaultsim_save_and_close 125e25ac099Sdando_faultsim_test 6 -prep { 126e25ac099Sdan faultsim_restore_and_reopen 127e25ac099Sdan execsql { SELECT rowid FROM t6 } 128e25ac099Sdan} -body { 129e25ac099Sdan execsql { DROP TABLE t6 } 130e25ac099Sdan} -test { 131e25ac099Sdan faultsim_test_result {0 {}} 132e25ac099Sdan} 133e25ac099Sdan 134af4c214eSdan# Test various malloc failures while processing FTS4 parameters. 135af4c214eSdan# 136af4c214eSdando_faultsim_test 7.1 -prep { 137af4c214eSdan faultsim_delete_and_reopen 138af4c214eSdan} -body { 139af4c214eSdan execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchinfo=fts3) } 140af4c214eSdan} -test { 141af4c214eSdan faultsim_test_result {0 {}} 142af4c214eSdan} 143af4c214eSdando_faultsim_test 7.2 -prep { 144af4c214eSdan faultsim_delete_and_reopen 145af4c214eSdan} -body { 146af4c214eSdan execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchinfo=fs3) } 147af4c214eSdan} -test { 148af4c214eSdan faultsim_test_result {1 {unrecognized matchinfo: fs3}} \ 1499fc160c7Sdan {1 {vtable constructor failed: t1}} \ 1509fc160c7Sdan {1 {SQL logic error or missing database}} 151af4c214eSdan} 152af4c214eSdando_faultsim_test 7.3 -prep { 153af4c214eSdan faultsim_delete_and_reopen 154af4c214eSdan} -body { 155af4c214eSdan execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchnfo=fts3) } 156af4c214eSdan} -test { 157af4c214eSdan faultsim_test_result {1 {unrecognized parameter: matchnfo=fts3}} \ 1589fc160c7Sdan {1 {vtable constructor failed: t1}} \ 1599fc160c7Sdan {1 {SQL logic error or missing database}} 160c2f16cb1Sdan} 161c2f16cb1Sdan 162*a90579dbSdan 163*a90579dbSdan} 164*a90579dbSdan 165c2f16cb1Sdanproc mit {blob} { 166c2f16cb1Sdan set scan(littleEndian) i* 167c2f16cb1Sdan set scan(bigEndian) I* 168c2f16cb1Sdan binary scan $blob $scan($::tcl_platform(byteOrder)) r 169c2f16cb1Sdan return $r 170c2f16cb1Sdan} 171c2f16cb1Sdan 172c2f16cb1Sdando_test 8.0 { 173c2f16cb1Sdan faultsim_delete_and_reopen 174c2f16cb1Sdan execsql { CREATE VIRTUAL TABLE t8 USING fts4 } 175c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('a b c')" 176c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('b b b')" 177c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('[string repeat {c } 50000]')" 178c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('d d d')" 179c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('e e e')" 180c2f16cb1Sdan execsql "INSERT INTO t8(t8) VALUES('optimize')" 181c2f16cb1Sdan faultsim_save_and_close 182c2f16cb1Sdan} {} 183c2f16cb1Sdan 184*a90579dbSdando_faultsim_test 8.1 -faults oom-t* -prep { 185c2f16cb1Sdan faultsim_restore_and_reopen 186c2f16cb1Sdan db func mit mit 187c2f16cb1Sdan} -body { 188c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 'x')) FROM t8 WHERE t8 MATCH 'a b c' } 189c2f16cb1Sdan} -test { 190c2f16cb1Sdan faultsim_test_result {0 {{1 1 1 1 4 2 1 5 5}}} 191c2f16cb1Sdan} 192*a90579dbSdan 193c2f16cb1Sdando_faultsim_test 8.2 -faults oom-t* -prep { 194c2f16cb1Sdan faultsim_restore_and_reopen 195c2f16cb1Sdan db func mit mit 196c2f16cb1Sdan} -body { 197c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 's')) FROM t8 WHERE t8 MATCH 'a b c' } 198c2f16cb1Sdan} -test { 199c2f16cb1Sdan faultsim_test_result {0 3} 200c2f16cb1Sdan} 201c2f16cb1Sdando_faultsim_test 8.3 -prep { 202c2f16cb1Sdan faultsim_restore_and_reopen 203c2f16cb1Sdan db func mit mit 204c2f16cb1Sdan} -body { 205c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 'a')) FROM t8 WHERE t8 MATCH 'a b c' } 206c2f16cb1Sdan} -test { 207c2f16cb1Sdan faultsim_test_result {0 10002} 208c2f16cb1Sdan} 209c2f16cb1Sdando_faultsim_test 8.4 -prep { 210c2f16cb1Sdan faultsim_restore_and_reopen 211c2f16cb1Sdan db func mit mit 212c2f16cb1Sdan} -body { 213c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 'l')) FROM t8 WHERE t8 MATCH 'a b c' } 214c2f16cb1Sdan} -test { 215c2f16cb1Sdan faultsim_test_result {0 3} 216c2f16cb1Sdan} 217c2f16cb1Sdan 218c2f16cb1Sdando_test 9.0 { 219c2f16cb1Sdan faultsim_delete_and_reopen 220c2f16cb1Sdan execsql { 221c2f16cb1Sdan CREATE VIRTUAL TABLE t9 USING fts4(tokenize=porter); 222c2f16cb1Sdan INSERT INTO t9 VALUES( 223c2f16cb1Sdan 'this record is used toooooooooooooooooooooooooooooooooooooo try to' 224c2f16cb1Sdan ); 225c2f16cb1Sdan SELECT offsets(t9) FROM t9 WHERE t9 MATCH 'to*'; 226c2f16cb1Sdan } 227c2f16cb1Sdan faultsim_save_and_close 228c2f16cb1Sdan} {} 229c2f16cb1Sdando_faultsim_test 9.1 -prep { 230c2f16cb1Sdan faultsim_restore_and_reopen 231c2f16cb1Sdan} -body { 232c2f16cb1Sdan execsql { SELECT offsets(t9) FROM t9 WHERE t9 MATCH 'to*' } 233c2f16cb1Sdan} -test { 234c2f16cb1Sdan faultsim_test_result {0 {{0 0 20 39 0 0 64 2}}} 235c2f16cb1Sdan} 236c2f16cb1Sdan 237e25ac099Sdanfinish_test 238