/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 01e6fd28134f8c000273a5040dce1e089f5ae3a3:


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 73 65 74  .  return.}..set
0230: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
0240: 72 20 31 0a 70 72 6f 63 20 61 5f 73 74 72 69 6e  r 1.proc a_strin
0250: 67 20 7b 6e 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  g {n} {.  global
0260: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
0270: 72 0a 20 20 69 6e 63 72 20 61 5f 73 74 72 69 6e  r.  incr a_strin
0280: 67 5f 63 6f 75 6e 74 65 72 0a 20 20 73 74 72 69  g_counter.  stri
0290: 6e 67 20 72 61 6e 67 65 20 5b 73 74 72 69 6e 67  ng range [string
02a0: 20 72 65 70 65 61 74 20 22 24 7b 61 5f 73 74 72   repeat "${a_str
02b0: 69 6e 67 5f 63 6f 75 6e 74 65 72 7d 2e 22 20 24  ing_counter}." $
02c0: 6e 5d 20 31 20 24 6e 0a 7d 0a 64 62 20 66 75 6e  n] 1 $n.}.db fun
02d0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
02e0: 69 6e 67 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ing..#----------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0330: 23 20 54 65 73 74 20 66 61 75 6c 74 2d 69 6e 6a  # Test fault-inj
0340: 65 63 74 69 6f 6e 20 77 68 69 6c 65 20 72 6f 6c  ection while rol
0350: 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
0360: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 23 0a  journal file..#.
0370: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  do_test pagerfau
0380: 6c 74 2d 31 2d 70 72 65 31 20 7b 0a 20 20 65 78  lt-1-pre1 {.  ex
0390: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
03a0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
03b0: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50 52  = DELETE;.    PR
03c0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
03d0: 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45  = 10;.    CREATE
03e0: 20 54 41 42 4c 45 20 74 31 28 61 20 55 4e 49 51   TABLE t1(a UNIQ
03f0: 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20  UE, b UNIQUE);. 
0400: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0410: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
0420: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
0430: 28 33 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (300));.    INSE
0440: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
0450: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
0460: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
0470: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
0480: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
0490: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
04a0: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
04b0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 47 49  ROM t1;.    BEGI
04c0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
04d0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
04e0: 5f 73 74 72 69 6e 67 28 32 30 31 29 2c 20 61 5f  _string(201), a_
04f0: 73 74 72 69 6e 67 28 33 30 31 29 20 46 52 4f 4d  string(301) FROM
0500: 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t1;.      INSER
0510: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
0520: 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29 2c 20   a_string(202), 
0530: 61 5f 73 74 72 69 6e 67 28 33 30 32 29 20 46 52  a_string(302) FR
0540: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53  OM t1;.      INS
0550: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
0560: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 33 29  CT a_string(203)
0570: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 33 29 20  , a_string(303) 
0580: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49  FROM t1;.      I
0590: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
05a0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
05b0: 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 34  4), a_string(304
05c0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20  ) FROM t1;.  }. 
05d0: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61   faultsim_save_a
05e0: 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f  nd_close.} {}.do
05f0: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70  _faultsim_test p
0600: 61 67 65 72 66 61 75 6c 74 2d 31 20 2d 70 72 65  agerfault-1 -pre
0610: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
0620: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
0630: 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  n.} -body {.  ex
0640: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
0650: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
0660: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  }.} -test {.  fa
0670: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
0680: 6c 74 20 7b 30 20 34 7d 0a 20 20 66 61 75 6c 74  lt {0 4}.  fault
0690: 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  sim_integrity_ch
06a0: 65 63 6b 0a 20 20 69 66 20 7b 5b 64 62 20 6f 6e  eck.  if {[db on
06b0: 65 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  e { SELECT count
06c0: 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 5d 20 21  (*) FROM t1 }] !
06d0: 3d 20 34 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72  = 4} {.    error
06e0: 20 22 44 61 74 61 62 61 73 65 20 63 6f 6e 74 65   "Database conte
06f0: 6e 74 20 61 70 70 65 61 72 73 20 69 6e 63 6f 72  nt appears incor
0700: 72 65 63 74 22 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d  rect".  }.}..#--
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66  -------.# Test f
0760: 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 77  ault-injection w
0770: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  hile rolling bac
0780: 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
0790: 66 69 6c 65 20 77 69 74 68 20 61 20 0a 23 20 70  file with a .# p
07a0: 61 67 65 2d 73 69 7a 65 20 64 69 66 66 65 72 65  age-size differe
07b0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  nt from the curr
07c0: 65 6e 74 20 76 61 6c 75 65 20 73 74 6f 72 65 64  ent value stored
07d0: 20 6f 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68   on page 1 of th
07e0: 65 0a 23 20 64 61 74 61 62 61 73 65 20 66 69 6c  e.# database fil
07f0: 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  e..#.do_test pag
0800: 65 72 66 61 75 6c 74 2d 32 2d 70 72 65 31 20 7b  erfault-2-pre1 {
0810: 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
0820: 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 66 69  efault 1.  tv fi
0830: 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74 76 20  lter xSync.  tv 
0840: 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 20  script xSyncCb. 
0850: 20 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 66   proc xSyncCb {f
0860: 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a  ilename args} {.
0870: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
0880: 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 66  match *journal f
0890: 69 6c 65 6e 61 6d 65 5d 3d 3d 30 7d 20 66 61 75  ilename]==0} fau
08a0: 6c 74 73 69 6d 5f 73 61 76 65 0a 20 20 7d 0a 20  ltsim_save.  }. 
08b0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
08c0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
08d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
08e0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34  MA page_size = 4
08f0: 30 39 36 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  096;.    BEGIN;.
0900: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
0910: 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b  LE abc(a, b, c);
0920: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0930: 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 27 6f  TO abc VALUES('o
0940: 27 2c 20 27 74 27 2c 20 27 74 27 29 3b 20 0a 20  ', 't', 't'); . 
0950: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0960: 20 61 62 63 20 56 41 4c 55 45 53 28 27 66 27 2c   abc VALUES('f',
0970: 20 27 66 27 2c 20 27 73 27 29 3b 20 0a 20 20 20   'f', 's'); .   
0980: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
0990: 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  bc SELECT * FROM
09a0: 20 61 62 63 3b 20 2d 2d 20 34 0a 20 20 20 20 20   abc; -- 4.     
09b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
09c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
09d0: 62 63 3b 20 2d 2d 20 38 0a 20 20 20 20 20 20 49  bc; -- 8.      I
09e0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53  NSERT INTO abc S
09f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
0a00: 3b 20 2d 2d 20 31 36 0a 20 20 20 20 20 20 49 4e  ; -- 16.      IN
0a10: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45  SERT INTO abc SE
0a20: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b  LECT * FROM abc;
0a30: 20 2d 2d 20 33 32 0a 20 20 20 20 20 20 49 4e 53   -- 32.      INS
0a40: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c  ERT INTO abc SEL
0a50: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 20  ECT * FROM abc; 
0a60: 2d 2d 20 36 34 0a 20 20 20 20 20 20 49 4e 53 45  -- 64.      INSE
0a70: 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45  RT INTO abc SELE
0a80: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 20 2d  CT * FROM abc; -
0a90: 2d 20 31 32 38 0a 20 20 20 20 20 20 49 4e 53 45  - 128.      INSE
0aa0: 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45  RT INTO abc SELE
0ab0: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 20 2d  CT * FROM abc; -
0ac0: 2d 20 32 35 36 0a 20 20 20 20 43 4f 4d 4d 49 54  - 256.    COMMIT
0ad0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  ;.    PRAGMA pag
0ae0: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
0af0: 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 20     VACUUM;.  }. 
0b00: 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64   db close.  tv d
0b10: 65 6c 65 74 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61  elete.} {}.do_fa
0b20: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
0b30: 72 66 61 75 6c 74 2d 32 20 2d 70 72 65 70 20 7b  rfault-2 -prep {
0b40: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
0b50: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d  ore_and_reopen.}
0b60: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
0b70: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
0b80: 4f 4d 20 61 62 63 20 7d 0a 7d 20 2d 74 65 73 74  OM abc }.} -test
0b90: 20 7b 0a 20 20 73 65 74 20 61 6e 73 77 65 72 20   {.  set answer 
0ba0: 5b 73 70 6c 69 74 20 5b 73 74 72 69 6e 67 20 72  [split [string r
0bb0: 65 70 65 61 74 20 22 6f 74 74 66 66 73 22 20 31  epeat "ottffs" 1
0bc0: 32 38 5d 20 22 22 5d 0a 20 20 66 61 75 6c 74 73  28] ""].  faults
0bd0: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 5b  im_test_result [
0be0: 6c 69 73 74 20 30 20 24 61 6e 73 77 65 72 5d 0a  list 0 $answer].
0bf0: 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67    faultsim_integ
0c00: 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 73 65 74  rity_check.  set
0c10: 20 72 65 73 20 5b 64 62 20 65 76 61 6c 20 7b 20   res [db eval { 
0c20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62  SELECT * FROM ab
0c30: 63 20 7d 5d 0a 20 20 69 66 20 7b 24 72 65 73 20  c }].  if {$res 
0c40: 21 3d 20 24 61 6e 73 77 65 72 7d 20 7b 20 65 72  != $answer} { er
0c50: 72 6f 72 20 22 44 61 74 61 62 61 73 65 20 63 6f  ror "Database co
0c60: 6e 74 65 6e 74 20 61 70 70 65 61 72 73 20 69 6e  ntent appears in
0c70: 63 6f 72 72 65 63 74 20 28 24 72 65 73 29 22 20  correct ($res)" 
0c80: 7d 0a 7d 20 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.} ..#---------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cd0: 0a 23 20 54 65 73 74 20 66 61 75 6c 74 2d 69 6e  .# Test fault-in
0ce0: 6a 65 63 74 69 6f 6e 20 77 68 69 6c 65 20 72 6f  jection while ro
0cf0: 6c 6c 69 6e 67 20 62 61 63 6b 20 68 6f 74 2d 6a  lling back hot-j
0d00: 6f 75 72 6e 61 6c 73 20 74 68 61 74 20 77 65 72  ournals that wer
0d10: 65 20 63 72 65 61 74 65 64 0a 23 20 61 73 20 70  e created.# as p
0d20: 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
0d30: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ile transaction.
0d40: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
0d50: 66 61 75 6c 74 2d 33 2d 70 72 65 31 20 7b 0a 20  fault-3-pre1 {. 
0d60: 20 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20   testvfs tstvfs 
0d70: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74  -default 1.  tst
0d80: 76 66 73 20 66 69 6c 74 65 72 20 78 44 65 6c 65  vfs filter xDele
0d90: 74 65 0a 20 20 74 73 74 76 66 73 20 73 63 72 69  te.  tstvfs scri
0da0: 70 74 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61  pt xDeleteCallba
0db0: 63 6b 0a 0a 20 20 70 72 6f 63 20 78 44 65 6c 65  ck..  proc xDele
0dc0: 74 65 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68  teCallback {meth
0dd0: 6f 64 20 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a  od file args} {.
0de0: 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b 66 69      set file [fi
0df0: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20  le tail $file]. 
0e00: 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20     if { [string 
0e10: 6d 61 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c 65  match *mj* $file
0e20: 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73  ] } { faultsim_s
0e30: 61 76 65 20 7d 0a 20 20 7d 0a 0a 20 20 66 61 75  ave }.  }..  fau
0e40: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
0e50: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
0e60: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
0e70: 69 6e 67 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b  ing..  execsql {
0e80: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
0e90: 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20  t.db2' AS aux;. 
0ea0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
0eb0: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
0ec0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e  .    PRAGMA main
0ed0: 2e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30  .cache_size = 10
0ee0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 78  ;.    PRAGMA aux
0ef0: 2e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30  .cache_size = 10
0f00: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
0f10: 42 4c 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c  BLE t1(a UNIQUE,
0f20: 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   b UNIQUE);.    
0f30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78  CREATE TABLE aux
0f40: 2e 74 32 28 61 20 55 4e 49 51 55 45 2c 20 62 20  .t2(a UNIQUE, b 
0f50: 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53  UNIQUE);.    INS
0f60: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0f70: 45 53 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ES(a_string(200)
0f80: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29  , a_string(300))
0f90: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0fa0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
0fb0: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
0fc0: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31  ing(300) FROM t1
0fd0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0fe0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
0ff0: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
1000: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31  ing(300) FROM t1
1010: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1020: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O t2 SELECT * FR
1030: 4f 4d 20 74 31 3b 0a 0a 20 20 20 20 42 45 47 49  OM t1;..    BEGI
1040: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
1050: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
1060: 5f 73 74 72 69 6e 67 28 32 30 31 29 2c 20 61 5f  _string(201), a_
1070: 73 74 72 69 6e 67 28 33 30 31 29 20 46 52 4f 4d  string(301) FROM
1080: 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t1;.      INSER
1090: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
10a0: 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29 2c 20   a_string(202), 
10b0: 61 5f 73 74 72 69 6e 67 28 33 30 32 29 20 46 52  a_string(302) FR
10c0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53  OM t1;.      INS
10d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
10e0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 33 29  CT a_string(203)
10f0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 33 29 20  , a_string(303) 
1100: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49  FROM t1;.      I
1110: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1120: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
1130: 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 34  4), a_string(304
1140: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  ) FROM t1;.     
1150: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 32   REPLACE INTO t2
1160: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1170: 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  1;.    COMMIT;. 
1180: 20 7d 0a 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20   }..  db close. 
1190: 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a 7d   tstvfs delete.}
11a0: 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f   {}.do_faultsim_
11b0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
11c0: 33 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  3 -prep {.  faul
11d0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
11e0: 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20  _reopen.} -body 
11f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
1200: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
1210: 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20  db2' AS aux;.   
1220: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1230: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 53 45   FROM t2;.    SE
1240: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1250: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 2d 74 65  OM t1;.  }.} -te
1260: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
1270: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b  test_result {0 {
1280: 34 20 34 7d 7d 20 7b 31 20 7b 75 6e 61 62 6c 65  4 4}} {1 {unable
1290: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
12a0: 65 3a 20 74 65 73 74 2e 64 62 32 7d 7d 0a 20 20  e: test.db2}}.  
12b0: 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69  faultsim_integri
12c0: 74 79 5f 63 68 65 63 6b 0a 20 20 63 61 74 63 68  ty_check.  catch
12d0: 73 71 6c 20 7b 20 41 54 54 41 43 48 20 27 74 65  sql { ATTACH 'te
12e0: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 20 7d  st.db2' AS aux }
12f0: 0a 20 20 69 66 20 7b 5b 64 62 20 6f 6e 65 20 7b  .  if {[db one {
1300: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1310: 20 46 52 4f 4d 20 74 31 20 7d 5d 20 21 3d 20 34   FROM t1 }] != 4
1320: 0a 20 20 20 7c 7c 20 5b 64 62 20 6f 6e 65 20 7b  .   || [db one {
1330: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1340: 20 46 52 4f 4d 20 74 32 20 7d 5d 20 21 3d 20 34   FROM t2 }] != 4
1350: 0a 20 20 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72  .  } {.    error
1360: 20 22 44 61 74 61 62 61 73 65 20 63 6f 6e 74 65   "Database conte
1370: 6e 74 20 61 70 70 65 61 72 73 20 69 6e 63 6f 72  nt appears incor
1380: 72 65 63 74 22 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d  rect".  }.}..#--
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66  -------.# Test f
13e0: 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 61  ault-injection a
13f0: 73 20 70 61 72 74 20 6f 66 20 61 20 76 61 6e 69  s part of a vani
1400: 6c 6c 61 2c 20 6e 6f 2d 74 72 61 6e 73 61 63 74  lla, no-transact
1410: 69 6f 6e 2c 20 49 4e 53 45 52 54 0a 23 20 73 74  ion, INSERT.# st
1420: 61 74 65 6d 65 6e 74 2e 0a 23 0a 64 6f 5f 66 61  atement..#.do_fa
1430: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
1440: 72 66 61 75 6c 74 2d 34 20 2d 70 72 65 70 20 7b  rfault-4 -prep {
1450: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
1460: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20  te_and_reopen.} 
1470: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
1480: 6c 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20  l { .    CREATE 
1490: 54 41 42 4c 45 20 78 28 79 29 3b 0a 20 20 20 20  TABLE x(y);.    
14a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41  INSERT INTO x VA
14b0: 4c 55 45 53 28 27 7a 27 29 3b 0a 20 20 20 20 53  LUES('z');.    S
14c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 3b 0a  ELECT * FROM x;.
14d0: 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20    }.} -test {.  
14e0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
14f0: 73 75 6c 74 20 7b 30 20 7a 7d 0a 20 20 66 61 75  sult {0 z}.  fau
1500: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
1510: 63 68 65 63 6b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  check.}..#------
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c 74  ---.# Test fault
1570: 2d 69 6e 6a 65 63 74 69 6f 6e 20 61 73 20 70 61  -injection as pa
1580: 72 74 20 6f 66 20 61 20 63 6f 6d 6d 69 74 20 77  rt of a commit w
1590: 68 65 6e 20 75 73 69 6e 67 20 6a 6f 75 72 6e 61  hen using journa
15a0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a  l_mode=PERSIST..
15b0: 23 20 54 68 72 65 65 20 64 69 66 66 65 72 65 6e  # Three differen
15c0: 74 20 63 61 73 65 73 3a 0a 23 0a 23 20 20 20 20  t cases:.#.#    
15d0: 70 61 67 65 72 66 61 75 6c 74 2d 35 2e 31 3a 20  pagerfault-5.1: 
15e0: 57 69 74 68 20 6e 6f 20 6a 6f 75 72 6e 61 6c 5f  With no journal_
15f0: 73 69 7a 65 5f 6c 69 6d 69 74 20 63 6f 6e 66 69  size_limit confi
1600: 67 75 72 65 64 2e 0a 23 20 20 20 20 70 61 67 65  gured..#    page
1610: 72 66 61 75 6c 74 2d 35 2e 32 3a 20 57 69 74 68  rfault-5.2: With
1620: 20 61 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f   a journal_size_
1630: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
1640: 2e 0a 23 20 20 20 20 70 61 67 65 72 66 61 75 6c  ..#    pagerfaul
1650: 74 2d 35 2e 34 3a 20 4d 75 6c 74 69 2d 66 69 6c  t-5.4: Multi-fil
1660: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f  e transaction. O
1670: 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  ne connection ha
1680: 73 20 61 20 0a 23 20 20 20 20 20 20 20 20 20 20  s a .#          
1690: 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
16a0: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 20 6f 66 20  l_size_limit of 
16b0: 30 2c 20 74 68 65 20 6f 74 68 65 72 20 68 61 73  0, the other has
16c0: 20 6e 6f 20 6c 69 6d 69 74 2e 0a 23 0a 64 6f 5f   no limit..#.do_
16d0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
16e0: 35 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74  5-pre1 {.  fault
16f0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
1700: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
1710: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
1720: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
1730: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1740: 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  1(a UNIQUE, b UN
1750: 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52  IQUE);.    INSER
1760: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1770: 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20  (a_string(200), 
1780: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a  a_string(300));.
1790: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
17a0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
17b0: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
17c0: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
17d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
17e0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
17f0: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
1800: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
1810: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73    }.  faultsim_s
1820: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20  ave_and_close.} 
1830: 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74  {}.do_faultsim_t
1840: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 35  est pagerfault-5
1850: 2e 31 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75  .1 -prep {.  fau
1860: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
1870: 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
1880: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
1890: 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
18a0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
18b0: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 20 7d  mode = PERSIST }
18c0: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65  .} -body {.  exe
18d0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
18e0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
18f0: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
1900: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74  ring(300) FROM t
1910: 31 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20  1 }.} -test {.  
1920: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
1930: 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20 66 61  sult {0 {}}.  fa
1940: 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79  ultsim_integrity
1950: 5f 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c  _check.}.do_faul
1960: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
1970: 61 75 6c 74 2d 35 2e 32 20 2d 70 72 65 70 20 7b  ault-5.2 -prep {
1980: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
1990: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
19a0: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
19b0: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
19c0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  csql { .    PRAG
19d0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
19e0: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 50  = PERSIST;.    P
19f0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69  RAGMA journal_si
1a00: 7a 65 5f 6c 69 6d 69 74 20 3d 20 32 30 34 38 3b  ze_limit = 2048;
1a10: 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20  .  }.} -body {. 
1a20: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
1a30: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1a40: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
1a50: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
1a60: 4f 4d 20 74 31 20 7d 0a 7d 20 2d 74 65 73 74 20  OM t1 }.} -test 
1a70: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
1a80: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a  t_result {0 {}}.
1a90: 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67    faultsim_integ
1aa0: 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 64 6f 5f  rity_check.}.do_
1ab0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
1ac0: 67 65 72 66 61 75 6c 74 2d 35 2e 33 20 2d 66 61  gerfault-5.3 -fa
1ad0: 75 6c 74 73 20 6f 6f 6d 2d 74 72 61 6e 73 69 65  ults oom-transie
1ae0: 6e 74 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75  nt -prep {.  fau
1af0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
1b00: 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
1b10: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
1b20: 72 69 6e 67 0a 20 20 66 69 6c 65 20 64 65 6c 65  ring.  file dele
1b30: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e  te -force test2.
1b40: 64 62 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72  db test2.db-jour
1b50: 6e 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  nal test2.db-wal
1b60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
1b70: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
1b80: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
1b90: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
1ba0: 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20  t2.db' AS aux;. 
1bb0: 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 6a 6f     PRAGMA aux.jo
1bc0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
1bd0: 53 49 53 54 3b 0a 20 20 20 20 50 52 41 47 4d 41  SIST;.    PRAGMA
1be0: 20 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 73 69 7a   aux.journal_siz
1bf0: 65 5f 6c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d  e_limit = 0;.  }
1c00: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65  .} -body {.  exe
1c10: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
1c20: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1c30: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
1c40: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
1c50: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
1c60: 74 31 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  t1;.      CREATE
1c70: 20 54 41 42 4c 45 20 61 75 78 2e 74 32 20 41 53   TABLE aux.t2 AS
1c80: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1c90: 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  1;.    COMMIT;. 
1ca0: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
1cb0: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
1cc0: 75 6c 74 20 7b 30 20 7b 7d 7d 0a 0a 20 20 63 61  ult {0 {}}..  ca
1cd0: 74 63 68 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20  tchsql { COMMIT 
1ce0: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 52  }.  catchsql { R
1cf0: 4f 4c 4c 42 41 43 4b 20 7d 0a 0a 20 20 66 61 75  OLLBACK }..  fau
1d00: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
1d10: 63 68 65 63 6b 0a 20 20 73 65 74 20 72 65 73 20  check.  set res 
1d20: 22 22 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74  "".  set rc [cat
1d30: 63 68 20 7b 20 73 65 74 20 72 65 73 20 5b 64 62  ch { set res [db
1d40: 20 6f 6e 65 20 7b 20 50 52 41 47 4d 41 20 61 75   one { PRAGMA au
1d50: 78 2e 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  x.integrity_chec
1d60: 6b 20 7d 5d 20 7d 5d 0a 20 20 69 66 20 7b 24 72  k }] }].  if {$r
1d70: 63 21 3d 30 20 7c 7c 20 24 72 65 73 20 21 3d 20  c!=0 || $res != 
1d80: 22 6f 6b 22 7d 20 7b 65 72 72 6f 72 20 22 69 6e  "ok"} {error "in
1d90: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 70 72  tegrity-check pr
1da0: 6f 62 6c 65 6d 3a 24 72 63 20 24 72 65 73 22 7d  oblem:$rc $res"}
1db0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
1dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1e00: 20 54 65 73 74 20 66 61 75 6c 74 2d 69 6e 6a 65   Test fault-inje
1e10: 63 74 69 6f 6e 20 61 73 20 70 61 72 74 20 6f 66  ction as part of
1e20: 20 61 20 63 6f 6d 6d 69 74 20 77 68 65 6e 20 75   a commit when u
1e30: 73 69 6e 67 20 0a 23 20 6a 6f 75 72 6e 61 6c 5f  sing .# journal_
1e40: 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 2e 0a 23  mode=TRUNCATE..#
1e50: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61  .do_test pagerfa
1e60: 75 6c 74 2d 36 2d 70 72 65 31 20 7b 0a 20 20 66  ult-6-pre1 {.  f
1e70: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
1e80: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
1e90: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
1ea0: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
1eb0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
1ec0: 4c 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20  LE t1(a UNIQUE, 
1ed0: 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 49  b UNIQUE);.    I
1ee0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1ef0: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 30  LUES(a_string(20
1f00: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
1f10: 29 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  ));.  }.  faults
1f20: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
1f30: 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 66 61 75 6c 74  e.} {}..do_fault
1f40: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
1f50: 75 6c 74 2d 36 2e 31 20 2d 70 72 65 70 20 7b 0a  ult-6.1 -prep {.
1f60: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
1f70: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
1f80: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
1f90: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
1fa0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
1fb0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e  rnal_mode = TRUN
1fc0: 43 41 54 45 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b  CATE }.} -body {
1fd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
1fe0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1ff0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
2000: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
2010: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78 65 63  FROM t1 }.  exec
2020: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
2030: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
2040: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
2050: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31  ing(300) FROM t1
2060: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
2070: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
2080: 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20 66 61 75  ult {0 {}}.  fau
2090: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
20a0: 63 68 65 63 6b 0a 7d 0a 0a 23 20 54 68 65 20 75  check.}..# The u
20b0: 6e 69 78 20 76 66 73 20 78 41 63 63 65 73 73 28  nix vfs xAccess(
20c0: 29 20 6d 65 74 68 6f 64 20 63 6f 6e 73 69 64 65  ) method conside
20d0: 72 73 20 61 20 66 69 6c 65 20 7a 65 72 6f 20 62  rs a file zero b
20e0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 74 6f 0a  ytes in size to.
20f0: 23 20 22 6e 6f 74 20 65 78 69 73 74 22 2e 20 54  # "not exist". T
2100: 68 69 73 20 70 72 6f 63 20 6f 76 65 72 72 69 64  his proc overrid
2110: 65 73 20 74 68 61 74 20 62 65 68 61 76 69 6f 75  es that behaviou
2120: 72 20 73 6f 20 74 68 61 74 20 61 20 7a 65 72 6f  r so that a zero
2130: 20 6c 65 6e 67 74 68 0a 23 20 66 69 6c 65 20 69   length.# file i
2140: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  s considered to 
2150: 65 78 69 73 74 2e 0a 23 0a 70 72 6f 63 20 78 41  exist..#.proc xA
2160: 63 63 65 73 73 20 7b 6d 65 74 68 6f 64 20 66 69  ccess {method fi
2170: 6c 65 6e 61 6d 65 20 6f 70 20 61 72 67 73 7d 20  lename op args} 
2180: 7b 0a 20 20 69 66 20 7b 24 6f 70 20 21 3d 20 22  {.  if {$op != "
2190: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
21a0: 49 53 54 53 22 7d 20 7b 20 72 65 74 75 72 6e 20  ISTS"} { return 
21b0: 22 22 20 7d 0a 20 20 72 65 74 75 72 6e 20 5b 66  "" }.  return [f
21c0: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
21d0: 6e 61 6d 65 5d 0a 7d 0a 64 6f 5f 66 61 75 6c 74  name].}.do_fault
21e0: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
21f0: 75 6c 74 2d 36 2e 32 20 2d 66 61 75 6c 74 73 20  ult-6.2 -faults 
2200: 63 61 6e 74 6f 70 65 6e 2d 2a 20 2d 70 72 65 70  cantopen-* -prep
2210: 20 7b 0a 20 20 73 68 6d 66 61 75 6c 74 20 66 69   {.  shmfault fi
2220: 6c 74 65 72 20 78 41 63 63 65 73 73 0a 20 20 73  lter xAccess.  s
2230: 68 6d 66 61 75 6c 74 20 73 63 72 69 70 74 20 78  hmfault script x
2240: 41 63 63 65 73 73 0a 0a 20 20 66 61 75 6c 74 73  Access..  faults
2250: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
2260: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
2270: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
2280: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  g.  execsql { PR
2290: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
22a0: 65 20 3d 20 54 52 55 4e 43 41 54 45 20 7d 0a 7d  e = TRUNCATE }.}
22b0: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
22c0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
22d0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
22e0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
22f0: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 20  ng(300) FROM t1 
2300: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  }.  execsql { IN
2310: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2320: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
2330: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
2340: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d 74 65   FROM t1 }.} -te
2350: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
2360: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b  test_result {0 {
2370: 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e  }}.  faultsim_in
2380: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a  tegrity_check.}.
2390: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
23a0: 20 77 61 73 20 61 6e 20 61 74 74 65 6d 70 74 20   was an attempt 
23b0: 74 6f 20 67 65 74 20 61 20 62 69 74 76 65 63 20  to get a bitvec 
23c0: 6d 61 6c 6c 6f 63 20 74 6f 20 66 61 69 6c 2e 20  malloc to fail. 
23d0: 44 69 64 6e 27 74 20 77 6f 72 6b 2e 0a 23 0a 23  Didn't work..#.#
23e0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61   do_test pagerfa
23f0: 75 6c 74 2d 36 2d 70 72 65 31 20 7b 0a 23 20 20  ult-6-pre1 {.#  
2400: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
2410: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 23 20 20 20  _and_reopen.#   
2420: 65 78 65 63 73 71 6c 20 7b 0a 23 20 20 20 20 20  execsql {.#     
2430: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2440: 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
2450: 79 29 29 3b 0a 23 20 20 20 20 20 49 4e 53 45 52  y));.#     INSER
2460: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2470: 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (1, randomblob(1
2480: 35 30 31 29 29 3b 0a 23 20 20 20 20 20 49 4e 53  501));.#     INS
2490: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
24a0: 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(2, randomblob
24b0: 28 31 35 30 32 29 29 3b 0a 23 20 20 20 20 20 49  (1502));.#     I
24c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
24d0: 4c 55 45 53 28 33 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(3, randombl
24e0: 6f 62 28 31 35 30 33 29 29 3b 0a 23 20 20 20 20  ob(1503));.#    
24f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2500: 56 41 4c 55 45 53 28 34 2c 20 72 61 6e 64 6f 6d  VALUES(4, random
2510: 62 6c 6f 62 28 31 35 30 34 29 29 3b 0a 23 20 20  blob(1504));.#  
2520: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2530: 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45 43  1 .#       SELEC
2540: 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  T x, randomblob(
2550: 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43 54  1500+oid+(SELECT
2560: 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20 74   max(oid) FROM t
2570: 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20 20  1)) FROM t1;.#  
2580: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2590: 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45 43  1 .#       SELEC
25a0: 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  T x, randomblob(
25b0: 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43 54  1500+oid+(SELECT
25c0: 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20 74   max(oid) FROM t
25d0: 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20 20  1)) FROM t1;.#  
25e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
25f0: 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45 43  1 .#       SELEC
2600: 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  T x, randomblob(
2610: 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43 54  1500+oid+(SELECT
2620: 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20 74   max(oid) FROM t
2630: 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20 20  1)) FROM t1;.#  
2640: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2650: 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45 43  1 .#       SELEC
2660: 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  T x, randomblob(
2670: 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43 54  1500+oid+(SELECT
2680: 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20 74   max(oid) FROM t
2690: 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20 20  1)) FROM t1;.#  
26a0: 20 7d 0a 23 20 20 20 66 61 75 6c 74 73 69 6d 5f   }.#   faultsim_
26b0: 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 23  save_and_close.#
26c0: 20 7d 20 7b 7d 0a 23 20 64 6f 5f 66 61 75 6c 74   } {}.# do_fault
26d0: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
26e0: 75 6c 74 2d 36 20 2d 70 72 65 70 20 7b 0a 23 20  ult-6 -prep {.# 
26f0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
2700: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 23 20  re_and_reopen.# 
2710: 7d 20 2d 62 6f 64 79 20 7b 0a 23 20 20 20 65 78  } -body {.#   ex
2720: 65 63 73 71 6c 20 7b 20 0a 23 20 20 20 20 20 42  ecsql { .#     B
2730: 45 47 49 4e 3b 0a 23 20 20 20 20 20 20 20 55 50  EGIN;.#       UP
2740: 44 41 54 45 20 74 31 20 53 45 54 20 78 3d 78 2b  DATE t1 SET x=x+
2750: 34 20 57 48 45 52 45 20 78 3d 31 3b 0a 23 20 20  4 WHERE x=1;.#  
2760: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
2770: 6e 65 3b 0a 23 20 20 20 20 20 20 20 20 20 55 50  ne;.#         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 32 3b 0a 23 20 20  4 WHERE x=2;.#  
27a0: 20 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54         SAVEPOINT
27b0: 20 74 68 72 65 65 3b 0a 23 20 20 20 20 20 20 20   three;.#       
27c0: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
27d0: 54 20 78 3d 78 2b 34 20 57 48 45 52 45 20 78 3d  T x=x+4 WHERE x=
27e0: 33 3b 0a 23 20 20 20 20 20 20 20 20 20 20 20 53  3;.#           S
27f0: 41 56 45 50 4f 49 4e 54 20 66 6f 75 72 3b 0a 23  AVEPOINT four;.#
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 50 44               UPD
2810: 41 54 45 20 74 31 20 53 45 54 20 78 3d 78 2b 34  ATE t1 SET x=x+4
2820: 20 57 48 45 52 45 20 78 3d 34 3b 0a 23 20 20 20   WHERE x=4;.#   
2830: 20 20 20 20 20 20 52 45 4c 45 41 53 45 20 74 68        RELEASE th
2840: 72 65 65 3b 0a 23 20 20 20 20 20 43 4f 4d 4d 49  ree;.#     COMMI
2850: 54 3b 0a 23 20 20 20 20 20 53 45 4c 45 43 54 20  T;.#     SELECT 
2860: 44 49 53 54 49 4e 43 54 20 78 20 46 52 4f 4d 20  DISTINCT x FROM 
2870: 74 31 3b 0a 23 20 20 20 7d 0a 23 20 7d 20 2d 74  t1;.#   }.# } -t
2880: 65 73 74 20 7b 0a 23 20 20 20 66 61 75 6c 74 73  est {.#   faults
2890: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
28a0: 30 20 7b 35 20 36 20 37 20 38 7d 7d 0a 23 20 20  0 {5 6 7 8}}.#  
28b0: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
28c0: 69 74 79 5f 63 68 65 63 6b 0a 23 20 7d 0a 23 0a  ity_check.# }.#.
28d0: 0a 23 20 54 68 69 73 20 69 73 20 64 65 73 69 67  .# This is desig
28e0: 6e 65 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20 61  ned to provoke a
28f0: 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
2900: 20 74 68 65 20 70 61 67 65 72 20 63 6f 64 65 3a   the pager code:
2910: 0a 23 0a 23 20 49 66 20 61 6e 20 65 72 72 6f 72  .#.# If an error
2920: 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20   (specifically, 
2930: 61 20 46 55 4c 4c 20 6f 72 20 49 4f 45 52 52 20  a FULL or IOERR 
2940: 65 72 72 6f 72 29 20 6f 63 63 75 72 73 20 77 68  error) occurs wh
2950: 69 6c 65 20 77 72 69 74 69 6e 67 20 61 0a 23 20  ile writing a.# 
2960: 64 69 72 74 79 20 70 61 67 65 20 74 6f 20 74 68  dirty page to th
2970: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
2980: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
2990: 70 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 70 61  p memory, the pa
29a0: 67 65 72 20 65 6e 74 65 72 73 0a 23 20 74 68 65  ger enters.# the
29b0: 20 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 20   "error state". 
29c0: 41 6e 20 49 4f 20 65 72 72 6f 72 20 63 61 75 73  An IO error caus
29d0: 65 73 20 53 51 4c 69 74 65 20 74 6f 20 72 6f 6c  es SQLite to rol
29e0: 6c 20 62 61 63 6b 20 74 68 65 20 63 75 72 72 65  l back the curre
29f0: 6e 74 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  nt.# transaction
2a00: 20 28 65 78 69 74 69 6e 67 20 74 68 65 20 65 72   (exiting the er
2a10: 72 6f 72 20 73 74 61 74 65 29 2e 20 41 20 46 55  ror state). A FU
2a20: 4c 4c 20 65 72 72 6f 72 2c 20 68 6f 77 65 76 65  LL error, howeve
2a30: 72 2c 20 6d 61 79 20 6f 6e 6c 79 0a 23 20 72 6f  r, may only.# ro
2a40: 6c 6c 62 61 63 6b 20 74 68 65 20 63 75 72 72 65  llback the curre
2a50: 6e 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a  nt statement..#.
2a60: 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  # This block tes
2a70: 74 73 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 20  ts that nothing 
2a80: 67 6f 65 73 20 77 72 6f 6e 67 20 69 66 20 61 20  goes wrong if a 
2a90: 46 55 4c 4c 20 65 72 72 6f 72 20 6f 63 63 75 72  FULL error occur
2aa0: 73 20 77 68 69 6c 65 0a 23 20 77 72 69 74 69 6e  s while.# writin
2ab0: 67 20 61 20 64 69 72 74 79 20 70 61 67 65 20 6f  g a dirty page o
2ac0: 75 74 20 74 6f 20 66 72 65 65 20 6d 65 6d 6f 72  ut to free memor
2ad0: 79 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  y from within a 
2ae0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 68  statement that h
2af0: 61 73 0a 23 20 6f 70 65 6e 65 64 20 61 20 73 74  as.# opened a st
2b00: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
2b10: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ion..#.do_test p
2b20: 61 67 65 72 66 61 75 6c 74 2d 37 2d 70 72 65 31  agerfault-7-pre1
2b30: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
2b40: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
2b50: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2b60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
2b70: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
2b80: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 42  Y KEY, b);.    B
2b90: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
2ba0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
2bb0: 53 28 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c  S(NULL, randombl
2bc0: 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20 20  ob(1500));.     
2bd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
2be0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 72 61 6e  VALUES(NULL, ran
2bf0: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2c00: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2c10: 4f 20 74 32 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t2 SELECT NULL
2c20: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
2c30: 30 29 20 46 52 4f 4d 20 74 32 3b 20 20 20 20 2d  0) FROM t2;    -
2c40: 2d 20 20 34 0a 20 20 20 20 20 20 49 4e 53 45 52  -  4.      INSER
2c50: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
2c60: 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f   NULL, randomblo
2c70: 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 32 3b  b(1500) FROM t2;
2c80: 20 20 20 20 2d 2d 20 20 38 0a 20 20 20 20 20 20      --  8.      
2c90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
2ca0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64  ELECT NULL, rand
2cb0: 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
2cc0: 4d 20 74 32 3b 20 20 20 20 2d 2d 20 31 36 0a 20  M t2;    -- 16. 
2cd0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2ce0: 20 74 32 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t2 SELECT NULL,
2cf0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
2d00: 29 20 46 52 4f 4d 20 74 32 3b 20 20 20 20 2d 2d  ) FROM t2;    --
2d10: 20 33 32 0a 20 20 20 20 20 20 49 4e 53 45 52 54   32.      INSERT
2d20: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
2d30: 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  NULL, randomblob
2d40: 28 31 35 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  (1500) FROM t2; 
2d50: 20 20 20 2d 2d 20 36 34 0a 20 20 20 20 43 4f 4d     -- 64.    COM
2d60: 4d 49 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20  MIT;.    CREATE 
2d70: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
2d80: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
2d90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2da0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
2db0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
2dc0: 74 32 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  t2;.  }.  faults
2dd0: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
2de0: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
2df0: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
2e00: 6c 74 2d 37 20 2d 70 72 65 70 20 7b 0a 20 20 66  lt-7 -prep {.  f
2e10: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
2e20: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
2e30: 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  csql { .    PRAG
2e40: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
2e50: 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  10;.    BEGIN;. 
2e60: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
2e70: 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f  ET b = randomblo
2e80: 62 28 31 35 30 30 29 3b 0a 20 20 7d 0a 7d 20 2d  b(1500);.  }.} -
2e90: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
2ea0: 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45 54   { UPDATE t1 SET
2eb0: 20 61 20 3d 20 36 35 2c 20 62 20 3d 20 72 61 6e   a = 65, b = ran
2ec0: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 57 48  domblob(1500) WH
2ed0: 45 52 45 20 28 61 2b 31 29 3e 32 30 30 20 7d 0a  ERE (a+1)>200 }.
2ee0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
2ef0: 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75  .} -test {.  fau
2f00: 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c  ltsim_test_resul
2f10: 74 20 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74  t {0 {}}.  fault
2f20: 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  sim_integrity_ch
2f30: 65 63 6b 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  eck.}..do_test p
2f40: 61 67 65 72 66 61 75 6c 74 2d 38 2d 70 72 65 31  agerfault-8-pre1
2f50: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
2f60: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
2f70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2f80: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
2f90: 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52 45 41  um = 1;.    CREA
2fa0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
2fb0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2fc0: 59 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49 4e  Y, b);.    BEGIN
2fd0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2fe0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55  NTO t1 VALUES(NU
2ff0: 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  LL, randomblob(1
3000: 35 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  500));.      INS
3010: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3020: 45 53 28 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62  ES(NULL, randomb
3030: 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20  lob(1500));.    
3040: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3050: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61   SELECT NULL, ra
3060: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
3070: 52 4f 4d 20 74 31 3b 20 20 20 20 2d 2d 20 20 34  ROM t1;    --  4
3080: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3090: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
30a0: 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  L, randomblob(15
30b0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
30c0: 2d 2d 20 20 38 0a 20 20 20 20 20 20 49 4e 53 45  --  8.      INSE
30d0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
30e0: 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c  T NULL, randombl
30f0: 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
3100: 3b 20 20 20 20 2d 2d 20 31 36 0a 20 20 20 20 20  ;    -- 16.     
3110: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3120: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e  SELECT NULL, ran
3130: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
3140: 4f 4d 20 74 31 3b 20 20 20 20 2d 2d 20 33 32 0a  OM t1;    -- 32.
3150: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3160: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
3170: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
3180: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 2d  0) FROM t1;    -
3190: 2d 20 36 34 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  - 64.    COMMIT;
31a0: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
31b0: 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 20  save_and_close. 
31c0: 20 73 65 74 20 66 69 6c 65 73 69 7a 65 20 5b 66   set filesize [f
31d0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
31e0: 5d 0a 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 7d 20  ].  set {} {}.} 
31f0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
3200: 66 61 75 6c 74 2d 38 2d 70 72 65 32 20 7b 0a 20  fault-8-pre2 {. 
3210: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
3220: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
3230: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  xecsql { DELETE 
3240: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3e  FROM t1 WHERE a>
3250: 33 32 20 7d 0a 20 20 65 78 70 72 20 7b 5b 66 69  32 }.  expr {[fi
3260: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
3270: 20 3c 20 24 66 69 6c 65 73 69 7a 65 7d 0a 7d 20   < $filesize}.} 
3280: 7b 31 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  {1}.do_faultsim_
3290: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
32a0: 38 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  8 -prep {.  faul
32b0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
32c0: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
32d0: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
32e0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
32f0: 74 31 20 57 48 45 52 45 20 61 3e 33 32 3b 0a 20  t1 WHERE a>32;. 
3300: 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65   }.} -body {.  e
3310: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  xecsql COMMIT.} 
3320: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
3330: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
3340: 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d  0 {}}.  faultsim
3350: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
3360: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
33b0: 20 54 68 69 73 20 74 65 73 74 20 63 61 73 65 20   This test case 
33c0: 69 73 20 73 70 65 63 69 61 6c 6c 79 20 64 65 73  is specially des
33d0: 69 67 6e 65 64 20 73 6f 20 74 68 61 74 20 64 75  igned so that du
33e0: 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
33f0: 20 0a 23 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 20   .# rollback, a 
3400: 6e 65 77 20 63 61 63 68 65 20 65 6e 74 72 79 20  new cache entry 
3410: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
3420: 64 20 28 73 65 65 20 63 6f 6d 6d 65 6e 74 73 20  d (see comments 
3430: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 23 20 74 68  surrounding.# th
3440: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
3450: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20  3PagerAcquire() 
3460: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
3470: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
3480: 61 67 65 28 29 0a 23 20 66 6f 72 20 64 65 74 61  age().# for deta
3490: 69 6c 73 29 2e 20 54 65 73 74 20 74 68 65 20 65  ils). Test the e
34a0: 66 66 65 63 74 73 20 6f 66 20 69 6e 6a 65 63 74  ffects of inject
34b0: 69 6e 67 20 61 6e 20 4f 4f 4d 20 61 74 20 74 68  ing an OOM at th
34c0: 69 73 20 70 6f 69 6e 74 2e 0a 23 0a 64 6f 5f 74  is point..#.do_t
34d0: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 39  est pagerfault-9
34e0: 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73  -pre1 {.  faults
34f0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
3500: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
3510: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
3520: 5f 76 61 63 75 75 6d 20 3d 20 69 6e 63 72 65 6d  _vacuum = increm
3530: 65 6e 74 61 6c 3b 0a 20 20 20 20 43 52 45 41 54  ental;.    CREAT
3540: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
3550: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3560: 74 32 28 79 29 3b 0a 20 20 20 20 43 52 45 41 54  t2(y);.    CREAT
3570: 45 20 54 41 42 4c 45 20 74 33 28 7a 29 3b 0a 0a  E TABLE t3(z);..
3580: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3590: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
35a0: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
35b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
35c0: 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
35d0: 28 39 30 30 29 29 3b 0a 20 20 20 20 44 45 4c 45  (900));.    DELE
35e0: 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  TE FROM t1;.  }.
35f0: 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f    faultsim_save_
3600: 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64  and_close.} {}.d
3610: 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20  o_faultsim_test 
3620: 70 61 67 65 72 66 61 75 6c 74 2d 39 2e 31 20 2d  pagerfault-9.1 -
3630: 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69  prep {.  faultsi
3640: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3650: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
3660: 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
3670: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3680: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
3690: 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 20  lob(900));.     
36a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
36b0: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
36c0: 62 28 39 30 30 29 29 3b 0a 20 20 20 20 20 20 44  b(900));.      D
36d0: 52 4f 50 20 54 41 42 4c 45 20 74 33 3b 0a 20 20  ROP TABLE t3;.  
36e0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
36f0: 32 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49  2;.      SAVEPOI
3700: 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20 20 20  NT abc;.        
3710: 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74  PRAGMA increment
3720: 61 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 7d 0a 7d  al_vacuum;.  }.}
3730: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
3740: 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  ql {.    ROLLBAC
3750: 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f  K TO abc;.    CO
3760: 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41  MMIT;.    PRAGMA
3770: 20 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74 0a   freelist_count.
3780: 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20    }.} -test {.  
3790: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
37a0: 73 75 6c 74 20 7b 30 20 32 7d 0a 20 20 66 61 75  sult {0 2}.  fau
37b0: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
37c0: 63 68 65 63 6b 0a 0a 20 20 73 65 74 20 73 6c 20  check..  set sl 
37d0: 5b 64 62 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54  [db one { SELECT
37e0: 20 43 4f 41 4c 45 53 43 45 28 73 75 6d 28 6c 65   COALESCE(sum(le
37f0: 6e 67 74 68 28 78 29 29 2c 20 27 6e 75 6c 6c 27  ngth(x)), 'null'
3800: 29 20 46 52 4f 4d 20 74 31 20 7d 5d 0a 20 20 69  ) FROM t1 }].  i
3810: 66 20 7b 24 73 6c 21 3d 22 6e 75 6c 6c 22 20 26  f {$sl!="null" &
3820: 26 20 24 73 6c 21 3d 31 38 30 30 7d 20 7b 20 0a  & $sl!=1800} { .
3830: 20 20 20 20 65 72 72 6f 72 20 22 43 6f 6e 74 65      error "Conte
3840: 6e 74 20 6c 6f 6f 6b 73 20 6e 6f 20 67 6f 6f 64  nt looks no good
3850: 2e 2e 2e 20 28 24 73 6c 29 22 20 0a 20 20 7d 0a  ... ($sl)" .  }.
3860: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
38b0: 54 65 73 74 20 66 61 75 6c 74 20 69 6e 6a 65 63  Test fault injec
38c0: 74 69 6f 6e 20 77 69 74 68 20 61 20 74 65 6d 70  tion with a temp
38d0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66  orary database f
38e0: 69 6c 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20 76  ile..#.foreach v
38f0: 20 7b 61 20 62 7d 20 7b 0a 20 20 64 6f 5f 66 61   {a b} {.  do_fa
3900: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
3910: 72 66 61 75 6c 74 2d 31 30 24 76 20 2d 70 72 65  rfault-10$v -pre
3920: 70 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  p {.    sqlite3 
3930: 64 62 20 22 22 0a 20 20 20 20 64 62 20 66 75 6e  db "".    db fun
3940: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
3950: 69 6e 67 3b 0a 20 20 20 20 65 78 65 63 73 71 6c  ing;.    execsql
3960: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
3970: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3980: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
3990: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
39a0: 4c 45 20 78 78 28 61 2c 20 62 2c 20 55 4e 49 51  LE xx(a, b, UNIQ
39b0: 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 20  UE(a, b));.     
39c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
39d0: 78 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  x VALUES(a_strin
39e0: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
39f0: 28 32 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20  (200));.        
3a00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 78 20 53  INSERT INTO xx S
3a10: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
3a20: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30  00), a_string(20
3a30: 30 29 20 46 52 4f 4d 20 78 78 3b 0a 20 20 20 20  0) FROM xx;.    
3a40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3a50: 78 78 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  xx SELECT a_stri
3a60: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3a70: 67 28 32 30 30 29 20 46 52 4f 4d 20 78 78 3b 0a  g(200) FROM xx;.
3a80: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
3a90: 4e 54 4f 20 78 78 20 53 45 4c 45 43 54 20 61 5f  NTO xx SELECT a_
3aa0: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
3ab0: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
3ac0: 78 78 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  xx;.        INSE
3ad0: 52 54 20 49 4e 54 4f 20 78 78 20 53 45 4c 45 43  RT INTO xx SELEC
3ae0: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
3af0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46   a_string(200) F
3b00: 52 4f 4d 20 78 78 3b 0a 20 20 20 20 20 20 43 4f  ROM xx;.      CO
3b10: 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  MMIT;.    }.  } 
3b20: 2d 62 6f 64 79 20 7b 0a 20 20 20 20 65 78 65 63  -body {.    exec
3b30: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 78 78 20  sql { UPDATE xx 
3b40: 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67  SET a = a_string
3b50: 28 33 30 30 29 20 7d 0a 20 20 7d 20 2d 74 65 73  (300) }.  } -tes
3b60: 74 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d  t {.    faultsim
3b70: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
3b80: 7b 7d 7d 0a 20 20 20 20 69 66 20 7b 24 3a 3a 76  {}}.    if {$::v
3b90: 20 3d 3d 20 22 62 22 7d 20 7b 20 65 78 65 63 73   == "b"} { execs
3ba0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
3bb0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43  nal_mode = TRUNC
3bc0: 41 54 45 20 7d 20 7d 0a 20 20 20 20 66 61 75 6c  ATE } }.    faul
3bd0: 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63  tsim_integrity_c
3be0: 68 65 63 6b 0a 20 20 20 20 66 61 75 6c 74 73 69  heck.    faultsi
3bf0: 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  m_integrity_chec
3c00: 6b 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  k.  }.}..#------
3c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c50: 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c 74  ---.# Test fault
3c60: 20 69 6e 6a 65 63 74 69 6f 6e 20 77 69 74 68 20   injection with 
3c70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
3c80: 70 6f 69 6e 74 73 20 28 73 61 76 65 70 6f 69 6e  points (savepoin
3c90: 74 73 20 63 72 65 61 74 65 64 0a 23 20 77 68 65  ts created.# whe
3ca0: 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 63 6f  n a SAVEPOINT co
3cb0: 6d 6d 61 6e 64 20 69 73 20 65 78 65 63 75 74 65  mmand is execute
3cc0: 64 20 6f 75 74 73 69 64 65 20 6f 66 20 61 6e 79  d outside of any
3cd0: 20 6f 74 68 65 72 20 73 61 76 65 70 6f 69 6e 74   other savepoint
3ce0: 0a 23 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  .# or transactio
3cf0: 6e 20 63 6f 6e 74 65 78 74 29 2e 0a 23 0a 64 6f  n context)..#.do
3d00: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
3d10: 2d 39 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c  -9-pre1 {.  faul
3d20: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
3d30: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
3d40: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
3d50: 6e 67 3b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ng;.  execsql {.
3d60: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
3d70: 76 61 63 75 75 6d 20 3d 20 6f 6e 3b 0a 20 20 20  vacuum = on;.   
3d80: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
3d90: 28 78 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20  (x UNIQUE);.    
3da0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
3db0: 79 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43  y UNIQUE);.    C
3dc0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 7a  REATE TABLE t3(z
3dd0: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 42 45   UNIQUE);.    BE
3de0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
3df0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3e00: 28 61 5f 73 74 72 69 6e 67 28 32 30 32 29 29 3b  (a_string(202));
3e10: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3e20: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73  TO t2 VALUES(a_s
3e30: 74 72 69 6e 67 28 32 30 33 29 29 3b 0a 20 20 20  tring(203));.   
3e40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3e50: 33 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  3 VALUES(a_strin
3e60: 67 28 32 30 34 29 29 3b 0a 20 20 20 20 20 20 49  g(204));.      I
3e70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
3e80: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
3e90: 32 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  2) FROM t1;.    
3ea0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3eb0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
3ec0: 28 32 30 33 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (203) FROM t1;. 
3ed0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3ee0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
3ef0: 69 6e 67 28 32 30 34 29 20 46 52 4f 4d 20 74 31  ing(204) FROM t1
3f00: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3f10: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
3f20: 73 74 72 69 6e 67 28 32 30 35 29 20 46 52 4f 4d  string(205) FROM
3f30: 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t1;.      INSER
3f40: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
3f50: 20 61 5f 73 74 72 69 6e 67 28 6c 65 6e 67 74 68   a_string(length
3f60: 28 78 29 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  (x)) FROM t1;.  
3f70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3f80: 74 33 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t3 SELECT a_stri
3f90: 6e 67 28 6c 65 6e 67 74 68 28 78 29 29 20 46 52  ng(length(x)) FR
3fa0: 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49  OM t1;.    COMMI
3fb0: 54 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69  T;.  }.  faultsi
3fc0: 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65  m_save_and_close
3fd0: 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69  .} {}.do_faultsi
3fe0: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
3ff0: 74 2d 31 31 20 2d 70 72 65 70 20 7b 0a 20 20 66  t-11 -prep {.  f
4000: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
4010: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
4020: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61  csql { PRAGMA ca
4030: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a  che_size = 10 }.
4040: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
4050: 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f  sql {.    SAVEPO
4060: 49 4e 54 20 74 72 61 6e 73 3b 0a 20 20 20 20 20  INT trans;.     
4070: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 79   UPDATE t2 SET y
4080: 20 3d 20 79 7c 7c 27 32 27 3b 0a 20 20 20 20 20   = y||'2';.     
4090: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
40a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
40b0: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
40c0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 52 4f 4c 4c  ROM t1;.    ROLL
40d0: 42 41 43 4b 20 54 4f 20 74 72 61 6e 73 3b 0a 20  BACK TO trans;. 
40e0: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
40f0: 20 78 20 3d 20 78 7c 7c 27 33 27 3b 0a 20 20 20   x = x||'3';.   
4100: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
4110: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4120: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
4130: 4d 20 74 33 3b 0a 20 20 20 20 52 45 4c 45 41 53  M t3;.    RELEAS
4140: 45 20 74 72 61 6e 73 3b 0a 20 20 7d 0a 7d 20 2d  E trans;.  }.} -
4150: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
4160: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
4170: 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f   {}}.  faultsim_
4180: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
4190: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
41a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
41e0: 20 54 65 73 74 20 66 61 75 6c 74 20 69 6e 6a 65   Test fault inje
41f0: 63 74 69 6f 6e 20 77 68 65 6e 20 77 72 69 74 69  ction when writi
4200: 6e 67 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  ng to a database
4210: 20 66 69 6c 65 20 74 68 61 74 20 72 65 73 69 64   file that resid
4220: 65 73 20 6f 6e 0a 23 20 61 20 66 69 6c 65 2d 73  es on.# a file-s
4230: 79 73 74 65 6d 20 77 69 74 68 20 61 20 73 65 63  ystem with a sec
4240: 74 6f 72 2d 73 69 7a 65 20 6c 61 72 67 65 72 20  tor-size larger 
4250: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
4260: 65 20 70 61 67 65 2d 73 69 7a 65 2e 0a 23 0a 64  e page-size..#.d
4270: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
4280: 74 2d 31 32 2d 70 72 65 31 20 7b 0a 20 20 74 65  t-12-pre1 {.  te
4290: 73 74 76 66 73 20 73 73 5f 6c 61 79 65 72 20 2d  stvfs ss_layer -
42a0: 64 65 66 61 75 6c 74 20 31 0a 20 20 73 73 5f 6c  default 1.  ss_l
42b0: 61 79 65 72 20 73 65 63 74 6f 72 73 69 7a 65 20  ayer sectorsize 
42c0: 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f  4096.  faultsim_
42d0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
42e0: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
42f0: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 0a  ring a_string;..
4300: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4310: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
4320: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41   = 1024;.    PRA
4330: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
4340: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
4350: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
4360: 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45 47 49  e = 10;.    BEGI
4370: 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  N;.      CREATE 
4380: 54 41 42 4c 45 20 74 31 28 78 2c 20 79 20 55 4e  TABLE t1(x, y UN
4390: 49 51 55 45 29 3b 0a 20 20 20 20 20 20 49 4e 53  IQUE);.      INS
43a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
43b0: 45 53 28 61 5f 73 74 72 69 6e 67 28 33 33 33 29  ES(a_string(333)
43c0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 34 34 29 29  , a_string(444))
43d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
43e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
43f0: 73 74 72 69 6e 67 28 33 33 33 2b 72 6f 77 69 64  string(333+rowid
4400: 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 34 34 2b  ), a_string(444+
4410: 72 6f 77 69 64 29 20 46 52 4f 4d 20 74 31 3b 0a  rowid) FROM t1;.
4420: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4430: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
4440: 72 69 6e 67 28 33 33 33 2b 72 6f 77 69 64 29 2c  ring(333+rowid),
4450: 20 61 5f 73 74 72 69 6e 67 28 34 34 34 2b 72 6f   a_string(444+ro
4460: 77 69 64 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  wid) FROM t1;.  
4470: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4480: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
4490: 6e 67 28 33 33 33 2b 72 6f 77 69 64 29 2c 20 61  ng(333+rowid), a
44a0: 5f 73 74 72 69 6e 67 28 34 34 34 2b 72 6f 77 69  _string(444+rowi
44b0: 64 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  d) FROM t1;.    
44c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
44d0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
44e0: 28 33 33 33 2b 72 6f 77 69 64 29 2c 20 61 5f 73  (333+rowid), a_s
44f0: 74 72 69 6e 67 28 34 34 34 2b 72 6f 77 69 64 29  tring(444+rowid)
4500: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
4510: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
4520: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34  ELECT a_string(4
4530: 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 35 29  4), a_string(55)
4540: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31   FROM t1 LIMIT 1
4550: 33 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  3;.    COMMIT;. 
4560: 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61   }.  faultsim_sa
4570: 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b  ve_and_close.} {
4580: 7d 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74  }..do_faultsim_t
4590: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31  est pagerfault-1
45a0: 32 61 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75  2a -prep {.  fau
45b0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
45c0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
45d0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68  ql { PRAGMA cach
45e0: 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20  e_size = 10 }.  
45f0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
4600: 20 61 5f 73 74 72 69 6e 67 3b 0a 7d 20 2d 62 6f   a_string;.} -bo
4610: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
4620: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
4630: 45 54 20 78 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET x = a_string(
4640: 6c 65 6e 67 74 68 28 78 29 29 2c 20 79 20 3d 20  length(x)), y = 
4650: 61 5f 73 74 72 69 6e 67 28 6c 65 6e 67 74 68 28  a_string(length(
4660: 79 29 29 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74  y));.  }.} -test
4670: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65   {.  faultsim_te
4680: 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d  st_result {0 {}}
4690: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65  .  faultsim_inte
46a0: 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 64  grity_check.}..d
46b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
46c0: 74 2d 31 32 2d 70 72 65 32 20 7b 0a 20 20 66 61  t-12-pre2 {.  fa
46d0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
46e0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
46f0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
4700: 20 54 41 42 4c 45 20 74 32 20 41 53 20 53 45 4c   TABLE t2 AS SEL
4710: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 49  ECT * FROM t1 LI
4720: 4d 49 54 20 31 30 3b 0a 20 20 7d 0a 20 20 66 61  MIT 10;.  }.  fa
4730: 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f  ultsim_save_and_
4740: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61  close.} {}.do_fa
4750: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
4760: 72 66 61 75 6c 74 2d 31 32 62 20 2d 70 72 65 70  rfault-12b -prep
4770: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
4780: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
4790: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
47a0: 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 20 20  ing a_string;.  
47b0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
47c0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d   * FROM t1 }.} -
47d0: 62 6f 64 79 20 7b 0a 20 20 73 65 74 20 73 71 6c  body {.  set sql
47e0: 28 31 29 20 7b 20 55 50 44 41 54 45 20 74 32 20  (1) { UPDATE t2 
47f0: 53 45 54 20 78 20 3d 20 61 5f 73 74 72 69 6e 67  SET x = a_string
4800: 28 32 38 30 29 20 7d 0a 20 20 73 65 74 20 73 71  (280) }.  set sq
4810: 6c 28 32 29 20 7b 20 55 50 44 41 54 45 20 74 31  l(2) { UPDATE t1
4820: 20 53 45 54 20 78 20 3d 20 61 5f 73 74 72 69 6e   SET x = a_strin
4830: 67 28 32 38 30 29 20 57 48 45 52 45 20 72 6f 77  g(280) WHERE row
4840: 69 64 20 3d 20 35 20 7d 0a 0a 20 20 64 62 20 65  id = 5 }..  db e
4850: 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 72 6f 77  val { SELECT row
4860: 69 64 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54  id FROM t1 LIMIT
4870: 20 32 20 7d 20 7b 20 64 62 20 65 76 61 6c 20 24   2 } { db eval $
4880: 73 71 6c 28 24 72 6f 77 69 64 29 20 7d 0a 0a 7d  sql($rowid) }..}
4890: 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74   -test {.  fault
48a0: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
48b0: 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69  {0 {}}.  faultsi
48c0: 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  m_integrity_chec
48d0: 6b 0a 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62 20  k.}..catch { db 
48e0: 63 6c 6f 73 65 20 7d 0a 73 73 5f 6c 61 79 65 72  close }.ss_layer
48f0: 20 64 65 6c 65 74 65 0a 0a 0a 23 2d 2d 2d 2d 2d   delete...#-----
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4940: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c  ----.# Test faul
4950: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 77 68 65 6e  t injection when
4960: 20 53 51 4c 69 74 65 20 6f 70 65 6e 73 20 61 20   SQLite opens a 
4970: 64 61 74 61 62 61 73 65 20 77 68 65 72 65 20 74  database where t
4980: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 23  he size of the.#
4990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
49a0: 73 20 7a 65 72 6f 20 62 79 74 65 73 20 62 75 74  s zero bytes but
49b0: 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79 69 6e   the accompanyin
49c0: 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  g journal file i
49d0: 73 20 6c 61 72 67 65 72 0a 23 20 74 68 61 6e 20  s larger.# than 
49e0: 74 68 61 74 2e 20 49 6e 20 74 68 69 73 20 73 63  that. In this sc
49f0: 65 6e 61 72 69 6f 20 53 51 4c 69 74 65 20 73 68  enario SQLite sh
4a00: 6f 75 6c 64 20 64 65 6c 65 74 65 20 74 68 65 20  ould delete the 
4a10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 23 20  journal file .# 
4a20: 77 69 74 68 6f 75 74 20 72 6f 6c 6c 69 6e 67 20  without rolling 
4a30: 69 74 20 62 61 63 6b 2c 20 65 76 65 6e 20 69 66  it back, even if
4a40: 20 69 74 20 69 73 20 69 6e 20 61 6c 6c 20 6f 74   it is in all ot
4a50: 68 65 72 20 72 65 73 70 65 63 74 73 20 61 20 76  her respects a v
4a60: 61 6c 69 64 0a 23 20 68 6f 74 2d 6a 6f 75 72 6e  alid.# hot-journ
4a70: 61 6c 20 66 69 6c 65 2e 0a 23 0a 64 6f 5f 74 65  al file..#.do_te
4a80: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 33  st pagerfault-13
4a90: 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73  -pre1 {.  faults
4aa0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
4ab0: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
4ac0: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
4ad0: 3b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ;.  execsql {.  
4ae0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
4af0: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
4b00: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
4b10: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4b20: 31 28 78 2c 20 79 20 55 4e 49 51 55 45 29 3b 0a  1(x, y UNIQUE);.
4b30: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4b40: 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74  O t1 VALUES(a_st
4b50: 72 69 6e 67 28 33 33 33 29 2c 20 61 5f 73 74 72  ring(333), a_str
4b60: 69 6e 67 28 34 34 34 29 29 3b 0a 20 20 20 20 43  ing(444));.    C
4b70: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20  OMMIT;.  }.  db 
4b80: 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 64 65 6c  close.  file del
4b90: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
4ba0: 64 62 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61  db.  faultsim_sa
4bb0: 76 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74  ve.} {}.do_fault
4bc0: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
4bd0: 75 6c 74 2d 31 33 20 2d 70 72 65 70 20 7b 0a 20  ult-13 -prep {. 
4be0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
4bf0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d  e_and_reopen.} -
4c00: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
4c10: 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
4c20: 78 78 28 61 2c 20 62 29 20 7d 0a 7d 20 2d 74 65  xx(a, b) }.} -te
4c30: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
4c40: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b  test_result {0 {
4c50: 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}.}..#---------
4c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ca0: 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c 74 20  --.# Test fault 
4cb0: 69 6e 6a 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61  injection into a
4cc0: 20 73 6d 61 6c 6c 20 62 61 63 6b 75 70 20 6f 70   small backup op
4cd0: 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65  eration..#.do_te
4ce0: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 34  st pagerfault-14
4cf0: 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73  -pre1 {.  faults
4d00: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
4d10: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
4d20: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
4d30: 3b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ;.  execsql {.  
4d40: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
4d50: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
4d60: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
4d70: 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20  t.db2' AS two;. 
4d80: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
4d90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4da0: 78 2c 20 79 20 55 4e 49 51 55 45 29 3b 0a 20 20  x, y UNIQUE);.  
4db0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
4dc0: 20 74 77 6f 2e 74 32 28 78 2c 20 79 20 55 4e 49   two.t2(x, y UNI
4dd0: 51 55 45 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  QUE);.      INSE
4de0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
4df0: 53 28 61 5f 73 74 72 69 6e 67 28 33 33 33 29 2c  S(a_string(333),
4e00: 20 61 5f 73 74 72 69 6e 67 28 34 34 34 29 29 3b   a_string(444));
4e10: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4e20: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73  TO t2 VALUES(a_s
4e30: 74 72 69 6e 67 28 33 33 33 29 2c 20 61 5f 73 74  tring(333), a_st
4e40: 72 69 6e 67 28 34 34 34 29 29 3b 0a 20 20 20 20  ring(444));.    
4e50: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 66 61  COMMIT;.  }.  fa
4e60: 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f  ultsim_save_and_
4e70: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 66  close.} {}..do_f
4e80: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
4e90: 65 72 66 61 75 6c 74 2d 31 34 61 20 2d 70 72 65  erfault-14a -pre
4ea0: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
4eb0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
4ec0: 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 69 66  n.} -body {.  if
4ed0: 20 7b 5b 63 61 74 63 68 20 7b 64 62 20 62 61 63   {[catch {db bac
4ee0: 6b 75 70 20 74 65 73 74 2e 64 62 32 7d 20 6d 73  kup test.db2} ms
4ef0: 67 5d 7d 20 7b 20 65 72 72 6f 72 20 5b 72 65 67  g]} { error [reg
4f00: 73 75 62 20 7b 2e 2a 3a 20 7d 20 24 6d 73 67 20  sub {.*: } $msg 
4f10: 7b 7d 5d 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  {}] }.} -test {.
4f20: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
4f30: 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 20 7b 31  result {0 {}} {1
4f40: 20 7b 7d 7d 20 7b 31 20 7b 53 51 4c 20 6c 6f 67   {}} {1 {SQL log
4f50: 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73  ic error or miss
4f60: 69 6e 67 20 64 61 74 61 62 61 73 65 7d 7d 0a 7d  ing database}}.}
4f70: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
4f80: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 34 62  t pagerfault-14b
4f90: 20 2d 70 72 65 70 20 7b 0a 20 20 63 61 74 63 68   -prep {.  catch
4fa0: 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 20   { db2 close }. 
4fb0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
4fc0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73  e_and_reopen.  s
4fd0: 71 6c 69 74 65 33 20 64 62 32 20 22 22 0a 20 20  qlite3 db2 "".  
4fe0: 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41 47 4d  db2 eval { PRAGM
4ff0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30  A page_size = 40
5000: 39 36 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45  96; CREATE TABLE
5010: 20 78 78 28 61 29 20 7d 0a 7d 20 2d 62 6f 64 79   xx(a) }.} -body
5020: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63   {.  sqlite3_bac
5030: 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64  kup B db2 main d
5040: 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20  b main.  B step 
5050: 32 30 30 0a 20 20 73 65 74 20 72 63 20 5b 42 20  200.  set rc [B 
5060: 66 69 6e 69 73 68 5d 0a 20 20 69 66 20 7b 5b 73  finish].  if {[s
5070: 74 72 69 6e 67 20 6d 61 74 63 68 20 53 51 4c 49  tring match SQLI
5080: 54 45 5f 49 4f 45 52 52 5f 2a 20 24 72 63 5d 7d  TE_IOERR_* $rc]}
5090: 20 7b 73 65 74 20 72 63 20 53 51 4c 49 54 45 5f   {set rc SQLITE_
50a0: 49 4f 45 52 52 7d 0a 20 20 69 66 20 7b 24 72 63  IOERR}.  if {$rc
50b0: 20 21 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 7d   != "SQLITE_OK"}
50c0: 20 7b 20 65 72 72 6f 72 20 5b 73 71 6c 69 74 65   { error [sqlite
50d0: 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20 24 72  3_test_errstr $r
50e0: 63 5d 20 7d 0a 20 20 73 65 74 20 7b 7d 20 7b 7d  c] }.  set {} {}
50f0: 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75  .} -test {.  fau
5100: 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c  ltsim_test_resul
5110: 74 20 7b 30 20 7b 7d 7d 0a 7d 0a 64 6f 5f 66 61  t {0 {}}.}.do_fa
5120: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
5130: 72 66 61 75 6c 74 2d 31 34 63 20 2d 70 72 65 70  rfault-14c -prep
5140: 20 7b 0a 20 20 63 61 74 63 68 20 7b 20 64 62 32   {.  catch { db2
5150: 20 63 6c 6f 73 65 20 7d 0a 20 20 66 61 75 6c 74   close }.  fault
5160: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5170: 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33  reopen.  sqlite3
5180: 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20   db2 test.db2.  
5190: 64 62 32 20 65 76 61 6c 20 7b 20 0a 20 20 20 20  db2 eval { .    
51a0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
51b0: 75 73 20 3d 20 6f 66 66 3b 20 0a 20 20 20 20 50  us = off; .    P
51c0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
51d0: 3d 20 34 30 39 36 3b 20 0a 20 20 20 20 43 52 45  = 4096; .    CRE
51e0: 41 54 45 20 54 41 42 4c 45 20 78 78 28 61 29 3b  ATE TABLE xx(a);
51f0: 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20  .  }.} -body {. 
5200: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
5210: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
5220: 69 6e 0a 20 20 42 20 73 74 65 70 20 32 30 30 0a  in.  B step 200.
5230: 20 20 73 65 74 20 72 63 20 5b 42 20 66 69 6e 69    set rc [B fini
5240: 73 68 5d 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e  sh].  if {[strin
5250: 67 20 6d 61 74 63 68 20 53 51 4c 49 54 45 5f 49  g match SQLITE_I
5260: 4f 45 52 52 5f 2a 20 24 72 63 5d 7d 20 7b 73 65  OERR_* $rc]} {se
5270: 74 20 72 63 20 53 51 4c 49 54 45 5f 49 4f 45 52  t rc SQLITE_IOER
5280: 52 7d 0a 20 20 69 66 20 7b 24 72 63 20 21 3d 20  R}.  if {$rc != 
5290: 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b 20 65  "SQLITE_OK"} { e
52a0: 72 72 6f 72 20 5b 73 71 6c 69 74 65 33 5f 74 65  rror [sqlite3_te
52b0: 73 74 5f 65 72 72 73 74 72 20 24 72 63 5d 20 7d  st_errstr $rc] }
52c0: 0a 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 7d 20 2d  .  set {} {}.} -
52d0: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
52e0: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
52f0: 20 7b 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20   {}}.}..do_test 
5300: 70 61 67 65 72 66 61 75 6c 74 2d 31 35 2d 70 72  pagerfault-15-pr
5310: 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  e1 {.  faultsim_
5320: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
5330: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
5340: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 20  ring a_string;. 
5350: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
5360: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
5370: 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
5380: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 20 20   UNIQUE);.      
5390: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
53a0: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 31  ALUES(a_string(1
53b0: 31 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 32 29  1), a_string(22)
53c0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
53d0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
53e0: 5f 73 74 72 69 6e 67 28 31 31 29 2c 20 61 5f 73  _string(11), a_s
53f0: 74 72 69 6e 67 28 32 32 29 29 3b 0a 20 20 20 20  tring(22));.    
5400: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 66 61  COMMIT;.  }.  fa
5410: 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f  ultsim_save_and_
5420: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61  close.} {}.do_fa
5430: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
5440: 72 66 61 75 6c 74 2d 31 35 20 2d 70 72 65 70 20  rfault-15 -prep 
5450: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
5460: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
5470: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
5480: 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 7d 20 2d  ng a_string;.} -
5490: 62 6f 64 79 20 7b 0a 20 20 64 62 20 65 76 61 6c  body {.  db eval
54a0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
54b0: 20 74 31 20 4c 49 4d 49 54 20 31 20 7d 20 7b 0a   t1 LIMIT 1 } {.
54c0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
54d0: 20 20 20 20 42 45 47 49 4e 3b 20 49 4e 53 45 52      BEGIN; INSER
54e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
54f0: 28 61 5f 73 74 72 69 6e 67 28 33 33 33 29 2c 20  (a_string(333), 
5500: 61 5f 73 74 72 69 6e 67 28 35 35 35 29 29 3b 20  a_string(555)); 
5510: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 42 45  COMMIT;.      BE
5520: 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  GIN; INSERT INTO
5530: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
5540: 69 6e 67 28 33 33 33 29 2c 20 61 5f 73 74 72 69  ing(333), a_stri
5550: 6e 67 28 35 35 35 29 29 3b 20 43 4f 4d 4d 49 54  ng(555)); COMMIT
5560: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 2d 74  ;.    }.  }.} -t
5570: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
5580: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
5590: 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69  {}}.  faultsim_i
55a0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d  ntegrity_check.}
55b0: 0a 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  ...do_test pager
55c0: 66 61 75 6c 74 2d 31 36 2d 70 72 65 31 20 7b 0a  fault-16-pre1 {.
55d0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
55e0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
55f0: 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
5600: 54 41 42 4c 45 20 74 31 28 78 2c 20 79 20 55 4e  TABLE t1(x, y UN
5610: 49 51 55 45 29 20 7d 0a 20 20 66 61 75 6c 74 73  IQUE) }.  faults
5620: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
5630: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
5640: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
5650: 6c 74 2d 31 36 20 2d 70 72 65 70 20 7b 0a 20 20  lt-16 -prep {.  
5660: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
5670: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62  _and_reopen.} -b
5680: 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ody {.  execsql 
5690: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  {.    PRAGMA loc
56a0: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c  king_mode = excl
56b0: 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41 47 4d  usive;.    PRAGM
56c0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
56d0: 20 77 61 6c 3b 0a 20 20 20 20 49 4e 53 45 52 54   wal;.    INSERT
56e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
56f0: 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 2);.    INSER
5700: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5710: 28 33 2c 20 34 29 3b 0a 20 20 20 20 50 52 41 47  (3, 4);.    PRAG
5720: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
5730: 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 49 4e  = delete;.    IN
5740: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5750: 55 45 53 28 34 2c 20 35 29 3b 0a 20 20 20 20 50  UES(4, 5);.    P
5760: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
5770: 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 49 4e  de = wal;.    IN
5780: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5790: 55 45 53 28 36 2c 20 37 29 3b 0a 20 20 20 20 50  UES(6, 7);.    P
57a0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
57b0: 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20  de = persist;.  
57c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
57d0: 20 56 41 4c 55 45 53 28 38 2c 20 39 29 3b 0a 20   VALUES(8, 9);. 
57e0: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
57f0: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
5800: 75 6c 74 20 7b 30 20 7b 65 78 63 6c 75 73 69 76  ult {0 {exclusiv
5810: 65 20 77 61 6c 20 64 65 6c 65 74 65 20 77 61 6c  e wal delete wal
5820: 20 70 65 72 73 69 73 74 7d 7d 0a 20 20 66 61 75   persist}}.  fau
5830: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
5840: 63 68 65 63 6b 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  check.}...#-----
5850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5890: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c  ----.# Test faul
58a0: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 77 68 69 6c  t injection whil
58b0: 65 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f 20  e changing into 
58c0: 61 6e 64 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d  and out of WAL m
58d0: 6f 64 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ode..#.do_test p
58e0: 61 67 65 72 66 61 75 6c 74 2d 31 37 2d 70 72 65  agerfault-17-pre
58f0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
5900: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
5910: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5920: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
5930: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
5940: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
5950: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 38  NTO t1 VALUES(18
5960: 36 32 2c 20 27 42 6f 74 68 61 27 29 3b 0a 20 20  62, 'Botha');.  
5970: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5980: 20 56 41 4c 55 45 53 28 31 38 37 30 2c 20 27 53   VALUES(1870, 'S
5990: 6d 75 74 73 27 29 3b 0a 20 20 20 20 49 4e 53 45  muts');.    INSE
59a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
59b0: 53 28 31 38 36 36 2c 20 27 48 65 72 74 7a 6f 67  S(1866, 'Hertzog
59c0: 27 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  ');.  }.  faults
59d0: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
59e0: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
59f0: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
5a00: 6c 74 2d 31 37 61 20 2d 70 72 65 70 20 7b 0a 20  lt-17a -prep {. 
5a10: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
5a20: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d  e_and_reopen.} -
5a30: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
5a40: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
5a50: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c  urnal_mode = wal
5a60: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
5a70: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65  rnal_mode = dele
5a80: 74 65 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20  te;.  }.} -test 
5a90: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
5aa0: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 77 61 6c  t_result {0 {wal
5ab0: 20 64 65 6c 65 74 65 7d 7d 0a 20 20 66 61 75 6c   delete}}.  faul
5ac0: 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63  tsim_integrity_c
5ad0: 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74 73  heck.}.do_faults
5ae0: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
5af0: 6c 74 2d 31 37 62 20 2d 70 72 65 70 20 7b 0a 20  lt-17b -prep {. 
5b00: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
5b10: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
5b20: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
5b30: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46  synchronous = OF
5b40: 46 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20  F }.} -body {.  
5b50: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
5b60: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
5b70: 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 49 4e 53  e = wal;.    INS
5b80: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5b90: 45 53 28 32 32 2c 20 27 43 6c 61 72 6b 65 27 29  ES(22, 'Clarke')
5ba0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
5bb0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65  rnal_mode = dele
5bc0: 74 65 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20  te;.  }.} -test 
5bd0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
5be0: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 77 61 6c  t_result {0 {wal
5bf0: 20 64 65 6c 65 74 65 7d 7d 0a 20 20 66 61 75 6c   delete}}.  faul
5c00: 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63  tsim_integrity_c
5c10: 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74 73  heck.}.do_faults
5c20: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
5c30: 6c 74 2d 31 37 63 20 2d 70 72 65 70 20 7b 0a 20  lt-17c -prep {. 
5c40: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
5c50: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
5c60: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52  xecsql { .    PR
5c70: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
5c80: 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20  e = exclusive;. 
5c90: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
5ca0: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20  l_mode = wal;.  
5cb0: 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  }.} -body {.  ex
5cc0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a  ecsql { PRAGMA j
5cd0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
5ce0: 6c 65 74 65 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  lete }.} -test {
5cf0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
5d00: 5f 72 65 73 75 6c 74 20 7b 30 20 64 65 6c 65 74  _result {0 delet
5d10: 65 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e  e}.  faultsim_in
5d20: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a  tegrity_check.}.
5d30: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
5d40: 20 70 61 67 65 72 66 61 75 6c 74 2d 31 37 64 20   pagerfault-17d 
5d50: 2d 70 72 65 70 20 7b 0a 20 20 63 61 74 63 68 20  -prep {.  catch 
5d60: 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20  { db2 close }.  
5d70: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
5d80: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71  _and_reopen.  sq
5d90: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
5da0: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  b.  execsql { PR
5db0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
5dc0: 65 20 3d 20 64 65 6c 65 74 65 20 7d 0a 20 20 65  e = delete }.  e
5dd0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
5de0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77  journal_mode = w
5df0: 61 6c 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  al }.  execsql {
5e00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5e10: 56 41 4c 55 45 53 28 39 39 2c 20 27 42 72 61 64  VALUES(99, 'Brad
5e20: 6d 61 6e 27 29 20 7d 20 64 62 32 0a 7d 20 2d 62  man') } db2.} -b
5e30: 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ody {.  execsql 
5e40: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
5e50: 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 20 7d  _mode = delete }
5e60: 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75  .} -test {.  fau
5e70: 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c  ltsim_test_resul
5e80: 74 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  t {1 {database i
5e90: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 66 61 75  s locked}}.  fau
5ea0: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
5eb0: 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74  check.}.do_fault
5ec0: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
5ed0: 75 6c 74 2d 31 37 65 20 2d 70 72 65 70 20 7b 0a  ult-17e -prep {.
5ee0: 20 20 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c    catch { db2 cl
5ef0: 6f 73 65 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  ose }.  faultsim
5f00: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5f10: 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62  pen.  sqlite3 db
5f20: 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  2 test.db.  exec
5f30: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
5f40: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65  rnal_mode = dele
5f50: 74 65 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  te }.  execsql {
5f60: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
5f70: 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20 20 73  mode = wal }.  s
5f80: 65 74 20 3a 3a 63 68 61 6e 20 5b 6c 61 75 6e 63  et ::chan [launc
5f90: 68 5f 74 65 73 74 66 69 78 74 75 72 65 5d 0a 20  h_testfixture]. 
5fa0: 20 74 65 73 74 66 69 78 74 75 72 65 20 24 3a 3a   testfixture $::
5fb0: 63 68 61 6e 20 7b 0a 20 20 20 20 73 71 6c 69 74  chan {.    sqlit
5fc0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
5fd0: 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45    db eval { INSE
5fe0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5ff0: 53 28 31 30 31 2c 20 27 4c 61 74 68 61 6d 27 29  S(101, 'Latham')
6000: 20 7d 0a 20 20 7d 0a 20 20 63 61 74 63 68 20 7b   }.  }.  catch {
6010: 20 74 65 73 74 66 69 78 74 75 72 65 20 24 3a 3a   testfixture $::
6020: 63 68 61 6e 20 73 71 6c 69 74 65 5f 61 62 6f 72  chan sqlite_abor
6030: 74 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6c  t }.  catch { cl
6040: 6f 73 65 20 24 3a 3a 63 68 61 6e 20 7d 0a 7d 20  ose $::chan }.} 
6050: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
6060: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
6070: 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65  al_mode = delete
6080: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
6090: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
60a0: 75 6c 74 20 7b 30 20 64 65 6c 65 74 65 7d 0a 20  ult {0 delete}. 
60b0: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
60c0: 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 23 2d 2d  ity_check.}..#--
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66  -------.# Test f
6120: 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 77  ault-injection w
6130: 68 65 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f  hen changing fro
6140: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70  m journal_mode=p
6150: 65 72 73 69 73 74 20 74 6f 20 0a 23 20 6a 6f 75  ersist to .# jou
6160: 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
6170: 20 28 74 68 69 73 20 69 6e 76 6f 6c 76 65 73 20   (this involves 
6180: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
6190: 72 6e 61 6c 20 66 69 6c 65 29 2e 0a 23 0a 64 6f  rnal file)..#.do
61a0: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
61b0: 2d 31 38 2d 70 72 65 31 20 7b 0a 20 20 66 61 75  -18-pre1 {.  fau
61c0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
61d0: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
61e0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
61f0: 41 42 4c 45 20 71 71 28 78 29 3b 0a 20 20 20 20  ABLE qq(x);.    
6200: 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 71 20 56  INSERT INTO qq V
6210: 41 4c 55 45 53 28 27 48 65 72 62 65 72 74 27 29  ALUES('Herbert')
6220: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6230: 4f 20 71 71 20 56 41 4c 55 45 53 28 27 4d 61 63  O qq VALUES('Mac
6240: 61 6c 69 73 74 65 72 27 29 3b 0a 20 20 20 20 49  alister');.    I
6250: 4e 53 45 52 54 20 49 4e 54 4f 20 71 71 20 56 41  NSERT INTO qq VA
6260: 4c 55 45 53 28 27 4d 61 63 6b 65 6e 7a 69 65 27  LUES('Mackenzie'
6270: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
6280: 54 4f 20 71 71 20 56 41 4c 55 45 53 28 27 4c 69  TO qq VALUES('Li
6290: 6c 6c 65 79 27 29 3b 0a 20 20 20 20 49 4e 53 45  lley');.    INSE
62a0: 52 54 20 49 4e 54 4f 20 71 71 20 56 41 4c 55 45  RT INTO qq VALUE
62b0: 53 28 27 50 61 6c 6d 65 72 27 29 3b 0a 20 20 7d  S('Palmer');.  }
62c0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  .  faultsim_save
62d0: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a  _and_close.} {}.
62e0: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
62f0: 20 70 61 67 65 72 66 61 75 6c 74 2d 31 38 20 2d   pagerfault-18 -
6300: 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69  prep {.  faultsi
6310: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6320: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
6330: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
6340: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
6350: 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ST;.    INSERT I
6360: 4e 54 4f 20 71 71 20 56 41 4c 55 45 53 28 27 42  NTO qq VALUES('B
6370: 65 61 74 74 79 27 29 3b 0a 20 20 7d 0a 7d 20 2d  eatty');.  }.} -
6380: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
6390: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
63a0: 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 20  l_mode = delete 
63b0: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  }.} -test {.  fa
63c0: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
63d0: 6c 74 20 7b 30 20 64 65 6c 65 74 65 7d 0a 20 20  lt {0 delete}.  
63e0: 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69  faultsim_integri
63f0: 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 64 6f 5f 66  ty_check.}..do_f
6400: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
6410: 65 72 66 61 75 6c 74 2d 31 39 61 20 2d 70 72 65  erfault-19a -pre
6420: 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  p {.  sqlite3 db
6430: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 64 62 20 66   :memory:.  db f
6440: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
6450: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
6460: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
6470: 6f 5f 76 61 63 75 75 6d 20 3d 20 46 55 4c 4c 3b  o_vacuum = FULL;
6480: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
6490: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
64a0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49  1(a, b);.      I
64b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
64c0: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30  LUES(a_string(50
64d0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
64e0: 30 30 29 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  00));.    COMMIT
64f0: 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  ;.  }.} -body {.
6500: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
6510: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
6520: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
6530: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
6540: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 0a 20 20  T * FROM t1; .  
6550: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
6560: 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  ;.  }.} -test {.
6570: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
6580: 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d 0a  result {0 {}}.}.
6590: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61  .do_test pagerfa
65a0: 75 6c 74 2d 31 39 2d 70 72 65 31 20 7b 0a 20 20  ult-19-pre1 {.  
65b0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
65c0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
65d0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
65e0: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
65f0: 46 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54 45  FULL;.    CREATE
6600: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 20 49 4e   TABLE t1(x); IN
6610: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6620: 55 45 53 28 31 29 3b 0a 20 20 20 20 43 52 45 41  UES(1);.    CREA
6630: 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b 20  TE TABLE t2(x); 
6640: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
6650: 41 4c 55 45 53 28 32 29 3b 0a 20 20 20 20 43 52  ALUES(2);.    CR
6660: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 78 29  EATE TABLE t3(x)
6670: 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33  ; INSERT INTO t3
6680: 20 56 41 4c 55 45 53 28 33 29 3b 0a 20 20 20 20   VALUES(3);.    
6690: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
66a0: 78 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  x); INSERT INTO 
66b0: 74 34 20 56 41 4c 55 45 53 28 34 29 3b 0a 20 20  t4 VALUES(4);.  
66c0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
66d0: 35 28 78 29 3b 20 49 4e 53 45 52 54 20 49 4e 54  5(x); INSERT INT
66e0: 4f 20 74 35 20 56 41 4c 55 45 53 28 35 29 3b 0a  O t5 VALUES(5);.
66f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6700: 20 74 36 28 78 29 3b 20 49 4e 53 45 52 54 20 49   t6(x); INSERT I
6710: 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 36 29  NTO t6 VALUES(6)
6720: 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  ;.  }.  faultsim
6730: 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a  _save_and_close.
6740: 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d  } {}.do_faultsim
6750: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
6760: 2d 31 39 62 20 2d 70 72 65 70 20 7b 0a 20 20 66  -19b -prep {.  f
6770: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
6780: 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f  and_reopen.} -bo
6790: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
67a0: 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
67b0: 20 20 20 55 50 44 41 54 45 20 74 34 20 53 45 54     UPDATE t4 SET
67c0: 20 78 20 3d 20 78 2b 31 3b 0a 20 20 20 20 20 20   x = x+1;.      
67d0: 55 50 44 41 54 45 20 74 36 20 53 45 54 20 78 20  UPDATE t6 SET x 
67e0: 3d 20 78 2b 31 3b 0a 20 20 20 20 20 20 53 41 56  = x+1;.      SAV
67f0: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
6800: 20 20 20 20 55 50 44 41 54 45 20 74 33 20 53 45      UPDATE t3 SE
6810: 54 20 78 20 3d 20 78 2b 31 3b 0a 20 20 20 20 20  T x = x+1;.     
6820: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 77 6f     SAVEPOINT two
6830: 3b 0a 20 20 20 20 20 20 20 20 20 20 44 52 4f 50  ;.          DROP
6840: 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 20 20 20   TABLE t2;.     
6850: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65   ROLLBACK TO one
6860: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
6870: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6880: 74 33 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  t3;.    SELECT *
6890: 20 46 52 4f 4d 20 74 34 3b 0a 20 20 20 20 53 45   FROM t4;.    SE
68a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 3b 0a  LECT * FROM t6;.
68b0: 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20    }.} -test {.  
68c0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
68d0: 73 75 6c 74 20 7b 30 20 7b 33 20 35 20 37 7d 7d  sult {0 {3 5 7}}
68e0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
6930: 20 54 68 69 73 20 74 65 73 74 73 20 66 61 75 6c   This tests faul
6940: 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 69 6e 20 61  t-injection in a
6950: 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
6960: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
6970: 20 63 6f 64 65 2e 0a 23 0a 64 6f 5f 74 65 73 74   code..#.do_test
6980: 20 70 61 67 65 72 66 61 75 6c 74 2d 32 30 2d 70   pagerfault-20-p
6990: 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  re1 {.  faultsim
69a0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
69b0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
69c0: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
69d0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50  size = 10;.    P
69e0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
69f0: 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 43 52  m = FULL;.    CR
6a00: 45 41 54 45 20 54 41 42 4c 45 20 74 30 28 61 2c  EATE TABLE t0(a,
6a10: 20 62 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74   b);.  }.  fault
6a20: 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f  sim_save_and_clo
6a30: 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74  se.} {}.do_fault
6a40: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
6a50: 75 6c 74 2d 32 30 20 2d 70 72 65 70 20 7b 0a 20  ult-20 -prep {. 
6a60: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
6a70: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d  e_and_reopen.} -
6a80: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
6a90: 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20   { .    BEGIN;. 
6aa0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
6ab0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
6ac0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
6ad0: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 44  2(a, b);.      D
6ae0: 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20  ROP TABLE t1;.  
6af0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
6b00: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
6b10: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
6b20: 30 20 7b 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74  0 {}}.}..do_test
6b30: 20 70 61 67 65 72 66 61 75 6c 74 2d 32 31 2d 70   pagerfault-21-p
6b40: 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  re1 {.  faultsim
6b50: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
6b60: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
6b70: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
6b80: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 43  size = 10;.    C
6b90: 52 45 41 54 45 20 54 41 42 4c 45 20 74 30 28 61  REATE TABLE t0(a
6ba0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
6bb0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6bc0: 4f 20 74 30 20 56 41 4c 55 45 53 28 31 2c 20 32  O t0 VALUES(1, 2
6bd0: 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69  );.  }.  faultsi
6be0: 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65  m_save_and_close
6bf0: 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69  .} {}.do_faultsi
6c00: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
6c10: 74 2d 32 31 20 2d 70 72 65 70 20 7b 0a 20 20 66  t-21 -prep {.  f
6c20: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
6c30: 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f  and_reopen.} -bo
6c40: 64 79 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  dy {.  db eval {
6c50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6c60: 30 20 4c 49 4d 49 54 20 31 20 7d 20 7b 0a 20 20  0 LIMIT 1 } {.  
6c70: 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45    db eval { INSE
6c80: 52 54 20 49 4e 54 4f 20 74 30 20 53 45 4c 45 43  RT INTO t0 SELEC
6c90: 54 20 61 2b 31 2c 20 62 20 46 52 4f 4d 20 74 30  T a+1, b FROM t0
6ca0: 20 7d 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b   }.    db eval {
6cb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20   INSERT INTO t0 
6cc0: 53 45 4c 45 43 54 20 61 2b 32 2c 20 62 20 46 52  SELECT a+2, b FR
6cd0: 4f 4d 20 74 30 20 7d 0a 20 20 7d 0a 7d 20 2d 74  OM t0 }.  }.} -t
6ce0: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
6cf0: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
6d00: 7b 7d 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  {}}.}...#-------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c 74 2d  --.# Test fault-
6d60: 69 6e 6a 65 63 74 69 6f 6e 20 61 6e 64 20 72 6f  injection and ro
6d70: 6c 6c 62 61 63 6b 20 77 68 65 6e 20 74 68 65 20  llback when the 
6d80: 6e 52 65 73 65 72 76 65 20 68 65 61 64 65 72 20  nReserve header 
6d90: 76 61 6c 75 65 20 0a 23 20 69 73 20 6e 6f 6e 2d  value .# is non-
6da0: 7a 65 72 6f 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  zero..#.do_test 
6db0: 70 61 67 65 72 66 61 75 6c 74 2d 32 31 2d 70 72  pagerfault-21-pr
6dc0: 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  e1 {.  faultsim_
6dd0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
6de0: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
6df0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
6e00: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50  ze = 1024;.    P
6e10: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
6e20: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 50 52  de = WAL;.    PR
6e30: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
6e40: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 7d 0a  e = DELETE;.  }.
6e50: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 68 65 78    db close.  hex
6e60: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
6e70: 20 32 30 20 20 20 20 31 30 0a 20 20 68 65 78 69   20    10.  hexi
6e80: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
6e90: 31 30 35 20 30 33 46 30 0a 20 20 73 71 6c 69 74  105 03F0.  sqlit
6ea0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
6eb0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
6ec0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
6ed0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
6ee0: 20 54 41 42 4c 45 20 74 30 28 61 20 50 52 49 4d   TABLE t0(a PRIM
6ef0: 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55  ARY KEY, b UNIQU
6f00: 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  E);.    INSERT I
6f10: 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28 61 5f  NTO t0 VALUES(a_
6f20: 73 74 72 69 6e 67 28 32 32 32 29 2c 20 61 5f 73  string(222), a_s
6f30: 74 72 69 6e 67 28 33 33 33 29 29 3b 0a 20 20 20  tring(333));.   
6f40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20   INSERT INTO t0 
6f50: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
6f60: 32 32 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  223), a_string(3
6f70: 33 34 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  34));.    INSERT
6f80: 20 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28   INTO t0 VALUES(
6f90: 61 5f 73 74 72 69 6e 67 28 32 32 34 29 2c 20 61  a_string(224), a
6fa0: 5f 73 74 72 69 6e 67 28 33 33 35 29 29 3b 0a 20  _string(335));. 
6fb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6fc0: 30 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  0 VALUES(a_strin
6fd0: 67 28 32 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  g(225), a_string
6fe0: 28 33 33 36 29 29 3b 0a 20 20 7d 0a 20 20 66 61  (336));.  }.  fa
6ff0: 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f  ultsim_save_and_
7000: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 66  close.} {}..do_f
7010: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
7020: 65 72 66 61 75 6c 74 2d 32 31 20 2d 70 72 65 70  erfault-21 -prep
7030: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
7040: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
7050: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65  .} -body {.  exe
7060: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
7070: 54 4f 20 74 30 20 53 45 4c 45 43 54 20 61 7c 7c  TO t0 SELECT a||
7080: 27 78 27 2c 20 62 7c 7c 27 78 27 20 46 52 4f 4d  'x', b||'x' FROM
7090: 20 74 30 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a   t0 }.} -test {.
70a0: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
70b0: 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20  result {0 {}}.  
70c0: 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69  faultsim_integri
70d0: 74 79 5f 63 68 65 63 6b 0a 7d 0a 69 66 63 61 70  ty_check.}.ifcap
70e0: 61 62 6c 65 20 63 72 61 73 68 74 65 73 74 20 7b  able crashtest {
70f0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
7100: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
7110: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
7120: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
7130: 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d   1024;.    PRAGM
7140: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
7150: 20 57 41 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41   WAL;.    PRAGMA
7160: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
7170: 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 20 20 64 62  DELETE;.  }.  db
7180: 20 63 6c 6f 73 65 0a 20 20 68 65 78 69 6f 5f 77   close.  hexio_w
7190: 72 69 74 65 20 74 65 73 74 2e 64 62 20 32 30 20  rite test.db 20 
71a0: 20 20 20 31 30 0a 20 20 68 65 78 69 6f 5f 77 72     10.  hexio_wr
71b0: 69 74 65 20 74 65 73 74 2e 64 62 20 31 30 35 20  ite test.db 105 
71c0: 30 33 46 30 0a 0a 20 20 73 71 6c 69 74 65 33 20  03F0..  sqlite3 
71d0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20  db test.db.  db 
71e0: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
71f0: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
7200: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
7210: 42 4c 45 20 74 30 28 61 20 50 52 49 4d 41 52 59  BLE t0(a PRIMARY
7220: 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 29 3b   KEY, b UNIQUE);
7230: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7240: 20 74 30 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t0 VALUES(a_str
7250: 69 6e 67 28 32 32 32 29 2c 20 61 5f 73 74 72 69  ing(222), a_stri
7260: 6e 67 28 33 33 33 29 29 3b 0a 20 20 20 20 49 4e  ng(333));.    IN
7270: 53 45 52 54 20 49 4e 54 4f 20 74 30 20 56 41 4c  SERT INTO t0 VAL
7280: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 32 33  UES(a_string(223
7290: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 33 34 29  ), a_string(334)
72a0: 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69  );.  }.  faultsi
72b0: 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65  m_save_and_close
72c0: 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 54 65  ..  for {set iTe
72d0: 73 74 20 31 7d 20 7b 24 69 54 65 73 74 3c 35 30  st 1} {$iTest<50
72e0: 7d 20 7b 69 6e 63 72 20 69 54 65 73 74 7d 20 7b  } {incr iTest} {
72f0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
7300: 65 72 66 61 75 6c 74 2d 32 31 2e 63 72 61 73 68  erfault-21.crash
7310: 2e 24 69 54 65 73 74 2e 31 20 7b 0a 20 20 20 20  .$iTest.1 {.    
7320: 20 20 63 72 61 73 68 73 71 6c 20 2d 64 65 6c 61    crashsql -dela
7330: 79 20 31 20 2d 66 69 6c 65 20 74 65 73 74 2e 64  y 1 -file test.d
7340: 62 20 2d 73 65 65 64 20 24 69 54 65 73 74 20 7b  b -seed $iTest {
7350: 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  .        BEGIN;.
7360: 20 20 20 20 20 20 20 20 20 20 43 52 45 41 54 45            CREATE
7370: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
7380: 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55  ARY KEY, b UNIQU
7390: 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e  E);.          IN
73a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
73b0: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 30  ECT a, b FROM t0
73c0: 3b 0a 20 20 20 20 20 20 20 20 43 4f 4d 4d 49 54  ;.        COMMIT
73d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
73e0: 7b 31 20 7b 63 68 69 6c 64 20 70 72 6f 63 65 73  {1 {child proces
73f0: 73 20 65 78 69 74 65 64 20 61 62 6e 6f 72 6d 61  s exited abnorma
7400: 6c 6c 79 7d 7d 0a 20 20 20 20 64 6f 5f 74 65 73  lly}}.    do_tes
7410: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 32 2e  t pagerfault-22.
7420: 24 69 54 65 73 74 2e 32 20 7b 0a 20 20 20 20 20  $iTest.2 {.     
7430: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
7440: 2e 64 62 0a 20 20 20 20 20 20 65 78 65 63 73 71  .db.      execsq
7450: 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  l { PRAGMA integ
7460: 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a 20 20 20  rity_check }.   
7470: 20 7d 20 7b 6f 6b 7d 0a 20 20 20 20 64 62 20 63   } {ok}.    db c
7480: 6c 6f 73 65 0a 20 20 7d 0a 7d 0a 0a 0a 23 2d 2d  lose.  }.}...#--
7490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74d0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 57 68 65 6e 20 61  -------.# When a
74e0: 20 33 2e 37 2e 30 20 63 6c 69 65 6e 74 20 6f 70   3.7.0 client op
74f0: 65 6e 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ens a write-tran
7500: 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 64 61 74  saction on a dat
7510: 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 0a  abase file that.
7520: 23 20 68 61 73 20 62 65 65 6e 20 61 70 70 65 6e  # has been appen
7530: 64 65 64 20 74 6f 20 6f 72 20 74 72 75 6e 63 61  ded to or trunca
7540: 74 65 64 20 62 79 20 61 20 70 72 65 2d 33 37 30  ted by a pre-370
7550: 20 63 6c 69 65 6e 74 2c 20 69 74 20 75 70 64 61   client, it upda
7560: 74 65 73 0a 23 20 74 68 65 20 64 62 2d 73 69 7a  tes.# the db-siz
7570: 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 68 65  e in the file he
7580: 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
7590: 2e 20 54 68 69 73 20 74 65 73 74 20 63 61 73 65  . This test case
75a0: 20 70 72 6f 76 6f 6b 65 73 0a 23 20 65 72 72 6f   provokes.# erro
75b0: 72 73 20 64 75 72 69 6e 67 20 74 68 61 74 20 6f  rs during that o
75c0: 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  peration..#.do_t
75d0: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32  est pagerfault-2
75e0: 32 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74  2-pre1 {.  fault
75f0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
7600: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
7610: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
7620: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
7630: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
7640: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50  ze = 1024;.    P
7650: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
7660: 6d 20 3d 20 30 3b 0a 20 20 20 20 43 52 45 41 54  m = 0;.    CREAT
7670: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 20  E TABLE t1(a);. 
7680: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
7690: 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20  i1 ON t1(a);.   
76a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
76b0: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
76c0: 33 30 30 30 29 29 3b 0a 20 20 20 20 43 52 45 41  3000));.    CREA
76d0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 29 3b 0a  TE TABLE t2(a);.
76e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
76f0: 74 32 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  t2 VALUES(1);.  
7700: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  }.  db close.  s
7710: 71 6c 33 36 32 33 31 20 7b 20 49 4e 53 45 52 54  ql36231 { INSERT
7720: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
7730: 61 5f 73 74 72 69 6e 67 28 33 30 30 30 29 29 20  a_string(3000)) 
7740: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  }.  faultsim_sav
7750: 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d  e_and_close.} {}
7760: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
7770: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 32 20  t pagerfault-22 
7780: 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73  -prep {.  faults
7790: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
77a0: 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a  eopen.} -body {.
77b0: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
77c0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
77d0: 53 28 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c  S(2) }.  execsql
77e0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
77f0: 20 74 32 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a   t2 }.} -test {.
7800: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
7810: 72 65 73 75 6c 74 20 7b 30 20 7b 31 20 32 7d 7d  result {0 {1 2}}
7820: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65  .  faultsim_inte
7830: 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 0a  grity_check.}...
7840: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
7850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 57 68 65  ----------.# Whe
7890: 6e 20 61 20 33 2e 37 2e 30 20 63 6c 69 65 6e 74  n a 3.7.0 client
78a0: 20 6f 70 65 6e 73 20 61 20 77 72 69 74 65 2d 74   opens a write-t
78b0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
78c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
78d0: 61 74 0a 23 20 68 61 73 20 62 65 65 6e 20 61 70  at.# has been ap
78e0: 70 65 6e 64 65 64 20 74 6f 20 6f 72 20 74 72 75  pended to or tru
78f0: 6e 63 61 74 65 64 20 62 79 20 61 20 70 72 65 2d  ncated by a pre-
7900: 33 37 30 20 63 6c 69 65 6e 74 2c 20 69 74 20 75  370 client, it u
7910: 70 64 61 74 65 73 0a 23 20 74 68 65 20 64 62 2d  pdates.# the db-
7920: 73 69 7a 65 20 69 6e 20 74 68 65 20 66 69 6c 65  size in the file
7930: 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
7940: 65 6c 79 2e 20 54 68 69 73 20 74 65 73 74 20 63  ely. This test c
7950: 61 73 65 20 70 72 6f 76 6f 6b 65 73 0a 23 20 65  ase provokes.# e
7960: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 74 68 61  rrors during tha
7970: 74 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64  t operation..#.d
7980: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
7990: 74 2d 32 32 2d 70 72 65 31 20 7b 0a 20 20 66 61  t-22-pre1 {.  fa
79a0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
79b0: 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
79c0: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
79d0: 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
79e0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
79f0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
7a00: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
7a10: 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 43 52  cuum = 0;.    CR
7a20: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 29  EATE TABLE t1(a)
7a30: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
7a40: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
7a50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7a60: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
7a70: 6e 67 28 33 30 30 30 29 29 3b 0a 20 20 20 20 43  ng(3000));.    C
7a80: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
7a90: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
7aa0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 29 3b  TO t2 VALUES(1);
7ab0: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
7ac0: 20 20 73 71 6c 33 36 32 33 31 20 7b 20 49 4e 53    sql36231 { INS
7ad0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7ae0: 45 53 28 61 5f 73 74 72 69 6e 67 28 33 30 30 30  ES(a_string(3000
7af0: 29 29 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  )) }.  faultsim_
7b00: 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d  save_and_close.}
7b10: 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f   {}.do_faultsim_
7b20: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
7b30: 32 32 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75  22 -prep {.  fau
7b40: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
7b50: 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79  d_reopen.} -body
7b60: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   {.  execsql { I
7b70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
7b80: 4c 55 45 53 28 32 29 20 7d 0a 20 20 65 78 65 63  LUES(2) }.  exec
7b90: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
7ba0: 52 4f 4d 20 74 32 20 7d 0a 7d 20 2d 74 65 73 74  ROM t2 }.} -test
7bb0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65   {.  faultsim_te
7bc0: 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 31 20  st_result {0 {1 
7bd0: 32 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69  2}}.  faultsim_i
7be0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d  ntegrity_check.}
7bf0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
7c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 50  ------------.# P
7c40: 72 6f 76 6f 6b 65 20 61 6e 20 4f 4f 4d 20 65 72  rovoke an OOM er
7c50: 72 6f 72 20 64 75 72 69 6e 67 20 61 20 63 6f 6d  ror during a com
7c60: 6d 69 74 20 6f 66 20 6d 75 6c 74 69 2d 66 69 6c  mit of multi-fil
7c70: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f  e transaction. O
7c80: 6e 65 20 6f 66 0a 23 20 74 68 65 20 64 61 74 61  ne of.# the data
7c90: 62 61 73 65 73 20 77 72 69 74 74 65 6e 20 64 75  bases written du
7ca0: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
7cb0: 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 2d 6d 65  tion is an in-me
7cc0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 23  mory database..#
7cd0: 20 54 68 69 73 20 74 65 73 74 20 63 61 75 73 65   This test cause
7ce0: 73 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  s rollback of th
7cf0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
7d00: 62 61 73 65 20 61 66 74 65 72 20 43 6f 6d 6d 69  base after Commi
7d10: 74 50 68 61 73 65 4f 6e 65 28 29 0a 23 20 68 61  tPhaseOne().# ha
7d20: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
7d30: 65 74 75 72 6e 65 64 2e 20 69 2e 65 2e 20 74 68  eturned. i.e. th
7d40: 65 20 73 65 72 69 65 73 20 6f 66 20 63 61 6c 6c  e series of call
7d50: 73 20 66 6f 72 20 74 68 65 20 61 62 6f 72 74 65  s for the aborte
7d60: 64 20 63 6f 6d 6d 69 74 20 0a 23 20 69 73 3a 0a  d commit .# is:.
7d70: 23 0a 23 20 20 20 50 61 67 65 72 43 6f 6d 6d 69  #.#   PagerCommi
7d80: 74 50 68 61 73 65 4f 6e 65 28 3c 69 6e 2d 6d 65  tPhaseOne(<in-me
7d90: 6d 6f 72 79 2d 64 62 3e 29 20 20 20 2d 3e 20 20  mory-db>)   ->  
7da0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 20 20 50   SQLITE_OK.#   P
7db0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
7dc0: 6e 65 28 3c 66 69 6c 65 2d 64 62 3e 29 20 20 20  ne(<file-db>)   
7dd0: 20 20 20 20 20 2d 3e 20 20 20 53 51 4c 49 54 45       ->   SQLITE
7de0: 5f 49 4f 45 52 52 0a 23 20 20 20 50 61 67 65 72  _IOERR.#   Pager
7df0: 52 6f 6c 6c 62 61 63 6b 28 3c 69 6e 2d 6d 65 6d  Rollback(<in-mem
7e00: 6f 72 79 2d 64 62 3e 29 0a 23 20 20 20 50 61 67  ory-db>).#   Pag
7e10: 65 72 52 6f 6c 6c 62 61 63 6b 28 3c 66 69 6c 65  erRollback(<file
7e20: 2d 64 62 3e 29 0a 23 0a 64 6f 5f 66 61 75 6c 74  -db>).#.do_fault
7e30: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
7e40: 75 6c 74 2d 32 33 20 2d 70 72 65 70 20 7b 0a 20  ult-23 -prep {. 
7e50: 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62   foreach f [glob
7e60: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73   -nocomplain tes
7e70: 74 2e 64 62 2a 5d 20 7b 20 66 69 6c 65 20 64 65  t.db*] { file de
7e80: 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66 20 7d  lete -force $f }
7e90: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d  .  sqlite3 db :m
7ea0: 65 6d 6f 72 79 3a 0a 20 20 64 62 20 65 76 61 6c  emory:.  db eval
7eb0: 20 7b 20 0a 20 20 20 20 41 54 54 41 43 48 20 27   { .    ATTACH '
7ec0: 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78  test.db2' AS aux
7ed0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7ee0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
7ef0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
7f00: 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 0a  x.t2(a, b);.  }.
7f10: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
7f20: 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e  sql { .    BEGIN
7f30: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
7f40: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
7f50: 32 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  2);.      INSERT
7f60: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
7f70: 33 2c 34 29 3b 20 0a 20 20 20 20 43 4f 4d 4d 49  3,4); .    COMMI
7f80: 54 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  T;.  }.} -test {
7f90: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
7fa0: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20  _result {0 {}}. 
7fb0: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
7fc0: 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 64 6f 5f  ity_check.}..do_
7fd0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
7fe0: 67 65 72 66 61 75 6c 74 2d 32 34 20 2d 70 72 65  gerfault-24 -pre
7ff0: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  p {.  faultsim_d
8000: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
8010: 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41  .  db eval { PRA
8020: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d  GMA temp_store =
8030: 20 66 69 6c 65 20 7d 0a 20 20 65 78 65 63 73 71   file }.  execsq
8040: 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  l { CREATE TABLE
8050: 20 78 28 61 2c 20 62 29 20 7d 0a 7d 20 2d 62 6f   x(a, b) }.} -bo
8060: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
8070: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42   CREATE TEMP TAB
8080: 4c 45 20 74 31 28 61 2c 20 62 29 20 7d 0a 7d 20  LE t1(a, b) }.} 
8090: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
80a0: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
80b0: 30 20 7b 7d 7d 20 5c 0a 20 20 20 20 7b 31 20 7b  0 {}} \.    {1 {
80c0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
80d0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
80e0: 61 73 65 20 66 69 6c 65 20 66 6f 72 20 73 74 6f  ase file for sto
80f0: 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
8100: 61 62 6c 65 73 7d 7d 0a 20 20 73 65 74 20 69 63  ables}}.  set ic
8110: 20 5b 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47   [db eval { PRAG
8120: 4d 41 20 74 65 6d 70 2e 69 6e 74 65 67 72 69 74  MA temp.integrit
8130: 79 5f 63 68 65 63 6b 20 7d 5d 0a 20 20 69 66 20  y_check }].  if 
8140: 7b 24 69 63 20 21 3d 20 22 6f 6b 22 7d 20 7b 20  {$ic != "ok"} { 
8150: 65 72 72 6f 72 20 22 49 6e 74 65 67 72 69 74 79  error "Integrity
8160: 20 63 68 65 63 6b 3a 20 24 69 63 22 20 7d 0a 7d   check: $ic" }.}
8170: 0a 0a 70 72 6f 63 20 6c 6f 63 6b 72 6f 77 73 20  ..proc lockrows 
8180: 7b 6e 7d 20 7b 0a 20 20 69 66 20 7b 24 6e 3d 3d  {n} {.  if {$n==
8190: 30 7d 20 7b 20 72 65 74 75 72 6e 20 22 22 20 7d  0} { return "" }
81a0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c  .  db eval { SEL
81b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
81c0: 45 52 45 20 6f 69 64 20 3d 20 24 6e 20 7d 20 7b  ERE oid = $n } {
81d0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 6f   .    return [lo
81e0: 63 6b 72 6f 77 73 20 5b 65 78 70 72 20 7b 24 6e  ckrows [expr {$n
81f0: 2d 31 7d 5d 5d 0a 20 20 7d 0a 7d 0a 0a 0a 64 6f  -1}]].  }.}...do
8200: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
8210: 2d 32 35 2d 70 72 65 31 20 7b 0a 20 20 66 61 75  -25-pre1 {.  fau
8220: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
8230: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
8240: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
8250: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
8260: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
8270: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
8280: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
8290: 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 43 52 45  uum = 0;.    CRE
82a0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b  ATE TABLE t1(a);
82b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
82c0: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
82d0: 69 6e 67 28 35 30 30 29 29 3b 0a 20 20 20 20 49  ing(500));.    I
82e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
82f0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
8300: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
8310: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
8320: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35  ELECT a_string(5
8330: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
8340: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8350: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
8360: 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
8370: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
8380: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
8390: 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (500) FROM t1;. 
83a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
83b0: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
83c0: 67 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(500) FROM t1;.
83d0: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73    }.  faultsim_s
83e0: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20  ave_and_close.} 
83f0: 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74  {}.do_faultsim_t
8400: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32  est pagerfault-2
8410: 35 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  5 -prep {.  faul
8420: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
8430: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
8440: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
8450: 69 6e 67 0a 20 20 73 65 74 20 3a 3a 63 68 61 6e  ing.  set ::chan
8460: 6e 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62  nel [db incrblob
8470: 20 2d 72 65 61 64 6f 6e 6c 79 20 74 31 20 61 20   -readonly t1 a 
8480: 31 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  1].  execsql { .
8490: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
84a0: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
84b0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
84c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
84d0: 45 53 28 61 5f 73 74 72 69 6e 67 28 33 30 30 30  ES(a_string(3000
84e0: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
84f0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8500: 61 5f 73 74 72 69 6e 67 28 33 30 30 30 29 29 3b  a_string(3000));
8510: 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20  .  }.} -body {. 
8520: 20 6c 6f 63 6b 72 6f 77 73 20 33 30 0a 7d 20 2d   lockrows 30.} -
8530: 74 65 73 74 20 7b 0a 20 20 63 61 74 63 68 20 7b  test {.  catch {
8540: 20 6c 6f 63 6b 72 6f 77 73 20 33 30 20 7d 0a 20   lockrows 30 }. 
8550: 20 63 61 74 63 68 20 7b 20 64 62 20 65 76 61 6c   catch { db eval
8560: 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 63 6c 6f 73   COMMIT }.  clos
8570: 65 20 24 3a 3a 63 68 61 6e 6e 65 6c 0a 20 20 66  e $::channel.  f
8580: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
8590: 75 6c 74 20 7b 30 20 7b 7d 7d 20 0a 7d 0a 0a 64  ult {0 {}} .}..d
85a0: 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20  o_faultsim_test 
85b0: 70 61 67 65 72 66 61 75 6c 74 2d 32 36 20 2d 70  pagerfault-26 -p
85c0: 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  rep {.  faultsim
85d0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
85e0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
85f0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
8600: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
8610: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
8620: 6f 64 65 20 3d 20 74 72 75 6e 63 61 74 65 3b 0a  ode = truncate;.
8630: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
8640: 76 61 63 75 75 6d 20 3d 20 66 75 6c 6c 3b 0a 20  vacuum = full;. 
8650: 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e     PRAGMA lockin
8660: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
8670: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8680: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
8690: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
86a0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
86b0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
86c0: 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 7d 0a 7d  ze = 4096;.  }.}
86d0: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
86e0: 71 6c 20 7b 0a 20 20 20 20 56 41 43 55 55 4d 3b  ql {.    VACUUM;
86f0: 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  .  }.} -test {. 
8700: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
8710: 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 0a 20 20  esult {0 {}}..  
8720: 73 65 74 20 63 6f 6e 74 65 6e 74 73 20 5b 64 62  set contents [db
8730: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20   eval {SELECT * 
8740: 46 52 4f 4d 20 74 31 7d 5d 0a 20 20 69 66 20 7b  FROM t1}].  if {
8750: 24 63 6f 6e 74 65 6e 74 73 20 21 3d 20 22 31 20  $contents != "1 
8760: 32 22 7d 20 7b 20 65 72 72 6f 72 20 22 42 61 64  2"} { error "Bad
8770: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
8780: 74 73 20 28 24 63 6f 6e 74 65 6e 74 73 29 22 20  ts ($contents)" 
8790: 7d 0a 0a 20 20 73 65 74 20 73 7a 20 5b 66 69 6c  }..  set sz [fil
87a0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a  e size test.db].
87b0: 20 20 69 66 20 7b 24 74 65 73 74 72 63 21 3d 30    if {$testrc!=0
87c0: 20 26 26 20 24 73 7a 21 3d 31 30 32 34 2a 33 20   && $sz!=1024*3 
87d0: 26 26 20 24 73 7a 21 3d 34 30 39 36 2a 33 7d 20  && $sz!=4096*3} 
87e0: 7b 20 0a 20 20 20 20 65 72 72 6f 72 20 22 45 78  { .    error "Ex
87f0: 70 65 63 74 65 64 20 66 69 6c 65 20 73 69 7a 65  pected file size
8800: 20 74 6f 20 62 65 20 33 30 37 32 20 6f 72 20 31   to be 3072 or 1
8810: 32 32 38 38 20 62 79 74 65 73 20 2d 20 61 63 74  2288 bytes - act
8820: 75 61 6c 20 73 69 7a 65 20 24 73 7a 20 62 79 74  ual size $sz byt
8830: 65 73 22 0a 20 20 7d 0a 20 20 69 66 20 7b 24 74  es".  }.  if {$t
8840: 65 73 74 72 63 3d 3d 30 20 26 26 20 24 73 7a 21  estrc==0 && $sz!
8850: 3d 34 30 39 36 2a 33 7d 20 7b 20 0a 20 20 20 20  =4096*3} { .    
8860: 65 72 72 6f 72 20 22 45 78 70 65 63 74 65 64 20  error "Expected 
8870: 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 62 65 20  file size to be 
8880: 31 32 32 38 38 20 62 79 74 65 73 20 2d 20 61 63  12288 bytes - ac
8890: 74 75 61 6c 20 73 69 7a 65 20 24 73 7a 20 62 79  tual size $sz by
88a0: 74 65 73 22 0a 20 20 7d 0a 7d 20 0a 0a 0a 66 69  tes".  }.} ...fi
88b0: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.