/ Hex Artifact Content
Login

Artifact d90859967eda59b53074498846d142a81d7e29ff:


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 73 65 74 20 61 5f 73 74  on.tcl..set a_st
01f0: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70  ring_counter 1.p
0200: 72 6f 63 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d  roc a_string {n}
0210: 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74   {.  global a_st
0220: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69  ring_counter.  i
0230: 6e 63 72 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75  ncr a_string_cou
0240: 6e 74 65 72 0a 20 20 73 74 72 69 6e 67 20 72 61  nter.  string ra
0250: 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70 65  nge [string repe
0260: 61 74 20 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63  at "${a_string_c
0270: 6f 75 6e 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20  ounter}." $n] 1 
0280: 24 6e 0a 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73  $n.}.db func a_s
0290: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a  tring a_string..
02a0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
02b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
02f0: 74 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f  t fault-injectio
0300: 6e 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20  n while rolling 
0310: 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
0320: 61 6c 20 66 69 6c 65 2e 0a 23 0a 64 6f 5f 74 65  al file..#.do_te
0330: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 2d  st pagerfault-1-
0340: 70 72 65 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  pre1 {.  execsql
0350: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
0360: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
0370: 45 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ETE;.    PRAGMA 
0380: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
0390: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
03a0: 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62  E t1(a UNIQUE, b
03b0: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 49 4e   UNIQUE);.    IN
03c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
03d0: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 30 30  UES(a_string(200
03e0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
03f0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0400: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
0410: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
0420: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74  ring(300) FROM t
0430: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
0440: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
0450: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
0460: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74  ring(300) FROM t
0470: 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  1;.    BEGIN;.  
0480: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0490: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
04a0: 6e 67 28 32 30 31 29 2c 20 61 5f 73 74 72 69 6e  ng(201), a_strin
04b0: 67 28 33 30 31 29 20 46 52 4f 4d 20 74 31 3b 0a  g(301) FROM t1;.
04c0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
04d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
04e0: 72 69 6e 67 28 32 30 32 29 2c 20 61 5f 73 74 72  ring(202), a_str
04f0: 69 6e 67 28 33 30 32 29 20 46 52 4f 4d 20 74 31  ing(302) FROM t1
0500: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
0510: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
0520: 73 74 72 69 6e 67 28 32 30 33 29 2c 20 61 5f 73  string(203), a_s
0530: 74 72 69 6e 67 28 33 30 33 29 20 46 52 4f 4d 20  tring(303) FROM 
0540: 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t1;.      INSERT
0550: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
0560: 61 5f 73 74 72 69 6e 67 28 32 30 34 29 2c 20 61  a_string(204), a
0570: 5f 73 74 72 69 6e 67 28 33 30 34 29 20 46 52 4f  _string(304) FRO
0580: 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 66 61 75 6c  M t1;.  }.  faul
0590: 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c  tsim_save_and_cl
05a0: 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c  ose.} {}.do_faul
05b0: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
05c0: 61 75 6c 74 2d 31 20 2d 70 72 65 70 20 7b 0a 20  ault-1 -prep {. 
05d0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
05e0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d  e_and_reopen.} -
05f0: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
0600: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
0610: 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d  *) FROM t1 }.} -
0620: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
0630: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
0640: 20 34 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69   4}.  faultsim_i
0650: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20  ntegrity_check. 
0660: 20 69 66 20 7b 5b 64 62 20 6f 6e 65 20 7b 20 53   if {[db one { S
0670: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
0680: 52 4f 4d 20 74 31 20 7d 5d 20 21 3d 20 34 7d 20  ROM t1 }] != 4} 
0690: 7b 0a 20 20 20 20 65 72 72 6f 72 20 22 44 61 74  {.    error "Dat
06a0: 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 61 70  abase content ap
06b0: 70 65 61 72 73 20 69 6e 63 6f 72 72 65 63 74 22  pears incorrect"
06c0: 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .  }.}..#-------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c 74 2d  --.# Test fault-
0720: 69 6e 6a 65 63 74 69 6f 6e 20 77 68 69 6c 65 20  injection while 
0730: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
0740: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
0750: 77 69 74 68 20 61 20 0a 23 20 70 61 67 65 2d 73  with a .# page-s
0760: 69 7a 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ize different fr
0770: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  om the current v
0780: 61 6c 75 65 20 73 74 6f 72 65 64 20 6f 6e 20 70  alue stored on p
0790: 61 67 65 20 31 20 6f 66 20 74 68 65 0a 23 20 64  age 1 of the.# d
07a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a  atabase file..#.
07b0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  do_test pagerfau
07c0: 6c 74 2d 32 2d 70 72 65 31 20 7b 0a 20 20 74 65  lt-2-pre1 {.  te
07d0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
07e0: 74 20 31 0a 20 20 74 76 20 66 69 6c 74 65 72 20  t 1.  tv filter 
07f0: 78 53 79 6e 63 0a 20 20 74 76 20 73 63 72 69 70  xSync.  tv scrip
0800: 74 20 78 53 79 6e 63 43 62 0a 20 20 70 72 6f 63  t xSyncCb.  proc
0810: 20 78 53 79 6e 63 43 62 20 7b 66 69 6c 65 6e 61   xSyncCb {filena
0820: 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 69  me args} {.    i
0830: 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
0840: 20 2a 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61   *journal filena
0850: 6d 65 5d 3d 3d 30 7d 20 66 61 75 6c 74 73 69 6d  me]==0} faultsim
0860: 5f 73 61 76 65 0a 20 20 7d 0a 20 20 66 61 75 6c  _save.  }.  faul
0870: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
0880: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
0890: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
08a0: 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a  ge_size = 4096;.
08b0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
08c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
08d0: 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  c(a, b, c);.    
08e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
08f0: 63 20 56 41 4c 55 45 53 28 27 6f 27 2c 20 27 74  c VALUES('o', 't
0900: 27 2c 20 27 74 27 29 3b 20 0a 20 20 20 20 20 20  ', 't'); .      
0910: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
0920: 56 41 4c 55 45 53 28 27 66 27 2c 20 27 66 27 2c  VALUES('f', 'f',
0930: 20 27 73 27 29 3b 20 0a 20 20 20 20 20 20 49 4e   's'); .      IN
0940: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45  SERT INTO abc SE
0950: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b  LECT * FROM abc;
0960: 20 2d 2d 20 34 0a 20 20 20 20 20 20 49 4e 53 45   -- 4.      INSE
0970: 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45  RT INTO abc SELE
0980: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 20 2d  CT * FROM abc; -
0990: 2d 20 38 0a 20 20 20 20 20 20 49 4e 53 45 52 54  - 8.      INSERT
09a0: 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54   INTO abc SELECT
09b0: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 20 2d 2d 20   * FROM abc; -- 
09c0: 31 36 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  16.      INSERT 
09d0: 49 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20  INTO abc SELECT 
09e0: 2a 20 46 52 4f 4d 20 61 62 63 3b 20 2d 2d 20 33  * FROM abc; -- 3
09f0: 32 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  2.      INSERT I
0a00: 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a  NTO abc SELECT *
0a10: 20 46 52 4f 4d 20 61 62 63 3b 20 2d 2d 20 36 34   FROM abc; -- 64
0a20: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0a30: 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20  TO abc SELECT * 
0a40: 46 52 4f 4d 20 61 62 63 3b 20 2d 2d 20 31 32 38  FROM abc; -- 128
0a50: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0a60: 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20  TO abc SELECT * 
0a70: 46 52 4f 4d 20 61 62 63 3b 20 2d 2d 20 32 35 36  FROM abc; -- 256
0a80: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20  .    COMMIT;.   
0a90: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
0aa0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 56 41  e = 1024;.    VA
0ab0: 43 55 55 4d 3b 0a 20 20 7d 0a 20 20 64 62 20 63  CUUM;.  }.  db c
0ac0: 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65  lose.  tv delete
0ad0: 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69  .} {}.do_faultsi
0ae0: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
0af0: 74 2d 32 20 2d 70 72 65 70 20 7b 0a 20 20 66 61  t-2 -prep {.  fa
0b00: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
0b10: 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64  nd_reopen.} -bod
0b20: 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  y {.  execsql { 
0b30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62  SELECT * FROM ab
0b40: 63 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20  c }.} -test {.  
0b50: 73 65 74 20 61 6e 73 77 65 72 20 5b 73 70 6c 69  set answer [spli
0b60: 74 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74  t [string repeat
0b70: 20 22 6f 74 74 66 66 73 22 20 31 32 38 5d 20 22   "ottffs" 128] "
0b80: 22 5d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65  "].  faultsim_te
0b90: 73 74 5f 72 65 73 75 6c 74 20 5b 6c 69 73 74 20  st_result [list 
0ba0: 30 20 24 61 6e 73 77 65 72 5d 0a 20 20 66 61 75  0 $answer].  fau
0bb0: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
0bc0: 63 68 65 63 6b 0a 20 20 73 65 74 20 72 65 73 20  check.  set res 
0bd0: 5b 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43  [db eval { SELEC
0be0: 54 20 2a 20 46 52 4f 4d 20 61 62 63 20 7d 5d 0a  T * FROM abc }].
0bf0: 20 20 69 66 20 7b 24 72 65 73 20 21 3d 20 24 61    if {$res != $a
0c00: 6e 73 77 65 72 7d 20 7b 20 65 72 72 6f 72 20 22  nswer} { error "
0c10: 44 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  Database content
0c20: 20 61 70 70 65 61 72 73 20 69 6e 63 6f 72 72 65   appears incorre
0c30: 63 74 20 28 24 72 65 73 29 22 20 7d 0a 7d 20 0a  ct ($res)" }.} .
0c40: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
0c90: 73 74 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69  st fault-injecti
0ca0: 6f 6e 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  on while rolling
0cb0: 20 62 61 63 6b 20 68 6f 74 2d 6a 6f 75 72 6e 61   back hot-journa
0cc0: 6c 73 20 74 68 61 74 20 77 65 72 65 20 63 72 65  ls that were cre
0cd0: 61 74 65 64 0a 23 20 61 73 20 70 61 72 74 20 6f  ated.# as part o
0ce0: 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
0cf0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a 64 6f  ransaction..#.do
0d00: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
0d10: 2d 33 2d 70 72 65 31 20 7b 0a 20 20 74 65 73 74  -3-pre1 {.  test
0d20: 76 66 73 20 74 73 74 76 66 73 20 2d 64 65 66 61  vfs tstvfs -defa
0d30: 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73 20 66  ult 1.  tstvfs f
0d40: 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20  ilter xDelete.  
0d50: 74 73 74 76 66 73 20 73 63 72 69 70 74 20 78 44  tstvfs script xD
0d60: 65 6c 65 74 65 43 61 6c 6c 62 61 63 6b 0a 0a 20  eleteCallback.. 
0d70: 20 70 72 6f 63 20 78 44 65 6c 65 74 65 43 61 6c   proc xDeleteCal
0d80: 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64 20 66 69  lback {method fi
0d90: 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73  le args} {.    s
0da0: 65 74 20 66 69 6c 65 20 5b 66 69 6c 65 20 74 61  et file [file ta
0db0: 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20 20 69 66  il $file].    if
0dc0: 20 7b 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68   { [string match
0dd0: 20 2a 6d 6a 2a 20 24 66 69 6c 65 5d 20 7d 20 7b   *mj* $file] } {
0de0: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 7d   faultsim_save }
0df0: 0a 20 20 7d 0a 0a 20 20 66 61 75 6c 74 73 69 6d  .  }..  faultsim
0e00: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
0e10: 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  en.  db func a_s
0e20: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a  tring a_string..
0e30: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0e40: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32  ATTACH 'test.db2
0e50: 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52  ' AS aux;.    PR
0e60: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
0e70: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20  e = DELETE;.    
0e80: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 63 61 63 68  PRAGMA main.cach
0e90: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
0ea0: 20 50 52 41 47 4d 41 20 61 75 78 2e 63 61 63 68   PRAGMA aux.cach
0eb0: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 0a 20 20  e_size = 10;..  
0ec0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0ed0: 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  1(a UNIQUE, b UN
0ee0: 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54  IQUE);.    CREAT
0ef0: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61  E TABLE aux.t2(a
0f00: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
0f10: 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  E);.    INSERT I
0f20: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
0f30: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
0f40: 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20  tring(300));.   
0f50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0f60: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
0f70: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
0f80: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
0f90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0fa0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
0fb0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
0fc0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
0fd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
0fe0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0ff0: 3b 0a 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  ;..    BEGIN;.  
1000: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1010: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
1020: 6e 67 28 32 30 31 29 2c 20 61 5f 73 74 72 69 6e  ng(201), a_strin
1030: 67 28 33 30 31 29 20 46 52 4f 4d 20 74 31 3b 0a  g(301) FROM t1;.
1040: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1050: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
1060: 72 69 6e 67 28 32 30 32 29 2c 20 61 5f 73 74 72  ring(202), a_str
1070: 69 6e 67 28 33 30 32 29 20 46 52 4f 4d 20 74 31  ing(302) FROM t1
1080: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1090: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
10a0: 73 74 72 69 6e 67 28 32 30 33 29 2c 20 61 5f 73  string(203), a_s
10b0: 74 72 69 6e 67 28 33 30 33 29 20 46 52 4f 4d 20  tring(303) FROM 
10c0: 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t1;.      INSERT
10d0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
10e0: 61 5f 73 74 72 69 6e 67 28 32 30 34 29 2c 20 61  a_string(204), a
10f0: 5f 73 74 72 69 6e 67 28 33 30 34 29 20 46 52 4f  _string(304) FRO
1100: 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 45 50 4c  M t1;.      REPL
1110: 41 43 45 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ACE INTO t2 SELE
1120: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
1130: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20    COMMIT;.  }.. 
1140: 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73 74 76   db close.  tstv
1150: 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 64  fs delete.} {}.d
1160: 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20  o_faultsim_test 
1170: 70 61 67 65 72 66 61 75 6c 74 2d 33 20 2d 70 72  pagerfault-3 -pr
1180: 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  ep {.  faultsim_
1190: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
11a0: 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65  en.} -body {.  e
11b0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54  xecsql { .    AT
11c0: 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20  TACH 'test.db2' 
11d0: 41 53 20 61 75 78 3b 0a 20 20 20 20 53 45 4c 45  AS aux;.    SELE
11e0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
11f0: 20 74 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   t2;.    SELECT 
1200: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
1210: 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  ;.  }.} -test {.
1220: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
1230: 72 65 73 75 6c 74 20 7b 30 20 7b 34 20 34 7d 7d  result {0 {4 4}}
1240: 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f   {1 {unable to o
1250: 70 65 6e 20 64 61 74 61 62 61 73 65 3a 20 74 65  pen database: te
1260: 73 74 2e 64 62 32 7d 7d 0a 20 20 66 61 75 6c 74  st.db2}}.  fault
1270: 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  sim_integrity_ch
1280: 65 63 6b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  eck.  catchsql {
1290: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
12a0: 32 27 20 41 53 20 61 75 78 20 7d 0a 20 20 69 66  2' AS aux }.  if
12b0: 20 7b 5b 64 62 20 6f 6e 65 20 7b 20 53 45 4c 45   {[db one { SELE
12c0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
12d0: 20 74 31 20 7d 5d 20 21 3d 20 34 0a 20 20 20 7c   t1 }] != 4.   |
12e0: 7c 20 5b 64 62 20 6f 6e 65 20 7b 20 53 45 4c 45  | [db one { SELE
12f0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1300: 20 74 32 20 7d 5d 20 21 3d 20 34 0a 20 20 7d 20   t2 }] != 4.  } 
1310: 7b 0a 20 20 20 20 65 72 72 6f 72 20 22 44 61 74  {.    error "Dat
1320: 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 61 70  abase content ap
1330: 70 65 61 72 73 20 69 6e 63 6f 72 72 65 63 74 22  pears incorrect"
1340: 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .  }.}..#-------
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1390: 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c 74 2d  --.# Test fault-
13a0: 69 6e 6a 65 63 74 69 6f 6e 20 61 73 20 70 61 72  injection as par
13b0: 74 20 6f 66 20 61 20 76 61 6e 69 6c 6c 61 2c 20  t of a vanilla, 
13c0: 6e 6f 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  no-transaction, 
13d0: 49 4e 53 45 52 54 0a 23 20 73 74 61 74 65 6d 65  INSERT.# stateme
13e0: 6e 74 2e 0a 23 0a 64 6f 5f 66 61 75 6c 74 73 69  nt..#.do_faultsi
13f0: 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  m_test pagerfaul
1400: 74 2d 34 20 2d 70 72 65 70 20 7b 0a 20 20 66 61  t-4 -prep {.  fa
1410: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
1420: 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79  d_reopen.} -body
1430: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
1440: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1450: 20 78 28 79 29 3b 0a 20 20 20 20 49 4e 53 45 52   x(y);.    INSER
1460: 54 20 49 4e 54 4f 20 78 20 56 41 4c 55 45 53 28  T INTO x VALUES(
1470: 27 7a 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  'z');.    SELECT
1480: 20 2a 20 46 52 4f 4d 20 78 3b 0a 20 20 7d 0a 7d   * FROM x;.  }.}
1490: 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74   -test {.  fault
14a0: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
14b0: 7b 30 20 7a 7d 0a 20 20 66 61 75 6c 74 73 69 6d  {0 z}.  faultsim
14c0: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
14d0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
14e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1520: 20 54 65 73 74 20 66 61 75 6c 74 2d 69 6e 6a 65   Test fault-inje
1530: 63 74 69 6f 6e 20 61 73 20 70 61 72 74 20 6f 66  ction as part of
1540: 20 61 20 63 6f 6d 6d 69 74 20 77 68 65 6e 20 75   a commit when u
1550: 73 69 6e 67 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  sing journal_mod
1560: 65 3d 50 45 52 53 49 53 54 2e 0a 23 20 54 68 72  e=PERSIST..# Thr
1570: 65 65 20 64 69 66 66 65 72 65 6e 74 20 63 61 73  ee different cas
1580: 65 73 3a 0a 23 0a 23 20 20 20 20 70 61 67 65 72  es:.#.#    pager
1590: 66 61 75 6c 74 2d 35 2e 31 3a 20 57 69 74 68 20  fault-5.1: With 
15a0: 6e 6f 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  no journal_size_
15b0: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
15c0: 2e 0a 23 20 20 20 20 70 61 67 65 72 66 61 75 6c  ..#    pagerfaul
15d0: 74 2d 35 2e 32 3a 20 57 69 74 68 20 61 20 6a 6f  t-5.2: With a jo
15e0: 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74  urnal_size_limit
15f0: 20 63 6f 6e 66 69 67 75 72 65 64 2e 0a 23 20 20   configured..#  
1600: 20 20 70 61 67 65 72 66 61 75 6c 74 2d 35 2e 34    pagerfault-5.4
1610: 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  : Multi-file tra
1620: 6e 73 61 63 74 69 6f 6e 2e 20 4f 6e 65 20 63 6f  nsaction. One co
1630: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 0a  nnection has a .
1640: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
1650: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a       journal_siz
1660: 65 5f 6c 69 6d 69 74 20 6f 66 20 30 2c 20 74 68  e_limit of 0, th
1670: 65 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 6c  e other has no l
1680: 69 6d 69 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  imit..#.do_test 
1690: 70 61 67 65 72 66 61 75 6c 74 2d 35 2d 70 72 65  pagerfault-5-pre
16a0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
16b0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
16c0: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
16d0: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65  ing a_string.  e
16e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
16f0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 55  ATE TABLE t1(a U
1700: 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55 45 29  NIQUE, b UNIQUE)
1710: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1720: 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74  O t1 VALUES(a_st
1730: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
1740: 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20 20 49  ing(300));.    I
1750: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1760: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
1770: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
1780: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
1790: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
17a0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
17b0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
17c0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20  ) FROM t1;.  }. 
17d0: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61   faultsim_save_a
17e0: 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f  nd_close.} {}.do
17f0: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70  _faultsim_test p
1800: 61 67 65 72 66 61 75 6c 74 2d 35 2e 31 20 2d 70  agerfault-5.1 -p
1810: 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  rep {.  faultsim
1820: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
1830: 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
1840: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
1850: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
1860: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
1870: 3d 20 50 45 52 53 49 53 54 20 7d 0a 7d 20 2d 62  = PERSIST }.} -b
1880: 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ody {.  execsql 
1890: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
18a0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
18b0: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
18c0: 33 30 30 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  300) FROM t1 }.}
18d0: 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74   -test {.  fault
18e0: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
18f0: 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69  {0 {}}.  faultsi
1900: 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  m_integrity_chec
1910: 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  k.}.do_faultsim_
1920: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
1930: 35 2e 32 20 2d 70 72 65 70 20 7b 0a 20 20 66 61  5.2 -prep {.  fa
1940: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
1950: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
1960: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
1970: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
1980: 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  { .    PRAGMA jo
1990: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
19a0: 53 49 53 54 3b 0a 20 20 20 20 50 52 41 47 4d 41  SIST;.    PRAGMA
19b0: 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69   journal_size_li
19c0: 6d 69 74 20 3d 20 32 30 34 38 3b 0a 20 20 7d 0a  mit = 2048;.  }.
19d0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
19e0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
19f0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
1a00: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
1a10: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31  ing(300) FROM t1
1a20: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
1a30: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
1a40: 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20 66 61 75  ult {0 {}}.  fau
1a50: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
1a60: 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c 74  check.}.do_fault
1a70: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
1a80: 75 6c 74 2d 35 2e 33 20 2d 66 61 75 6c 74 73 20  ult-5.3 -faults 
1a90: 6f 6f 6d 2d 74 72 61 6e 73 69 65 6e 74 20 2d 70  oom-transient -p
1aa0: 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  rep {.  faultsim
1ab0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
1ac0: 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
1ad0: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
1ae0: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66    file delete -f
1af0: 6f 72 63 65 20 74 65 73 74 32 2e 64 62 20 74 65  orce test2.db te
1b00: 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74  st2.db-journal t
1b10: 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 65 78  est2.db-wal.  ex
1b20: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
1b30: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
1b40: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
1b50: 41 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62  ATTACH 'test2.db
1b60: 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52  ' AS aux;.    PR
1b70: 41 47 4d 41 20 61 75 78 2e 6a 6f 75 72 6e 61 6c  AGMA aux.journal
1b80: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
1b90: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e  .    PRAGMA aux.
1ba0: 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d  journal_size_lim
1bb0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 20 2d 62  it = 0;.  }.} -b
1bc0: 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ody {.  execsql 
1bd0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
1be0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1bf0: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
1c00: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
1c10: 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (300) FROM t1;. 
1c20: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
1c30: 45 20 61 75 78 2e 74 32 20 41 53 20 53 45 4c 45  E aux.t2 AS SELE
1c40: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
1c50: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
1c60: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
1c70: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
1c80: 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d  0 {}}.  faultsim
1c90: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
1ca0: 0a 0a 20 20 73 65 74 20 72 65 73 20 22 22 0a 20  ..  set res "". 
1cb0: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
1cc0: 20 73 65 74 20 72 65 73 20 5b 64 62 20 6f 6e 65   set res [db one
1cd0: 20 7b 20 50 52 41 47 4d 41 20 61 75 78 2e 69 6e   { PRAGMA aux.in
1ce0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 5d  tegrity_check }]
1cf0: 20 7d 5d 0a 20 20 69 66 20 7b 24 72 63 21 3d 30   }].  if {$rc!=0
1d00: 20 7c 7c 20 24 72 65 73 20 21 3d 20 22 6f 6b 22   || $res != "ok"
1d10: 7d 20 7b 65 72 72 6f 72 20 22 69 6e 74 65 67 72  } {error "integr
1d20: 69 74 79 2d 63 68 65 63 6b 20 70 72 6f 62 6c 65  ity-check proble
1d30: 6d 3a 24 72 63 20 24 72 65 73 22 7d 0a 7d 0a 0a  m:$rc $res"}.}..
1d40: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
1d90: 74 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f  t fault-injectio
1da0: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 63  n as part of a c
1db0: 6f 6d 6d 69 74 20 77 68 65 6e 20 75 73 69 6e 67  ommit when using
1dc0: 20 0a 23 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   .# journal_mode
1dd0: 3d 54 52 55 4e 43 41 54 45 2e 0a 23 0a 64 6f 5f  =TRUNCATE..#.do_
1de0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
1df0: 36 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74  6-pre1 {.  fault
1e00: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
1e10: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
1e20: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
1e30: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
1e40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1e50: 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  1(a UNIQUE, b UN
1e60: 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52  IQUE);.    INSER
1e70: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1e80: 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20  (a_string(200), 
1e90: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a  a_string(300));.
1ea0: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73    }.  faultsim_s
1eb0: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20  ave_and_close.} 
1ec0: 7b 7d 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  {}..do_faultsim_
1ed0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
1ee0: 36 2e 31 20 2d 70 72 65 70 20 7b 0a 20 20 66 61  6.1 -prep {.  fa
1ef0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
1f00: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
1f10: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
1f20: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
1f30: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
1f40: 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45  _mode = TRUNCATE
1f50: 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65   }.} -body {.  e
1f60: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
1f70: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
1f80: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
1f90: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
1fa0: 20 74 31 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   t1 }.  execsql 
1fb0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
1fc0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
1fd0: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
1fe0: 33 30 30 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  300) FROM t1 }.}
1ff0: 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74   -test {.  fault
2000: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
2010: 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69  {0 {}}.  faultsi
2020: 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  m_integrity_chec
2030: 6b 0a 7d 0a 0a 23 20 54 68 65 20 75 6e 69 78 20  k.}..# The unix 
2040: 76 66 73 20 78 41 63 63 65 73 73 28 29 20 6d 65  vfs xAccess() me
2050: 74 68 6f 64 20 63 6f 6e 73 69 64 65 72 73 20 61  thod considers a
2060: 20 66 69 6c 65 20 7a 65 72 6f 20 62 79 74 65 73   file zero bytes
2070: 20 69 6e 20 73 69 7a 65 20 74 6f 0a 23 20 22 6e   in size to.# "n
2080: 6f 74 20 65 78 69 73 74 22 2e 20 54 68 69 73 20  ot exist". This 
2090: 70 72 6f 63 20 6f 76 65 72 72 69 64 65 73 20 74  proc overrides t
20a0: 68 61 74 20 62 65 68 61 76 69 6f 75 72 20 73 6f  hat behaviour so
20b0: 20 74 68 61 74 20 61 20 7a 65 72 6f 20 6c 65 6e   that a zero len
20c0: 67 74 68 0a 23 20 66 69 6c 65 20 69 73 20 63 6f  gth.# file is co
20d0: 6e 73 69 64 65 72 65 64 20 74 6f 20 65 78 69 73  nsidered to exis
20e0: 74 2e 0a 23 0a 70 72 6f 63 20 78 41 63 63 65 73  t..#.proc xAcces
20f0: 73 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61  s {method filena
2100: 6d 65 20 6f 70 20 61 72 67 73 7d 20 7b 0a 20 20  me op args} {.  
2110: 69 66 20 7b 24 6f 70 20 21 3d 20 22 53 51 4c 49  if {$op != "SQLI
2120: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2130: 22 7d 20 7b 20 72 65 74 75 72 6e 20 22 22 20 7d  "} { return "" }
2140: 0a 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20  .  return [file 
2150: 65 78 69 73 74 73 20 24 66 69 6c 65 6e 61 6d 65  exists $filename
2160: 5d 0a 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  ].}.do_faultsim_
2170: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
2180: 36 2e 32 20 2d 66 61 75 6c 74 73 20 63 61 6e 74  6.2 -faults cant
2190: 6f 70 65 6e 2d 2a 20 2d 70 72 65 70 20 7b 0a 20  open-* -prep {. 
21a0: 20 73 68 6d 66 61 75 6c 74 20 66 69 6c 74 65 72   shmfault filter
21b0: 20 78 41 63 63 65 73 73 0a 20 20 73 68 6d 66 61   xAccess.  shmfa
21c0: 75 6c 74 20 73 63 72 69 70 74 20 78 41 63 63 65  ult script xAcce
21d0: 73 73 0a 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  ss..  faultsim_r
21e0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
21f0: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
2200: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
2210: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
2220: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
2230: 54 52 55 4e 43 41 54 45 20 7d 0a 7d 20 2d 62 6f  TRUNCATE }.} -bo
2240: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
2250: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2260: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
2270: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
2280: 30 30 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  00) FROM t1 }.  
2290: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
22a0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
22b0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
22c0: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
22d0: 4d 20 74 31 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  M t1 }.} -test {
22e0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
22f0: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20  _result {0 {}}. 
2300: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
2310: 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 23 20 54  ity_check.}..# T
2320: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73  he following was
2330: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67   an attempt to g
2340: 65 74 20 61 20 62 69 74 76 65 63 20 6d 61 6c 6c  et a bitvec mall
2350: 6f 63 20 74 6f 20 66 61 69 6c 2e 20 44 69 64 6e  oc to fail. Didn
2360: 27 74 20 77 6f 72 6b 2e 0a 23 0a 23 20 64 6f 5f  't work..#.# do_
2370: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
2380: 36 2d 70 72 65 31 20 7b 0a 23 20 20 20 66 61 75  6-pre1 {.#   fau
2390: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
23a0: 5f 72 65 6f 70 65 6e 0a 23 20 20 20 65 78 65 63  _reopen.#   exec
23b0: 73 71 6c 20 7b 0a 23 20 20 20 20 20 43 52 45 41  sql {.#     CREA
23c0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
23d0: 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
23e0: 0a 23 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .#     INSERT IN
23f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
2400: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 31 29  randomblob(1501)
2410: 29 3b 0a 23 20 20 20 20 20 49 4e 53 45 52 54 20  );.#     INSERT 
2420: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
2430: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
2440: 32 29 29 3b 0a 23 20 20 20 20 20 49 4e 53 45 52  2));.#     INSER
2450: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2460: 28 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (3, randomblob(1
2470: 35 30 33 29 29 3b 0a 23 20 20 20 20 20 49 4e 53  503));.#     INS
2480: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2490: 45 53 28 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(4, randomblob
24a0: 28 31 35 30 34 29 29 3b 0a 23 20 20 20 20 20 49  (1504));.#     I
24b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 0a 23  NSERT INTO t1 .#
24c0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 2c         SELECT x,
24d0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
24e0: 2b 6f 69 64 2b 28 53 45 4c 45 43 54 20 6d 61 78  +oid+(SELECT max
24f0: 28 6f 69 64 29 20 46 52 4f 4d 20 74 31 29 29 20  (oid) FROM t1)) 
2500: 46 52 4f 4d 20 74 31 3b 0a 23 20 20 20 20 20 49  FROM t1;.#     I
2510: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 0a 23  NSERT INTO t1 .#
2520: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 2c         SELECT x,
2530: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
2540: 2b 6f 69 64 2b 28 53 45 4c 45 43 54 20 6d 61 78  +oid+(SELECT max
2550: 28 6f 69 64 29 20 46 52 4f 4d 20 74 31 29 29 20  (oid) FROM t1)) 
2560: 46 52 4f 4d 20 74 31 3b 0a 23 20 20 20 20 20 49  FROM t1;.#     I
2570: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 0a 23  NSERT INTO t1 .#
2580: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 2c         SELECT x,
2590: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
25a0: 2b 6f 69 64 2b 28 53 45 4c 45 43 54 20 6d 61 78  +oid+(SELECT max
25b0: 28 6f 69 64 29 20 46 52 4f 4d 20 74 31 29 29 20  (oid) FROM t1)) 
25c0: 46 52 4f 4d 20 74 31 3b 0a 23 20 20 20 20 20 49  FROM t1;.#     I
25d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 0a 23  NSERT INTO t1 .#
25e0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 2c         SELECT x,
25f0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
2600: 2b 6f 69 64 2b 28 53 45 4c 45 43 54 20 6d 61 78  +oid+(SELECT max
2610: 28 6f 69 64 29 20 46 52 4f 4d 20 74 31 29 29 20  (oid) FROM t1)) 
2620: 46 52 4f 4d 20 74 31 3b 0a 23 20 20 20 7d 0a 23  FROM t1;.#   }.#
2630: 20 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65     faultsim_save
2640: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 23 20 7d 20 7b  _and_close.# } {
2650: 7d 0a 23 20 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  }.# do_faultsim_
2660: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
2670: 36 20 2d 70 72 65 70 20 7b 0a 23 20 20 20 66 61  6 -prep {.#   fa
2680: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
2690: 6e 64 5f 72 65 6f 70 65 6e 0a 23 20 7d 20 2d 62  nd_reopen.# } -b
26a0: 6f 64 79 20 7b 0a 23 20 20 20 65 78 65 63 73 71  ody {.#   execsq
26b0: 6c 20 7b 20 0a 23 20 20 20 20 20 42 45 47 49 4e  l { .#     BEGIN
26c0: 3b 0a 23 20 20 20 20 20 20 20 55 50 44 41 54 45  ;.#       UPDATE
26d0: 20 74 31 20 53 45 54 20 78 3d 78 2b 34 20 57 48   t1 SET x=x+4 WH
26e0: 45 52 45 20 78 3d 31 3b 0a 23 20 20 20 20 20 20  ERE x=1;.#      
26f0: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
2700: 23 20 20 20 20 20 20 20 20 20 55 50 44 41 54 45  #         UPDATE
2710: 20 74 31 20 53 45 54 20 78 3d 78 2b 34 20 57 48   t1 SET x=x+4 WH
2720: 45 52 45 20 78 3d 32 3b 0a 23 20 20 20 20 20 20  ERE x=2;.#      
2730: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 68 72     SAVEPOINT thr
2740: 65 65 3b 0a 23 20 20 20 20 20 20 20 20 20 20 20  ee;.#           
2750: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 78 3d  UPDATE t1 SET x=
2760: 78 2b 34 20 57 48 45 52 45 20 78 3d 33 3b 0a 23  x+4 WHERE x=3;.#
2770: 20 20 20 20 20 20 20 20 20 20 20 53 41 56 45 50             SAVEP
2780: 4f 49 4e 54 20 66 6f 75 72 3b 0a 23 20 20 20 20  OINT four;.#    
2790: 20 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20           UPDATE 
27a0: 74 31 20 53 45 54 20 78 3d 78 2b 34 20 57 48 45  t1 SET x=x+4 WHE
27b0: 52 45 20 78 3d 34 3b 0a 23 20 20 20 20 20 20 20  RE x=4;.#       
27c0: 20 20 52 45 4c 45 41 53 45 20 74 68 72 65 65 3b    RELEASE three;
27d0: 0a 23 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 23  .#     COMMIT;.#
27e0: 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54       SELECT DIST
27f0: 49 4e 43 54 20 78 20 46 52 4f 4d 20 74 31 3b 0a  INCT x FROM t1;.
2800: 23 20 20 20 7d 0a 23 20 7d 20 2d 74 65 73 74 20  #   }.# } -test 
2810: 7b 0a 23 20 20 20 66 61 75 6c 74 73 69 6d 5f 74  {.#   faultsim_t
2820: 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 35  est_result {0 {5
2830: 20 36 20 37 20 38 7d 7d 0a 23 20 20 20 66 61 75   6 7 8}}.#   fau
2840: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
2850: 63 68 65 63 6b 0a 23 20 7d 0a 23 0a 0a 23 20 54  check.# }.#..# T
2860: 68 69 73 20 69 73 20 64 65 73 69 67 6e 65 64 20  his is designed 
2870: 74 6f 20 70 72 6f 76 6f 6b 65 20 61 20 73 70 65  to provoke a spe
2880: 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
2890: 20 70 61 67 65 72 20 63 6f 64 65 3a 0a 23 0a 23   pager code:.#.#
28a0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 28 73 70   If an error (sp
28b0: 65 63 69 66 69 63 61 6c 6c 79 2c 20 61 20 46 55  ecifically, a FU
28c0: 4c 4c 20 6f 72 20 49 4f 45 52 52 20 65 72 72 6f  LL or IOERR erro
28d0: 72 29 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  r) occurs while 
28e0: 77 72 69 74 69 6e 67 20 61 0a 23 20 64 69 72 74  writing a.# dirt
28f0: 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 69  y page to the fi
2900: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
2910: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
2920: 6d 6f 72 79 2c 20 74 68 65 20 70 61 67 65 72 20  mory, the pager 
2930: 65 6e 74 65 72 73 0a 23 20 74 68 65 20 22 65 72  enters.# the "er
2940: 72 6f 72 20 73 74 61 74 65 22 2e 20 41 6e 20 49  ror state". An I
2950: 4f 20 65 72 72 6f 72 20 63 61 75 73 65 73 20 53  O error causes S
2960: 51 4c 69 74 65 20 74 6f 20 72 6f 6c 6c 20 62 61  QLite to roll ba
2970: 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 0a 23  ck the current.#
2980: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 65 78   transaction (ex
2990: 69 74 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  iting the error 
29a0: 73 74 61 74 65 29 2e 20 41 20 46 55 4c 4c 20 65  state). A FULL e
29b0: 72 72 6f 72 2c 20 68 6f 77 65 76 65 72 2c 20 6d  rror, however, m
29c0: 61 79 20 6f 6e 6c 79 0a 23 20 72 6f 6c 6c 62 61  ay only.# rollba
29d0: 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ck the current s
29e0: 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 23 20 54 68  tatement..#.# Th
29f0: 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 74  is block tests t
2a00: 68 61 74 20 6e 6f 74 68 69 6e 67 20 67 6f 65 73  hat nothing goes
2a10: 20 77 72 6f 6e 67 20 69 66 20 61 20 46 55 4c 4c   wrong if a FULL
2a20: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2a30: 69 6c 65 0a 23 20 77 72 69 74 69 6e 67 20 61 20  ile.# writing a 
2a40: 64 69 72 74 79 20 70 61 67 65 20 6f 75 74 20 74  dirty page out t
2a50: 6f 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 66 72  o free memory fr
2a60: 6f 6d 20 77 69 74 68 69 6e 20 61 20 73 74 61 74  om within a stat
2a70: 65 6d 65 6e 74 20 74 68 61 74 20 68 61 73 0a 23  ement that has.#
2a80: 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
2a90: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
2aa0: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
2ab0: 66 61 75 6c 74 2d 37 2d 70 72 65 31 20 7b 0a 20  fault-7-pre1 {. 
2ac0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
2ad0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
2ae0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
2af0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 49 4e  TE TABLE t2(a IN
2b00: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2b10: 59 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49 4e  Y, b);.    BEGIN
2b20: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2b30: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 4e 55  NTO t2 VALUES(NU
2b40: 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  LL, randomblob(1
2b50: 35 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  500));.      INS
2b60: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
2b70: 45 53 28 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62  ES(NULL, randomb
2b80: 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20  lob(1500));.    
2b90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
2ba0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61   SELECT NULL, ra
2bb0: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
2bc0: 52 4f 4d 20 74 32 3b 20 20 20 20 2d 2d 20 20 34  ROM t2;    --  4
2bd0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2be0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 4e 55 4c  TO t2 SELECT NUL
2bf0: 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  L, randomblob(15
2c00: 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 20 20 20  00) FROM t2;    
2c10: 2d 2d 20 20 38 0a 20 20 20 20 20 20 49 4e 53 45  --  8.      INSE
2c20: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
2c30: 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c  T NULL, randombl
2c40: 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 32  ob(1500) FROM t2
2c50: 3b 20 20 20 20 2d 2d 20 31 36 0a 20 20 20 20 20  ;    -- 16.     
2c60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
2c70: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e  SELECT NULL, ran
2c80: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
2c90: 4f 4d 20 74 32 3b 20 20 20 20 2d 2d 20 33 32 0a  OM t2;    -- 32.
2ca0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2cb0: 4f 20 74 32 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t2 SELECT NULL
2cc0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
2cd0: 30 29 20 46 52 4f 4d 20 74 32 3b 20 20 20 20 2d  0) FROM t2;    -
2ce0: 2d 20 36 34 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  - 64.    COMMIT;
2cf0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2d00: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
2d10: 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  EY, b);.    INSE
2d20: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2d30: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  T * FROM t2;.   
2d40: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a   DROP TABLE t2;.
2d50: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73    }.  faultsim_s
2d60: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20  ave_and_close.} 
2d70: 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74  {}.do_faultsim_t
2d80: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 37  est pagerfault-7
2d90: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
2da0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
2db0: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
2dc0: 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 63   { .    PRAGMA c
2dd0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
2de0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2df0: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
2e00: 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35   = randomblob(15
2e10: 30 30 29 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79  00);.  }.} -body
2e20: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55   {.  execsql { U
2e30: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d  PDATE t1 SET a =
2e40: 20 36 35 2c 20 62 20 3d 20 72 61 6e 64 6f 6d 62   65, b = randomb
2e50: 6c 6f 62 28 31 35 30 30 29 20 57 48 45 52 45 20  lob(1500) WHERE 
2e60: 28 61 2b 31 29 3e 32 30 30 20 7d 0a 20 20 65 78  (a+1)>200 }.  ex
2e70: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 2d  ecsql COMMIT.} -
2e80: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
2e90: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
2ea0: 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f   {}}.  faultsim_
2eb0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
2ec0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
2ed0: 66 61 75 6c 74 2d 38 2d 70 72 65 31 20 7b 0a 20  fault-8-pre1 {. 
2ee0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
2ef0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
2f00: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
2f10: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
2f20: 20 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   1;.    CREATE T
2f30: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
2f40: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
2f50: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
2f60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2f70: 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  t1 VALUES(NULL, 
2f80: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2f90: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
2fa0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e  INTO t1 VALUES(N
2fb0: 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  ULL, randomblob(
2fc0: 31 35 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e  1500));.      IN
2fd0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2fe0: 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d  ECT NULL, random
2ff0: 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
3000: 74 31 3b 20 20 20 20 2d 2d 20 20 34 0a 20 20 20  t1;    --  4.   
3010: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3020: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72  1 SELECT NULL, r
3030: 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
3040: 46 52 4f 4d 20 74 31 3b 20 20 20 20 2d 2d 20 20  FROM t1;    --  
3050: 38 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  8.      INSERT I
3060: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
3070: 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  LL, randomblob(1
3080: 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  500) FROM t1;   
3090: 20 2d 2d 20 31 36 0a 20 20 20 20 20 20 49 4e 53   -- 16.      INS
30a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
30b0: 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62  CT NULL, randomb
30c0: 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
30d0: 31 3b 20 20 20 20 2d 2d 20 33 32 0a 20 20 20 20  1;    -- 32.    
30e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
30f0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61   SELECT NULL, ra
3100: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
3110: 52 4f 4d 20 74 31 3b 20 20 20 20 2d 2d 20 36 34  ROM t1;    -- 64
3120: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
3130: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  .  faultsim_save
3140: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 20 20 73 65 74  _and_close.  set
3150: 20 66 69 6c 65 73 69 7a 65 20 5b 66 69 6c 65 20   filesize [file 
3160: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 20 20  size test.db].  
3170: 73 65 74 20 7b 7d 20 7b 7d 0a 7d 20 7b 7d 0a 64  set {} {}.} {}.d
3180: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
3190: 74 2d 38 2d 70 72 65 32 20 7b 0a 20 20 66 61 75  t-8-pre2 {.  fau
31a0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
31b0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
31c0: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
31d0: 20 74 31 20 57 48 45 52 45 20 61 3e 33 32 20 7d   t1 WHERE a>32 }
31e0: 0a 20 20 65 78 70 72 20 7b 5b 66 69 6c 65 20 73  .  expr {[file s
31f0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 3c 20 24  ize test.db] < $
3200: 66 69 6c 65 73 69 7a 65 7d 0a 7d 20 7b 31 7d 0a  filesize}.} {1}.
3210: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
3220: 20 70 61 67 65 72 66 61 75 6c 74 2d 38 20 2d 70   pagerfault-8 -p
3230: 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  rep {.  faultsim
3240: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
3250: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  pen.  execsql { 
3260: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
3270: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
3280: 48 45 52 45 20 61 3e 33 32 3b 0a 20 20 7d 0a 7d  HERE a>32;.  }.}
3290: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
32a0: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 2d 74 65 73  ql COMMIT.} -tes
32b0: 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74  t {.  faultsim_t
32c0: 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d  est_result {0 {}
32d0: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74  }.  faultsim_int
32e0: 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a  egrity_check.}..
32f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  do_test pagerfau
3300: 6c 74 2d 39 2d 70 72 65 31 20 7b 0a 20 20 66 61  lt-9-pre1 {.  fa
3310: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
3320: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
3330: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
3340: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 69 6e  auto_vacuum = in
3350: 63 72 65 6d 65 6e 74 61 6c 3b 0a 20 20 20 20 43  cremental;.    C
3360: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
3370: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
3380: 42 4c 45 20 74 32 28 79 29 3b 0a 20 20 20 20 43  BLE t2(y);.    C
3390: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 7a  REATE TABLE t3(z
33a0: 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  );..    INSERT I
33b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
33c0: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a  ndomblob(900));.
33d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
33e0: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
33f0: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
3400: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
3410: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73    }.  faultsim_s
3420: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20  ave_and_close.} 
3430: 7b 7d 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  {}..do_faultsim_
3440: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
3450: 39 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  9 -prep {.  faul
3460: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
3470: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
3480: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
3490: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
34a0: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
34b0: 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20  omblob(900));.  
34c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
34d0: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
34e0: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
34f0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 33 3b    DROP TABLE t3;
3500: 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c  .      DROP TABL
3510: 45 20 74 32 3b 0a 20 20 20 20 20 20 53 41 56 45  E t2;.      SAVE
3520: 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20  POINT abc;.     
3530: 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65 6d     PRAGMA increm
3540: 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20 20  ental_vacuum;.  
3550: 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  }.} -body {.  ex
3560: 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c  ecsql {.    ROLL
3570: 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20  BACK TO abc;.   
3580: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41   COMMIT;.    PRA
3590: 47 4d 41 20 66 72 65 65 6c 69 73 74 5f 63 6f 75  GMA freelist_cou
35a0: 6e 74 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b  nt.  }.} -test {
35b0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
35c0: 5f 72 65 73 75 6c 74 20 7b 30 20 32 7d 0a 20 20  _result {0 2}.  
35d0: 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69  faultsim_integri
35e0: 74 79 5f 63 68 65 63 6b 0a 0a 20 20 73 65 74 20  ty_check..  set 
35f0: 73 6c 20 5b 64 62 20 6f 6e 65 20 7b 20 53 45 4c  sl [db one { SEL
3600: 45 43 54 20 43 4f 41 4c 45 53 43 45 28 73 75 6d  ECT COALESCE(sum
3610: 28 6c 65 6e 67 74 68 28 78 29 29 2c 20 27 6e 75  (length(x)), 'nu
3620: 6c 6c 27 29 20 46 52 4f 4d 20 74 31 20 7d 5d 0a  ll') FROM t1 }].
3630: 20 20 69 66 20 7b 24 73 6c 21 3d 22 6e 75 6c 6c    if {$sl!="null
3640: 22 20 26 26 20 24 73 6c 21 3d 31 38 30 30 7d 20  " && $sl!=1800} 
3650: 7b 20 0a 20 20 20 20 65 72 72 6f 72 20 22 43 6f  { .    error "Co
3660: 6e 74 65 6e 74 20 6c 6f 6f 6b 73 20 6e 6f 20 67  ntent looks no g
3670: 6f 6f 64 2e 2e 2e 20 28 24 73 6c 29 22 20 0a 20  ood... ($sl)" . 
3680: 20 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73   }.}..finish_tes
3690: 74 0a                                            t.