/ Hex Artifact Content
Login

Artifact 7d16f91a88e79c369d59b019615f3472297213f9:


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 0a 69 66 20 31 20 7b 0a 0a 23 2d  ing...if 1 {..#-
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 2d  ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
0340: 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20  fault-injection 
0350: 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61  while rolling ba
0360: 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
0370: 20 66 69 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74   file..#.do_test
0380: 20 70 61 67 65 72 66 61 75 6c 74 2d 31 2d 70 72   pagerfault-1-pr
0390: 65 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  e1 {.  execsql {
03a0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
03b0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
03c0: 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61  E;.    PRAGMA ca
03d0: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
03e0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
03f0: 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55  t1(a UNIQUE, b U
0400: 4e 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45  NIQUE);.    INSE
0410: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0420: 53 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  S(a_string(200),
0430: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b   a_string(300));
0440: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0450: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
0460: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
0470: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(300) FROM t1;
0480: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0490: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
04a0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
04b0: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(300) FROM t1;
04c0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
04d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
04e0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
04f0: 28 32 30 31 29 2c 20 61 5f 73 74 72 69 6e 67 28  (201), a_string(
0500: 33 30 31 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  301) FROM t1;.  
0510: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0520: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
0530: 6e 67 28 32 30 32 29 2c 20 61 5f 73 74 72 69 6e  ng(202), a_strin
0540: 67 28 33 30 32 29 20 46 52 4f 4d 20 74 31 3b 0a  g(302) FROM t1;.
0550: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0560: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
0570: 72 69 6e 67 28 32 30 33 29 2c 20 61 5f 73 74 72  ring(203), a_str
0580: 69 6e 67 28 33 30 33 29 20 46 52 4f 4d 20 74 31  ing(303) FROM t1
0590: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
05a0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
05b0: 73 74 72 69 6e 67 28 32 30 34 29 2c 20 61 5f 73  string(204), a_s
05c0: 74 72 69 6e 67 28 33 30 34 29 20 46 52 4f 4d 20  tring(304) FROM 
05d0: 74 31 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  t1;.  }.  faults
05e0: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
05f0: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
0600: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
0610: 6c 74 2d 31 20 2d 70 72 65 70 20 7b 0a 20 20 66  lt-1 -prep {.  f
0620: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
0630: 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f  and_reopen.} -bo
0640: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
0650: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
0660: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d 74 65   FROM t1 }.} -te
0670: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
0680: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 34  test_result {0 4
0690: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74  }.  faultsim_int
06a0: 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 69  egrity_check.  i
06b0: 66 20 7b 5b 64 62 20 6f 6e 65 20 7b 20 53 45 4c  f {[db one { SEL
06c0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
06d0: 4d 20 74 31 20 7d 5d 20 21 3d 20 34 7d 20 7b 0a  M t1 }] != 4} {.
06e0: 20 20 20 20 65 72 72 6f 72 20 22 44 61 74 61 62      error "Datab
06f0: 61 73 65 20 63 6f 6e 74 65 6e 74 20 61 70 70 65  ase content appe
0700: 61 72 73 20 69 6e 63 6f 72 72 65 63 74 22 0a 20  ars incorrect". 
0710: 20 7d 0a 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 0a 23 20 54 65 73 74 20 66 61 75 6c 74 2d 69 6e  .# Test fault-in
0770: 6a 65 63 74 69 6f 6e 20 77 68 69 6c 65 20 72 6f  jection while ro
0780: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
0790: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69  -journal file wi
07a0: 74 68 20 61 20 0a 23 20 70 61 67 65 2d 73 69 7a  th a .# page-siz
07b0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
07c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
07d0: 75 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 61 67  ue stored on pag
07e0: 65 20 31 20 6f 66 20 74 68 65 0a 23 20 64 61 74  e 1 of the.# dat
07f0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 64 6f  abase file..#.do
0800: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
0810: 2d 32 2d 70 72 65 31 20 7b 0a 20 20 74 65 73 74  -2-pre1 {.  test
0820: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
0830: 31 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78 53  1.  tv filter xS
0840: 79 6e 63 0a 20 20 74 76 20 73 63 72 69 70 74 20  ync.  tv script 
0850: 78 53 79 6e 63 43 62 0a 20 20 70 72 6f 63 20 78  xSyncCb.  proc x
0860: 53 79 6e 63 43 62 20 7b 66 69 6c 65 6e 61 6d 65  SyncCb {filename
0870: 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 69 66 20   args} {.    if 
0880: 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a  {[string match *
0890: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
08a0: 5d 3d 3d 30 7d 20 66 61 75 6c 74 73 69 6d 5f 73  ]==0} faultsim_s
08b0: 61 76 65 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  ave.  }.  faults
08c0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
08d0: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
08e0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
08f0: 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20  _size = 4096;.  
0900: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43    BEGIN;.      C
0910: 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 28  REATE TABLE abc(
0920: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 20 20  a, b, c);.      
0930: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
0940: 56 41 4c 55 45 53 28 27 6f 27 2c 20 27 74 27 2c  VALUES('o', 't',
0950: 20 27 74 27 29 3b 20 0a 20 20 20 20 20 20 49 4e   't'); .      IN
0960: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
0970: 4c 55 45 53 28 27 66 27 2c 20 27 66 27 2c 20 27  LUES('f', 'f', '
0980: 73 27 29 3b 20 0a 20 20 20 20 20 20 49 4e 53 45  s'); .      INSE
0990: 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45  RT INTO abc SELE
09a0: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 20 2d  CT * FROM abc; -
09b0: 2d 20 34 0a 20 20 20 20 20 20 49 4e 53 45 52 54  - 4.      INSERT
09c0: 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54   INTO abc SELECT
09d0: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 20 2d 2d 20   * FROM abc; -- 
09e0: 38 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  8.      INSERT I
09f0: 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a  NTO abc SELECT *
0a00: 20 46 52 4f 4d 20 61 62 63 3b 20 2d 2d 20 31 36   FROM abc; -- 16
0a10: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0a20: 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20  TO abc SELECT * 
0a30: 46 52 4f 4d 20 61 62 63 3b 20 2d 2d 20 33 32 0a  FROM abc; -- 32.
0a40: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0a50: 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46  O abc SELECT * F
0a60: 52 4f 4d 20 61 62 63 3b 20 2d 2d 20 36 34 0a 20  ROM abc; -- 64. 
0a70: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0a80: 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52   abc SELECT * FR
0a90: 4f 4d 20 61 62 63 3b 20 2d 2d 20 31 32 38 0a 20  OM abc; -- 128. 
0aa0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0ab0: 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52   abc SELECT * FR
0ac0: 4f 4d 20 61 62 63 3b 20 2d 2d 20 32 35 36 0a 20  OM abc; -- 256. 
0ad0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50     COMMIT;.    P
0ae0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
0af0: 3d 20 31 30 32 34 3b 0a 20 20 20 20 56 41 43 55  = 1024;.    VACU
0b00: 55 4d 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f  UM;.  }.  db clo
0b10: 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d  se.  tv delete.}
0b20: 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f   {}.do_faultsim_
0b30: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
0b40: 32 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  2 -prep {.  faul
0b50: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
0b60: 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20  _reopen.} -body 
0b70: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0b80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 20  LECT * FROM abc 
0b90: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 73 65  }.} -test {.  se
0ba0: 74 20 61 6e 73 77 65 72 20 5b 73 70 6c 69 74 20  t answer [split 
0bb0: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 22  [string repeat "
0bc0: 6f 74 74 66 66 73 22 20 31 32 38 5d 20 22 22 5d  ottffs" 128] ""]
0bd0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
0be0: 5f 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 30 20  _result [list 0 
0bf0: 24 61 6e 73 77 65 72 5d 0a 20 20 66 61 75 6c 74  $answer].  fault
0c00: 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  sim_integrity_ch
0c10: 65 63 6b 0a 20 20 73 65 74 20 72 65 73 20 5b 64  eck.  set res [d
0c20: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
0c30: 2a 20 46 52 4f 4d 20 61 62 63 20 7d 5d 0a 20 20  * FROM abc }].  
0c40: 69 66 20 7b 24 72 65 73 20 21 3d 20 24 61 6e 73  if {$res != $ans
0c50: 77 65 72 7d 20 7b 20 65 72 72 6f 72 20 22 44 61  wer} { error "Da
0c60: 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 61  tabase content a
0c70: 70 70 65 61 72 73 20 69 6e 63 6f 72 72 65 63 74  ppears incorrect
0c80: 20 28 24 72 65 73 29 22 20 7d 0a 7d 20 0a 0a 23   ($res)" }.} ..#
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
0ce0: 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e   fault-injection
0cf0: 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62   while rolling b
0d00: 61 63 6b 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73  ack hot-journals
0d10: 20 74 68 61 74 20 77 65 72 65 20 63 72 65 61 74   that were creat
0d20: 65 64 0a 23 20 61 73 20 70 61 72 74 20 6f 66 20  ed.# as part of 
0d30: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
0d40: 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  nsaction..#.do_t
0d50: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 33  est pagerfault-3
0d60: 2d 70 72 65 31 20 7b 0a 20 20 74 65 73 74 76 66  -pre1 {.  testvf
0d70: 73 20 74 73 74 76 66 73 20 2d 64 65 66 61 75 6c  s tstvfs -defaul
0d80: 74 20 31 0a 20 20 74 73 74 76 66 73 20 66 69 6c  t 1.  tstvfs fil
0d90: 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 73  ter xDelete.  ts
0da0: 74 76 66 73 20 73 63 72 69 70 74 20 78 44 65 6c  tvfs script xDel
0db0: 65 74 65 43 61 6c 6c 62 61 63 6b 0a 0a 20 20 70  eteCallback..  p
0dc0: 72 6f 63 20 78 44 65 6c 65 74 65 43 61 6c 6c 62  roc xDeleteCallb
0dd0: 61 63 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65  ack {method file
0de0: 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74   args} {.    set
0df0: 20 66 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c   file [file tail
0e00: 20 24 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b   $file].    if {
0e10: 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a   [string match *
0e20: 6d 6a 2a 20 24 66 69 6c 65 5d 20 7d 20 7b 20 66  mj* $file] } { f
0e30: 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 7d 0a 20  aultsim_save }. 
0e40: 20 7d 0a 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64   }..  faultsim_d
0e50: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
0e60: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
0e70: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 20 20  ing a_string..  
0e80: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54  execsql {.    AT
0e90: 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20  TACH 'test.db2' 
0ea0: 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47  AS aux;.    PRAG
0eb0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
0ec0: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50 52  = DELETE;.    PR
0ed0: 41 47 4d 41 20 6d 61 69 6e 2e 63 61 63 68 65 5f  AGMA main.cache_
0ee0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50  size = 10;.    P
0ef0: 52 41 47 4d 41 20 61 75 78 2e 63 61 63 68 65 5f  RAGMA aux.cache_
0f00: 73 69 7a 65 20 3d 20 31 30 3b 0a 0a 20 20 20 20  size = 10;..    
0f10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0f20: 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51  a UNIQUE, b UNIQ
0f30: 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  UE);.    CREATE 
0f40: 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61 20 55  TABLE aux.t2(a U
0f50: 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55 45 29  NIQUE, b UNIQUE)
0f60: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0f70: 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74  O t1 VALUES(a_st
0f80: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
0f90: 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20 20 49  ing(300));.    I
0fa0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
0fb0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
0fc0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
0fd0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
0fe0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
0ff0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
1000: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
1010: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
1020: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
1030: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
1040: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
1050: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1060: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
1070: 28 32 30 31 29 2c 20 61 5f 73 74 72 69 6e 67 28  (201), a_string(
1080: 33 30 31 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  301) FROM t1;.  
1090: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10a0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
10b0: 6e 67 28 32 30 32 29 2c 20 61 5f 73 74 72 69 6e  ng(202), a_strin
10c0: 67 28 33 30 32 29 20 46 52 4f 4d 20 74 31 3b 0a  g(302) FROM t1;.
10d0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
10e0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
10f0: 72 69 6e 67 28 32 30 33 29 2c 20 61 5f 73 74 72  ring(203), a_str
1100: 69 6e 67 28 33 30 33 29 20 46 52 4f 4d 20 74 31  ing(303) FROM t1
1110: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1120: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
1130: 73 74 72 69 6e 67 28 32 30 34 29 2c 20 61 5f 73  string(204), a_s
1140: 74 72 69 6e 67 28 33 30 34 29 20 46 52 4f 4d 20  tring(304) FROM 
1150: 74 31 3b 0a 20 20 20 20 20 20 52 45 50 4c 41 43  t1;.      REPLAC
1160: 45 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  E INTO t2 SELECT
1170: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
1180: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 64  COMMIT;.  }..  d
1190: 62 20 63 6c 6f 73 65 0a 20 20 74 73 74 76 66 73  b close.  tstvfs
11a0: 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 64 6f 5f   delete.} {}.do_
11b0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
11c0: 67 65 72 66 61 75 6c 74 2d 33 20 2d 70 72 65 70  gerfault-3 -prep
11d0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
11e0: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
11f0: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65  .} -body {.  exe
1200: 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54 54 41  csql { .    ATTA
1210: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
1220: 20 61 75 78 3b 0a 20 20 20 20 53 45 4c 45 43 54   aux;.    SELECT
1230: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1240: 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  2;.    SELECT co
1250: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
1260: 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20    }.} -test {.  
1270: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
1280: 73 75 6c 74 20 7b 30 20 7b 34 20 34 7d 7d 20 7b  sult {0 {4 4}} {
1290: 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  1 {unable to ope
12a0: 6e 20 64 61 74 61 62 61 73 65 3a 20 74 65 73 74  n database: test
12b0: 2e 64 62 32 7d 7d 0a 20 20 66 61 75 6c 74 73 69  .db2}}.  faultsi
12c0: 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  m_integrity_chec
12d0: 6b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41  k.  catchsql { A
12e0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
12f0: 20 41 53 20 61 75 78 20 7d 0a 20 20 69 66 20 7b   AS aux }.  if {
1300: 5b 64 62 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54  [db one { SELECT
1310: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1320: 31 20 7d 5d 20 21 3d 20 34 0a 20 20 20 7c 7c 20  1 }] != 4.   || 
1330: 5b 64 62 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54  [db one { SELECT
1340: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1350: 32 20 7d 5d 20 21 3d 20 34 0a 20 20 7d 20 7b 0a  2 }] != 4.  } {.
1360: 20 20 20 20 65 72 72 6f 72 20 22 44 61 74 61 62      error "Datab
1370: 61 73 65 20 63 6f 6e 74 65 6e 74 20 61 70 70 65  ase content appe
1380: 61 72 73 20 69 6e 63 6f 72 72 65 63 74 22 0a 20  ars incorrect". 
1390: 20 7d 0a 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e0: 0a 23 20 54 65 73 74 20 66 61 75 6c 74 2d 69 6e  .# Test fault-in
13f0: 6a 65 63 74 69 6f 6e 20 61 73 20 70 61 72 74 20  jection as part 
1400: 6f 66 20 61 20 76 61 6e 69 6c 6c 61 2c 20 6e 6f  of a vanilla, no
1410: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 49 4e  -transaction, IN
1420: 53 45 52 54 0a 23 20 73 74 61 74 65 6d 65 6e 74  SERT.# statement
1430: 2e 0a 23 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  ..#.do_faultsim_
1440: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
1450: 34 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  4 -prep {.  faul
1460: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
1470: 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b  reopen.} -body {
1480: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
1490: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
14a0: 28 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (y);.    INSERT 
14b0: 49 4e 54 4f 20 78 20 56 41 4c 55 45 53 28 27 7a  INTO x VALUES('z
14c0: 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  ');.    SELECT *
14d0: 20 46 52 4f 4d 20 78 3b 0a 20 20 7d 0a 7d 20 2d   FROM x;.  }.} -
14e0: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
14f0: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
1500: 20 7a 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69   z}.  faultsim_i
1510: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d  ntegrity_check.}
1520: 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
1570: 65 73 74 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74  est fault-inject
1580: 69 6f 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  ion as part of a
1590: 20 63 6f 6d 6d 69 74 20 77 68 65 6e 20 75 73 69   commit when usi
15a0: 6e 67 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  ng journal_mode=
15b0: 50 45 52 53 49 53 54 2e 0a 23 20 54 68 72 65 65  PERSIST..# Three
15c0: 20 64 69 66 66 65 72 65 6e 74 20 63 61 73 65 73   different cases
15d0: 3a 0a 23 0a 23 20 20 20 20 70 61 67 65 72 66 61  :.#.#    pagerfa
15e0: 75 6c 74 2d 35 2e 31 3a 20 57 69 74 68 20 6e 6f  ult-5.1: With no
15f0: 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69   journal_size_li
1600: 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 2e 0a  mit configured..
1610: 23 20 20 20 20 70 61 67 65 72 66 61 75 6c 74 2d  #    pagerfault-
1620: 35 2e 32 3a 20 57 69 74 68 20 61 20 6a 6f 75 72  5.2: With a jour
1630: 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 20 63  nal_size_limit c
1640: 6f 6e 66 69 67 75 72 65 64 2e 0a 23 20 20 20 20  onfigured..#    
1650: 70 61 67 65 72 66 61 75 6c 74 2d 35 2e 34 3a 20  pagerfault-5.4: 
1660: 4d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  Multi-file trans
1670: 61 63 74 69 6f 6e 2e 20 4f 6e 65 20 63 6f 6e 6e  action. One conn
1680: 65 63 74 69 6f 6e 20 68 61 73 20 61 20 0a 23 20  ection has a .# 
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f     journal_size_
16b0: 6c 69 6d 69 74 20 6f 66 20 30 2c 20 74 68 65 20  limit of 0, the 
16c0: 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 6c 69 6d  other has no lim
16d0: 69 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  it..#.do_test pa
16e0: 67 65 72 66 61 75 6c 74 2d 35 2d 70 72 65 31 20  gerfault-5-pre1 
16f0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
1700: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
1710: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
1720: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
1730: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
1740: 45 20 54 41 42 4c 45 20 74 31 28 61 20 55 4e 49  E TABLE t1(a UNI
1750: 51 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  QUE, b UNIQUE);.
1760: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1770: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
1780: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
1790: 67 28 33 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  g(300));.    INS
17a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
17b0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
17c0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
17d0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
17e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
17f0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
1800: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
1810: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 66  FROM t1;.  }.  f
1820: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
1830: 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66  _close.} {}.do_f
1840: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
1850: 65 72 66 61 75 6c 74 2d 35 2e 31 20 2d 70 72 65  erfault-5.1 -pre
1860: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
1870: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
1880: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
1890: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
18a0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
18b0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
18c0: 50 45 52 53 49 53 54 20 7d 0a 7d 20 2d 62 6f 64  PERSIST }.} -bod
18d0: 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  y {.  execsql { 
18e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
18f0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
1900: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
1910: 30 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d  0) FROM t1 }.} -
1920: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
1930: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
1940: 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f   {}}.  faultsim_
1950: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
1960: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
1970: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 35 2e  st pagerfault-5.
1980: 32 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  2 -prep {.  faul
1990: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
19a0: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
19b0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
19c0: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ing.  execsql { 
19d0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
19e0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
19f0: 53 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  ST;.    PRAGMA j
1a00: 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69  ournal_size_limi
1a10: 74 20 3d 20 32 30 34 38 3b 0a 20 20 7d 0a 7d 20  t = 2048;.  }.} 
1a20: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
1a30: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
1a40: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
1a50: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
1a60: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 20 7d  g(300) FROM t1 }
1a70: 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75  .} -test {.  fau
1a80: 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c  ltsim_test_resul
1a90: 74 20 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74  t {0 {}}.  fault
1aa0: 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  sim_integrity_ch
1ab0: 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74 73 69  eck.}.do_faultsi
1ac0: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
1ad0: 74 2d 35 2e 33 20 2d 66 61 75 6c 74 73 20 6f 6f  t-5.3 -faults oo
1ae0: 6d 2d 74 72 61 6e 73 69 65 6e 74 20 2d 70 72 65  m-transient -pre
1af0: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
1b00: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
1b10: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
1b20: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
1b30: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
1b40: 63 65 20 74 65 73 74 32 2e 64 62 20 74 65 73 74  ce test2.db test
1b50: 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73  2.db-journal tes
1b60: 74 32 2e 64 62 2d 77 61 6c 0a 20 20 65 78 65 63  t2.db-wal.  exec
1b70: 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d  sql { .    PRAGM
1b80: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
1b90: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 41 54   PERSIST;.    AT
1ba0: 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20  TACH 'test2.db' 
1bb0: 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47  AS aux;.    PRAG
1bc0: 4d 41 20 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 6d  MA aux.journal_m
1bd0: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
1be0: 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 6a 6f     PRAGMA aux.jo
1bf0: 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74  urnal_size_limit
1c00: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64   = 0;.  }.} -bod
1c10: 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  y {.  execsql {.
1c20: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
1c30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1c40: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
1c50: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
1c60: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
1c70: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1c80: 61 75 78 2e 74 32 20 41 53 20 53 45 4c 45 43 54  aux.t2 AS SELECT
1c90: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
1ca0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 2d 74  COMMIT;.  }.} -t
1cb0: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
1cc0: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
1cd0: 7b 7d 7d 0a 0a 20 20 63 61 74 63 68 73 71 6c 20  {}}..  catchsql 
1ce0: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 63 61 74  { COMMIT }.  cat
1cf0: 63 68 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b  chsql { ROLLBACK
1d00: 20 7d 0a 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69   }..  faultsim_i
1d10: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20  ntegrity_check. 
1d20: 20 73 65 74 20 72 65 73 20 22 22 0a 20 20 73 65   set res "".  se
1d30: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20 73 65  t rc [catch { se
1d40: 74 20 72 65 73 20 5b 64 62 20 6f 6e 65 20 7b 20  t res [db one { 
1d50: 50 52 41 47 4d 41 20 61 75 78 2e 69 6e 74 65 67  PRAGMA aux.integ
1d60: 72 69 74 79 5f 63 68 65 63 6b 20 7d 5d 20 7d 5d  rity_check }] }]
1d70: 0a 20 20 69 66 20 7b 24 72 63 21 3d 30 20 7c 7c  .  if {$rc!=0 ||
1d80: 20 24 72 65 73 20 21 3d 20 22 6f 6b 22 7d 20 7b   $res != "ok"} {
1d90: 65 72 72 6f 72 20 22 69 6e 74 65 67 72 69 74 79  error "integrity
1da0: 2d 63 68 65 63 6b 20 70 72 6f 62 6c 65 6d 3a 24  -check problem:$
1db0: 72 63 20 24 72 65 73 22 7d 0a 7d 0a 0a 23 2d 2d  rc $res"}.}..#--
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 2d 2d  ----------------
1e00: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66  -------.# Test f
1e10: 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 61  ault-injection a
1e20: 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d  s part of a comm
1e30: 69 74 20 77 68 65 6e 20 75 73 69 6e 67 20 0a 23  it when using .#
1e40: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52   journal_mode=TR
1e50: 55 4e 43 41 54 45 2e 0a 23 0a 64 6f 5f 74 65 73  UNCATE..#.do_tes
1e60: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 36 2d 70  t pagerfault-6-p
1e70: 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  re1 {.  faultsim
1e80: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
1e90: 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  en.  db func a_s
1ea0: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
1eb0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
1ec0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
1ed0: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
1ee0: 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  E);.    INSERT I
1ef0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
1f00: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
1f10: 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 7d  tring(300));.  }
1f20: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  .  faultsim_save
1f30: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a  _and_close.} {}.
1f40: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
1f50: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 36 2e 31  t pagerfault-6.1
1f60: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
1f70: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
1f80: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
1f90: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
1fa0: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50  ng.  execsql { P
1fb0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
1fc0: 64 65 20 3d 20 54 52 55 4e 43 41 54 45 20 7d 0a  de = TRUNCATE }.
1fd0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
1fe0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
1ff0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
2000: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
2010: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31  ing(300) FROM t1
2020: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   }.  execsql { I
2030: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2040: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
2050: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
2060: 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d 74  ) FROM t1 }.} -t
2070: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
2080: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
2090: 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69  {}}.  faultsim_i
20a0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d  ntegrity_check.}
20b0: 0a 0a 23 20 54 68 65 20 75 6e 69 78 20 76 66 73  ..# The unix vfs
20c0: 20 78 41 63 63 65 73 73 28 29 20 6d 65 74 68 6f   xAccess() metho
20d0: 64 20 63 6f 6e 73 69 64 65 72 73 20 61 20 66 69  d considers a fi
20e0: 6c 65 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  le zero bytes in
20f0: 20 73 69 7a 65 20 74 6f 0a 23 20 22 6e 6f 74 20   size to.# "not 
2100: 65 78 69 73 74 22 2e 20 54 68 69 73 20 70 72 6f  exist". This pro
2110: 63 20 6f 76 65 72 72 69 64 65 73 20 74 68 61 74  c overrides that
2120: 20 62 65 68 61 76 69 6f 75 72 20 73 6f 20 74 68   behaviour so th
2130: 61 74 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  at a zero length
2140: 0a 23 20 66 69 6c 65 20 69 73 20 63 6f 6e 73 69  .# file is consi
2150: 64 65 72 65 64 20 74 6f 20 65 78 69 73 74 2e 0a  dered to exist..
2160: 23 0a 70 72 6f 63 20 78 41 63 63 65 73 73 20 7b  #.proc xAccess {
2170: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
2180: 6f 70 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20  op args} {.  if 
2190: 7b 24 6f 70 20 21 3d 20 22 53 51 4c 49 54 45 5f  {$op != "SQLITE_
21a0: 41 43 43 45 53 53 5f 45 58 49 53 54 53 22 7d 20  ACCESS_EXISTS"} 
21b0: 7b 20 72 65 74 75 72 6e 20 22 22 20 7d 0a 20 20  { return "" }.  
21c0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 65 78 69  return [file exi
21d0: 73 74 73 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 7d  sts $filename].}
21e0: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
21f0: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 36 2e 32  t pagerfault-6.2
2200: 20 2d 66 61 75 6c 74 73 20 63 61 6e 74 6f 70 65   -faults cantope
2210: 6e 2d 2a 20 2d 70 72 65 70 20 7b 0a 20 20 73 68  n-* -prep {.  sh
2220: 6d 66 61 75 6c 74 20 66 69 6c 74 65 72 20 78 41  mfault filter xA
2230: 63 63 65 73 73 0a 20 20 73 68 6d 66 61 75 6c 74  ccess.  shmfault
2240: 20 73 63 72 69 70 74 20 78 41 63 63 65 73 73 0a   script xAccess.
2250: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
2260: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
2270: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
2280: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
2290: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
22a0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55  urnal_mode = TRU
22b0: 4e 43 41 54 45 20 7d 0a 7d 20 2d 62 6f 64 79 20  NCATE }.} -body 
22c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
22d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
22e0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
22f0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
2300: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78 65   FROM t1 }.  exe
2310: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
2320: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
2330: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
2340: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74  ring(300) FROM t
2350: 31 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20  1 }.} -test {.  
2360: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
2370: 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20 66 61  sult {0 {}}.  fa
2380: 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79  ultsim_integrity
2390: 5f 63 68 65 63 6b 0a 7d 0a 0a 23 20 54 68 65 20  _check.}..# The 
23a0: 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61 6e  following was an
23b0: 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
23c0: 61 20 62 69 74 76 65 63 20 6d 61 6c 6c 6f 63 20  a bitvec malloc 
23d0: 74 6f 20 66 61 69 6c 2e 20 44 69 64 6e 27 74 20  to fail. Didn't 
23e0: 77 6f 72 6b 2e 0a 23 0a 23 20 64 6f 5f 74 65 73  work..#.# do_tes
23f0: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 36 2d 70  t pagerfault-6-p
2400: 72 65 31 20 7b 0a 23 20 20 20 66 61 75 6c 74 73  re1 {.#   faults
2410: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
2420: 6f 70 65 6e 0a 23 20 20 20 65 78 65 63 73 71 6c  open.#   execsql
2430: 20 7b 0a 23 20 20 20 20 20 43 52 45 41 54 45 20   {.#     CREATE 
2440: 54 41 42 4c 45 20 74 31 28 78 2c 20 79 2c 20 55  TABLE t1(x, y, U
2450: 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 23 20  NIQUE(x, y));.# 
2460: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2470: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
2480: 64 6f 6d 62 6c 6f 62 28 31 35 30 31 29 29 3b 0a  domblob(1501));.
2490: 23 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  #     INSERT INT
24a0: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72  O t1 VALUES(2, r
24b0: 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 32 29 29  andomblob(1502))
24c0: 3b 0a 23 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.#     INSERT I
24d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
24e0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 33   randomblob(1503
24f0: 29 29 3b 0a 23 20 20 20 20 20 49 4e 53 45 52 54  ));.#     INSERT
2500: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2510: 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  4, randomblob(15
2520: 30 34 29 29 3b 0a 23 20 20 20 20 20 49 4e 53 45  04));.#     INSE
2530: 52 54 20 49 4e 54 4f 20 74 31 20 0a 23 20 20 20  RT INTO t1 .#   
2540: 20 20 20 20 53 45 4c 45 43 54 20 78 2c 20 72 61      SELECT x, ra
2550: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 2b 6f 69  ndomblob(1500+oi
2560: 64 2b 28 53 45 4c 45 43 54 20 6d 61 78 28 6f 69  d+(SELECT max(oi
2570: 64 29 20 46 52 4f 4d 20 74 31 29 29 20 46 52 4f  d) FROM t1)) FRO
2580: 4d 20 74 31 3b 0a 23 20 20 20 20 20 49 4e 53 45  M t1;.#     INSE
2590: 52 54 20 49 4e 54 4f 20 74 31 20 0a 23 20 20 20  RT INTO t1 .#   
25a0: 20 20 20 20 53 45 4c 45 43 54 20 78 2c 20 72 61      SELECT x, ra
25b0: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 2b 6f 69  ndomblob(1500+oi
25c0: 64 2b 28 53 45 4c 45 43 54 20 6d 61 78 28 6f 69  d+(SELECT max(oi
25d0: 64 29 20 46 52 4f 4d 20 74 31 29 29 20 46 52 4f  d) FROM t1)) FRO
25e0: 4d 20 74 31 3b 0a 23 20 20 20 20 20 49 4e 53 45  M t1;.#     INSE
25f0: 52 54 20 49 4e 54 4f 20 74 31 20 0a 23 20 20 20  RT INTO t1 .#   
2600: 20 20 20 20 53 45 4c 45 43 54 20 78 2c 20 72 61      SELECT x, ra
2610: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 2b 6f 69  ndomblob(1500+oi
2620: 64 2b 28 53 45 4c 45 43 54 20 6d 61 78 28 6f 69  d+(SELECT max(oi
2630: 64 29 20 46 52 4f 4d 20 74 31 29 29 20 46 52 4f  d) FROM t1)) FRO
2640: 4d 20 74 31 3b 0a 23 20 20 20 20 20 49 4e 53 45  M t1;.#     INSE
2650: 52 54 20 49 4e 54 4f 20 74 31 20 0a 23 20 20 20  RT INTO t1 .#   
2660: 20 20 20 20 53 45 4c 45 43 54 20 78 2c 20 72 61      SELECT x, ra
2670: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 2b 6f 69  ndomblob(1500+oi
2680: 64 2b 28 53 45 4c 45 43 54 20 6d 61 78 28 6f 69  d+(SELECT max(oi
2690: 64 29 20 46 52 4f 4d 20 74 31 29 29 20 46 52 4f  d) FROM t1)) FRO
26a0: 4d 20 74 31 3b 0a 23 20 20 20 7d 0a 23 20 20 20  M t1;.#   }.#   
26b0: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e  faultsim_save_an
26c0: 64 5f 63 6c 6f 73 65 0a 23 20 7d 20 7b 7d 0a 23  d_close.# } {}.#
26d0: 20 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73   do_faultsim_tes
26e0: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 36 20 2d  t pagerfault-6 -
26f0: 70 72 65 70 20 7b 0a 23 20 20 20 66 61 75 6c 74  prep {.#   fault
2700: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
2710: 72 65 6f 70 65 6e 0a 23 20 7d 20 2d 62 6f 64 79  reopen.# } -body
2720: 20 7b 0a 23 20 20 20 65 78 65 63 73 71 6c 20 7b   {.#   execsql {
2730: 20 0a 23 20 20 20 20 20 42 45 47 49 4e 3b 0a 23   .#     BEGIN;.#
2740: 20 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31         UPDATE t1
2750: 20 53 45 54 20 78 3d 78 2b 34 20 57 48 45 52 45   SET x=x+4 WHERE
2760: 20 78 3d 31 3b 0a 23 20 20 20 20 20 20 20 53 41   x=1;.#       SA
2770: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 23 20 20  VEPOINT one;.#  
2780: 20 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31         UPDATE t1
2790: 20 53 45 54 20 78 3d 78 2b 34 20 57 48 45 52 45   SET x=x+4 WHERE
27a0: 20 78 3d 32 3b 0a 23 20 20 20 20 20 20 20 20 20   x=2;.#         
27b0: 53 41 56 45 50 4f 49 4e 54 20 74 68 72 65 65 3b  SAVEPOINT three;
27c0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 55 50 44  .#           UPD
27d0: 41 54 45 20 74 31 20 53 45 54 20 78 3d 78 2b 34  ATE t1 SET x=x+4
27e0: 20 57 48 45 52 45 20 78 3d 33 3b 0a 23 20 20 20   WHERE x=3;.#   
27f0: 20 20 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e          SAVEPOIN
2800: 54 20 66 6f 75 72 3b 0a 23 20 20 20 20 20 20 20  T four;.#       
2810: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
2820: 53 45 54 20 78 3d 78 2b 34 20 57 48 45 52 45 20  SET x=x+4 WHERE 
2830: 78 3d 34 3b 0a 23 20 20 20 20 20 20 20 20 20 52  x=4;.#         R
2840: 45 4c 45 41 53 45 20 74 68 72 65 65 3b 0a 23 20  ELEASE three;.# 
2850: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 23 20 20 20      COMMIT;.#   
2860: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
2870: 54 20 78 20 46 52 4f 4d 20 74 31 3b 0a 23 20 20  T x FROM t1;.#  
2880: 20 7d 0a 23 20 7d 20 2d 74 65 73 74 20 7b 0a 23   }.# } -test {.#
2890: 20 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74     faultsim_test
28a0: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 35 20 36 20  _result {0 {5 6 
28b0: 37 20 38 7d 7d 0a 23 20 20 20 66 61 75 6c 74 73  7 8}}.#   faults
28c0: 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65  im_integrity_che
28d0: 63 6b 0a 23 20 7d 0a 23 0a 0a 23 20 54 68 69 73  ck.# }.#..# This
28e0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
28f0: 70 72 6f 76 6f 6b 65 20 61 20 73 70 65 63 69 61  provoke a specia
2900: 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 70 61  l case in the pa
2910: 67 65 72 20 63 6f 64 65 3a 0a 23 0a 23 20 49 66  ger code:.#.# If
2920: 20 61 6e 20 65 72 72 6f 72 20 28 73 70 65 63 69   an error (speci
2930: 66 69 63 61 6c 6c 79 2c 20 61 20 46 55 4c 4c 20  fically, a FULL 
2940: 6f 72 20 49 4f 45 52 52 20 65 72 72 6f 72 29 20  or IOERR error) 
2950: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69  occurs while wri
2960: 74 69 6e 67 20 61 0a 23 20 64 69 72 74 79 20 70  ting a.# dirty p
2970: 61 67 65 20 74 6f 20 74 68 65 20 66 69 6c 65 2d  age to the file-
2980: 73 79 73 74 65 6d 20 69 6e 20 6f 72 64 65 72 20  system in order 
2990: 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72  to free up memor
29a0: 79 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  y, the pager ent
29b0: 65 72 73 0a 23 20 74 68 65 20 22 65 72 72 6f 72  ers.# the "error
29c0: 20 73 74 61 74 65 22 2e 20 41 6e 20 49 4f 20 65   state". An IO e
29d0: 72 72 6f 72 20 63 61 75 73 65 73 20 53 51 4c 69  rror causes SQLi
29e0: 74 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  te to roll back 
29f0: 74 68 65 20 63 75 72 72 65 6e 74 0a 23 20 74 72  the current.# tr
2a00: 61 6e 73 61 63 74 69 6f 6e 20 28 65 78 69 74 69  ansaction (exiti
2a10: 6e 67 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ng the error sta
2a20: 74 65 29 2e 20 41 20 46 55 4c 4c 20 65 72 72 6f  te). A FULL erro
2a30: 72 2c 20 68 6f 77 65 76 65 72 2c 20 6d 61 79 20  r, however, may 
2a40: 6f 6e 6c 79 0a 23 20 72 6f 6c 6c 62 61 63 6b 20  only.# rollback 
2a50: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
2a60: 65 6d 65 6e 74 2e 0a 23 0a 23 20 54 68 69 73 20  ement..#.# This 
2a70: 62 6c 6f 63 6b 20 74 65 73 74 73 20 74 68 61 74  block tests that
2a80: 20 6e 6f 74 68 69 6e 67 20 67 6f 65 73 20 77 72   nothing goes wr
2a90: 6f 6e 67 20 69 66 20 61 20 46 55 4c 4c 20 65 72  ong if a FULL er
2aa0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2ab0: 0a 23 20 77 72 69 74 69 6e 67 20 61 20 64 69 72  .# writing a dir
2ac0: 74 79 20 70 61 67 65 20 6f 75 74 20 74 6f 20 66  ty page out to f
2ad0: 72 65 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ree memory from 
2ae0: 77 69 74 68 69 6e 20 61 20 73 74 61 74 65 6d 65  within a stateme
2af0: 6e 74 20 74 68 61 74 20 68 61 73 0a 23 20 6f 70  nt that has.# op
2b00: 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
2b10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
2b20: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  do_test pagerfau
2b30: 6c 74 2d 37 2d 70 72 65 31 20 7b 0a 20 20 66 61  lt-7-pre1 {.  fa
2b40: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
2b50: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
2b60: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2b70: 54 41 42 4c 45 20 74 32 28 61 20 49 4e 54 45 47  TABLE t2(a INTEG
2b80: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
2b90: 62 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  b);.    BEGIN;. 
2ba0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2bb0: 20 74 32 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c   t2 VALUES(NULL,
2bc0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
2bd0: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
2be0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
2bf0: 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  NULL, randomblob
2c00: 28 31 35 30 30 29 29 3b 0a 20 20 20 20 20 20 49  (1500));.      I
2c10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
2c20: 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f  LECT NULL, rando
2c30: 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
2c40: 20 74 32 3b 20 20 20 20 2d 2d 20 20 34 0a 20 20   t2;    --  4.  
2c50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2c60: 74 32 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t2 SELECT NULL, 
2c70: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2c80: 20 46 52 4f 4d 20 74 32 3b 20 20 20 20 2d 2d 20   FROM t2;    -- 
2c90: 20 38 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   8.      INSERT 
2ca0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 4e  INTO t2 SELECT N
2cb0: 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  ULL, randomblob(
2cc0: 31 35 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 20  1500) FROM t2;  
2cd0: 20 20 2d 2d 20 31 36 0a 20 20 20 20 20 20 49 4e    -- 16.      IN
2ce0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
2cf0: 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d  ECT NULL, random
2d00: 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
2d10: 74 32 3b 20 20 20 20 2d 2d 20 33 32 0a 20 20 20  t2;    -- 32.   
2d20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2d30: 32 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72  2 SELECT NULL, r
2d40: 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
2d50: 46 52 4f 4d 20 74 32 3b 20 20 20 20 2d 2d 20 36  FROM t2;    -- 6
2d60: 34 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  4.    COMMIT;.  
2d70: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2d80: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
2d90: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
2da0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a  INTO t1 SELECT *
2db0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 44 52   FROM t2;.    DR
2dc0: 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 7d  OP TABLE t2;.  }
2dd0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  .  faultsim_save
2de0: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a  _and_close.} {}.
2df0: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
2e00: 20 70 61 67 65 72 66 61 75 6c 74 2d 37 20 2d 70   pagerfault-7 -p
2e10: 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  rep {.  faultsim
2e20: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
2e30: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  pen.  execsql { 
2e40: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
2e50: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
2e60: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
2e70: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
2e80: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2e90: 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  ;.  }.} -body {.
2ea0: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
2eb0: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 36 35  TE t1 SET a = 65
2ec0: 2c 20 62 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62  , b = randomblob
2ed0: 28 31 35 30 30 29 20 57 48 45 52 45 20 28 61 2b  (1500) WHERE (a+
2ee0: 31 29 3e 32 30 30 20 7d 0a 20 20 65 78 65 63 73  1)>200 }.  execs
2ef0: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 2d 74 65 73  ql COMMIT.} -tes
2f00: 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74  t {.  faultsim_t
2f10: 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d  est_result {0 {}
2f20: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74  }.  faultsim_int
2f30: 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a  egrity_check.}..
2f40: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  do_test pagerfau
2f50: 6c 74 2d 38 2d 70 72 65 31 20 7b 0a 20 20 66 61  lt-8-pre1 {.  fa
2f60: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
2f70: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
2f80: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
2f90: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b  auto_vacuum = 1;
2fa0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2fb0: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a INTEGER P
2fc0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
2fd0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2fe0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2ff0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 72 61 6e  VALUES(NULL, ran
3000: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
3010: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3020: 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O t1 VALUES(NULL
3030: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
3040: 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  0));.      INSER
3050: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
3060: 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f   NULL, randomblo
3070: 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
3080: 20 20 20 20 2d 2d 20 20 34 0a 20 20 20 20 20 20      --  4.      
3090: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
30a0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64  ELECT NULL, rand
30b0: 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
30c0: 4d 20 74 31 3b 20 20 20 20 2d 2d 20 20 38 0a 20  M t1;    --  8. 
30d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
30e0: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
30f0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
3100: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 2d 2d  ) FROM t1;    --
3110: 20 31 36 0a 20 20 20 20 20 20 49 4e 53 45 52 54   16.      INSERT
3120: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3130: 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  NULL, randomblob
3140: 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  (1500) FROM t1; 
3150: 20 20 20 2d 2d 20 33 32 0a 20 20 20 20 20 20 49     -- 32.      I
3160: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
3170: 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f  LECT NULL, rando
3180: 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
3190: 20 74 31 3b 20 20 20 20 2d 2d 20 36 34 0a 20 20   t1;    -- 64.  
31a0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
31b0: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e  faultsim_save_an
31c0: 64 5f 63 6c 6f 73 65 0a 20 20 73 65 74 20 66 69  d_close.  set fi
31d0: 6c 65 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a  lesize [file siz
31e0: 65 20 74 65 73 74 2e 64 62 5d 0a 20 20 73 65 74  e test.db].  set
31f0: 20 7b 7d 20 7b 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74   {} {}.} {}.do_t
3200: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 38  est pagerfault-8
3210: 2d 70 72 65 32 20 7b 0a 20 20 66 61 75 6c 74 73  -pre2 {.  faults
3220: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
3230: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3240: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31  { DELETE FROM t1
3250: 20 57 48 45 52 45 20 61 3e 33 32 20 7d 0a 20 20   WHERE a>32 }.  
3260: 65 78 70 72 20 7b 5b 66 69 6c 65 20 73 69 7a 65  expr {[file size
3270: 20 74 65 73 74 2e 64 62 5d 20 3c 20 24 66 69 6c   test.db] < $fil
3280: 65 73 69 7a 65 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f  esize}.} {1}.do_
3290: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
32a0: 67 65 72 66 61 75 6c 74 2d 38 20 2d 70 72 65 70  gerfault-8 -prep
32b0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
32c0: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
32d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
32e0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 44 45 4c    BEGIN;.    DEL
32f0: 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
3300: 45 20 61 3e 33 32 3b 0a 20 20 7d 0a 7d 20 2d 62  E a>32;.  }.} -b
3310: 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ody {.  execsql 
3320: 43 4f 4d 4d 49 54 0a 7d 20 2d 74 65 73 74 20 7b  COMMIT.} -test {
3330: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
3340: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20  _result {0 {}}. 
3350: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
3360: 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 23 2d 2d  ity_check.}..#--
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 2d 2d  ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 74  -------.# This t
33c0: 65 73 74 20 63 61 73 65 20 69 73 20 73 70 65 63  est case is spec
33d0: 69 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20 73  ially designed s
33e0: 6f 20 74 68 61 74 20 64 75 72 69 6e 67 20 61 20  o that during a 
33f0: 73 61 76 65 70 6f 69 6e 74 20 0a 23 20 72 6f 6c  savepoint .# rol
3400: 6c 62 61 63 6b 2c 20 61 20 6e 65 77 20 63 61 63  lback, a new cac
3410: 68 65 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  he entry must be
3420: 20 61 6c 6c 6f 63 61 74 65 64 20 28 73 65 65 20   allocated (see 
3430: 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e  comments surroun
3440: 64 69 6e 67 0a 23 20 74 68 65 20 63 61 6c 6c 20  ding.# the call 
3450: 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  to sqlite3PagerA
3460: 63 71 75 69 72 65 28 29 20 66 72 6f 6d 20 77 69  cquire() from wi
3470: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
3480: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 0a 23  ack_one_page().#
3490: 20 66 6f 72 20 64 65 74 61 69 6c 73 29 2e 20 54   for details). T
34a0: 65 73 74 20 74 68 65 20 65 66 66 65 63 74 73 20  est the effects 
34b0: 6f 66 20 69 6e 6a 65 63 74 69 6e 67 20 61 6e 20  of injecting an 
34c0: 4f 4f 4d 20 61 74 20 74 68 69 73 20 70 6f 69 6e  OOM at this poin
34d0: 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  t..#.do_test pag
34e0: 65 72 66 61 75 6c 74 2d 39 2d 70 72 65 31 20 7b  erfault-9-pre1 {
34f0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
3500: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
3510: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
3520: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
3530: 20 3d 20 69 6e 63 72 65 6d 65 6e 74 61 6c 3b 0a   = incremental;.
3540: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3550: 20 74 31 28 78 29 3b 0a 20 20 20 20 43 52 45 41   t1(x);.    CREA
3560: 54 45 20 54 41 42 4c 45 20 74 32 28 79 29 3b 0a  TE TABLE t2(y);.
3570: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3580: 20 74 33 28 7a 29 3b 0a 0a 20 20 20 20 49 4e 53   t3(z);..    INS
3590: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
35a0: 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  ES(randomblob(90
35b0: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
35c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
35d0: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b  andomblob(900));
35e0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
35f0: 20 74 31 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74   t1;.  }.  fault
3600: 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f  sim_save_and_clo
3610: 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74  se.} {}.do_fault
3620: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
3630: 75 6c 74 2d 39 2e 31 20 2d 70 72 65 70 20 7b 0a  ult-9.1 -prep {.
3640: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
3650: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
3660: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42  execsql { .    B
3670: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
3680: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3690: 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  S(randomblob(900
36a0: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
36b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
36c0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
36d0: 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42  ;.      DROP TAB
36e0: 4c 45 20 74 33 3b 0a 20 20 20 20 20 20 44 52 4f  LE t3;.      DRO
36f0: 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 20 20  P TABLE t2;.    
3700: 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b    SAVEPOINT abc;
3710: 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  .        PRAGMA 
3720: 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75  incremental_vacu
3730: 75 6d 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20  um;.  }.} -body 
3740: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3750: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62    ROLLBACK TO ab
3760: 63 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  c;.    COMMIT;. 
3770: 20 20 20 50 52 41 47 4d 41 20 66 72 65 65 6c 69     PRAGMA freeli
3780: 73 74 5f 63 6f 75 6e 74 0a 20 20 7d 0a 7d 20 2d  st_count.  }.} -
3790: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
37a0: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
37b0: 20 32 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69   2}.  faultsim_i
37c0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 0a  ntegrity_check..
37d0: 20 20 73 65 74 20 73 6c 20 5b 64 62 20 6f 6e 65    set sl [db one
37e0: 20 7b 20 53 45 4c 45 43 54 20 43 4f 41 4c 45 53   { SELECT COALES
37f0: 43 45 28 73 75 6d 28 6c 65 6e 67 74 68 28 78 29  CE(sum(length(x)
3800: 29 2c 20 27 6e 75 6c 6c 27 29 20 46 52 4f 4d 20  ), 'null') FROM 
3810: 74 31 20 7d 5d 0a 20 20 69 66 20 7b 24 73 6c 21  t1 }].  if {$sl!
3820: 3d 22 6e 75 6c 6c 22 20 26 26 20 24 73 6c 21 3d  ="null" && $sl!=
3830: 31 38 30 30 7d 20 7b 20 0a 20 20 20 20 65 72 72  1800} { .    err
3840: 6f 72 20 22 43 6f 6e 74 65 6e 74 20 6c 6f 6f 6b  or "Content look
3850: 73 20 6e 6f 20 67 6f 6f 64 2e 2e 2e 20 28 24 73  s no good... ($s
3860: 6c 29 22 20 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d  l)" .  }.}..#---
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 2d 2d 2d  ----------------
38b0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61  ------.# Test fa
38c0: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 77 69  ult injection wi
38d0: 74 68 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  th a temporary d
38e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a  atabase file..#.
38f0: 66 6f 72 65 61 63 68 20 76 20 7b 61 20 62 7d 20  foreach v {a b} 
3900: 7b 0a 20 20 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  {.  do_faultsim_
3910: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
3920: 31 30 24 76 20 2d 70 72 65 70 20 7b 0a 20 20 20  10$v -prep {.   
3930: 20 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20   sqlite3 db "". 
3940: 20 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72     db func a_str
3950: 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 20 20  ing a_string;.  
3960: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3970: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
3980: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 20 20  ize = 10;.      
3990: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43  BEGIN;.        C
39a0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 28 61  REATE TABLE xx(a
39b0: 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62  , b, UNIQUE(a, b
39c0: 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ));.        INSE
39d0: 52 54 20 49 4e 54 4f 20 78 78 20 56 41 4c 55 45  RT INTO xx VALUE
39e0: 53 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  S(a_string(200),
39f0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 29 3b   a_string(200));
3a00: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
3a10: 49 4e 54 4f 20 78 78 20 53 45 4c 45 43 54 20 61  INTO xx SELECT a
3a20: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
3a30: 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d  string(200) FROM
3a40: 20 78 78 3b 0a 20 20 20 20 20 20 20 20 49 4e 53   xx;.        INS
3a50: 45 52 54 20 49 4e 54 4f 20 78 78 20 53 45 4c 45  ERT INTO xx SELE
3a60: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
3a70: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20  , a_string(200) 
3a80: 46 52 4f 4d 20 78 78 3b 0a 20 20 20 20 20 20 20  FROM xx;.       
3a90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 78 20   INSERT INTO xx 
3aa0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
3ab0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32  200), a_string(2
3ac0: 30 30 29 20 46 52 4f 4d 20 78 78 3b 0a 20 20 20  00) FROM xx;.   
3ad0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3ae0: 20 78 78 20 53 45 4c 45 43 54 20 61 5f 73 74 72   xx SELECT a_str
3af0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
3b00: 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 78 78 3b  ng(200) FROM xx;
3b10: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
3b20: 20 20 20 7d 0a 20 20 7d 20 2d 62 6f 64 79 20 7b     }.  } -body {
3b30: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 55  .    execsql { U
3b40: 50 44 41 54 45 20 78 78 20 53 45 54 20 61 20 3d  PDATE xx SET a =
3b50: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 7d   a_string(300) }
3b60: 0a 20 20 7d 20 2d 74 65 73 74 20 7b 0a 20 20 20  .  } -test {.   
3b70: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
3b80: 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20 20  esult {0 {}}.   
3b90: 20 69 66 20 7b 24 3a 3a 76 20 3d 3d 20 22 62 22   if {$::v == "b"
3ba0: 7d 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 50 52  } { execsql { PR
3bb0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
3bc0: 65 20 3d 20 54 52 55 4e 43 41 54 45 20 7d 20 7d  e = TRUNCATE } }
3bd0: 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e  .    faultsim_in
3be0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20  tegrity_check.  
3bf0: 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67    faultsim_integ
3c00: 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 7d 0a 7d  rity_check.  }.}
3c10: 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
3c60: 65 73 74 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  est fault inject
3c70: 69 6f 6e 20 77 69 74 68 20 74 72 61 6e 73 61 63  ion with transac
3c80: 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  tion savepoints 
3c90: 28 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61  (savepoints crea
3ca0: 74 65 64 0a 23 20 77 68 65 6e 20 61 20 53 41 56  ted.# when a SAV
3cb0: 45 50 4f 49 4e 54 20 63 6f 6d 6d 61 6e 64 20 69  EPOINT command i
3cc0: 73 20 65 78 65 63 75 74 65 64 20 6f 75 74 73 69  s executed outsi
3cd0: 64 65 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  de of any other 
3ce0: 73 61 76 65 70 6f 69 6e 74 0a 23 20 6f 72 20 74  savepoint.# or t
3cf0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6e 74 65  ransaction conte
3d00: 78 74 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  xt)..#.do_test p
3d10: 61 67 65 72 66 61 75 6c 74 2d 39 2d 70 72 65 31  agerfault-9-pre1
3d20: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
3d30: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
3d40: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
3d50: 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 20 20 65  ng a_string;.  e
3d60: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
3d70: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
3d80: 3d 20 6f 6e 3b 0a 20 20 20 20 43 52 45 41 54 45  = on;.    CREATE
3d90: 20 54 41 42 4c 45 20 74 31 28 78 20 55 4e 49 51   TABLE t1(x UNIQ
3da0: 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  UE);.    CREATE 
3db0: 54 41 42 4c 45 20 74 32 28 79 20 55 4e 49 51 55  TABLE t2(y UNIQU
3dc0: 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  E);.    CREATE T
3dd0: 41 42 4c 45 20 74 33 28 7a 20 55 4e 49 51 55 45  ABLE t3(z UNIQUE
3de0: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
3df0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3e00: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
3e10: 6e 67 28 32 30 32 29 29 3b 0a 20 20 20 20 20 20  ng(202));.      
3e20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
3e30: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32  ALUES(a_string(2
3e40: 30 33 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  03));.      INSE
3e50: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
3e60: 53 28 61 5f 73 74 72 69 6e 67 28 32 30 34 29 29  S(a_string(204))
3e70: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3e80: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
3e90: 73 74 72 69 6e 67 28 32 30 32 29 20 46 52 4f 4d  string(202) FROM
3ea0: 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t1;.      INSER
3eb0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
3ec0: 20 61 5f 73 74 72 69 6e 67 28 32 30 33 29 20 46   a_string(203) F
3ed0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e  ROM t1;.      IN
3ee0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
3ef0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 34  ECT a_string(204
3f00: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  ) FROM t1;.     
3f10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3f20: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
3f30: 32 30 35 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  205) FROM t1;.  
3f40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3f50: 74 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t2 SELECT a_stri
3f60: 6e 67 28 6c 65 6e 67 74 68 28 78 29 29 20 46 52  ng(length(x)) FR
3f70: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53  OM t1;.      INS
3f80: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
3f90: 43 54 20 61 5f 73 74 72 69 6e 67 28 6c 65 6e 67  CT a_string(leng
3fa0: 74 68 28 78 29 29 20 46 52 4f 4d 20 74 31 3b 0a  th(x)) FROM t1;.
3fb0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
3fc0: 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f    faultsim_save_
3fd0: 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64  and_close.} {}.d
3fe0: 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20  o_faultsim_test 
3ff0: 70 61 67 65 72 66 61 75 6c 74 2d 31 31 20 2d 70  pagerfault-11 -p
4000: 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  rep {.  faultsim
4010: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
4020: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  pen.  execsql { 
4030: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
4040: 65 20 3d 20 31 30 20 7d 0a 7d 20 2d 62 6f 64 79  e = 10 }.} -body
4050: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4060: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 72 61     SAVEPOINT tra
4070: 6e 73 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  ns;.      UPDATE
4080: 20 74 32 20 53 45 54 20 79 20 3d 20 79 7c 7c 27   t2 SET y = y||'
4090: 32 27 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  2';.      INSERT
40a0: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
40b0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20  * FROM t2;.     
40c0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b   DELETE FROM t1;
40d0: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  .    ROLLBACK TO
40e0: 20 74 72 61 6e 73 3b 0a 20 20 20 20 55 50 44 41   trans;.    UPDA
40f0: 54 45 20 74 31 20 53 45 54 20 78 20 3d 20 78 7c  TE t1 SET x = x|
4100: 7c 27 33 27 3b 0a 20 20 20 20 49 4e 53 45 52 54  |'3';.    INSERT
4110: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
4120: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 44  * FROM t1;.    D
4130: 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 3b 0a 20  ELETE FROM t3;. 
4140: 20 20 20 52 45 4c 45 41 53 45 20 74 72 61 6e 73     RELEASE trans
4150: 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  ;.  }.} -test {.
4160: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
4170: 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20  result {0 {}}.  
4180: 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69  faultsim_integri
4190: 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 7d 0a 0a 0a  ty_check.}..}...
41a0: 23 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 2d 2d  ----------------
41e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
41f0: 74 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f  t fault injectio
4200: 6e 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  n when writing t
4210: 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
4220: 65 20 74 68 61 74 20 72 65 73 69 64 65 73 20 6f  e that resides o
4230: 6e 0a 23 20 61 20 66 69 6c 65 2d 73 79 73 74 65  n.# a file-syste
4240: 6d 20 77 69 74 68 20 61 20 73 65 63 74 6f 72 2d  m with a sector-
4250: 73 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61 6e  size larger than
4260: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
4270: 67 65 2d 73 69 7a 65 2e 0a 23 0a 64 6f 5f 74 65  ge-size..#.do_te
4280: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 32  st pagerfault-12
4290: 2d 70 72 65 31 20 7b 0a 20 20 74 65 73 74 76 66  -pre1 {.  testvf
42a0: 73 20 73 73 5f 6c 61 79 65 72 20 2d 64 65 66 61  s ss_layer -defa
42b0: 75 6c 74 20 31 0a 20 20 73 73 5f 6c 61 79 65 72  ult 1.  ss_layer
42c0: 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39 36   sectorsize 4096
42d0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
42e0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
42f0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
4300: 20 61 5f 73 74 72 69 6e 67 3b 0a 0a 20 20 65 78   a_string;..  ex
4310: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
4320: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
4330: 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  024;.    PRAGMA 
4340: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
4350: 45 52 53 49 53 54 3b 0a 20 20 20 20 50 52 41 47  ERSIST;.    PRAG
4360: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
4370: 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  10;.    BEGIN;. 
4380: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
4390: 45 20 74 31 28 78 2c 20 79 20 55 4e 49 51 55 45  E t1(x, y UNIQUE
43a0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
43b0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
43c0: 5f 73 74 72 69 6e 67 28 33 33 33 29 2c 20 61 5f  _string(333), a_
43d0: 73 74 72 69 6e 67 28 34 34 34 29 29 3b 0a 20 20  string(444));.  
43e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
43f0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
4400: 6e 67 28 33 33 33 2b 72 6f 77 69 64 29 2c 20 61  ng(333+rowid), a
4410: 5f 73 74 72 69 6e 67 28 34 34 34 2b 72 6f 77 69  _string(444+rowi
4420: 64 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  d) FROM t1;.    
4430: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4440: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
4450: 28 33 33 33 2b 72 6f 77 69 64 29 2c 20 61 5f 73  (333+rowid), a_s
4460: 74 72 69 6e 67 28 34 34 34 2b 72 6f 77 69 64 29  tring(444+rowid)
4470: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
4480: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
4490: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 33  ELECT a_string(3
44a0: 33 33 2b 72 6f 77 69 64 29 2c 20 61 5f 73 74 72  33+rowid), a_str
44b0: 69 6e 67 28 34 34 34 2b 72 6f 77 69 64 29 20 46  ing(444+rowid) F
44c0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e  ROM t1;.      IN
44d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
44e0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 33 33 33  ECT a_string(333
44f0: 2b 72 6f 77 69 64 29 2c 20 61 5f 73 74 72 69 6e  +rowid), a_strin
4500: 67 28 34 34 34 2b 72 6f 77 69 64 29 20 46 52 4f  g(444+rowid) FRO
4510: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
4520: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
4530: 54 20 61 5f 73 74 72 69 6e 67 28 34 34 29 2c 20  T a_string(44), 
4540: 61 5f 73 74 72 69 6e 67 28 35 35 29 20 46 52 4f  a_string(55) FRO
4550: 4d 20 74 31 20 4c 49 4d 49 54 20 31 33 3b 0a 20  M t1 LIMIT 13;. 
4560: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
4570: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61   faultsim_save_a
4580: 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64  nd_close.} {}..d
4590: 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20  o_faultsim_test 
45a0: 70 61 67 65 72 66 61 75 6c 74 2d 31 32 61 20 2d  pagerfault-12a -
45b0: 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69  prep {.  faultsi
45c0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
45d0: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
45e0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
45f0: 7a 65 20 3d 20 31 30 20 7d 0a 20 20 64 62 20 66  ze = 10 }.  db f
4600: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
4610: 74 72 69 6e 67 3b 0a 7d 20 2d 62 6f 64 79 20 7b  tring;.} -body {
4620: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4630: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 78   UPDATE t1 SET x
4640: 20 3d 20 61 5f 73 74 72 69 6e 67 28 6c 65 6e 67   = a_string(leng
4650: 74 68 28 78 29 29 2c 20 79 20 3d 20 61 5f 73 74  th(x)), y = a_st
4660: 72 69 6e 67 28 6c 65 6e 67 74 68 28 79 29 29 3b  ring(length(y));
4670: 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  .  }.} -test {. 
4680: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
4690: 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20 66  esult {0 {}}.  f
46a0: 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74  aultsim_integrit
46b0: 79 5f 63 68 65 63 6b 0a 7d 0a 0a 64 6f 5f 74 65  y_check.}..do_te
46c0: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 32  st pagerfault-12
46d0: 2d 70 72 65 32 20 7b 0a 20 20 66 61 75 6c 74 73  -pre2 {.  faults
46e0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
46f0: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
4700: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
4710: 4c 45 20 74 32 20 41 53 20 53 45 4c 45 43 54 20  LE t2 AS SELECT 
4720: 2a 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20  * FROM t1 LIMIT 
4730: 31 30 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  10;.  }.  faults
4740: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
4750: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
4760: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
4770: 6c 74 2d 31 32 62 20 2d 70 72 65 70 20 7b 0a 20  lt-12b -prep {. 
4780: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
4790: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
47a0: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
47b0: 61 5f 73 74 72 69 6e 67 3b 0a 20 20 65 78 65 63  a_string;.  exec
47c0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
47d0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d 62 6f 64 79  ROM t1 }.} -body
47e0: 20 7b 0a 20 20 73 65 74 20 73 71 6c 28 31 29 20   {.  set sql(1) 
47f0: 7b 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20  { UPDATE t2 SET 
4800: 78 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 38 30  x = a_string(280
4810: 29 20 7d 0a 20 20 73 65 74 20 73 71 6c 28 32 29  ) }.  set sql(2)
4820: 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45 54   { UPDATE t1 SET
4830: 20 78 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 38   x = a_string(28
4840: 30 29 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  0) WHERE rowid =
4850: 20 35 20 7d 0a 0a 20 20 64 62 20 65 76 61 6c 20   5 }..  db eval 
4860: 7b 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46  { SELECT rowid F
4870: 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 32 20 7d  ROM t1 LIMIT 2 }
4880: 20 7b 20 64 62 20 65 76 61 6c 20 24 73 71 6c 28   { db eval $sql(
4890: 24 72 6f 77 69 64 29 20 7d 0a 0a 7d 20 2d 74 65  $rowid) }..} -te
48a0: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
48b0: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b  test_result {0 {
48c0: 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e  }}.  faultsim_in
48d0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a  tegrity_check.}.
48e0: 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73  .catch { db clos
48f0: 65 20 7d 0a 73 73 5f 6c 61 79 65 72 20 64 65 6c  e }.ss_layer del
4900: 65 74 65 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete...#---------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 0a 23 20 54 65 73 74 20 66 61 75 6c 74 20 69 6e  .# Test fault in
4960: 6a 65 63 74 69 6f 6e 20 77 68 65 6e 20 53 51 4c  jection when SQL
4970: 69 74 65 20 6f 70 65 6e 73 20 61 20 64 61 74 61  ite opens a data
4980: 62 61 73 65 20 77 68 65 72 65 20 74 68 65 20 73  base where the s
4990: 69 7a 65 20 6f 66 20 74 68 65 0a 23 20 64 61 74  ize of the.# dat
49a0: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 7a 65  abase file is ze
49b0: 72 6f 20 62 79 74 65 73 20 62 75 74 20 74 68 65  ro bytes but the
49c0: 20 61 63 63 6f 6d 70 61 6e 79 69 6e 67 20 6a 6f   accompanying jo
49d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6c 61  urnal file is la
49e0: 72 67 65 72 0a 23 20 74 68 61 6e 20 74 68 61 74  rger.# than that
49f0: 2e 20 49 6e 20 74 68 69 73 20 73 63 65 6e 61 72  . In this scenar
4a00: 69 6f 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  io SQLite should
4a10: 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
4a20: 6e 61 6c 20 66 69 6c 65 20 0a 23 20 77 69 74 68  nal file .# with
4a30: 6f 75 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62  out rolling it b
4a40: 61 63 6b 2c 20 65 76 65 6e 20 69 66 20 69 74 20  ack, even if it 
4a50: 69 73 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20  is in all other 
4a60: 72 65 73 70 65 63 74 73 20 61 20 76 61 6c 69 64  respects a valid
4a70: 0a 23 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  .# hot-journal f
4a80: 69 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ile..#.do_test p
4a90: 61 67 65 72 66 61 75 6c 74 2d 31 33 2d 70 72 65  agerfault-13-pre
4aa0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
4ab0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
4ac0: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
4ad0: 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 20 20  ing a_string;.  
4ae0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
4af0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
4b00: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
4b10: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
4b20: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c  EATE TABLE t1(x,
4b30: 20 79 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   y UNIQUE);.    
4b40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4b50: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
4b60: 28 33 33 33 29 2c 20 61 5f 73 74 72 69 6e 67 28  (333), a_string(
4b70: 34 34 34 29 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  444));.    COMMI
4b80: 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73  T;.  }.  db clos
4b90: 65 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20  e.  file delete 
4ba0: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 0a 20  -force test.db. 
4bb0: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 0a 7d   faultsim_save.}
4bc0: 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f   {}.do_faultsim_
4bd0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
4be0: 31 33 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75  13 -prep {.  fau
4bf0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
4c00: 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79  d_reopen.} -body
4c10: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
4c20: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 28 61  REATE TABLE xx(a
4c30: 2c 20 62 29 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  , b) }.} -test {
4c40: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
4c50: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d  _result {0 {}}.}
4c60: 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
4cb0: 20 54 65 73 74 20 66 61 75 6c 74 20 69 6e 6a 65   Test fault inje
4cc0: 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 73 6d 61  ction into a sma
4cd0: 6c 6c 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74  ll backup operat
4ce0: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ion..#.do_test p
4cf0: 61 67 65 72 66 61 75 6c 74 2d 31 34 2d 70 72 65  agerfault-14-pre
4d00: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
4d10: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
4d20: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
4d30: 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 20 20  ing a_string;.  
4d40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
4d50: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
4d60: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
4d70: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
4d80: 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20 42  2' AS two;.    B
4d90: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
4da0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
4db0: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 20 20   UNIQUE);.      
4dc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f  CREATE TABLE two
4dd0: 2e 74 32 28 78 2c 20 79 20 55 4e 49 51 55 45 29  .t2(x, y UNIQUE)
4de0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
4df0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
4e00: 73 74 72 69 6e 67 28 33 33 33 29 2c 20 61 5f 73  string(333), a_s
4e10: 74 72 69 6e 67 28 34 34 34 29 29 3b 0a 20 20 20  tring(444));.   
4e20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4e30: 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  2 VALUES(a_strin
4e40: 67 28 33 33 33 29 2c 20 61 5f 73 74 72 69 6e 67  g(333), a_string
4e50: 28 34 34 34 29 29 3b 0a 20 20 20 20 43 4f 4d 4d  (444));.    COMM
4e60: 49 54 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  IT;.  }.  faults
4e70: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
4e80: 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 66 61 75 6c 74  e.} {}..do_fault
4e90: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
4ea0: 75 6c 74 2d 31 34 61 20 2d 70 72 65 70 20 7b 0a  ult-14a -prep {.
4eb0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
4ec0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20  re_and_reopen.} 
4ed0: 2d 62 6f 64 79 20 7b 0a 20 20 69 66 20 7b 5b 63  -body {.  if {[c
4ee0: 61 74 63 68 20 7b 64 62 20 62 61 63 6b 75 70 20  atch {db backup 
4ef0: 74 65 73 74 2e 64 62 32 7d 20 6d 73 67 5d 7d 20  test.db2} msg]} 
4f00: 7b 20 65 72 72 6f 72 20 5b 72 65 67 73 75 62 20  { error [regsub 
4f10: 7b 2e 2a 3a 20 7d 20 24 6d 73 67 20 7b 7d 5d 20  {.*: } $msg {}] 
4f20: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  }.} -test {.  fa
4f30: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
4f40: 6c 74 20 7b 30 20 7b 7d 7d 20 7b 31 20 7b 7d 7d  lt {0 {}} {1 {}}
4f50: 20 7b 31 20 7b 53 51 4c 20 6c 6f 67 69 63 20 65   {1 {SQL logic e
4f60: 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20  rror or missing 
4f70: 64 61 74 61 62 61 73 65 7d 7d 0a 7d 0a 64 6f 5f  database}}.}.do_
4f80: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
4f90: 67 65 72 66 61 75 6c 74 2d 31 34 62 20 2d 70 72  gerfault-14b -pr
4fa0: 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  ep {.  faultsim_
4fb0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
4fc0: 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  en.  sqlite3 db2
4fd0: 20 22 22 0a 20 20 64 62 32 20 65 76 61 6c 20 7b   "".  db2 eval {
4fe0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
4ff0: 65 20 3d 20 34 30 39 36 3b 20 43 52 45 41 54 45  e = 4096; CREATE
5000: 20 54 41 42 4c 45 20 78 78 28 61 29 20 7d 0a 7d   TABLE xx(a) }.}
5010: 20 2d 62 6f 64 79 20 7b 0a 20 20 73 71 6c 69 74   -body {.  sqlit
5020: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
5030: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42  main db main.  B
5040: 20 73 74 65 70 20 32 30 30 0a 20 20 73 65 74 20   step 200.  set 
5050: 72 63 20 5b 42 20 66 69 6e 69 73 68 5d 0a 20 20  rc [B finish].  
5060: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
5070: 68 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 2a  h SQLITE_IOERR_*
5080: 20 24 72 63 5d 7d 20 7b 73 65 74 20 72 63 20 53   $rc]} {set rc S
5090: 51 4c 49 54 45 5f 49 4f 45 52 52 7d 0a 20 20 69  QLITE_IOERR}.  i
50a0: 66 20 7b 24 72 63 20 21 3d 20 22 53 51 4c 49 54  f {$rc != "SQLIT
50b0: 45 5f 4f 4b 22 7d 20 7b 20 65 72 72 6f 72 20 5b  E_OK"} { error [
50c0: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72  sqlite3_test_err
50d0: 73 74 72 20 24 72 63 5d 20 7d 0a 20 20 73 65 74  str $rc] }.  set
50e0: 20 7b 7d 20 7b 7d 0a 7d 20 2d 74 65 73 74 20 7b   {} {}.} -test {
50f0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
5100: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 7d  _result {0 {}}.}
5110: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
5120: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 34 63  t pagerfault-14c
5130: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
5140: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5150: 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33  reopen.  sqlite3
5160: 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20   db2 test.db2.  
5170: 64 62 32 20 65 76 61 6c 20 7b 20 0a 20 20 20 20  db2 eval { .    
5180: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
5190: 75 73 20 3d 20 6f 66 66 3b 20 0a 20 20 20 20 50  us = off; .    P
51a0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
51b0: 3d 20 34 30 39 36 3b 20 0a 20 20 20 20 43 52 45  = 4096; .    CRE
51c0: 41 54 45 20 54 41 42 4c 45 20 78 78 28 61 29 3b  ATE TABLE xx(a);
51d0: 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20  .  }.} -body {. 
51e0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
51f0: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
5200: 69 6e 0a 20 20 42 20 73 74 65 70 20 32 30 30 0a  in.  B step 200.
5210: 20 20 73 65 74 20 72 63 20 5b 42 20 66 69 6e 69    set rc [B fini
5220: 73 68 5d 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e  sh].  if {[strin
5230: 67 20 6d 61 74 63 68 20 53 51 4c 49 54 45 5f 49  g match SQLITE_I
5240: 4f 45 52 52 5f 2a 20 24 72 63 5d 7d 20 7b 73 65  OERR_* $rc]} {se
5250: 74 20 72 63 20 53 51 4c 49 54 45 5f 49 4f 45 52  t rc SQLITE_IOER
5260: 52 7d 0a 20 20 69 66 20 7b 24 72 63 20 21 3d 20  R}.  if {$rc != 
5270: 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b 20 65  "SQLITE_OK"} { e
5280: 72 72 6f 72 20 5b 73 71 6c 69 74 65 33 5f 74 65  rror [sqlite3_te
5290: 73 74 5f 65 72 72 73 74 72 20 24 72 63 5d 20 7d  st_errstr $rc] }
52a0: 0a 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 7d 20 2d  .  set {} {}.} -
52b0: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
52c0: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
52d0: 20 7b 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20   {}}.}..do_test 
52e0: 70 61 67 65 72 66 61 75 6c 74 2d 31 35 2d 70 72  pagerfault-15-pr
52f0: 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  e1 {.  faultsim_
5300: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
5310: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
5320: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 20  ring a_string;. 
5330: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
5340: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
5350: 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
5360: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 20 20   UNIQUE);.      
5370: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5380: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 31  ALUES(a_string(1
5390: 31 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 32 29  1), a_string(22)
53a0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
53b0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
53c0: 5f 73 74 72 69 6e 67 28 31 31 29 2c 20 61 5f 73  _string(11), a_s
53d0: 74 72 69 6e 67 28 32 32 29 29 3b 0a 20 20 20 20  tring(22));.    
53e0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 66 61  COMMIT;.  }.  fa
53f0: 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f  ultsim_save_and_
5400: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61  close.} {}.do_fa
5410: 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65  ultsim_test page
5420: 72 66 61 75 6c 74 2d 31 35 20 2d 70 72 65 70 20  rfault-15 -prep 
5430: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
5440: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
5450: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
5460: 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 7d 20 2d  ng a_string;.} -
5470: 62 6f 64 79 20 7b 0a 20 20 64 62 20 65 76 61 6c  body {.  db eval
5480: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
5490: 20 74 31 20 4c 49 4d 49 54 20 31 20 7d 20 7b 0a   t1 LIMIT 1 } {.
54a0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
54b0: 20 20 20 20 42 45 47 49 4e 3b 20 49 4e 53 45 52      BEGIN; INSER
54c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
54d0: 28 61 5f 73 74 72 69 6e 67 28 33 33 33 29 2c 20  (a_string(333), 
54e0: 61 5f 73 74 72 69 6e 67 28 35 35 35 29 29 3b 20  a_string(555)); 
54f0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 42 45  COMMIT;.      BE
5500: 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  GIN; INSERT INTO
5510: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
5520: 69 6e 67 28 33 33 33 29 2c 20 61 5f 73 74 72 69  ing(333), a_stri
5530: 6e 67 28 35 35 35 29 29 3b 20 43 4f 4d 4d 49 54  ng(555)); COMMIT
5540: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 2d 74  ;.    }.  }.} -t
5550: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
5560: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
5570: 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69  {}}.  faultsim_i
5580: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d  ntegrity_check.}
5590: 0a 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  ...do_test pager
55a0: 66 61 75 6c 74 2d 31 36 2d 70 72 65 31 20 7b 0a  fault-16-pre1 {.
55b0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
55c0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
55d0: 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
55e0: 54 41 42 4c 45 20 74 31 28 78 2c 20 79 20 55 4e  TABLE t1(x, y UN
55f0: 49 51 55 45 29 20 7d 0a 20 20 66 61 75 6c 74 73  IQUE) }.  faults
5600: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
5610: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
5620: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
5630: 6c 74 2d 31 36 20 2d 70 72 65 70 20 7b 0a 20 20  lt-16 -prep {.  
5640: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
5650: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62  _and_reopen.} -b
5660: 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ody {.  execsql 
5670: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  {.    PRAGMA loc
5680: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c  king_mode = excl
5690: 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41 47 4d  usive;.    PRAGM
56a0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
56b0: 20 77 61 6c 3b 0a 20 20 20 20 49 4e 53 45 52 54   wal;.    INSERT
56c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
56d0: 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 2);.    INSER
56e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
56f0: 28 33 2c 20 34 29 3b 0a 20 20 20 20 50 52 41 47  (3, 4);.    PRAG
5700: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
5710: 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 49 4e  = delete;.    IN
5720: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5730: 55 45 53 28 34 2c 20 35 29 3b 0a 20 20 20 20 50  UES(4, 5);.    P
5740: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
5750: 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 49 4e  de = wal;.    IN
5760: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5770: 55 45 53 28 36 2c 20 37 29 3b 0a 20 20 20 20 50  UES(6, 7);.    P
5780: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
5790: 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20  de = persist;.  
57a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
57b0: 20 56 41 4c 55 45 53 28 38 2c 20 39 29 3b 0a 20   VALUES(8, 9);. 
57c0: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
57d0: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
57e0: 75 6c 74 20 7b 30 20 7b 65 78 63 6c 75 73 69 76  ult {0 {exclusiv
57f0: 65 20 77 61 6c 20 64 65 6c 65 74 65 20 77 61 6c  e wal delete wal
5800: 20 70 65 72 73 69 73 74 7d 7d 0a 20 20 66 61 75   persist}}.  fau
5810: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
5820: 63 68 65 63 6b 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  check.}...#-----
5830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20 66 61 75 6c  ----.# Test faul
5880: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 77 68 69 6c  t injection whil
5890: 65 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f 20  e changing into 
58a0: 61 6e 64 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d  and out of WAL m
58b0: 6f 64 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ode..#.do_test p
58c0: 61 67 65 72 66 61 75 6c 74 2d 31 37 2d 70 72 65  agerfault-17-pre
58d0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
58e0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
58f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5900: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
5910: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
5920: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
5930: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 38  NTO t1 VALUES(18
5940: 36 32 2c 20 27 42 6f 74 68 61 27 29 3b 0a 20 20  62, 'Botha');.  
5950: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5960: 20 56 41 4c 55 45 53 28 31 38 37 30 2c 20 27 53   VALUES(1870, 'S
5970: 6d 75 74 73 27 29 3b 0a 20 20 20 20 49 4e 53 45  muts');.    INSE
5980: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5990: 53 28 31 38 36 36 2c 20 27 48 65 72 74 7a 6f 67  S(1866, 'Hertzog
59a0: 27 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  ');.  }.  faults
59b0: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
59c0: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
59d0: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
59e0: 6c 74 2d 31 37 61 20 2d 70 72 65 70 20 7b 0a 20  lt-17a -prep {. 
59f0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
5a00: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d  e_and_reopen.} -
5a10: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
5a20: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
5a30: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c  urnal_mode = wal
5a40: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
5a50: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65  rnal_mode = dele
5a60: 74 65 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20  te;.  }.} -test 
5a70: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
5a80: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 77 61 6c  t_result {0 {wal
5a90: 20 64 65 6c 65 74 65 7d 7d 0a 20 20 66 61 75 6c   delete}}.  faul
5aa0: 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63  tsim_integrity_c
5ab0: 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74 73  heck.}.do_faults
5ac0: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
5ad0: 6c 74 2d 31 37 62 20 2d 70 72 65 70 20 7b 0a 20  lt-17b -prep {. 
5ae0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
5af0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
5b00: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
5b10: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46  synchronous = OF
5b20: 46 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20  F }.} -body {.  
5b30: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
5b40: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
5b50: 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 49 4e 53  e = wal;.    INS
5b60: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5b70: 45 53 28 32 32 2c 20 27 43 6c 61 72 6b 65 27 29  ES(22, 'Clarke')
5b80: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
5b90: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65  rnal_mode = dele
5ba0: 74 65 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20  te;.  }.} -test 
5bb0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
5bc0: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 77 61 6c  t_result {0 {wal
5bd0: 20 64 65 6c 65 74 65 7d 7d 0a 20 20 66 61 75 6c   delete}}.  faul
5be0: 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63  tsim_integrity_c
5bf0: 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74 73  heck.}.do_faults
5c00: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
5c10: 6c 74 2d 31 37 63 20 2d 70 72 65 70 20 7b 0a 20  lt-17c -prep {. 
5c20: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
5c30: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
5c40: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52  xecsql { .    PR
5c50: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
5c60: 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20  e = exclusive;. 
5c70: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
5c80: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20  l_mode = wal;.  
5c90: 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  }.} -body {.  ex
5ca0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a  ecsql { PRAGMA j
5cb0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
5cc0: 6c 65 74 65 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  lete }.} -test {
5cd0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
5ce0: 5f 72 65 73 75 6c 74 20 7b 30 20 64 65 6c 65 74  _result {0 delet
5cf0: 65 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e  e}.  faultsim_in
5d00: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a  tegrity_check.}.
5d10: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
5d20: 20 70 61 67 65 72 66 61 75 6c 74 2d 31 37 64 20   pagerfault-17d 
5d30: 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73  -prep {.  faults
5d40: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5d50: 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20  eopen.  sqlite3 
5d60: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78  db2 test.db.  ex
5d70: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a  ecsql { PRAGMA j
5d80: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
5d90: 6c 65 74 65 20 7d 0a 20 20 65 78 65 63 73 71 6c  lete }.  execsql
5da0: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
5db0: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20  l_mode = wal }. 
5dc0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
5dd0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5de0: 28 39 39 2c 20 27 42 72 61 64 6d 61 6e 27 29 20  (99, 'Bradman') 
5df0: 7d 20 64 62 32 0a 7d 20 2d 62 6f 64 79 20 7b 0a  } db2.} -body {.
5e00: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
5e10: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
5e20: 3d 20 64 65 6c 65 74 65 20 7d 0a 7d 20 2d 74 65  = delete }.} -te
5e30: 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  st {.  faultsim_
5e40: 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 31 20 7b  test_result {1 {
5e50: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
5e60: 65 64 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  ed}}.  faultsim_
5e70: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
5e80: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
5e90: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 37  st pagerfault-17
5ea0: 65 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  e -prep {.  faul
5eb0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5ec0: 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65  _reopen.  sqlite
5ed0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
5ee0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
5ef0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
5f00: 64 65 6c 65 74 65 20 7d 0a 20 20 65 78 65 63 73  delete }.  execs
5f10: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
5f20: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d  nal_mode = wal }
5f30: 0a 20 20 73 65 74 20 3a 3a 63 68 61 6e 20 5b 6c  .  set ::chan [l
5f40: 61 75 6e 63 68 5f 74 65 73 74 66 69 78 74 75 72  aunch_testfixtur
5f50: 65 5d 0a 20 20 74 65 73 74 66 69 78 74 75 72 65  e].  testfixture
5f60: 20 24 3a 3a 63 68 61 6e 20 7b 0a 20 20 20 20 73   $::chan {.    s
5f70: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
5f80: 62 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20  b.    db eval { 
5f90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5fa0: 41 4c 55 45 53 28 31 30 31 2c 20 27 4c 61 74 68  ALUES(101, 'Lath
5fb0: 61 6d 27 29 20 7d 0a 20 20 7d 0a 20 20 63 61 74  am') }.  }.  cat
5fc0: 63 68 20 7b 20 74 65 73 74 66 69 78 74 75 72 65  ch { testfixture
5fd0: 20 24 3a 3a 63 68 61 6e 20 73 71 6c 69 74 65 5f   $::chan sqlite_
5fe0: 61 62 6f 72 74 20 7d 0a 20 20 63 61 74 63 68 20  abort }.  catch 
5ff0: 7b 20 63 6c 6f 73 65 20 24 3a 3a 63 68 61 6e 20  { close $::chan 
6000: 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  }.} -body {.  ex
6010: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a  ecsql { PRAGMA j
6020: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
6030: 6c 65 74 65 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  lete }.} -test {
6040: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
6050: 5f 72 65 73 75 6c 74 20 7b 30 20 64 65 6c 65 74  _result {0 delet
6060: 65 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e  e}.  faultsim_in
6070: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a  tegrity_check.}.
6080: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
60d0: 73 74 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69  st fault-injecti
60e0: 6f 6e 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67  on when changing
60f0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   from journal_mo
6100: 64 65 3d 70 65 72 73 69 73 74 20 74 6f 20 0a 23  de=persist to .#
6110: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
6120: 6c 65 74 65 20 28 74 68 69 73 20 69 6e 76 6f 6c  lete (this invol
6130: 76 65 73 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ves deleting the
6140: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 2e 0a   journal file)..
6150: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66  #.do_test pagerf
6160: 61 75 6c 74 2d 31 38 2d 70 72 65 31 20 7b 0a 20  ault-18-pre1 {. 
6170: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
6180: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
6190: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
61a0: 54 45 20 54 41 42 4c 45 20 71 71 28 78 29 3b 0a  TE TABLE qq(x);.
61b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
61c0: 71 71 20 56 41 4c 55 45 53 28 27 48 65 72 62 65  qq VALUES('Herbe
61d0: 72 74 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  rt');.    INSERT
61e0: 20 49 4e 54 4f 20 71 71 20 56 41 4c 55 45 53 28   INTO qq VALUES(
61f0: 27 4d 61 63 61 6c 69 73 74 65 72 27 29 3b 0a 20  'Macalister');. 
6200: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 71     INSERT INTO q
6210: 71 20 56 41 4c 55 45 53 28 27 4d 61 63 6b 65 6e  q VALUES('Macken
6220: 7a 69 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  zie');.    INSER
6230: 54 20 49 4e 54 4f 20 71 71 20 56 41 4c 55 45 53  T INTO qq VALUES
6240: 28 27 4c 69 6c 6c 65 79 27 29 3b 0a 20 20 20 20  ('Lilley');.    
6250: 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 71 20 56  INSERT INTO qq V
6260: 41 4c 55 45 53 28 27 50 61 6c 6d 65 72 27 29 3b  ALUES('Palmer');
6270: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
6280: 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d  save_and_close.}
6290: 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f   {}.do_faultsim_
62a0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
62b0: 31 38 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75  18 -prep {.  fau
62c0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
62d0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
62e0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
62f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
6300: 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45  ERSIST;.    INSE
6310: 52 54 20 49 4e 54 4f 20 71 71 20 56 41 4c 55 45  RT INTO qq VALUE
6320: 53 28 27 42 65 61 74 74 79 27 29 3b 0a 20 20 7d  S('Beatty');.  }
6330: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65  .} -body {.  exe
6340: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
6350: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c  urnal_mode = del
6360: 65 74 65 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  ete }.} -test {.
6370: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
6380: 72 65 73 75 6c 74 20 7b 30 20 64 65 6c 65 74 65  result {0 delete
6390: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74  }.  faultsim_int
63a0: 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a  egrity_check.}..
63b0: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
63c0: 20 70 61 67 65 72 66 61 75 6c 74 2d 31 39 61 20   pagerfault-19a 
63d0: 2d 70 72 65 70 20 7b 0a 20 20 73 71 6c 69 74 65  -prep {.  sqlite
63e0: 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20  3 db :memory:.  
63f0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
6400: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
6410: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
6420: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46   auto_vacuum = F
6430: 55 4c 4c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ULL;.    BEGIN;.
6440: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
6450: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
6460: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6470: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
6480: 67 28 35 30 30 30 29 2c 20 61 5f 73 74 72 69 6e  g(5000), a_strin
6490: 67 28 36 30 30 30 29 29 3b 0a 20 20 20 20 43 4f  g(6000));.    CO
64a0: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64  MMIT;.  }.} -bod
64b0: 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  y {.  execsql { 
64c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
64d0: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t2(a, b);.    
64e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
64f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
6500: 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f   .    DELETE FRO
6510: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73  M t1;.  }.} -tes
6520: 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74  t {.  faultsim_t
6530: 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d  est_result {0 {}
6540: 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  }.}..do_test pag
6550: 65 72 66 61 75 6c 74 2d 31 39 2d 70 72 65 31 20  erfault-19-pre1 
6560: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
6570: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
6580: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
6590: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
65a0: 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 43 52  m = FULL;.    CR
65b0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
65c0: 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  ; INSERT INTO t1
65d0: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
65e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
65f0: 78 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  x); INSERT INTO 
6600: 74 32 20 56 41 4c 55 45 53 28 32 29 3b 0a 20 20  t2 VALUES(2);.  
6610: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
6620: 33 28 78 29 3b 20 49 4e 53 45 52 54 20 49 4e 54  3(x); INSERT INT
6630: 4f 20 74 33 20 56 41 4c 55 45 53 28 33 29 3b 0a  O t3 VALUES(3);.
6640: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6650: 20 74 34 28 78 29 3b 20 49 4e 53 45 52 54 20 49   t4(x); INSERT I
6660: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 34 29  NTO t4 VALUES(4)
6670: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
6680: 4c 45 20 74 35 28 78 29 3b 20 49 4e 53 45 52 54  LE t5(x); INSERT
6690: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
66a0: 35 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  5);.    CREATE T
66b0: 41 42 4c 45 20 74 36 28 78 29 3b 20 49 4e 53 45  ABLE t6(x); INSE
66c0: 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45  RT INTO t6 VALUE
66d0: 53 28 36 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c  S(6);.  }.  faul
66e0: 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c  tsim_save_and_cl
66f0: 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c  ose.} {}.do_faul
6700: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
6710: 61 75 6c 74 2d 31 39 62 20 2d 70 72 65 70 20 7b  ault-19b -prep {
6720: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
6730: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d  ore_and_reopen.}
6740: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
6750: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
6760: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 34  .      UPDATE t4
6770: 20 53 45 54 20 78 20 3d 20 78 2b 31 3b 0a 20 20   SET x = x+1;.  
6780: 20 20 20 20 55 50 44 41 54 45 20 74 36 20 53 45      UPDATE t6 SE
6790: 54 20 78 20 3d 20 78 2b 31 3b 0a 20 20 20 20 20  T x = x+1;.     
67a0: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
67b0: 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20 74          UPDATE t
67c0: 33 20 53 45 54 20 78 20 3d 20 78 2b 31 3b 0a 20  3 SET x = x+1;. 
67d0: 20 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54         SAVEPOINT
67e0: 20 74 77 6f 3b 0a 20 20 20 20 20 20 20 20 20 20   two;.          
67f0: 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20  DROP TABLE t2;. 
6800: 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
6810: 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   one;.    COMMIT
6820: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
6830: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 53 45 4c 45  ROM t3;.    SELE
6840: 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20  CT * FROM t4;.  
6850: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6860: 74 36 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20  t6;.  }.} -test 
6870: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
6880: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 33 20 35  t_result {0 {3 5
6890: 20 37 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   7}}.}..#-------
68a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68e0: 2d 2d 0a 23 20 54 68 69 73 20 74 65 73 74 73 20  --.# This tests 
68f0: 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20  fault-injection 
6900: 69 6e 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  in a special cas
6910: 65 20 69 6e 20 74 68 65 20 61 75 74 6f 2d 76 61  e in the auto-va
6920: 63 75 75 6d 20 63 6f 64 65 2e 0a 23 0a 64 6f 5f  cuum code..#.do_
6930: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
6940: 32 30 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c  20-pre1 {.  faul
6950: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
6960: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
6970: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
6980: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
6990: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
69a0: 61 63 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20  acuum = FULL;.  
69b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
69c0: 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 66  0(a, b);.  }.  f
69d0: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
69e0: 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66  _close.} {}.do_f
69f0: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
6a00: 65 72 66 61 75 6c 74 2d 32 30 20 2d 70 72 65 70  erfault-20 -prep
6a10: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
6a20: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
6a30: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65  .} -body {.  exe
6a40: 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49  csql { .    BEGI
6a50: 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  N;.      CREATE 
6a60: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
6a70: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
6a80: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  LE t2(a, b);.   
6a90: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31     DROP TABLE t1
6aa0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
6ab0: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  }.} -test {.  fa
6ac0: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
6ad0: 6c 74 20 7b 30 20 7b 7d 7d 0a 7d 0a 0a 64 6f 5f  lt {0 {}}.}..do_
6ae0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
6af0: 32 31 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c  21-pre1 {.  faul
6b00: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
6b10: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
6b20: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
6b30: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
6b40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6b50: 74 30 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t0(a PRIMARY KEY
6b60: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
6b70: 20 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28   INTO t0 VALUES(
6b80: 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 66 61 75  1, 2);.  }.  fau
6b90: 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63  ltsim_save_and_c
6ba0: 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75  lose.} {}.do_fau
6bb0: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
6bc0: 66 61 75 6c 74 2d 32 31 20 2d 70 72 65 70 20 7b  fault-21 -prep {
6bd0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
6be0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d  ore_and_reopen.}
6bf0: 20 2d 62 6f 64 79 20 7b 0a 20 20 64 62 20 65 76   -body {.  db ev
6c00: 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  al { SELECT * FR
6c10: 4f 4d 20 74 30 20 4c 49 4d 49 54 20 31 20 7d 20  OM t0 LIMIT 1 } 
6c20: 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20  {.    db eval { 
6c30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20 53  INSERT INTO t0 S
6c40: 45 4c 45 43 54 20 61 2b 31 2c 20 62 20 46 52 4f  ELECT a+1, b FRO
6c50: 4d 20 74 30 20 7d 0a 20 20 20 20 64 62 20 65 76  M t0 }.    db ev
6c60: 61 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  al { INSERT INTO
6c70: 20 74 30 20 53 45 4c 45 43 54 20 61 2b 32 2c 20   t0 SELECT a+2, 
6c80: 62 20 46 52 4f 4d 20 74 30 20 7d 0a 20 20 7d 0a  b FROM t0 }.  }.
6c90: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c  } -test {.  faul
6ca0: 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74  tsim_test_result
6cb0: 20 7b 30 20 7b 7d 7d 0a 7d 0a 0a 0a 66 69 6e 69   {0 {}}.}...fini
6cc0: 73 68 5f 74 65 73 74 0a                          sh_test.