# 2014 June 17 # # 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. # #************************************************************************* # # This file is focused on OOM errors. # source [file join [file dirname [info script]] fts5_common.tcl] source $testdir/malloc_common.tcl set testprefix fts5fault3 # If SQLITE_ENABLE_FTS3 is defined, omit this file. ifcapable !fts5 { finish_test return } #------------------------------------------------------------------------- # An OOM while resuming a partially completed segment merge. # db func rnddoc fts5_rnddoc do_test 1.0 { expr srand(0) execsql { CREATE VIRTUAL TABLE xx USING fts5(x); INSERT INTO xx(xx, rank) VALUES('pgsz', 32); INSERT INTO xx(xx, rank) VALUES('automerge', 16); } for {set i 0} {$i < 10} {incr i} { execsql { BEGIN; INSERT INTO xx(x) VALUES(rnddoc(20)); INSERT INTO xx(x) VALUES(rnddoc(20)); INSERT INTO xx(x) VALUES(rnddoc(20)); COMMIT } } execsql { INSERT INTO xx(xx, rank) VALUES('automerge', 2); INSERT INTO xx(xx, rank) VALUES('merge', 50); } } {} faultsim_save_and_close do_faultsim_test 1 -faults oom-* -prep { faultsim_restore_and_reopen } -body { execsql { INSERT INTO xx(xx, rank) VALUES('merge', 1) } } -test { faultsim_test_result [list 0 {}] } #------------------------------------------------------------------------- # An OOM while flushing an unusually large term to disk. # reset_db do_execsql_test 2.0 { CREATE VIRTUAL TABLE xx USING fts5(x); INSERT INTO xx(xx, rank) VALUES('pgsz', 32); } faultsim_save_and_close set doc "a long term abcdefghijklmnopqrstuvwxyz " append doc "and then abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz " append doc [string repeat "abcdefghijklmnopqrstuvwxyz" 10] do_faultsim_test 2 -faults oom-* -prep { faultsim_restore_and_reopen } -body { execsql { INSERT INTO xx(x) VALUES ($::doc) } } -test { faultsim_test_result [list 0 {}] } #------------------------------------------------------------------------- # An OOM while flushing an unusually large term to disk. # reset_db do_execsql_test 3.0 { CREATE VIRTUAL TABLE xx USING fts5(x); } faultsim_save_and_close set doc [fts5_rnddoc 1000] do_faultsim_test 3.1 -faults oom-* -prep { faultsim_restore_and_reopen } -body { execsql { INSERT INTO xx(x) VALUES ($::doc) } } -test { faultsim_test_result [list 0 {}] } set doc [string repeat "abc " 100] do_faultsim_test 3.2 -faults oom-* -prep { faultsim_restore_and_reopen } -body { execsql { INSERT INTO xx(x) VALUES ($::doc) } } -test { faultsim_test_result [list 0 {}] } finish_test