/ Hex Artifact Content
Login

Artifact 846f67b69457a5838c52c3a4a25817045a7f09225438e3582007a1c81f60016f:


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