/ Hex Artifact Content
Login

Artifact 6b3f03fca89aacb4d1ca2c0216af114acaec0c66:


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 23   backup API..#.#
50a0: 20 55 70 64 61 74 65 3a 20 49 74 20 69 73 20 6e   Update: It is n
50b0: 6f 20 6c 6f 6e 67 65 72 20 70 6f 73 73 69 62 6c  o longer possibl
50c0: 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  e to change the 
50d0: 70 61 67 65 20 73 69 7a 65 20 6f 66 20 61 6e 79  page size of any
50e0: 20 74 65 6d 70 0a 23 20 64 61 74 61 62 61 73 65   temp.# database
50f0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65   after it has be
5100: 65 6e 20 63 72 65 61 74 65 64 2e 0a 23 0a 64 6f  en created..#.do
5110: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70  _faultsim_test p
5120: 61 67 65 72 66 61 75 6c 74 2d 31 34 62 20 2d 70  agerfault-14b -p
5130: 72 65 70 20 7b 0a 20 20 63 61 74 63 68 20 7b 20  rep {.  catch { 
5140: 64 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20 66 61  db2 close }.  fa
5150: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5160: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 73 71  nd_reopen.    sq
5170: 6c 69 74 65 33 20 64 62 32 20 22 22 0a 20 20 20  lite3 db2 "".   
5180: 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41 47   db2 eval { PRAG
5190: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34  MA page_size = 4
51a0: 30 39 36 3b 20 43 52 45 41 54 45 20 54 41 42 4c  096; CREATE TABL
51b0: 45 20 78 78 28 61 29 20 7d 0a 7d 20 2d 62 6f 64  E xx(a) }.} -bod
51c0: 79 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  y {.  sqlite3_ba
51d0: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
51e0: 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70  db main.  B step
51f0: 20 32 30 30 0a 20 20 73 65 74 20 72 63 20 5b 42   200.  set rc [B
5200: 20 66 69 6e 69 73 68 5d 0a 20 20 69 66 20 7b 5b   finish].  if {[
5210: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 53 51 4c  string match SQL
5220: 49 54 45 5f 49 4f 45 52 52 5f 2a 20 24 72 63 5d  ITE_IOERR_* $rc]
5230: 7d 20 7b 73 65 74 20 72 63 20 53 51 4c 49 54 45  } {set rc SQLITE
5240: 5f 49 4f 45 52 52 7d 0a 20 20 69 66 20 7b 24 72  _IOERR}.  if {$r
5250: 63 20 21 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22  c != "SQLITE_OK"
5260: 7d 20 7b 20 65 72 72 6f 72 20 5b 73 71 6c 69 74  } { error [sqlit
5270: 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20 24  e3_test_errstr $
5280: 72 63 5d 20 7d 0a 20 20 73 65 74 20 7b 7d 20 7b  rc] }.  set {} {
5290: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  }.} -test {.  fa
52a0: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
52b0: 6c 74 20 7b 31 20 7b 61 74 74 65 6d 70 74 20 74  lt {1 {attempt t
52c0: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
52d0: 6c 79 20 64 61 74 61 62 61 73 65 7d 7d 20 5c 0a  ly database}} \.
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 20 20 20 20 20 20 7b 31 20 7b 73 71 6c 69 74         {1 {sqlit
5300: 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 29  e3_backup_init()
5310: 20 66 61 69 6c 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f   failed}}.}..do_
5320: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
5330: 67 65 72 66 61 75 6c 74 2d 31 34 63 20 2d 70 72  gerfault-14c -pr
5340: 65 70 20 7b 0a 20 20 63 61 74 63 68 20 7b 20 64  ep {.  catch { d
5350: 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20 66 61 75  b2 close }.  fau
5360: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
5370: 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74  d_reopen.  sqlit
5380: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
5390: 20 20 64 62 32 20 65 76 61 6c 20 7b 20 0a 20 20    db2 eval { .  
53a0: 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
53b0: 6e 6f 75 73 20 3d 20 6f 66 66 3b 20 0a 20 20 20  nous = off; .   
53c0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
53d0: 65 20 3d 20 34 30 39 36 3b 20 0a 20 20 20 20 43  e = 4096; .    C
53e0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 28 61  REATE TABLE xx(a
53f0: 29 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b  );.  }.} -body {
5400: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
5410: 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20  p B db2 main db 
5420: 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 32 30  main.  B step 20
5430: 30 0a 20 20 73 65 74 20 72 63 20 5b 42 20 66 69  0.  set rc [B fi
5440: 6e 69 73 68 5d 0a 20 20 69 66 20 7b 5b 73 74 72  nish].  if {[str
5450: 69 6e 67 20 6d 61 74 63 68 20 53 51 4c 49 54 45  ing match SQLITE
5460: 5f 49 4f 45 52 52 5f 2a 20 24 72 63 5d 7d 20 7b  _IOERR_* $rc]} {
5470: 73 65 74 20 72 63 20 53 51 4c 49 54 45 5f 49 4f  set rc SQLITE_IO
5480: 45 52 52 7d 0a 20 20 69 66 20 7b 24 72 63 20 21  ERR}.  if {$rc !
5490: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b  = "SQLITE_OK"} {
54a0: 20 65 72 72 6f 72 20 5b 73 71 6c 69 74 65 33 5f   error [sqlite3_
54b0: 74 65 73 74 5f 65 72 72 73 74 72 20 24 72 63 5d  test_errstr $rc]
54c0: 20 7d 0a 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 7d   }.  set {} {}.}
54d0: 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74   -test {.  fault
54e0: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
54f0: 7b 30 20 7b 7d 7d 20 7b 31 20 7b 73 71 6c 69 74  {0 {}} {1 {sqlit
5500: 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 29  e3_backup_init()
5510: 20 66 61 69 6c 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f   failed}}.}..do_
5520: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
5530: 31 35 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c  15-pre1 {.  faul
5540: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
5550: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
5560: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
5570: 6e 67 3b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ng;.  execsql {.
5580: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
5590: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
55a0: 28 78 2c 20 79 20 55 4e 49 51 55 45 29 3b 0a 20  (x, y UNIQUE);. 
55b0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
55c0: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
55d0: 69 6e 67 28 31 31 29 2c 20 61 5f 73 74 72 69 6e  ing(11), a_strin
55e0: 67 28 32 32 29 29 3b 0a 20 20 20 20 20 20 49 4e  g(22));.      IN
55f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5600: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 31 31 29  UES(a_string(11)
5610: 2c 20 61 5f 73 74 72 69 6e 67 28 32 32 29 29 3b  , a_string(22));
5620: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
5630: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  .  faultsim_save
5640: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a  _and_close.} {}.
5650: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
5660: 20 70 61 67 65 72 66 61 75 6c 74 2d 31 35 20 2d   pagerfault-15 -
5670: 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69  prep {.  faultsi
5680: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
5690: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
56a0: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
56b0: 3b 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 64 62  ;.} -body {.  db
56c0: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a   eval { SELECT *
56d0: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31   FROM t1 LIMIT 1
56e0: 20 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c   } {.    execsql
56f0: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 20   {.      BEGIN; 
5700: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5710: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 33  ALUES(a_string(3
5720: 33 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 35  33), a_string(55
5730: 35 29 29 3b 20 43 4f 4d 4d 49 54 3b 0a 20 20 20  5)); COMMIT;.   
5740: 20 20 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54     BEGIN; INSERT
5750: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
5760: 61 5f 73 74 72 69 6e 67 28 33 33 33 29 2c 20 61  a_string(333), a
5770: 5f 73 74 72 69 6e 67 28 35 35 35 29 29 3b 20 43  _string(555)); C
5780: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  OMMIT;.    }.  }
5790: 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75  .} -test {.  fau
57a0: 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c  ltsim_test_resul
57b0: 74 20 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74  t {0 {}}.  fault
57c0: 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  sim_integrity_ch
57d0: 65 63 6b 0a 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20  eck.}...do_test 
57e0: 70 61 67 65 72 66 61 75 6c 74 2d 31 36 2d 70 72  pagerfault-16-pr
57f0: 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  e1 {.  faultsim_
5800: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
5810: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52  n.  execsql { CR
5820: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c  EATE TABLE t1(x,
5830: 20 79 20 55 4e 49 51 55 45 29 20 7d 0a 20 20 66   y UNIQUE) }.  f
5840: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
5850: 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66  _close.} {}.do_f
5860: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
5870: 65 72 66 61 75 6c 74 2d 31 36 20 2d 70 72 65 70  erfault-16 -prep
5880: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
5890: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
58a0: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65  .} -body {.  exe
58b0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
58c0: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
58d0: 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20   exclusive;.    
58e0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
58f0: 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 49  ode = wal;.    I
5900: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
5910: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
5920: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5930: 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20  ALUES(3, 4);.   
5940: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
5950: 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20  mode = delete;. 
5960: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5970: 31 20 56 41 4c 55 45 53 28 34 2c 20 35 29 3b 0a  1 VALUES(4, 5);.
5980: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
5990: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20  al_mode = wal;. 
59a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
59b0: 31 20 56 41 4c 55 45 53 28 36 2c 20 37 29 3b 0a  1 VALUES(6, 7);.
59c0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
59d0: 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73  al_mode = persis
59e0: 74 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  t;.    INSERT IN
59f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38 2c 20  TO t1 VALUES(8, 
5a00: 39 29 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20  9);.  }.} -test 
5a10: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
5a20: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 65 78 63  t_result {0 {exc
5a30: 6c 75 73 69 76 65 20 77 61 6c 20 64 65 6c 65 74  lusive wal delet
5a40: 65 20 77 61 6c 20 70 65 72 73 69 73 74 7d 7d 0a  e wal persist}}.
5a50: 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67    faultsim_integ
5a60: 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 0a 23  rity_check.}...#
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
5ac0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
5ad0: 20 77 68 69 6c 65 20 63 68 61 6e 67 69 6e 67 20   while changing 
5ae0: 69 6e 74 6f 20 61 6e 64 20 6f 75 74 20 6f 66 20  into and out of 
5af0: 57 41 4c 20 6d 6f 64 65 2e 0a 23 0a 64 6f 5f 74  WAL mode..#.do_t
5b00: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31  est pagerfault-1
5b10: 37 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74  7-pre1 {.  fault
5b20: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
5b30: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
5b40: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
5b50: 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20  LE t1(a PRIMARY 
5b60: 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  KEY, b);.    INS
5b70: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5b80: 45 53 28 31 38 36 32 2c 20 27 42 6f 74 68 61 27  ES(1862, 'Botha'
5b90: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
5ba0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 38 37  TO t1 VALUES(187
5bb0: 30 2c 20 27 53 6d 75 74 73 27 29 3b 0a 20 20 20  0, 'Smuts');.   
5bc0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5bd0: 56 41 4c 55 45 53 28 31 38 36 36 2c 20 27 48 65  VALUES(1866, 'He
5be0: 72 74 7a 6f 67 27 29 3b 0a 20 20 7d 0a 20 20 66  rtzog');.  }.  f
5bf0: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
5c00: 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66  _close.} {}.do_f
5c10: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
5c20: 65 72 66 61 75 6c 74 2d 31 37 61 20 2d 70 72 65  erfault-17a -pre
5c30: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
5c40: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
5c50: 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  n.} -body {.  ex
5c60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
5c70: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
5c80: 3d 20 77 61 6c 3b 0a 20 20 20 20 50 52 41 47 4d  = wal;.    PRAGM
5c90: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
5ca0: 20 64 65 6c 65 74 65 3b 0a 20 20 7d 0a 7d 20 2d   delete;.  }.} -
5cb0: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
5cc0: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
5cd0: 20 7b 77 61 6c 20 64 65 6c 65 74 65 7d 7d 0a 20   {wal delete}}. 
5ce0: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
5cf0: 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66  ity_check.}.do_f
5d00: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
5d10: 65 72 66 61 75 6c 74 2d 31 37 62 20 2d 70 72 65  erfault-17b -pre
5d20: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
5d30: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
5d40: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  n.  execsql { PR
5d50: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
5d60: 20 3d 20 4f 46 46 20 7d 0a 7d 20 2d 62 6f 64 79   = OFF }.} -body
5d70: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5d80: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
5d90: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20  l_mode = wal;.  
5da0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5db0: 20 56 41 4c 55 45 53 28 32 32 2c 20 27 43 6c 61   VALUES(22, 'Cla
5dc0: 72 6b 65 27 29 3b 0a 20 20 20 20 50 52 41 47 4d  rke');.    PRAGM
5dd0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
5de0: 20 64 65 6c 65 74 65 3b 0a 20 20 7d 0a 7d 20 2d   delete;.  }.} -
5df0: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
5e00: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
5e10: 20 7b 77 61 6c 20 64 65 6c 65 74 65 7d 7d 0a 20   {wal delete}}. 
5e20: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
5e30: 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66  ity_check.}.do_f
5e40: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
5e50: 65 72 66 61 75 6c 74 2d 31 37 63 20 2d 70 72 65  erfault-17c -pre
5e60: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
5e70: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
5e80: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  n.  execsql { . 
5e90: 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e     PRAGMA lockin
5ea0: 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69  g_mode = exclusi
5eb0: 76 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  ve;.    PRAGMA j
5ec0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61  ournal_mode = wa
5ed0: 6c 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b  l;.  }.} -body {
5ee0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
5ef0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
5f00: 20 3d 20 64 65 6c 65 74 65 20 7d 0a 7d 20 2d 74   = delete }.} -t
5f10: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
5f20: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
5f30: 64 65 6c 65 74 65 7d 0a 20 20 66 61 75 6c 74 73  delete}.  faults
5f40: 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65  im_integrity_che
5f50: 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d  ck.}.do_faultsim
5f60: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
5f70: 2d 31 37 64 20 2d 70 72 65 70 20 7b 0a 20 20 63  -17d -prep {.  c
5f80: 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65  atch { db2 close
5f90: 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   }.  faultsim_re
5fa0: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5fb0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
5fc0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
5fd0: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
5fe0: 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 20  l_mode = delete 
5ff0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  }.  execsql { PR
6000: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
6010: 65 20 3d 20 77 61 6c 20 7d 0a 20 20 65 78 65 63  e = wal }.  exec
6020: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
6030: 4f 20 74 31 20 56 41 4c 55 45 53 28 39 39 2c 20  O t1 VALUES(99, 
6040: 27 42 72 61 64 6d 61 6e 27 29 20 7d 20 64 62 32  'Bradman') } db2
6050: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65  .} -body {.  exe
6060: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
6070: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c  urnal_mode = del
6080: 65 74 65 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  ete }.} -test {.
6090: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
60a0: 72 65 73 75 6c 74 20 7b 31 20 7b 64 61 74 61 62  result {1 {datab
60b0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
60c0: 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67    faultsim_integ
60d0: 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 64 6f 5f  rity_check.}.do_
60e0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
60f0: 67 65 72 66 61 75 6c 74 2d 31 37 65 20 2d 70 72  gerfault-17e -pr
6100: 65 70 20 7b 0a 20 20 63 61 74 63 68 20 7b 20 64  ep {.  catch { d
6110: 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20 66 61 75  b2 close }.  fau
6120: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
6130: 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74  d_reopen.  sqlit
6140: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
6150: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
6160: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
6170: 20 64 65 6c 65 74 65 20 7d 0a 20 20 65 78 65 63   delete }.  exec
6180: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
6190: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 20  rnal_mode = wal 
61a0: 7d 0a 20 20 73 65 74 20 3a 3a 63 68 61 6e 20 5b  }.  set ::chan [
61b0: 6c 61 75 6e 63 68 5f 74 65 73 74 66 69 78 74 75  launch_testfixtu
61c0: 72 65 5d 0a 20 20 74 65 73 74 66 69 78 74 75 72  re].  testfixtur
61d0: 65 20 24 3a 3a 63 68 61 6e 20 7b 0a 20 20 20 20  e $::chan {.    
61e0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
61f0: 64 62 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b  db.    db eval {
6200: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6210: 56 41 4c 55 45 53 28 31 30 31 2c 20 27 4c 61 74  VALUES(101, 'Lat
6220: 68 61 6d 27 29 20 7d 0a 20 20 7d 0a 20 20 63 61  ham') }.  }.  ca
6230: 74 63 68 20 7b 20 74 65 73 74 66 69 78 74 75 72  tch { testfixtur
6240: 65 20 24 3a 3a 63 68 61 6e 20 73 71 6c 69 74 65  e $::chan sqlite
6250: 5f 61 62 6f 72 74 20 7d 0a 20 20 63 61 74 63 68  _abort }.  catch
6260: 20 7b 20 63 6c 6f 73 65 20 24 3a 3a 63 68 61 6e   { close $::chan
6270: 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65   }.} -body {.  e
6280: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
6290: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64  journal_mode = d
62a0: 65 6c 65 74 65 20 7d 0a 7d 20 2d 74 65 73 74 20  elete }.} -test 
62b0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
62c0: 74 5f 72 65 73 75 6c 74 20 7b 30 20 64 65 6c 65  t_result {0 dele
62d0: 74 65 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69  te}.  faultsim_i
62e0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d  ntegrity_check.}
62f0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
6300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
6340: 65 73 74 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74  est fault-inject
6350: 69 6f 6e 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ion when changin
6360: 67 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d  g from journal_m
6370: 6f 64 65 3d 70 65 72 73 69 73 74 20 74 6f 20 0a  ode=persist to .
6380: 23 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  # journal_mode=d
6390: 65 6c 65 74 65 20 28 74 68 69 73 20 69 6e 76 6f  elete (this invo
63a0: 6c 76 65 73 20 64 65 6c 65 74 69 6e 67 20 74 68  lves deleting th
63b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 2e  e journal file).
63c0: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
63d0: 66 61 75 6c 74 2d 31 38 2d 70 72 65 31 20 7b 0a  fault-18-pre1 {.
63e0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
63f0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
6400: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
6410: 41 54 45 20 54 41 42 4c 45 20 71 71 28 78 29 3b  ATE TABLE qq(x);
6420: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6430: 20 71 71 20 56 41 4c 55 45 53 28 27 48 65 72 62   qq VALUES('Herb
6440: 65 72 74 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ert');.    INSER
6450: 54 20 49 4e 54 4f 20 71 71 20 56 41 4c 55 45 53  T INTO qq VALUES
6460: 28 27 4d 61 63 61 6c 69 73 74 65 72 27 29 3b 0a  ('Macalister');.
6470: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6480: 71 71 20 56 41 4c 55 45 53 28 27 4d 61 63 6b 65  qq VALUES('Macke
6490: 6e 7a 69 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  nzie');.    INSE
64a0: 52 54 20 49 4e 54 4f 20 71 71 20 56 41 4c 55 45  RT INTO qq VALUE
64b0: 53 28 27 4c 69 6c 6c 65 79 27 29 3b 0a 20 20 20  S('Lilley');.   
64c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 71 20   INSERT INTO qq 
64d0: 56 41 4c 55 45 53 28 27 50 61 6c 6d 65 72 27 29  VALUES('Palmer')
64e0: 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  ;.  }.  faultsim
64f0: 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a  _save_and_close.
6500: 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d  } {}.do_faultsim
6510: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
6520: 2d 31 38 20 2d 70 72 65 70 20 7b 0a 20 20 66 61  -18 -prep {.  fa
6530: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
6540: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
6550: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
6560: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
6570: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53  PERSIST;.    INS
6580: 45 52 54 20 49 4e 54 4f 20 71 71 20 56 41 4c 55  ERT INTO qq VALU
6590: 45 53 28 27 42 65 61 74 74 79 27 29 3b 0a 20 20  ES('Beatty');.  
65a0: 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  }.} -body {.  ex
65b0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a  ecsql { PRAGMA j
65c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
65d0: 6c 65 74 65 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  lete }.} -test {
65e0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
65f0: 5f 72 65 73 75 6c 74 20 7b 30 20 64 65 6c 65 74  _result {0 delet
6600: 65 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e  e}.  faultsim_in
6610: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a  tegrity_check.}.
6620: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
6630: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 39 61  t pagerfault-19a
6640: 20 2d 70 72 65 70 20 7b 0a 20 20 73 71 6c 69 74   -prep {.  sqlit
6650: 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20  e3 db :memory:. 
6660: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
6670: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
6680: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
6690: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
66a0: 46 55 4c 4c 3b 0a 20 20 20 20 42 45 47 49 4e 3b  FULL;.    BEGIN;
66b0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
66c0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
66d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
66e0: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
66f0: 6e 67 28 35 30 30 30 29 2c 20 61 5f 73 74 72 69  ng(5000), a_stri
6700: 6e 67 28 36 30 30 30 29 29 3b 0a 20 20 20 20 43  ng(6000));.    C
6710: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 2d 62 6f  OMMIT;.  }.} -bo
6720: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
6730: 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42   .    CREATE TAB
6740: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  LE t2(a, b);.   
6750: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
6760: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
6770: 3b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  ; .    DELETE FR
6780: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 2d 74 65  OM t1;.  }.} -te
6790: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
67a0: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b  test_result {0 {
67b0: 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  }}.}..do_test pa
67c0: 67 65 72 66 61 75 6c 74 2d 31 39 2d 70 72 65 31  gerfault-19-pre1
67d0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
67e0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
67f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6800: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
6810: 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 43  um = FULL;.    C
6820: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
6830: 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  ); INSERT INTO t
6840: 31 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20  1 VALUES(1);.   
6850: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
6860: 28 78 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  (x); INSERT INTO
6870: 20 74 32 20 56 41 4c 55 45 53 28 32 29 3b 0a 20   t2 VALUES(2);. 
6880: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6890: 74 33 28 78 29 3b 20 49 4e 53 45 52 54 20 49 4e  t3(x); INSERT IN
68a0: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33 29 3b  TO t3 VALUES(3);
68b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
68c0: 45 20 74 34 28 78 29 3b 20 49 4e 53 45 52 54 20  E t4(x); INSERT 
68d0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 34  INTO t4 VALUES(4
68e0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
68f0: 42 4c 45 20 74 35 28 78 29 3b 20 49 4e 53 45 52  BLE t5(x); INSER
6900: 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53  T INTO t5 VALUES
6910: 28 35 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  (5);.    CREATE 
6920: 54 41 42 4c 45 20 74 36 28 78 29 3b 20 49 4e 53  TABLE t6(x); INS
6930: 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55  ERT INTO t6 VALU
6940: 45 53 28 36 29 3b 0a 20 20 7d 0a 20 20 66 61 75  ES(6);.  }.  fau
6950: 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63  ltsim_save_and_c
6960: 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75  lose.} {}.do_fau
6970: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
6980: 66 61 75 6c 74 2d 31 39 62 20 2d 70 72 65 70 20  fault-19b -prep 
6990: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
69a0: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
69b0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
69c0: 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e  sql { .    BEGIN
69d0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
69e0: 34 20 53 45 54 20 78 20 3d 20 78 2b 31 3b 0a 20  4 SET x = x+1;. 
69f0: 20 20 20 20 20 55 50 44 41 54 45 20 74 36 20 53       UPDATE t6 S
6a00: 45 54 20 78 20 3d 20 78 2b 31 3b 0a 20 20 20 20  ET x = x+1;.    
6a10: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
6a20: 0a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  .        UPDATE 
6a30: 74 33 20 53 45 54 20 78 20 3d 20 78 2b 31 3b 0a  t3 SET x = x+1;.
6a40: 20 20 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e          SAVEPOIN
6a50: 54 20 74 77 6f 3b 0a 20 20 20 20 20 20 20 20 20  T two;.         
6a60: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a   DROP TABLE t2;.
6a70: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
6a80: 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49  O one;.    COMMI
6a90: 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  T;.    SELECT * 
6aa0: 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 53 45 4c  FROM t3;.    SEL
6ab0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20  ECT * FROM t4;. 
6ac0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
6ad0: 20 74 36 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74   t6;.  }.} -test
6ae0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65   {.  faultsim_te
6af0: 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 33 20  st_result {0 {3 
6b00: 35 20 37 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  5 7}}.}..#------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b50: 2d 2d 2d 0a 23 20 54 68 69 73 20 74 65 73 74 73  ---.# This tests
6b60: 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e   fault-injection
6b70: 20 69 6e 20 61 20 73 70 65 63 69 61 6c 20 63 61   in a special ca
6b80: 73 65 20 69 6e 20 74 68 65 20 61 75 74 6f 2d 76  se in the auto-v
6b90: 61 63 75 75 6d 20 63 6f 64 65 2e 0a 23 0a 64 6f  acuum code..#.do
6ba0: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
6bb0: 2d 32 30 2d 70 72 65 31 20 7b 0a 20 20 66 61 75  -20-pre1 {.  fau
6bc0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
6bd0: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
6be0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
6bf0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
6c00: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
6c10: 76 61 63 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20  vacuum = FULL;. 
6c20: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6c30: 74 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20  t0(a, b);.  }.  
6c40: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e  faultsim_save_an
6c50: 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f  d_close.} {}.do_
6c60: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
6c70: 67 65 72 66 61 75 6c 74 2d 32 30 20 2d 70 72 65  gerfault-20 -pre
6c80: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
6c90: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
6ca0: 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  n.} -body {.  ex
6cb0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47  ecsql { .    BEG
6cc0: 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  IN;.      CREATE
6cd0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
6ce0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
6cf0: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
6d00: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
6d10: 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  1;.    COMMIT;. 
6d20: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
6d30: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
6d40: 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d 0a 0a 64 6f  ult {0 {}}.}..do
6d50: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
6d60: 2d 32 31 2d 70 72 65 31 20 7b 0a 20 20 66 61 75  -21-pre1 {.  fau
6d70: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
6d80: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
6d90: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
6da0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
6db0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6dc0: 20 74 30 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t0(a PRIMARY KE
6dd0: 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  Y, b);.    INSER
6de0: 54 20 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53  T INTO t0 VALUES
6df0: 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 66 61  (1, 2);.  }.  fa
6e00: 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f  ultsim_save_and_
6e10: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61  close.} {}.do_fa
6e20: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
6e30: 72 66 61 75 6c 74 2d 32 31 20 2d 70 72 65 70 20  rfault-21 -prep 
6e40: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
6e50: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
6e60: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 64 62 20 65  } -body {.  db e
6e70: 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  val { SELECT * F
6e80: 52 4f 4d 20 74 30 20 4c 49 4d 49 54 20 31 20 7d  ROM t0 LIMIT 1 }
6e90: 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b   {.    db eval {
6ea0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20   INSERT INTO t0 
6eb0: 53 45 4c 45 43 54 20 61 2b 31 2c 20 62 20 46 52  SELECT a+1, b FR
6ec0: 4f 4d 20 74 30 20 7d 0a 20 20 20 20 64 62 20 65  OM t0 }.    db e
6ed0: 76 61 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  val { INSERT INT
6ee0: 4f 20 74 30 20 53 45 4c 45 43 54 20 61 2b 32 2c  O t0 SELECT a+2,
6ef0: 20 62 20 46 52 4f 4d 20 74 30 20 7d 0a 20 20 7d   b FROM t0 }.  }
6f00: 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75  .} -test {.  fau
6f10: 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c  ltsim_test_resul
6f20: 74 20 7b 30 20 7b 7d 7d 0a 7d 0a 0a 0a 23 2d 2d  t {0 {}}.}...#--
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66  -------.# Test f
6f80: 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 61  ault-injection a
6f90: 6e 64 20 72 6f 6c 6c 62 61 63 6b 20 77 68 65 6e  nd rollback when
6fa0: 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 68 65   the nReserve he
6fb0: 61 64 65 72 20 76 61 6c 75 65 20 0a 23 20 69 73  ader value .# is
6fc0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 23 0a 64 6f 5f   non-zero..#.do_
6fd0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
6fe0: 32 31 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c  21-pre1 {.  faul
6ff0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
7000: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
7010: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
7020: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
7030: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7040: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
7050: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
7060: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
7070: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
7080: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
7090: 73 74 2e 64 62 20 32 30 20 20 20 20 31 30 0a 20  st.db 20    10. 
70a0: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
70b0: 74 2e 64 62 20 31 30 35 20 30 33 46 30 0a 20 20  t.db 105 03F0.  
70c0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
70d0: 64 62 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  db.  db func a_s
70e0: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
70f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
7100: 52 45 41 54 45 20 54 41 42 4c 45 20 74 30 28 61  REATE TABLE t0(a
7110: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
7120: 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53  UNIQUE);.    INS
7130: 45 52 54 20 49 4e 54 4f 20 74 30 20 56 41 4c 55  ERT INTO t0 VALU
7140: 45 53 28 61 5f 73 74 72 69 6e 67 28 32 32 32 29  ES(a_string(222)
7150: 2c 20 61 5f 73 74 72 69 6e 67 28 33 33 33 29 29  , a_string(333))
7160: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
7170: 4f 20 74 30 20 56 41 4c 55 45 53 28 61 5f 73 74  O t0 VALUES(a_st
7180: 72 69 6e 67 28 32 32 33 29 2c 20 61 5f 73 74 72  ring(223), a_str
7190: 69 6e 67 28 33 33 34 29 29 3b 0a 20 20 20 20 49  ing(334));.    I
71a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20 56 41  NSERT INTO t0 VA
71b0: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 32  LUES(a_string(22
71c0: 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 33 35  4), a_string(335
71d0: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
71e0: 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28 61 5f  NTO t0 VALUES(a_
71f0: 73 74 72 69 6e 67 28 32 32 35 29 2c 20 61 5f 73  string(225), a_s
7200: 74 72 69 6e 67 28 33 33 36 29 29 3b 0a 20 20 7d  tring(336));.  }
7210: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  .  faultsim_save
7220: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a  _and_close.} {}.
7230: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
7240: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 31 20  t pagerfault-21 
7250: 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73  -prep {.  faults
7260: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
7270: 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a  eopen.} -body {.
7280: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
7290: 52 54 20 49 4e 54 4f 20 74 30 20 53 45 4c 45 43  RT INTO t0 SELEC
72a0: 54 20 61 7c 7c 27 78 27 2c 20 62 7c 7c 27 78 27  T a||'x', b||'x'
72b0: 20 46 52 4f 4d 20 74 30 20 7d 0a 7d 20 2d 74 65   FROM t0 }.} -te
72c0: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
72d0: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b  test_result {0 {
72e0: 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e  }}.  faultsim_in
72f0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a  tegrity_check.}.
7300: 69 66 63 61 70 61 62 6c 65 20 63 72 61 73 68 74  ifcapable crasht
7310: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
7320: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
7330: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
7340: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
7350: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
7360: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
7370: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 50  ode = WAL;.    P
7380: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
7390: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 7d  de = DELETE;.  }
73a0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 68 65  .  db close.  he
73b0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
73c0: 62 20 32 30 20 20 20 20 31 30 0a 20 20 68 65 78  b 20    10.  hex
73d0: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
73e0: 20 31 30 35 20 30 33 46 30 0a 0a 20 20 73 71 6c   105 03F0..  sql
73f0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
7400: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
7410: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
7420: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
7430: 54 45 20 54 41 42 4c 45 20 74 30 28 61 20 50 52  TE TABLE t0(a PR
7440: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49  IMARY KEY, b UNI
7450: 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  QUE);.    INSERT
7460: 20 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28   INTO t0 VALUES(
7470: 61 5f 73 74 72 69 6e 67 28 32 32 32 29 2c 20 61  a_string(222), a
7480: 5f 73 74 72 69 6e 67 28 33 33 33 29 29 3b 0a 20  _string(333));. 
7490: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
74a0: 30 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  0 VALUES(a_strin
74b0: 67 28 32 32 33 29 2c 20 61 5f 73 74 72 69 6e 67  g(223), a_string
74c0: 28 33 33 34 29 29 3b 0a 20 20 7d 0a 20 20 66 61  (334));.  }.  fa
74d0: 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f  ultsim_save_and_
74e0: 63 6c 6f 73 65 0a 0a 20 20 66 6f 72 20 7b 73 65  close..  for {se
74f0: 74 20 69 54 65 73 74 20 31 7d 20 7b 24 69 54 65  t iTest 1} {$iTe
7500: 73 74 3c 35 30 7d 20 7b 69 6e 63 72 20 69 54 65  st<50} {incr iTe
7510: 73 74 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  st} {.    do_tes
7520: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 31 2e  t pagerfault-21.
7530: 63 72 61 73 68 2e 24 69 54 65 73 74 2e 31 20 7b  crash.$iTest.1 {
7540: 0a 20 20 20 20 20 20 63 72 61 73 68 73 71 6c 20  .      crashsql 
7550: 2d 64 65 6c 61 79 20 31 20 2d 66 69 6c 65 20 74  -delay 1 -file t
7560: 65 73 74 2e 64 62 20 2d 73 65 65 64 20 24 69 54  est.db -seed $iT
7570: 65 73 74 20 7b 0a 20 20 20 20 20 20 20 20 42 45  est {.        BE
7580: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 43  GIN;.          C
7590: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
75a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
75b0: 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 20 20 20  UNIQUE);.       
75c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
75d0: 31 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52  1 SELECT a, b FR
75e0: 4f 4d 20 74 30 3b 0a 20 20 20 20 20 20 20 20 43  OM t0;.        C
75f0: 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20  OMMIT;.      }. 
7600: 20 20 20 7d 20 7b 31 20 7b 63 68 69 6c 64 20 70     } {1 {child p
7610: 72 6f 63 65 73 73 20 65 78 69 74 65 64 20 61 62  rocess exited ab
7620: 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 20 20 20 20 64  normally}}.    d
7630: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
7640: 74 2d 32 32 2e 24 69 54 65 73 74 2e 32 20 7b 0a  t-22.$iTest.2 {.
7650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
7660: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 20 20 65   test.db.      e
7670: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
7680: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
7690: 7d 0a 20 20 20 20 7d 20 7b 6f 6b 7d 0a 20 20 20  }.    } {ok}.   
76a0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 7d 0a 7d 0a   db close.  }.}.
76b0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
76c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 57  ------------.# W
7700: 68 65 6e 20 61 20 33 2e 37 2e 30 20 63 6c 69 65  hen a 3.7.0 clie
7710: 6e 74 20 6f 70 65 6e 73 20 61 20 77 72 69 74 65  nt opens a write
7720: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
7730: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
7740: 74 68 61 74 0a 23 20 68 61 73 20 62 65 65 6e 20  that.# has been 
7750: 61 70 70 65 6e 64 65 64 20 74 6f 20 6f 72 20 74  appended to or t
7760: 72 75 6e 63 61 74 65 64 20 62 79 20 61 20 70 72  runcated by a pr
7770: 65 2d 33 37 30 20 63 6c 69 65 6e 74 2c 20 69 74  e-370 client, it
7780: 20 75 70 64 61 74 65 73 0a 23 20 74 68 65 20 64   updates.# the d
7790: 62 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 66 69  b-size in the fi
77a0: 6c 65 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  le header immedi
77b0: 61 74 65 6c 79 2e 20 54 68 69 73 20 74 65 73 74  ately. This test
77c0: 20 63 61 73 65 20 70 72 6f 76 6f 6b 65 73 0a 23   case provokes.#
77d0: 20 65 72 72 6f 72 73 20 64 75 72 69 6e 67 20 74   errors during t
77e0: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 23  hat operation..#
77f0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61  .do_test pagerfa
7800: 75 6c 74 2d 32 32 2d 70 72 65 31 20 7b 0a 20 20  ult-22-pre1 {.  
7810: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
7820: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
7830: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
7840: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
7850: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
7860: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
7870: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
7880: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
7890: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
78a0: 61 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  a);.    CREATE I
78b0: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
78c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
78d0: 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74  O t1 VALUES(a_st
78e0: 72 69 6e 67 28 33 30 30 30 29 29 3b 0a 20 20 20  ring(3000));.   
78f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
7900: 28 61 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (a);.    INSERT 
7910: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
7920: 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73  );.  }.  db clos
7930: 65 0a 20 20 73 71 6c 33 36 32 33 31 20 7b 20 49  e.  sql36231 { I
7940: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7950: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 33 30  LUES(a_string(30
7960: 30 30 29 29 20 7d 0a 20 20 66 61 75 6c 74 73 69  00)) }.  faultsi
7970: 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65  m_save_and_close
7980: 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69  .} {}.do_faultsi
7990: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
79a0: 74 2d 32 32 20 2d 70 72 65 70 20 7b 0a 20 20 66  t-22 -prep {.  f
79b0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
79c0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f  and_reopen.} -bo
79d0: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
79e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
79f0: 56 41 4c 55 45 53 28 32 29 20 7d 0a 20 20 65 78  VALUES(2) }.  ex
7a00: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
7a10: 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 2d 74 65   FROM t2 }.} -te
7a20: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
7a30: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b  test_result {0 {
7a40: 31 20 32 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d  1 2}}.  faultsim
7a50: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
7a60: 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}...#----------
7a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7ab0: 23 20 57 68 65 6e 20 61 20 33 2e 37 2e 30 20 63  # When a 3.7.0 c
7ac0: 6c 69 65 6e 74 20 6f 70 65 6e 73 20 61 20 77 72  lient opens a wr
7ad0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
7ae0: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  on a database fi
7af0: 6c 65 20 74 68 61 74 0a 23 20 68 61 73 20 62 65  le that.# has be
7b00: 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 6f  en appended to o
7b10: 72 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61  r truncated by a
7b20: 20 70 72 65 2d 33 37 30 20 63 6c 69 65 6e 74 2c   pre-370 client,
7b30: 20 69 74 20 75 70 64 61 74 65 73 0a 23 20 74 68   it updates.# th
7b40: 65 20 64 62 2d 73 69 7a 65 20 69 6e 20 74 68 65  e db-size in the
7b50: 20 66 69 6c 65 20 68 65 61 64 65 72 20 69 6d 6d   file header imm
7b60: 65 64 69 61 74 65 6c 79 2e 20 54 68 69 73 20 74  ediately. This t
7b70: 65 73 74 20 63 61 73 65 20 70 72 6f 76 6f 6b 65  est case provoke
7b80: 73 0a 23 20 65 72 72 6f 72 73 20 64 75 72 69 6e  s.# errors durin
7b90: 67 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  g that operation
7ba0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
7bb0: 72 66 61 75 6c 74 2d 32 32 2d 70 72 65 31 20 7b  rfault-22-pre1 {
7bc0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
7bd0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
7be0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
7bf0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
7c00: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
7c10: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
7c20: 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75  4;.    PRAGMA au
7c30: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20  to_vacuum = 0;. 
7c40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7c50: 74 31 28 61 29 3b 0a 20 20 20 20 43 52 45 41 54  t1(a);.    CREAT
7c60: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
7c70: 28 61 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (a);.    INSERT 
7c80: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
7c90: 5f 73 74 72 69 6e 67 28 33 30 30 30 29 29 3b 0a  _string(3000));.
7ca0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7cb0: 20 74 32 28 61 29 3b 0a 20 20 20 20 49 4e 53 45   t2(a);.    INSE
7cc0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
7cd0: 53 28 31 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63  S(1);.  }.  db c
7ce0: 6c 6f 73 65 0a 20 20 73 71 6c 33 36 32 33 31 20  lose.  sql36231 
7cf0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
7d00: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
7d10: 28 33 30 30 30 29 29 20 7d 0a 20 20 66 61 75 6c  (3000)) }.  faul
7d20: 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c  tsim_save_and_cl
7d30: 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c  ose.} {}.do_faul
7d40: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
7d50: 61 75 6c 74 2d 32 32 20 2d 70 72 65 70 20 7b 0a  ault-22 -prep {.
7d60: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
7d70: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20  re_and_reopen.} 
7d80: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
7d90: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
7da0: 74 32 20 56 41 4c 55 45 53 28 32 29 20 7d 0a 20  t2 VALUES(2) }. 
7db0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
7dc0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20  T * FROM t2 }.} 
7dd0: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
7de0: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
7df0: 30 20 7b 31 20 32 7d 7d 0a 20 20 66 61 75 6c 74  0 {1 2}}.  fault
7e00: 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  sim_integrity_ch
7e10: 65 63 6b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  eck.}..#--------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 2d 0a 23 20 50 72 6f 76 6f 6b 65 20 61 6e 20 4f  -.# Provoke an O
7e70: 4f 4d 20 65 72 72 6f 72 20 64 75 72 69 6e 67 20  OM error during 
7e80: 61 20 63 6f 6d 6d 69 74 20 6f 66 20 6d 75 6c 74  a commit of mult
7e90: 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
7ea0: 6f 6e 2e 20 4f 6e 65 20 6f 66 0a 23 20 74 68 65  on. One of.# the
7eb0: 20 64 61 74 61 62 61 73 65 73 20 77 72 69 74 74   databases writt
7ec0: 65 6e 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  en during the tr
7ed0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6e 20  ansaction is an 
7ee0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
7ef0: 73 65 2e 0a 23 20 54 68 69 73 20 74 65 73 74 20  se..# This test 
7f00: 63 61 75 73 65 73 20 72 6f 6c 6c 62 61 63 6b 20  causes rollback 
7f10: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
7f20: 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
7f30: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
7f40: 0a 23 20 68 61 73 20 73 75 63 63 65 73 73 66 75  .# has successfu
7f50: 6c 6c 79 20 72 65 74 75 72 6e 65 64 2e 20 69 2e  lly returned. i.
7f60: 65 2e 20 74 68 65 20 73 65 72 69 65 73 20 6f 66  e. the series of
7f70: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 61   calls for the a
7f80: 62 6f 72 74 65 64 20 63 6f 6d 6d 69 74 20 0a 23  borted commit .#
7f90: 20 69 73 3a 0a 23 0a 23 20 20 20 50 61 67 65 72   is:.#.#   Pager
7fa0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 3c  CommitPhaseOne(<
7fb0: 69 6e 2d 6d 65 6d 6f 72 79 2d 64 62 3e 29 20 20  in-memory-db>)  
7fc0: 20 2d 3e 20 20 20 53 51 4c 49 54 45 5f 4f 4b 0a   ->   SQLITE_OK.
7fd0: 23 20 20 20 50 61 67 65 72 43 6f 6d 6d 69 74 50  #   PagerCommitP
7fe0: 68 61 73 65 4f 6e 65 28 3c 66 69 6c 65 2d 64 62  haseOne(<file-db
7ff0: 3e 29 20 20 20 20 20 20 20 20 2d 3e 20 20 20 53  >)        ->   S
8000: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 23 20 20 20  QLITE_IOERR.#   
8010: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 3c 69  PagerRollback(<i
8020: 6e 2d 6d 65 6d 6f 72 79 2d 64 62 3e 29 0a 23 20  n-memory-db>).# 
8030: 20 20 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28    PagerRollback(
8040: 3c 66 69 6c 65 2d 64 62 3e 29 0a 23 0a 64 6f 5f  <file-db>).#.do_
8050: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
8060: 67 65 72 66 61 75 6c 74 2d 32 33 20 2d 70 72 65  gerfault-23 -pre
8070: 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  p {.  sqlite3 db
8080: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 66 6f 72 65   :memory:.  fore
8090: 61 63 68 20 66 20 5b 67 6c 6f 62 20 2d 6e 6f 63  ach f [glob -noc
80a0: 6f 6d 70 6c 61 69 6e 20 74 65 73 74 2e 64 62 2a  omplain test.db*
80b0: 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65 20  ] { forcedelete 
80c0: 24 66 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b  $f }.  db eval {
80d0: 20 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65   .    ATTACH 'te
80e0: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a  st.db2' AS aux;.
80f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8100: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t1(a, b);.    C
8110: 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e  REATE TABLE aux.
8120: 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20  t2(a, b);.  }.} 
8130: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
8140: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
8150: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
8160: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 29  O t1 VALUES(1,2)
8170: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
8180: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c  NTO t2 VALUES(3,
8190: 34 29 3b 20 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  4); .    COMMIT;
81a0: 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  .  }.} -test {. 
81b0: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
81c0: 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20 66  esult {0 {}}.  f
81d0: 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74  aultsim_integrit
81e0: 79 5f 63 68 65 63 6b 0a 7d 0a 0a 64 6f 5f 66 61  y_check.}..do_fa
81f0: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
8200: 72 66 61 75 6c 74 2d 32 34 20 2d 70 72 65 70 20  rfault-24 -prep 
8210: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
8220: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
8230: 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d   db eval { PRAGM
8240: 41 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 66  A temp_store = f
8250: 69 6c 65 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ile }.  execsql 
8260: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  { CREATE TABLE x
8270: 28 61 2c 20 62 29 20 7d 0a 7d 20 2d 62 6f 64 79  (a, b) }.} -body
8280: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
8290: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
82a0: 20 74 31 28 61 2c 20 62 29 20 7d 0a 7d 20 2d 74   t1(a, b) }.} -t
82b0: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
82c0: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
82d0: 7b 7d 7d 20 5c 0a 20 20 20 20 7b 31 20 7b 75 6e  {}} \.    {1 {un
82e0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
82f0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
8300: 65 20 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69  e file for stori
8310: 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
8320: 6c 65 73 7d 7d 0a 20 20 73 65 74 20 69 63 20 5b  les}}.  set ic [
8330: 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  db eval { PRAGMA
8340: 20 74 65 6d 70 2e 69 6e 74 65 67 72 69 74 79 5f   temp.integrity_
8350: 63 68 65 63 6b 20 7d 5d 0a 20 20 69 66 20 7b 24  check }].  if {$
8360: 69 63 20 21 3d 20 22 6f 6b 22 7d 20 7b 20 65 72  ic != "ok"} { er
8370: 72 6f 72 20 22 49 6e 74 65 67 72 69 74 79 20 63  ror "Integrity c
8380: 68 65 63 6b 3a 20 24 69 63 22 20 7d 0a 7d 0a 0a  heck: $ic" }.}..
8390: 70 72 6f 63 20 6c 6f 63 6b 72 6f 77 73 20 7b 6e  proc lockrows {n
83a0: 7d 20 7b 0a 20 20 69 66 20 7b 24 6e 3d 3d 30 7d  } {.  if {$n==0}
83b0: 20 7b 20 72 65 74 75 72 6e 20 22 22 20 7d 0a 20   { return "" }. 
83c0: 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43   db eval { SELEC
83d0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
83e0: 45 20 6f 69 64 20 3d 20 24 6e 20 7d 20 7b 20 0a  E oid = $n } { .
83f0: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 6f 63 6b      return [lock
8400: 72 6f 77 73 20 5b 65 78 70 72 20 7b 24 6e 2d 31  rows [expr {$n-1
8410: 7d 5d 5d 0a 20 20 7d 0a 7d 0a 0a 0a 64 6f 5f 74  }]].  }.}...do_t
8420: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32  est pagerfault-2
8430: 35 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74  5-pre1 {.  fault
8440: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
8450: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
8460: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
8470: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
8480: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
8490: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50  ze = 1024;.    P
84a0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
84b0: 6d 20 3d 20 30 3b 0a 20 20 20 20 43 52 45 41 54  m = 0;.    CREAT
84c0: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 20  E TABLE t1(a);. 
84d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
84e0: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
84f0: 67 28 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  g(500));.    INS
8500: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
8510: 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  CT a_string(500)
8520: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
8530: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
8540: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
8550: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
8560: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
8570: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
8580: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
8590: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
85a0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35  ELECT a_string(5
85b0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
85c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
85d0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
85e0: 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
85f0: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  }.  faultsim_sav
8600: 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d  e_and_close.} {}
8610: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
8620: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 35 20  t pagerfault-25 
8630: 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73  -prep {.  faults
8640: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
8650: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
8660: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
8670: 67 0a 20 20 73 65 74 20 3a 3a 63 68 61 6e 6e 65  g.  set ::channe
8680: 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d  l [db incrblob -
8690: 72 65 61 64 6f 6e 6c 79 20 74 31 20 61 20 31 5d  readonly t1 a 1]
86a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
86b0: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
86c0: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45  ize = 10;.    BE
86d0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
86e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
86f0: 28 61 5f 73 74 72 69 6e 67 28 33 30 30 30 29 29  (a_string(3000))
8700: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
8710: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
8720: 73 74 72 69 6e 67 28 33 30 30 30 29 29 3b 0a 20  string(3000));. 
8730: 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 6c   }.} -body {.  l
8740: 6f 63 6b 72 6f 77 73 20 33 30 0a 7d 20 2d 74 65  ockrows 30.} -te
8750: 73 74 20 7b 0a 20 20 63 61 74 63 68 20 7b 20 6c  st {.  catch { l
8760: 6f 63 6b 72 6f 77 73 20 33 30 20 7d 0a 20 20 63  ockrows 30 }.  c
8770: 61 74 63 68 20 7b 20 64 62 20 65 76 61 6c 20 43  atch { db eval C
8780: 4f 4d 4d 49 54 20 7d 0a 20 20 63 6c 6f 73 65 20  OMMIT }.  close 
8790: 24 3a 3a 63 68 61 6e 6e 65 6c 0a 20 20 66 61 75  $::channel.  fau
87a0: 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c  ltsim_test_resul
87b0: 74 20 7b 30 20 7b 7d 7d 20 0a 7d 0a 0a 64 6f 5f  t {0 {}} .}..do_
87c0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
87d0: 67 65 72 66 61 75 6c 74 2d 32 36 20 2d 70 72 65  gerfault-26 -pre
87e0: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  p {.  faultsim_d
87f0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
8800: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
8810: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
8820: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52  e = 1024;.    PR
8830: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
8840: 65 20 3d 20 74 72 75 6e 63 61 74 65 3b 0a 20 20  e = truncate;.  
8850: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
8860: 63 75 75 6d 20 3d 20 66 75 6c 6c 3b 0a 20 20 20  cuum = full;.   
8870: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
8880: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 3b 0a  mode=exclusive;.
8890: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
88a0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
88b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
88c0: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
88d0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
88e0: 20 3d 20 34 30 39 36 3b 0a 20 20 7d 0a 7d 20 2d   = 4096;.  }.} -
88f0: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
8900: 20 7b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20   {.    VACUUM;. 
8910: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
8920: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
8930: 75 6c 74 20 7b 30 20 7b 7d 7d 0a 0a 20 20 73 65  ult {0 {}}..  se
8940: 74 20 63 6f 6e 74 65 6e 74 73 20 5b 64 62 20 65  t contents [db e
8950: 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  val {SELECT * FR
8960: 4f 4d 20 74 31 7d 5d 0a 20 20 69 66 20 7b 24 63  OM t1}].  if {$c
8970: 6f 6e 74 65 6e 74 73 20 21 3d 20 22 31 20 32 22  ontents != "1 2"
8980: 7d 20 7b 20 65 72 72 6f 72 20 22 42 61 64 20 64  } { error "Bad d
8990: 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 73  atabase contents
89a0: 20 28 24 63 6f 6e 74 65 6e 74 73 29 22 20 7d 0a   ($contents)" }.
89b0: 0a 20 20 73 65 74 20 73 7a 20 5b 66 69 6c 65 20  .  set sz [file 
89c0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 20 20  size test.db].  
89d0: 69 66 20 7b 24 74 65 73 74 72 63 21 3d 30 20 26  if {$testrc!=0 &
89e0: 26 20 24 73 7a 21 3d 31 30 32 34 2a 33 20 26 26  & $sz!=1024*3 &&
89f0: 20 24 73 7a 21 3d 34 30 39 36 2a 33 7d 20 7b 20   $sz!=4096*3} { 
8a00: 0a 20 20 20 20 65 72 72 6f 72 20 22 45 78 70 65  .    error "Expe
8a10: 63 74 65 64 20 66 69 6c 65 20 73 69 7a 65 20 74  cted file size t
8a20: 6f 20 62 65 20 33 30 37 32 20 6f 72 20 31 32 32  o be 3072 or 122
8a30: 38 38 20 62 79 74 65 73 20 2d 20 61 63 74 75 61  88 bytes - actua
8a40: 6c 20 73 69 7a 65 20 24 73 7a 20 62 79 74 65 73  l size $sz bytes
8a50: 22 0a 20 20 7d 0a 20 20 69 66 20 7b 24 74 65 73  ".  }.  if {$tes
8a60: 74 72 63 3d 3d 30 20 26 26 20 24 73 7a 21 3d 34  trc==0 && $sz!=4
8a70: 30 39 36 2a 33 7d 20 7b 20 0a 20 20 20 20 65 72  096*3} { .    er
8a80: 72 6f 72 20 22 45 78 70 65 63 74 65 64 20 66 69  ror "Expected fi
8a90: 6c 65 20 73 69 7a 65 20 74 6f 20 62 65 20 31 32  le size to be 12
8aa0: 32 38 38 20 62 79 74 65 73 20 2d 20 61 63 74 75  288 bytes - actu
8ab0: 61 6c 20 73 69 7a 65 20 24 73 7a 20 62 79 74 65  al size $sz byte
8ac0: 73 22 0a 20 20 7d 0a 7d 20 0a 0a 64 6f 5f 74 65  s".  }.} ..do_te
8ad0: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 37  st pagerfault-27
8ae0: 2d 70 72 65 20 7b 0a 20 20 66 61 75 6c 74 73 69  -pre {.  faultsi
8af0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
8b00: 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
8b10: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
8b20: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
8b30: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
8b40: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
8b50: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
8b60: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
8b70: 41 42 4c 45 20 74 32 28 61 20 55 4e 49 51 55 45  ABLE t2(a UNIQUE
8b80: 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  , b UNIQUE);.   
8b90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
8ba0: 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67  VALUES( a_string
8bb0: 28 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (800), a_string(
8bc0: 38 30 30 29 20 29 3b 0a 20 20 20 20 49 4e 53 45  800) );.    INSE
8bd0: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
8be0: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c  T a_string(800),
8bf0: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
8c00: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45  ROM t2;.    INSE
8c10: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
8c20: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c  T a_string(800),
8c30: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
8c40: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45  ROM t2;.    INSE
8c50: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
8c60: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c  T a_string(800),
8c70: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
8c80: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45  ROM t2;.    INSE
8c90: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
8ca0: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c  T a_string(800),
8cb0: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
8cc0: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45  ROM t2;.    INSE
8cd0: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
8ce0: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c  T a_string(800),
8cf0: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
8d00: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45  ROM t2;.    INSE
8d10: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
8d20: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c  T a_string(800),
8d30: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
8d40: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45  ROM t2;.    INSE
8d50: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
8d60: 53 20 28 61 5f 73 74 72 69 6e 67 28 32 30 30 30  S (a_string(2000
8d70: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30  0), a_string(200
8d80: 30 30 29 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c  00));.  }.  faul
8d90: 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c  tsim_save_and_cl
8da0: 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c  ose.} {}.do_faul
8db0: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
8dc0: 61 75 6c 74 2d 32 37 20 2d 66 61 75 6c 74 73 20  ault-27 -faults 
8dd0: 69 6f 65 72 72 2d 70 65 72 73 69 73 74 65 6e 74  ioerr-persistent
8de0: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
8df0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
8e00: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
8e10: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
8e20: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  ng.  execsql { .
8e30: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
8e40: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
8e50: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b  BEGIN EXCLUSIVE;
8e60: 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 63 68 61  .  }.  set ::cha
8e70: 6e 6e 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f  nnel [db incrblo
8e80: 62 20 74 31 20 61 20 31 5d 0a 7d 20 2d 62 6f 64  b t1 a 1].} -bod
8e90: 79 20 7b 0a 20 20 70 75 74 73 20 24 3a 3a 63 68  y {.  puts $::ch
8ea0: 61 6e 6e 65 6c 20 5b 73 74 72 69 6e 67 20 72 65  annel [string re
8eb0: 70 65 61 74 20 61 62 63 20 36 30 30 30 5d 0a 20  peat abc 6000]. 
8ec0: 20 66 6c 75 73 68 20 24 3a 3a 63 68 61 6e 6e 65   flush $::channe
8ed0: 6c 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 63 61  l.} -test {.  ca
8ee0: 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
8ef0: 74 32 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72  t2 SET a = a_str
8f00: 69 6e 67 28 38 30 30 29 2c 20 62 20 3d 20 61 5f  ing(800), b = a_
8f10: 73 74 72 69 6e 67 28 38 30 30 29 20 7d 0a 20 20  string(800) }.  
8f20: 63 61 74 63 68 20 7b 20 63 6c 6f 73 65 20 24 3a  catch { close $:
8f30: 3a 63 68 61 6e 6e 65 6c 20 7d 0a 20 20 63 61 74  :channel }.  cat
8f40: 63 68 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b  chsql { ROLLBACK
8f50: 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e   }.  faultsim_in
8f60: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a  tegrity_check.}.
8f70: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64  ------------.#.d
8fc0: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
8fd0: 74 2d 32 38 2d 70 72 65 20 7b 0a 20 20 66 61 75  t-28-pre {.  fau
8fe0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
8ff0: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
9000: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
9010: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
9020: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
9030: 73 69 7a 65 20 3d 20 35 31 32 3b 0a 0a 20 20 20  size = 512;..   
9040: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
9050: 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20  mode = wal;.    
9060: 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63  PRAGMA wal_autoc
9070: 68 65 63 6b 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  heckpoint = 0;. 
9080: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
9090: 73 69 7a 65 20 3d 20 31 30 30 30 30 30 3b 0a 0a  size = 100000;..
90a0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
90b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
90c0: 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49  (a UNIQUE, b UNI
90d0: 51 55 45 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  QUE);.      INSE
90e0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
90f0: 53 28 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  S( a_string(800)
9100: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
9110: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
9120: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61  INTO t2 SELECT a
9130: 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f  _string(800), a_
9140: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
9150: 20 74 32 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t2;.      INSER
9160: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
9170: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20   a_string(800), 
9180: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
9190: 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 49 4e 53  OM t2;.      INS
91a0: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
91b0: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
91c0: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
91d0: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 49  FROM t2;.      I
91e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
91f0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
9200: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  0), a_string(800
9210: 29 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20  ) FROM t2;.     
9220: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
9230: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
9240: 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 38  800), a_string(8
9250: 30 30 29 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  00) FROM t2;.   
9260: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9270: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
9280: 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(800), a_string
9290: 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b 0a 20  (800) FROM t2;. 
92a0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
92b0: 20 74 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t2 SELECT a_str
92c0: 69 6e 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69  ing(800), a_stri
92d0: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b  ng(800) FROM t2;
92e0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
92f0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61 5f 73  TO t2 SELECT a_s
9300: 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f 73 74  tring(800), a_st
9310: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
9320: 32 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  2;.      INSERT 
9330: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61  INTO t2 SELECT a
9340: 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f  _string(800), a_
9350: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
9360: 20 74 32 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t2;.      INSER
9370: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
9380: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20   a_string(800), 
9390: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
93a0: 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 49 4e 53  OM t2;.      INS
93b0: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
93c0: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
93d0: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
93e0: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 43 4f 4d  FROM t2;.    COM
93f0: 4d 49 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20  MIT;.    CREATE 
9400: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
9410: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 7d 0a  RY KEY, b);.  }.
9420: 20 20 65 78 70 72 20 7b 5b 66 69 6c 65 20 73 69    expr {[file si
9430: 7a 65 20 74 65 73 74 2e 64 62 2d 73 68 6d 5d 20  ze test.db-shm] 
9440: 3e 3d 20 39 36 2a 31 30 32 34 7d 0a 7d 20 7b 31  >= 96*1024}.} {1
9450: 7d 0a 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f  }.faultsim_save_
9460: 61 6e 64 5f 63 6c 6f 73 65 0a 0a 64 6f 5f 66 61  and_close..do_fa
9470: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
9480: 72 66 61 75 6c 74 2d 32 38 61 20 2d 66 61 75 6c  rfault-28a -faul
9490: 74 73 20 6f 6f 6d 2a 20 2d 70 72 65 70 20 7b 0a  ts oom* -prep {.
94a0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
94b0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
94c0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
94d0: 20 6d 6d 61 70 5f 73 69 7a 65 3d 30 20 7d 0a 0a   mmap_size=0 }..
94e0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
94f0: 73 74 2e 64 62 0a 20 20 64 62 32 20 65 76 61 6c  st.db.  db2 eval
9500: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
9510: 2a 29 20 46 52 4f 4d 20 74 32 20 7d 0a 0a 20 20  *) FROM t2 }..  
9520: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
9530: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
9540: 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e  sql { .    BEGIN
9550: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9560: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
9570: 73 74 72 69 6e 67 28 32 30 30 30 29 2c 20 61 5f  string(2000), a_
9580: 73 74 72 69 6e 67 28 32 30 30 30 29 29 3b 0a 20  string(2000));. 
9590: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
95a0: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
95b0: 69 6e 67 28 32 30 30 30 29 2c 20 61 5f 73 74 72  ing(2000), a_str
95c0: 69 6e 67 28 32 30 30 30 29 29 3b 0a 20 20 7d 0a  ing(2000));.  }.
95d0: 20 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71    set ::STMT [sq
95e0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 64 62  lite3_prepare db
95f0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
9600: 74 31 20 4f 52 44 45 52 20 42 59 20 61 22 20 2d  t1 ORDER BY a" -
9610: 31 20 44 55 4d 4d 59 5d 0a 20 20 73 71 6c 69 74  1 DUMMY].  sqlit
9620: 65 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 0a  e3_step $::STMT.
9630: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
9640: 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d  sql { ROLLBACK }
9650: 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 64 62 32  .} -test {.  db2
9660: 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
9670: 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d  _finalize $::STM
9680: 54 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 52  T.  catchsql { R
9690: 4f 4c 4c 42 41 43 4b 20 7d 0a 20 20 66 61 75 6c  OLLBACK }.  faul
96a0: 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63  tsim_integrity_c
96b0: 68 65 63 6b 0a 7d 0a 0a 66 61 75 6c 74 73 69 6d  heck.}..faultsim
96c0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
96d0: 70 65 6e 0a 73 71 6c 69 74 65 33 20 64 62 32 20  pen.sqlite3 db2 
96e0: 74 65 73 74 2e 64 62 0a 64 62 32 20 65 76 61 6c  test.db.db2 eval
96f0: 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   {SELECT count(*
9700: 29 20 46 52 4f 4d 20 74 32 7d 0a 64 62 20 63 6c  ) FROM t2}.db cl
9710: 6f 73 65 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d  ose..do_faultsim
9720: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
9730: 2d 32 38 62 20 2d 66 61 75 6c 74 73 20 6f 6f 6d  -28b -faults oom
9740: 2a 20 2d 70 72 65 70 20 7b 0a 20 20 73 71 6c 69  * -prep {.  sqli
9750: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 7d  te3 db test.db.}
9760: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
9770: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
9780: 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 7d 0a 7d  t(*) FROM t2 }.}
9790: 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74   -test {.  fault
97a0: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
97b0: 7b 30 20 32 30 34 38 7d 0a 20 20 64 62 20 63 6c  {0 2048}.  db cl
97c0: 6f 73 65 0a 7d 0a 0a 64 62 32 20 63 6c 6f 73 65  ose.}..db2 close
97d0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
97e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
9820: 72 79 20 74 68 69 73 3a 0a 23 0a 23 20 20 20 20  ry this:.#.#    
9830: 31 29 20 50 75 74 20 74 68 65 20 70 61 67 65 72  1) Put the pager
9840: 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
9850: 28 65 72 72 6f 72 20 64 75 72 69 6e 67 20 72 6f  (error during ro
9860: 6c 6c 62 61 63 6b 29 0a 23 0a 23 20 20 20 20 32  llback).#.#    2
9870: 29 20 4e 65 78 74 20 74 69 6d 65 20 74 68 65 20  ) Next time the 
9880: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 75 73  connection is us
9890: 65 64 20 69 6e 6a 65 63 74 20 65 72 72 6f 72 73  ed inject errors
98a0: 20 69 6e 74 6f 20 61 6c 6c 20 78 57 72 69 74 65   into all xWrite
98b0: 28 29 20 61 6e 64 0a 23 20 20 20 20 20 20 20 78  () and.#       x
98c0: 55 6e 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 2e 20  Unlock() calls. 
98d0: 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20  This causes the 
98e0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
98f0: 62 61 63 6b 20 74 6f 20 66 61 69 6c 20 61 6e 64  back to fail and
9900: 0a 23 20 20 20 20 20 20 20 74 68 65 20 70 61 67  .#       the pag
9910: 65 72 20 74 6f 20 64 65 63 6c 61 72 65 20 69 74  er to declare it
9920: 73 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20  s locking state 
9930: 55 4e 4b 4e 4f 57 4e 2e 0a 23 0a 23 20 20 20 20  UNKNOWN..#.#    
9940: 33 29 20 53 61 6d 65 20 61 67 61 69 6e 2e 0a 23  3) Same again..#
9950: 0a 23 20 20 20 20 34 61 29 20 53 74 6f 70 20 69  .#    4a) Stop i
9960: 6e 6a 65 63 74 69 6e 67 20 65 72 72 6f 72 73 2e  njecting errors.
9970: 20 41 6c 6c 6f 77 20 74 68 65 20 72 6f 6c 6c 62   Allow the rollb
9980: 61 63 6b 20 74 6f 20 73 75 63 63 65 65 64 2e 20  ack to succeed. 
9990: 43 68 65 63 6b 20 74 68 61 74 0a 23 20 20 20 20  Check that.#    
99a0: 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65      the database
99b0: 20 69 73 20 4f 6b 2e 20 4f 72 2c 20 0a 23 0a 23   is Ok. Or, .#.#
99c0: 20 20 20 20 34 62 29 20 43 6c 6f 73 65 20 61 6e      4b) Close an
99d0: 64 20 72 65 6f 70 65 6e 20 74 68 65 20 64 62 2e  d reopen the db.
99e0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
99f0: 64 62 20 69 73 20 4f 6b 2e 0a 23 0a 70 72 6f 63  db is Ok..#.proc
9a00: 20 63 75 73 74 6f 6d 5f 69 6e 6a 65 63 74 69 6e   custom_injectin
9a10: 73 74 61 6c 6c 20 7b 7d 20 7b 0a 20 20 74 65 73  stall {} {.  tes
9a20: 74 76 66 73 20 63 75 73 74 6f 6d 20 2d 64 65 66  tvfs custom -def
9a30: 61 75 6c 74 20 74 72 75 65 0a 20 20 63 75 73 74  ault true.  cust
9a40: 6f 6d 20 66 69 6c 74 65 72 20 7b 78 57 72 69 74  om filter {xWrit
9a50: 65 20 78 55 6e 6c 6f 63 6b 7d 0a 7d 0a 70 72 6f  e xUnlock}.}.pro
9a60: 63 20 63 75 73 74 6f 6d 5f 69 6e 6a 65 63 74 75  c custom_injectu
9a70: 6e 69 6e 73 74 61 6c 6c 20 7b 7d 20 7b 0a 20 20  ninstall {} {.  
9a80: 63 61 74 63 68 20 7b 64 62 20 20 63 6c 6f 73 65  catch {db  close
9a90: 7d 0a 20 20 63 61 74 63 68 20 7b 64 62 32 20 63  }.  catch {db2 c
9aa0: 6c 6f 73 65 7d 0a 20 20 63 75 73 74 6f 6d 20 64  lose}.  custom d
9ab0: 65 6c 65 74 65 0a 7d 0a 70 72 6f 63 20 63 75 73  elete.}.proc cus
9ac0: 74 6f 6d 5f 69 6e 6a 65 63 74 73 74 61 72 74 20  tom_injectstart 
9ad0: 7b 69 46 61 69 6c 7d 20 7b 0a 20 20 63 75 73 74  {iFail} {.  cust
9ae0: 6f 6d 20 69 6f 65 72 72 20 24 69 46 61 69 6c 20  om ioerr $iFail 
9af0: 31 0a 7d 0a 70 72 6f 63 20 63 75 73 74 6f 6d 5f  1.}.proc custom_
9b00: 69 6e 6a 65 63 74 73 74 6f 70 20 7b 7d 20 7b 0a  injectstop {} {.
9b10: 20 20 63 75 73 74 6f 6d 20 69 6f 65 72 72 0a 7d    custom ioerr.}
9b20: 0a 73 65 74 20 3a 3a 46 41 55 4c 54 53 49 4d 28  .set ::FAULTSIM(
9b30: 63 75 73 74 6f 6d 29 20 20 20 20 20 20 20 20 20  custom)         
9b40: 20 5b 6c 69 73 74 20 20 20 20 20 20 5c 0a 20 20   [list      \.  
9b50: 2d 69 6e 6a 65 63 74 69 6e 73 74 61 6c 6c 20 20  -injectinstall  
9b60: 20 63 75 73 74 6f 6d 5f 69 6e 6a 65 63 74 69 6e   custom_injectin
9b70: 73 74 61 6c 6c 20 20 20 20 5c 0a 20 20 2d 69 6e  stall    \.  -in
9b80: 6a 65 63 74 73 74 61 72 74 20 20 20 20 20 63 75  jectstart     cu
9b90: 73 74 6f 6d 5f 69 6e 6a 65 63 74 73 74 61 72 74  stom_injectstart
9ba0: 20 20 20 20 20 20 5c 0a 20 20 2d 69 6e 6a 65 63        \.  -injec
9bb0: 74 73 74 6f 70 20 20 20 20 20 20 63 75 73 74 6f  tstop      custo
9bc0: 6d 5f 69 6e 6a 65 63 74 73 74 6f 70 20 20 20 20  m_injectstop    
9bd0: 20 20 20 5c 0a 20 20 2d 69 6e 6a 65 63 74 65 72     \.  -injecter
9be0: 72 6c 69 73 74 20 20 20 7b 7b 31 20 7b 64 69 73  rlist   {{1 {dis
9bf0: 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 7d 20 20  k I/O error}}}  
9c00: 5c 0a 20 20 2d 69 6e 6a 65 63 74 75 6e 69 6e 73  \.  -injectunins
9c10: 74 61 6c 6c 20 63 75 73 74 6f 6d 5f 69 6e 6a 65  tall custom_inje
9c20: 63 74 75 6e 69 6e 73 74 61 6c 6c 20 20 5c 0a 5d  ctuninstall  \.]
9c30: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66  ..do_test pagerf
9c40: 61 75 6c 74 2d 32 39 2d 70 72 65 20 7b 0a 20 20  ault-29-pre {.  
9c50: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
9c60: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
9c70: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
9c80: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
9c90: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
9ca0: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
9cb0: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
9cc0: 5f 73 69 7a 65 20 3d 20 35 3b 0a 0a 20 20 20 20  _size = 5;..    
9cd0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45  BEGIN;.      CRE
9ce0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 55  ATE TABLE t2(a U
9cf0: 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55 45 29  NIQUE, b UNIQUE)
9d00: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9d10: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 20 61  NTO t2 VALUES( a
9d20: 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f  _string(800), a_
9d30: 73 74 72 69 6e 67 28 38 30 30 29 20 29 3b 0a 20  string(800) );. 
9d40: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9d50: 20 74 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t2 SELECT a_str
9d60: 69 6e 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69  ing(800), a_stri
9d70: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 32 3b  ng(800) FROM t2;
9d80: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9d90: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61 5f 73  TO t2 SELECT a_s
9da0: 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f 73 74  tring(800), a_st
9db0: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
9dc0: 32 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  2;.      INSERT 
9dd0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61  INTO t2 SELECT a
9de0: 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20 61 5f  _string(800), a_
9df0: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
9e00: 20 74 32 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t2;.      INSER
9e10: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
9e20: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 2c 20   a_string(800), 
9e30: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
9e40: 4f 4d 20 74 32 3b 0a 20 20 20 20 43 4f 4d 4d 49  OM t2;.    COMMI
9e50: 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 5b  T;.  }.  expr {[
9e60: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
9e70: 62 5d 20 3e 3d 20 35 30 2a 31 30 32 34 7d 0a 7d  b] >= 50*1024}.}
9e80: 20 7b 31 7d 0a 66 61 75 6c 74 73 69 6d 5f 73 61   {1}.faultsim_sa
9e90: 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 66 6f 72  ve_and_close.for
9ea0: 65 61 63 68 20 7b 74 6e 20 74 74 7d 20 7b 0a 20  each {tn tt} {. 
9eb0: 20 32 39 20 7b 20 63 61 74 63 68 73 71 6c 20 52   29 { catchsql R
9ec0: 4f 4c 4c 42 41 43 4b 20 7d 0a 20 20 33 30 20 7b  OLLBACK }.  30 {
9ed0: 20 64 62 20 63 6c 6f 73 65 20 3b 20 73 71 6c 69   db close ; sqli
9ee0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d  te3 db test.db }
9ef0: 0a 7d 20 7b 0a 20 20 64 6f 5f 66 61 75 6c 74 73  .} {.  do_faults
9f00: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
9f10: 6c 74 2d 24 74 6e 20 2d 66 61 75 6c 74 73 20 63  lt-$tn -faults c
9f20: 75 73 74 6f 6d 20 2d 70 72 65 70 20 7b 0a 20 20  ustom -prep {.  
9f30: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
9f40: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
9f50: 20 20 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74      db func a_st
9f60: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
9f70: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
9f80: 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
9f90: 68 65 5f 73 69 7a 65 20 3d 20 35 3b 0a 20 20 20  he_size = 5;.   
9fa0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
9fb0: 20 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45      UPDATE t2 SE
9fc0: 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 37  T a = a_string(7
9fd0: 39 39 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 7d  99);.      }.  }
9fe0: 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 63 61 74   -body {.    cat
9ff0: 63 68 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 20  chsql ROLLBACK. 
a000: 20 20 20 63 61 74 63 68 73 71 6c 20 52 4f 4c 4c     catchsql ROLL
a010: 42 41 43 4b 0a 20 20 20 20 63 61 74 63 68 73 71  BACK.    catchsq
a020: 6c 20 52 4f 4c 4c 42 41 43 4b 0a 20 20 7d 20 2d  l ROLLBACK.  } -
a030: 74 65 73 74 20 7b 0a 20 20 20 20 65 76 61 6c 20  test {.    eval 
a040: 24 3a 3a 74 74 0a 20 20 20 20 69 66 20 7b 22 6f  $::tt.    if {"o
a050: 6b 22 20 21 3d 20 5b 64 62 20 6f 6e 65 20 7b 50  k" != [db one {P
a060: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
a070: 63 68 65 63 6b 7d 5d 7d 20 7b 0a 20 20 20 20 20  check}]} {.     
a080: 20 65 72 72 6f 72 20 22 69 6e 74 65 67 72 69 74   error "integrit
a090: 79 20 63 68 65 63 6b 20 66 61 69 6c 65 64 22 0a  y check failed".
a0a0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f      }.  }.}..do_
a0b0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
a0c0: 33 31 2d 70 72 65 20 7b 0a 20 20 73 71 6c 69 74  31-pre {.  sqlit
a0d0: 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20 20 73 71  e3_shutdown.  sq
a0e0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 75 72 69  lite3_config_uri
a0f0: 20 31 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d   1.} {SQLITE_OK}
a100: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
a110: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 33 31 20  t pagerfault-31 
a120: 2d 66 61 75 6c 74 73 20 6f 6f 6d 2a 20 2d 62 6f  -faults oom* -bo
a130: 64 79 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  dy {.  sqlite3 d
a140: 62 20 7b 66 69 6c 65 3a 6f 6e 65 3f 6d 6f 64 65  b {file:one?mode
a150: 3d 6d 65 6d 6f 72 79 26 63 61 63 68 65 3d 73 68  =memory&cache=sh
a160: 61 72 65 64 7d 0a 20 20 64 62 20 65 76 61 6c 20  ared}.  db eval 
a170: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
a180: 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e  LE t1(x);.    IN
a190: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
a1a0: 55 45 53 28 31 29 3b 0a 20 20 20 20 53 45 4c 45  UES(1);.    SELE
a1b0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
a1c0: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  }.} -test {.  fa
a1d0: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
a1e0: 6c 74 20 7b 30 20 31 7d 20 7b 31 20 7b 7d 7d 0a  lt {0 1} {1 {}}.
a1f0: 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f    catch { db clo
a200: 73 65 20 7d 0a 7d 0a 73 71 6c 69 74 65 33 5f 73  se }.}.sqlite3_s
a210: 68 75 74 64 6f 77 6e 0a 73 71 6c 69 74 65 33 5f  hutdown.sqlite3_
a220: 63 6f 6e 66 69 67 5f 75 72 69 20 30 0a 0a 64 6f  config_uri 0..do
a230: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
a240: 2d 33 32 2d 70 72 65 20 7b 0a 20 20 72 65 73 65  -32-pre {.  rese
a250: 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t_db.  execsql {
a260: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
a270: 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53  E t1(x);.    INS
a280: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
a290: 45 53 28 27 6f 6e 65 27 29 3b 0a 20 20 7d 0a 7d  ES('one');.  }.}
a2a0: 20 7b 7d 0a 66 61 75 6c 74 73 69 6d 5f 73 61 76   {}.faultsim_sav
a2b0: 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 0a 64 6f 5f  e_and_close..do_
a2c0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
a2d0: 67 65 72 66 61 75 6c 74 2d 33 32 20 2d 70 72 65  gerfault-32 -pre
a2e0: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
a2f0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
a300: 6e 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45  n.  db eval { SE
a310: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20  LECT * FROM t1; 
a320: 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  }.} -body {.  ex
a330: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
a340: 20 46 52 4f 4d 20 74 31 3b 20 7d 0a 7d 20 2d 74   FROM t1; }.} -t
a350: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
a360: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
a370: 6f 6e 65 7d 0a 7d 0a 73 71 6c 69 74 65 33 5f 73  one}.}.sqlite3_s
a380: 68 75 74 64 6f 77 6e 0a 73 71 6c 69 74 65 33 5f  hutdown.sqlite3_
a390: 63 6f 6e 66 69 67 5f 75 72 69 20 30 0a 0a 64 6f  config_uri 0..do
a3a0: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70  _faultsim_test p
a3b0: 61 67 65 72 66 61 75 6c 74 2d 33 33 61 20 2d 70  agerfault-33a -p
a3c0: 72 65 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  rep {.  sqlite3 
a3d0: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78  db :memory:.  ex
a3e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
a3f0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
a400: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
a410: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
a420: 32 29 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20  2);.  }.} -body 
a430: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 56 41  {.  execsql { VA
a440: 43 55 55 4d 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  CUUM }.} -test {
a450: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
a460: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d  _result {0 {}}.}
a470: 20 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65   .do_faultsim_te
a480: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 33 33  st pagerfault-33
a490: 62 20 2d 70 72 65 70 20 7b 0a 20 20 73 71 6c 69  b -prep {.  sqli
a4a0: 74 65 33 20 64 62 20 22 22 0a 20 20 65 78 65 63  te3 db "".  exec
a4b0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
a4c0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
a4d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a4e0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
a4f0: 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  ;.  }.} -body {.
a500: 20 20 65 78 65 63 73 71 6c 20 7b 20 56 41 43 55    execsql { VACU
a510: 55 4d 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  UM }.} -test {. 
a520: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
a530: 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d 20 0a  esult {0 {}}.} .
a540: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61  .do_test pagerfa
a550: 75 6c 74 2d 33 34 2d 70 72 65 20 7b 0a 20 20 72  ult-34-pre {.  r
a560: 65 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71  eset_db.  execsq
a570: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
a580: 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52  ABLE t1(x PRIMAR
a590: 59 20 4b 45 59 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  Y KEY);.  }.} {}
a5a0: 0a 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61  .faultsim_save_a
a5b0: 6e 64 5f 63 6c 6f 73 65 0a 64 6f 5f 66 61 75 6c  nd_close.do_faul
a5c0: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
a5d0: 61 75 6c 74 2d 33 34 20 2d 70 72 65 70 20 7b 0a  ault-34 -prep {.
a5e0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
a5f0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
a600: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
a610: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
a620: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
a630: 28 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30  ( randomblob(400
a640: 30 29 20 29 3b 0a 20 20 20 20 20 20 44 45 4c 45  0) );.      DELE
a650: 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  TE FROM t1;.  }.
a660: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
a670: 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 2d 74 65  sql COMMIT.} -te
a680: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
a690: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b  test_result {0 {
a6a0: 7d 7d 0a 7d 20 0a 0a 64 6f 5f 74 65 73 74 20 70  }}.} ..do_test p
a6b0: 61 67 65 72 66 61 75 6c 74 2d 33 35 2d 70 72 65  agerfault-35-pre
a6c0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
a6d0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
a6e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a6f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
a700: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
a710: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
a720: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
a730: 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61  domblob(200), ra
a740: 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 29 3b 0a  ndomblob(200));.
a750: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a760: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
a770: 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f  blob(200), rando
a780: 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20  mblob(200) FROM 
a790: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
a7a0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
a7b0: 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72  ndomblob(200), r
a7c0: 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46  andomblob(200) F
a7d0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
a7e0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
a7f0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  T randomblob(200
a800: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  ), randomblob(20
a810: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  0) FROM t1;.  }.
a820: 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f    faultsim_save_
a830: 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 74  and_close.} {}.t
a840: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
a850: 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69  lt 1.tv sectorsi
a860: 7a 65 20 38 31 39 32 3b 0a 74 76 20 64 65 76 63  ze 8192;.tv devc
a870: 68 61 72 20 5b 6c 69 73 74 5d 0a 64 6f 5f 66 61  har [list].do_fa
a880: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
a890: 72 66 61 75 6c 74 2d 33 35 20 2d 70 72 65 70 20  rfault-35 -prep 
a8a0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
a8b0: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
a8c0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
a8d0: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 31 20  sql { UPDATE t1 
a8e0: 53 45 54 20 78 3d 72 61 6e 64 6f 6d 62 6c 6f 62  SET x=randomblob
a8f0: 28 32 30 30 29 20 7d 0a 7d 20 2d 74 65 73 74 20  (200) }.} -test 
a900: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
a910: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a  t_result {0 {}}.
a920: 7d 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73  }.catch {db clos
a930: 65 7d 0a 74 76 20 64 65 6c 65 74 65 0a 0a 73 71  e}.tv delete..sq
a940: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 73  lite3_shutdown.s
a950: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 75 72  qlite3_config_ur
a960: 69 20 31 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  i 1.do_test page
a970: 72 66 61 75 6c 74 2d 33 36 2d 70 72 65 20 7b 0a  rfault-36-pre {.
a980: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
a990: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
a9a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
a9b0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50  ATE TABLE t1(x P
a9c0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
a9d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a9e0: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
a9f0: 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f  blob(200), rando
aa00: 6d 62 6c 6f 62 28 32 30 30 29 29 3b 0a 20 20 20  mblob(200));.   
aa10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
aa20: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
aa30: 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  b(200), randombl
aa40: 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(200) FROM t1;
aa50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
aa60: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
aa70: 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64  mblob(200), rand
aa80: 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d  omblob(200) FROM
aa90: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
aaa0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
aab0: 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20  andomblob(200), 
aac0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20  randomblob(200) 
aad0: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 66  FROM t1;.  }.  f
aae0: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
aaf0: 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66  _close.} {}.do_f
ab00: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
ab10: 65 72 66 61 75 6c 74 2d 33 36 20 2d 70 72 65 70  erfault-36 -prep
ab20: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
ab30: 73 74 6f 72 65 0a 20 20 73 71 6c 69 74 65 33 20  store.  sqlite3 
ab40: 64 62 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f  db file:test.db?
ab50: 63 61 63 68 65 3d 73 68 61 72 65 64 0a 20 20 73  cache=shared.  s
ab60: 71 6c 69 74 65 33 20 64 62 32 20 66 69 6c 65 3a  qlite3 db2 file:
ab70: 74 65 73 74 2e 64 62 3f 63 61 63 68 65 3d 73 68  test.db?cache=sh
ab80: 61 72 65 64 0a 20 20 64 62 32 20 65 76 61 6c 20  ared.  db2 eval 
ab90: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
aba0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
abb0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
abc0: 74 65 72 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76  ter;.  }.  db ev
abd0: 61 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  al {.    PRAGMA 
abe0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 3b 0a  cache_size = 1;.
abf0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
ac00: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 78   UPDATE t1 SET x
ac10: 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30   = randomblob(20
ac20: 30 29 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20  0);.  }.} -body 
ac30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 52 4f 4c 4c  {.  execsql ROLL
ac40: 42 41 43 4b 20 64 62 0a 7d 20 2d 74 65 73 74 20  BACK db.} -test 
ac50: 7b 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 65  {.  catch { db e
ac60: 76 61 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53  val {UPDATE t1 S
ac70: 45 54 20 78 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f  ET x = randomblo
ac80: 62 28 32 30 30 29 7d 20 7d 0a 20 20 66 61 75 6c  b(200)} }.  faul
ac90: 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74  tsim_test_result
aca0: 20 7b 30 20 7b 7d 7d 0a 20 20 63 61 74 63 68 20   {0 {}}.  catch 
acb0: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 63  { db close }.  c
acc0: 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65  atch { db2 close
acd0: 20 7d 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 73 68   }.}..sqlite3_sh
ace0: 75 74 64 6f 77 6e 0a 73 71 6c 69 74 65 33 5f 63  utdown.sqlite3_c
acf0: 6f 6e 66 69 67 5f 75 72 69 20 30 0a 73 71 6c 69  onfig_uri 0.sqli
ad00: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 0a 0a  te3_initialize..
ad10: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.