/ Hex Artifact Content
Login

Artifact 0c12520f6c8883ec401b8b7b5406ca24657566a1:


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 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74  r or missing dat
4fa0: 61 62 61 73 65 7d 7d 0a 7d 0a 0a 23 20 49 66 20  abase}}.}..# If 
4fb0: 54 45 4d 50 5f 53 54 4f 52 45 20 69 73 20 32 20  TEMP_STORE is 2 
4fc0: 6f 72 20 67 72 65 61 74 65 72 2c 20 74 68 65 6e  or greater, then
4fd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 5b 64   the database [d
4fe0: 62 32 5d 20 77 69 6c 6c 20 62 65 20 63 72 65 61  b2] will be crea
4ff0: 74 65 64 0a 23 20 61 73 20 61 6e 20 69 6e 2d 6d  ted.# as an in-m
5000: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
5010: 54 68 69 73 20 74 65 73 74 20 77 69 6c 6c 20 6e  This test will n
5020: 6f 74 20 77 6f 72 6b 20 69 6e 20 74 68 61 74 20  ot work in that 
5030: 63 61 73 65 2c 20 61 73 20 69 74 0a 23 20 69 73  case, as it.# is
5040: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
5050: 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
5060: 2d 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 2d 6d  -size of an in-m
5070: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
5080: 45 76 65 6e 0a 23 20 75 73 69 6e 67 20 74 68 65  Even.# using the
5090: 20 62 61 63 6b 75 70 20 41 50 49 2e 0a 23 0a 69   backup API..#.i
50a0: 66 20 7b 24 54 45 4d 50 5f 53 54 4f 52 45 3c 32  f {$TEMP_STORE<2
50b0: 7d 20 7b 0a 20 20 64 6f 5f 66 61 75 6c 74 73 69  } {.  do_faultsi
50c0: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
50d0: 74 2d 31 34 62 20 2d 70 72 65 70 20 7b 0a 20 20  t-14b -prep {.  
50e0: 20 20 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c    catch { db2 cl
50f0: 6f 73 65 20 7d 0a 20 20 20 20 66 61 75 6c 74 73  ose }.    faults
5100: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5110: 65 6f 70 65 6e 0a 20 20 20 20 73 71 6c 69 74 65  eopen.    sqlite
5120: 33 20 64 62 32 20 22 22 0a 20 20 20 20 64 62 32  3 db2 "".    db2
5130: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 70   eval { PRAGMA p
5140: 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b  age_size = 4096;
5150: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5160: 28 61 29 20 7d 0a 20 20 7d 20 2d 62 6f 64 79 20  (a) }.  } -body 
5170: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  {.    sqlite3_ba
5180: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
5190: 64 62 20 6d 61 69 6e 0a 20 20 20 20 42 20 73 74  db main.    B st
51a0: 65 70 20 32 30 30 0a 20 20 20 20 73 65 74 20 72  ep 200.    set r
51b0: 63 20 5b 42 20 66 69 6e 69 73 68 5d 0a 20 20 20  c [B finish].   
51c0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
51d0: 63 68 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ch SQLITE_IOERR_
51e0: 2a 20 24 72 63 5d 7d 20 7b 73 65 74 20 72 63 20  * $rc]} {set rc 
51f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 7d 0a 20 20  SQLITE_IOERR}.  
5200: 20 20 69 66 20 7b 24 72 63 20 21 3d 20 22 53 51    if {$rc != "SQ
5210: 4c 49 54 45 5f 4f 4b 22 7d 20 7b 20 65 72 72 6f  LITE_OK"} { erro
5220: 72 20 5b 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  r [sqlite3_test_
5230: 65 72 72 73 74 72 20 24 72 63 5d 20 7d 0a 20 20  errstr $rc] }.  
5240: 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 20 20 7d 20    set {} {}.  } 
5250: 2d 74 65 73 74 20 7b 0a 20 20 20 20 66 61 75 6c  -test {.    faul
5260: 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74  tsim_test_result
5270: 20 7b 30 20 7b 7d 7d 20 7b 31 20 7b 73 71 6c 69   {0 {}} {1 {sqli
5280: 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
5290: 29 20 66 61 69 6c 65 64 7d 7d 0a 20 20 7d 0a 7d  ) failed}}.  }.}
52a0: 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  ..do_faultsim_te
52b0: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 34  st pagerfault-14
52c0: 63 20 2d 70 72 65 70 20 7b 0a 20 20 63 61 74 63  c -prep {.  catc
52d0: 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a  h { db2 close }.
52e0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
52f0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
5300: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
5310: 2e 64 62 32 0a 20 20 64 62 32 20 65 76 61 6c 20  .db2.  db2 eval 
5320: 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79  { .    PRAGMA sy
5330: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6f 66 66 3b  nchronous = off;
5340: 20 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67   .    PRAGMA pag
5350: 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 20 0a  e_size = 4096; .
5360: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5370: 20 78 78 28 61 29 3b 0a 20 20 7d 0a 7d 20 2d 62   xx(a);.  }.} -b
5380: 6f 64 79 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ody {.  sqlite3_
5390: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
53a0: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74  n db main.  B st
53b0: 65 70 20 32 30 30 0a 20 20 73 65 74 20 72 63 20  ep 200.  set rc 
53c0: 5b 42 20 66 69 6e 69 73 68 5d 0a 20 20 69 66 20  [B finish].  if 
53d0: 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 53  {[string match S
53e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 2a 20 24 72  QLITE_IOERR_* $r
53f0: 63 5d 7d 20 7b 73 65 74 20 72 63 20 53 51 4c 49  c]} {set rc SQLI
5400: 54 45 5f 49 4f 45 52 52 7d 0a 20 20 69 66 20 7b  TE_IOERR}.  if {
5410: 24 72 63 20 21 3d 20 22 53 51 4c 49 54 45 5f 4f  $rc != "SQLITE_O
5420: 4b 22 7d 20 7b 20 65 72 72 6f 72 20 5b 73 71 6c  K"} { error [sql
5430: 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72  ite3_test_errstr
5440: 20 24 72 63 5d 20 7d 0a 20 20 73 65 74 20 7b 7d   $rc] }.  set {}
5450: 20 7b 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20   {}.} -test {.  
5460: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
5470: 73 75 6c 74 20 7b 30 20 7b 7d 7d 20 7b 31 20 7b  sult {0 {}} {1 {
5480: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
5490: 6e 69 74 28 29 20 66 61 69 6c 65 64 7d 7d 0a 7d  nit() failed}}.}
54a0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66  ..do_test pagerf
54b0: 61 75 6c 74 2d 31 35 2d 70 72 65 31 20 7b 0a 20  ault-15-pre1 {. 
54c0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
54d0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62  _and_reopen.  db
54e0: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
54f0: 5f 73 74 72 69 6e 67 3b 0a 20 20 65 78 65 63 73  _string;.  execs
5500: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
5510: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
5520: 4c 45 20 74 31 28 78 2c 20 79 20 55 4e 49 51 55  LE t1(x, y UNIQU
5530: 45 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  E);.      INSERT
5540: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
5550: 61 5f 73 74 72 69 6e 67 28 31 31 29 2c 20 61 5f  a_string(11), a_
5560: 73 74 72 69 6e 67 28 32 32 29 29 3b 0a 20 20 20  string(22));.   
5570: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5580: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
5590: 67 28 31 31 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(11), a_string(
55a0: 32 32 29 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  22));.    COMMIT
55b0: 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  ;.  }.  faultsim
55c0: 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a  _save_and_close.
55d0: 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d  } {}.do_faultsim
55e0: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
55f0: 2d 31 35 20 2d 70 72 65 70 20 7b 0a 20 20 66 61  -15 -prep {.  fa
5600: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5610: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
5620: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
5630: 74 72 69 6e 67 3b 0a 7d 20 2d 62 6f 64 79 20 7b  tring;.} -body {
5640: 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c  .  db eval { SEL
5650: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 49  ECT * FROM t1 LI
5660: 4d 49 54 20 31 20 7d 20 7b 0a 20 20 20 20 65 78  MIT 1 } {.    ex
5670: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45  ecsql {.      BE
5680: 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  GIN; INSERT INTO
5690: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
56a0: 69 6e 67 28 33 33 33 29 2c 20 61 5f 73 74 72 69  ing(333), a_stri
56b0: 6e 67 28 35 35 35 29 29 3b 20 43 4f 4d 4d 49 54  ng(555)); COMMIT
56c0: 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 20 49  ;.      BEGIN; I
56d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
56e0: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 33 33  LUES(a_string(33
56f0: 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 35 35  3), a_string(555
5700: 29 29 3b 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20  )); COMMIT;.    
5710: 7d 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  }.  }.} -test {.
5720: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
5730: 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20  result {0 {}}.  
5740: 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69  faultsim_integri
5750: 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 0a 64 6f 5f  ty_check.}...do_
5760: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
5770: 31 36 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c  16-pre1 {.  faul
5780: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
5790: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
57a0: 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
57b0: 74 31 28 78 2c 20 79 20 55 4e 49 51 55 45 29 20  t1(x, y UNIQUE) 
57c0: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  }.  faultsim_sav
57d0: 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d  e_and_close.} {}
57e0: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
57f0: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 36 20  t pagerfault-16 
5800: 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73  -prep {.  faults
5810: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5820: 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a  eopen.} -body {.
5830: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5840: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
5850: 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b  ode = exclusive;
5860: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
5870: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a  nal_mode = wal;.
5880: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5890: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
58a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
58b0: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
58c0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
58d0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65  rnal_mode = dele
58e0: 74 65 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  te;.    INSERT I
58f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c  NTO t1 VALUES(4,
5900: 20 35 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   5);.    PRAGMA 
5910: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77  journal_mode = w
5920: 61 6c 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  al;.    INSERT I
5930: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 2c  NTO t1 VALUES(6,
5940: 20 37 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   7);.    PRAGMA 
5950: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70  journal_mode = p
5960: 65 72 73 69 73 74 3b 0a 20 20 20 20 49 4e 53 45  ersist;.    INSE
5970: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5980: 53 28 38 2c 20 39 29 3b 0a 20 20 7d 0a 7d 20 2d  S(8, 9);.  }.} -
5990: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
59a0: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
59b0: 20 7b 65 78 63 6c 75 73 69 76 65 20 77 61 6c 20   {exclusive wal 
59c0: 64 65 6c 65 74 65 20 77 61 6c 20 70 65 72 73 69  delete wal persi
59d0: 73 74 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st}}.  faultsim_
59e0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
59f0: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
5a40: 20 54 65 73 74 20 66 61 75 6c 74 20 69 6e 6a 65   Test fault inje
5a50: 63 74 69 6f 6e 20 77 68 69 6c 65 20 63 68 61 6e  ction while chan
5a60: 67 69 6e 67 20 69 6e 74 6f 20 61 6e 64 20 6f 75  ging into and ou
5a70: 74 20 6f 66 20 57 41 4c 20 6d 6f 64 65 2e 0a 23  t of WAL mode..#
5a80: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61  .do_test pagerfa
5a90: 75 6c 74 2d 31 37 2d 70 72 65 31 20 7b 0a 20 20  ult-17-pre1 {.  
5aa0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
5ab0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
5ac0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
5ad0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
5ae0: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
5af0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5b00: 20 56 41 4c 55 45 53 28 31 38 36 32 2c 20 27 42   VALUES(1862, 'B
5b10: 6f 74 68 61 27 29 3b 0a 20 20 20 20 49 4e 53 45  otha');.    INSE
5b20: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5b30: 53 28 31 38 37 30 2c 20 27 53 6d 75 74 73 27 29  S(1870, 'Smuts')
5b40: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5b50: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 38 36 36  O t1 VALUES(1866
5b60: 2c 20 27 48 65 72 74 7a 6f 67 27 29 3b 0a 20 20  , 'Hertzog');.  
5b70: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  }.  faultsim_sav
5b80: 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d  e_and_close.} {}
5b90: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
5ba0: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 37 61  t pagerfault-17a
5bb0: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
5bc0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5bd0: 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b  reopen.} -body {
5be0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5bf0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
5c00: 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20  mode = wal;.    
5c10: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
5c20: 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20  ode = delete;.  
5c30: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  }.} -test {.  fa
5c40: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
5c50: 6c 74 20 7b 30 20 7b 77 61 6c 20 64 65 6c 65 74  lt {0 {wal delet
5c60: 65 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69  e}}.  faultsim_i
5c70: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d  ntegrity_check.}
5c80: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
5c90: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 37 62  t pagerfault-17b
5ca0: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
5cb0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5cc0: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
5cd0: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
5ce0: 6f 6e 6f 75 73 20 3d 20 4f 46 46 20 7d 0a 7d 20  onous = OFF }.} 
5cf0: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
5d00: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
5d10: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61  ournal_mode = wa
5d20: 6c 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  l;.    INSERT IN
5d30: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 32 2c  TO t1 VALUES(22,
5d40: 20 27 43 6c 61 72 6b 65 27 29 3b 0a 20 20 20 20   'Clarke');.    
5d50: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
5d60: 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20  ode = delete;.  
5d70: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  }.} -test {.  fa
5d80: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
5d90: 6c 74 20 7b 30 20 7b 77 61 6c 20 64 65 6c 65 74  lt {0 {wal delet
5da0: 65 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69  e}}.  faultsim_i
5db0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d  ntegrity_check.}
5dc0: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
5dd0: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 37 63  t pagerfault-17c
5de0: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
5df0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5e00: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
5e10: 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 6c   { .    PRAGMA l
5e20: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78  ocking_mode = ex
5e30: 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41  clusive;.    PRA
5e40: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
5e50: 20 3d 20 77 61 6c 3b 0a 20 20 7d 0a 7d 20 2d 62   = wal;.  }.} -b
5e60: 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ody {.  execsql 
5e70: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
5e80: 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 20 7d  _mode = delete }
5e90: 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75  .} -test {.  fau
5ea0: 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c  ltsim_test_resul
5eb0: 74 20 7b 30 20 64 65 6c 65 74 65 7d 0a 20 20 66  t {0 delete}.  f
5ec0: 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74  aultsim_integrit
5ed0: 79 5f 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75  y_check.}.do_fau
5ee0: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
5ef0: 66 61 75 6c 74 2d 31 37 64 20 2d 70 72 65 70 20  fault-17d -prep 
5f00: 7b 0a 20 20 63 61 74 63 68 20 7b 20 64 62 32 20  {.  catch { db2 
5f10: 63 6c 6f 73 65 20 7d 0a 20 20 66 61 75 6c 74 73  close }.  faults
5f20: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5f30: 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20  eopen.  sqlite3 
5f40: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78  db2 test.db.  ex
5f50: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a  ecsql { PRAGMA j
5f60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
5f70: 6c 65 74 65 20 7d 0a 20 20 65 78 65 63 73 71 6c  lete }.  execsql
5f80: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
5f90: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20  l_mode = wal }. 
5fa0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
5fb0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5fc0: 28 39 39 2c 20 27 42 72 61 64 6d 61 6e 27 29 20  (99, 'Bradman') 
5fd0: 7d 20 64 62 32 0a 7d 20 2d 62 6f 64 79 20 7b 0a  } db2.} -body {.
5fe0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
5ff0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
6000: 3d 20 64 65 6c 65 74 65 20 7d 0a 7d 20 2d 74 65  = delete }.} -te
6010: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
6020: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 31 20 7b  test_result {1 {
6030: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
6040: 65 64 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  ed}}.  faultsim_
6050: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
6060: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
6070: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 37  st pagerfault-17
6080: 65 20 2d 70 72 65 70 20 7b 0a 20 20 63 61 74 63  e -prep {.  catc
6090: 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a  h { db2 close }.
60a0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
60b0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
60c0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
60d0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
60e0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
60f0: 6f 64 65 20 3d 20 64 65 6c 65 74 65 20 7d 0a 20  ode = delete }. 
6100: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
6110: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
6120: 20 77 61 6c 20 7d 0a 20 20 73 65 74 20 3a 3a 63   wal }.  set ::c
6130: 68 61 6e 20 5b 6c 61 75 6e 63 68 5f 74 65 73 74  han [launch_test
6140: 66 69 78 74 75 72 65 5d 0a 20 20 74 65 73 74 66  fixture].  testf
6150: 69 78 74 75 72 65 20 24 3a 3a 63 68 61 6e 20 7b  ixture $::chan {
6160: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
6170: 74 65 73 74 2e 64 62 0a 20 20 20 20 64 62 20 65  test.db.    db e
6180: 76 61 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  val { INSERT INT
6190: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 30 31 2c  O t1 VALUES(101,
61a0: 20 27 4c 61 74 68 61 6d 27 29 20 7d 0a 20 20 7d   'Latham') }.  }
61b0: 0a 20 20 63 61 74 63 68 20 7b 20 74 65 73 74 66  .  catch { testf
61c0: 69 78 74 75 72 65 20 24 3a 3a 63 68 61 6e 20 73  ixture $::chan s
61d0: 71 6c 69 74 65 5f 61 62 6f 72 74 20 7d 0a 20 20  qlite_abort }.  
61e0: 63 61 74 63 68 20 7b 20 63 6c 6f 73 65 20 24 3a  catch { close $:
61f0: 3a 63 68 61 6e 20 7d 0a 7d 20 2d 62 6f 64 79 20  :chan }.} -body 
6200: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
6210: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
6220: 65 20 3d 20 64 65 6c 65 74 65 20 7d 0a 7d 20 2d  e = delete }.} -
6230: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
6240: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
6250: 20 64 65 6c 65 74 65 7d 0a 20 20 66 61 75 6c 74   delete}.  fault
6260: 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  sim_integrity_ch
6270: 65 63 6b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  eck.}..#--------
6280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62c0: 2d 0a 23 20 54 65 73 74 20 66 61 75 6c 74 2d 69  -.# Test fault-i
62d0: 6e 6a 65 63 74 69 6f 6e 20 77 68 65 6e 20 63 68  njection when ch
62e0: 61 6e 67 69 6e 67 20 66 72 6f 6d 20 6a 6f 75 72  anging from jour
62f0: 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74  nal_mode=persist
6300: 20 74 6f 20 0a 23 20 6a 6f 75 72 6e 61 6c 5f 6d   to .# journal_m
6310: 6f 64 65 3d 64 65 6c 65 74 65 20 28 74 68 69 73  ode=delete (this
6320: 20 69 6e 76 6f 6c 76 65 73 20 64 65 6c 65 74 69   involves deleti
6330: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
6340: 69 6c 65 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ile)..#.do_test 
6350: 70 61 67 65 72 66 61 75 6c 74 2d 31 38 2d 70 72  pagerfault-18-pr
6360: 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  e1 {.  faultsim_
6370: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
6380: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
6390: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 71    CREATE TABLE q
63a0: 71 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  q(x);.    INSERT
63b0: 20 49 4e 54 4f 20 71 71 20 56 41 4c 55 45 53 28   INTO qq VALUES(
63c0: 27 48 65 72 62 65 72 74 27 29 3b 0a 20 20 20 20  'Herbert');.    
63d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 71 20 56  INSERT INTO qq V
63e0: 41 4c 55 45 53 28 27 4d 61 63 61 6c 69 73 74 65  ALUES('Macaliste
63f0: 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  r');.    INSERT 
6400: 49 4e 54 4f 20 71 71 20 56 41 4c 55 45 53 28 27  INTO qq VALUES('
6410: 4d 61 63 6b 65 6e 7a 69 65 27 29 3b 0a 20 20 20  Mackenzie');.   
6420: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 71 20   INSERT INTO qq 
6430: 56 41 4c 55 45 53 28 27 4c 69 6c 6c 65 79 27 29  VALUES('Lilley')
6440: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6450: 4f 20 71 71 20 56 41 4c 55 45 53 28 27 50 61 6c  O qq VALUES('Pal
6460: 6d 65 72 27 29 3b 0a 20 20 7d 0a 20 20 66 61 75  mer');.  }.  fau
6470: 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63  ltsim_save_and_c
6480: 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75  lose.} {}.do_fau
6490: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
64a0: 66 61 75 6c 74 2d 31 38 20 2d 70 72 65 70 20 7b  fault-18 -prep {
64b0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
64c0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
64d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
64e0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
64f0: 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
6500: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 71    INSERT INTO qq
6510: 20 56 41 4c 55 45 53 28 27 42 65 61 74 74 79 27   VALUES('Beatty'
6520: 29 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b  );.  }.} -body {
6530: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
6540: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
6550: 20 3d 20 64 65 6c 65 74 65 20 7d 0a 7d 20 2d 74   = delete }.} -t
6560: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
6570: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
6580: 64 65 6c 65 74 65 7d 0a 20 20 66 61 75 6c 74 73  delete}.  faults
6590: 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65  im_integrity_che
65a0: 63 6b 0a 7d 0a 0a 64 6f 5f 66 61 75 6c 74 73 69  ck.}..do_faultsi
65b0: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
65c0: 74 2d 31 39 61 20 2d 70 72 65 70 20 7b 0a 20 20  t-19a -prep {.  
65d0: 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f  sqlite3 db :memo
65e0: 72 79 3a 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  ry:.  db func a_
65f0: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
6600: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6610: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
6620: 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 42  um = FULL;.    B
6630: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
6640: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
6650: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
6660: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
6670: 5f 73 74 72 69 6e 67 28 35 30 30 30 29 2c 20 61  _string(5000), a
6680: 5f 73 74 72 69 6e 67 28 36 30 30 30 29 29 3b 0a  _string(6000));.
6690: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
66a0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
66b0: 73 71 6c 20 7b 20 0a 20 20 20 20 43 52 45 41 54  sql { .    CREAT
66c0: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
66d0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
66e0: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O t2 SELECT * FR
66f0: 4f 4d 20 74 31 3b 20 0a 20 20 20 20 44 45 4c 45  OM t1; .    DELE
6700: 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  TE FROM t1;.  }.
6710: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c  } -test {.  faul
6720: 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74  tsim_test_result
6730: 20 7b 30 20 7b 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65   {0 {}}.}..do_te
6740: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 39  st pagerfault-19
6750: 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73  -pre1 {.  faults
6760: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
6770: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
6780: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
6790: 5f 76 61 63 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a  _vacuum = FULL;.
67a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
67b0: 20 74 31 28 78 29 3b 20 49 4e 53 45 52 54 20 49   t1(x); INSERT I
67c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 29  NTO t1 VALUES(1)
67d0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
67e0: 4c 45 20 74 32 28 78 29 3b 20 49 4e 53 45 52 54  LE t2(x); INSERT
67f0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
6800: 32 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  2);.    CREATE T
6810: 41 42 4c 45 20 74 33 28 78 29 3b 20 49 4e 53 45  ABLE t3(x); INSE
6820: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
6830: 53 28 33 29 3b 0a 20 20 20 20 43 52 45 41 54 45  S(3);.    CREATE
6840: 20 54 41 42 4c 45 20 74 34 28 78 29 3b 20 49 4e   TABLE t4(x); IN
6850: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
6860: 55 45 53 28 34 29 3b 0a 20 20 20 20 43 52 45 41  UES(4);.    CREA
6870: 54 45 20 54 41 42 4c 45 20 74 35 28 78 29 3b 20  TE TABLE t5(x); 
6880: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
6890: 41 4c 55 45 53 28 35 29 3b 0a 20 20 20 20 43 52  ALUES(5);.    CR
68a0: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 78 29  EATE TABLE t6(x)
68b0: 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36  ; INSERT INTO t6
68c0: 20 56 41 4c 55 45 53 28 36 29 3b 0a 20 20 7d 0a   VALUES(6);.  }.
68d0: 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f    faultsim_save_
68e0: 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64  and_close.} {}.d
68f0: 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20  o_faultsim_test 
6900: 70 61 67 65 72 66 61 75 6c 74 2d 31 39 62 20 2d  pagerfault-19b -
6910: 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69  prep {.  faultsi
6920: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6930: 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20  open.} -body {. 
6940: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
6950: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
6960: 41 54 45 20 74 34 20 53 45 54 20 78 20 3d 20 78  ATE t4 SET x = x
6970: 2b 31 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  +1;.      UPDATE
6980: 20 74 36 20 53 45 54 20 78 20 3d 20 78 2b 31 3b   t6 SET x = x+1;
6990: 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  .      SAVEPOINT
69a0: 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50   one;.        UP
69b0: 44 41 54 45 20 74 33 20 53 45 54 20 78 20 3d 20  DATE t3 SET x = 
69c0: 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 53 41 56  x+1;.        SAV
69d0: 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20 20 20  EPOINT two;.    
69e0: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
69f0: 20 74 32 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42   t2;.      ROLLB
6a00: 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20  ACK TO one;.    
6a10: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45  COMMIT;.    SELE
6a20: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20  CT * FROM t3;.  
6a30: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6a40: 74 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  t4;.    SELECT *
6a50: 20 46 52 4f 4d 20 74 36 3b 0a 20 20 7d 0a 7d 20   FROM t6;.  }.} 
6a60: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
6a70: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
6a80: 30 20 7b 33 20 35 20 37 7d 7d 0a 7d 0a 0a 23 2d  0 {3 5 7}}.}..#-
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20  --------.# This 
6ae0: 74 65 73 74 73 20 66 61 75 6c 74 2d 69 6e 6a 65  tests fault-inje
6af0: 63 74 69 6f 6e 20 69 6e 20 61 20 73 70 65 63 69  ction in a speci
6b00: 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 61  al case in the a
6b10: 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 2e  uto-vacuum code.
6b20: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
6b30: 66 61 75 6c 74 2d 32 30 2d 70 72 65 31 20 7b 0a  fault-20-pre1 {.
6b40: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
6b50: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
6b60: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
6b70: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
6b80: 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   10;.    PRAGMA 
6b90: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46 55  auto_vacuum = FU
6ba0: 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  LL;.    CREATE T
6bb0: 41 42 4c 45 20 74 30 28 61 2c 20 62 29 3b 0a 20  ABLE t0(a, b);. 
6bc0: 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61   }.  faultsim_sa
6bd0: 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b  ve_and_close.} {
6be0: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
6bf0: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 30  st pagerfault-20
6c00: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
6c10: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
6c20: 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b  reopen.} -body {
6c30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
6c40: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43    BEGIN;.      C
6c50: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
6c60: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , b);.      CREA
6c70: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
6c80: 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41  );.      DROP TA
6c90: 42 4c 45 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d  BLE t1;.    COMM
6ca0: 49 54 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20  IT;.  }.} -test 
6cb0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
6cc0: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a  t_result {0 {}}.
6cd0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
6ce0: 66 61 75 6c 74 2d 32 31 2d 70 72 65 31 20 7b 0a  fault-21-pre1 {.
6cf0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
6d00: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
6d10: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
6d20: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
6d30: 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20   10;.    CREATE 
6d40: 54 41 42 4c 45 20 74 30 28 61 20 50 52 49 4d 41  TABLE t0(a PRIMA
6d50: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
6d60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20 56  INSERT INTO t0 V
6d70: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d  ALUES(1, 2);.  }
6d80: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  .  faultsim_save
6d90: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a  _and_close.} {}.
6da0: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
6db0: 20 70 61 67 65 72 66 61 75 6c 74 2d 32 31 20 2d   pagerfault-21 -
6dc0: 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69  prep {.  faultsi
6dd0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6de0: 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20  open.} -body {. 
6df0: 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43   db eval { SELEC
6e00: 54 20 2a 20 46 52 4f 4d 20 74 30 20 4c 49 4d 49  T * FROM t0 LIMI
6e10: 54 20 31 20 7d 20 7b 0a 20 20 20 20 64 62 20 65  T 1 } {.    db e
6e20: 76 61 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  val { INSERT INT
6e30: 4f 20 74 30 20 53 45 4c 45 43 54 20 61 2b 31 2c  O t0 SELECT a+1,
6e40: 20 62 20 46 52 4f 4d 20 74 30 20 7d 0a 20 20 20   b FROM t0 }.   
6e50: 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45 52   db eval { INSER
6e60: 54 20 49 4e 54 4f 20 74 30 20 53 45 4c 45 43 54  T INTO t0 SELECT
6e70: 20 61 2b 32 2c 20 62 20 46 52 4f 4d 20 74 30 20   a+2, b FROM t0 
6e80: 7d 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  }.  }.} -test {.
6e90: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
6ea0: 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d 0a  result {0 {}}.}.
6eb0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
6f00: 65 73 74 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74  est fault-inject
6f10: 69 6f 6e 20 61 6e 64 20 72 6f 6c 6c 62 61 63 6b  ion and rollback
6f20: 20 77 68 65 6e 20 74 68 65 20 6e 52 65 73 65 72   when the nReser
6f30: 76 65 20 68 65 61 64 65 72 20 76 61 6c 75 65 20  ve header value 
6f40: 0a 23 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  .# is non-zero..
6f50: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66  #.do_test pagerf
6f60: 61 75 6c 74 2d 32 31 2d 70 72 65 31 20 7b 0a 20  ault-21-pre1 {. 
6f70: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
6f80: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
6f90: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
6fa0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
6fb0: 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  024;.    PRAGMA 
6fc0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
6fd0: 41 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  AL;.    PRAGMA j
6fe0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
6ff0: 4c 45 54 45 3b 0a 20 20 7d 0a 20 20 64 62 20 63  LETE;.  }.  db c
7000: 6c 6f 73 65 0a 20 20 68 65 78 69 6f 5f 77 72 69  lose.  hexio_wri
7010: 74 65 20 74 65 73 74 2e 64 62 20 32 30 20 20 20  te test.db 20   
7020: 20 31 30 0a 20 20 68 65 78 69 6f 5f 77 72 69 74   10.  hexio_writ
7030: 65 20 74 65 73 74 2e 64 62 20 31 30 35 20 30 33  e test.db 105 03
7040: 46 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  F0.  sqlite3 db 
7050: 74 65 73 74 2e 64 62 0a 20 20 64 62 20 66 75 6e  test.db.  db fun
7060: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
7070: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
7080: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7090: 20 74 30 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t0(a PRIMARY KE
70a0: 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20  Y, b UNIQUE);.  
70b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30    INSERT INTO t0
70c0: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
70d0: 28 32 32 32 29 2c 20 61 5f 73 74 72 69 6e 67 28  (222), a_string(
70e0: 33 33 33 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  333));.    INSER
70f0: 54 20 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53  T INTO t0 VALUES
7100: 28 61 5f 73 74 72 69 6e 67 28 32 32 33 29 2c 20  (a_string(223), 
7110: 61 5f 73 74 72 69 6e 67 28 33 33 34 29 29 3b 0a  a_string(334));.
7120: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7130: 74 30 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t0 VALUES(a_stri
7140: 6e 67 28 32 32 34 29 2c 20 61 5f 73 74 72 69 6e  ng(224), a_strin
7150: 67 28 33 33 35 29 29 3b 0a 20 20 20 20 49 4e 53  g(335));.    INS
7160: 45 52 54 20 49 4e 54 4f 20 74 30 20 56 41 4c 55  ERT INTO t0 VALU
7170: 45 53 28 61 5f 73 74 72 69 6e 67 28 32 32 35 29  ES(a_string(225)
7180: 2c 20 61 5f 73 74 72 69 6e 67 28 33 33 36 29 29  , a_string(336))
7190: 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  ;.  }.  faultsim
71a0: 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a  _save_and_close.
71b0: 7d 20 7b 7d 0a 0a 64 6f 5f 66 61 75 6c 74 73 69  } {}..do_faultsi
71c0: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
71d0: 74 2d 32 31 20 2d 70 72 65 70 20 7b 0a 20 20 66  t-21 -prep {.  f
71e0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
71f0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f  and_reopen.} -bo
7200: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
7210: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20   INSERT INTO t0 
7220: 53 45 4c 45 43 54 20 61 7c 7c 27 78 27 2c 20 62  SELECT a||'x', b
7230: 7c 7c 27 78 27 20 46 52 4f 4d 20 74 30 20 7d 0a  ||'x' FROM t0 }.
7240: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c  } -test {.  faul
7250: 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74  tsim_test_result
7260: 20 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73   {0 {}}.  faults
7270: 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65  im_integrity_che
7280: 63 6b 0a 7d 0a 69 66 63 61 70 61 62 6c 65 20 63  ck.}.ifcapable c
7290: 72 61 73 68 74 65 73 74 20 7b 0a 20 20 66 61 75  rashtest {.  fau
72a0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
72b0: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
72c0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
72d0: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
72e0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
72f0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
7300: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7310: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
7320: 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
7330: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
7340: 65 73 74 2e 64 62 20 32 30 20 20 20 20 31 30 0a  est.db 20    10.
7350: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
7360: 73 74 2e 64 62 20 31 30 35 20 30 33 46 30 0a 0a  st.db 105 03F0..
7370: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
7380: 74 2e 64 62 0a 20 20 64 62 20 66 75 6e 63 20 61  t.db.  db func a
7390: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
73a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
73b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 30   CREATE TABLE t0
73c0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
73d0: 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 49  b UNIQUE);.    I
73e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20 56 41  NSERT INTO t0 VA
73f0: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 32  LUES(a_string(22
7400: 32 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 33 33  2), a_string(333
7410: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
7420: 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28 61 5f  NTO t0 VALUES(a_
7430: 73 74 72 69 6e 67 28 32 32 33 29 2c 20 61 5f 73  string(223), a_s
7440: 74 72 69 6e 67 28 33 33 34 29 29 3b 0a 20 20 7d  tring(334));.  }
7450: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  .  faultsim_save
7460: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 0a 20 20 66 6f  _and_close..  fo
7470: 72 20 7b 73 65 74 20 69 54 65 73 74 20 31 7d 20  r {set iTest 1} 
7480: 7b 24 69 54 65 73 74 3c 35 30 7d 20 7b 69 6e 63  {$iTest<50} {inc
7490: 72 20 69 54 65 73 74 7d 20 7b 0a 20 20 20 20 64  r iTest} {.    d
74a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
74b0: 74 2d 32 31 2e 63 72 61 73 68 2e 24 69 54 65 73  t-21.crash.$iTes
74c0: 74 2e 31 20 7b 0a 20 20 20 20 20 20 63 72 61 73  t.1 {.      cras
74d0: 68 73 71 6c 20 2d 64 65 6c 61 79 20 31 20 2d 66  hsql -delay 1 -f
74e0: 69 6c 65 20 74 65 73 74 2e 64 62 20 2d 73 65 65  ile test.db -see
74f0: 64 20 24 69 54 65 73 74 20 7b 0a 20 20 20 20 20  d $iTest {.     
7500: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
7510: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7520: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
7530: 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20  Y, b UNIQUE);.  
7540: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
7550: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2c  NTO t1 SELECT a,
7560: 20 62 20 46 52 4f 4d 20 74 30 3b 0a 20 20 20 20   b FROM t0;.    
7570: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
7580: 20 20 7d 0a 20 20 20 20 7d 20 7b 31 20 7b 63 68    }.    } {1 {ch
7590: 69 6c 64 20 70 72 6f 63 65 73 73 20 65 78 69 74  ild process exit
75a0: 65 64 20 61 62 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a  ed abnormally}}.
75b0: 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
75c0: 72 66 61 75 6c 74 2d 32 32 2e 24 69 54 65 73 74  rfault-22.$iTest
75d0: 2e 32 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  .2 {.      sqlit
75e0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
75f0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52      execsql { PR
7600: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
7610: 68 65 63 6b 20 7d 0a 20 20 20 20 7d 20 7b 6f 6b  heck }.    } {ok
7620: 7d 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20  }.    db close. 
7630: 20 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   }.}...#--------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7680: 2d 0a 23 20 57 68 65 6e 20 61 20 33 2e 37 2e 30  -.# When a 3.7.0
7690: 20 63 6c 69 65 6e 74 20 6f 70 65 6e 73 20 61 20   client opens a 
76a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
76b0: 6e 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  n on a database 
76c0: 66 69 6c 65 20 74 68 61 74 0a 23 20 68 61 73 20  file that.# has 
76d0: 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f  been appended to
76e0: 20 6f 72 20 74 72 75 6e 63 61 74 65 64 20 62 79   or truncated by
76f0: 20 61 20 70 72 65 2d 33 37 30 20 63 6c 69 65 6e   a pre-370 clien
7700: 74 2c 20 69 74 20 75 70 64 61 74 65 73 0a 23 20  t, it updates.# 
7710: 74 68 65 20 64 62 2d 73 69 7a 65 20 69 6e 20 74  the db-size in t
7720: 68 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 69  he file header i
7730: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 54 68 69 73  mmediately. This
7740: 20 74 65 73 74 20 63 61 73 65 20 70 72 6f 76 6f   test case provo
7750: 6b 65 73 0a 23 20 65 72 72 6f 72 73 20 64 75 72  kes.# errors dur
7760: 69 6e 67 20 74 68 61 74 20 6f 70 65 72 61 74 69  ing that operati
7770: 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  on..#.do_test pa
7780: 67 65 72 66 61 75 6c 74 2d 32 32 2d 70 72 65 31  gerfault-22-pre1
7790: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
77a0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
77b0: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
77c0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
77d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
77e0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
77f0: 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  024;.    PRAGMA 
7800: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b  auto_vacuum = 0;
7810: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7820: 45 20 74 31 28 61 29 3b 0a 20 20 20 20 43 52 45  E t1(a);.    CRE
7830: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
7840: 74 31 28 61 29 3b 0a 20 20 20 20 49 4e 53 45 52  t1(a);.    INSER
7850: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
7860: 28 61 5f 73 74 72 69 6e 67 28 33 30 30 30 29 29  (a_string(3000))
7870: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7880: 4c 45 20 74 32 28 61 29 3b 0a 20 20 20 20 49 4e  LE t2(a);.    IN
7890: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
78a0: 55 45 53 28 31 29 3b 0a 20 20 7d 0a 20 20 64 62  UES(1);.  }.  db
78b0: 20 63 6c 6f 73 65 0a 20 20 73 71 6c 33 36 32 33   close.  sql3623
78c0: 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  1 { INSERT INTO 
78d0: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
78e0: 6e 67 28 33 30 30 30 29 29 20 7d 0a 20 20 66 61  ng(3000)) }.  fa
78f0: 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f  ultsim_save_and_
7900: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61  close.} {}.do_fa
7910: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
7920: 72 66 61 75 6c 74 2d 32 32 20 2d 70 72 65 70 20  rfault-22 -prep 
7930: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
7940: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
7950: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
7960: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
7970: 4f 20 74 32 20 56 41 4c 55 45 53 28 32 29 20 7d  O t2 VALUES(2) }
7980: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
7990: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a  ECT * FROM t2 }.
79a0: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c  } -test {.  faul
79b0: 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74  tsim_test_result
79c0: 20 7b 30 20 7b 31 20 32 7d 7d 0a 20 20 66 61 75   {0 {1 2}}.  fau
79d0: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
79e0: 63 68 65 63 6b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  check.}..#------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a30: 2d 2d 2d 0a 23 20 50 72 6f 76 6f 6b 65 20 61 6e  ---.# Provoke an
7a40: 20 4f 4f 4d 20 65 72 72 6f 72 20 64 75 72 69 6e   OOM error durin
7a50: 67 20 61 20 63 6f 6d 6d 69 74 20 6f 66 20 6d 75  g a commit of mu
7a60: 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
7a70: 74 69 6f 6e 2e 20 4f 6e 65 20 6f 66 0a 23 20 74  tion. One of.# t
7a80: 68 65 20 64 61 74 61 62 61 73 65 73 20 77 72 69  he databases wri
7a90: 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tten during the 
7aa0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
7ab0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
7ac0: 62 61 73 65 2e 0a 23 20 54 68 69 73 20 74 65 73  base..# This tes
7ad0: 74 20 63 61 75 73 65 73 20 72 6f 6c 6c 62 61 63  t causes rollbac
7ae0: 6b 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  k of the in-memo
7af0: 72 79 20 64 61 74 61 62 61 73 65 20 61 66 74 65  ry database afte
7b00: 72 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  r CommitPhaseOne
7b10: 28 29 0a 23 20 68 61 73 20 73 75 63 63 65 73 73  ().# has success
7b20: 66 75 6c 6c 79 20 72 65 74 75 72 6e 65 64 2e 20  fully returned. 
7b30: 69 2e 65 2e 20 74 68 65 20 73 65 72 69 65 73 20  i.e. the series 
7b40: 6f 66 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  of calls for the
7b50: 20 61 62 6f 72 74 65 64 20 63 6f 6d 6d 69 74 20   aborted commit 
7b60: 0a 23 20 69 73 3a 0a 23 0a 23 20 20 20 50 61 67  .# is:.#.#   Pag
7b70: 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
7b80: 28 3c 69 6e 2d 6d 65 6d 6f 72 79 2d 64 62 3e 29  (<in-memory-db>)
7b90: 20 20 20 2d 3e 20 20 20 53 51 4c 49 54 45 5f 4f     ->   SQLITE_O
7ba0: 4b 0a 23 20 20 20 50 61 67 65 72 43 6f 6d 6d 69  K.#   PagerCommi
7bb0: 74 50 68 61 73 65 4f 6e 65 28 3c 66 69 6c 65 2d  tPhaseOne(<file-
7bc0: 64 62 3e 29 20 20 20 20 20 20 20 20 2d 3e 20 20  db>)        ->  
7bd0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 23 20   SQLITE_IOERR.# 
7be0: 20 20 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28    PagerRollback(
7bf0: 3c 69 6e 2d 6d 65 6d 6f 72 79 2d 64 62 3e 29 0a  <in-memory-db>).
7c00: 23 20 20 20 50 61 67 65 72 52 6f 6c 6c 62 61 63  #   PagerRollbac
7c10: 6b 28 3c 66 69 6c 65 2d 64 62 3e 29 0a 23 0a 64  k(<file-db>).#.d
7c20: 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20  o_faultsim_test 
7c30: 70 61 67 65 72 66 61 75 6c 74 2d 32 33 20 2d 70  pagerfault-23 -p
7c40: 72 65 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  rep {.  sqlite3 
7c50: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 66 6f  db :memory:.  fo
7c60: 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 2d 6e  reach f [glob -n
7c70: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 2e 64  ocomplain test.d
7c80: 62 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74  b*] { forcedelet
7c90: 65 20 24 66 20 7d 0a 20 20 64 62 20 65 76 61 6c  e $f }.  db eval
7ca0: 20 7b 20 0a 20 20 20 20 41 54 54 41 43 48 20 27   { .    ATTACH '
7cb0: 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78  test.db2' AS aux
7cc0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7cd0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
7ce0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
7cf0: 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 0a  x.t2(a, b);.  }.
7d00: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
7d10: 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e  sql { .    BEGIN
7d20: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
7d30: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
7d40: 32 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  2);.      INSERT
7d50: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
7d60: 33 2c 34 29 3b 20 0a 20 20 20 20 43 4f 4d 4d 49  3,4); .    COMMI
7d70: 54 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  T;.  }.} -test {
7d80: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
7d90: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20  _result {0 {}}. 
7da0: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
7db0: 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 64 6f 5f  ity_check.}..do_
7dc0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
7dd0: 67 65 72 66 61 75 6c 74 2d 32 34 20 2d 70 72 65  gerfault-24 -pre
7de0: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  p {.  faultsim_d
7df0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
7e00: 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41  .  db eval { PRA
7e10: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d  GMA temp_store =
7e20: 20 66 69 6c 65 20 7d 0a 20 20 65 78 65 63 73 71   file }.  execsq
7e30: 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  l { CREATE TABLE
7e40: 20 78 28 61 2c 20 62 29 20 7d 0a 7d 20 2d 62 6f   x(a, b) }.} -bo
7e50: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
7e60: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42   CREATE TEMP TAB
7e70: 4c 45 20 74 31 28 61 2c 20 62 29 20 7d 0a 7d 20  LE t1(a, b) }.} 
7e80: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
7e90: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
7ea0: 30 20 7b 7d 7d 20 5c 0a 20 20 20 20 7b 31 20 7b  0 {}} \.    {1 {
7eb0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
7ec0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
7ed0: 61 73 65 20 66 69 6c 65 20 66 6f 72 20 73 74 6f  ase file for sto
7ee0: 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
7ef0: 61 62 6c 65 73 7d 7d 0a 20 20 73 65 74 20 69 63  ables}}.  set ic
7f00: 20 5b 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47   [db eval { PRAG
7f10: 4d 41 20 74 65 6d 70 2e 69 6e 74 65 67 72 69 74  MA temp.integrit
7f20: 79 5f 63 68 65 63 6b 20 7d 5d 0a 20 20 69 66 20  y_check }].  if 
7f30: 7b 24 69 63 20 21 3d 20 22 6f 6b 22 7d 20 7b 20  {$ic != "ok"} { 
7f40: 65 72 72 6f 72 20 22 49 6e 74 65 67 72 69 74 79  error "Integrity
7f50: 20 63 68 65 63 6b 3a 20 24 69 63 22 20 7d 0a 7d   check: $ic" }.}
7f60: 0a 0a 70 72 6f 63 20 6c 6f 63 6b 72 6f 77 73 20  ..proc lockrows 
7f70: 7b 6e 7d 20 7b 0a 20 20 69 66 20 7b 24 6e 3d 3d  {n} {.  if {$n==
7f80: 30 7d 20 7b 20 72 65 74 75 72 6e 20 22 22 20 7d  0} { return "" }
7f90: 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c  .  db eval { SEL
7fa0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
7fb0: 45 52 45 20 6f 69 64 20 3d 20 24 6e 20 7d 20 7b  ERE oid = $n } {
7fc0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 6f   .    return [lo
7fd0: 63 6b 72 6f 77 73 20 5b 65 78 70 72 20 7b 24 6e  ckrows [expr {$n
7fe0: 2d 31 7d 5d 5d 0a 20 20 7d 0a 7d 0a 0a 0a 64 6f  -1}]].  }.}...do
7ff0: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
8000: 2d 32 35 2d 70 72 65 31 20 7b 0a 20 20 66 61 75  -25-pre1 {.  fau
8010: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
8020: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
8030: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
8040: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
8050: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
8060: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
8070: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
8080: 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 43 52 45  uum = 0;.    CRE
8090: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b  ATE TABLE t1(a);
80a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
80b0: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
80c0: 69 6e 67 28 35 30 30 29 29 3b 0a 20 20 20 20 49  ing(500));.    I
80d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
80e0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
80f0: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
8100: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
8110: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35  ELECT a_string(5
8120: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
8130: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8140: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
8150: 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
8160: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
8170: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
8180: 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (500) FROM t1;. 
8190: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
81a0: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
81b0: 67 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(500) FROM t1;.
81c0: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73    }.  faultsim_s
81d0: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20  ave_and_close.} 
81e0: 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74  {}.do_faultsim_t
81f0: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32  est pagerfault-2
8200: 35 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  5 -prep {.  faul
8210: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
8220: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
8230: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
8240: 69 6e 67 0a 20 20 73 65 74 20 3a 3a 63 68 61 6e  ing.  set ::chan
8250: 6e 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62  nel [db incrblob
8260: 20 2d 72 65 61 64 6f 6e 6c 79 20 74 31 20 61 20   -readonly t1 a 
8270: 31 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  1].  execsql { .
8280: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
8290: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
82a0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
82b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
82c0: 45 53 28 61 5f 73 74 72 69 6e 67 28 33 30 30 30  ES(a_string(3000
82d0: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
82e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
82f0: 61 5f 73 74 72 69 6e 67 28 33 30 30 30 29 29 3b  a_string(3000));
8300: 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20  .  }.} -body {. 
8310: 20 6c 6f 63 6b 72 6f 77 73 20 33 30 0a 7d 20 2d   lockrows 30.} -
8320: 74 65 73 74 20 7b 0a 20 20 63 61 74 63 68 20 7b  test {.  catch {
8330: 20 6c 6f 63 6b 72 6f 77 73 20 33 30 20 7d 0a 20   lockrows 30 }. 
8340: 20 63 61 74 63 68 20 7b 20 64 62 20 65 76 61 6c   catch { db eval
8350: 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 63 6c 6f 73   COMMIT }.  clos
8360: 65 20 24 3a 3a 63 68 61 6e 6e 65 6c 0a 20 20 66  e $::channel.  f
8370: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
8380: 75 6c 74 20 7b 30 20 7b 7d 7d 20 0a 7d 0a 0a 64  ult {0 {}} .}..d
8390: 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20  o_faultsim_test 
83a0: 70 61 67 65 72 66 61 75 6c 74 2d 32 36 20 2d 70  pagerfault-26 -p
83b0: 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  rep {.  faultsim
83c0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
83d0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
83e0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
83f0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
8400: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
8410: 6f 64 65 20 3d 20 74 72 75 6e 63 61 74 65 3b 0a  ode = truncate;.
8420: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
8430: 76 61 63 75 75 6d 20 3d 20 66 75 6c 6c 3b 0a 20  vacuum = full;. 
8440: 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e     PRAGMA lockin
8450: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
8460: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8470: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
8480: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8490: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
84a0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
84b0: 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 7d 0a 7d  ze = 4096;.  }.}
84c0: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
84d0: 71 6c 20 7b 0a 20 20 20 20 56 41 43 55 55 4d 3b  ql {.    VACUUM;
84e0: 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  .  }.} -test {. 
84f0: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
8500: 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 0a 20 20  esult {0 {}}..  
8510: 73 65 74 20 63 6f 6e 74 65 6e 74 73 20 5b 64 62  set contents [db
8520: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20   eval {SELECT * 
8530: 46 52 4f 4d 20 74 31 7d 5d 0a 20 20 69 66 20 7b  FROM t1}].  if {
8540: 24 63 6f 6e 74 65 6e 74 73 20 21 3d 20 22 31 20  $contents != "1 
8550: 32 22 7d 20 7b 20 65 72 72 6f 72 20 22 42 61 64  2"} { error "Bad
8560: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
8570: 74 73 20 28 24 63 6f 6e 74 65 6e 74 73 29 22 20  ts ($contents)" 
8580: 7d 0a 0a 20 20 73 65 74 20 6e 50 67 20 5b 66 69  }..  set nPg [fi
8590: 6c 65 5f 70 61 67 65 5f 63 6f 75 6e 74 20 74 65  le_page_count te
85a0: 73 74 2e 64 62 5d 0a 20 20 73 65 74 20 70 67 73  st.db].  set pgs
85b0: 7a 20 5b 66 69 6c 65 5f 70 61 67 65 5f 73 69 7a  z [file_page_siz
85c0: 65 20 74 65 73 74 2e 64 62 5d 0a 20 20 69 66 20  e test.db].  if 
85d0: 7b 24 74 65 73 74 72 63 21 3d 30 20 26 26 20 28  {$testrc!=0 && (
85e0: 24 6e 50 67 21 3d 33 20 7c 7c 20 28 24 70 67 73  $nPg!=3 || ($pgs
85f0: 7a 21 3d 31 30 32 34 20 26 26 20 24 70 67 73 7a  z!=1024 && $pgsz
8600: 21 3d 34 30 39 36 29 29 7d 20 7b 0a 20 20 20 20  !=4096))} {.    
8610: 65 72 72 6f 72 20 22 46 69 6c 65 20 73 68 6f 75  error "File shou
8620: 6c 64 20 62 65 20 33 20 70 61 67 65 73 2e 20 50  ld be 3 pages. P
8630: 61 67 65 20 73 69 7a 65 20 31 30 32 34 20 6f 72  age size 1024 or
8640: 20 34 30 39 36 20 62 79 74 65 73 2e 20 49 73 20   4096 bytes. Is 
8650: 24 6e 50 67 2f 24 70 67 73 7a 2e 22 0a 20 20 7d  $nPg/$pgsz.".  }
8660: 0a 20 20 69 66 20 7b 24 74 65 73 74 72 63 3d 3d  .  if {$testrc==
8670: 30 20 26 26 20 28 24 6e 50 67 21 3d 33 20 7c 7c  0 && ($nPg!=3 ||
8680: 20 24 70 67 73 7a 21 3d 34 30 39 36 29 7d 20 7b   $pgsz!=4096)} {
8690: 0a 20 20 20 20 65 72 72 6f 72 20 22 46 69 6c 65  .    error "File
86a0: 20 73 68 6f 75 6c 64 20 62 65 20 33 20 70 61 67   should be 3 pag
86b0: 65 73 2e 20 50 61 67 65 20 73 69 7a 65 20 34 30  es. Page size 40
86c0: 39 36 20 62 79 74 65 73 2e 20 49 73 20 24 6e 50  96 bytes. Is $nP
86d0: 67 2f 24 70 67 73 7a 2e 22 0a 20 20 7d 0a 7d 20  g/$pgsz.".  }.} 
86e0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66  ..do_test pagerf
86f0: 61 75 6c 74 2d 32 37 2d 70 72 65 20 7b 0a 20 20  ault-27-pre {.  
8700: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
8710: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
8720: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
8730: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
8740: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
8750: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
8760: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8770: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t1(a, b);.    C
8780: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
8790: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
87a0: 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  E);.    INSERT I
87b0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 20 61  NTO t2 VALUES( a
87c0: 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f  _string(800), a_
87d0: 73 74 72 69 6e 67 28 38 30 30 29 20 29 3b 0a 20  string(800) );. 
87e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
87f0: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
8800: 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(800), a_string
8810: 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b 0a 20  (800) FROM t2;. 
8820: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8830: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
8840: 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(800), a_string
8850: 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b 0a 20  (800) FROM t2;. 
8860: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8870: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
8880: 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(800), a_string
8890: 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b 0a 20  (800) FROM t2;. 
88a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
88b0: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
88c0: 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(800), a_string
88d0: 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b 0a 20  (800) FROM t2;. 
88e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
88f0: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
8900: 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(800), a_string
8910: 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b 0a 20  (800) FROM t2;. 
8920: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8930: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
8940: 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(800), a_string
8950: 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b 0a 20  (800) FROM t2;. 
8960: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8970: 31 20 56 41 4c 55 45 53 20 28 61 5f 73 74 72 69  1 VALUES (a_stri
8980: 6e 67 28 32 30 30 30 30 29 2c 20 61 5f 73 74 72  ng(20000), a_str
8990: 69 6e 67 28 32 30 30 30 30 29 29 3b 0a 20 20 7d  ing(20000));.  }
89a0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  .  faultsim_save
89b0: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a  _and_close.} {}.
89c0: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
89d0: 20 70 61 67 65 72 66 61 75 6c 74 2d 32 37 20 2d   pagerfault-27 -
89e0: 66 61 75 6c 74 73 20 69 6f 65 72 72 2d 70 65 72  faults ioerr-per
89f0: 73 69 73 74 65 6e 74 20 2d 70 72 65 70 20 7b 0a  sistent -prep {.
8a00: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
8a10: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
8a20: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
8a30: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
8a40: 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d  sql { .    PRAGM
8a50: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
8a60: 30 3b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43  0;.    BEGIN EXC
8a70: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 73 65  LUSIVE;.  }.  se
8a80: 74 20 3a 3a 63 68 61 6e 6e 65 6c 20 5b 64 62 20  t ::channel [db 
8a90: 69 6e 63 72 62 6c 6f 62 20 74 31 20 61 20 31 5d  incrblob t1 a 1]
8aa0: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 70 75 74  .} -body {.  put
8ab0: 73 20 24 3a 3a 63 68 61 6e 6e 65 6c 20 5b 73 74  s $::channel [st
8ac0: 72 69 6e 67 20 72 65 70 65 61 74 20 61 62 63 20  ring repeat abc 
8ad0: 36 30 30 30 5d 0a 20 20 66 6c 75 73 68 20 24 3a  6000].  flush $:
8ae0: 3a 63 68 61 6e 6e 65 6c 0a 7d 20 2d 74 65 73 74  :channel.} -test
8af0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
8b00: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 61 20  UPDATE t2 SET a 
8b10: 3d 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c  = a_string(800),
8b20: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 38 30   b = a_string(80
8b30: 30 29 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63  0) }.  catch { c
8b40: 6c 6f 73 65 20 24 3a 3a 63 68 61 6e 6e 65 6c 20  lose $::channel 
8b50: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 52  }.  catchsql { R
8b60: 4f 4c 4c 42 41 43 4b 20 7d 0a 20 20 66 61 75 6c  OLLBACK }.  faul
8b70: 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63  tsim_integrity_c
8b80: 68 65 63 6b 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74  heck.}..finish_t
8b90: 65 73 74 0a 0a                                   est..