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 21e25ac099Sdan# Test error handling in the sqlite3Fts3Init() function. This is the 22e25ac099Sdan# function that registers the FTS3 module and various support functions 23e25ac099Sdan# with SQLite. 24e25ac099Sdan# 25e25ac099Sdando_faultsim_test 1 -body { 26e25ac099Sdan sqlite3 db test.db 27e25ac099Sdan expr 0 28e25ac099Sdan} -test { 29e25ac099Sdan catch { db close } 30e25ac099Sdan} 31e25ac099Sdan 32e25ac099Sdan# Test error handling in an "ALTER TABLE ... RENAME TO" statement on an 33e25ac099Sdan# FTS3 table. Specifically, test renaming the table within a transaction 34e25ac099Sdan# after it has been written to. 35e25ac099Sdan# 36e25ac099Sdanfaultsim_delete_and_reopen 37e25ac099Sdando_execsql_test 2.0 { 38e25ac099Sdan CREATE VIRTUAL TABLE t1 USING fts3; 39e25ac099Sdan INSERT INTO t1 VALUES('test renaming the table'); 40e25ac099Sdan INSERT INTO t1 VALUES(' after it has been written'); 41e25ac099Sdan} 42e25ac099Sdando_faultsim_test 2 -prep { 43e25ac099Sdan sqlite3 db test.db 44e25ac099Sdan execsql { 45e25ac099Sdan BEGIN; 46e25ac099Sdan INSERT INTO t1 VALUES('registers the FTS3 module'); 47e25ac099Sdan INSERT INTO t1 VALUES('various support functions'); 48e25ac099Sdan } 49e25ac099Sdan} -body { 50e25ac099Sdan execsql { ALTER TABLE t1 RENAME TO t2 } 51e25ac099Sdan} -test { 52e25ac099Sdan faultsim_test_result {0 {}} 53e25ac099Sdan} 54e25ac099Sdan 55e25ac099Sdan# Test error handling in the special case where a single prefix query 56e25ac099Sdan# matches terms that reside on a large range of leaf nodes. 57e25ac099Sdan# 58e25ac099Sdando_test fts3fault-3.0 { 59e25ac099Sdan sqlite3 db test.db 60e25ac099Sdan execsql { CREATE VIRTUAL TABLE t3 USING fts4; } 61e25ac099Sdan execsql { INSERT INTO t3(t3) VALUES('nodesize=50') } 62e25ac099Sdan execsql { BEGIN } 63e25ac099Sdan for {set i 0} {$i < 1000} {incr i} { 64e25ac099Sdan execsql { INSERT INTO t3 VALUES('aaa' || $i) } 65e25ac099Sdan } 66e25ac099Sdan execsql { COMMIT } 67e25ac099Sdan} {} 68e25ac099Sdan 69e25ac099Sdando_faultsim_test 3 -faults oom-transient -prep { 70e25ac099Sdan sqlite3 db test.db 71e25ac099Sdan execsql { SELECT * FROM t3 WHERE t3 MATCH 'x' } 72e25ac099Sdan} -body { 73e25ac099Sdan execsql { SELECT count(rowid) FROM t3 WHERE t3 MATCH 'aa*' } 74e25ac099Sdan} -test { 75e25ac099Sdan faultsim_test_result {0 1000} 76e25ac099Sdan} 77e25ac099Sdan 78e25ac099Sdando_test fts3fault-4.0 { 79e25ac099Sdan faultsim_delete_and_reopen 80e25ac099Sdan execsql { 81e25ac099Sdan CREATE VIRTUAL TABLE t4 USING fts4; 82e25ac099Sdan INSERT INTO t4 VALUES('The British Government called on'); 83e25ac099Sdan INSERT INTO t4 VALUES('as pesetas then became much'); 84e25ac099Sdan } 85e25ac099Sdan} {} 86e25ac099Sdanfaultsim_save_and_close 87e25ac099Sdando_faultsim_test 4 -prep { 88e25ac099Sdan faultsim_restore_and_reopen 89e25ac099Sdan execsql { SELECT content FROM t4 } 90e25ac099Sdan} -body { 91e25ac099Sdan execsql { SELECT optimize(t4) FROM t4 LIMIT 1 } 92e25ac099Sdan} -test { 93e25ac099Sdan faultsim_test_result {0 {{Index optimized}}} 94e25ac099Sdan} 95e25ac099Sdan 96e25ac099Sdando_test fts3fault-5.0 { 97e25ac099Sdan faultsim_delete_and_reopen 98e25ac099Sdan execsql { 99e25ac099Sdan CREATE VIRTUAL TABLE t5 USING fts4; 100e25ac099Sdan INSERT INTO t5 VALUES('The British Government called on'); 101e25ac099Sdan INSERT INTO t5 VALUES('as pesetas then became much'); 102e25ac099Sdan } 103e25ac099Sdan} {} 104e25ac099Sdanfaultsim_save_and_close 105e25ac099Sdando_faultsim_test 5 -prep { 106e25ac099Sdan faultsim_restore_and_reopen 107e25ac099Sdan execsql { 108e25ac099Sdan BEGIN; 109e25ac099Sdan INSERT INTO t5 VALUES('influential in shaping his future outlook'); 110e25ac099Sdan INSERT INTO t5 VALUES('might be acceptable to the British electorate'); 111e25ac099Sdan } 112e25ac099Sdan} -body { 113e25ac099Sdan execsql { SELECT rowid FROM t5 WHERE t5 MATCH 'british' } 114e25ac099Sdan} -test { 115e25ac099Sdan faultsim_test_result {0 {1 4}} 116e25ac099Sdan} 117e25ac099Sdan 118e25ac099Sdando_test fts3fault-6.0 { 119e25ac099Sdan faultsim_delete_and_reopen 120e25ac099Sdan execsql { CREATE VIRTUAL TABLE t6 USING fts4 } 121e25ac099Sdan} {} 122e25ac099Sdanfaultsim_save_and_close 123e25ac099Sdando_faultsim_test 6 -prep { 124e25ac099Sdan faultsim_restore_and_reopen 125e25ac099Sdan execsql { SELECT rowid FROM t6 } 126e25ac099Sdan} -body { 127e25ac099Sdan execsql { DROP TABLE t6 } 128e25ac099Sdan} -test { 129e25ac099Sdan faultsim_test_result {0 {}} 130e25ac099Sdan} 131e25ac099Sdan 132af4c214eSdan# Test various malloc failures while processing FTS4 parameters. 133af4c214eSdan# 134af4c214eSdando_faultsim_test 7.1 -prep { 135af4c214eSdan faultsim_delete_and_reopen 136af4c214eSdan} -body { 137af4c214eSdan execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchinfo=fts3) } 138af4c214eSdan} -test { 139af4c214eSdan faultsim_test_result {0 {}} 140af4c214eSdan} 141af4c214eSdando_faultsim_test 7.2 -prep { 142af4c214eSdan faultsim_delete_and_reopen 143af4c214eSdan} -body { 144af4c214eSdan execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchinfo=fs3) } 145af4c214eSdan} -test { 146af4c214eSdan faultsim_test_result {1 {unrecognized matchinfo: fs3}} \ 1479fc160c7Sdan {1 {vtable constructor failed: t1}} \ 148a690ff36Sdrh {1 {SQL logic error}} 149af4c214eSdan} 150af4c214eSdando_faultsim_test 7.3 -prep { 151af4c214eSdan faultsim_delete_and_reopen 152af4c214eSdan} -body { 153af4c214eSdan execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchnfo=fts3) } 154af4c214eSdan} -test { 155af4c214eSdan faultsim_test_result {1 {unrecognized parameter: matchnfo=fts3}} \ 1569fc160c7Sdan {1 {vtable constructor failed: t1}} \ 157a690ff36Sdrh {1 {SQL logic error}} 158c2f16cb1Sdan} 159c2f16cb1Sdan 160a90579dbSdan 161c2f16cb1Sdanproc mit {blob} { 162c2f16cb1Sdan set scan(littleEndian) i* 163c2f16cb1Sdan set scan(bigEndian) I* 164c2f16cb1Sdan binary scan $blob $scan($::tcl_platform(byteOrder)) r 165c2f16cb1Sdan return $r 166c2f16cb1Sdan} 167c2f16cb1Sdan 168c2f16cb1Sdando_test 8.0 { 169c2f16cb1Sdan faultsim_delete_and_reopen 170c2f16cb1Sdan execsql { CREATE VIRTUAL TABLE t8 USING fts4 } 171c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('a b c')" 172c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('b b b')" 173c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('[string repeat {c } 50000]')" 174c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('d d d')" 175c2f16cb1Sdan execsql "INSERT INTO t8 VALUES('e e e')" 176c2f16cb1Sdan execsql "INSERT INTO t8(t8) VALUES('optimize')" 177c2f16cb1Sdan faultsim_save_and_close 178c2f16cb1Sdan} {} 179c2f16cb1Sdan 1807b458519Sdanifcapable fts4_deferred { 181a90579dbSdan do_faultsim_test 8.1 -faults oom-t* -prep { 182c2f16cb1Sdan faultsim_restore_and_reopen 183c2f16cb1Sdan db func mit mit 184c2f16cb1Sdan } -body { 185c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 'x')) FROM t8 WHERE t8 MATCH 'a b c' } 186c2f16cb1Sdan } -test { 187c2f16cb1Sdan faultsim_test_result {0 {{1 1 1 1 4 2 1 5 5}}} 188c2f16cb1Sdan } 1897b458519Sdan} 190a90579dbSdan 191c2f16cb1Sdando_faultsim_test 8.2 -faults oom-t* -prep { 192c2f16cb1Sdan faultsim_restore_and_reopen 193c2f16cb1Sdan db func mit mit 194c2f16cb1Sdan} -body { 195c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 's')) FROM t8 WHERE t8 MATCH 'a b c' } 196c2f16cb1Sdan} -test { 197c2f16cb1Sdan faultsim_test_result {0 3} 198c2f16cb1Sdan} 199c2f16cb1Sdando_faultsim_test 8.3 -prep { 200c2f16cb1Sdan faultsim_restore_and_reopen 201c2f16cb1Sdan db func mit mit 202c2f16cb1Sdan} -body { 203c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 'a')) FROM t8 WHERE t8 MATCH 'a b c' } 204c2f16cb1Sdan} -test { 205c2f16cb1Sdan faultsim_test_result {0 10002} 206c2f16cb1Sdan} 207c2f16cb1Sdando_faultsim_test 8.4 -prep { 208c2f16cb1Sdan faultsim_restore_and_reopen 209c2f16cb1Sdan db func mit mit 210c2f16cb1Sdan} -body { 211c2f16cb1Sdan execsql { SELECT mit(matchinfo(t8, 'l')) FROM t8 WHERE t8 MATCH 'a b c' } 212c2f16cb1Sdan} -test { 213c2f16cb1Sdan faultsim_test_result {0 3} 214c2f16cb1Sdan} 215c2f16cb1Sdan 216c2f16cb1Sdando_test 9.0 { 217c2f16cb1Sdan faultsim_delete_and_reopen 218c2f16cb1Sdan execsql { 219c2f16cb1Sdan CREATE VIRTUAL TABLE t9 USING fts4(tokenize=porter); 220c2f16cb1Sdan INSERT INTO t9 VALUES( 221c2f16cb1Sdan 'this record is used toooooooooooooooooooooooooooooooooooooo try to' 222c2f16cb1Sdan ); 223c2f16cb1Sdan SELECT offsets(t9) FROM t9 WHERE t9 MATCH 'to*'; 224c2f16cb1Sdan } 225c2f16cb1Sdan faultsim_save_and_close 226c2f16cb1Sdan} {} 227c2f16cb1Sdando_faultsim_test 9.1 -prep { 228c2f16cb1Sdan faultsim_restore_and_reopen 229c2f16cb1Sdan} -body { 230c2f16cb1Sdan execsql { SELECT offsets(t9) FROM t9 WHERE t9 MATCH 'to*' } 231c2f16cb1Sdan} -test { 232c2f16cb1Sdan faultsim_test_result {0 {{0 0 20 39 0 0 64 2}}} 233c2f16cb1Sdan} 234c2f16cb1Sdan 235ddf47470Sdando_faultsim_test 10.1 -prep { 236ddf47470Sdan faultsim_delete_and_reopen 237ddf47470Sdan} -body { 238ddf47470Sdan execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, languageid=d) } 239ddf47470Sdan} -test { 240ddf47470Sdan faultsim_test_result {0 {}} 241ddf47470Sdan} 242ddf47470Sdan 243*12937155Sdan#------------------------------------------------------------------------- 244*12937155Sdanreset_db 245*12937155Sdando_execsql_test 11.0 { 246*12937155Sdan CREATE VIRTUAL TABLE t1 USING fts3(a, b); 247*12937155Sdan} 248*12937155Sdanfaultsim_save_and_close 249*12937155Sdan 250*12937155Sdando_faultsim_test 11 -faults oom* -prep { 251*12937155Sdan faultsim_restore_and_reopen 252*12937155Sdan} -body { 253*12937155Sdan execsql { DROP TABLE t1 } 254*12937155Sdan} -test { 255*12937155Sdan faultsim_test_result {0 {}} 256*12937155Sdan} 257*12937155Sdan 258*12937155Sdan 259e25ac099Sdanfinish_test 260