xref: /sqlite-3.40.0/test/walfault.test (revision a4bc123f)
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