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 18e25ac099Sdan# Test error handling in the sqlite3Fts3Init() function. This is the 19e25ac099Sdan# function that registers the FTS3 module and various support functions 20e25ac099Sdan# with SQLite. 21e25ac099Sdan# 22e25ac099Sdando_faultsim_test 1 -body { 23e25ac099Sdan sqlite3 db test.db 24e25ac099Sdan expr 0 25e25ac099Sdan} -test { 26e25ac099Sdan catch { db close } 27e25ac099Sdan} 28e25ac099Sdan 29e25ac099Sdan# Test error handling in an "ALTER TABLE ... RENAME TO" statement on an 30e25ac099Sdan# FTS3 table. Specifically, test renaming the table within a transaction 31e25ac099Sdan# after it has been written to. 32e25ac099Sdan# 33e25ac099Sdanfaultsim_delete_and_reopen 34e25ac099Sdando_execsql_test 2.0 { 35e25ac099Sdan CREATE VIRTUAL TABLE t1 USING fts3; 36e25ac099Sdan INSERT INTO t1 VALUES('test renaming the table'); 37e25ac099Sdan INSERT INTO t1 VALUES(' after it has been written'); 38e25ac099Sdan} 39e25ac099Sdando_faultsim_test 2 -prep { 40e25ac099Sdan sqlite3 db test.db 41e25ac099Sdan execsql { 42e25ac099Sdan BEGIN; 43e25ac099Sdan INSERT INTO t1 VALUES('registers the FTS3 module'); 44e25ac099Sdan INSERT INTO t1 VALUES('various support functions'); 45e25ac099Sdan } 46e25ac099Sdan} -body { 47e25ac099Sdan execsql { ALTER TABLE t1 RENAME TO t2 } 48e25ac099Sdan} -test { 49e25ac099Sdan faultsim_test_result {0 {}} 50e25ac099Sdan} 51e25ac099Sdan 52e25ac099Sdan# Test error handling in the special case where a single prefix query 53e25ac099Sdan# matches terms that reside on a large range of leaf nodes. 54e25ac099Sdan# 55e25ac099Sdando_test fts3fault-3.0 { 56e25ac099Sdan sqlite3 db test.db 57e25ac099Sdan execsql { CREATE VIRTUAL TABLE t3 USING fts4; } 58e25ac099Sdan execsql { INSERT INTO t3(t3) VALUES('nodesize=50') } 59e25ac099Sdan execsql { BEGIN } 60e25ac099Sdan for {set i 0} {$i < 1000} {incr i} { 61e25ac099Sdan execsql { INSERT INTO t3 VALUES('aaa' || $i) } 62e25ac099Sdan } 63e25ac099Sdan execsql { COMMIT } 64e25ac099Sdan} {} 65e25ac099Sdan 66e25ac099Sdando_faultsim_test 3 -faults oom-transient -prep { 67e25ac099Sdan sqlite3 db test.db 68e25ac099Sdan execsql { SELECT * FROM t3 WHERE t3 MATCH 'x' } 69e25ac099Sdan} -body { 70e25ac099Sdan execsql { SELECT count(rowid) FROM t3 WHERE t3 MATCH 'aa*' } 71e25ac099Sdan} -test { 72e25ac099Sdan faultsim_test_result {0 1000} 73e25ac099Sdan} 74e25ac099Sdan 75e25ac099Sdando_test fts3fault-4.0 { 76e25ac099Sdan faultsim_delete_and_reopen 77e25ac099Sdan execsql { 78e25ac099Sdan CREATE VIRTUAL TABLE t4 USING fts4; 79e25ac099Sdan INSERT INTO t4 VALUES('The British Government called on'); 80e25ac099Sdan INSERT INTO t4 VALUES('as pesetas then became much'); 81e25ac099Sdan } 82e25ac099Sdan} {} 83e25ac099Sdanfaultsim_save_and_close 84e25ac099Sdando_faultsim_test 4 -prep { 85e25ac099Sdan faultsim_restore_and_reopen 86e25ac099Sdan execsql { SELECT content FROM t4 } 87e25ac099Sdan} -body { 88e25ac099Sdan execsql { SELECT optimize(t4) FROM t4 LIMIT 1 } 89e25ac099Sdan} -test { 90e25ac099Sdan faultsim_test_result {0 {{Index optimized}}} 91e25ac099Sdan} 92e25ac099Sdan 93e25ac099Sdando_test fts3fault-5.0 { 94e25ac099Sdan faultsim_delete_and_reopen 95e25ac099Sdan execsql { 96e25ac099Sdan CREATE VIRTUAL TABLE t5 USING fts4; 97e25ac099Sdan INSERT INTO t5 VALUES('The British Government called on'); 98e25ac099Sdan INSERT INTO t5 VALUES('as pesetas then became much'); 99e25ac099Sdan } 100e25ac099Sdan} {} 101e25ac099Sdanfaultsim_save_and_close 102e25ac099Sdando_faultsim_test 5 -prep { 103e25ac099Sdan faultsim_restore_and_reopen 104e25ac099Sdan execsql { 105e25ac099Sdan BEGIN; 106e25ac099Sdan INSERT INTO t5 VALUES('influential in shaping his future outlook'); 107e25ac099Sdan INSERT INTO t5 VALUES('might be acceptable to the British electorate'); 108e25ac099Sdan } 109e25ac099Sdan} -body { 110e25ac099Sdan execsql { SELECT rowid FROM t5 WHERE t5 MATCH 'british' } 111e25ac099Sdan} -test { 112e25ac099Sdan faultsim_test_result {0 {1 4}} 113e25ac099Sdan} 114e25ac099Sdan 115e25ac099Sdando_test fts3fault-6.0 { 116e25ac099Sdan faultsim_delete_and_reopen 117e25ac099Sdan execsql { CREATE VIRTUAL TABLE t6 USING fts4 } 118e25ac099Sdan} {} 119e25ac099Sdanfaultsim_save_and_close 120e25ac099Sdando_faultsim_test 6 -prep { 121e25ac099Sdan faultsim_restore_and_reopen 122e25ac099Sdan execsql { SELECT rowid FROM t6 } 123e25ac099Sdan} -body { 124e25ac099Sdan execsql { DROP TABLE t6 } 125e25ac099Sdan} -test { 126e25ac099Sdan faultsim_test_result {0 {}} 127e25ac099Sdan} 128e25ac099Sdan 129*af4c214eSdan# Test various malloc failures while processing FTS4 parameters. 130*af4c214eSdan# 131*af4c214eSdando_faultsim_test 7.1 -prep { 132*af4c214eSdan faultsim_delete_and_reopen 133*af4c214eSdan} -body { 134*af4c214eSdan execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchinfo=fts3) } 135*af4c214eSdan} -test { 136*af4c214eSdan faultsim_test_result {0 {}} 137*af4c214eSdan} 138*af4c214eSdando_faultsim_test 7.2 -prep { 139*af4c214eSdan faultsim_delete_and_reopen 140*af4c214eSdan} -body { 141*af4c214eSdan execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchinfo=fs3) } 142*af4c214eSdan} -test { 143*af4c214eSdan faultsim_test_result {1 {unrecognized matchinfo: fs3}} \ 144*af4c214eSdan {1 {vtable constructor failed: t1}} 145*af4c214eSdan} 146*af4c214eSdando_faultsim_test 7.3 -prep { 147*af4c214eSdan faultsim_delete_and_reopen 148*af4c214eSdan} -body { 149*af4c214eSdan execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchnfo=fts3) } 150*af4c214eSdan} -test { 151*af4c214eSdan faultsim_test_result {1 {unrecognized parameter: matchnfo=fts3}} \ 152*af4c214eSdan {1 {vtable constructor failed: t1}} 153*af4c214eSdan} 154*af4c214eSdan 155e25ac099Sdanfinish_test 156