/ Hex Artifact Content
Login

Artifact 63c5da625562c66345ab4528790327ca63db2f6f9cbae2aba8cb7c51de3d1628:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 0a 69 66 20 7b 5b 70 65 72  on.tcl..if {[per
01f0: 6d 75 74 61 74 69 6f 6e 5d 20 3d 3d 20 22 69 6e  mutation] == "in
0200: 6d 65 6d 6f 72 79 5f 6a 6f 75 72 6e 61 6c 22 7d  memory_journal"}
0210: 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74   {.  finish_test
0220: 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 69 66 20  .  return.}..if 
0230: 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  {$::tcl_platform
0240: 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 77 69 6e  (platform)=="win
0250: 64 6f 77 73 22 7d 20 7b 0a 20 20 66 69 6e 69 73  dows"} {.  finis
0260: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
0270: 7d 0a 0a 73 65 74 20 61 5f 73 74 72 69 6e 67 5f  }..set a_string_
0280: 63 6f 75 6e 74 65 72 20 31 0a 70 72 6f 63 20 61  counter 1.proc a
0290: 5f 73 74 72 69 6e 67 20 7b 6e 7d 20 7b 0a 20 20  _string {n} {.  
02a0: 67 6c 6f 62 61 6c 20 61 5f 73 74 72 69 6e 67 5f  global a_string_
02b0: 63 6f 75 6e 74 65 72 0a 20 20 69 6e 63 72 20 61  counter.  incr a
02c0: 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 0a  _string_counter.
02d0: 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b    string range [
02e0: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 22 24  string repeat "$
02f0: 7b 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  {a_string_counte
0300: 72 7d 2e 22 20 24 6e 5d 20 31 20 24 6e 0a 7d 0a  r}." $n] 1 $n.}.
0310: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
0320: 20 61 5f 73 74 72 69 6e 67 0a 0a 23 2d 2d 2d 2d   a_string..#----
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75  -----.# Test fau
0380: 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 77 68 69  lt-injection whi
0390: 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  le rolling back 
03a0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
03b0: 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  le..#.do_test pa
03c0: 67 65 72 66 61 75 6c 74 2d 31 2d 70 72 65 31 20  gerfault-1-pre1 
03d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
03e0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
03f0: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
0400: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
0410: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
0420: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0430: 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51  a UNIQUE, b UNIQ
0440: 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  UE);.    INSERT 
0450: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
0460: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
0470: 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20  string(300));.  
0480: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0490: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
04a0: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
04b0: 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  300) FROM t1;.  
04c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
04d0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
04e0: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
04f0: 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  300) FROM t1;.  
0500: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
0510: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
0520: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
0530: 31 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 31  1), a_string(301
0540: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  ) FROM t1;.     
0550: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0560: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
0570: 32 30 32 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  202), a_string(3
0580: 30 32 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  02) FROM t1;.   
0590: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
05a0: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
05b0: 67 28 32 30 33 29 2c 20 61 5f 73 74 72 69 6e 67  g(203), a_string
05c0: 28 33 30 33 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (303) FROM t1;. 
05d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
05e0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
05f0: 69 6e 67 28 32 30 34 29 2c 20 61 5f 73 74 72 69  ing(204), a_stri
0600: 6e 67 28 33 30 34 29 20 46 52 4f 4d 20 74 31 3b  ng(304) FROM t1;
0610: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
0620: 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d  save_and_close.}
0630: 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f   {}.do_faultsim_
0640: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
0650: 31 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  1 -prep {.  faul
0660: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
0670: 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20  _reopen.} -body 
0680: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0690: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
06a0: 4f 4d 20 74 31 20 7d 0a 7d 20 2d 74 65 73 74 20  OM t1 }.} -test 
06b0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
06c0: 74 5f 72 65 73 75 6c 74 20 7b 30 20 34 7d 20 0a  t_result {0 4} .
06d0: 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67    faultsim_integ
06e0: 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 69 66 20  rity_check.  if 
06f0: 7b 5b 64 62 20 6f 6e 65 20 7b 20 53 45 4c 45 43  {[db one { SELEC
0700: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
0710: 74 31 20 7d 5d 20 21 3d 20 34 7d 20 7b 0a 20 20  t1 }] != 4} {.  
0720: 20 20 65 72 72 6f 72 20 22 44 61 74 61 62 61 73    error "Databas
0730: 65 20 63 6f 6e 74 65 6e 74 20 61 70 70 65 61 72  e content appear
0740: 73 20 69 6e 63 6f 72 72 65 63 74 22 0a 20 20 7d  s incorrect".  }
0750: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
07a0: 20 54 65 73 74 20 66 61 75 6c 74 2d 69 6e 6a 65   Test fault-inje
07b0: 63 74 69 6f 6e 20 77 68 69 6c 65 20 72 6f 6c 6c  ction while roll
07c0: 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
07d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68  ournal file with
07e0: 20 61 20 0a 23 20 70 61 67 65 2d 73 69 7a 65 20   a .# page-size 
07f0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
0800: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
0810: 20 73 74 6f 72 65 64 20 6f 6e 20 70 61 67 65 20   stored on page 
0820: 31 20 6f 66 20 74 68 65 0a 23 20 64 61 74 61 62  1 of the.# datab
0830: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 64 6f 5f 74  ase file..#.do_t
0840: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32  est pagerfault-2
0850: 2d 70 72 65 31 20 7b 0a 20 20 74 65 73 74 76 66  -pre1 {.  testvf
0860: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
0870: 20 20 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e    tv filter xSyn
0880: 63 0a 20 20 74 76 20 73 63 72 69 70 74 20 78 53  c.  tv script xS
0890: 79 6e 63 43 62 0a 20 20 70 72 6f 63 20 78 53 79  yncCb.  proc xSy
08a0: 6e 63 43 62 20 7b 66 69 6c 65 6e 61 6d 65 20 61  ncCb {filename a
08b0: 72 67 73 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b  rgs} {.    if {[
08c0: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f  string match *jo
08d0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 5d 3d  urnal filename]=
08e0: 3d 30 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  =0} faultsim_sav
08f0: 65 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  e.  }.  faultsim
0900: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
0910: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
0920: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
0930: 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  ize = 4096;.    
0940: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45  BEGIN;.      CRE
0950: 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c  ATE TABLE abc(a,
0960: 20 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 49 4e   b, c);.      IN
0970: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
0980: 4c 55 45 53 28 27 6f 27 2c 20 27 74 27 2c 20 27  LUES('o', 't', '
0990: 74 27 29 3b 20 0a 20 20 20 20 20 20 49 4e 53 45  t'); .      INSE
09a0: 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55  RT INTO abc VALU
09b0: 45 53 28 27 66 27 2c 20 27 66 27 2c 20 27 73 27  ES('f', 'f', 's'
09c0: 29 3b 20 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ); .      INSERT
09d0: 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54   INTO abc SELECT
09e0: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 20 2d 2d 20   * FROM abc; -- 
09f0: 34 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  4.      INSERT I
0a00: 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a  NTO abc SELECT *
0a10: 20 46 52 4f 4d 20 61 62 63 3b 20 2d 2d 20 38 0a   FROM abc; -- 8.
0a20: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0a30: 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46  O abc SELECT * F
0a40: 52 4f 4d 20 61 62 63 3b 20 2d 2d 20 31 36 0a 20  ROM abc; -- 16. 
0a50: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0a60: 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52   abc SELECT * FR
0a70: 4f 4d 20 61 62 63 3b 20 2d 2d 20 33 32 0a 20 20  OM abc; -- 32.  
0a80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0a90: 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  abc SELECT * FRO
0aa0: 4d 20 61 62 63 3b 20 2d 2d 20 36 34 0a 20 20 20  M abc; -- 64.   
0ab0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
0ac0: 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  bc SELECT * FROM
0ad0: 20 61 62 63 3b 20 2d 2d 20 31 32 38 0a 20 20 20   abc; -- 128.   
0ae0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
0af0: 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  bc SELECT * FROM
0b00: 20 61 62 63 3b 20 2d 2d 20 32 35 36 0a 20 20 20   abc; -- 256.   
0b10: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41   COMMIT;.    PRA
0b20: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
0b30: 31 30 32 34 3b 0a 20 20 20 20 56 41 43 55 55 4d  1024;.    VACUUM
0b40: 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
0b50: 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 20 7b  .  tv delete.} {
0b60: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
0b70: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 20  st pagerfault-2 
0b80: 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73  -prep {.  faults
0b90: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
0ba0: 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a  eopen.} -body {.
0bb0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0bc0: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 20 7d 0a  CT * FROM abc }.
0bd0: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 73 65 74 20  } -test {.  set 
0be0: 61 6e 73 77 65 72 20 5b 73 70 6c 69 74 20 5b 73  answer [split [s
0bf0: 74 72 69 6e 67 20 72 65 70 65 61 74 20 22 6f 74  tring repeat "ot
0c00: 74 66 66 73 22 20 31 32 38 5d 20 22 22 5d 0a 20  tffs" 128] ""]. 
0c10: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
0c20: 65 73 75 6c 74 20 5b 6c 69 73 74 20 30 20 24 61  esult [list 0 $a
0c30: 6e 73 77 65 72 5d 0a 20 20 66 61 75 6c 74 73 69  nswer].  faultsi
0c40: 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  m_integrity_chec
0c50: 6b 0a 20 20 73 65 74 20 72 65 73 20 5b 64 62 20  k.  set res [db 
0c60: 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
0c70: 46 52 4f 4d 20 61 62 63 20 7d 5d 0a 20 20 69 66  FROM abc }].  if
0c80: 20 7b 24 72 65 73 20 21 3d 20 24 61 6e 73 77 65   {$res != $answe
0c90: 72 7d 20 7b 20 65 72 72 6f 72 20 22 44 61 74 61  r} { error "Data
0ca0: 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 61 70 70  base content app
0cb0: 65 61 72 73 20 69 6e 63 6f 72 72 65 63 74 20 28  ears incorrect (
0cc0: 24 72 65 73 29 22 20 7d 0a 7d 20 0a 0a 23 2d 2d  $res)" }.} ..#--
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66  -------.# Test f
0d20: 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 77  ault-injection w
0d30: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  hile rolling bac
0d40: 6b 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 74  k hot-journals t
0d50: 68 61 74 20 77 65 72 65 20 63 72 65 61 74 65 64  hat were created
0d60: 0a 23 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  .# as part of a 
0d70: 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
0d80: 61 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73  action..#.do_tes
0d90: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 33 2d 70  t pagerfault-3-p
0da0: 72 65 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20  re1 {.  testvfs 
0db0: 74 73 74 76 66 73 20 2d 64 65 66 61 75 6c 74 20  tstvfs -default 
0dc0: 31 0a 20 20 74 73 74 76 66 73 20 66 69 6c 74 65  1.  tstvfs filte
0dd0: 72 20 78 44 65 6c 65 74 65 0a 20 20 74 73 74 76  r xDelete.  tstv
0de0: 66 73 20 73 63 72 69 70 74 20 78 44 65 6c 65 74  fs script xDelet
0df0: 65 43 61 6c 6c 62 61 63 6b 0a 0a 20 20 70 72 6f  eCallback..  pro
0e00: 63 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63  c xDeleteCallbac
0e10: 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61  k {method file a
0e20: 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66  rgs} {.    set f
0e30: 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ile [file tail $
0e40: 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 5b  file].    if { [
0e50: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a  string match *mj
0e60: 2a 20 24 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75  * $file] } { fau
0e70: 6c 74 73 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d  ltsim_save }.  }
0e80: 0a 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  ..  faultsim_del
0e90: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
0ea0: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
0eb0: 67 20 61 5f 73 74 72 69 6e 67 0a 0a 20 20 65 78  g a_string..  ex
0ec0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41  ecsql {.    ATTA
0ed0: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
0ee0: 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47 4d 41   aux;.    PRAGMA
0ef0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
0f00: 44 45 4c 45 54 45 3b 0a 20 20 20 20 50 52 41 47  DELETE;.    PRAG
0f10: 4d 41 20 6d 61 69 6e 2e 63 61 63 68 65 5f 73 69  MA main.cache_si
0f20: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41  ze = 10;.    PRA
0f30: 47 4d 41 20 61 75 78 2e 63 61 63 68 65 5f 73 69  GMA aux.cache_si
0f40: 7a 65 20 3d 20 31 30 3b 0a 0a 20 20 20 20 43 52  ze = 10;..    CR
0f50: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
0f60: 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55 45  UNIQUE, b UNIQUE
0f70: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
0f80: 42 4c 45 20 61 75 78 2e 74 32 28 61 20 55 4e 49  BLE aux.t2(a UNI
0f90: 51 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  QUE, b UNIQUE);.
0fa0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0fb0: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
0fc0: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
0fd0: 67 28 33 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  g(300));.    INS
0fe0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
0ff0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
1000: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
1010: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
1020: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1030: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
1040: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
1050: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
1060: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
1070: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 0a 20  CT * FROM t1;.. 
1080: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
1090: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
10a0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
10b0: 30 31 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  01), a_string(30
10c0: 31 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  1) FROM t1;.    
10d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
10e0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10f0: 28 32 30 32 29 2c 20 61 5f 73 74 72 69 6e 67 28  (202), a_string(
1100: 33 30 32 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  302) FROM t1;.  
1110: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1120: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
1130: 6e 67 28 32 30 33 29 2c 20 61 5f 73 74 72 69 6e  ng(203), a_strin
1140: 67 28 33 30 33 29 20 46 52 4f 4d 20 74 31 3b 0a  g(303) FROM t1;.
1150: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1160: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
1170: 72 69 6e 67 28 32 30 34 29 2c 20 61 5f 73 74 72  ring(204), a_str
1180: 69 6e 67 28 33 30 34 29 20 46 52 4f 4d 20 74 31  ing(304) FROM t1
1190: 3b 0a 20 20 20 20 20 20 52 45 50 4c 41 43 45 20  ;.      REPLACE 
11a0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a  INTO t2 SELECT *
11b0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f   FROM t1;.    CO
11c0: 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 64 62 20  MMIT;.  }..  db 
11d0: 63 6c 6f 73 65 0a 20 20 74 73 74 76 66 73 20 64  close.  tstvfs d
11e0: 65 6c 65 74 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61  elete.} {}.do_fa
11f0: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
1200: 72 66 61 75 6c 74 2d 33 20 2d 70 72 65 70 20 7b  rfault-3 -prep {
1210: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
1220: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d  ore_and_reopen.}
1230: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
1240: 71 6c 20 7b 20 0a 20 20 20 20 41 54 54 41 43 48  ql { .    ATTACH
1250: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
1260: 75 78 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  ux;.    SELECT c
1270: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b  ount(*) FROM t2;
1280: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
1290: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
12a0: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  }.} -test {.  fa
12b0: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
12c0: 6c 74 20 7b 30 20 7b 34 20 34 7d 7d 20 7b 31 20  lt {0 {4 4}} {1 
12d0: 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  {unable to open 
12e0: 64 61 74 61 62 61 73 65 3a 20 74 65 73 74 2e 64  database: test.d
12f0: 62 32 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  b2}}.  faultsim_
1300: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
1310: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 54 54    catchsql { ATT
1320: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
1330: 53 20 61 75 78 20 7d 0a 20 20 69 66 20 7b 5b 64  S aux }.  if {[d
1340: 62 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54 20 63  b one { SELECT c
1350: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
1360: 7d 5d 20 21 3d 20 34 0a 20 20 20 7c 7c 20 5b 64  }] != 4.   || [d
1370: 62 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54 20 63  b one { SELECT c
1380: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
1390: 7d 5d 20 21 3d 20 34 0a 20 20 7d 20 7b 0a 20 20  }] != 4.  } {.  
13a0: 20 20 65 72 72 6f 72 20 22 44 61 74 61 62 61 73    error "Databas
13b0: 65 20 63 6f 6e 74 65 6e 74 20 61 70 70 65 61 72  e content appear
13c0: 73 20 69 6e 63 6f 72 72 65 63 74 22 0a 20 20 7d  s incorrect".  }
13d0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1420: 20 54 65 73 74 20 66 61 75 6c 74 2d 69 6e 6a 65   Test fault-inje
1430: 63 74 69 6f 6e 20 61 73 20 70 61 72 74 20 6f 66  ction as part of
1440: 20 61 20 76 61 6e 69 6c 6c 61 2c 20 6e 6f 2d 74   a vanilla, no-t
1450: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 49 4e 53 45  ransaction, INSE
1460: 52 54 0a 23 20 73 74 61 74 65 6d 65 6e 74 2e 0a  RT.# statement..
1470: 23 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  #.do_faultsim_te
1480: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 34 20  st pagerfault-4 
1490: 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73  -prep {.  faults
14a0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
14b0: 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20  open.} -body {. 
14c0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
14d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 79  CREATE TABLE x(y
14e0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
14f0: 54 4f 20 78 20 56 41 4c 55 45 53 28 27 7a 27 29  TO x VALUES('z')
1500: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
1510: 52 4f 4d 20 78 3b 0a 20 20 7d 0a 7d 20 2d 74 65  ROM x;.  }.} -te
1520: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
1530: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7a  test_result {0 z
1540: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74  }.  faultsim_int
1550: 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a  egrity_check.}..
1560: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
15b0: 74 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f  t fault-injectio
15c0: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 63  n as part of a c
15d0: 6f 6d 6d 69 74 20 77 68 65 6e 20 75 73 69 6e 67  ommit when using
15e0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
15f0: 52 53 49 53 54 2e 0a 23 20 54 68 72 65 65 20 64  RSIST..# Three d
1600: 69 66 66 65 72 65 6e 74 20 63 61 73 65 73 3a 0a  ifferent cases:.
1610: 23 0a 23 20 20 20 20 70 61 67 65 72 66 61 75 6c  #.#    pagerfaul
1620: 74 2d 35 2e 31 3a 20 57 69 74 68 20 6e 6f 20 6a  t-5.1: With no j
1630: 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69  ournal_size_limi
1640: 74 20 63 6f 6e 66 69 67 75 72 65 64 2e 0a 23 20  t configured..# 
1650: 20 20 20 70 61 67 65 72 66 61 75 6c 74 2d 35 2e     pagerfault-5.
1660: 32 3a 20 57 69 74 68 20 61 20 6a 6f 75 72 6e 61  2: With a journa
1670: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 20 63 6f 6e  l_size_limit con
1680: 66 69 67 75 72 65 64 2e 0a 23 20 20 20 20 70 61  figured..#    pa
1690: 67 65 72 66 61 75 6c 74 2d 35 2e 34 3a 20 4d 75  gerfault-5.4: Mu
16a0: 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
16b0: 74 69 6f 6e 2e 20 4f 6e 65 20 63 6f 6e 6e 65 63  tion. One connec
16c0: 74 69 6f 6e 20 68 61 73 20 61 20 0a 23 20 20 20  tion has a .#   
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69   journal_size_li
16f0: 6d 69 74 20 6f 66 20 30 2c 20 74 68 65 20 6f 74  mit of 0, the ot
1700: 68 65 72 20 68 61 73 20 6e 6f 20 6c 69 6d 69 74  her has no limit
1710: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
1720: 72 66 61 75 6c 74 2d 35 2d 70 72 65 31 20 7b 0a  rfault-5-pre1 {.
1730: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
1740: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
1750: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
1760: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
1770: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1780: 54 41 42 4c 45 20 74 31 28 61 20 55 4e 49 51 55  TABLE t1(a UNIQU
1790: 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20  E, b UNIQUE);.  
17a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
17b0: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
17c0: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
17d0: 33 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  300));.    INSER
17e0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
17f0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
1800: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
1810: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
1820: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1830: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
1840: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
1850: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 66 61 75  OM t1;.  }.  fau
1860: 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63  ltsim_save_and_c
1870: 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75  lose.} {}.do_fau
1880: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
1890: 66 61 75 6c 74 2d 35 2e 31 20 2d 70 72 65 70 20  fault-5.1 -prep 
18a0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
18b0: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
18c0: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
18d0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
18e0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a  ecsql { PRAGMA j
18f0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
1900: 52 53 49 53 54 20 7d 0a 7d 20 2d 62 6f 64 79 20  RSIST }.} -body 
1910: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
1920: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1930: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
1940: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
1950: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d 74 65   FROM t1 }.} -te
1960: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
1970: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b  test_result {0 {
1980: 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e  }}.  faultsim_in
1990: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a  tegrity_check.}.
19a0: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
19b0: 20 70 61 67 65 72 66 61 75 6c 74 2d 35 2e 32 20   pagerfault-5.2 
19c0: 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73  -prep {.  faults
19d0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
19e0: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
19f0: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
1a00: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  g.  execsql { . 
1a10: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
1a20: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
1a30: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
1a40: 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 20  rnal_size_limit 
1a50: 3d 20 32 30 34 38 3b 0a 20 20 7d 0a 7d 20 2d 62  = 2048;.  }.} -b
1a60: 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ody {.  execsql 
1a70: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
1a80: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
1a90: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
1aa0: 33 30 30 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  300) FROM t1 }.}
1ab0: 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74   -test {.  fault
1ac0: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
1ad0: 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69  {0 {}}.  faultsi
1ae0: 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  m_integrity_chec
1af0: 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  k.}.do_faultsim_
1b00: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
1b10: 35 2e 33 20 2d 66 61 75 6c 74 73 20 6f 6f 6d 2d  5.3 -faults oom-
1b20: 74 72 61 6e 73 69 65 6e 74 20 2d 70 72 65 70 20  transient -prep 
1b30: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
1b40: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
1b50: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
1b60: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 66 6f  ng a_string.  fo
1b70: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e  rcedelete test2.
1b80: 64 62 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72  db test2.db-jour
1b90: 6e 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  nal test2.db-wal
1ba0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
1bb0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
1bc0: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
1bd0: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
1be0: 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20  t2.db' AS aux;. 
1bf0: 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 6a 6f     PRAGMA aux.jo
1c00: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
1c10: 53 49 53 54 3b 0a 20 20 20 20 50 52 41 47 4d 41  SIST;.    PRAGMA
1c20: 20 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 73 69 7a   aux.journal_siz
1c30: 65 5f 6c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d  e_limit = 0;.  }
1c40: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65  .} -body {.  exe
1c50: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
1c60: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1c70: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
1c80: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
1c90: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
1ca0: 74 31 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  t1;.      CREATE
1cb0: 20 54 41 42 4c 45 20 61 75 78 2e 74 32 20 41 53   TABLE aux.t2 AS
1cc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1cd0: 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  1;.    COMMIT;. 
1ce0: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
1cf0: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
1d00: 75 6c 74 20 7b 30 20 7b 7d 7d 0a 0a 20 20 63 61  ult {0 {}}..  ca
1d10: 74 63 68 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20  tchsql { COMMIT 
1d20: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 52  }.  catchsql { R
1d30: 4f 4c 4c 42 41 43 4b 20 7d 0a 0a 20 20 66 61 75  OLLBACK }..  fau
1d40: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
1d50: 63 68 65 63 6b 0a 20 20 73 65 74 20 72 65 73 20  check.  set res 
1d60: 22 22 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74  "".  set rc [cat
1d70: 63 68 20 7b 20 73 65 74 20 72 65 73 20 5b 64 62  ch { set res [db
1d80: 20 6f 6e 65 20 7b 20 50 52 41 47 4d 41 20 61 75   one { PRAGMA au
1d90: 78 2e 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  x.integrity_chec
1da0: 6b 20 7d 5d 20 7d 5d 0a 20 20 69 66 20 7b 24 72  k }] }].  if {$r
1db0: 63 21 3d 30 20 7c 7c 20 24 72 65 73 20 21 3d 20  c!=0 || $res != 
1dc0: 22 6f 6b 22 7d 20 7b 65 72 72 6f 72 20 22 69 6e  "ok"} {error "in
1dd0: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 70 72  tegrity-check pr
1de0: 6f 62 6c 65 6d 3a 24 72 63 20 24 72 65 73 22 7d  oblem:$rc $res"}
1df0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1e40: 20 54 65 73 74 20 66 61 75 6c 74 2d 69 6e 6a 65   Test fault-inje
1e50: 63 74 69 6f 6e 20 61 73 20 70 61 72 74 20 6f 66  ction as part of
1e60: 20 61 20 63 6f 6d 6d 69 74 20 77 68 65 6e 20 75   a commit when u
1e70: 73 69 6e 67 20 0a 23 20 6a 6f 75 72 6e 61 6c 5f  sing .# journal_
1e80: 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 2e 0a 23  mode=TRUNCATE..#
1e90: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61  .do_test pagerfa
1ea0: 75 6c 74 2d 36 2d 70 72 65 31 20 7b 0a 20 20 66  ult-6-pre1 {.  f
1eb0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
1ec0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
1ed0: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
1ee0: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
1ef0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
1f00: 4c 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20  LE t1(a UNIQUE, 
1f10: 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 49  b UNIQUE);.    I
1f20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1f30: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 30  LUES(a_string(20
1f40: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
1f50: 29 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  ));.  }.  faults
1f60: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
1f70: 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 66 61 75 6c 74  e.} {}..do_fault
1f80: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
1f90: 75 6c 74 2d 36 2e 31 20 2d 70 72 65 70 20 7b 0a  ult-6.1 -prep {.
1fa0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
1fb0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
1fc0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
1fd0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
1fe0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
1ff0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e  rnal_mode = TRUN
2000: 43 41 54 45 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b  CATE }.} -body {
2010: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
2020: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
2030: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
2040: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
2050: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78 65 63  FROM t1 }.  exec
2060: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
2070: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
2080: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
2090: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31  ing(300) FROM t1
20a0: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
20b0: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
20c0: 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20 66 61 75  ult {0 {}}.  fau
20d0: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
20e0: 63 68 65 63 6b 0a 7d 0a 0a 23 20 54 68 65 20 75  check.}..# The u
20f0: 6e 69 78 20 76 66 73 20 78 41 63 63 65 73 73 28  nix vfs xAccess(
2100: 29 20 6d 65 74 68 6f 64 20 63 6f 6e 73 69 64 65  ) method conside
2110: 72 73 20 61 20 66 69 6c 65 20 7a 65 72 6f 20 62  rs a file zero b
2120: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 74 6f 0a  ytes in size to.
2130: 23 20 22 6e 6f 74 20 65 78 69 73 74 22 2e 20 54  # "not exist". T
2140: 68 69 73 20 70 72 6f 63 20 6f 76 65 72 72 69 64  his proc overrid
2150: 65 73 20 74 68 61 74 20 62 65 68 61 76 69 6f 75  es that behaviou
2160: 72 20 73 6f 20 74 68 61 74 20 61 20 7a 65 72 6f  r so that a zero
2170: 20 6c 65 6e 67 74 68 0a 23 20 66 69 6c 65 20 69   length.# file i
2180: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  s considered to 
2190: 65 78 69 73 74 2e 0a 23 0a 70 72 6f 63 20 78 41  exist..#.proc xA
21a0: 63 63 65 73 73 20 7b 6d 65 74 68 6f 64 20 66 69  ccess {method fi
21b0: 6c 65 6e 61 6d 65 20 6f 70 20 61 72 67 73 7d 20  lename op args} 
21c0: 7b 0a 20 20 69 66 20 7b 24 6f 70 20 21 3d 20 22  {.  if {$op != "
21d0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
21e0: 49 53 54 53 22 7d 20 7b 20 72 65 74 75 72 6e 20  ISTS"} { return 
21f0: 22 22 20 7d 0a 20 20 72 65 74 75 72 6e 20 5b 66  "" }.  return [f
2200: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
2210: 6e 61 6d 65 5d 0a 7d 0a 64 6f 5f 66 61 75 6c 74  name].}.do_fault
2220: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
2230: 75 6c 74 2d 36 2e 32 20 2d 66 61 75 6c 74 73 20  ult-6.2 -faults 
2240: 63 61 6e 74 6f 70 65 6e 2d 2a 20 2d 70 72 65 70  cantopen-* -prep
2250: 20 7b 0a 20 20 73 68 6d 66 61 75 6c 74 20 66 69   {.  shmfault fi
2260: 6c 74 65 72 20 78 41 63 63 65 73 73 0a 20 20 73  lter xAccess.  s
2270: 68 6d 66 61 75 6c 74 20 73 63 72 69 70 74 20 78  hmfault script x
2280: 41 63 63 65 73 73 0a 0a 20 20 66 61 75 6c 74 73  Access..  faults
2290: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
22a0: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
22b0: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
22c0: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  g.  execsql { PR
22d0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
22e0: 65 20 3d 20 54 52 55 4e 43 41 54 45 20 7d 0a 7d  e = TRUNCATE }.}
22f0: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
2300: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
2310: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
2320: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
2330: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 20  ng(300) FROM t1 
2340: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  }.  execsql { IN
2350: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2360: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
2370: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
2380: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d 74 65   FROM t1 }.} -te
2390: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
23a0: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b  test_result {0 {
23b0: 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e  }}.  faultsim_in
23c0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a  tegrity_check.}.
23d0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
23e0: 20 77 61 73 20 61 6e 20 61 74 74 65 6d 70 74 20   was an attempt 
23f0: 74 6f 20 67 65 74 20 61 20 62 69 74 76 65 63 20  to get a bitvec 
2400: 6d 61 6c 6c 6f 63 20 74 6f 20 66 61 69 6c 2e 20  malloc to fail. 
2410: 44 69 64 6e 27 74 20 77 6f 72 6b 2e 0a 23 0a 23  Didn't work..#.#
2420: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61   do_test pagerfa
2430: 75 6c 74 2d 36 2d 70 72 65 31 20 7b 0a 23 20 20  ult-6-pre1 {.#  
2440: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
2450: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 23 20 20 20  _and_reopen.#   
2460: 65 78 65 63 73 71 6c 20 7b 0a 23 20 20 20 20 20  execsql {.#     
2470: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2480: 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
2490: 79 29 29 3b 0a 23 20 20 20 20 20 49 4e 53 45 52  y));.#     INSER
24a0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
24b0: 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (1, randomblob(1
24c0: 35 30 31 29 29 3b 0a 23 20 20 20 20 20 49 4e 53  501));.#     INS
24d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
24e0: 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(2, randomblob
24f0: 28 31 35 30 32 29 29 3b 0a 23 20 20 20 20 20 49  (1502));.#     I
2500: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2510: 4c 55 45 53 28 33 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(3, randombl
2520: 6f 62 28 31 35 30 33 29 29 3b 0a 23 20 20 20 20  ob(1503));.#    
2530: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2540: 56 41 4c 55 45 53 28 34 2c 20 72 61 6e 64 6f 6d  VALUES(4, random
2550: 62 6c 6f 62 28 31 35 30 34 29 29 3b 0a 23 20 20  blob(1504));.#  
2560: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2570: 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45 43  1 .#       SELEC
2580: 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  T x, randomblob(
2590: 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43 54  1500+oid+(SELECT
25a0: 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20 74   max(oid) FROM t
25b0: 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20 20  1)) FROM t1;.#  
25c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
25d0: 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45 43  1 .#       SELEC
25e0: 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  T x, randomblob(
25f0: 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43 54  1500+oid+(SELECT
2600: 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20 74   max(oid) FROM t
2610: 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20 20  1)) FROM t1;.#  
2620: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2630: 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45 43  1 .#       SELEC
2640: 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  T x, randomblob(
2650: 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43 54  1500+oid+(SELECT
2660: 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20 74   max(oid) FROM t
2670: 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20 20  1)) FROM t1;.#  
2680: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2690: 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45 43  1 .#       SELEC
26a0: 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  T x, randomblob(
26b0: 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43 54  1500+oid+(SELECT
26c0: 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20 74   max(oid) FROM t
26d0: 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20 20  1)) FROM t1;.#  
26e0: 20 7d 0a 23 20 20 20 66 61 75 6c 74 73 69 6d 5f   }.#   faultsim_
26f0: 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 23  save_and_close.#
2700: 20 7d 20 7b 7d 0a 23 20 64 6f 5f 66 61 75 6c 74   } {}.# do_fault
2710: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
2720: 75 6c 74 2d 36 20 2d 70 72 65 70 20 7b 0a 23 20  ult-6 -prep {.# 
2730: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
2740: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 23 20  re_and_reopen.# 
2750: 7d 20 2d 62 6f 64 79 20 7b 0a 23 20 20 20 65 78  } -body {.#   ex
2760: 65 63 73 71 6c 20 7b 20 0a 23 20 20 20 20 20 42  ecsql { .#     B
2770: 45 47 49 4e 3b 0a 23 20 20 20 20 20 20 20 55 50  EGIN;.#       UP
2780: 44 41 54 45 20 74 31 20 53 45 54 20 78 3d 78 2b  DATE t1 SET x=x+
2790: 34 20 57 48 45 52 45 20 78 3d 31 3b 0a 23 20 20  4 WHERE x=1;.#  
27a0: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
27b0: 6e 65 3b 0a 23 20 20 20 20 20 20 20 20 20 55 50  ne;.#         UP
27c0: 44 41 54 45 20 74 31 20 53 45 54 20 78 3d 78 2b  DATE t1 SET x=x+
27d0: 34 20 57 48 45 52 45 20 78 3d 32 3b 0a 23 20 20  4 WHERE x=2;.#  
27e0: 20 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54         SAVEPOINT
27f0: 20 74 68 72 65 65 3b 0a 23 20 20 20 20 20 20 20   three;.#       
2800: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
2810: 54 20 78 3d 78 2b 34 20 57 48 45 52 45 20 78 3d  T x=x+4 WHERE x=
2820: 33 3b 0a 23 20 20 20 20 20 20 20 20 20 20 20 53  3;.#           S
2830: 41 56 45 50 4f 49 4e 54 20 66 6f 75 72 3b 0a 23  AVEPOINT four;.#
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 50 44               UPD
2850: 41 54 45 20 74 31 20 53 45 54 20 78 3d 78 2b 34  ATE t1 SET x=x+4
2860: 20 57 48 45 52 45 20 78 3d 34 3b 0a 23 20 20 20   WHERE x=4;.#   
2870: 20 20 20 20 20 20 52 45 4c 45 41 53 45 20 74 68        RELEASE th
2880: 72 65 65 3b 0a 23 20 20 20 20 20 43 4f 4d 4d 49  ree;.#     COMMI
2890: 54 3b 0a 23 20 20 20 20 20 53 45 4c 45 43 54 20  T;.#     SELECT 
28a0: 44 49 53 54 49 4e 43 54 20 78 20 46 52 4f 4d 20  DISTINCT x FROM 
28b0: 74 31 3b 0a 23 20 20 20 7d 0a 23 20 7d 20 2d 74  t1;.#   }.# } -t
28c0: 65 73 74 20 7b 0a 23 20 20 20 66 61 75 6c 74 73  est {.#   faults
28d0: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
28e0: 30 20 7b 35 20 36 20 37 20 38 7d 7d 0a 23 20 20  0 {5 6 7 8}}.#  
28f0: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
2900: 69 74 79 5f 63 68 65 63 6b 0a 23 20 7d 0a 23 0a  ity_check.# }.#.
2910: 0a 23 20 54 68 69 73 20 69 73 20 64 65 73 69 67  .# This is desig
2920: 6e 65 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20 61  ned to provoke a
2930: 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
2940: 20 74 68 65 20 70 61 67 65 72 20 63 6f 64 65 3a   the pager code:
2950: 0a 23 0a 23 20 49 66 20 61 6e 20 65 72 72 6f 72  .#.# If an error
2960: 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20   (specifically, 
2970: 61 20 46 55 4c 4c 20 6f 72 20 49 4f 45 52 52 20  a FULL or IOERR 
2980: 65 72 72 6f 72 29 20 6f 63 63 75 72 73 20 77 68  error) occurs wh
2990: 69 6c 65 20 77 72 69 74 69 6e 67 20 61 0a 23 20  ile writing a.# 
29a0: 64 69 72 74 79 20 70 61 67 65 20 74 6f 20 74 68  dirty page to th
29b0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
29c0: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
29d0: 70 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 70 61  p memory, the pa
29e0: 67 65 72 20 65 6e 74 65 72 73 0a 23 20 74 68 65  ger enters.# the
29f0: 20 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 20   "error state". 
2a00: 41 6e 20 49 4f 20 65 72 72 6f 72 20 63 61 75 73  An IO error caus
2a10: 65 73 20 53 51 4c 69 74 65 20 74 6f 20 72 6f 6c  es SQLite to rol
2a20: 6c 20 62 61 63 6b 20 74 68 65 20 63 75 72 72 65  l back the curre
2a30: 6e 74 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  nt.# transaction
2a40: 20 28 65 78 69 74 69 6e 67 20 74 68 65 20 65 72   (exiting the er
2a50: 72 6f 72 20 73 74 61 74 65 29 2e 20 41 20 46 55  ror state). A FU
2a60: 4c 4c 20 65 72 72 6f 72 2c 20 68 6f 77 65 76 65  LL error, howeve
2a70: 72 2c 20 6d 61 79 20 6f 6e 6c 79 0a 23 20 72 6f  r, may only.# ro
2a80: 6c 6c 62 61 63 6b 20 74 68 65 20 63 75 72 72 65  llback the curre
2a90: 6e 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a  nt statement..#.
2aa0: 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  # This block tes
2ab0: 74 73 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 20  ts that nothing 
2ac0: 67 6f 65 73 20 77 72 6f 6e 67 20 69 66 20 61 20  goes wrong if a 
2ad0: 46 55 4c 4c 20 65 72 72 6f 72 20 6f 63 63 75 72  FULL error occur
2ae0: 73 20 77 68 69 6c 65 0a 23 20 77 72 69 74 69 6e  s while.# writin
2af0: 67 20 61 20 64 69 72 74 79 20 70 61 67 65 20 6f  g a dirty page o
2b00: 75 74 20 74 6f 20 66 72 65 65 20 6d 65 6d 6f 72  ut to free memor
2b10: 79 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  y from within a 
2b20: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 68  statement that h
2b30: 61 73 0a 23 20 6f 70 65 6e 65 64 20 61 20 73 74  as.# opened a st
2b40: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
2b50: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ion..#.do_test p
2b60: 61 67 65 72 66 61 75 6c 74 2d 37 2d 70 72 65 31  agerfault-7-pre1
2b70: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
2b80: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
2b90: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2ba0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
2bb0: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
2bc0: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 42  Y KEY, b);.    B
2bd0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
2be0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
2bf0: 53 28 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c  S(NULL, randombl
2c00: 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20 20  ob(1500));.     
2c10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
2c20: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 72 61 6e  VALUES(NULL, ran
2c30: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2c40: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2c50: 4f 20 74 32 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t2 SELECT NULL
2c60: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
2c70: 30 29 20 46 52 4f 4d 20 74 32 3b 20 20 20 20 2d  0) FROM t2;    -
2c80: 2d 20 20 34 0a 20 20 20 20 20 20 49 4e 53 45 52  -  4.      INSER
2c90: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
2ca0: 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f   NULL, randomblo
2cb0: 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 32 3b  b(1500) FROM t2;
2cc0: 20 20 20 20 2d 2d 20 20 38 0a 20 20 20 20 20 20      --  8.      
2cd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
2ce0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64  ELECT NULL, rand
2cf0: 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
2d00: 4d 20 74 32 3b 20 20 20 20 2d 2d 20 31 36 0a 20  M t2;    -- 16. 
2d10: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2d20: 20 74 32 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t2 SELECT NULL,
2d30: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
2d40: 29 20 46 52 4f 4d 20 74 32 3b 20 20 20 20 2d 2d  ) FROM t2;    --
2d50: 20 33 32 0a 20 20 20 20 20 20 49 4e 53 45 52 54   32.      INSERT
2d60: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
2d70: 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  NULL, randomblob
2d80: 28 31 35 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  (1500) FROM t2; 
2d90: 20 20 20 2d 2d 20 36 34 0a 20 20 20 20 43 4f 4d     -- 64.    COM
2da0: 4d 49 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20  MIT;.    CREATE 
2db0: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
2dc0: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
2dd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2de0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
2df0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
2e00: 74 32 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  t2;.  }.  faults
2e10: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
2e20: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
2e30: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
2e40: 6c 74 2d 37 20 2d 70 72 65 70 20 7b 0a 20 20 66  lt-7 -prep {.  f
2e50: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
2e60: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
2e70: 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  csql { .    PRAG
2e80: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
2e90: 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  10;.    BEGIN;. 
2ea0: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
2eb0: 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f  ET b = randomblo
2ec0: 62 28 31 35 30 30 29 3b 0a 20 20 7d 0a 7d 20 2d  b(1500);.  }.} -
2ed0: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
2ee0: 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45 54   { UPDATE t1 SET
2ef0: 20 61 20 3d 20 36 35 2c 20 62 20 3d 20 72 61 6e   a = 65, b = ran
2f00: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 57 48  domblob(1500) WH
2f10: 45 52 45 20 28 61 2b 31 29 3e 32 30 30 20 7d 0a  ERE (a+1)>200 }.
2f20: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
2f30: 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75  .} -test {.  fau
2f40: 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c  ltsim_test_resul
2f50: 74 20 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74  t {0 {}}.  fault
2f60: 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  sim_integrity_ch
2f70: 65 63 6b 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  eck.}..do_test p
2f80: 61 67 65 72 66 61 75 6c 74 2d 38 2d 70 72 65 31  agerfault-8-pre1
2f90: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
2fa0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
2fb0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2fc0: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
2fd0: 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52 45 41  um = 1;.    CREA
2fe0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
2ff0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
3000: 59 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49 4e  Y, b);.    BEGIN
3010: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3020: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55  NTO t1 VALUES(NU
3030: 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  LL, randomblob(1
3040: 35 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  500));.      INS
3050: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3060: 45 53 28 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62  ES(NULL, randomb
3070: 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20  lob(1500));.    
3080: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3090: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61   SELECT NULL, ra
30a0: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
30b0: 52 4f 4d 20 74 31 3b 20 20 20 20 2d 2d 20 20 34  ROM t1;    --  4
30c0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
30d0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
30e0: 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  L, randomblob(15
30f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
3100: 2d 2d 20 20 38 0a 20 20 20 20 20 20 49 4e 53 45  --  8.      INSE
3110: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
3120: 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c  T NULL, randombl
3130: 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
3140: 3b 20 20 20 20 2d 2d 20 31 36 0a 20 20 20 20 20  ;    -- 16.     
3150: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3160: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e  SELECT NULL, ran
3170: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
3180: 4f 4d 20 74 31 3b 20 20 20 20 2d 2d 20 33 32 0a  OM t1;    -- 32.
3190: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
31a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
31b0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
31c0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 2d  0) FROM t1;    -
31d0: 2d 20 36 34 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  - 64.    COMMIT;
31e0: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
31f0: 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 20  save_and_close. 
3200: 20 73 65 74 20 66 69 6c 65 73 69 7a 65 20 5b 66   set filesize [f
3210: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
3220: 5d 0a 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 7d 20  ].  set {} {}.} 
3230: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
3240: 66 61 75 6c 74 2d 38 2d 70 72 65 32 20 7b 0a 20  fault-8-pre2 {. 
3250: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
3260: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
3270: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  xecsql { DELETE 
3280: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3e  FROM t1 WHERE a>
3290: 33 32 20 7d 0a 20 20 65 78 70 72 20 7b 5b 66 69  32 }.  expr {[fi
32a0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
32b0: 20 3c 20 24 66 69 6c 65 73 69 7a 65 7d 0a 7d 20   < $filesize}.} 
32c0: 7b 31 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  {1}.do_faultsim_
32d0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
32e0: 38 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  8 -prep {.  faul
32f0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
3300: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
3310: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
3320: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
3330: 74 31 20 57 48 45 52 45 20 61 3e 33 32 3b 0a 20  t1 WHERE a>32;. 
3340: 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65   }.} -body {.  e
3350: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  xecsql COMMIT.} 
3360: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
3370: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
3380: 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d  0 {}}.  faultsim
3390: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
33a0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
33f0: 20 54 68 69 73 20 74 65 73 74 20 63 61 73 65 20   This test case 
3400: 69 73 20 73 70 65 63 69 61 6c 6c 79 20 64 65 73  is specially des
3410: 69 67 6e 65 64 20 73 6f 20 74 68 61 74 20 64 75  igned so that du
3420: 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
3430: 20 0a 23 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 20   .# rollback, a 
3440: 6e 65 77 20 63 61 63 68 65 20 65 6e 74 72 79 20  new cache entry 
3450: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
3460: 64 20 28 73 65 65 20 63 6f 6d 6d 65 6e 74 73 20  d (see comments 
3470: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 23 20 74 68  surrounding.# th
3480: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
3490: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20  3PagerAcquire() 
34a0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
34b0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
34c0: 61 67 65 28 29 0a 23 20 66 6f 72 20 64 65 74 61  age().# for deta
34d0: 69 6c 73 29 2e 20 54 65 73 74 20 74 68 65 20 65  ils). Test the e
34e0: 66 66 65 63 74 73 20 6f 66 20 69 6e 6a 65 63 74  ffects of inject
34f0: 69 6e 67 20 61 6e 20 4f 4f 4d 20 61 74 20 74 68  ing an OOM at th
3500: 69 73 20 70 6f 69 6e 74 2e 0a 23 0a 64 6f 5f 74  is point..#.do_t
3510: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 39  est pagerfault-9
3520: 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73  -pre1 {.  faults
3530: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
3540: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
3550: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
3560: 5f 76 61 63 75 75 6d 20 3d 20 69 6e 63 72 65 6d  _vacuum = increm
3570: 65 6e 74 61 6c 3b 0a 20 20 20 20 43 52 45 41 54  ental;.    CREAT
3580: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
3590: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
35a0: 74 32 28 79 29 3b 0a 20 20 20 20 43 52 45 41 54  t2(y);.    CREAT
35b0: 45 20 54 41 42 4c 45 20 74 33 28 7a 29 3b 0a 0a  E TABLE t3(z);..
35c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
35d0: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
35e0: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
35f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3600: 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
3610: 28 39 30 30 29 29 3b 0a 20 20 20 20 44 45 4c 45  (900));.    DELE
3620: 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  TE FROM t1;.  }.
3630: 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f    faultsim_save_
3640: 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64  and_close.} {}.d
3650: 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20  o_faultsim_test 
3660: 70 61 67 65 72 66 61 75 6c 74 2d 39 2e 31 20 2d  pagerfault-9.1 -
3670: 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69  prep {.  faultsi
3680: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3690: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
36a0: 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
36b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
36c0: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
36d0: 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 20  lob(900));.     
36e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
36f0: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
3700: 62 28 39 30 30 29 29 3b 0a 20 20 20 20 20 20 44  b(900));.      D
3710: 52 4f 50 20 54 41 42 4c 45 20 74 33 3b 0a 20 20  ROP TABLE t3;.  
3720: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
3730: 32 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49  2;.      SAVEPOI
3740: 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20 20 20  NT abc;.        
3750: 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74  PRAGMA increment
3760: 61 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 7d 0a 7d  al_vacuum;.  }.}
3770: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
3780: 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  ql {.    ROLLBAC
3790: 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f  K TO abc;.    CO
37a0: 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41  MMIT;.    PRAGMA
37b0: 20 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74 0a   freelist_count.
37c0: 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20    }.} -test {.  
37d0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
37e0: 73 75 6c 74 20 7b 30 20 32 7d 0a 20 20 66 61 75  sult {0 2}.  fau
37f0: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
3800: 63 68 65 63 6b 0a 0a 20 20 73 65 74 20 73 6c 20  check..  set sl 
3810: 5b 64 62 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54  [db one { SELECT
3820: 20 43 4f 41 4c 45 53 43 45 28 73 75 6d 28 6c 65   COALESCE(sum(le
3830: 6e 67 74 68 28 78 29 29 2c 20 27 6e 75 6c 6c 27  ngth(x)), 'null'
3840: 29 20 46 52 4f 4d 20 74 31 20 7d 5d 0a 20 20 69  ) FROM t1 }].  i
3850: 66 20 7b 24 73 6c 21 3d 22 6e 75 6c 6c 22 20 26  f {$sl!="null" &
3860: 26 20 24 73 6c 21 3d 31 38 30 30 7d 20 7b 20 0a  & $sl!=1800} { .
3870: 20 20 20 20 65 72 72 6f 72 20 22 43 6f 6e 74 65      error "Conte
3880: 6e 74 20 6c 6f 6f 6b 73 20 6e 6f 20 67 6f 6f 64  nt looks no good
3890: 2e 2e 2e 20 28 24 73 6c 29 22 20 0a 20 20 7d 0a  ... ($sl)" .  }.
38a0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
38b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
38f0: 54 65 73 74 20 66 61 75 6c 74 20 69 6e 6a 65 63  Test fault injec
3900: 74 69 6f 6e 20 77 69 74 68 20 61 20 74 65 6d 70  tion with a temp
3910: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66  orary database f
3920: 69 6c 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20 76  ile..#.foreach v
3930: 20 7b 61 20 62 7d 20 7b 0a 20 20 64 6f 5f 66 61   {a b} {.  do_fa
3940: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
3950: 72 66 61 75 6c 74 2d 31 30 24 76 20 2d 70 72 65  rfault-10$v -pre
3960: 70 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  p {.    sqlite3 
3970: 64 62 20 22 22 0a 20 20 20 20 64 62 20 66 75 6e  db "".    db fun
3980: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
3990: 69 6e 67 3b 0a 20 20 20 20 65 78 65 63 73 71 6c  ing;.    execsql
39a0: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
39b0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
39c0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
39d0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
39e0: 4c 45 20 78 78 28 61 2c 20 62 2c 20 55 4e 49 51  LE xx(a, b, UNIQ
39f0: 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 20  UE(a, b));.     
3a00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
3a10: 78 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  x VALUES(a_strin
3a20: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
3a30: 28 32 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20  (200));.        
3a40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 78 20 53  INSERT INTO xx S
3a50: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
3a60: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30  00), a_string(20
3a70: 30 29 20 46 52 4f 4d 20 78 78 3b 0a 20 20 20 20  0) FROM xx;.    
3a80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3a90: 78 78 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  xx SELECT a_stri
3aa0: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3ab0: 67 28 32 30 30 29 20 46 52 4f 4d 20 78 78 3b 0a  g(200) FROM xx;.
3ac0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
3ad0: 4e 54 4f 20 78 78 20 53 45 4c 45 43 54 20 61 5f  NTO xx SELECT a_
3ae0: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
3af0: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
3b00: 78 78 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  xx;.        INSE
3b10: 52 54 20 49 4e 54 4f 20 78 78 20 53 45 4c 45 43  RT INTO xx SELEC
3b20: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
3b30: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46   a_string(200) F
3b40: 52 4f 4d 20 78 78 3b 0a 20 20 20 20 20 20 43 4f  ROM xx;.      CO
3b50: 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  MMIT;.    }.  } 
3b60: 2d 62 6f 64 79 20 7b 0a 20 20 20 20 65 78 65 63  -body {.    exec
3b70: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 78 78 20  sql { UPDATE xx 
3b80: 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67  SET a = a_string
3b90: 28 33 30 30 29 20 7d 0a 20 20 7d 20 2d 74 65 73  (300) }.  } -tes
3ba0: 74 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d  t {.    faultsim
3bb0: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
3bc0: 7b 7d 7d 0a 20 20 20 20 69 66 20 7b 24 3a 3a 76  {}}.    if {$::v
3bd0: 20 3d 3d 20 22 62 22 7d 20 7b 20 65 78 65 63 73   == "b"} { execs
3be0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
3bf0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43  nal_mode = TRUNC
3c00: 41 54 45 20 7d 20 7d 0a 20 20 20 20 66 61 75 6c  ATE } }.    faul
3c10: 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63  tsim_integrity_c
3c20: 68 65 63 6b 0a 20 20 20 20 66 61 75 6c 74 73 69  heck.    faultsi
3c30: 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  m_integrity_chec
3c40: 6b 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  k.  }.}..#------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c 74  ---.# Test fault
3ca0: 20 69 6e 6a 65 63 74 69 6f 6e 20 77 69 74 68 20   injection with 
3cb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
3cc0: 70 6f 69 6e 74 73 20 28 73 61 76 65 70 6f 69 6e  points (savepoin
3cd0: 74 73 20 63 72 65 61 74 65 64 0a 23 20 77 68 65  ts created.# whe
3ce0: 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 63 6f  n a SAVEPOINT co
3cf0: 6d 6d 61 6e 64 20 69 73 20 65 78 65 63 75 74 65  mmand is execute
3d00: 64 20 6f 75 74 73 69 64 65 20 6f 66 20 61 6e 79  d outside of any
3d10: 20 6f 74 68 65 72 20 73 61 76 65 70 6f 69 6e 74   other savepoint
3d20: 0a 23 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  .# or transactio
3d30: 6e 20 63 6f 6e 74 65 78 74 29 2e 0a 23 0a 64 6f  n context)..#.do
3d40: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
3d50: 2d 39 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c  -9-pre1 {.  faul
3d60: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
3d70: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
3d80: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
3d90: 6e 67 3b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ng;.  execsql {.
3da0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
3db0: 76 61 63 75 75 6d 20 3d 20 6f 6e 3b 0a 20 20 20  vacuum = on;.   
3dc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
3dd0: 28 78 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20  (x UNIQUE);.    
3de0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
3df0: 79 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43  y UNIQUE);.    C
3e00: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 7a  REATE TABLE t3(z
3e10: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 42 45   UNIQUE);.    BE
3e20: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
3e30: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3e40: 28 61 5f 73 74 72 69 6e 67 28 32 30 32 29 29 3b  (a_string(202));
3e50: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3e60: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73  TO t2 VALUES(a_s
3e70: 74 72 69 6e 67 28 32 30 33 29 29 3b 0a 20 20 20  tring(203));.   
3e80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3e90: 33 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  3 VALUES(a_strin
3ea0: 67 28 32 30 34 29 29 3b 0a 20 20 20 20 20 20 49  g(204));.      I
3eb0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
3ec0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
3ed0: 32 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  2) FROM t1;.    
3ee0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3ef0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
3f00: 28 32 30 33 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (203) FROM t1;. 
3f10: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3f20: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
3f30: 69 6e 67 28 32 30 34 29 20 46 52 4f 4d 20 74 31  ing(204) FROM t1
3f40: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3f50: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
3f60: 73 74 72 69 6e 67 28 32 30 35 29 20 46 52 4f 4d  string(205) FROM
3f70: 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t1;.      INSER
3f80: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
3f90: 20 61 5f 73 74 72 69 6e 67 28 6c 65 6e 67 74 68   a_string(length
3fa0: 28 78 29 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  (x)) FROM t1;.  
3fb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3fc0: 74 33 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t3 SELECT a_stri
3fd0: 6e 67 28 6c 65 6e 67 74 68 28 78 29 29 20 46 52  ng(length(x)) FR
3fe0: 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49  OM t1;.    COMMI
3ff0: 54 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69  T;.  }.  faultsi
4000: 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65  m_save_and_close
4010: 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69  .} {}.do_faultsi
4020: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
4030: 74 2d 31 31 20 2d 70 72 65 70 20 7b 0a 20 20 66  t-11 -prep {.  f
4040: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
4050: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
4060: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61  csql { PRAGMA ca
4070: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a  che_size = 10 }.
4080: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
4090: 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f  sql {.    SAVEPO
40a0: 49 4e 54 20 74 72 61 6e 73 3b 0a 20 20 20 20 20  INT trans;.     
40b0: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 79   UPDATE t2 SET y
40c0: 20 3d 20 79 7c 7c 27 32 27 3b 0a 20 20 20 20 20   = y||'2';.     
40d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
40e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
40f0: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
4100: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 52 4f 4c 4c  ROM t1;.    ROLL
4110: 42 41 43 4b 20 54 4f 20 74 72 61 6e 73 3b 0a 20  BACK TO trans;. 
4120: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
4130: 20 78 20 3d 20 78 7c 7c 27 33 27 3b 0a 20 20 20   x = x||'3';.   
4140: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
4150: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4160: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
4170: 4d 20 74 33 3b 0a 20 20 20 20 52 45 4c 45 41 53  M t3;.    RELEAS
4180: 45 20 74 72 61 6e 73 3b 0a 20 20 7d 0a 7d 20 2d  E trans;.  }.} -
4190: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
41a0: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
41b0: 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f   {}}.  faultsim_
41c0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
41d0: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
41e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
4220: 20 54 65 73 74 20 66 61 75 6c 74 20 69 6e 6a 65   Test fault inje
4230: 63 74 69 6f 6e 20 77 68 65 6e 20 77 72 69 74 69  ction when writi
4240: 6e 67 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  ng to a database
4250: 20 66 69 6c 65 20 74 68 61 74 20 72 65 73 69 64   file that resid
4260: 65 73 20 6f 6e 0a 23 20 61 20 66 69 6c 65 2d 73  es on.# a file-s
4270: 79 73 74 65 6d 20 77 69 74 68 20 61 20 73 65 63  ystem with a sec
4280: 74 6f 72 2d 73 69 7a 65 20 6c 61 72 67 65 72 20  tor-size larger 
4290: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
42a0: 65 20 70 61 67 65 2d 73 69 7a 65 2e 0a 23 0a 64  e page-size..#.d
42b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
42c0: 74 2d 31 32 2d 70 72 65 31 20 7b 0a 20 20 74 65  t-12-pre1 {.  te
42d0: 73 74 76 66 73 20 73 73 5f 6c 61 79 65 72 20 2d  stvfs ss_layer -
42e0: 64 65 66 61 75 6c 74 20 31 0a 20 20 73 73 5f 6c  default 1.  ss_l
42f0: 61 79 65 72 20 73 65 63 74 6f 72 73 69 7a 65 20  ayer sectorsize 
4300: 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f  4096.  faultsim_
4310: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
4320: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
4330: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 0a  ring a_string;..
4340: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4350: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
4360: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41   = 1024;.    PRA
4370: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
4380: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
4390: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
43a0: 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45 47 49  e = 10;.    BEGI
43b0: 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  N;.      CREATE 
43c0: 54 41 42 4c 45 20 74 31 28 78 2c 20 79 20 55 4e  TABLE t1(x, y UN
43d0: 49 51 55 45 29 3b 0a 20 20 20 20 20 20 49 4e 53  IQUE);.      INS
43e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
43f0: 45 53 28 61 5f 73 74 72 69 6e 67 28 33 33 33 29  ES(a_string(333)
4400: 2c 20 61 5f 73 74 72 69 6e 67 28 34 34 34 29 29  , a_string(444))
4410: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
4420: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
4430: 73 74 72 69 6e 67 28 33 33 33 2b 72 6f 77 69 64  string(333+rowid
4440: 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 34 34 2b  ), a_string(444+
4450: 72 6f 77 69 64 29 20 46 52 4f 4d 20 74 31 3b 0a  rowid) FROM t1;.
4460: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4470: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
4480: 72 69 6e 67 28 33 33 33 2b 72 6f 77 69 64 29 2c  ring(333+rowid),
4490: 20 61 5f 73 74 72 69 6e 67 28 34 34 34 2b 72 6f   a_string(444+ro
44a0: 77 69 64 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  wid) FROM t1;.  
44b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
44c0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
44d0: 6e 67 28 33 33 33 2b 72 6f 77 69 64 29 2c 20 61  ng(333+rowid), a
44e0: 5f 73 74 72 69 6e 67 28 34 34 34 2b 72 6f 77 69  _string(444+rowi
44f0: 64 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  d) FROM t1;.    
4500: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4510: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
4520: 28 33 33 33 2b 72 6f 77 69 64 29 2c 20 61 5f 73  (333+rowid), a_s
4530: 74 72 69 6e 67 28 34 34 34 2b 72 6f 77 69 64 29  tring(444+rowid)
4540: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
4550: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
4560: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34  ELECT a_string(4
4570: 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 35 29  4), a_string(55)
4580: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31   FROM t1 LIMIT 1
4590: 33 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  3;.    COMMIT;. 
45a0: 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61   }.  faultsim_sa
45b0: 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b  ve_and_close.} {
45c0: 7d 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74  }..do_faultsim_t
45d0: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31  est pagerfault-1
45e0: 32 61 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75  2a -prep {.  fau
45f0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
4600: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
4610: 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68  ql { PRAGMA cach
4620: 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20  e_size = 10 }.  
4630: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
4640: 20 61 5f 73 74 72 69 6e 67 3b 0a 7d 20 2d 62 6f   a_string;.} -bo
4650: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
4660: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
4670: 45 54 20 78 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET x = a_string(
4680: 6c 65 6e 67 74 68 28 78 29 29 2c 20 79 20 3d 20  length(x)), y = 
4690: 61 5f 73 74 72 69 6e 67 28 6c 65 6e 67 74 68 28  a_string(length(
46a0: 79 29 29 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74  y));.  }.} -test
46b0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65   {.  faultsim_te
46c0: 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d  st_result {0 {}}
46d0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65  .  faultsim_inte
46e0: 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 64  grity_check.}..d
46f0: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
4700: 74 2d 31 32 2d 70 72 65 32 20 7b 0a 20 20 66 61  t-12-pre2 {.  fa
4710: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
4720: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
4730: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
4740: 20 54 41 42 4c 45 20 74 32 20 41 53 20 53 45 4c   TABLE t2 AS SEL
4750: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 49  ECT * FROM t1 LI
4760: 4d 49 54 20 31 30 3b 0a 20 20 7d 0a 20 20 66 61  MIT 10;.  }.  fa
4770: 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f  ultsim_save_and_
4780: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61  close.} {}.do_fa
4790: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
47a0: 72 66 61 75 6c 74 2d 31 32 62 20 2d 70 72 65 70  rfault-12b -prep
47b0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
47c0: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
47d0: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
47e0: 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 20 20  ing a_string;.  
47f0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
4800: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d   * FROM t1 }.} -
4810: 62 6f 64 79 20 7b 0a 20 20 73 65 74 20 73 71 6c  body {.  set sql
4820: 28 31 29 20 7b 20 55 50 44 41 54 45 20 74 32 20  (1) { UPDATE t2 
4830: 53 45 54 20 78 20 3d 20 61 5f 73 74 72 69 6e 67  SET x = a_string
4840: 28 32 38 30 29 20 7d 0a 20 20 73 65 74 20 73 71  (280) }.  set sq
4850: 6c 28 32 29 20 7b 20 55 50 44 41 54 45 20 74 31  l(2) { UPDATE t1
4860: 20 53 45 54 20 78 20 3d 20 61 5f 73 74 72 69 6e   SET x = a_strin
4870: 67 28 32 38 30 29 20 57 48 45 52 45 20 72 6f 77  g(280) WHERE row
4880: 69 64 20 3d 20 35 20 7d 0a 0a 20 20 64 62 20 65  id = 5 }..  db e
4890: 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 72 6f 77  val { SELECT row
48a0: 69 64 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54  id FROM t1 LIMIT
48b0: 20 32 20 7d 20 7b 20 64 62 20 65 76 61 6c 20 24   2 } { db eval $
48c0: 73 71 6c 28 24 72 6f 77 69 64 29 20 7d 0a 0a 7d  sql($rowid) }..}
48d0: 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74   -test {.  fault
48e0: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
48f0: 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69  {0 {}}.  faultsi
4900: 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  m_integrity_chec
4910: 6b 0a 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62 20  k.}..catch { db 
4920: 63 6c 6f 73 65 20 7d 0a 73 73 5f 6c 61 79 65 72  close }.ss_layer
4930: 20 64 65 6c 65 74 65 0a 0a 0a 23 2d 2d 2d 2d 2d   delete...#-----
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4980: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c  ----.# Test faul
4990: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 77 68 65 6e  t injection when
49a0: 20 53 51 4c 69 74 65 20 6f 70 65 6e 73 20 61 20   SQLite opens a 
49b0: 64 61 74 61 62 61 73 65 20 77 68 65 72 65 20 74  database where t
49c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 23  he size of the.#
49d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
49e0: 73 20 7a 65 72 6f 20 62 79 74 65 73 20 62 75 74  s zero bytes but
49f0: 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79 69 6e   the accompanyin
4a00: 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  g journal file i
4a10: 73 20 6c 61 72 67 65 72 0a 23 20 74 68 61 6e 20  s larger.# than 
4a20: 74 68 61 74 2e 20 49 6e 20 74 68 69 73 20 73 63  that. In this sc
4a30: 65 6e 61 72 69 6f 20 53 51 4c 69 74 65 20 73 68  enario SQLite sh
4a40: 6f 75 6c 64 20 64 65 6c 65 74 65 20 74 68 65 20  ould delete the 
4a50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 23 20  journal file .# 
4a60: 77 69 74 68 6f 75 74 20 72 6f 6c 6c 69 6e 67 20  without rolling 
4a70: 69 74 20 62 61 63 6b 2c 20 65 76 65 6e 20 69 66  it back, even if
4a80: 20 69 74 20 69 73 20 69 6e 20 61 6c 6c 20 6f 74   it is in all ot
4a90: 68 65 72 20 72 65 73 70 65 63 74 73 20 61 20 76  her respects a v
4aa0: 61 6c 69 64 0a 23 20 68 6f 74 2d 6a 6f 75 72 6e  alid.# hot-journ
4ab0: 61 6c 20 66 69 6c 65 2e 0a 23 0a 64 6f 5f 74 65  al file..#.do_te
4ac0: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 33  st pagerfault-13
4ad0: 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73  -pre1 {.  faults
4ae0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
4af0: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
4b00: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
4b10: 3b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ;.  execsql {.  
4b20: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
4b30: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
4b40: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
4b50: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4b60: 31 28 78 2c 20 79 20 55 4e 49 51 55 45 29 3b 0a  1(x, y UNIQUE);.
4b70: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4b80: 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74  O t1 VALUES(a_st
4b90: 72 69 6e 67 28 33 33 33 29 2c 20 61 5f 73 74 72  ring(333), a_str
4ba0: 69 6e 67 28 34 34 34 29 29 3b 0a 20 20 20 20 43  ing(444));.    C
4bb0: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20  OMMIT;.  }.  db 
4bc0: 63 6c 6f 73 65 0a 20 20 66 6f 72 63 65 64 65 6c  close.  forcedel
4bd0: 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20 66 61  ete test.db.  fa
4be0: 75 6c 74 73 69 6d 5f 73 61 76 65 0a 7d 20 7b 7d  ultsim_save.} {}
4bf0: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
4c00: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 33 20  t pagerfault-13 
4c10: 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73  -prep {.  faults
4c20: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
4c30: 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a  eopen.} -body {.
4c40: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
4c50: 54 45 20 54 41 42 4c 45 20 78 78 28 61 2c 20 62  TE TABLE xx(a, b
4c60: 29 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20  ) }.} -test {.  
4c70: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
4c80: 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d 0a 0a 23  sult {0 {}}.}..#
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
4ce0: 73 74 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  st fault injecti
4cf0: 6f 6e 20 69 6e 74 6f 20 61 20 73 6d 61 6c 6c 20  on into a small 
4d00: 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e  backup operation
4d10: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
4d20: 72 66 61 75 6c 74 2d 31 34 2d 70 72 65 31 20 7b  rfault-14-pre1 {
4d30: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
4d40: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
4d50: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
4d60: 20 61 5f 73 74 72 69 6e 67 3b 0a 20 20 65 78 65   a_string;.  exe
4d70: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
4d80: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
4d90: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 41 54   PERSIST;.    AT
4da0: 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20  TACH 'test.db2' 
4db0: 41 53 20 74 77 6f 3b 0a 20 20 20 20 42 45 47 49  AS two;.    BEGI
4dc0: 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  N;.      CREATE 
4dd0: 54 41 42 4c 45 20 74 31 28 78 2c 20 79 20 55 4e  TABLE t1(x, y UN
4de0: 49 51 55 45 29 3b 0a 20 20 20 20 20 20 43 52 45  IQUE);.      CRE
4df0: 41 54 45 20 54 41 42 4c 45 20 74 77 6f 2e 74 32  ATE TABLE two.t2
4e00: 28 78 2c 20 79 20 55 4e 49 51 55 45 29 3b 0a 20  (x, y UNIQUE);. 
4e10: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4e20: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
4e30: 69 6e 67 28 33 33 33 29 2c 20 61 5f 73 74 72 69  ing(333), a_stri
4e40: 6e 67 28 34 34 34 29 29 3b 0a 20 20 20 20 20 20  ng(444));.      
4e50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
4e60: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 33  ALUES(a_string(3
4e70: 33 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 34  33), a_string(44
4e80: 34 29 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  4));.    COMMIT;
4e90: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
4ea0: 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d  save_and_close.}
4eb0: 20 7b 7d 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d   {}..do_faultsim
4ec0: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
4ed0: 2d 31 34 61 20 2d 70 72 65 70 20 7b 0a 20 20 66  -14a -prep {.  f
4ee0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
4ef0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f  and_reopen.} -bo
4f00: 64 79 20 7b 0a 20 20 69 66 20 7b 5b 63 61 74 63  dy {.  if {[catc
4f10: 68 20 7b 64 62 20 62 61 63 6b 75 70 20 74 65 73  h {db backup tes
4f20: 74 2e 64 62 32 7d 20 6d 73 67 5d 7d 20 7b 20 65  t.db2} msg]} { e
4f30: 72 72 6f 72 20 5b 72 65 67 73 75 62 20 7b 2e 2a  rror [regsub {.*
4f40: 3a 20 7d 20 24 6d 73 67 20 7b 7d 5d 20 7d 0a 7d  : } $msg {}] }.}
4f50: 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74   -test {.  fault
4f60: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
4f70: 7b 30 20 7b 7d 7d 20 7b 31 20 7b 7d 7d 20 7b 31  {0 {}} {1 {}} {1
4f80: 20 7b 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f   {SQL logic erro
4f90: 72 7d 7d 0a 7d 0a 0a 23 20 49 66 20 54 45 4d 50  r}}.}..# If TEMP
4fa0: 5f 53 54 4f 52 45 20 69 73 20 32 20 6f 72 20 67  _STORE is 2 or g
4fb0: 72 65 61 74 65 72 2c 20 74 68 65 6e 20 74 68 65  reater, then the
4fc0: 20 64 61 74 61 62 61 73 65 20 5b 64 62 32 5d 20   database [db2] 
4fd0: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 0a  will be created.
4fe0: 23 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  # as an in-memor
4ff0: 79 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  y database. This
5000: 20 74 65 73 74 20 77 69 6c 6c 20 6e 6f 74 20 77   test will not w
5010: 6f 72 6b 20 69 6e 20 74 68 61 74 20 63 61 73 65  ork in that case
5020: 2c 20 61 73 20 69 74 0a 23 20 69 73 20 6e 6f 74  , as it.# is not
5030: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 68 61   possible to cha
5040: 6e 67 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  nge the page-siz
5050: 65 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e of an in-memor
5060: 79 20 64 61 74 61 62 61 73 65 2e 20 45 76 65 6e  y database. Even
5070: 0a 23 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  .# using the bac
5080: 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 55 70 64  kup API..#.# Upd
5090: 61 74 65 3a 20 49 74 20 69 73 20 6e 6f 20 6c 6f  ate: It is no lo
50a0: 6e 67 65 72 20 70 6f 73 73 69 62 6c 65 20 74 6f  nger possible to
50b0: 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
50c0: 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 74 65 6d   size of any tem
50d0: 70 0a 23 20 64 61 74 61 62 61 73 65 20 61 66 74  p.# database aft
50e0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 63  er it has been c
50f0: 72 65 61 74 65 64 2e 0a 23 0a 64 6f 5f 66 61 75  reated..#.do_fau
5100: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
5110: 66 61 75 6c 74 2d 31 34 62 20 2d 70 72 65 70 20  fault-14b -prep 
5120: 7b 0a 20 20 63 61 74 63 68 20 7b 20 64 62 32 20  {.  catch { db2 
5130: 63 6c 6f 73 65 20 7d 0a 20 20 66 61 75 6c 74 73  close }.  faults
5140: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5150: 65 6f 70 65 6e 0a 20 20 20 20 73 71 6c 69 74 65  eopen.    sqlite
5160: 33 20 64 62 32 20 22 22 0a 20 20 20 20 64 62 32  3 db2 "".    db2
5170: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 70   eval { PRAGMA p
5180: 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b  age_size = 4096;
5190: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
51a0: 28 61 29 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  (a) }.} -body {.
51b0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
51c0: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
51d0: 61 69 6e 0a 20 20 42 20 73 74 65 70 20 32 30 30  ain.  B step 200
51e0: 0a 20 20 73 65 74 20 72 63 20 5b 42 20 66 69 6e  .  set rc [B fin
51f0: 69 73 68 5d 0a 20 20 69 66 20 7b 5b 73 74 72 69  ish].  if {[stri
5200: 6e 67 20 6d 61 74 63 68 20 53 51 4c 49 54 45 5f  ng match SQLITE_
5210: 49 4f 45 52 52 5f 2a 20 24 72 63 5d 7d 20 7b 73  IOERR_* $rc]} {s
5220: 65 74 20 72 63 20 53 51 4c 49 54 45 5f 49 4f 45  et rc SQLITE_IOE
5230: 52 52 7d 0a 20 20 69 66 20 7b 24 72 63 20 21 3d  RR}.  if {$rc !=
5240: 20 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b 20   "SQLITE_OK"} { 
5250: 65 72 72 6f 72 20 5b 73 71 6c 69 74 65 33 5f 74  error [sqlite3_t
5260: 65 73 74 5f 65 72 72 73 74 72 20 24 72 63 5d 20  est_errstr $rc] 
5270: 7d 0a 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 7d 20  }.  set {} {}.} 
5280: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
5290: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
52a0: 31 20 7b 61 74 74 65 6d 70 74 20 74 6f 20 77 72  1 {attempt to wr
52b0: 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64  ite a readonly d
52c0: 61 74 61 62 61 73 65 7d 7d 20 5c 0a 20 20 20 20  atabase}} \.    
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 20 20 20 7b 31 20 7b 73 71 6c 69 74 65 33 5f 62     {1 {sqlite3_b
52f0: 61 63 6b 75 70 5f 69 6e 69 74 28 29 20 66 61 69  ackup_init() fai
5300: 6c 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 66 61 75 6c  led}}.}..do_faul
5310: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
5320: 61 75 6c 74 2d 31 34 63 20 2d 70 72 65 70 20 7b  ault-14c -prep {
5330: 0a 20 20 63 61 74 63 68 20 7b 20 64 62 32 20 63  .  catch { db2 c
5340: 6c 6f 73 65 20 7d 0a 20 20 66 61 75 6c 74 73 69  lose }.  faultsi
5350: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
5360: 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64  open.  sqlite3 d
5370: 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 64 62  b2 test.db2.  db
5380: 32 20 65 76 61 6c 20 7b 20 0a 20 20 20 20 50 52  2 eval { .    PR
5390: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
53a0: 20 3d 20 6f 66 66 3b 20 0a 20 20 20 20 50 52 41   = off; .    PRA
53b0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
53c0: 34 30 39 36 3b 20 0a 20 20 20 20 43 52 45 41 54  4096; .    CREAT
53d0: 45 20 54 41 42 4c 45 20 78 78 28 61 29 3b 0a 20  E TABLE xx(a);. 
53e0: 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 73   }.} -body {.  s
53f0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20  qlite3_backup B 
5400: 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e  db2 main db main
5410: 0a 20 20 42 20 73 74 65 70 20 32 30 30 0a 20 20  .  B step 200.  
5420: 73 65 74 20 72 63 20 5b 42 20 66 69 6e 69 73 68  set rc [B finish
5430: 5d 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20  ].  if {[string 
5440: 6d 61 74 63 68 20 53 51 4c 49 54 45 5f 49 4f 45  match SQLITE_IOE
5450: 52 52 5f 2a 20 24 72 63 5d 7d 20 7b 73 65 74 20  RR_* $rc]} {set 
5460: 72 63 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 7d  rc SQLITE_IOERR}
5470: 0a 20 20 69 66 20 7b 24 72 63 20 21 3d 20 22 53  .  if {$rc != "S
5480: 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b 20 65 72 72  QLITE_OK"} { err
5490: 6f 72 20 5b 73 71 6c 69 74 65 33 5f 74 65 73 74  or [sqlite3_test
54a0: 5f 65 72 72 73 74 72 20 24 72 63 5d 20 7d 0a 20  _errstr $rc] }. 
54b0: 20 73 65 74 20 7b 7d 20 7b 7d 0a 7d 20 2d 74 65   set {} {}.} -te
54c0: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
54d0: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b  test_result {0 {
54e0: 7d 7d 20 7b 31 20 7b 73 71 6c 69 74 65 33 5f 62  }} {1 {sqlite3_b
54f0: 61 63 6b 75 70 5f 69 6e 69 74 28 29 20 66 61 69  ackup_init() fai
5500: 6c 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74  led}}.}..do_test
5510: 20 70 61 67 65 72 66 61 75 6c 74 2d 31 35 2d 70   pagerfault-15-p
5520: 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  re1 {.  faultsim
5530: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
5540: 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  en.  db func a_s
5550: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a  tring a_string;.
5560: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5570: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45  BEGIN;.      CRE
5580: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20  ATE TABLE t1(x, 
5590: 79 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 20  y UNIQUE);.     
55a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
55b0: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
55c0: 31 31 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 32  11), a_string(22
55d0: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
55e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
55f0: 61 5f 73 74 72 69 6e 67 28 31 31 29 2c 20 61 5f  a_string(11), a_
5600: 73 74 72 69 6e 67 28 32 32 29 29 3b 0a 20 20 20  string(22));.   
5610: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 66   COMMIT;.  }.  f
5620: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
5630: 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66  _close.} {}.do_f
5640: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
5650: 65 72 66 61 75 6c 74 2d 31 35 20 2d 70 72 65 70  erfault-15 -prep
5660: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
5670: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5680: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
5690: 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 7d 20  ing a_string;.} 
56a0: 2d 62 6f 64 79 20 7b 0a 20 20 64 62 20 65 76 61  -body {.  db eva
56b0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
56c0: 4d 20 74 31 20 4c 49 4d 49 54 20 31 20 7d 20 7b  M t1 LIMIT 1 } {
56d0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
56e0: 20 20 20 20 20 42 45 47 49 4e 3b 20 49 4e 53 45       BEGIN; INSE
56f0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5700: 53 28 61 5f 73 74 72 69 6e 67 28 33 33 33 29 2c  S(a_string(333),
5710: 20 61 5f 73 74 72 69 6e 67 28 35 35 35 29 29 3b   a_string(555));
5720: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 42   COMMIT;.      B
5730: 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54  EGIN; INSERT INT
5740: 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74  O t1 VALUES(a_st
5750: 72 69 6e 67 28 33 33 33 29 2c 20 61 5f 73 74 72  ring(333), a_str
5760: 69 6e 67 28 35 35 35 29 29 3b 20 43 4f 4d 4d 49  ing(555)); COMMI
5770: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 2d  T;.    }.  }.} -
5780: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
5790: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
57a0: 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f   {}}.  faultsim_
57b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
57c0: 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  }...do_test page
57d0: 72 66 61 75 6c 74 2d 31 36 2d 70 72 65 31 20 7b  rfault-16-pre1 {
57e0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
57f0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
5800: 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45  execsql { CREATE
5810: 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 20 55   TABLE t1(x, y U
5820: 4e 49 51 55 45 29 20 7d 0a 20 20 66 61 75 6c 74  NIQUE) }.  fault
5830: 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f  sim_save_and_clo
5840: 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74  se.} {}.do_fault
5850: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
5860: 75 6c 74 2d 31 36 20 2d 70 72 65 70 20 7b 0a 20  ult-16 -prep {. 
5870: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
5880: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d  e_and_reopen.} -
5890: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
58a0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f   {.    PRAGMA lo
58b0: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63  cking_mode = exc
58c0: 6c 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41 47  lusive;.    PRAG
58d0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
58e0: 3d 20 77 61 6c 3b 0a 20 20 20 20 49 4e 53 45 52  = wal;.    INSER
58f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5900: 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 2);.    INSE
5910: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5920: 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 50 52 41  S(3, 4);.    PRA
5930: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
5940: 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 49   = delete;.    I
5950: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
5960: 4c 55 45 53 28 34 2c 20 35 29 3b 0a 20 20 20 20  LUES(4, 5);.    
5970: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
5980: 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 49  ode = wal;.    I
5990: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
59a0: 4c 55 45 53 28 36 2c 20 37 29 3b 0a 20 20 20 20  LUES(6, 7);.    
59b0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
59c0: 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20  ode = persist;. 
59d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
59e0: 31 20 56 41 4c 55 45 53 28 38 2c 20 39 29 3b 0a  1 VALUES(8, 9);.
59f0: 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20    }.} -test {.  
5a00: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
5a10: 73 75 6c 74 20 7b 30 20 7b 65 78 63 6c 75 73 69  sult {0 {exclusi
5a20: 76 65 20 77 61 6c 20 64 65 6c 65 74 65 20 77 61  ve wal delete wa
5a30: 6c 20 70 65 72 73 69 73 74 7d 7d 0a 20 20 66 61  l persist}}.  fa
5a40: 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79  ultsim_integrity
5a50: 5f 63 68 65 63 6b 0a 7d 0a 0a 0a 23 2d 2d 2d 2d  _check.}...#----
5a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5aa0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75  -----.# Test fau
5ab0: 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 77 68 69  lt injection whi
5ac0: 6c 65 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f  le changing into
5ad0: 20 61 6e 64 20 6f 75 74 20 6f 66 20 57 41 4c 20   and out of WAL 
5ae0: 6d 6f 64 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  mode..#.do_test 
5af0: 70 61 67 65 72 66 61 75 6c 74 2d 31 37 2d 70 72  pagerfault-17-pr
5b00: 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  e1 {.  faultsim_
5b10: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
5b20: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
5b30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
5b40: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
5b50: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
5b60: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
5b70: 38 36 32 2c 20 27 42 6f 74 68 61 27 29 3b 0a 20  862, 'Botha');. 
5b80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5b90: 31 20 56 41 4c 55 45 53 28 31 38 37 30 2c 20 27  1 VALUES(1870, '
5ba0: 53 6d 75 74 73 27 29 3b 0a 20 20 20 20 49 4e 53  Smuts');.    INS
5bb0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5bc0: 45 53 28 31 38 36 36 2c 20 27 48 65 72 74 7a 6f  ES(1866, 'Hertzo
5bd0: 67 27 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74  g');.  }.  fault
5be0: 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f  sim_save_and_clo
5bf0: 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74  se.} {}.do_fault
5c00: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
5c10: 75 6c 74 2d 31 37 61 20 2d 70 72 65 70 20 7b 0a  ult-17a -prep {.
5c20: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
5c30: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20  re_and_reopen.} 
5c40: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
5c50: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
5c60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61  ournal_mode = wa
5c70: 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  l;.    PRAGMA jo
5c80: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c  urnal_mode = del
5c90: 65 74 65 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74  ete;.  }.} -test
5ca0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65   {.  faultsim_te
5cb0: 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 77 61  st_result {0 {wa
5cc0: 6c 20 64 65 6c 65 74 65 7d 7d 0a 20 20 66 61 75  l delete}}.  fau
5cd0: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
5ce0: 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74  check.}.do_fault
5cf0: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
5d00: 75 6c 74 2d 31 37 62 20 2d 70 72 65 70 20 7b 0a  ult-17b -prep {.
5d10: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
5d20: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
5d30: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
5d40: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f   synchronous = O
5d50: 46 46 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20  FF }.} -body {. 
5d60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
5d70: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
5d80: 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 49 4e  de = wal;.    IN
5d90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5da0: 55 45 53 28 32 32 2c 20 27 43 6c 61 72 6b 65 27  UES(22, 'Clarke'
5db0: 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  );.    PRAGMA jo
5dc0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c  urnal_mode = del
5dd0: 65 74 65 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74  ete;.  }.} -test
5de0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65   {.  faultsim_te
5df0: 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 77 61  st_result {0 {wa
5e00: 6c 20 64 65 6c 65 74 65 7d 7d 0a 20 20 66 61 75  l delete}}.  fau
5e10: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
5e20: 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74  check.}.do_fault
5e30: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
5e40: 75 6c 74 2d 31 37 63 20 2d 70 72 65 70 20 7b 0a  ult-17c -prep {.
5e50: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
5e60: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
5e70: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50  execsql { .    P
5e80: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
5e90: 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a  de = exclusive;.
5ea0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
5eb0: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20  al_mode = wal;. 
5ec0: 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65   }.} -body {.  e
5ed0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
5ee0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64  journal_mode = d
5ef0: 65 6c 65 74 65 20 7d 0a 7d 20 2d 74 65 73 74 20  elete }.} -test 
5f00: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
5f10: 74 5f 72 65 73 75 6c 74 20 7b 30 20 64 65 6c 65  t_result {0 dele
5f20: 74 65 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69  te}.  faultsim_i
5f30: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d  ntegrity_check.}
5f40: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
5f50: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 37 64  t pagerfault-17d
5f60: 20 2d 70 72 65 70 20 7b 0a 20 20 63 61 74 63 68   -prep {.  catch
5f70: 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 20   { db2 close }. 
5f80: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
5f90: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73  e_and_reopen.  s
5fa0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
5fb0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50  db.  execsql { P
5fc0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
5fd0: 64 65 20 3d 20 64 65 6c 65 74 65 20 7d 0a 20 20  de = delete }.  
5fe0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
5ff0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
6000: 77 61 6c 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  wal }.  execsql 
6010: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
6020: 20 56 41 4c 55 45 53 28 39 39 2c 20 27 42 72 61   VALUES(99, 'Bra
6030: 64 6d 61 6e 27 29 20 7d 20 64 62 32 0a 7d 20 2d  dman') } db2.} -
6040: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
6050: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
6060: 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 20  l_mode = delete 
6070: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  }.} -test {.  fa
6080: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
6090: 6c 74 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  lt {1 {database 
60a0: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 66 61  is locked}}.  fa
60b0: 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79  ultsim_integrity
60c0: 5f 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c  _check.}.do_faul
60d0: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
60e0: 61 75 6c 74 2d 31 37 65 20 2d 70 72 65 70 20 7b  ault-17e -prep {
60f0: 0a 20 20 63 61 74 63 68 20 7b 20 64 62 32 20 63  .  catch { db2 c
6100: 6c 6f 73 65 20 7d 0a 20 20 66 61 75 6c 74 73 69  lose }.  faultsi
6110: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6120: 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64  open.  sqlite3 d
6130: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  b2 test.db.  exe
6140: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
6150: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c  urnal_mode = del
6160: 65 74 65 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ete }.  execsql 
6170: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
6180: 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20 20  _mode = wal }.  
6190: 73 65 74 20 3a 3a 63 68 61 6e 20 5b 6c 61 75 6e  set ::chan [laun
61a0: 63 68 5f 74 65 73 74 66 69 78 74 75 72 65 5d 0a  ch_testfixture].
61b0: 20 20 74 65 73 74 66 69 78 74 75 72 65 20 24 3a    testfixture $:
61c0: 3a 63 68 61 6e 20 7b 0a 20 20 20 20 73 71 6c 69  :chan {.    sqli
61d0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
61e0: 20 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53     db eval { INS
61f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6200: 45 53 28 31 30 31 2c 20 27 4c 61 74 68 61 6d 27  ES(101, 'Latham'
6210: 29 20 7d 0a 20 20 7d 0a 20 20 63 61 74 63 68 20  ) }.  }.  catch 
6220: 7b 20 74 65 73 74 66 69 78 74 75 72 65 20 24 3a  { testfixture $:
6230: 3a 63 68 61 6e 20 73 71 6c 69 74 65 5f 61 62 6f  :chan sqlite_abo
6240: 72 74 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63  rt }.  catch { c
6250: 6c 6f 73 65 20 24 3a 3a 63 68 61 6e 20 7d 0a 7d  lose $::chan }.}
6260: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
6270: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
6280: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74  nal_mode = delet
6290: 65 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20  e }.} -test {.  
62a0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
62b0: 73 75 6c 74 20 7b 30 20 64 65 6c 65 74 65 7d 0a  sult {0 delete}.
62c0: 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67    faultsim_integ
62d0: 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 23 2d  rity_check.}..#-
62e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6320: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
6330: 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20  fault-injection 
6340: 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20 66 72  when changing fr
6350: 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  om journal_mode=
6360: 70 65 72 73 69 73 74 20 74 6f 20 0a 23 20 6a 6f  persist to .# jo
6370: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
6380: 65 20 28 74 68 69 73 20 69 6e 76 6f 6c 76 65 73  e (this involves
6390: 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   deleting the jo
63a0: 75 72 6e 61 6c 20 66 69 6c 65 29 2e 0a 23 0a 64  urnal file)..#.d
63b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
63c0: 74 2d 31 38 2d 70 72 65 31 20 7b 0a 20 20 66 61  t-18-pre1 {.  fa
63d0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
63e0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
63f0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
6400: 54 41 42 4c 45 20 71 71 28 78 29 3b 0a 20 20 20  TABLE qq(x);.   
6410: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 71 20   INSERT INTO qq 
6420: 56 41 4c 55 45 53 28 27 48 65 72 62 65 72 74 27  VALUES('Herbert'
6430: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
6440: 54 4f 20 71 71 20 56 41 4c 55 45 53 28 27 4d 61  TO qq VALUES('Ma
6450: 63 61 6c 69 73 74 65 72 27 29 3b 0a 20 20 20 20  calister');.    
6460: 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 71 20 56  INSERT INTO qq V
6470: 41 4c 55 45 53 28 27 4d 61 63 6b 65 6e 7a 69 65  ALUES('Mackenzie
6480: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
6490: 4e 54 4f 20 71 71 20 56 41 4c 55 45 53 28 27 4c  NTO qq VALUES('L
64a0: 69 6c 6c 65 79 27 29 3b 0a 20 20 20 20 49 4e 53  illey');.    INS
64b0: 45 52 54 20 49 4e 54 4f 20 71 71 20 56 41 4c 55  ERT INTO qq VALU
64c0: 45 53 28 27 50 61 6c 6d 65 72 27 29 3b 0a 20 20  ES('Palmer');.  
64d0: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  }.  faultsim_sav
64e0: 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d  e_and_close.} {}
64f0: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
6500: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 38 20  t pagerfault-18 
6510: 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73  -prep {.  faults
6520: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
6530: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
6540: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
6550: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
6560: 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  IST;.    INSERT 
6570: 49 4e 54 4f 20 71 71 20 56 41 4c 55 45 53 28 27  INTO qq VALUES('
6580: 42 65 61 74 74 79 27 29 3b 0a 20 20 7d 0a 7d 20  Beatty');.  }.} 
6590: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
65a0: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
65b0: 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65  al_mode = delete
65c0: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
65d0: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
65e0: 75 6c 74 20 7b 30 20 64 65 6c 65 74 65 7d 0a 20  ult {0 delete}. 
65f0: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
6600: 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 64 6f 5f  ity_check.}..do_
6610: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
6620: 67 65 72 66 61 75 6c 74 2d 31 39 61 20 2d 70 72  gerfault-19a -pr
6630: 65 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  ep {.  sqlite3 d
6640: 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 64 62 20  b :memory:.  db 
6650: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
6660: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
6670: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75   {.    PRAGMA au
6680: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46 55 4c 4c  to_vacuum = FULL
6690: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
66a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
66b0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
66c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
66d0: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35  ALUES(a_string(5
66e0: 30 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  000), a_string(6
66f0: 30 30 30 29 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  000));.    COMMI
6700: 54 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b  T;.  }.} -body {
6710: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
6720: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
6730: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  2(a, b);.    INS
6740: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
6750: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 0a 20  CT * FROM t1; . 
6760: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
6770: 31 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  1;.  }.} -test {
6780: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
6790: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d  _result {0 {}}.}
67a0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66  ..do_test pagerf
67b0: 61 75 6c 74 2d 31 39 2d 70 72 65 31 20 7b 0a 20  ault-19-pre1 {. 
67c0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
67d0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
67e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
67f0: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
6800: 20 46 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54   FULL;.    CREAT
6810: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 20 49  E TABLE t1(x); I
6820: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6830: 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 43 52 45  LUES(1);.    CRE
6840: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b  ATE TABLE t2(x);
6850: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
6860: 56 41 4c 55 45 53 28 32 29 3b 0a 20 20 20 20 43  VALUES(2);.    C
6870: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 78  REATE TABLE t3(x
6880: 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  ); INSERT INTO t
6890: 33 20 56 41 4c 55 45 53 28 33 29 3b 0a 20 20 20  3 VALUES(3);.   
68a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34   CREATE TABLE t4
68b0: 28 78 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  (x); INSERT INTO
68c0: 20 74 34 20 56 41 4c 55 45 53 28 34 29 3b 0a 20   t4 VALUES(4);. 
68d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
68e0: 74 35 28 78 29 3b 20 49 4e 53 45 52 54 20 49 4e  t5(x); INSERT IN
68f0: 54 4f 20 74 35 20 56 41 4c 55 45 53 28 35 29 3b  TO t5 VALUES(5);
6900: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6910: 45 20 74 36 28 78 29 3b 20 49 4e 53 45 52 54 20  E t6(x); INSERT 
6920: 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 36  INTO t6 VALUES(6
6930: 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69  );.  }.  faultsi
6940: 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65  m_save_and_close
6950: 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69  .} {}.do_faultsi
6960: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
6970: 74 2d 31 39 62 20 2d 70 72 65 70 20 7b 0a 20 20  t-19b -prep {.  
6980: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
6990: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62  _and_reopen.} -b
69a0: 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ody {.  execsql 
69b0: 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  { .    BEGIN;.  
69c0: 20 20 20 20 55 50 44 41 54 45 20 74 34 20 53 45      UPDATE t4 SE
69d0: 54 20 78 20 3d 20 78 2b 31 3b 0a 20 20 20 20 20  T x = x+1;.     
69e0: 20 55 50 44 41 54 45 20 74 36 20 53 45 54 20 78   UPDATE t6 SET x
69f0: 20 3d 20 78 2b 31 3b 0a 20 20 20 20 20 20 53 41   = x+1;.      SA
6a00: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
6a10: 20 20 20 20 20 55 50 44 41 54 45 20 74 33 20 53       UPDATE t3 S
6a20: 45 54 20 78 20 3d 20 78 2b 31 3b 0a 20 20 20 20  ET x = x+1;.    
6a30: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 77      SAVEPOINT tw
6a40: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 44 52 4f  o;.          DRO
6a50: 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 20 20  P TABLE t2;.    
6a60: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
6a70: 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  e;.    COMMIT;. 
6a80: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
6a90: 20 74 33 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   t3;.    SELECT 
6aa0: 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 20 20 53  * FROM t4;.    S
6ab0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 3b  ELECT * FROM t6;
6ac0: 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  .  }.} -test {. 
6ad0: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
6ae0: 65 73 75 6c 74 20 7b 30 20 7b 33 20 35 20 37 7d  esult {0 {3 5 7}
6af0: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6b40: 23 20 54 68 69 73 20 74 65 73 74 73 20 66 61 75  # This tests fau
6b50: 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 69 6e 20  lt-injection in 
6b60: 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69  a special case i
6b70: 6e 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  n the auto-vacuu
6b80: 6d 20 63 6f 64 65 2e 0a 23 0a 64 6f 5f 74 65 73  m code..#.do_tes
6b90: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 30 2d  t pagerfault-20-
6ba0: 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  pre1 {.  faultsi
6bb0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
6bc0: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
6bd0: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
6be0: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
6bf0: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
6c00: 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 43  um = FULL;.    C
6c10: 52 45 41 54 45 20 54 41 42 4c 45 20 74 30 28 61  REATE TABLE t0(a
6c20: 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c  , b);.  }.  faul
6c30: 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c  tsim_save_and_cl
6c40: 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c  ose.} {}.do_faul
6c50: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
6c60: 61 75 6c 74 2d 32 30 20 2d 70 72 65 70 20 7b 0a  ault-20 -prep {.
6c70: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
6c80: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20  re_and_reopen.} 
6c90: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
6ca0: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
6cb0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
6cc0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
6cd0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6ce0: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t2(a, b);.      
6cf0: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20  DROP TABLE t1;. 
6d00: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
6d10: 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74   -test {.  fault
6d20: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
6d30: 7b 30 20 7b 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73  {0 {}}.}..do_tes
6d40: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 31 2d  t pagerfault-21-
6d50: 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  pre1 {.  faultsi
6d60: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
6d70: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
6d80: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
6d90: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
6da0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 30 28  CREATE TABLE t0(
6db0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
6dc0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
6dd0: 54 4f 20 74 30 20 56 41 4c 55 45 53 28 31 2c 20  TO t0 VALUES(1, 
6de0: 32 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  2);.  }.  faults
6df0: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
6e00: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
6e10: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
6e20: 6c 74 2d 32 31 20 2d 70 72 65 70 20 7b 0a 20 20  lt-21 -prep {.  
6e30: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
6e40: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62  _and_reopen.} -b
6e50: 6f 64 79 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  ody {.  db eval 
6e60: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6e70: 74 30 20 4c 49 4d 49 54 20 31 20 7d 20 7b 0a 20  t0 LIMIT 1 } {. 
6e80: 20 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53     db eval { INS
6e90: 45 52 54 20 49 4e 54 4f 20 74 30 20 53 45 4c 45  ERT INTO t0 SELE
6ea0: 43 54 20 61 2b 31 2c 20 62 20 46 52 4f 4d 20 74  CT a+1, b FROM t
6eb0: 30 20 7d 0a 20 20 20 20 64 62 20 65 76 61 6c 20  0 }.    db eval 
6ec0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30  { INSERT INTO t0
6ed0: 20 53 45 4c 45 43 54 20 61 2b 32 2c 20 62 20 46   SELECT a+2, b F
6ee0: 52 4f 4d 20 74 30 20 7d 0a 20 20 7d 0a 7d 20 2d  ROM t0 }.  }.} -
6ef0: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
6f00: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
6f10: 20 7b 7d 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d   {}}.}...#------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c 74  ---.# Test fault
6f70: 2d 69 6e 6a 65 63 74 69 6f 6e 20 61 6e 64 20 72  -injection and r
6f80: 6f 6c 6c 62 61 63 6b 20 77 68 65 6e 20 74 68 65  ollback when the
6f90: 20 6e 52 65 73 65 72 76 65 20 68 65 61 64 65 72   nReserve header
6fa0: 20 76 61 6c 75 65 20 0a 23 20 69 73 20 6e 6f 6e   value .# is non
6fb0: 2d 7a 65 72 6f 2e 0a 23 0a 64 6f 5f 74 65 73 74  -zero..#.do_test
6fc0: 20 70 61 67 65 72 66 61 75 6c 74 2d 32 31 2d 70   pagerfault-21-p
6fd0: 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  re1 {.  faultsim
6fe0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
6ff0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
7000: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
7010: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
7020: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
7030: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 50  ode = WAL;.    P
7040: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
7050: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 7d  de = DELETE;.  }
7060: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 68 65  .  db close.  he
7070: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
7080: 62 20 32 30 20 20 20 20 31 30 0a 20 20 68 65 78  b 20    10.  hex
7090: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
70a0: 20 31 30 35 20 30 33 46 30 0a 20 20 73 71 6c 69   105 03F0.  sqli
70b0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
70c0: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
70d0: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
70e0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
70f0: 45 20 54 41 42 4c 45 20 74 30 28 61 20 50 52 49  E TABLE t0(a PRI
7100: 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51  MARY KEY, b UNIQ
7110: 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  UE);.    INSERT 
7120: 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28 61  INTO t0 VALUES(a
7130: 5f 73 74 72 69 6e 67 28 32 32 32 29 2c 20 61 5f  _string(222), a_
7140: 73 74 72 69 6e 67 28 33 33 33 29 29 3b 0a 20 20  string(333));.  
7150: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30    INSERT INTO t0
7160: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
7170: 28 32 32 33 29 2c 20 61 5f 73 74 72 69 6e 67 28  (223), a_string(
7180: 33 33 34 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  334));.    INSER
7190: 54 20 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53  T INTO t0 VALUES
71a0: 28 61 5f 73 74 72 69 6e 67 28 32 32 34 29 2c 20  (a_string(224), 
71b0: 61 5f 73 74 72 69 6e 67 28 33 33 35 29 29 3b 0a  a_string(335));.
71c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
71d0: 74 30 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t0 VALUES(a_stri
71e0: 6e 67 28 32 32 35 29 2c 20 61 5f 73 74 72 69 6e  ng(225), a_strin
71f0: 67 28 33 33 36 29 29 3b 0a 20 20 7d 0a 20 20 66  g(336));.  }.  f
7200: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
7210: 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f  _close.} {}..do_
7220: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
7230: 67 65 72 66 61 75 6c 74 2d 32 31 20 2d 70 72 65  gerfault-21 -pre
7240: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
7250: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
7260: 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  n.} -body {.  ex
7270: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
7280: 4e 54 4f 20 74 30 20 53 45 4c 45 43 54 20 61 7c  NTO t0 SELECT a|
7290: 7c 27 78 27 2c 20 62 7c 7c 27 78 27 20 46 52 4f  |'x', b||'x' FRO
72a0: 4d 20 74 30 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  M t0 }.} -test {
72b0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
72c0: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20  _result {0 {}}. 
72d0: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
72e0: 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 69 66 63 61  ity_check.}.ifca
72f0: 70 61 62 6c 65 20 63 72 61 73 68 74 65 73 74 20  pable crashtest 
7300: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
7310: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
7320: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
7330: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
7340: 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47  = 1024;.    PRAG
7350: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7360: 3d 20 57 41 4c 3b 0a 20 20 20 20 50 52 41 47 4d  = WAL;.    PRAGM
7370: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
7380: 20 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 20 20 64   DELETE;.  }.  d
7390: 62 20 63 6c 6f 73 65 0a 20 20 68 65 78 69 6f 5f  b close.  hexio_
73a0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 32 30  write test.db 20
73b0: 20 20 20 20 31 30 0a 20 20 68 65 78 69 6f 5f 77      10.  hexio_w
73c0: 72 69 74 65 20 74 65 73 74 2e 64 62 20 31 30 35  rite test.db 105
73d0: 20 30 33 46 30 0a 0a 20 20 73 71 6c 69 74 65 33   03F0..  sqlite3
73e0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62   db test.db.  db
73f0: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
7400: 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
7410: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
7420: 41 42 4c 45 20 74 30 28 61 20 50 52 49 4d 41 52  ABLE t0(a PRIMAR
7430: 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 29  Y KEY, b UNIQUE)
7440: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
7450: 4f 20 74 30 20 56 41 4c 55 45 53 28 61 5f 73 74  O t0 VALUES(a_st
7460: 72 69 6e 67 28 32 32 32 29 2c 20 61 5f 73 74 72  ring(222), a_str
7470: 69 6e 67 28 33 33 33 29 29 3b 0a 20 20 20 20 49  ing(333));.    I
7480: 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20 56 41  NSERT INTO t0 VA
7490: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 32  LUES(a_string(22
74a0: 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 33 34  3), a_string(334
74b0: 29 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  ));.  }.  faults
74c0: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
74d0: 65 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 54  e..  for {set iT
74e0: 65 73 74 20 31 7d 20 7b 24 69 54 65 73 74 3c 35  est 1} {$iTest<5
74f0: 30 7d 20 7b 69 6e 63 72 20 69 54 65 73 74 7d 20  0} {incr iTest} 
7500: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  {.    do_test pa
7510: 67 65 72 66 61 75 6c 74 2d 32 31 2e 63 72 61 73  gerfault-21.cras
7520: 68 2e 24 69 54 65 73 74 2e 31 20 7b 0a 20 20 20  h.$iTest.1 {.   
7530: 20 20 20 63 72 61 73 68 73 71 6c 20 2d 64 65 6c     crashsql -del
7540: 61 79 20 31 20 2d 66 69 6c 65 20 74 65 73 74 2e  ay 1 -file test.
7550: 64 62 20 2d 73 65 65 64 20 24 69 54 65 73 74 20  db -seed $iTest 
7560: 7b 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b  {.        BEGIN;
7570: 0a 20 20 20 20 20 20 20 20 20 20 43 52 45 41 54  .          CREAT
7580: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
7590: 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51  MARY KEY, b UNIQ
75a0: 55 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  UE);.          I
75b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
75c0: 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74  LECT a, b FROM t
75d0: 30 3b 0a 20 20 20 20 20 20 20 20 43 4f 4d 4d 49  0;.        COMMI
75e0: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
75f0: 20 7b 31 20 7b 63 68 69 6c 64 20 70 72 6f 63 65   {1 {child proce
7600: 73 73 20 65 78 69 74 65 64 20 61 62 6e 6f 72 6d  ss exited abnorm
7610: 61 6c 6c 79 7d 7d 0a 20 20 20 20 64 6f 5f 74 65  ally}}.    do_te
7620: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 32  st pagerfault-22
7630: 2e 24 69 54 65 73 74 2e 32 20 7b 0a 20 20 20 20  .$iTest.2 {.    
7640: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
7650: 74 2e 64 62 0a 20 20 20 20 20 20 65 78 65 63 73  t.db.      execs
7660: 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  ql { PRAGMA inte
7670: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a 20 20  grity_check }.  
7680: 20 20 7d 20 7b 6f 6b 7d 0a 20 20 20 20 64 62 20    } {ok}.    db 
7690: 63 6c 6f 73 65 0a 20 20 7d 0a 7d 0a 0a 0a 23 2d  close.  }.}...#-
76a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 57 68 65 6e 20  --------.# When 
76f0: 61 20 33 2e 37 2e 30 20 63 6c 69 65 6e 74 20 6f  a 3.7.0 client o
7700: 70 65 6e 73 20 61 20 77 72 69 74 65 2d 74 72 61  pens a write-tra
7710: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 64 61  nsaction on a da
7720: 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74  tabase file that
7730: 0a 23 20 68 61 73 20 62 65 65 6e 20 61 70 70 65  .# has been appe
7740: 6e 64 65 64 20 74 6f 20 6f 72 20 74 72 75 6e 63  nded to or trunc
7750: 61 74 65 64 20 62 79 20 61 20 70 72 65 2d 33 37  ated by a pre-37
7760: 30 20 63 6c 69 65 6e 74 2c 20 69 74 20 75 70 64  0 client, it upd
7770: 61 74 65 73 0a 23 20 74 68 65 20 64 62 2d 73 69  ates.# the db-si
7780: 7a 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 68  ze in the file h
7790: 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
77a0: 79 2e 20 54 68 69 73 20 74 65 73 74 20 63 61 73  y. This test cas
77b0: 65 20 70 72 6f 76 6f 6b 65 73 0a 23 20 65 72 72  e provokes.# err
77c0: 6f 72 73 20 64 75 72 69 6e 67 20 74 68 61 74 20  ors during that 
77d0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f  operation..#.do_
77e0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
77f0: 32 32 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c  22-pre1 {.  faul
7800: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
7810: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
7820: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
7830: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
7840: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
7850: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
7860: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
7870: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 43 52 45 41  um = 0;.    CREA
7880: 54 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a  TE TABLE t1(a);.
7890: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
78a0: 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20   i1 ON t1(a);.  
78b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
78c0: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
78d0: 28 33 30 30 30 29 29 3b 0a 20 20 20 20 43 52 45  (3000));.    CRE
78e0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 29 3b  ATE TABLE t2(a);
78f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7900: 20 74 32 20 56 41 4c 55 45 53 28 31 29 3b 0a 20   t2 VALUES(1);. 
7910: 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   }.  db close.  
7920: 73 71 6c 33 36 32 33 31 20 7b 20 49 4e 53 45 52  sql36231 { INSER
7930: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
7940: 28 61 5f 73 74 72 69 6e 67 28 33 30 30 30 29 29  (a_string(3000))
7950: 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61   }.  faultsim_sa
7960: 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b  ve_and_close.} {
7970: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
7980: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 32  st pagerfault-22
7990: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
79a0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
79b0: 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b  reopen.} -body {
79c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
79d0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
79e0: 45 53 28 32 29 20 7d 0a 20 20 65 78 65 63 73 71  ES(2) }.  execsq
79f0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
7a00: 4d 20 74 32 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  M t2 }.} -test {
7a10: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
7a20: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 31 20 32 7d  _result {0 {1 2}
7a30: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74  }.  faultsim_int
7a40: 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a  egrity_check.}..
7a50: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
7a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 50 72 6f  ----------.# Pro
7aa0: 76 6f 6b 65 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  voke an OOM erro
7ab0: 72 20 64 75 72 69 6e 67 20 61 20 63 6f 6d 6d 69  r during a commi
7ac0: 74 20 6f 66 20 6d 75 6c 74 69 2d 66 69 6c 65 20  t of multi-file 
7ad0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 6e 65  transaction. One
7ae0: 20 6f 66 0a 23 20 74 68 65 20 64 61 74 61 62 61   of.# the databa
7af0: 73 65 73 20 77 72 69 74 74 65 6e 20 64 75 72 69  ses written duri
7b00: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
7b10: 6f 6e 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  on is an in-memo
7b20: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 23 20 54  ry database..# T
7b30: 68 69 73 20 74 65 73 74 20 63 61 75 73 65 73 20  his test causes 
7b40: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
7b50: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
7b60: 73 65 20 61 66 74 65 72 20 43 6f 6d 6d 69 74 50  se after CommitP
7b70: 68 61 73 65 4f 6e 65 28 29 0a 23 20 68 61 73 20  haseOne().# has 
7b80: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 74  successfully ret
7b90: 75 72 6e 65 64 2e 20 69 2e 65 2e 20 74 68 65 20  urned. i.e. the 
7ba0: 73 65 72 69 65 73 20 6f 66 20 63 61 6c 6c 73 20  series of calls 
7bb0: 66 6f 72 20 74 68 65 20 61 62 6f 72 74 65 64 20  for the aborted 
7bc0: 63 6f 6d 6d 69 74 20 0a 23 20 69 73 3a 0a 23 0a  commit .# is:.#.
7bd0: 23 20 20 20 50 61 67 65 72 43 6f 6d 6d 69 74 50  #   PagerCommitP
7be0: 68 61 73 65 4f 6e 65 28 3c 69 6e 2d 6d 65 6d 6f  haseOne(<in-memo
7bf0: 72 79 2d 64 62 3e 29 20 20 20 2d 3e 20 20 20 53  ry-db>)   ->   S
7c00: 51 4c 49 54 45 5f 4f 4b 0a 23 20 20 20 50 61 67  QLITE_OK.#   Pag
7c10: 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
7c20: 28 3c 66 69 6c 65 2d 64 62 3e 29 20 20 20 20 20  (<file-db>)     
7c30: 20 20 20 2d 3e 20 20 20 53 51 4c 49 54 45 5f 49     ->   SQLITE_I
7c40: 4f 45 52 52 0a 23 20 20 20 50 61 67 65 72 52 6f  OERR.#   PagerRo
7c50: 6c 6c 62 61 63 6b 28 3c 69 6e 2d 6d 65 6d 6f 72  llback(<in-memor
7c60: 79 2d 64 62 3e 29 0a 23 20 20 20 50 61 67 65 72  y-db>).#   Pager
7c70: 52 6f 6c 6c 62 61 63 6b 28 3c 66 69 6c 65 2d 64  Rollback(<file-d
7c80: 62 3e 29 0a 23 0a 64 6f 5f 66 61 75 6c 74 73 69  b>).#.do_faultsi
7c90: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
7ca0: 74 2d 32 33 20 2d 70 72 65 70 20 7b 0a 20 20 73  t-23 -prep {.  s
7cb0: 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72  qlite3 db :memor
7cc0: 79 3a 0a 20 20 66 6f 72 65 61 63 68 20 66 20 5b  y:.  foreach f [
7cd0: 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  glob -nocomplain
7ce0: 20 74 65 73 74 2e 64 62 2a 5d 20 7b 20 66 6f 72   test.db*] { for
7cf0: 63 65 64 65 6c 65 74 65 20 24 66 20 7d 0a 20 20  cedelete $f }.  
7d00: 64 62 20 65 76 61 6c 20 7b 20 0a 20 20 20 20 41  db eval { .    A
7d10: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
7d20: 20 41 53 20 61 75 78 3b 0a 20 20 20 20 43 52 45   AS aux;.    CRE
7d30: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
7d40: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
7d50: 41 42 4c 45 20 61 75 78 2e 74 32 28 61 2c 20 62  ABLE aux.t2(a, b
7d60: 29 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b  );.  }.} -body {
7d70: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
7d80: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
7d90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7da0: 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 20  LUES(1,2);.     
7db0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
7dc0: 56 41 4c 55 45 53 28 33 2c 34 29 3b 20 0a 20 20  VALUES(3,4); .  
7dd0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
7de0: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
7df0: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
7e00: 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d  0 {}}.  faultsim
7e10: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
7e20: 0a 7d 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  .}..do_faultsim_
7e30: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
7e40: 32 34 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75  24 -prep {.  fau
7e50: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
7e60: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 65 76 61  _reopen.  db eva
7e70: 6c 20 7b 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  l { PRAGMA temp_
7e80: 73 74 6f 72 65 20 3d 20 66 69 6c 65 20 7d 0a 20  store = file }. 
7e90: 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54   execsql { CREAT
7ea0: 45 20 54 41 42 4c 45 20 78 28 61 2c 20 62 29 20  E TABLE x(a, b) 
7eb0: 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  }.} -body {.  ex
7ec0: 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  ecsql { CREATE T
7ed0: 45 4d 50 20 54 41 42 4c 45 20 74 31 28 61 2c 20  EMP TABLE t1(a, 
7ee0: 62 29 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  b) }.} -test {. 
7ef0: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
7f00: 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 20 5c 0a 20  esult {0 {}} \. 
7f10: 20 20 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f     {1 {unable to
7f20: 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
7f30: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
7f40: 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
7f50: 6f 72 61 72 79 20 74 61 62 6c 65 73 7d 7d 0a 20  orary tables}}. 
7f60: 20 73 65 74 20 69 63 20 5b 64 62 20 65 76 61 6c   set ic [db eval
7f70: 20 7b 20 50 52 41 47 4d 41 20 74 65 6d 70 2e 69   { PRAGMA temp.i
7f80: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
7f90: 5d 0a 20 20 69 66 20 7b 24 69 63 20 21 3d 20 22  ].  if {$ic != "
7fa0: 6f 6b 22 7d 20 7b 20 65 72 72 6f 72 20 22 49 6e  ok"} { error "In
7fb0: 74 65 67 72 69 74 79 20 63 68 65 63 6b 3a 20 24  tegrity check: $
7fc0: 69 63 22 20 7d 0a 7d 0a 0a 70 72 6f 63 20 6c 6f  ic" }.}..proc lo
7fd0: 63 6b 72 6f 77 73 20 7b 6e 7d 20 7b 0a 20 20 69  ckrows {n} {.  i
7fe0: 66 20 7b 24 6e 3d 3d 30 7d 20 7b 20 72 65 74 75  f {$n==0} { retu
7ff0: 72 6e 20 22 22 20 7d 0a 20 20 64 62 20 65 76 61  rn "" }.  db eva
8000: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
8010: 4d 20 74 31 20 57 48 45 52 45 20 6f 69 64 20 3d  M t1 WHERE oid =
8020: 20 24 6e 20 7d 20 7b 20 0a 20 20 20 20 72 65 74   $n } { .    ret
8030: 75 72 6e 20 5b 6c 6f 63 6b 72 6f 77 73 20 5b 65  urn [lockrows [e
8040: 78 70 72 20 7b 24 6e 2d 31 7d 5d 5d 0a 20 20 7d  xpr {$n-1}]].  }
8050: 0a 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  .}...do_test pag
8060: 65 72 66 61 75 6c 74 2d 32 35 2d 70 72 65 31 20  erfault-25-pre1 
8070: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
8080: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
8090: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
80a0: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
80b0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
80c0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
80d0: 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  24;.    PRAGMA a
80e0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a  uto_vacuum = 0;.
80f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8100: 20 74 31 28 61 29 3b 0a 20 20 20 20 49 4e 53 45   t1(a);.    INSE
8110: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
8120: 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30 29 29  S(a_string(500))
8130: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
8140: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
8150: 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20 74  ring(500) FROM t
8160: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
8170: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
8180: 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20  tring(500) FROM 
8190: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
81a0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
81b0: 73 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d  string(500) FROM
81c0: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
81d0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
81e0: 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f  _string(500) FRO
81f0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
8200: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
8210: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46 52  a_string(500) FR
8220: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 66 61 75  OM t1;.  }.  fau
8230: 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63  ltsim_save_and_c
8240: 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75  lose.} {}.do_fau
8250: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
8260: 66 61 75 6c 74 2d 32 35 20 2d 70 72 65 70 20 7b  fault-25 -prep {
8270: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
8280: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
8290: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
82a0: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 73 65 74  g a_string.  set
82b0: 20 3a 3a 63 68 61 6e 6e 65 6c 20 5b 64 62 20 69   ::channel [db i
82c0: 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c  ncrblob -readonl
82d0: 79 20 74 31 20 61 20 31 5d 0a 20 20 65 78 65 63  y t1 a 1].  exec
82e0: 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d  sql { .    PRAGM
82f0: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
8300: 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  0;.    BEGIN;.  
8310: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8320: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
8330: 6e 67 28 33 30 30 30 29 29 3b 0a 20 20 20 20 20  ng(3000));.     
8340: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8350: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
8360: 33 30 30 30 29 29 3b 0a 20 20 7d 0a 7d 20 2d 62  3000));.  }.} -b
8370: 6f 64 79 20 7b 0a 20 20 6c 6f 63 6b 72 6f 77 73  ody {.  lockrows
8380: 20 33 30 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20   30.} -test {.  
8390: 63 61 74 63 68 20 7b 20 6c 6f 63 6b 72 6f 77 73  catch { lockrows
83a0: 20 33 30 20 7d 0a 20 20 63 61 74 63 68 20 7b 20   30 }.  catch { 
83b0: 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54 20 7d  db eval COMMIT }
83c0: 0a 20 20 63 6c 6f 73 65 20 24 3a 3a 63 68 61 6e  .  close $::chan
83d0: 6e 65 6c 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74  nel.  faultsim_t
83e0: 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d  est_result {0 {}
83f0: 7d 20 0a 7d 0a 0a 64 6f 5f 66 61 75 6c 74 73 69  } .}..do_faultsi
8400: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
8410: 74 2d 32 36 20 2d 70 72 65 70 20 7b 0a 20 20 66  t-26 -prep {.  f
8420: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
8430: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
8440: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
8450: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
8460: 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  4;.    PRAGMA jo
8470: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 74 72 75  urnal_mode = tru
8480: 6e 63 61 74 65 3b 0a 20 20 20 20 50 52 41 47 4d  ncate;.    PRAGM
8490: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
84a0: 66 75 6c 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41  full;.    PRAGMA
84b0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
84c0: 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 43 52 45  clusive;.    CRE
84d0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
84e0: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
84f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
8500: 20 32 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   2);.    PRAGMA 
8510: 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36  page_size = 4096
8520: 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  ;.  }.} -body {.
8530: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
8540: 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d 20 2d 74  VACUUM;.  }.} -t
8550: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
8560: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
8570: 7b 7d 7d 0a 0a 20 20 73 65 74 20 63 6f 6e 74 65  {}}..  set conte
8580: 6e 74 73 20 5b 64 62 20 65 76 61 6c 20 7b 53 45  nts [db eval {SE
8590: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 5d  LECT * FROM t1}]
85a0: 0a 20 20 69 66 20 7b 24 63 6f 6e 74 65 6e 74 73  .  if {$contents
85b0: 20 21 3d 20 22 31 20 32 22 7d 20 7b 20 65 72 72   != "1 2"} { err
85c0: 6f 72 20 22 42 61 64 20 64 61 74 61 62 61 73 65  or "Bad database
85d0: 20 63 6f 6e 74 65 6e 74 73 20 28 24 63 6f 6e 74   contents ($cont
85e0: 65 6e 74 73 29 22 20 7d 0a 0a 20 20 69 66 20 7b  ents)" }..  if {
85f0: 5b 61 74 6f 6d 69 63 5f 62 61 74 63 68 5f 77 72  [atomic_batch_wr
8600: 69 74 65 20 74 65 73 74 2e 64 62 5d 3d 3d 30 7d  ite test.db]==0}
8610: 20 7b 0a 20 20 20 20 73 65 74 20 73 7a 20 5b 66   {.    set sz [f
8620: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
8630: 5d 0a 20 20 20 20 69 66 20 7b 24 74 65 73 74 72  ].    if {$testr
8640: 63 21 3d 30 20 26 26 20 24 73 7a 21 3d 31 30 32  c!=0 && $sz!=102
8650: 34 2a 33 20 26 26 20 24 73 7a 21 3d 34 30 39 36  4*3 && $sz!=4096
8660: 2a 33 7d 20 7b 20 0a 20 20 20 20 20 20 65 72 72  *3} { .      err
8670: 6f 72 20 22 45 78 70 65 63 74 65 64 20 66 69 6c  or "Expected fil
8680: 65 20 73 69 7a 65 20 33 30 37 32 20 6f 72 20 31  e size 3072 or 1
8690: 32 32 38 38 20 62 79 74 65 73 20 2d 20 61 63 74  2288 bytes - act
86a0: 75 61 6c 20 73 69 7a 65 20 24 73 7a 20 62 79 74  ual size $sz byt
86b0: 65 73 22 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  es".    }.    if
86c0: 20 7b 24 74 65 73 74 72 63 3d 3d 30 20 26 26 20   {$testrc==0 && 
86d0: 24 73 7a 21 3d 34 30 39 36 2a 33 7d 20 7b 20 0a  $sz!=4096*3} { .
86e0: 20 20 20 20 20 20 65 72 72 6f 72 20 22 45 78 70        error "Exp
86f0: 65 63 74 65 64 20 66 69 6c 65 20 73 69 7a 65 20  ected file size 
8700: 74 6f 20 62 65 20 31 32 32 38 38 20 62 79 74 65  to be 12288 byte
8710: 73 20 2d 20 61 63 74 75 61 6c 20 73 69 7a 65 20  s - actual size 
8720: 24 73 7a 20 62 79 74 65 73 22 0a 20 20 20 20 7d  $sz bytes".    }
8730: 0a 20 20 7d 0a 7d 20 0a 0a 64 6f 5f 74 65 73 74  .  }.} ..do_test
8740: 20 70 61 67 65 72 66 61 75 6c 74 2d 32 37 2d 70   pagerfault-27-p
8750: 72 65 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  re {.  faultsim_
8760: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
8770: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
8780: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
8790: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
87a0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
87b0: 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
87c0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
87d0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
87e0: 4c 45 20 74 32 28 61 20 55 4e 49 51 55 45 2c 20  LE t2(a UNIQUE, 
87f0: 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 49  b UNIQUE);.    I
8800: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
8810: 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 38  LUES( a_string(8
8820: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 38 30  00), a_string(80
8830: 30 29 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  0) );.    INSERT
8840: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
8850: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61  a_string(800), a
8860: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
8870: 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t2;.    INSERT
8880: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
8890: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61  a_string(800), a
88a0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
88b0: 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t2;.    INSERT
88c0: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
88d0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61  a_string(800), a
88e0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
88f0: 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t2;.    INSERT
8900: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
8910: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61  a_string(800), a
8920: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
8930: 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t2;.    INSERT
8940: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
8950: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61  a_string(800), a
8960: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
8970: 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t2;.    INSERT
8980: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
8990: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61  a_string(800), a
89a0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
89b0: 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t2;.    INSERT
89c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 20   INTO t1 VALUES 
89d0: 28 61 5f 73 74 72 69 6e 67 28 32 30 30 30 30 29  (a_string(20000)
89e0: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 30 30  , a_string(20000
89f0: 29 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  ));.  }.  faults
8a00: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
8a10: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
8a20: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
8a30: 6c 74 2d 32 37 20 2d 66 61 75 6c 74 73 20 69 6f  lt-27 -faults io
8a40: 65 72 72 2d 70 65 72 73 69 73 74 65 6e 74 20 2d  err-persistent -
8a50: 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69  prep {.  faultsi
8a60: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
8a70: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
8a80: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
8a90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
8aa0: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
8ab0: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45  ize = 10;.    BE
8ac0: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20  GIN EXCLUSIVE;. 
8ad0: 20 7d 0a 20 20 73 65 74 20 3a 3a 63 68 61 6e 6e   }.  set ::chann
8ae0: 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20  el [db incrblob 
8af0: 74 31 20 61 20 31 5d 0a 7d 20 2d 62 6f 64 79 20  t1 a 1].} -body 
8b00: 7b 0a 20 20 70 75 74 73 20 24 3a 3a 63 68 61 6e  {.  puts $::chan
8b10: 6e 65 6c 20 5b 73 74 72 69 6e 67 20 72 65 70 65  nel [string repe
8b20: 61 74 20 61 62 63 20 36 30 30 30 5d 0a 20 20 66  at abc 6000].  f
8b30: 6c 75 73 68 20 24 3a 3a 63 68 61 6e 6e 65 6c 0a  lush $::channel.
8b40: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 63 61 74 63  } -test {.  catc
8b50: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 32  hsql { UPDATE t2
8b60: 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e   SET a = a_strin
8b70: 67 28 38 30 30 29 2c 20 62 20 3d 20 61 5f 73 74  g(800), b = a_st
8b80: 72 69 6e 67 28 38 30 30 29 20 7d 0a 20 20 63 61  ring(800) }.  ca
8b90: 74 63 68 20 7b 20 63 6c 6f 73 65 20 24 3a 3a 63  tch { close $::c
8ba0: 68 61 6e 6e 65 6c 20 7d 0a 20 20 63 61 74 63 68  hannel }.  catch
8bb0: 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d  sql { ROLLBACK }
8bc0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65  .  faultsim_inte
8bd0: 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 0a  grity_check.}...
8be0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
8bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
8c30: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
8c40: 32 38 2d 70 72 65 20 7b 0a 20 20 66 61 75 6c 74  28-pre {.  fault
8c50: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
8c60: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
8c70: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
8c80: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
8c90: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
8ca0: 7a 65 20 3d 20 35 31 32 3b 0a 0a 20 20 20 20 50  ze = 512;..    P
8cb0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8cc0: 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 50 52  de = wal;.    PR
8cd0: 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65  AGMA wal_autoche
8ce0: 63 6b 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  ckpoint = 0;.   
8cf0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
8d00: 7a 65 20 3d 20 31 30 30 30 30 30 3b 0a 0a 20 20  ze = 100000;..  
8d10: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43    BEGIN;.      C
8d20: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
8d30: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
8d40: 45 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  E);.      INSERT
8d50: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
8d60: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20   a_string(800), 
8d70: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 29 3b  a_string(800) );
8d80: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
8d90: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61 5f 73  TO t2 SELECT a_s
8da0: 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f 73 74  tring(800), a_st
8db0: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
8dc0: 32 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  2;.      INSERT 
8dd0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61  INTO t2 SELECT a
8de0: 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f  _string(800), a_
8df0: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
8e00: 20 74 32 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t2;.      INSER
8e10: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
8e20: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20   a_string(800), 
8e30: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
8e40: 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 49 4e 53  OM t2;.      INS
8e50: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
8e60: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
8e70: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
8e80: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 49  FROM t2;.      I
8e90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
8ea0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
8eb0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  0), a_string(800
8ec0: 29 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20  ) FROM t2;.     
8ed0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
8ee0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
8ef0: 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 38  800), a_string(8
8f00: 30 30 29 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  00) FROM t2;.   
8f10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8f20: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
8f30: 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(800), a_string
8f40: 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b 0a 20  (800) FROM t2;. 
8f50: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
8f60: 20 74 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t2 SELECT a_str
8f70: 69 6e 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69  ing(800), a_stri
8f80: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b  ng(800) FROM t2;
8f90: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
8fa0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61 5f 73  TO t2 SELECT a_s
8fb0: 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f 73 74  tring(800), a_st
8fc0: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
8fd0: 32 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  2;.      INSERT 
8fe0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61  INTO t2 SELECT a
8ff0: 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f  _string(800), a_
9000: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
9010: 20 74 32 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t2;.      INSER
9020: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
9030: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20   a_string(800), 
9040: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
9050: 4f 4d 20 74 32 3b 0a 20 20 20 20 43 4f 4d 4d 49  OM t2;.    COMMI
9060: 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  T;.    CREATE TA
9070: 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59  BLE t1(a PRIMARY
9080: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 7d 0a 20 20   KEY, b);.  }.  
9090: 65 78 70 72 20 7b 5b 66 69 6c 65 20 73 69 7a 65  expr {[file size
90a0: 20 74 65 73 74 2e 64 62 2d 73 68 6d 5d 20 3e 3d   test.db-shm] >=
90b0: 20 39 36 2a 31 30 32 34 7d 0a 7d 20 7b 31 7d 0a   96*1024}.} {1}.
90c0: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e  faultsim_save_an
90d0: 64 5f 63 6c 6f 73 65 0a 0a 64 6f 5f 66 61 75 6c  d_close..do_faul
90e0: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
90f0: 61 75 6c 74 2d 32 38 61 20 2d 66 61 75 6c 74 73  ault-28a -faults
9100: 20 6f 6f 6d 2a 20 2d 70 72 65 70 20 7b 0a 20 20   oom* -prep {.  
9110: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
9120: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
9130: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6d  ecsql { PRAGMA m
9140: 6d 61 70 5f 73 69 7a 65 3d 30 20 7d 0a 0a 20 20  map_size=0 }..  
9150: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
9160: 2e 64 62 0a 20 20 64 62 32 20 65 76 61 6c 20 7b  .db.  db2 eval {
9170: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
9180: 20 46 52 4f 4d 20 74 32 20 7d 0a 0a 20 20 64 62   FROM t2 }..  db
9190: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
91a0: 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
91b0: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
91c0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
91d0: 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74  O t1 VALUES(a_st
91e0: 72 69 6e 67 28 32 30 30 30 29 2c 20 61 5f 73 74  ring(2000), a_st
91f0: 72 69 6e 67 28 32 30 30 30 29 29 3b 0a 20 20 20  ring(2000));.   
9200: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9210: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
9220: 67 28 32 30 30 30 29 2c 20 61 5f 73 74 72 69 6e  g(2000), a_strin
9230: 67 28 32 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20  g(2000));.  }.  
9240: 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71 6c 69  set ::STMT [sqli
9250: 74 65 33 5f 70 72 65 70 61 72 65 20 64 62 20 22  te3_prepare db "
9260: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
9270: 20 4f 52 44 45 52 20 42 59 20 61 22 20 2d 31 20   ORDER BY a" -1 
9280: 44 55 4d 4d 59 5d 0a 20 20 73 71 6c 69 74 65 33  DUMMY].  sqlite3
9290: 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 0a 7d 20  _step $::STMT.} 
92a0: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
92b0: 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d 0a 7d  l { ROLLBACK }.}
92c0: 20 2d 74 65 73 74 20 7b 0a 20 20 64 62 32 20 63   -test {.  db2 c
92d0: 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 66  lose.  sqlite3_f
92e0: 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54 0a  inalize $::STMT.
92f0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 52 4f 4c    catchsql { ROL
9300: 4c 42 41 43 4b 20 7d 0a 20 20 66 61 75 6c 74 73  LBACK }.  faults
9310: 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65  im_integrity_che
9320: 63 6b 0a 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72  ck.}..faultsim_r
9330: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
9340: 6e 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74 65  n.sqlite3 db2 te
9350: 73 74 2e 64 62 0a 64 62 32 20 65 76 61 6c 20 7b  st.db.db2 eval {
9360: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
9370: 46 52 4f 4d 20 74 32 7d 0a 64 62 20 63 6c 6f 73  FROM t2}.db clos
9380: 65 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74  e..do_faultsim_t
9390: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32  est pagerfault-2
93a0: 38 62 20 2d 66 61 75 6c 74 73 20 6f 6f 6d 2a 20  8b -faults oom* 
93b0: 2d 70 72 65 70 20 7b 0a 20 20 73 71 6c 69 74 65  -prep {.  sqlite
93c0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 7d 20 2d  3 db test.db.} -
93d0: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
93e0: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
93f0: 2a 29 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 2d  *) FROM t2 }.} -
9400: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
9410: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
9420: 20 32 30 34 38 7d 0a 20 20 64 62 20 63 6c 6f 73   2048}.  db clos
9430: 65 0a 7d 0a 0a 64 62 32 20 63 6c 6f 73 65 0a 0a  e.}..db2 close..
9440: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 72 79  ----------.# Try
9490: 20 74 68 69 73 3a 0a 23 0a 23 20 20 20 20 31 29   this:.#.#    1)
94a0: 20 50 75 74 20 74 68 65 20 70 61 67 65 72 20 69   Put the pager i
94b0: 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 28 65  n ERROR state (e
94c0: 72 72 6f 72 20 64 75 72 69 6e 67 20 72 6f 6c 6c  rror during roll
94d0: 62 61 63 6b 29 0a 23 0a 23 20 20 20 20 32 29 20  back).#.#    2) 
94e0: 4e 65 78 74 20 74 69 6d 65 20 74 68 65 20 63 6f  Next time the co
94f0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 75 73 65 64  nnection is used
9500: 20 69 6e 6a 65 63 74 20 65 72 72 6f 72 73 20 69   inject errors i
9510: 6e 74 6f 20 61 6c 6c 20 78 57 72 69 74 65 28 29  nto all xWrite()
9520: 20 61 6e 64 0a 23 20 20 20 20 20 20 20 78 55 6e   and.#       xUn
9530: 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 2e 20 54 68  lock() calls. Th
9540: 69 73 20 63 61 75 73 65 73 20 74 68 65 20 68 6f  is causes the ho
9550: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
9560: 63 6b 20 74 6f 20 66 61 69 6c 20 61 6e 64 0a 23  ck to fail and.#
9570: 20 20 20 20 20 20 20 74 68 65 20 70 61 67 65 72         the pager
9580: 20 74 6f 20 64 65 63 6c 61 72 65 20 69 74 73 20   to declare its 
9590: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 55 4e  locking state UN
95a0: 4b 4e 4f 57 4e 2e 0a 23 0a 23 20 20 20 20 33 29  KNOWN..#.#    3)
95b0: 20 53 61 6d 65 20 61 67 61 69 6e 2e 0a 23 0a 23   Same again..#.#
95c0: 20 20 20 20 34 61 29 20 53 74 6f 70 20 69 6e 6a      4a) Stop inj
95d0: 65 63 74 69 6e 67 20 65 72 72 6f 72 73 2e 20 41  ecting errors. A
95e0: 6c 6c 6f 77 20 74 68 65 20 72 6f 6c 6c 62 61 63  llow the rollbac
95f0: 6b 20 74 6f 20 73 75 63 63 65 65 64 2e 20 43 68  k to succeed. Ch
9600: 65 63 6b 20 74 68 61 74 0a 23 20 20 20 20 20 20  eck that.#      
9610: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69    the database i
9620: 73 20 4f 6b 2e 20 4f 72 2c 20 0a 23 0a 23 20 20  s Ok. Or, .#.#  
9630: 20 20 34 62 29 20 43 6c 6f 73 65 20 61 6e 64 20    4b) Close and 
9640: 72 65 6f 70 65 6e 20 74 68 65 20 64 62 2e 20 43  reopen the db. C
9650: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 64 62  heck that the db
9660: 20 69 73 20 4f 6b 2e 0a 23 0a 70 72 6f 63 20 63   is Ok..#.proc c
9670: 75 73 74 6f 6d 5f 69 6e 6a 65 63 74 69 6e 73 74  ustom_injectinst
9680: 61 6c 6c 20 7b 7d 20 7b 0a 20 20 74 65 73 74 76  all {} {.  testv
9690: 66 73 20 63 75 73 74 6f 6d 20 2d 64 65 66 61 75  fs custom -defau
96a0: 6c 74 20 74 72 75 65 0a 20 20 63 75 73 74 6f 6d  lt true.  custom
96b0: 20 66 69 6c 74 65 72 20 7b 78 57 72 69 74 65 20   filter {xWrite 
96c0: 78 55 6e 6c 6f 63 6b 7d 0a 7d 0a 70 72 6f 63 20  xUnlock}.}.proc 
96d0: 63 75 73 74 6f 6d 5f 69 6e 6a 65 63 74 75 6e 69  custom_injectuni
96e0: 6e 73 74 61 6c 6c 20 7b 7d 20 7b 0a 20 20 63 61  nstall {} {.  ca
96f0: 74 63 68 20 7b 64 62 20 20 63 6c 6f 73 65 7d 0a  tch {db  close}.
9700: 20 20 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f    catch {db2 clo
9710: 73 65 7d 0a 20 20 63 75 73 74 6f 6d 20 64 65 6c  se}.  custom del
9720: 65 74 65 0a 7d 0a 70 72 6f 63 20 63 75 73 74 6f  ete.}.proc custo
9730: 6d 5f 69 6e 6a 65 63 74 73 74 61 72 74 20 7b 69  m_injectstart {i
9740: 46 61 69 6c 7d 20 7b 0a 20 20 63 75 73 74 6f 6d  Fail} {.  custom
9750: 20 69 6f 65 72 72 20 24 69 46 61 69 6c 20 31 0a   ioerr $iFail 1.
9760: 7d 0a 70 72 6f 63 20 63 75 73 74 6f 6d 5f 69 6e  }.proc custom_in
9770: 6a 65 63 74 73 74 6f 70 20 7b 7d 20 7b 0a 20 20  jectstop {} {.  
9780: 63 75 73 74 6f 6d 20 69 6f 65 72 72 0a 7d 0a 73  custom ioerr.}.s
9790: 65 74 20 3a 3a 46 41 55 4c 54 53 49 4d 28 63 75  et ::FAULTSIM(cu
97a0: 73 74 6f 6d 29 20 20 20 20 20 20 20 20 20 20 5b  stom)          [
97b0: 6c 69 73 74 20 20 20 20 20 20 5c 0a 20 20 2d 69  list      \.  -i
97c0: 6e 6a 65 63 74 69 6e 73 74 61 6c 6c 20 20 20 63  njectinstall   c
97d0: 75 73 74 6f 6d 5f 69 6e 6a 65 63 74 69 6e 73 74  ustom_injectinst
97e0: 61 6c 6c 20 20 20 20 5c 0a 20 20 2d 69 6e 6a 65  all    \.  -inje
97f0: 63 74 73 74 61 72 74 20 20 20 20 20 63 75 73 74  ctstart     cust
9800: 6f 6d 5f 69 6e 6a 65 63 74 73 74 61 72 74 20 20  om_injectstart  
9810: 20 20 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 73      \.  -injects
9820: 74 6f 70 20 20 20 20 20 20 63 75 73 74 6f 6d 5f  top      custom_
9830: 69 6e 6a 65 63 74 73 74 6f 70 20 20 20 20 20 20  injectstop      
9840: 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 65 72 72 6c   \.  -injecterrl
9850: 69 73 74 20 20 20 7b 7b 31 20 7b 64 69 73 6b 20  ist   {{1 {disk 
9860: 49 2f 4f 20 65 72 72 6f 72 7d 7d 7d 20 20 5c 0a  I/O error}}}  \.
9870: 20 20 2d 69 6e 6a 65 63 74 75 6e 69 6e 73 74 61    -injectuninsta
9880: 6c 6c 20 63 75 73 74 6f 6d 5f 69 6e 6a 65 63 74  ll custom_inject
9890: 75 6e 69 6e 73 74 61 6c 6c 20 20 5c 0a 5d 0a 0a  uninstall  \.]..
98a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  do_test pagerfau
98b0: 6c 74 2d 32 39 2d 70 72 65 20 7b 0a 20 20 66 61  lt-29-pre {.  fa
98c0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
98d0: 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
98e0: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
98f0: 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
9900: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
9910: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
9920: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
9930: 69 7a 65 20 3d 20 35 3b 0a 0a 20 20 20 20 42 45  ize = 5;..    BE
9940: 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54  GIN;.      CREAT
9950: 45 20 54 41 42 4c 45 20 74 32 28 61 20 55 4e 49  E TABLE t2(a UNI
9960: 51 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  QUE, b UNIQUE);.
9970: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9980: 4f 20 74 32 20 56 41 4c 55 45 53 28 20 61 5f 73  O t2 VALUES( a_s
9990: 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f 73 74  tring(800), a_st
99a0: 72 69 6e 67 28 38 30 30 29 20 29 3b 0a 20 20 20  ring(800) );.   
99b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
99c0: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
99d0: 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(800), a_string
99e0: 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b 0a 20  (800) FROM t2;. 
99f0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9a00: 20 74 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t2 SELECT a_str
9a10: 69 6e 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69  ing(800), a_stri
9a20: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b  ng(800) FROM t2;
9a30: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9a40: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61 5f 73  TO t2 SELECT a_s
9a50: 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f 73 74  tring(800), a_st
9a60: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
9a70: 32 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  2;.      INSERT 
9a80: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61  INTO t2 SELECT a
9a90: 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f  _string(800), a_
9aa0: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
9ab0: 20 74 32 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b   t2;.    COMMIT;
9ac0: 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 5b 66 69  .  }.  expr {[fi
9ad0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
9ae0: 20 3e 3d 20 35 30 2a 31 30 32 34 7d 0a 7d 20 7b   >= 50*1024}.} {
9af0: 31 7d 0a 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  1}.faultsim_save
9b00: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 66 6f 72 65 61  _and_close.forea
9b10: 63 68 20 7b 74 6e 20 74 74 7d 20 7b 0a 20 20 32  ch {tn tt} {.  2
9b20: 39 20 7b 20 63 61 74 63 68 73 71 6c 20 52 4f 4c  9 { catchsql ROL
9b30: 4c 42 41 43 4b 20 7d 0a 20 20 33 30 20 7b 20 64  LBACK }.  30 { d
9b40: 62 20 63 6c 6f 73 65 20 3b 20 73 71 6c 69 74 65  b close ; sqlite
9b50: 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d 0a 7d  3 db test.db }.}
9b60: 20 7b 0a 20 20 64 6f 5f 66 61 75 6c 74 73 69 6d   {.  do_faultsim
9b70: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
9b80: 2d 24 74 6e 20 2d 66 61 75 6c 74 73 20 63 75 73  -$tn -faults cus
9b90: 74 6f 6d 20 2d 70 72 65 70 20 7b 0a 20 20 20 20  tom -prep {.    
9ba0: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
9bb0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
9bc0: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
9bd0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20  ng a_string.    
9be0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
9bf0: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
9c00: 5f 73 69 7a 65 20 3d 20 35 3b 0a 20 20 20 20 20  _size = 5;.     
9c10: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
9c20: 20 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20    UPDATE t2 SET 
9c30: 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 37 39 39  a = a_string(799
9c40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 7d 20 2d  );.      }.  } -
9c50: 62 6f 64 79 20 7b 0a 20 20 20 20 63 61 74 63 68  body {.    catch
9c60: 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 20 20 20  sql ROLLBACK.   
9c70: 20 63 61 74 63 68 73 71 6c 20 52 4f 4c 4c 42 41   catchsql ROLLBA
9c80: 43 4b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  CK.    catchsql 
9c90: 52 4f 4c 4c 42 41 43 4b 0a 20 20 7d 20 2d 74 65  ROLLBACK.  } -te
9ca0: 73 74 20 7b 0a 20 20 20 20 65 76 61 6c 20 24 3a  st {.    eval $:
9cb0: 3a 74 74 0a 20 20 20 20 69 66 20 7b 22 6f 6b 22  :tt.    if {"ok"
9cc0: 20 21 3d 20 5b 64 62 20 6f 6e 65 20 7b 50 52 41   != [db one {PRA
9cd0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
9ce0: 65 63 6b 7d 5d 7d 20 7b 0a 20 20 20 20 20 20 65  eck}]} {.      e
9cf0: 72 72 6f 72 20 22 69 6e 74 65 67 72 69 74 79 20  rror "integrity 
9d00: 63 68 65 63 6b 20 66 61 69 6c 65 64 22 0a 20 20  check failed".  
9d10: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65    }.  }.}..do_te
9d20: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 33 31  st pagerfault-31
9d30: 2d 70 72 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  -pre {.  sqlite3
9d40: 5f 73 68 75 74 64 6f 77 6e 0a 20 20 73 71 6c 69  _shutdown.  sqli
9d50: 74 65 33 5f 63 6f 6e 66 69 67 5f 75 72 69 20 31  te3_config_uri 1
9d60: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  .} {SQLITE_OK}.d
9d70: 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20  o_faultsim_test 
9d80: 70 61 67 65 72 66 61 75 6c 74 2d 33 31 20 2d 66  pagerfault-31 -f
9d90: 61 75 6c 74 73 20 6f 6f 6d 2a 20 2d 62 6f 64 79  aults oom* -body
9da0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
9db0: 7b 66 69 6c 65 3a 6f 6e 65 3f 6d 6f 64 65 3d 6d  {file:one?mode=m
9dc0: 65 6d 6f 72 79 26 63 61 63 68 65 3d 73 68 61 72  emory&cache=shar
9dd0: 65 64 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a  ed}.  db eval {.
9de0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9df0: 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45   t1(x);.    INSE
9e00: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
9e10: 53 28 31 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  S(1);.    SELECT
9e20: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
9e30: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c  } -test {.  faul
9e40: 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74  tsim_test_result
9e50: 20 7b 30 20 31 7d 20 7b 31 20 7b 7d 7d 0a 20 20   {0 1} {1 {}}.  
9e60: 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
9e70: 20 7d 0a 7d 0a 73 71 6c 69 74 65 33 5f 73 68 75   }.}.sqlite3_shu
9e80: 74 64 6f 77 6e 0a 73 71 6c 69 74 65 33 5f 63 6f  tdown.sqlite3_co
9e90: 6e 66 69 67 5f 75 72 69 20 30 0a 0a 64 6f 5f 74  nfig_uri 0..do_t
9ea0: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 33  est pagerfault-3
9eb0: 32 2d 70 72 65 20 7b 0a 20 20 72 65 73 65 74 5f  2-pre {.  reset_
9ec0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
9ed0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9ee0: 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52  t1(x);.    INSER
9ef0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
9f00: 28 27 6f 6e 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b  ('one');.  }.} {
9f10: 7d 0a 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f  }.faultsim_save_
9f20: 61 6e 64 5f 63 6c 6f 73 65 0a 0a 64 6f 5f 66 61  and_close..do_fa
9f30: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
9f40: 72 66 61 75 6c 74 2d 33 32 20 2d 70 72 65 70 20  rfault-32 -prep 
9f50: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
9f60: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
9f70: 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45    db eval { SELE
9f80: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 7d 0a  CT * FROM t1; }.
9f90: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
9fa0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
9fb0: 52 4f 4d 20 74 31 3b 20 7d 0a 7d 20 2d 74 65 73  ROM t1; }.} -tes
9fc0: 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74  t {.  faultsim_t
9fd0: 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 6f 6e  est_result {0 on
9fe0: 65 7d 0a 7d 0a 73 71 6c 69 74 65 33 5f 73 68 75  e}.}.sqlite3_shu
9ff0: 74 64 6f 77 6e 0a 73 71 6c 69 74 65 33 5f 63 6f  tdown.sqlite3_co
a000: 6e 66 69 67 5f 75 72 69 20 30 0a 0a 64 6f 5f 66  nfig_uri 0..do_f
a010: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
a020: 65 72 66 61 75 6c 74 2d 33 33 61 20 2d 70 72 65  erfault-33a -pre
a030: 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  p {.  sqlite3 db
a040: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78 65 63   :memory:.  exec
a050: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
a060: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
a070: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a080: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
a090: 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  ;.  }.} -body {.
a0a0: 20 20 65 78 65 63 73 71 6c 20 7b 20 56 41 43 55    execsql { VACU
a0b0: 55 4d 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  UM }.} -test {. 
a0c0: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
a0d0: 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d 20 0a  esult {0 {}}.} .
a0e0: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
a0f0: 20 70 61 67 65 72 66 61 75 6c 74 2d 33 33 62 20   pagerfault-33b 
a100: 2d 70 72 65 70 20 7b 0a 20 20 73 71 6c 69 74 65  -prep {.  sqlite
a110: 33 20 64 62 20 22 22 0a 20 20 65 78 65 63 73 71  3 db "".  execsq
a120: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
a130: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
a140: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a150: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
a160: 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20    }.} -body {.  
a170: 65 78 65 63 73 71 6c 20 7b 20 56 41 43 55 55 4d  execsql { VACUUM
a180: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
a190: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
a1a0: 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d 20 0a 0a 64  ult {0 {}}.} ..d
a1b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
a1c0: 74 2d 33 34 2d 70 72 65 20 7b 0a 20 20 72 65 73  t-34-pre {.  res
a1d0: 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20  et_db.  execsql 
a1e0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
a1f0: 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20  LE t1(x PRIMARY 
a200: 4b 45 59 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 66  KEY);.  }.} {}.f
a210: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
a220: 5f 63 6c 6f 73 65 0a 64 6f 5f 66 61 75 6c 74 73  _close.do_faults
a230: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
a240: 6c 74 2d 33 34 20 2d 70 72 65 70 20 7b 0a 20 20  lt-34 -prep {.  
a250: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
a260: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
a270: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
a280: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
a290: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 20  INTO t1 VALUES( 
a2a0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 30 29  randomblob(4000)
a2b0: 20 29 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45   );.      DELETE
a2c0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
a2d0: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
a2e0: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 2d 74 65 73 74  l COMMIT.} -test
a2f0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65   {.  faultsim_te
a300: 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d  st_result {0 {}}
a310: 0a 7d 20 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  .} ..do_test pag
a320: 65 72 66 61 75 6c 74 2d 33 35 2d 70 72 65 20 7b  erfault-35-pre {
a330: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
a340: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
a350: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
a360: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20  EATE TABLE t1(x 
a370: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
a380: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a390: 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t1 VALUES(rando
a3a0: 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64  mblob(200), rand
a3b0: 6f 6d 62 6c 6f 62 28 32 30 30 29 29 3b 0a 20 20  omblob(200));.  
a3c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
a3d0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
a3e0: 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62  ob(200), randomb
a3f0: 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31  lob(200) FROM t1
a400: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
a410: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
a420: 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e  omblob(200), ran
a430: 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f  domblob(200) FRO
a440: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
a450: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
a460: 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c  randomblob(200),
a470: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
a480: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20   FROM t1;.  }.  
a490: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e  faultsim_save_an
a4a0: 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 74 65 73  d_close.} {}.tes
a4b0: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
a4c0: 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65   1.tv sectorsize
a4d0: 20 38 31 39 32 3b 0a 74 76 20 64 65 76 63 68 61   8192;.tv devcha
a4e0: 72 20 5b 6c 69 73 74 5d 0a 64 6f 5f 66 61 75 6c  r [list].do_faul
a4f0: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
a500: 61 75 6c 74 2d 33 35 20 2d 70 72 65 70 20 7b 0a  ault-35 -prep {.
a510: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
a520: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20  re_and_reopen.} 
a530: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
a540: 6c 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  l { UPDATE t1 SE
a550: 54 20 78 3d 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  T x=randomblob(2
a560: 30 30 29 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  00) }.} -test {.
a570: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
a580: 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d 0a  result {0 {}}.}.
a590: 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d  catch {db close}
a5a0: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 73 71 6c 69  .tv delete..sqli
a5b0: 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 73 71 6c  te3_shutdown.sql
a5c0: 69 74 65 33 5f 63 6f 6e 66 69 67 5f 75 72 69 20  ite3_config_uri 
a5d0: 31 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66  1.do_test pagerf
a5e0: 61 75 6c 74 2d 33 36 2d 70 72 65 20 7b 0a 20 20  ault-36-pre {.  
a5f0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
a600: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
a610: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
a620: 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52 49  E TABLE t1(x PRI
a630: 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
a640: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
a650: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
a660: 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62  ob(200), randomb
a670: 6c 6f 62 28 32 30 30 29 29 3b 0a 20 20 20 20 49  lob(200));.    I
a680: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
a690: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
a6a0: 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  200), randomblob
a6b0: 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (200) FROM t1;. 
a6c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a6d0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
a6e0: 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(200), random
a6f0: 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74  blob(200) FROM t
a700: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
a710: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
a720: 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61  domblob(200), ra
a730: 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
a740: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 66 61 75  OM t1;.  }.  fau
a750: 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63  ltsim_save_and_c
a760: 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75  lose.} {}.do_fau
a770: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
a780: 66 61 75 6c 74 2d 33 36 20 2d 70 72 65 70 20 7b  fault-36 -prep {
a790: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
a7a0: 6f 72 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62  ore.  sqlite3 db
a7b0: 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f 63 61   file:test.db?ca
a7c0: 63 68 65 3d 73 68 61 72 65 64 0a 20 20 73 71 6c  che=shared.  sql
a7d0: 69 74 65 33 20 64 62 32 20 66 69 6c 65 3a 74 65  ite3 db2 file:te
a7e0: 73 74 2e 64 62 3f 63 61 63 68 65 3d 73 68 61 72  st.db?cache=shar
a7f0: 65 64 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 0a  ed.  db2 eval {.
a800: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53      BEGIN;.    S
a810: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
a820: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
a830: 72 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c  r;.  }.  db eval
a840: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
a850: 63 68 65 5f 73 69 7a 65 20 3d 20 31 3b 0a 20 20  che_size = 1;.  
a860: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55    BEGIN;.      U
a870: 50 44 41 54 45 20 74 31 20 53 45 54 20 78 20 3d  PDATE t1 SET x =
a880: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
a890: 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  ;.  }.} -body {.
a8a0: 20 20 65 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41    execsql ROLLBA
a8b0: 43 4b 20 64 62 0a 7d 20 2d 74 65 73 74 20 7b 0a  CK db.} -test {.
a8c0: 20 20 63 61 74 63 68 20 7b 20 64 62 20 65 76 61    catch { db eva
a8d0: 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53 45 54  l {UPDATE t1 SET
a8e0: 20 78 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28   x = randomblob(
a8f0: 32 30 30 29 7d 20 7d 0a 20 20 66 61 75 6c 74 73  200)} }.  faults
a900: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
a910: 30 20 7b 7d 7d 0a 20 20 63 61 74 63 68 20 7b 20  0 {}}.  catch { 
a920: 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 63 61 74  db close }.  cat
a930: 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d  ch { db2 close }
a940: 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 73 68 75 74  .}..sqlite3_shut
a950: 64 6f 77 6e 0a 73 71 6c 69 74 65 33 5f 63 6f 6e  down.sqlite3_con
a960: 66 69 67 5f 75 72 69 20 30 0a 73 71 6c 69 74 65  fig_uri 0.sqlite
a970: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 0a 0a 66 69  3_initialize..fi
a980: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.