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