1*789efdb9Sdan# 2013-05-23 2*789efdb9Sdan# 3*789efdb9Sdan# The author disclaims copyright to this source code. In place of 4*789efdb9Sdan# a legal notice, here is a blessing: 5*789efdb9Sdan# 6*789efdb9Sdan# May you do good and not evil. 7*789efdb9Sdan# May you find forgiveness for yourself and forgive others. 8*789efdb9Sdan# May you share freely, never taking more than you give. 9*789efdb9Sdan# 10*789efdb9Sdan#*********************************************************************** 11*789efdb9Sdan# 12*789efdb9Sdan 13*789efdb9Sdanset testdir [file dirname $argv0] 14*789efdb9Sdansource $testdir/tester.tcl 15*789efdb9Sdansource $testdir/malloc_common.tcl 16*789efdb9Sdanifcapable !mmap { 17*789efdb9Sdan finish_test 18*789efdb9Sdan return 19*789efdb9Sdan} 20*789efdb9Sdanset testprefix mmapfault 21*789efdb9Sdan 22*789efdb9Sdanset a_string_counter 1 23*789efdb9Sdanproc a_string {n} { 24*789efdb9Sdan global a_string_counter 25*789efdb9Sdan incr a_string_counter 26*789efdb9Sdan string range [string repeat "${a_string_counter}." $n] 1 $n 27*789efdb9Sdan} 28*789efdb9Sdandb func a_string a_string 29*789efdb9Sdan 30*789efdb9Sdando_test 1-pre { 31*789efdb9Sdan execsql { 32*789efdb9Sdan CREATE TABLE t1(a UNIQUE, b UNIQUE); 33*789efdb9Sdan INSERT INTO t1 VALUES(a_string(200), a_string(300)); 34*789efdb9Sdan INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1; 35*789efdb9Sdan INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1; 36*789efdb9Sdan } 37*789efdb9Sdan faultsim_save_and_close 38*789efdb9Sdan} {} 39*789efdb9Sdan 40*789efdb9Sdan 41*789efdb9Sdando_faultsim_test 1 -prep { 42*789efdb9Sdan faultsim_restore_and_reopen 43*789efdb9Sdan db func a_string a_string 44*789efdb9Sdan execsql { 45*789efdb9Sdan PRAGMA mmap_size = 1000000; 46*789efdb9Sdan PRAGMA cache_size = 5; 47*789efdb9Sdan BEGIN; 48*789efdb9Sdan INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1; 49*789efdb9Sdan INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1; 50*789efdb9Sdan INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1; 51*789efdb9Sdan INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1; 52*789efdb9Sdan } 53*789efdb9Sdan} -body { 54*789efdb9Sdan execsql { INSERT INTO t1 VALUES(a_string(200), a_string(300)) } 55*789efdb9Sdan} -test { 56*789efdb9Sdan faultsim_test_result {0 {}} 57*789efdb9Sdan 58*789efdb9Sdan if {[sqlite3_get_autocommit db]} { 59*789efdb9Sdan sqlite3 db2 test.db 60*789efdb9Sdan set nRow [db2 one {SELECT count(*) FROM t1}] 61*789efdb9Sdan if {$nRow!=4} { error "Database content appears incorrect (1)" } 62*789efdb9Sdan db2 close 63*789efdb9Sdan } 64*789efdb9Sdan 65*789efdb9Sdan execsql { INSERT INTO t1 VALUES(a_string(201), a_string(301)) } 66*789efdb9Sdan set nRow [db one {SELECT count(*) FROM t1}] 67*789efdb9Sdan if {$nRow!=5 && $nRow!=66 && $nRow!=65} { 68*789efdb9Sdan error "Database content appears incorrect (2) ($nRow)" 69*789efdb9Sdan } 70*789efdb9Sdan 71*789efdb9Sdan catch { execsql COMMIT } 72*789efdb9Sdan} 73*789efdb9Sdan 74*789efdb9Sdan 75*789efdb9Sdan 76*789efdb9Sdanfinish_test 77