| # 2010 June 15 |
| # |
| # The author disclaims copyright to this source code. In place of |
| # a legal notice, here is a blessing: |
| # |
| # May you do good and not evil. |
| # May you find forgiveness for yourself and forgive others. |
| # May you share freely, never taking more than you give. |
| # |
| #*********************************************************************** |
| # |
| |
| source [file join [file dirname [info script]] fts5_common.tcl] |
| source $testdir/malloc_common.tcl |
| set testprefix fts5faultI |
| |
| # If SQLITE_ENABLE_FTS5 is not defined, omit this file. |
| ifcapable !fts5 { |
| finish_test |
| return |
| } |
| |
| set ::testprefix fts5faultI |
| |
| do_execsql_test 1.0 { |
| PRAGMA encoding = utf16; |
| CREATE VIRTUAL TABLE t1 USING fts5(x, locale=1); |
| INSERT INTO t1 VALUES('origintext unicode61 ascii porter trigram'); |
| } |
| |
| faultsim_save_and_close |
| faultsim_restore_and_reopen |
| |
| do_faultsim_test 1 -faults oom* -prep { |
| } -body { |
| execsql { |
| SELECT rowid FROM t1(fts5_locale('en_US', 'origintext')); |
| } |
| } -test { |
| faultsim_test_result {0 1} |
| } |
| |
| do_faultsim_test 2 -faults oom* -prep { |
| faultsim_restore_and_reopen |
| execsql { |
| SELECT * FROM t1('ascii'); |
| } |
| } -body { |
| execsql { |
| UPDATE t1 SET rowid=rowid+1; |
| } |
| } -test { |
| faultsim_test_result {0 {}} |
| } |
| |
| fts5_aux_test_functions db |
| do_faultsim_test 3 -faults oom* -prep { |
| } -body { |
| execsql { |
| SELECT fts5_columnlocale(t1, 0) FROM t1('unicode*'); |
| } |
| } -test { |
| faultsim_test_result {0 {{}}} {1 SQLITE_NOMEM} |
| } |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| do_execsql_test 4.0 { |
| CREATE VIRTUAL TABLE w1 USING fts5(a); |
| } |
| faultsim_save_and_close |
| |
| do_faultsim_test 4 -faults oom* -prep { |
| faultsim_restore_and_reopen |
| execsql { |
| BEGIN; |
| INSERT INTO w1 VALUES('token token token'); |
| } |
| } -body { |
| execsql { |
| INSERT INTO w1(w1, rank) VALUES('rank', 'bm25()'); |
| } |
| } -test { |
| faultsim_test_result {0 {}} |
| } |
| |
| do_faultsim_test 5 -faults oom* -prep { |
| faultsim_restore_and_reopen |
| execsql { |
| BEGIN; |
| INSERT INTO w1 VALUES('one'); |
| SAVEPOINT one; |
| INSERT INTO w1 VALUES('two'); |
| ROLLBACK TO one; |
| } |
| |
| } -body { |
| execsql { |
| INSERT INTO w1 VALUES('string'); |
| } |
| } -test { |
| faultsim_test_result {0 {}} |
| } |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| do_execsql_test 5.0 { |
| CREATE VIRTUAL TABLE w1 USING fts5(a); |
| INSERT INTO w1 VALUES('one two three'); |
| } |
| fts5_aux_test_functions db |
| |
| do_faultsim_test 5 -faults oom* -prep { |
| } -body { |
| execsql { |
| SELECT fts5_test_insttoken(w1, 0, 0) FROM w1('two'); |
| } |
| } -test { |
| faultsim_test_result {0 two} {1 SQLITE_NOMEM} |
| } |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| do_execsql_test 6.0 { |
| CREATE VIRTUAL TABLE w1 USING fts5(a); |
| INSERT INTO w1 VALUES('one two three'); |
| } |
| fts5_aux_test_functions db |
| faultsim_save_and_close |
| |
| do_faultsim_test 6 -faults oom* -prep { |
| faultsim_restore_and_reopen |
| db eval { |
| BEGIN; |
| INSERT INTO w1 VALUES('four five six'); |
| SAVEPOINT abc; |
| INSERT INTO w1 VALUES('seven eight nine'); |
| SAVEPOINT def; |
| INSERT INTO w1 VALUES('ten eleven twelve'); |
| } |
| } -body { |
| execsql { |
| RELEASE abc; |
| } |
| } -test { |
| faultsim_test_result {0 {}} |
| } |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| do_execsql_test 7.0 { |
| CREATE VIRTUAL TABLE w1 USING fts5(a); |
| INSERT INTO w1 VALUES('one two three'); |
| INSERT INTO w1 VALUES('three two one'); |
| DELETE FROM w1_content WHERE rowid=1; |
| } |
| |
| faultsim_save_and_close |
| |
| do_faultsim_test 7 -faults oom* -prep { |
| faultsim_restore_and_reopen |
| db eval { SELECT * FROM w1 } |
| } -body { |
| execsql { |
| PRAGMA integrity_check; |
| } |
| } -test { |
| } |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| fts5_tclnum_register db |
| fts5_aux_test_functions db |
| |
| do_execsql_test 8.0 { |
| CREATE VIRTUAL TABLE ft USING fts5( |
| x, tokenize = "tclnum query", detail=columns |
| ); |
| INSERT INTO ft VALUES('one two three i ii iii'); |
| INSERT INTO ft VALUES('four five six iv v vi'); |
| INSERT INTO ft VALUES('eight nine ten viii ix x'); |
| } {} |
| |
| do_faultsim_test 8.1 -faults oom* -prep { |
| } -body { |
| execsql { |
| SELECT fts5_test_collist (ft) FROM ft('one two'); |
| } |
| } -test { |
| faultsim_test_result {0 {{0.0 1.0}}} {1 {SQL logic error}} {1 SQLITE_NOMEM} |
| } |
| |
| do_faultsim_test 8.2 -faults oom* -prep { |
| } -body { |
| execsql { |
| SELECT rowid FROM ft('one two') ORDER BY rank; |
| } |
| } -test { |
| faultsim_test_result {0 1} {1 {SQL logic error}} {1 SQLITE_NOMEM} |
| } |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| |
| do_execsql_test 9.0 { |
| CREATE VIRTUAL TABLE ft USING fts5(x); |
| INSERT INTO ft VALUES('one two three i ii iii'); |
| INSERT INTO ft VALUES('four five six iv v vi'); |
| INSERT INTO ft VALUES('eight nine ten viii ix x'); |
| } {} |
| |
| faultsim_save_and_close |
| |
| do_faultsim_test 9.1 -faults oom* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| UPDATE ft SET rowid=4 WHERE rowid=1 |
| } |
| } -test { |
| faultsim_test_result {0 {}} |
| } |
| |
| do_faultsim_test 9.2 -faults oom* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| SELECT rowid FROM ft WHERE x MATCH 'one AND two AND three' |
| } |
| } -test { |
| faultsim_test_result {0 1} |
| } |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| |
| do_execsql_test 10.0 { |
| CREATE VIRTUAL TABLE ft USING fts5(x, locale=1); |
| INSERT INTO ft VALUES(fts5_locale('hello', 'one two three i ii iii')); |
| INSERT INTO ft VALUES('four five six iv v vi'); |
| INSERT INTO ft VALUES('eight nine ten viii ix x'); |
| } {} |
| |
| do_execsql_test 10.1 { |
| SELECT fts5_get_locale(ft, 0) FROM ft WHERE x MATCH 'one AND two AND three' |
| } {hello} |
| |
| faultsim_save_and_close |
| do_faultsim_test 10.1 -faults oom* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| SELECT fts5_get_locale(ft, 0) FROM ft WHERE x MATCH 'one AND two AND three' |
| } |
| } -test { |
| faultsim_test_result {0 hello} |
| } |
| |
| breakpoint |
| faultsim_save_and_close |
| do_faultsim_test 10.2 -faults oom-t* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| INSERT INTO ft VALUES(zeroblob(10000)); |
| } |
| } -test { |
| faultsim_test_result {0 {}} |
| } |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| |
| do_execsql_test 11.0 { |
| CREATE VIRTUAL TABLE f1 USING fts5(content); |
| CREATE TABLE g1(id, content); |
| INSERT INTO g1 VALUES(30000, 'a b c'); |
| INSERT INTO g1 VALUES(40000, 'd e f'); |
| } |
| |
| faultsim_save_and_close |
| |
| do_faultsim_test 11 -faults oom* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| INSERT INTO f1(rowid, content) SELECT id, content FROM g1; |
| } |
| } -test { |
| faultsim_test_result {0 {}} |
| } |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| |
| ifcapable foreignkey { |
| do_execsql_test 12.0 { |
| CREATE VIRTUAL TABLE f1 USING fts5(content); |
| CREATE TABLE p1(a INTEGER PRIMARY KEY); |
| CREATE TABLE c1(b REFERENCES p1 DEFERRABLE INITIALLY DEFERRED); |
| } |
| |
| faultsim_save_and_close |
| |
| do_faultsim_test 11 -faults oom* -prep { |
| faultsim_restore_and_reopen |
| execsql { |
| PRAGMA foreign_keys = 1; |
| BEGIN; |
| INSERT INTO c1 VALUES(123); |
| SAVEPOINT xyz; |
| } |
| } -body { |
| execsql { |
| INSERT INTO f1 VALUES('a b c'); |
| ROLLBACK TO xyz; |
| COMMIT; |
| } |
| } -test { |
| execsql { SELECT 123 } |
| faultsim_test_result \ |
| {1 {FOREIGN KEY constraint failed}} \ |
| {1 {out of memory}} \ |
| {1 {constraint failed}} |
| } |
| } |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| |
| do_execsql_test 13.0 { |
| CREATE VIRTUAL TABLE t1 USING fts5(a, b); |
| INSERT INTO t1 VALUES('abc def', X'123456'); |
| } |
| faultsim_save_and_close |
| |
| |
| do_faultsim_test 13 -faults oom* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| UPDATE t1 SET a='def abc' |
| } |
| } -test { |
| faultsim_test_result {0 {}} |
| } |
| |
| finish_test |
| |