mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Add a test for the outcome of a process crash within an xWrite VFS method
call. FossilOrigin-Name: eb8718006cb23ba9304da5c30d19863d688495f0eaae3794c5ad870e481866f8
This commit is contained in:
@ -1608,6 +1608,54 @@ proc crashsql {args} {
|
||||
lappend r $msg
|
||||
}
|
||||
|
||||
# crash_on_write ?-devchar DEVCHAR? CRASHDELAY SQL
|
||||
#
|
||||
proc crash_on_write {args} {
|
||||
|
||||
set nArg [llength $args]
|
||||
if {$nArg<2 || $nArg%2} {
|
||||
error "bad args: $args"
|
||||
}
|
||||
set zSql [lindex $args end]
|
||||
set nDelay [lindex $args end-1]
|
||||
|
||||
set devchar {}
|
||||
for {set ii 0} {$ii < $nArg-2} {incr ii 2} {
|
||||
set opt [lindex $args $ii]
|
||||
switch -- [lindex $args $ii] {
|
||||
-devchar {
|
||||
set devchar [lindex $args [expr $ii+1]]
|
||||
}
|
||||
|
||||
default { error "unrecognized option: $opt" }
|
||||
}
|
||||
}
|
||||
|
||||
set f [open crash.tcl w]
|
||||
puts $f "sqlite3_crash_on_write $nDelay"
|
||||
puts $f "sqlite3_test_control_pending_byte $::sqlite_pending_byte"
|
||||
puts $f "sqlite3 db test.db -vfs writecrash"
|
||||
puts $f "db eval {$zSql}"
|
||||
puts $f "set {} {}"
|
||||
|
||||
close $f
|
||||
set r [catch {
|
||||
exec [info nameofexec] crash.tcl >@stdout
|
||||
} msg]
|
||||
|
||||
# Windows/ActiveState TCL returns a slightly different
|
||||
# error message. We map that to the expected message
|
||||
# so that we don't have to change all of the test
|
||||
# cases.
|
||||
if {$::tcl_platform(platform)=="windows"} {
|
||||
if {$msg=="child killed: unknown signal"} {
|
||||
set msg "child process exited abnormally"
|
||||
}
|
||||
}
|
||||
|
||||
lappend r $msg
|
||||
}
|
||||
|
||||
proc run_ioerr_prep {} {
|
||||
set ::sqlite_io_error_pending 0
|
||||
catch {db close}
|
||||
|
Reference in New Issue
Block a user