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*c2f16cb1Sdanif 1 { 22*c2f16cb1Sdan 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}} \ 149af4c214eSdan {1 {vtable constructor failed: t1}} 150af4c214eSdan} 151af4c214eSdando_faultsim_test 7.3 -prep { 152af4c214eSdan faultsim_delete_and_reopen 153af4c214eSdan} -body { 154af4c214eSdan execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchnfo=fts3) } 155af4c214eSdan} -test { 156af4c214eSdan faultsim_test_result {1 {unrecognized parameter: matchnfo=fts3}} \ 157af4c214eSdan {1 {vtable constructor failed: t1}} 158af4c214eSdan} 159af4c214eSdan 160*c2f16cb1Sdan} 161*c2f16cb1Sdan 162*c2f16cb1Sdanproc mit {blob} { 163*c2f16cb1Sdan set scan(littleEndian) i* 164*c2f16cb1Sdan set scan(bigEndian) I* 165*c2f16cb1Sdan binary scan $blob $scan($::tcl_platform(byteOrder)) r 166*c2f16cb1Sdan return $r 167*c2f16cb1Sdan} 168*c2f16cb1Sdan 169*c2f16cb1Sdando_test 8.0 { 170*c2f16cb1Sdan faultsim_delete_and_reopen 171*c2f16cb1Sdan execsql { CREATE VIRTUAL TABLE t8 USING fts4 } 172*c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('a b c')" 173*c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('b b b')" 174*c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('[string repeat {c } 50000]')" 175*c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('d d d')" 176*c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('e e e')" 177*c2f16cb1Sdan execsql "INSERT INTO t8(t8) VALUES('optimize')" 178*c2f16cb1Sdan faultsim_save_and_close 179*c2f16cb1Sdan} {} 180*c2f16cb1Sdan 181*c2f16cb1Sdando_faultsim_test 8.1 -prep { 182*c2f16cb1Sdan faultsim_restore_and_reopen 183*c2f16cb1Sdan db func mit mit 184*c2f16cb1Sdan} -body { 185*c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 'x')) FROM t8 WHERE t8 MATCH 'a b c' } 186*c2f16cb1Sdan} -test { 187*c2f16cb1Sdan faultsim_test_result {0 {{1 1 1 1 4 2 1 5 5}}} 188*c2f16cb1Sdan} 189*c2f16cb1Sdando_faultsim_test 8.2 -faults oom-t* -prep { 190*c2f16cb1Sdan faultsim_restore_and_reopen 191*c2f16cb1Sdan db func mit mit 192*c2f16cb1Sdan} -body { 193*c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 's')) FROM t8 WHERE t8 MATCH 'a b c' } 194*c2f16cb1Sdan} -test { 195*c2f16cb1Sdan faultsim_test_result {0 3} 196*c2f16cb1Sdan} 197*c2f16cb1Sdando_faultsim_test 8.3 -prep { 198*c2f16cb1Sdan faultsim_restore_and_reopen 199*c2f16cb1Sdan db func mit mit 200*c2f16cb1Sdan} -body { 201*c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 'a')) FROM t8 WHERE t8 MATCH 'a b c' } 202*c2f16cb1Sdan} -test { 203*c2f16cb1Sdan faultsim_test_result {0 10002} 204*c2f16cb1Sdan} 205*c2f16cb1Sdando_faultsim_test 8.4 -prep { 206*c2f16cb1Sdan faultsim_restore_and_reopen 207*c2f16cb1Sdan db func mit mit 208*c2f16cb1Sdan} -body { 209*c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 'l')) FROM t8 WHERE t8 MATCH 'a b c' } 210*c2f16cb1Sdan} -test { 211*c2f16cb1Sdan faultsim_test_result {0 3} 212*c2f16cb1Sdan} 213*c2f16cb1Sdan 214*c2f16cb1Sdando_test 9.0 { 215*c2f16cb1Sdan faultsim_delete_and_reopen 216*c2f16cb1Sdan execsql { 217*c2f16cb1Sdan CREATE VIRTUAL TABLE t9 USING fts4(tokenize=porter); 218*c2f16cb1Sdan INSERT INTO t9 VALUES( 219*c2f16cb1Sdan 'this record is used toooooooooooooooooooooooooooooooooooooo try to' 220*c2f16cb1Sdan ); 221*c2f16cb1Sdan SELECT offsets(t9) FROM t9 WHERE t9 MATCH 'to*'; 222*c2f16cb1Sdan } 223*c2f16cb1Sdan faultsim_save_and_close 224*c2f16cb1Sdan} {} 225*c2f16cb1Sdando_faultsim_test 9.1 -prep { 226*c2f16cb1Sdan faultsim_restore_and_reopen 227*c2f16cb1Sdan} -body { 228*c2f16cb1Sdan execsql { SELECT offsets(t9) FROM t9 WHERE t9 MATCH 'to*' } 229*c2f16cb1Sdan} -test { 230*c2f16cb1Sdan faultsim_test_result {0 {{0 0 20 39 0 0 64 2}}} 231*c2f16cb1Sdan} 232*c2f16cb1Sdan 233e25ac099Sdanfinish_test 234