176ed3bc0Sdan# 2010 May 03 276ed3bc0Sdan# 376ed3bc0Sdan# The author disclaims copyright to this source code. In place of 476ed3bc0Sdan# a legal notice, here is a blessing: 576ed3bc0Sdan# 676ed3bc0Sdan# May you do good and not evil. 776ed3bc0Sdan# May you find forgiveness for yourself and forgive others. 876ed3bc0Sdan# May you share freely, never taking more than you give. 976ed3bc0Sdan# 1076ed3bc0Sdan#*********************************************************************** 1176ed3bc0Sdan# This file implements regression tests for SQLite library. The 1276ed3bc0Sdan# focus of this file is testing the operation of the library in 1376ed3bc0Sdan# "PRAGMA journal_mode=WAL" mode. 1476ed3bc0Sdan# 1576ed3bc0Sdan 1676ed3bc0Sdanset testdir [file dirname $argv0] 1776ed3bc0Sdansource $testdir/tester.tcl 1876ed3bc0Sdansource $testdir/malloc_common.tcl 1976ed3bc0Sdan 2076ed3bc0Sdanifcapable !wal {finish_test ; return } 2176ed3bc0Sdan 22*a4bc123fSdan#------------------------------------------------------------------------- 23*a4bc123fSdan# This test case, walfault-1-*, simulates faults while executing a 24*a4bc123fSdan# 25*a4bc123fSdan# PRAGMA journal_mode = WAL; 26*a4bc123fSdan# 27*a4bc123fSdan# statement immediately after creating a new database. 28*a4bc123fSdan# 29*a4bc123fSdando_test walfault-1-pre-1 { 30*a4bc123fSdan db close 318521abfdSdan file delete -force test.db test.db-wal test.db-journal 32*a4bc123fSdan faultsim_save_and_close 33*a4bc123fSdan} {} 34*a4bc123fSdando_faultsim_test walfault-1 -prep { 35*a4bc123fSdan faultsim_restore_and_reopen 368521abfdSdan} -body { 378521abfdSdan db eval { PRAGMA main.journal_mode = WAL } 388521abfdSdan} -test { 398521abfdSdan 408521abfdSdan faultsim_test_result {0 wal} 418521abfdSdan 428521abfdSdan # Test that the connection that encountered an error as part of 438521abfdSdan # "PRAGMA journal_mode = WAL" and a new connection use the same 448521abfdSdan # journal mode when accessing the database. 458521abfdSdan # 468521abfdSdan # If "PRAGMA journal_mode" is executed immediately, connection [db] (the 478521abfdSdan # one that hit the error in journal_mode="WAL") might return "wal" even 488521abfdSdan # if it failed to switch the database to WAL mode. This is not considered 498521abfdSdan # a problem. When it tries to read the database, connection [db] correctly 508521abfdSdan # recognizes that it is a rollback database and switches back to a 518521abfdSdan # rollback compatible journal mode. 528521abfdSdan # 538521abfdSdan set jm [db one {SELECT * FROM sqlite_master ; PRAGMA main.journal_mode}] 548521abfdSdan sqlite3 db2 test.db 558521abfdSdan set jm2 [db2 one {SELECT * FROM sqlite_master ; PRAGMA main.journal_mode}] 568521abfdSdan db2 close 578521abfdSdan 588521abfdSdan if { $jm!=$jm2 } { error "Journal modes do not match: $jm $jm2" } 598521abfdSdan if { $testrc==0 && $jm!="wal" } { error "Journal mode is not WAL" } 6076ed3bc0Sdan} 6176ed3bc0Sdan 62*a4bc123fSdan#-------------------------------------------------------------------------- 63*a4bc123fSdan# Test case walfault-2-* tests fault injection during recovery of a 64*a4bc123fSdan# short WAL file (a dozen frames or thereabouts). 65*a4bc123fSdan# 66*a4bc123fSdando_test walfault-2-pre-1 { 67*a4bc123fSdan sqlite3 db test.db 685e9e482fSdan execsql { 695e9e482fSdan PRAGMA journal_mode = WAL; 705e9e482fSdan BEGIN; 715e9e482fSdan CREATE TABLE x(y, z, UNIQUE(y, z)); 725e9e482fSdan INSERT INTO x VALUES(randomblob(100), randomblob(100)); 735e9e482fSdan COMMIT; 745e9e482fSdan PRAGMA wal_checkpoint; 755e9e482fSdan 765e9e482fSdan INSERT INTO x SELECT randomblob(100), randomblob(100) FROM x; 775e9e482fSdan INSERT INTO x SELECT randomblob(100), randomblob(100) FROM x; 785e9e482fSdan INSERT INTO x SELECT randomblob(100), randomblob(100) FROM x; 795e9e482fSdan } 80*a4bc123fSdan execsql { 81*a4bc123fSdan SELECT count(*) FROM x 82*a4bc123fSdan } 83*a4bc123fSdan} {8} 84*a4bc123fSdando_test walfault-2-pre-2 { 85*a4bc123fSdan faultsim_save_and_close 86*a4bc123fSdan faultsim_restore_and_reopen 87*a4bc123fSdan execsql { SELECT count(*) FROM x } 88*a4bc123fSdan} {8} 89*a4bc123fSdando_faultsim_test walfault-2 -prep { 90*a4bc123fSdan faultsim_restore_and_reopen 91*a4bc123fSdan} -body { 92*a4bc123fSdan execsql { SELECT count(*) FROM x } 93*a4bc123fSdan} -test { 945e9e482fSdan 95*a4bc123fSdan # Test that all the rows in the WAL were recovered. 96*a4bc123fSdan faultsim_test_result {0 8} 97*a4bc123fSdan 98*a4bc123fSdan # Run the integrity_check to make sure nothing strange has occurred. 99*a4bc123fSdan set ic [db eval { PRAGMA integrity_check }] 100*a4bc123fSdan if {$ic != "ok"} { error "Integrity check: $ic" } 1015e9e482fSdan} 1025e9e482fSdan 103*a4bc123fSdan#-------------------------------------------------------------------------- 104*a4bc123fSdan# Test fault injection while writing and checkpointing a small WAL file. 105*a4bc123fSdan# 106*a4bc123fSdando_test walfault-3-pre-1 { 107*a4bc123fSdan sqlite3 db test.db 108*a4bc123fSdan execsql { 1099a6b4e9aSdan PRAGMA auto_vacuum = 1; 1109a6b4e9aSdan PRAGMA journal_mode = WAL; 1119a6b4e9aSdan CREATE TABLE abc(a PRIMARY KEY); 1129a6b4e9aSdan INSERT INTO abc VALUES(randomblob(1500)); 113*a4bc123fSdan } 114*a4bc123fSdan db close 115*a4bc123fSdan faultsim_save_and_close 116*a4bc123fSdan} {} 117*a4bc123fSdan 118*a4bc123fSdando_faultsim_test walfault-3 -prep { 119*a4bc123fSdan faultsim_restore_and_reopen 120*a4bc123fSdan} -body { 121*a4bc123fSdan db eval { 1229a6b4e9aSdan DELETE FROM abc; 1239a6b4e9aSdan PRAGMA wal_checkpoint; 1249a6b4e9aSdan } 125*a4bc123fSdan} -test { 126*a4bc123fSdan faultsim_test_result {0 {}} 127*a4bc123fSdan} 1289a6b4e9aSdan 129c7991bdfSdan# A [testvfs] callback for the VFS created by [do_shmfault_test]. This 1308f6097c2Sdan# callback injects SQLITE_IOERR faults into methods for which an entry 1318f6097c2Sdan# in array ::shmfault_ioerr_methods is defined. For example, to enable 1328f6097c2Sdan# errors in xShmOpen: 133c7991bdfSdan# 1348f6097c2Sdan# set ::shmfault_ioerr_methods(xShmOpen) 1 135c7991bdfSdan# 136c7991bdfSdan# Faults are not injected into xShmRelease, xShmClose or xShmLock method 137c7991bdfSdan# calls. The global tcl variables used are: 138c7991bdfSdan# 139c7991bdfSdan# $::shmfault_ioerr_countdown 140c7991bdfSdan# $::shmfault_ioerr_persist 1418f6097c2Sdan# $::shmfault_ioerr_methods 142c7991bdfSdan# 143c7991bdfSdanproc shmfault_vfs_cb {method args} { 144c7991bdfSdan 145c7991bdfSdan # If ::shmfault_ioerr_countdown is not set, always return SQLITE_OK. 146c7991bdfSdan # 147c7991bdfSdan if {[info exists ::shmfault_ioerr_countdown]==0} { return SQLITE_OK } 148c7991bdfSdan 1498f6097c2Sdan if {[info exists ::shmfault_ioerr_methods($method)]} { 150c7991bdfSdan incr ::shmfault_ioerr_countdown -1 151c7991bdfSdan if { ($::shmfault_ioerr_countdown==0) 152c7991bdfSdan || ($::shmfault_ioerr_countdown<=0 && $::shmfault_ioerr_persist) 153c7991bdfSdan } { 154c7991bdfSdan return SQLITE_IOERR 155c7991bdfSdan } 156c7991bdfSdan } 157c7991bdfSdan return SQLITE_OK 158c7991bdfSdan} 159c7991bdfSdan 1608f6097c2Sdan# Options are: 1618f6097c2Sdan# 1628f6097c2Sdan# -tclprep TCL 1638f6097c2Sdan# -sqlprep SQL 1648f6097c2Sdan# -sqlbody SQL 1658f6097c2Sdan# 166c7991bdfSdanproc do_shmfault_test {name args} { 1678f6097c2Sdan 1688f6097c2Sdan set A(-tclprep) "sqlite3 db test.db -vfs shmfault" 1698f6097c2Sdan set A(-sqlprep) "" 1708f6097c2Sdan set A(-sqlbody) "" 1718f6097c2Sdan set A(-methods) [list xShmGet xShmOpen xShmSize] 172d41a29a6Sdan set A(-coverageonly) 0 173c7991bdfSdan array set A $args 174c7991bdfSdan 175c7991bdfSdan # Create a VFS to use: 176c7991bdfSdan testvfs shmfault shmfault_vfs_cb 177c7991bdfSdan 1788f6097c2Sdan unset -nocomplain ::shmfault_ioerr_methods 1798f6097c2Sdan foreach m $A(-methods) { set ::shmfault_ioerr_methods($m) 1 } 1808f6097c2Sdan 181c7991bdfSdan foreach mode {transient persistent} { 182c7991bdfSdan set ::shmfault_ioerr_persist [expr {$mode == "persistent"}] 1838f6097c2Sdan 184c7991bdfSdan for {set nDelay 1} {$nDelay < 10000} {incr nDelay} { 185c7991bdfSdan 186c7991bdfSdan file delete -force test.db test.db-wal test.db-journal 187c7991bdfSdan 1888f6097c2Sdan eval $A(-tclprep) 1898f6097c2Sdan db eval $A(-sqlprep) 1908f6097c2Sdan 1918f6097c2Sdan set ::shmfault_ioerr_countdown $nDelay 1928f6097c2Sdan set rc [catch { db eval $A(-sqlbody) } msg] 193c7991bdfSdan set hit_error [expr {$::shmfault_ioerr_countdown<=0}] 194c7991bdfSdan unset ::shmfault_ioerr_countdown 1958f6097c2Sdan 196c7991bdfSdan catch { db close } 197c7991bdfSdan 198d41a29a6Sdan if {$A(-coverageonly)} { set rc $hit_error } 199c7991bdfSdan do_test $name-$mode.$nDelay.1 [list set {} $hit_error] $rc 200c7991bdfSdan 201c7991bdfSdan if {$hit_error==0} break 202c7991bdfSdan } 203c7991bdfSdan } 204c7991bdfSdan 205c7991bdfSdan shmfault delete 206c7991bdfSdan} 207c7991bdfSdan 208c7991bdfSdando_shmfault_test walfault-shm-1 -sqlbody { 209c7991bdfSdan PRAGMA journal_mode = WAL; 210c7991bdfSdan CREATE TABLE t1(a PRIMARY KEY, b); 211c7991bdfSdan INSERT INTO t1 VALUES('a', 'b'); 212c7991bdfSdan PRAGMA wal_checkpoint; 213c7991bdfSdan} 21476ed3bc0Sdan 2158f6097c2Sdando_shmfault_test walfault-shm-2 -methods xShmSize -sqlprep { 2168f6097c2Sdan PRAGMA page_size = 512; 2178f6097c2Sdan PRAGMA journal_mode = WAL; 2188f6097c2Sdan PRAGMA wal_autocheckpoint = 0; 2198f6097c2Sdan} -sqlbody { 2208f6097c2Sdan CREATE TABLE t1(x); 2218f6097c2Sdan BEGIN; 2228f6097c2Sdan INSERT INTO t1 VALUES(randomblob(400)); /* 1 */ 2238f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2 */ 2248f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4 */ 2258f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8 */ 2268f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16 */ 2278f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 32 */ 2288f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 64 */ 2298f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 128 */ 2308f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 256 */ 2318f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 512 */ 2328f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 1024 */ 2338f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2048 */ 2348f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4096 */ 2358f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8192 */ 2368f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16384 */ 2378f6097c2Sdan COMMIT; 2388f6097c2Sdan} 2398f6097c2Sdan 2408f6097c2Sdando_shmfault_test walfault-shm-3 -methods xShmSize -tclprep { 2418f6097c2Sdan sqlite3 db test.db -vfs shmfault 2428f6097c2Sdan unset -nocomplain ::shmfault_ioerr_countdown 2438f6097c2Sdan db eval { 2448f6097c2Sdan PRAGMA page_size = 512; 2458f6097c2Sdan PRAGMA journal_mode = WAL; 2468f6097c2Sdan PRAGMA wal_autocheckpoint = 0; 2478f6097c2Sdan CREATE TABLE t1(x); 2488f6097c2Sdan BEGIN; 2498f6097c2Sdan INSERT INTO t1 VALUES(randomblob(400)); /* 1 */ 2508f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2 */ 2518f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4 */ 2528f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8 */ 2538f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16 */ 2548f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 32 */ 2558f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 64 */ 2568f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 128 */ 2578f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 256 */ 2588f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 512 */ 2598f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 1024 */ 2608f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2048 */ 2618f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4096 */ 2628f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8192 */ 2638f6097c2Sdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16384 */ 2648f6097c2Sdan COMMIT; 2658f6097c2Sdan } 2668f6097c2Sdan 2678f6097c2Sdan set ::shmfault_ioerr_countdown 1 2688f6097c2Sdan set ::shmfault_ioerr_methods(xShmGet) 1 2698f6097c2Sdan db close 2708f6097c2Sdan unset ::shmfault_ioerr_methods(xShmGet) 2718f6097c2Sdan if {[file exists test.db-wal]==0} {error "Failed to create WAL file!"} 2728f6097c2Sdan 2738f6097c2Sdan sqlite3 db test.db -vfs shmfault 2748f6097c2Sdan} -sqlbody { 2758f6097c2Sdan SELECT count(*) FROM t1; 2768f6097c2Sdan} 2778f6097c2Sdan 278a861469aSdando_shmfault_test walfault-shm-4 -tclprep { 279a861469aSdan sqlite3 db test.db -vfs shmfault 280a861469aSdan unset -nocomplain ::shmfault_ioerr_countdown 281a861469aSdan db eval { 282a861469aSdan PRAGMA page_size = 512; 283a861469aSdan PRAGMA journal_mode = WAL; 284a861469aSdan PRAGMA wal_autocheckpoint = 0; 285a861469aSdan CREATE TABLE t1(x); 286a861469aSdan BEGIN; 287a861469aSdan INSERT INTO t1 VALUES(randomblob(400)); /* 1 */ 288a861469aSdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2 */ 289a861469aSdan INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4 */ 290a861469aSdan COMMIT; 291a861469aSdan } 292a861469aSdan 293a861469aSdan set ::shmfault_ioerr_countdown 1 294a861469aSdan set ::shmfault_ioerr_methods(xShmGet) 1 295a861469aSdan db close 296a861469aSdan unset ::shmfault_ioerr_methods(xShmGet) 297a861469aSdan if {[file exists test.db-wal]==0} {error "Failed to create WAL file!"} 298a861469aSdan sqlite3 db test.db -vfs shmfault 299a861469aSdan} -sqlbody { 300a861469aSdan SELECT count(*) FROM t1; 301a861469aSdan} 302a861469aSdan 3038067adbcSdando_shmfault_test walfault-shm-5.1 -coverageonly 1 -sqlprep { 304d41a29a6Sdan PRAGMA cache_size = 10; 305d41a29a6Sdan PRAGMA journal_mode = WAL; 306d41a29a6Sdan CREATE TABLE abc(a PRIMARY KEY); 307d41a29a6Sdan INSERT INTO abc VALUES(randomblob(900)); 308d41a29a6Sdan} -sqlbody { 309d41a29a6Sdan BEGIN; 310d41a29a6Sdan INSERT INTO abc SELECT randomblob(900) FROM abc; /* 1 */ 311d41a29a6Sdan INSERT INTO abc SELECT randomblob(900) FROM abc; /* 2 */ 312d41a29a6Sdan INSERT INTO abc SELECT randomblob(900) FROM abc; /* 4 */ 313d41a29a6Sdan INSERT INTO abc SELECT randomblob(900) FROM abc; /* 8 */ 314d41a29a6Sdan ROLLBACK; 315d41a29a6Sdan} 316d41a29a6Sdan 3178067adbcSdando_shmfault_test walfault-shm-5.2 -coverageonly 1 -sqlprep { 3188067adbcSdan PRAGMA cache_size = 10; 3198067adbcSdan PRAGMA journal_mode = WAL; 3208067adbcSdan CREATE TABLE abc(a PRIMARY KEY); 3218067adbcSdan INSERT INTO abc VALUES(randomblob(900)); 3228067adbcSdan} -sqlbody { 3238067adbcSdan BEGIN; 3248067adbcSdan INSERT INTO abc SELECT randomblob(900) FROM abc; /* 1 */ 3258067adbcSdan SAVEPOINT spoint; 3268067adbcSdan INSERT INTO abc SELECT randomblob(900) FROM abc; /* 2 */ 3278067adbcSdan INSERT INTO abc SELECT randomblob(900) FROM abc; /* 4 */ 3288067adbcSdan INSERT INTO abc SELECT randomblob(900) FROM abc; /* 8 */ 3298067adbcSdan ROLLBACK TO spoint; 3308067adbcSdan COMMIT; 3318067adbcSdan} 3328067adbcSdan 33365f2ac58Sdan#------------------------------------------------------------------------- 33465f2ac58Sdan# When a database is checkpointed, SQLite does the following: 33565f2ac58Sdan# 33665f2ac58Sdan# 1. xShmLock(CHECKPOINT) to lock the WAL. 33765f2ac58Sdan# 2. xShmGet(-1) to get a mapping to read the wal-index header. 33865f2ac58Sdan# 3. If the mapping obtained in (2) is not large enough to cover the 33965f2ac58Sdan# entire wal-index, call xShmGet(nReq) to get a larger mapping. 34065f2ac58Sdan# 4. Do the checkpoint. 34165f2ac58Sdan# 5. Release the lock and mapping. 34265f2ac58Sdan# 34365f2ac58Sdan# This test case tests the outcome of an IO error in step 2. 34465f2ac58Sdan# 34565f2ac58Sdanproc shmfault_vfs_cb_6 {method args} { 34665f2ac58Sdan switch -- $::shm_state { 34765f2ac58Sdan 0 { return SQLITE_OK } 34865f2ac58Sdan 1 { 34965f2ac58Sdan if {$method == "xShmGet"} { 35065f2ac58Sdan set ::wal_index [tvfs shm [lindex $args 0]] 35165f2ac58Sdan tvfs shm [lindex $args 0] [string range $::wal_index 0 65535] 35265f2ac58Sdan set ::shm_state 2 35365f2ac58Sdan } 35465f2ac58Sdan } 35565f2ac58Sdan 2 { 35665f2ac58Sdan if {$method == "xShmGet"} { 35765f2ac58Sdan tvfs shm [lindex $args 0] $::wal_index 35865f2ac58Sdan return SQLITE_IOERR 35965f2ac58Sdan } 36065f2ac58Sdan } 36165f2ac58Sdan } 36265f2ac58Sdan return SQLITE_OK 36365f2ac58Sdan} 36465f2ac58Sdando_test walfault-shm-6.1 { 36565f2ac58Sdan set ::shm_state 0 36665f2ac58Sdan testvfs tvfs shmfault_vfs_cb_6 36765f2ac58Sdan 36865f2ac58Sdan sqlite3 db test.db -vfs tvfs 36965f2ac58Sdan sqlite3 db2 test.db -vfs tvfs 37065f2ac58Sdan 37165f2ac58Sdan execsql { 37265f2ac58Sdan PRAGMA journal_mode = WAL; 37365f2ac58Sdan PRAGMA wal_autocheckpoint = 0; 37465f2ac58Sdan CREATE TABLE t1(x); 37565f2ac58Sdan INSERT INTO t1 VALUES(randomblob(900)); 37665f2ac58Sdan } 37765f2ac58Sdan} {wal 0} 37865f2ac58Sdando_test walfault-shm-6.2 { 37965f2ac58Sdan execsql { 38065f2ac58Sdan PRAGMA wal_autocheckpoint = 0; 38165f2ac58Sdan BEGIN; 38265f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 2 */ 38365f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 4 */ 38465f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 8 */ 38565f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 16 */ 38665f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 32 */ 38765f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 64 */ 38865f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 128 */ 38965f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 256 */ 39065f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 512 */ 39165f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 1024 */ 39265f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 2048 */ 39365f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 4096 */ 39465f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 8192 */ 39565f2ac58Sdan INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 16384 */ 39665f2ac58Sdan COMMIT; 39765f2ac58Sdan } db2 39865f2ac58Sdan} {0} 39965f2ac58Sdando_test walfault-shm-6.3 { 40065f2ac58Sdan set ::shm_state 1 40165f2ac58Sdan catchsql { PRAGMA wal_checkpoint } db2 40265f2ac58Sdan} {1 {disk I/O error}} 40365f2ac58Sdanset ::shm_state 0 40465f2ac58Sdandb close 40565f2ac58Sdandb2 close 40665f2ac58Sdantvfs delete 40765f2ac58Sdanunset -nocomplain ::wal_index ::shm_state 40865f2ac58Sdan 40976ed3bc0Sdanfinish_test 410c7991bdfSdan 411