# 2010 May 25 # # 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. # #*********************************************************************** # set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/lock_common.tcl source $testdir/wal_common.tcl ifcapable !wal {finish_test ; return } set testprefix walcrash4 #------------------------------------------------------------------------- # At one point, if "PRAGMA synchronous=full" is set and the platform # does not support POWERSAFE_OVERWRITE, and the last frame written to # the wal file in a transaction is aligned with a sector boundary, the # xSync() call was omitted. # # The following test verifies that this has been fixed. # do_execsql_test 1.0 { PRAGMA autovacuum = 0; PRAGMA page_size = 1024; PRAGMA journal_mode = wal; PRAGMA main.synchronous = full; } {wal} faultsim_save_and_close # The error message is different on unix and windows # if {$::tcl_platform(platform)=="windows"} { set msg "child killed: unknown signal" } else { set msg "child process exited abnormally" } for {set nExtra 0} {$nExtra < 10} {incr nExtra} { for {set i 0} {$i < 10} {incr i} { do_test 1.nExtra=$nExtra.i=$i.1 { faultsim_restore_and_reopen set fd [open crash.tcl w] puts $fd [subst -nocommands { sqlite3_crash_enable 1 sqlite3_test_control_pending_byte $::sqlite_pending_byte sqlite3 db test.db -vfs crash db eval { PRAGMA main.synchronous=FULL; BEGIN; CREATE TABLE t1(x UNIQUE); } for {set e 2} {[set e] < ($nExtra+2)} {incr e} { db eval "CREATE TABLE t[set e] (x)" } db eval { INSERT INTO t1 VALUES( randomblob(170000) ); COMMIT; } sqlite3_crash_now }] close $fd set r [catch { exec [info nameofexec] crash.tcl >@stdout } msg] list $r $msg } "1 {$msg}" do_execsql_test 1.nExtra=$nExtra.i=$i.2 { SELECT count(*) FROM t1; PRAGMA integrity_check; } {1 ok} } } finish_test