/ Hex Artifact Content
Login

Artifact 3cd3537bf2efb4baef26c74878718f4a32926da4:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 0a 69 66 20 7b 5b 70 65 72  on.tcl..if {[per
01f0: 6d 75 74 61 74 69 6f 6e 5d 20 3d 3d 20 22 69 6e  mutation] == "in
0200: 6d 65 6d 6f 72 79 5f 6a 6f 75 72 6e 61 6c 22 7d  memory_journal"}
0210: 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74   {.  finish_test
0220: 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 73 65 74  .  return.}..set
0230: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
0240: 72 20 31 0a 70 72 6f 63 20 61 5f 73 74 72 69 6e  r 1.proc a_strin
0250: 67 20 7b 6e 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  g {n} {.  global
0260: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
0270: 72 0a 20 20 69 6e 63 72 20 61 5f 73 74 72 69 6e  r.  incr a_strin
0280: 67 5f 63 6f 75 6e 74 65 72 0a 20 20 73 74 72 69  g_counter.  stri
0290: 6e 67 20 72 61 6e 67 65 20 5b 73 74 72 69 6e 67  ng range [string
02a0: 20 72 65 70 65 61 74 20 22 24 7b 61 5f 73 74 72   repeat "${a_str
02b0: 69 6e 67 5f 63 6f 75 6e 74 65 72 7d 2e 22 20 24  ing_counter}." $
02c0: 6e 5d 20 31 20 24 6e 0a 7d 0a 64 62 20 66 75 6e  n] 1 $n.}.db fun
02d0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
02e0: 69 6e 67 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ing..#----------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0330: 23 20 54 65 73 74 20 66 61 75 6c 74 2d 69 6e 6a  # Test fault-inj
0340: 65 63 74 69 6f 6e 20 77 68 69 6c 65 20 72 6f 6c  ection while rol
0350: 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
0360: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 23 0a  journal file..#.
0370: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  do_test pagerfau
0380: 6c 74 2d 31 2d 70 72 65 31 20 7b 0a 20 20 65 78  lt-1-pre1 {.  ex
0390: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
03a0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
03b0: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50 52  = DELETE;.    PR
03c0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
03d0: 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45  = 10;.    CREATE
03e0: 20 54 41 42 4c 45 20 74 31 28 61 20 55 4e 49 51   TABLE t1(a UNIQ
03f0: 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20  UE, b UNIQUE);. 
0400: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0410: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
0420: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
0430: 28 33 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (300));.    INSE
0440: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
0450: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
0460: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
0470: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
0480: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
0490: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
04a0: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
04b0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 47 49  ROM t1;.    BEGI
04c0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
04d0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
04e0: 5f 73 74 72 69 6e 67 28 32 30 31 29 2c 20 61 5f  _string(201), a_
04f0: 73 74 72 69 6e 67 28 33 30 31 29 20 46 52 4f 4d  string(301) FROM
0500: 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t1;.      INSER
0510: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
0520: 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29 2c 20   a_string(202), 
0530: 61 5f 73 74 72 69 6e 67 28 33 30 32 29 20 46 52  a_string(302) FR
0540: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53  OM t1;.      INS
0550: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
0560: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 33 29  CT a_string(203)
0570: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 33 29 20  , a_string(303) 
0580: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49  FROM t1;.      I
0590: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
05a0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
05b0: 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 34  4), a_string(304
05c0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20  ) FROM t1;.  }. 
05d0: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61   faultsim_save_a
05e0: 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f  nd_close.} {}.do
05f0: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70  _faultsim_test p
0600: 61 67 65 72 66 61 75 6c 74 2d 31 20 2d 70 72 65  agerfault-1 -pre
0610: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
0620: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
0630: 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  n.} -body {.  ex
0640: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
0650: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
0660: 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  }.} -test {.  fa
0670: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
0680: 6c 74 20 7b 30 20 34 7d 20 0a 20 20 66 61 75 6c  lt {0 4} .  faul
0690: 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63  tsim_integrity_c
06a0: 68 65 63 6b 0a 20 20 69 66 20 7b 5b 64 62 20 6f  heck.  if {[db o
06b0: 6e 65 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ne { SELECT coun
06c0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 5d 20  t(*) FROM t1 }] 
06d0: 21 3d 20 34 7d 20 7b 0a 20 20 20 20 65 72 72 6f  != 4} {.    erro
06e0: 72 20 22 44 61 74 61 62 61 73 65 20 63 6f 6e 74  r "Database cont
06f0: 65 6e 74 20 61 70 70 65 61 72 73 20 69 6e 63 6f  ent appears inco
0700: 72 72 65 63 74 22 0a 20 20 7d 0a 7d 0a 0a 23 2d  rrect".  }.}..#-
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
0760: 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20  fault-injection 
0770: 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61  while rolling ba
0780: 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
0790: 20 66 69 6c 65 20 77 69 74 68 20 61 20 0a 23 20   file with a .# 
07a0: 70 61 67 65 2d 73 69 7a 65 20 64 69 66 66 65 72  page-size differ
07b0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ent from the cur
07c0: 72 65 6e 74 20 76 61 6c 75 65 20 73 74 6f 72 65  rent value store
07d0: 64 20 6f 6e 20 70 61 67 65 20 31 20 6f 66 20 74  d on page 1 of t
07e0: 68 65 0a 23 20 64 61 74 61 62 61 73 65 20 66 69  he.# database fi
07f0: 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  le..#.do_test pa
0800: 67 65 72 66 61 75 6c 74 2d 32 2d 70 72 65 31 20  gerfault-2-pre1 
0810: 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d  {.  testvfs tv -
0820: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 66  default 1.  tv f
0830: 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74 76  ilter xSync.  tv
0840: 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a   script xSyncCb.
0850: 20 20 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b    proc xSyncCb {
0860: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
0870: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
0880: 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20   match *journal 
0890: 66 69 6c 65 6e 61 6d 65 5d 3d 3d 30 7d 20 66 61  filename]==0} fa
08a0: 75 6c 74 73 69 6d 5f 73 61 76 65 0a 20 20 7d 0a  ultsim_save.  }.
08b0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
08c0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
08d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
08e0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
08f0: 34 30 39 36 3b 0a 20 20 20 20 42 45 47 49 4e 3b  4096;.    BEGIN;
0900: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
0910: 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29  BLE abc(a, b, c)
0920: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
0930: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 27  NTO abc VALUES('
0940: 6f 27 2c 20 27 74 27 2c 20 27 74 27 29 3b 20 0a  o', 't', 't'); .
0950: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0960: 4f 20 61 62 63 20 56 41 4c 55 45 53 28 27 66 27  O abc VALUES('f'
0970: 2c 20 27 66 27 2c 20 27 73 27 29 3b 20 0a 20 20  , 'f', 's'); .  
0980: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0990: 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  abc SELECT * FRO
09a0: 4d 20 61 62 63 3b 20 2d 2d 20 34 0a 20 20 20 20  M abc; -- 4.    
09b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
09c0: 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  c SELECT * FROM 
09d0: 61 62 63 3b 20 2d 2d 20 38 0a 20 20 20 20 20 20  abc; -- 8.      
09e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
09f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62  SELECT * FROM ab
0a00: 63 3b 20 2d 2d 20 31 36 0a 20 20 20 20 20 20 49  c; -- 16.      I
0a10: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53  NSERT INTO abc S
0a20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
0a30: 3b 20 2d 2d 20 33 32 0a 20 20 20 20 20 20 49 4e  ; -- 32.      IN
0a40: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45  SERT INTO abc SE
0a50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b  LECT * FROM abc;
0a60: 20 2d 2d 20 36 34 0a 20 20 20 20 20 20 49 4e 53   -- 64.      INS
0a70: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c  ERT INTO abc SEL
0a80: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 20  ECT * FROM abc; 
0a90: 2d 2d 20 31 32 38 0a 20 20 20 20 20 20 49 4e 53  -- 128.      INS
0aa0: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c  ERT INTO abc SEL
0ab0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 20  ECT * FROM abc; 
0ac0: 2d 2d 20 32 35 36 0a 20 20 20 20 43 4f 4d 4d 49  -- 256.    COMMI
0ad0: 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61  T;.    PRAGMA pa
0ae0: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
0af0: 20 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a      VACUUM;.  }.
0b00: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20    db close.  tv 
0b10: 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 64 6f 5f 66  delete.} {}.do_f
0b20: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
0b30: 65 72 66 61 75 6c 74 2d 32 20 2d 70 72 65 70 20  erfault-2 -prep 
0b40: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
0b50: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
0b60: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
0b70: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0b80: 52 4f 4d 20 61 62 63 20 7d 0a 7d 20 2d 74 65 73  ROM abc }.} -tes
0b90: 74 20 7b 0a 20 20 73 65 74 20 61 6e 73 77 65 72  t {.  set answer
0ba0: 20 5b 73 70 6c 69 74 20 5b 73 74 72 69 6e 67 20   [split [string 
0bb0: 72 65 70 65 61 74 20 22 6f 74 74 66 66 73 22 20  repeat "ottffs" 
0bc0: 31 32 38 5d 20 22 22 5d 0a 20 20 66 61 75 6c 74  128] ""].  fault
0bd0: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
0be0: 5b 6c 69 73 74 20 30 20 24 61 6e 73 77 65 72 5d  [list 0 $answer]
0bf0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65  .  faultsim_inte
0c00: 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 73 65  grity_check.  se
0c10: 74 20 72 65 73 20 5b 64 62 20 65 76 61 6c 20 7b  t res [db eval {
0c20: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
0c30: 62 63 20 7d 5d 0a 20 20 69 66 20 7b 24 72 65 73  bc }].  if {$res
0c40: 20 21 3d 20 24 61 6e 73 77 65 72 7d 20 7b 20 65   != $answer} { e
0c50: 72 72 6f 72 20 22 44 61 74 61 62 61 73 65 20 63  rror "Database c
0c60: 6f 6e 74 65 6e 74 20 61 70 70 65 61 72 73 20 69  ontent appears i
0c70: 6e 63 6f 72 72 65 63 74 20 28 24 72 65 73 29 22  ncorrect ($res)"
0c80: 20 7d 0a 7d 20 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   }.} ..#--------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cd0: 2d 0a 23 20 54 65 73 74 20 66 61 75 6c 74 2d 69  -.# Test fault-i
0ce0: 6e 6a 65 63 74 69 6f 6e 20 77 68 69 6c 65 20 72  njection while r
0cf0: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 68 6f 74 2d  olling back hot-
0d00: 6a 6f 75 72 6e 61 6c 73 20 74 68 61 74 20 77 65  journals that we
0d10: 72 65 20 63 72 65 61 74 65 64 0a 23 20 61 73 20  re created.# as 
0d20: 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
0d30: 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
0d40: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
0d50: 72 66 61 75 6c 74 2d 33 2d 70 72 65 31 20 7b 0a  rfault-3-pre1 {.
0d60: 20 20 74 65 73 74 76 66 73 20 74 73 74 76 66 73    testvfs tstvfs
0d70: 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73   -default 1.  ts
0d80: 74 76 66 73 20 66 69 6c 74 65 72 20 78 44 65 6c  tvfs filter xDel
0d90: 65 74 65 0a 20 20 74 73 74 76 66 73 20 73 63 72  ete.  tstvfs scr
0da0: 69 70 74 20 78 44 65 6c 65 74 65 43 61 6c 6c 62  ipt xDeleteCallb
0db0: 61 63 6b 0a 0a 20 20 70 72 6f 63 20 78 44 65 6c  ack..  proc xDel
0dc0: 65 74 65 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74  eteCallback {met
0dd0: 68 6f 64 20 66 69 6c 65 20 61 72 67 73 7d 20 7b  hod file args} {
0de0: 0a 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b 66  .    set file [f
0df0: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a  ile tail $file].
0e00: 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67      if { [string
0e10: 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c   match *mj* $fil
0e20: 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f  e] } { faultsim_
0e30: 73 61 76 65 20 7d 0a 20 20 7d 0a 0a 20 20 66 61  save }.  }..  fa
0e40: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
0e50: 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
0e60: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
0e70: 72 69 6e 67 0a 0a 20 20 65 78 65 63 73 71 6c 20  ring..  execsql 
0e80: 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  {.    ATTACH 'te
0e90: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a  st.db2' AS aux;.
0ea0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
0eb0: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
0ec0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69  ;.    PRAGMA mai
0ed0: 6e 2e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  n.cache_size = 1
0ee0: 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75  0;.    PRAGMA au
0ef0: 78 2e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  x.cache_size = 1
0f00: 30 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  0;..    CREATE T
0f10: 41 42 4c 45 20 74 31 28 61 20 55 4e 49 51 55 45  ABLE t1(a UNIQUE
0f20: 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  , b UNIQUE);.   
0f30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
0f40: 78 2e 74 32 28 61 20 55 4e 49 51 55 45 2c 20 62  x.t2(a UNIQUE, b
0f50: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 49 4e   UNIQUE);.    IN
0f60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0f70: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 30 30  UES(a_string(200
0f80: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
0f90: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0fa0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
0fb0: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
0fc0: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74  ring(300) FROM t
0fd0: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
0fe0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
0ff0: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
1000: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74  ring(300) FROM t
1010: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
1020: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46  TO t2 SELECT * F
1030: 52 4f 4d 20 74 31 3b 0a 0a 20 20 20 20 42 45 47  ROM t1;..    BEG
1040: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
1050: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
1060: 61 5f 73 74 72 69 6e 67 28 32 30 31 29 2c 20 61  a_string(201), a
1070: 5f 73 74 72 69 6e 67 28 33 30 31 29 20 46 52 4f  _string(301) FRO
1080: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
1090: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
10a0: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29 2c  T a_string(202),
10b0: 20 61 5f 73 74 72 69 6e 67 28 33 30 32 29 20 46   a_string(302) F
10c0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e  ROM t1;.      IN
10d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
10e0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 33  ECT a_string(203
10f0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 33 29  ), a_string(303)
1100: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
1110: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1120: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
1130: 30 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  04), a_string(30
1140: 34 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  4) FROM t1;.    
1150: 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74    REPLACE INTO t
1160: 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  2 SELECT * FROM 
1170: 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  t1;.    COMMIT;.
1180: 20 20 7d 0a 0a 20 20 64 62 20 63 6c 6f 73 65 0a    }..  db close.
1190: 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a    tstvfs delete.
11a0: 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d  } {}.do_faultsim
11b0: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
11c0: 2d 33 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75  -3 -prep {.  fau
11d0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
11e0: 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79  d_reopen.} -body
11f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
1200: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
1210: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
1220: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
1230: 29 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 53  ) FROM t2;.    S
1240: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1250: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 2d 74  ROM t1;.  }.} -t
1260: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
1270: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
1280: 7b 34 20 34 7d 7d 20 7b 31 20 7b 75 6e 61 62 6c  {4 4}} {1 {unabl
1290: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
12a0: 73 65 3a 20 74 65 73 74 2e 64 62 32 7d 7d 0a 20  se: test.db2}}. 
12b0: 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72   faultsim_integr
12c0: 69 74 79 5f 63 68 65 63 6b 0a 20 20 63 61 74 63  ity_check.  catc
12d0: 68 73 71 6c 20 7b 20 41 54 54 41 43 48 20 27 74  hsql { ATTACH 't
12e0: 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 20  est.db2' AS aux 
12f0: 7d 0a 20 20 69 66 20 7b 5b 64 62 20 6f 6e 65 20  }.  if {[db one 
1300: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
1310: 29 20 46 52 4f 4d 20 74 31 20 7d 5d 20 21 3d 20  ) FROM t1 }] != 
1320: 34 0a 20 20 20 7c 7c 20 5b 64 62 20 6f 6e 65 20  4.   || [db one 
1330: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
1340: 29 20 46 52 4f 4d 20 74 32 20 7d 5d 20 21 3d 20  ) FROM t2 }] != 
1350: 34 0a 20 20 7d 20 7b 0a 20 20 20 20 65 72 72 6f  4.  } {.    erro
1360: 72 20 22 44 61 74 61 62 61 73 65 20 63 6f 6e 74  r "Database cont
1370: 65 6e 74 20 61 70 70 65 61 72 73 20 69 6e 63 6f  ent appears inco
1380: 72 72 65 63 74 22 0a 20 20 7d 0a 7d 0a 0a 23 2d  rrect".  }.}..#-
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
13e0: 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20  fault-injection 
13f0: 61 73 20 70 61 72 74 20 6f 66 20 61 20 76 61 6e  as part of a van
1400: 69 6c 6c 61 2c 20 6e 6f 2d 74 72 61 6e 73 61 63  illa, no-transac
1410: 74 69 6f 6e 2c 20 49 4e 53 45 52 54 0a 23 20 73  tion, INSERT.# s
1420: 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 64 6f 5f 66  tatement..#.do_f
1430: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
1440: 65 72 66 61 75 6c 74 2d 34 20 2d 70 72 65 70 20  erfault-4 -prep 
1450: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
1460: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d  ete_and_reopen.}
1470: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
1480: 71 6c 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45  ql { .    CREATE
1490: 20 54 41 42 4c 45 20 78 28 79 29 3b 0a 20 20 20   TABLE x(y);.   
14a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56   INSERT INTO x V
14b0: 41 4c 55 45 53 28 27 7a 27 29 3b 0a 20 20 20 20  ALUES('z');.    
14c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 3b  SELECT * FROM x;
14d0: 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  .  }.} -test {. 
14e0: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
14f0: 65 73 75 6c 74 20 7b 30 20 7a 7d 0a 20 20 66 61  esult {0 z}.  fa
1500: 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79  ultsim_integrity
1510: 5f 63 68 65 63 6b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  _check.}..#-----
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c  ----.# Test faul
1570: 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 61 73 20 70  t-injection as p
1580: 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 69 74 20  art of a commit 
1590: 77 68 65 6e 20 75 73 69 6e 67 20 6a 6f 75 72 6e  when using journ
15a0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e  al_mode=PERSIST.
15b0: 0a 23 20 54 68 72 65 65 20 64 69 66 66 65 72 65  .# Three differe
15c0: 6e 74 20 63 61 73 65 73 3a 0a 23 0a 23 20 20 20  nt cases:.#.#   
15d0: 20 70 61 67 65 72 66 61 75 6c 74 2d 35 2e 31 3a   pagerfault-5.1:
15e0: 20 57 69 74 68 20 6e 6f 20 6a 6f 75 72 6e 61 6c   With no journal
15f0: 5f 73 69 7a 65 5f 6c 69 6d 69 74 20 63 6f 6e 66  _size_limit conf
1600: 69 67 75 72 65 64 2e 0a 23 20 20 20 20 70 61 67  igured..#    pag
1610: 65 72 66 61 75 6c 74 2d 35 2e 32 3a 20 57 69 74  erfault-5.2: Wit
1620: 68 20 61 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  h a journal_size
1630: 5f 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65  _limit configure
1640: 64 2e 0a 23 20 20 20 20 70 61 67 65 72 66 61 75  d..#    pagerfau
1650: 6c 74 2d 35 2e 34 3a 20 4d 75 6c 74 69 2d 66 69  lt-5.4: Multi-fi
1660: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
1670: 4f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  One connection h
1680: 61 73 20 61 20 0a 23 20 20 20 20 20 20 20 20 20  as a .#         
1690: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
16a0: 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 20 6f 66  al_size_limit of
16b0: 20 30 2c 20 74 68 65 20 6f 74 68 65 72 20 68 61   0, the other ha
16c0: 73 20 6e 6f 20 6c 69 6d 69 74 2e 0a 23 0a 64 6f  s no limit..#.do
16d0: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
16e0: 2d 35 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c  -5-pre1 {.  faul
16f0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
1700: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
1710: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
1720: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
1730: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1740: 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55  t1(a UNIQUE, b U
1750: 4e 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45  NIQUE);.    INSE
1760: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1770: 53 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  S(a_string(200),
1780: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b   a_string(300));
1790: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
17a0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
17b0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
17c0: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(300) FROM t1;
17d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
17e0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
17f0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
1800: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(300) FROM t1;
1810: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
1820: 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d  save_and_close.}
1830: 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f   {}.do_faultsim_
1840: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
1850: 35 2e 31 20 2d 70 72 65 70 20 7b 0a 20 20 66 61  5.1 -prep {.  fa
1860: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
1870: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
1880: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
1890: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
18a0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
18b0: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 20  _mode = PERSIST 
18c0: 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  }.} -body {.  ex
18d0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
18e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
18f0: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
1900: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
1910: 74 31 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  t1 }.} -test {. 
1920: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
1930: 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20 66  esult {0 {}}.  f
1940: 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74  aultsim_integrit
1950: 79 5f 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75  y_check.}.do_fau
1960: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
1970: 66 61 75 6c 74 2d 35 2e 32 20 2d 70 72 65 70 20  fault-5.2 -prep 
1980: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
1990: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
19a0: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
19b0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
19c0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
19d0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
19e0: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
19f0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73  PRAGMA journal_s
1a00: 69 7a 65 5f 6c 69 6d 69 74 20 3d 20 32 30 34 38  ize_limit = 2048
1a10: 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  ;.  }.} -body {.
1a20: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
1a30: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
1a40: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
1a50: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
1a60: 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d 74 65 73 74  ROM t1 }.} -test
1a70: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65   {.  faultsim_te
1a80: 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d  st_result {0 {}}
1a90: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65  .  faultsim_inte
1aa0: 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 64 6f  grity_check.}.do
1ab0: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70  _faultsim_test p
1ac0: 61 67 65 72 66 61 75 6c 74 2d 35 2e 33 20 2d 66  agerfault-5.3 -f
1ad0: 61 75 6c 74 73 20 6f 6f 6d 2d 74 72 61 6e 73 69  aults oom-transi
1ae0: 65 6e 74 20 2d 70 72 65 70 20 7b 0a 20 20 66 61  ent -prep {.  fa
1af0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
1b00: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
1b10: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
1b20: 74 72 69 6e 67 0a 20 20 66 69 6c 65 20 64 65 6c  tring.  file del
1b30: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32  ete -force test2
1b40: 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75  .db test2.db-jou
1b50: 72 6e 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61  rnal test2.db-wa
1b60: 6c 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  l.  execsql { . 
1b70: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
1b80: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
1b90: 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  ;.    ATTACH 'te
1ba0: 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a  st2.db' AS aux;.
1bb0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 6a      PRAGMA aux.j
1bc0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
1bd0: 52 53 49 53 54 3b 0a 20 20 20 20 50 52 41 47 4d  RSIST;.    PRAGM
1be0: 41 20 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 73 69  A aux.journal_si
1bf0: 7a 65 5f 6c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ze_limit = 0;.  
1c00: 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  }.} -body {.  ex
1c10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
1c20: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
1c30: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
1c40: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
1c50: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
1c60: 20 74 31 3b 0a 20 20 20 20 20 20 43 52 45 41 54   t1;.      CREAT
1c70: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 20 41  E TABLE aux.t2 A
1c80: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
1c90: 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  t1;.    COMMIT;.
1ca0: 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20    }.} -test {.  
1cb0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
1cc0: 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 0a 20 20 63  sult {0 {}}..  c
1cd0: 61 74 63 68 73 71 6c 20 7b 20 43 4f 4d 4d 49 54  atchsql { COMMIT
1ce0: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
1cf0: 52 4f 4c 4c 42 41 43 4b 20 7d 0a 0a 20 20 66 61  ROLLBACK }..  fa
1d00: 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79  ultsim_integrity
1d10: 5f 63 68 65 63 6b 0a 20 20 73 65 74 20 72 65 73  _check.  set res
1d20: 20 22 22 0a 20 20 73 65 74 20 72 63 20 5b 63 61   "".  set rc [ca
1d30: 74 63 68 20 7b 20 73 65 74 20 72 65 73 20 5b 64  tch { set res [d
1d40: 62 20 6f 6e 65 20 7b 20 50 52 41 47 4d 41 20 61  b one { PRAGMA a
1d50: 75 78 2e 69 6e 74 65 67 72 69 74 79 5f 63 68 65  ux.integrity_che
1d60: 63 6b 20 7d 5d 20 7d 5d 0a 20 20 69 66 20 7b 24  ck }] }].  if {$
1d70: 72 63 21 3d 30 20 7c 7c 20 24 72 65 73 20 21 3d  rc!=0 || $res !=
1d80: 20 22 6f 6b 22 7d 20 7b 65 72 72 6f 72 20 22 69   "ok"} {error "i
1d90: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 70  ntegrity-check p
1da0: 72 6f 62 6c 65 6d 3a 24 72 63 20 24 72 65 73 22  roblem:$rc $res"
1db0: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
1dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1e00: 23 20 54 65 73 74 20 66 61 75 6c 74 2d 69 6e 6a  # Test fault-inj
1e10: 65 63 74 69 6f 6e 20 61 73 20 70 61 72 74 20 6f  ection as part o
1e20: 66 20 61 20 63 6f 6d 6d 69 74 20 77 68 65 6e 20  f a commit when 
1e30: 75 73 69 6e 67 20 0a 23 20 6a 6f 75 72 6e 61 6c  using .# journal
1e40: 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 2e 0a  _mode=TRUNCATE..
1e50: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66  #.do_test pagerf
1e60: 61 75 6c 74 2d 36 2d 70 72 65 31 20 7b 0a 20 20  ault-6-pre1 {.  
1e70: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
1e80: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
1e90: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
1ea0: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
1eb0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
1ec0: 42 4c 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c  BLE t1(a UNIQUE,
1ed0: 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   b UNIQUE);.    
1ee0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1ef0: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32  ALUES(a_string(2
1f00: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
1f10: 30 29 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74  0));.  }.  fault
1f20: 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f  sim_save_and_clo
1f30: 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 66 61 75 6c  se.} {}..do_faul
1f40: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
1f50: 61 75 6c 74 2d 36 2e 31 20 2d 70 72 65 70 20 7b  ault-6.1 -prep {
1f60: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
1f70: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
1f80: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
1f90: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
1fa0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
1fb0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55  urnal_mode = TRU
1fc0: 4e 43 41 54 45 20 7d 0a 7d 20 2d 62 6f 64 79 20  NCATE }.} -body 
1fd0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
1fe0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1ff0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
2000: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
2010: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78 65   FROM t1 }.  exe
2020: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
2030: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
2040: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
2050: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74  ring(300) FROM t
2060: 31 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20  1 }.} -test {.  
2070: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
2080: 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20 66 61  sult {0 {}}.  fa
2090: 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79  ultsim_integrity
20a0: 5f 63 68 65 63 6b 0a 7d 0a 0a 23 20 54 68 65 20  _check.}..# The 
20b0: 75 6e 69 78 20 76 66 73 20 78 41 63 63 65 73 73  unix vfs xAccess
20c0: 28 29 20 6d 65 74 68 6f 64 20 63 6f 6e 73 69 64  () method consid
20d0: 65 72 73 20 61 20 66 69 6c 65 20 7a 65 72 6f 20  ers a file zero 
20e0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 74 6f  bytes in size to
20f0: 0a 23 20 22 6e 6f 74 20 65 78 69 73 74 22 2e 20  .# "not exist". 
2100: 54 68 69 73 20 70 72 6f 63 20 6f 76 65 72 72 69  This proc overri
2110: 64 65 73 20 74 68 61 74 20 62 65 68 61 76 69 6f  des that behavio
2120: 75 72 20 73 6f 20 74 68 61 74 20 61 20 7a 65 72  ur so that a zer
2130: 6f 20 6c 65 6e 67 74 68 0a 23 20 66 69 6c 65 20  o length.# file 
2140: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
2150: 20 65 78 69 73 74 2e 0a 23 0a 70 72 6f 63 20 78   exist..#.proc x
2160: 41 63 63 65 73 73 20 7b 6d 65 74 68 6f 64 20 66  Access {method f
2170: 69 6c 65 6e 61 6d 65 20 6f 70 20 61 72 67 73 7d  ilename op args}
2180: 20 7b 0a 20 20 69 66 20 7b 24 6f 70 20 21 3d 20   {.  if {$op != 
2190: 22 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  "SQLITE_ACCESS_E
21a0: 58 49 53 54 53 22 7d 20 7b 20 72 65 74 75 72 6e  XISTS"} { return
21b0: 20 22 22 20 7d 0a 20 20 72 65 74 75 72 6e 20 5b   "" }.  return [
21c0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
21d0: 65 6e 61 6d 65 5d 0a 7d 0a 64 6f 5f 66 61 75 6c  ename].}.do_faul
21e0: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
21f0: 61 75 6c 74 2d 36 2e 32 20 2d 66 61 75 6c 74 73  ault-6.2 -faults
2200: 20 63 61 6e 74 6f 70 65 6e 2d 2a 20 2d 70 72 65   cantopen-* -pre
2210: 70 20 7b 0a 20 20 73 68 6d 66 61 75 6c 74 20 66  p {.  shmfault f
2220: 69 6c 74 65 72 20 78 41 63 63 65 73 73 0a 20 20  ilter xAccess.  
2230: 73 68 6d 66 61 75 6c 74 20 73 63 72 69 70 74 20  shmfault script 
2240: 78 41 63 63 65 73 73 0a 0a 20 20 66 61 75 6c 74  xAccess..  fault
2250: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
2260: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
2270: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
2280: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50  ng.  execsql { P
2290: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
22a0: 64 65 20 3d 20 54 52 55 4e 43 41 54 45 20 7d 0a  de = TRUNCATE }.
22b0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
22c0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
22d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
22e0: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
22f0: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31  ing(300) FROM t1
2300: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   }.  execsql { I
2310: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2320: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
2330: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
2340: 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 2d 74  ) FROM t1 }.} -t
2350: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
2360: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
2370: 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69  {}}.  faultsim_i
2380: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d  ntegrity_check.}
2390: 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
23a0: 67 20 77 61 73 20 61 6e 20 61 74 74 65 6d 70 74  g was an attempt
23b0: 20 74 6f 20 67 65 74 20 61 20 62 69 74 76 65 63   to get a bitvec
23c0: 20 6d 61 6c 6c 6f 63 20 74 6f 20 66 61 69 6c 2e   malloc to fail.
23d0: 20 44 69 64 6e 27 74 20 77 6f 72 6b 2e 0a 23 0a   Didn't work..#.
23e0: 23 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66  # do_test pagerf
23f0: 61 75 6c 74 2d 36 2d 70 72 65 31 20 7b 0a 23 20  ault-6-pre1 {.# 
2400: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
2410: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 23 20 20  e_and_reopen.#  
2420: 20 65 78 65 63 73 71 6c 20 7b 0a 23 20 20 20 20   execsql {.#    
2430: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2440: 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
2450: 20 79 29 29 3b 0a 23 20 20 20 20 20 49 4e 53 45   y));.#     INSE
2460: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2470: 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  S(1, randomblob(
2480: 31 35 30 31 29 29 3b 0a 23 20 20 20 20 20 49 4e  1501));.#     IN
2490: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
24a0: 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(2, randomblo
24b0: 62 28 31 35 30 32 29 29 3b 0a 23 20 20 20 20 20  b(1502));.#     
24c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
24d0: 41 4c 55 45 53 28 33 2c 20 72 61 6e 64 6f 6d 62  ALUES(3, randomb
24e0: 6c 6f 62 28 31 35 30 33 29 29 3b 0a 23 20 20 20  lob(1503));.#   
24f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2500: 20 56 41 4c 55 45 53 28 34 2c 20 72 61 6e 64 6f   VALUES(4, rando
2510: 6d 62 6c 6f 62 28 31 35 30 34 29 29 3b 0a 23 20  mblob(1504));.# 
2520: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2530: 74 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45  t1 .#       SELE
2540: 43 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  CT x, randomblob
2550: 28 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43  (1500+oid+(SELEC
2560: 54 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20  T max(oid) FROM 
2570: 74 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20  t1)) FROM t1;.# 
2580: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2590: 74 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45  t1 .#       SELE
25a0: 43 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  CT x, randomblob
25b0: 28 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43  (1500+oid+(SELEC
25c0: 54 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20  T max(oid) FROM 
25d0: 74 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20  t1)) FROM t1;.# 
25e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
25f0: 74 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45  t1 .#       SELE
2600: 43 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  CT x, randomblob
2610: 28 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43  (1500+oid+(SELEC
2620: 54 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20  T max(oid) FROM 
2630: 74 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20  t1)) FROM t1;.# 
2640: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2650: 74 31 20 0a 23 20 20 20 20 20 20 20 53 45 4c 45  t1 .#       SELE
2660: 43 54 20 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  CT x, randomblob
2670: 28 31 35 30 30 2b 6f 69 64 2b 28 53 45 4c 45 43  (1500+oid+(SELEC
2680: 54 20 6d 61 78 28 6f 69 64 29 20 46 52 4f 4d 20  T max(oid) FROM 
2690: 74 31 29 29 20 46 52 4f 4d 20 74 31 3b 0a 23 20  t1)) FROM t1;.# 
26a0: 20 20 7d 0a 23 20 20 20 66 61 75 6c 74 73 69 6d    }.#   faultsim
26b0: 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a  _save_and_close.
26c0: 23 20 7d 20 7b 7d 0a 23 20 64 6f 5f 66 61 75 6c  # } {}.# do_faul
26d0: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
26e0: 61 75 6c 74 2d 36 20 2d 70 72 65 70 20 7b 0a 23  ault-6 -prep {.#
26f0: 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74     faultsim_rest
2700: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 23  ore_and_reopen.#
2710: 20 7d 20 2d 62 6f 64 79 20 7b 0a 23 20 20 20 65   } -body {.#   e
2720: 78 65 63 73 71 6c 20 7b 20 0a 23 20 20 20 20 20  xecsql { .#     
2730: 42 45 47 49 4e 3b 0a 23 20 20 20 20 20 20 20 55  BEGIN;.#       U
2740: 50 44 41 54 45 20 74 31 20 53 45 54 20 78 3d 78  PDATE t1 SET x=x
2750: 2b 34 20 57 48 45 52 45 20 78 3d 31 3b 0a 23 20  +4 WHERE x=1;.# 
2760: 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
2770: 6f 6e 65 3b 0a 23 20 20 20 20 20 20 20 20 20 55  one;.#         U
2780: 50 44 41 54 45 20 74 31 20 53 45 54 20 78 3d 78  PDATE t1 SET x=x
2790: 2b 34 20 57 48 45 52 45 20 78 3d 32 3b 0a 23 20  +4 WHERE x=2;.# 
27a0: 20 20 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e          SAVEPOIN
27b0: 54 20 74 68 72 65 65 3b 0a 23 20 20 20 20 20 20  T three;.#      
27c0: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
27d0: 45 54 20 78 3d 78 2b 34 20 57 48 45 52 45 20 78  ET x=x+4 WHERE x
27e0: 3d 33 3b 0a 23 20 20 20 20 20 20 20 20 20 20 20  =3;.#           
27f0: 53 41 56 45 50 4f 49 4e 54 20 66 6f 75 72 3b 0a  SAVEPOINT four;.
2800: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 55 50  #             UP
2810: 44 41 54 45 20 74 31 20 53 45 54 20 78 3d 78 2b  DATE t1 SET x=x+
2820: 34 20 57 48 45 52 45 20 78 3d 34 3b 0a 23 20 20  4 WHERE x=4;.#  
2830: 20 20 20 20 20 20 20 52 45 4c 45 41 53 45 20 74         RELEASE t
2840: 68 72 65 65 3b 0a 23 20 20 20 20 20 43 4f 4d 4d  hree;.#     COMM
2850: 49 54 3b 0a 23 20 20 20 20 20 53 45 4c 45 43 54  IT;.#     SELECT
2860: 20 44 49 53 54 49 4e 43 54 20 78 20 46 52 4f 4d   DISTINCT x FROM
2870: 20 74 31 3b 0a 23 20 20 20 7d 0a 23 20 7d 20 2d   t1;.#   }.# } -
2880: 74 65 73 74 20 7b 0a 23 20 20 20 66 61 75 6c 74  test {.#   fault
2890: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
28a0: 7b 30 20 7b 35 20 36 20 37 20 38 7d 7d 0a 23 20  {0 {5 6 7 8}}.# 
28b0: 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67    faultsim_integ
28c0: 72 69 74 79 5f 63 68 65 63 6b 0a 23 20 7d 0a 23  rity_check.# }.#
28d0: 0a 0a 23 20 54 68 69 73 20 69 73 20 64 65 73 69  ..# This is desi
28e0: 67 6e 65 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20  gned to provoke 
28f0: 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69  a special case i
2900: 6e 20 74 68 65 20 70 61 67 65 72 20 63 6f 64 65  n the pager code
2910: 3a 0a 23 0a 23 20 49 66 20 61 6e 20 65 72 72 6f  :.#.# If an erro
2920: 72 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 2c  r (specifically,
2930: 20 61 20 46 55 4c 4c 20 6f 72 20 49 4f 45 52 52   a FULL or IOERR
2940: 20 65 72 72 6f 72 29 20 6f 63 63 75 72 73 20 77   error) occurs w
2950: 68 69 6c 65 20 77 72 69 74 69 6e 67 20 61 0a 23  hile writing a.#
2960: 20 64 69 72 74 79 20 70 61 67 65 20 74 6f 20 74   dirty page to t
2970: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
2980: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
2990: 75 70 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 70  up memory, the p
29a0: 61 67 65 72 20 65 6e 74 65 72 73 0a 23 20 74 68  ager enters.# th
29b0: 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e  e "error state".
29c0: 20 41 6e 20 49 4f 20 65 72 72 6f 72 20 63 61 75   An IO error cau
29d0: 73 65 73 20 53 51 4c 69 74 65 20 74 6f 20 72 6f  ses SQLite to ro
29e0: 6c 6c 20 62 61 63 6b 20 74 68 65 20 63 75 72 72  ll back the curr
29f0: 65 6e 74 0a 23 20 74 72 61 6e 73 61 63 74 69 6f  ent.# transactio
2a00: 6e 20 28 65 78 69 74 69 6e 67 20 74 68 65 20 65  n (exiting the e
2a10: 72 72 6f 72 20 73 74 61 74 65 29 2e 20 41 20 46  rror state). A F
2a20: 55 4c 4c 20 65 72 72 6f 72 2c 20 68 6f 77 65 76  ULL error, howev
2a30: 65 72 2c 20 6d 61 79 20 6f 6e 6c 79 0a 23 20 72  er, may only.# r
2a40: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63 75 72 72  ollback the curr
2a50: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23  ent statement..#
2a60: 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  .# This block te
2a70: 73 74 73 20 74 68 61 74 20 6e 6f 74 68 69 6e 67  sts that nothing
2a80: 20 67 6f 65 73 20 77 72 6f 6e 67 20 69 66 20 61   goes wrong if a
2a90: 20 46 55 4c 4c 20 65 72 72 6f 72 20 6f 63 63 75   FULL error occu
2aa0: 72 73 20 77 68 69 6c 65 0a 23 20 77 72 69 74 69  rs while.# writi
2ab0: 6e 67 20 61 20 64 69 72 74 79 20 70 61 67 65 20  ng a dirty page 
2ac0: 6f 75 74 20 74 6f 20 66 72 65 65 20 6d 65 6d 6f  out to free memo
2ad0: 72 79 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ry from within a
2ae0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
2af0: 68 61 73 0a 23 20 6f 70 65 6e 65 64 20 61 20 73  has.# opened a s
2b00: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
2b10: 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  tion..#.do_test 
2b20: 70 61 67 65 72 66 61 75 6c 74 2d 37 2d 70 72 65  pagerfault-7-pre
2b30: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
2b40: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
2b50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2b60: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
2b70: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
2b80: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
2b90: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
2ba0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
2bb0: 45 53 28 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62  ES(NULL, randomb
2bc0: 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20  lob(1500));.    
2bd0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
2be0: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 72 61   VALUES(NULL, ra
2bf0: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b  ndomblob(1500));
2c00: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2c10: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 4e 55 4c  TO t2 SELECT NUL
2c20: 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  L, randomblob(15
2c30: 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 20 20 20  00) FROM t2;    
2c40: 2d 2d 20 20 34 0a 20 20 20 20 20 20 49 4e 53 45  --  4.      INSE
2c50: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
2c60: 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c  T NULL, randombl
2c70: 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 32  ob(1500) FROM t2
2c80: 3b 20 20 20 20 2d 2d 20 20 38 0a 20 20 20 20 20  ;    --  8.     
2c90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
2ca0: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e  SELECT NULL, ran
2cb0: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
2cc0: 4f 4d 20 74 32 3b 20 20 20 20 2d 2d 20 31 36 0a  OM t2;    -- 16.
2cd0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2ce0: 4f 20 74 32 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t2 SELECT NULL
2cf0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
2d00: 30 29 20 46 52 4f 4d 20 74 32 3b 20 20 20 20 2d  0) FROM t2;    -
2d10: 2d 20 33 32 0a 20 20 20 20 20 20 49 4e 53 45 52  - 32.      INSER
2d20: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
2d30: 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f   NULL, randomblo
2d40: 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 32 3b  b(1500) FROM t2;
2d50: 20 20 20 20 2d 2d 20 36 34 0a 20 20 20 20 43 4f      -- 64.    CO
2d60: 4d 4d 49 54 3b 0a 20 20 20 20 43 52 45 41 54 45  MMIT;.    CREATE
2d70: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
2d80: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
2d90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2da0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
2db0: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
2dc0: 20 74 32 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74   t2;.  }.  fault
2dd0: 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f  sim_save_and_clo
2de0: 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74  se.} {}.do_fault
2df0: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
2e00: 75 6c 74 2d 37 20 2d 70 72 65 70 20 7b 0a 20 20  ult-7 -prep {.  
2e10: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
2e20: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
2e30: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
2e40: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
2e50: 20 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   10;.    BEGIN;.
2e60: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
2e70: 53 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d 62 6c  SET b = randombl
2e80: 6f 62 28 31 35 30 30 29 3b 0a 20 20 7d 0a 7d 20  ob(1500);.  }.} 
2e90: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
2ea0: 6c 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  l { UPDATE t1 SE
2eb0: 54 20 61 20 3d 20 36 35 2c 20 62 20 3d 20 72 61  T a = 65, b = ra
2ec0: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 57  ndomblob(1500) W
2ed0: 48 45 52 45 20 28 61 2b 31 29 3e 32 30 30 20 7d  HERE (a+1)>200 }
2ee0: 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
2ef0: 54 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61  T.} -test {.  fa
2f00: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
2f10: 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c  lt {0 {}}.  faul
2f20: 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63  tsim_integrity_c
2f30: 68 65 63 6b 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  heck.}..do_test 
2f40: 70 61 67 65 72 66 61 75 6c 74 2d 38 2d 70 72 65  pagerfault-8-pre
2f50: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
2f60: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
2f70: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2f80: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
2f90: 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52 45  uum = 1;.    CRE
2fa0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
2fb0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2fc0: 45 59 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49  EY, b);.    BEGI
2fd0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
2fe0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e  INTO t1 VALUES(N
2ff0: 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  ULL, randomblob(
3000: 31 35 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e  1500));.      IN
3010: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3020: 55 45 53 28 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d  UES(NULL, random
3030: 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20  blob(1500));.   
3040: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3050: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72  1 SELECT NULL, r
3060: 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
3070: 46 52 4f 4d 20 74 31 3b 20 20 20 20 2d 2d 20 20  FROM t1;    --  
3080: 34 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  4.      INSERT I
3090: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
30a0: 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  LL, randomblob(1
30b0: 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  500) FROM t1;   
30c0: 20 2d 2d 20 20 38 0a 20 20 20 20 20 20 49 4e 53   --  8.      INS
30d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
30e0: 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62  CT NULL, randomb
30f0: 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
3100: 31 3b 20 20 20 20 2d 2d 20 31 36 0a 20 20 20 20  1;    -- 16.    
3110: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3120: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61   SELECT NULL, ra
3130: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
3140: 52 4f 4d 20 74 31 3b 20 20 20 20 2d 2d 20 33 32  ROM t1;    -- 32
3150: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3160: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
3170: 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  L, randomblob(15
3180: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
3190: 2d 2d 20 36 34 0a 20 20 20 20 43 4f 4d 4d 49 54  -- 64.    COMMIT
31a0: 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  ;.  }.  faultsim
31b0: 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a  _save_and_close.
31c0: 20 20 73 65 74 20 66 69 6c 65 73 69 7a 65 20 5b    set filesize [
31d0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
31e0: 62 5d 0a 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 7d  b].  set {} {}.}
31f0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65   {}.do_test page
3200: 72 66 61 75 6c 74 2d 38 2d 70 72 65 32 20 7b 0a  rfault-8-pre2 {.
3210: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
3220: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
3230: 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45  execsql { DELETE
3240: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
3250: 3e 33 32 20 7d 0a 20 20 65 78 70 72 20 7b 5b 66  >32 }.  expr {[f
3260: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
3270: 5d 20 3c 20 24 66 69 6c 65 73 69 7a 65 7d 0a 7d  ] < $filesize}.}
3280: 20 7b 31 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d   {1}.do_faultsim
3290: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
32a0: 2d 38 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75  -8 -prep {.  fau
32b0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
32c0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
32d0: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
32e0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
32f0: 20 74 31 20 57 48 45 52 45 20 61 3e 33 32 3b 0a   t1 WHERE a>32;.
3300: 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20    }.} -body {.  
3310: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  execsql COMMIT.}
3320: 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74   -test {.  fault
3330: 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20  sim_test_result 
3340: 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69  {0 {}}.  faultsi
3350: 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  m_integrity_chec
3360: 6b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  k.}..#----------
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 0a  ---------------.
33b0: 23 20 54 68 69 73 20 74 65 73 74 20 63 61 73 65  # This test case
33c0: 20 69 73 20 73 70 65 63 69 61 6c 6c 79 20 64 65   is specially de
33d0: 73 69 67 6e 65 64 20 73 6f 20 74 68 61 74 20 64  signed so that d
33e0: 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
33f0: 74 20 0a 23 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  t .# rollback, a
3400: 20 6e 65 77 20 63 61 63 68 65 20 65 6e 74 72 79   new cache entry
3410: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
3420: 65 64 20 28 73 65 65 20 63 6f 6d 6d 65 6e 74 73  ed (see comments
3430: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 23 20 74   surrounding.# t
3440: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
3450: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29  e3PagerAcquire()
3460: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
3470: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
3480: 70 61 67 65 28 29 0a 23 20 66 6f 72 20 64 65 74  page().# for det
3490: 61 69 6c 73 29 2e 20 54 65 73 74 20 74 68 65 20  ails). Test the 
34a0: 65 66 66 65 63 74 73 20 6f 66 20 69 6e 6a 65 63  effects of injec
34b0: 74 69 6e 67 20 61 6e 20 4f 4f 4d 20 61 74 20 74  ting an OOM at t
34c0: 68 69 73 20 70 6f 69 6e 74 2e 0a 23 0a 64 6f 5f  his point..#.do_
34d0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
34e0: 39 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74  9-pre1 {.  fault
34f0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
3500: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3510: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
3520: 6f 5f 76 61 63 75 75 6d 20 3d 20 69 6e 63 72 65  o_vacuum = incre
3530: 6d 65 6e 74 61 6c 3b 0a 20 20 20 20 43 52 45 41  mental;.    CREA
3540: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
3550: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3560: 20 74 32 28 79 29 3b 0a 20 20 20 20 43 52 45 41   t2(y);.    CREA
3570: 54 45 20 54 41 42 4c 45 20 74 33 28 7a 29 3b 0a  TE TABLE t3(z);.
3580: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3590: 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t1 VALUES(rando
35a0: 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20  mblob(900));.   
35b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
35c0: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
35d0: 62 28 39 30 30 29 29 3b 0a 20 20 20 20 44 45 4c  b(900));.    DEL
35e0: 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  ETE FROM t1;.  }
35f0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  .  faultsim_save
3600: 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a  _and_close.} {}.
3610: 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  do_faultsim_test
3620: 20 70 61 67 65 72 66 61 75 6c 74 2d 39 2e 31 20   pagerfault-9.1 
3630: 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74 73  -prep {.  faults
3640: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
3650: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3660: 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  { .    BEGIN;.  
3670: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3680: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
3690: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
36a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
36b0: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
36c0: 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 20 20  ob(900));.      
36d0: 44 52 4f 50 20 54 41 42 4c 45 20 74 33 3b 0a 20  DROP TABLE t3;. 
36e0: 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20       DROP TABLE 
36f0: 74 32 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f  t2;.      SAVEPO
3700: 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20 20  INT abc;.       
3710: 20 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e   PRAGMA incremen
3720: 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 7d 0a  tal_vacuum;.  }.
3730: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
3740: 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41  sql {.    ROLLBA
3750: 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43  CK TO abc;.    C
3760: 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d  OMMIT;.    PRAGM
3770: 41 20 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74  A freelist_count
3780: 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  .  }.} -test {. 
3790: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
37a0: 65 73 75 6c 74 20 7b 30 20 32 7d 0a 20 20 66 61  esult {0 2}.  fa
37b0: 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79  ultsim_integrity
37c0: 5f 63 68 65 63 6b 0a 0a 20 20 73 65 74 20 73 6c  _check..  set sl
37d0: 20 5b 64 62 20 6f 6e 65 20 7b 20 53 45 4c 45 43   [db one { SELEC
37e0: 54 20 43 4f 41 4c 45 53 43 45 28 73 75 6d 28 6c  T COALESCE(sum(l
37f0: 65 6e 67 74 68 28 78 29 29 2c 20 27 6e 75 6c 6c  ength(x)), 'null
3800: 27 29 20 46 52 4f 4d 20 74 31 20 7d 5d 0a 20 20  ') FROM t1 }].  
3810: 69 66 20 7b 24 73 6c 21 3d 22 6e 75 6c 6c 22 20  if {$sl!="null" 
3820: 26 26 20 24 73 6c 21 3d 31 38 30 30 7d 20 7b 20  && $sl!=1800} { 
3830: 0a 20 20 20 20 65 72 72 6f 72 20 22 43 6f 6e 74  .    error "Cont
3840: 65 6e 74 20 6c 6f 6f 6b 73 20 6e 6f 20 67 6f 6f  ent looks no goo
3850: 64 2e 2e 2e 20 28 24 73 6c 29 22 20 0a 20 20 7d  d... ($sl)" .  }
3860: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
38b0: 20 54 65 73 74 20 66 61 75 6c 74 20 69 6e 6a 65   Test fault inje
38c0: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 74 65 6d  ction with a tem
38d0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
38e0: 66 69 6c 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20  file..#.foreach 
38f0: 76 20 7b 61 20 62 7d 20 7b 0a 20 20 64 6f 5f 66  v {a b} {.  do_f
3900: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
3910: 65 72 66 61 75 6c 74 2d 31 30 24 76 20 2d 70 72  erfault-10$v -pr
3920: 65 70 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ep {.    sqlite3
3930: 20 64 62 20 22 22 0a 20 20 20 20 64 62 20 66 75   db "".    db fu
3940: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
3950: 72 69 6e 67 3b 0a 20 20 20 20 65 78 65 63 73 71  ring;.    execsq
3960: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
3970: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
3980: 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  ;.      BEGIN;. 
3990: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
39a0: 42 4c 45 20 78 78 28 61 2c 20 62 2c 20 55 4e 49  BLE xx(a, b, UNI
39b0: 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20  QUE(a, b));.    
39c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
39d0: 78 78 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  xx VALUES(a_stri
39e0: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
39f0: 67 28 32 30 30 29 29 3b 0a 20 20 20 20 20 20 20  g(200));.       
3a00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 78 20   INSERT INTO xx 
3a10: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
3a20: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32  200), a_string(2
3a30: 30 30 29 20 46 52 4f 4d 20 78 78 3b 0a 20 20 20  00) FROM xx;.   
3a40: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3a50: 20 78 78 20 53 45 4c 45 43 54 20 61 5f 73 74 72   xx SELECT a_str
3a60: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
3a70: 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 78 78 3b  ng(200) FROM xx;
3a80: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
3a90: 49 4e 54 4f 20 78 78 20 53 45 4c 45 43 54 20 61  INTO xx SELECT a
3aa0: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
3ab0: 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d  string(200) FROM
3ac0: 20 78 78 3b 0a 20 20 20 20 20 20 20 20 49 4e 53   xx;.        INS
3ad0: 45 52 54 20 49 4e 54 4f 20 78 78 20 53 45 4c 45  ERT INTO xx SELE
3ae0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
3af0: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20  , a_string(200) 
3b00: 46 52 4f 4d 20 78 78 3b 0a 20 20 20 20 20 20 43  FROM xx;.      C
3b10: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  OMMIT;.    }.  }
3b20: 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 65 78 65   -body {.    exe
3b30: 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 78 78  csql { UPDATE xx
3b40: 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e   SET a = a_strin
3b50: 67 28 33 30 30 29 20 7d 0a 20 20 7d 20 2d 74 65  g(300) }.  } -te
3b60: 73 74 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  st {.    faultsi
3b70: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
3b80: 20 7b 7d 7d 0a 20 20 20 20 69 66 20 7b 24 3a 3a   {}}.    if {$::
3b90: 76 20 3d 3d 20 22 62 22 7d 20 7b 20 65 78 65 63  v == "b"} { exec
3ba0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
3bb0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e  rnal_mode = TRUN
3bc0: 43 41 54 45 20 7d 20 7d 0a 20 20 20 20 66 61 75  CATE } }.    fau
3bd0: 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f  ltsim_integrity_
3be0: 63 68 65 63 6b 0a 20 20 20 20 66 61 75 6c 74 73  check.    faults
3bf0: 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65  im_integrity_che
3c00: 63 6b 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  ck.  }.}..#-----
3c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c50: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c  ----.# Test faul
3c60: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 77 69 74 68  t injection with
3c70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
3c80: 65 70 6f 69 6e 74 73 20 28 73 61 76 65 70 6f 69  epoints (savepoi
3c90: 6e 74 73 20 63 72 65 61 74 65 64 0a 23 20 77 68  nts created.# wh
3ca0: 65 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 63  en a SAVEPOINT c
3cb0: 6f 6d 6d 61 6e 64 20 69 73 20 65 78 65 63 75 74  ommand is execut
3cc0: 65 64 20 6f 75 74 73 69 64 65 20 6f 66 20 61 6e  ed outside of an
3cd0: 79 20 6f 74 68 65 72 20 73 61 76 65 70 6f 69 6e  y other savepoin
3ce0: 74 0a 23 20 6f 72 20 74 72 61 6e 73 61 63 74 69  t.# or transacti
3cf0: 6f 6e 20 63 6f 6e 74 65 78 74 29 2e 0a 23 0a 64  on context)..#.d
3d00: 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c  o_test pagerfaul
3d10: 74 2d 39 2d 70 72 65 31 20 7b 0a 20 20 66 61 75  t-9-pre1 {.  fau
3d20: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
3d30: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
3d40: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
3d50: 69 6e 67 3b 0a 20 20 65 78 65 63 73 71 6c 20 7b  ing;.  execsql {
3d60: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
3d70: 5f 76 61 63 75 75 6d 20 3d 20 6f 6e 3b 0a 20 20  _vacuum = on;.  
3d80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3d90: 31 28 78 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  1(x UNIQUE);.   
3da0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
3db0: 28 79 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20  (y UNIQUE);.    
3dc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
3dd0: 7a 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 42  z UNIQUE);.    B
3de0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
3df0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3e00: 53 28 61 5f 73 74 72 69 6e 67 28 32 30 32 29 29  S(a_string(202))
3e10: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3e20: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f  NTO t2 VALUES(a_
3e30: 73 74 72 69 6e 67 28 32 30 33 29 29 3b 0a 20 20  string(203));.  
3e40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3e50: 74 33 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t3 VALUES(a_stri
3e60: 6e 67 28 32 30 34 29 29 3b 0a 20 20 20 20 20 20  ng(204));.      
3e70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
3e80: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
3e90: 30 32 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  02) FROM t1;.   
3ea0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3eb0: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
3ec0: 67 28 32 30 33 29 20 46 52 4f 4d 20 74 31 3b 0a  g(203) FROM t1;.
3ed0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3ee0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
3ef0: 72 69 6e 67 28 32 30 34 29 20 46 52 4f 4d 20 74  ring(204) FROM t
3f00: 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  1;.      INSERT 
3f10: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
3f20: 5f 73 74 72 69 6e 67 28 32 30 35 29 20 46 52 4f  _string(205) FRO
3f30: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
3f40: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
3f50: 54 20 61 5f 73 74 72 69 6e 67 28 6c 65 6e 67 74  T a_string(lengt
3f60: 68 28 78 29 29 20 46 52 4f 4d 20 74 31 3b 0a 20  h(x)) FROM t1;. 
3f70: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3f80: 20 74 33 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t3 SELECT a_str
3f90: 69 6e 67 28 6c 65 6e 67 74 68 28 78 29 29 20 46  ing(length(x)) F
3fa0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d  ROM t1;.    COMM
3fb0: 49 54 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  IT;.  }.  faults
3fc0: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
3fd0: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
3fe0: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
3ff0: 6c 74 2d 31 31 20 2d 70 72 65 70 20 7b 0a 20 20  lt-11 -prep {.  
4000: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
4010: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
4020: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63  ecsql { PRAGMA c
4030: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d  ache_size = 10 }
4040: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65  .} -body {.  exe
4050: 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50  csql {.    SAVEP
4060: 4f 49 4e 54 20 74 72 61 6e 73 3b 0a 20 20 20 20  OINT trans;.    
4070: 20 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20    UPDATE t2 SET 
4080: 79 20 3d 20 79 7c 7c 27 32 27 3b 0a 20 20 20 20  y = y||'2';.    
4090: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
40a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
40b0: 32 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  2;.      DELETE 
40c0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 52 4f 4c  FROM t1;.    ROL
40d0: 4c 42 41 43 4b 20 54 4f 20 74 72 61 6e 73 3b 0a  LBACK TO trans;.
40e0: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
40f0: 54 20 78 20 3d 20 78 7c 7c 27 33 27 3b 0a 20 20  T x = x||'3';.  
4100: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
4110: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4120: 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  1;.    DELETE FR
4130: 4f 4d 20 74 33 3b 0a 20 20 20 20 52 45 4c 45 41  OM t3;.    RELEA
4140: 53 45 20 74 72 61 6e 73 3b 0a 20 20 7d 0a 7d 20  SE trans;.  }.} 
4150: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
4160: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
4170: 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d  0 {}}.  faultsim
4180: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
4190: 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}...#----------
41a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
41e0: 23 20 54 65 73 74 20 66 61 75 6c 74 20 69 6e 6a  # Test fault inj
41f0: 65 63 74 69 6f 6e 20 77 68 65 6e 20 77 72 69 74  ection when writ
4200: 69 6e 67 20 74 6f 20 61 20 64 61 74 61 62 61 73  ing to a databas
4210: 65 20 66 69 6c 65 20 74 68 61 74 20 72 65 73 69  e file that resi
4220: 64 65 73 20 6f 6e 0a 23 20 61 20 66 69 6c 65 2d  des on.# a file-
4230: 73 79 73 74 65 6d 20 77 69 74 68 20 61 20 73 65  system with a se
4240: 63 74 6f 72 2d 73 69 7a 65 20 6c 61 72 67 65 72  ctor-size larger
4250: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
4260: 73 65 20 70 61 67 65 2d 73 69 7a 65 2e 0a 23 0a  se page-size..#.
4270: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  do_test pagerfau
4280: 6c 74 2d 31 32 2d 70 72 65 31 20 7b 0a 20 20 74  lt-12-pre1 {.  t
4290: 65 73 74 76 66 73 20 73 73 5f 6c 61 79 65 72 20  estvfs ss_layer 
42a0: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 73 73 5f  -default 1.  ss_
42b0: 6c 61 79 65 72 20 73 65 63 74 6f 72 73 69 7a 65  layer sectorsize
42c0: 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69 6d   4096.  faultsim
42d0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
42e0: 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  en.  db func a_s
42f0: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a  tring a_string;.
4300: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4310: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
4320: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52  e = 1024;.    PR
4330: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
4340: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
4350: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
4360: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45 47  ze = 10;.    BEG
4370: 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  IN;.      CREATE
4380: 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 20 55   TABLE t1(x, y U
4390: 4e 49 51 55 45 29 3b 0a 20 20 20 20 20 20 49 4e  NIQUE);.      IN
43a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
43b0: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 33 33 33  UES(a_string(333
43c0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 34 34 29  ), a_string(444)
43d0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
43e0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
43f0: 5f 73 74 72 69 6e 67 28 33 33 33 2b 72 6f 77 69  _string(333+rowi
4400: 64 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 34 34  d), a_string(444
4410: 2b 72 6f 77 69 64 29 20 46 52 4f 4d 20 74 31 3b  +rowid) FROM t1;
4420: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4430: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
4440: 74 72 69 6e 67 28 33 33 33 2b 72 6f 77 69 64 29  tring(333+rowid)
4450: 2c 20 61 5f 73 74 72 69 6e 67 28 34 34 34 2b 72  , a_string(444+r
4460: 6f 77 69 64 29 20 46 52 4f 4d 20 74 31 3b 0a 20  owid) FROM t1;. 
4470: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4480: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
4490: 69 6e 67 28 33 33 33 2b 72 6f 77 69 64 29 2c 20  ing(333+rowid), 
44a0: 61 5f 73 74 72 69 6e 67 28 34 34 34 2b 72 6f 77  a_string(444+row
44b0: 69 64 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  id) FROM t1;.   
44c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
44d0: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
44e0: 67 28 33 33 33 2b 72 6f 77 69 64 29 2c 20 61 5f  g(333+rowid), a_
44f0: 73 74 72 69 6e 67 28 34 34 34 2b 72 6f 77 69 64  string(444+rowid
4500: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  ) FROM t1;.     
4510: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4520: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
4530: 34 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 35  44), a_string(55
4540: 29 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20  ) FROM t1 LIMIT 
4550: 31 33 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  13;.    COMMIT;.
4560: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73    }.  faultsim_s
4570: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20  ave_and_close.} 
4580: 7b 7d 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f  {}..do_faultsim_
4590: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
45a0: 31 32 61 20 2d 70 72 65 70 20 7b 0a 20 20 66 61  12a -prep {.  fa
45b0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
45c0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
45d0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63  sql { PRAGMA cac
45e0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20  he_size = 10 }. 
45f0: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
4600: 67 20 61 5f 73 74 72 69 6e 67 3b 0a 7d 20 2d 62  g a_string;.} -b
4610: 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ody {.  execsql 
4620: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  {.    UPDATE t1 
4630: 53 45 54 20 78 20 3d 20 61 5f 73 74 72 69 6e 67  SET x = a_string
4640: 28 6c 65 6e 67 74 68 28 78 29 29 2c 20 79 20 3d  (length(x)), y =
4650: 20 61 5f 73 74 72 69 6e 67 28 6c 65 6e 67 74 68   a_string(length
4660: 28 79 29 29 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73  (y));.  }.} -tes
4670: 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74  t {.  faultsim_t
4680: 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d  est_result {0 {}
4690: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74  }.  faultsim_int
46a0: 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a  egrity_check.}..
46b0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  do_test pagerfau
46c0: 6c 74 2d 31 32 2d 70 72 65 32 20 7b 0a 20 20 66  lt-12-pre2 {.  f
46d0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
46e0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
46f0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
4700: 45 20 54 41 42 4c 45 20 74 32 20 41 53 20 53 45  E TABLE t2 AS SE
4710: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
4720: 49 4d 49 54 20 31 30 3b 0a 20 20 7d 0a 20 20 66  IMIT 10;.  }.  f
4730: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
4740: 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66  _close.} {}.do_f
4750: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
4760: 65 72 66 61 75 6c 74 2d 31 32 62 20 2d 70 72 65  erfault-12b -pre
4770: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
4780: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
4790: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
47a0: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 20  ring a_string;. 
47b0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
47c0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
47d0: 2d 62 6f 64 79 20 7b 0a 20 20 73 65 74 20 73 71  -body {.  set sq
47e0: 6c 28 31 29 20 7b 20 55 50 44 41 54 45 20 74 32  l(1) { UPDATE t2
47f0: 20 53 45 54 20 78 20 3d 20 61 5f 73 74 72 69 6e   SET x = a_strin
4800: 67 28 32 38 30 29 20 7d 0a 20 20 73 65 74 20 73  g(280) }.  set s
4810: 71 6c 28 32 29 20 7b 20 55 50 44 41 54 45 20 74  ql(2) { UPDATE t
4820: 31 20 53 45 54 20 78 20 3d 20 61 5f 73 74 72 69  1 SET x = a_stri
4830: 6e 67 28 32 38 30 29 20 57 48 45 52 45 20 72 6f  ng(280) WHERE ro
4840: 77 69 64 20 3d 20 35 20 7d 0a 0a 20 20 64 62 20  wid = 5 }..  db 
4850: 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 72 6f  eval { SELECT ro
4860: 77 69 64 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  wid FROM t1 LIMI
4870: 54 20 32 20 7d 20 7b 20 64 62 20 65 76 61 6c 20  T 2 } { db eval 
4880: 24 73 71 6c 28 24 72 6f 77 69 64 29 20 7d 0a 0a  $sql($rowid) }..
4890: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c  } -test {.  faul
48a0: 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74  tsim_test_result
48b0: 20 7b 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73   {0 {}}.  faults
48c0: 69 6d 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65  im_integrity_che
48d0: 63 6b 0a 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62  ck.}..catch { db
48e0: 20 63 6c 6f 73 65 20 7d 0a 73 73 5f 6c 61 79 65   close }.ss_laye
48f0: 72 20 64 65 6c 65 74 65 0a 0a 0a 23 2d 2d 2d 2d  r delete...#----
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4940: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75  -----.# Test fau
4950: 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 77 68 65  lt injection whe
4960: 6e 20 53 51 4c 69 74 65 20 6f 70 65 6e 73 20 61  n SQLite opens a
4970: 20 64 61 74 61 62 61 73 65 20 77 68 65 72 65 20   database where 
4980: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
4990: 23 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  # database file 
49a0: 69 73 20 7a 65 72 6f 20 62 79 74 65 73 20 62 75  is zero bytes bu
49b0: 74 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79 69  t the accompanyi
49c0: 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ng journal file 
49d0: 69 73 20 6c 61 72 67 65 72 0a 23 20 74 68 61 6e  is larger.# than
49e0: 20 74 68 61 74 2e 20 49 6e 20 74 68 69 73 20 73   that. In this s
49f0: 63 65 6e 61 72 69 6f 20 53 51 4c 69 74 65 20 73  cenario SQLite s
4a00: 68 6f 75 6c 64 20 64 65 6c 65 74 65 20 74 68 65  hould delete the
4a10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 23   journal file .#
4a20: 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c 69 6e 67   without rolling
4a30: 20 69 74 20 62 61 63 6b 2c 20 65 76 65 6e 20 69   it back, even i
4a40: 66 20 69 74 20 69 73 20 69 6e 20 61 6c 6c 20 6f  f it is in all o
4a50: 74 68 65 72 20 72 65 73 70 65 63 74 73 20 61 20  ther respects a 
4a60: 76 61 6c 69 64 0a 23 20 68 6f 74 2d 6a 6f 75 72  valid.# hot-jour
4a70: 6e 61 6c 20 66 69 6c 65 2e 0a 23 0a 64 6f 5f 74  nal file..#.do_t
4a80: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31  est pagerfault-1
4a90: 33 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74  3-pre1 {.  fault
4aa0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
4ab0: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
4ac0: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
4ad0: 67 3b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  g;.  execsql {. 
4ae0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
4af0: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
4b00: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
4b10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4b20: 74 31 28 78 2c 20 79 20 55 4e 49 51 55 45 29 3b  t1(x, y UNIQUE);
4b30: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4b40: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73  TO t1 VALUES(a_s
4b50: 74 72 69 6e 67 28 33 33 33 29 2c 20 61 5f 73 74  tring(333), a_st
4b60: 72 69 6e 67 28 34 34 34 29 29 3b 0a 20 20 20 20  ring(444));.    
4b70: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62  COMMIT;.  }.  db
4b80: 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 64 65   close.  file de
4b90: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
4ba0: 2e 64 62 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73  .db.  faultsim_s
4bb0: 61 76 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c  ave.} {}.do_faul
4bc0: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
4bd0: 61 75 6c 74 2d 31 33 20 2d 70 72 65 70 20 7b 0a  ault-13 -prep {.
4be0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
4bf0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20  re_and_reopen.} 
4c00: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
4c10: 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  l { CREATE TABLE
4c20: 20 78 78 28 61 2c 20 62 29 20 7d 0a 7d 20 2d 74   xx(a, b) }.} -t
4c30: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
4c40: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
4c50: 7b 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  {}}.}..#--------
4c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ca0: 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c 74  ---.# Test fault
4cb0: 20 69 6e 6a 65 63 74 69 6f 6e 20 69 6e 74 6f 20   injection into 
4cc0: 61 20 73 6d 61 6c 6c 20 62 61 63 6b 75 70 20 6f  a small backup o
4cd0: 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  peration..#.do_t
4ce0: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31  est pagerfault-1
4cf0: 34 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74  4-pre1 {.  fault
4d00: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
4d10: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
4d20: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
4d30: 67 3b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  g;.  execsql {. 
4d40: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
4d50: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
4d60: 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  ;.    ATTACH 'te
4d70: 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a  st.db2' AS two;.
4d80: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
4d90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
4da0: 28 78 2c 20 79 20 55 4e 49 51 55 45 29 3b 0a 20  (x, y UNIQUE);. 
4db0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
4dc0: 45 20 74 77 6f 2e 74 32 28 78 2c 20 79 20 55 4e  E two.t2(x, y UN
4dd0: 49 51 55 45 29 3b 0a 20 20 20 20 20 20 49 4e 53  IQUE);.      INS
4de0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4df0: 45 53 28 61 5f 73 74 72 69 6e 67 28 33 33 33 29  ES(a_string(333)
4e00: 2c 20 61 5f 73 74 72 69 6e 67 28 34 34 34 29 29  , a_string(444))
4e10: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
4e20: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f  NTO t2 VALUES(a_
4e30: 73 74 72 69 6e 67 28 33 33 33 29 2c 20 61 5f 73  string(333), a_s
4e40: 74 72 69 6e 67 28 34 34 34 29 29 3b 0a 20 20 20  tring(444));.   
4e50: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 66   COMMIT;.  }.  f
4e60: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
4e70: 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f  _close.} {}..do_
4e80: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
4e90: 67 65 72 66 61 75 6c 74 2d 31 34 61 20 2d 70 72  gerfault-14a -pr
4ea0: 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  ep {.  faultsim_
4eb0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
4ec0: 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 69  en.} -body {.  i
4ed0: 66 20 7b 5b 63 61 74 63 68 20 7b 64 62 20 62 61  f {[catch {db ba
4ee0: 63 6b 75 70 20 74 65 73 74 2e 64 62 32 7d 20 6d  ckup test.db2} m
4ef0: 73 67 5d 7d 20 7b 20 65 72 72 6f 72 20 5b 72 65  sg]} { error [re
4f00: 67 73 75 62 20 7b 2e 2a 3a 20 7d 20 24 6d 73 67  gsub {.*: } $msg
4f10: 20 7b 7d 5d 20 7d 0a 7d 20 2d 74 65 73 74 20 7b   {}] }.} -test {
4f20: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74  .  faultsim_test
4f30: 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 20 7b  _result {0 {}} {
4f40: 31 20 7b 7d 7d 20 7b 31 20 7b 53 51 4c 20 6c 6f  1 {}} {1 {SQL lo
4f50: 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73  gic error or mis
4f60: 73 69 6e 67 20 64 61 74 61 62 61 73 65 7d 7d 0a  sing database}}.
4f70: 7d 0a 0a 23 20 49 66 20 54 45 4d 50 5f 53 54 4f  }..# If TEMP_STO
4f80: 52 45 20 69 73 20 32 20 6f 72 20 67 72 65 61 74  RE is 2 or great
4f90: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  er, then the dat
4fa0: 61 62 61 73 65 20 5b 64 62 32 5d 20 77 69 6c 6c  abase [db2] will
4fb0: 20 62 65 20 63 72 65 61 74 65 64 0a 23 20 61 73   be created.# as
4fc0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
4fd0: 74 61 62 61 73 65 2e 20 54 68 69 73 20 74 65 73  tabase. This tes
4fe0: 74 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  t will not work 
4ff0: 69 6e 20 74 68 61 74 20 63 61 73 65 2c 20 61 73  in that case, as
5000: 20 69 74 0a 23 20 69 73 20 6e 6f 74 20 70 6f 73   it.# is not pos
5010: 73 69 62 6c 65 20 74 6f 20 63 68 61 6e 67 65 20  sible to change 
5020: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
5030: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
5040: 74 61 62 61 73 65 2e 20 45 76 65 6e 0a 23 20 75  tabase. Even.# u
5050: 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20  sing the backup 
5060: 41 50 49 2e 0a 23 0a 69 66 20 7b 24 54 45 4d 50  API..#.if {$TEMP
5070: 5f 53 54 4f 52 45 3c 32 7d 20 7b 0a 20 20 64 6f  _STORE<2} {.  do
5080: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70  _faultsim_test p
5090: 61 67 65 72 66 61 75 6c 74 2d 31 34 62 20 2d 70  agerfault-14b -p
50a0: 72 65 70 20 7b 0a 20 20 20 20 63 61 74 63 68 20  rep {.    catch 
50b0: 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20  { db2 close }.  
50c0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
50d0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
50e0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 22 22    sqlite3 db2 ""
50f0: 0a 20 20 20 20 64 62 32 20 65 76 61 6c 20 7b 20  .    db2 eval { 
5100: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
5110: 20 3d 20 34 30 39 36 3b 20 43 52 45 41 54 45 20   = 4096; CREATE 
5120: 54 41 42 4c 45 20 78 78 28 61 29 20 7d 0a 20 20  TABLE xx(a) }.  
5130: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 71  } -body {.    sq
5140: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
5150: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
5160: 20 20 20 20 42 20 73 74 65 70 20 32 30 30 0a 20      B step 200. 
5170: 20 20 20 73 65 74 20 72 63 20 5b 42 20 66 69 6e     set rc [B fin
5180: 69 73 68 5d 0a 20 20 20 20 69 66 20 7b 5b 73 74  ish].    if {[st
5190: 72 69 6e 67 20 6d 61 74 63 68 20 53 51 4c 49 54  ring match SQLIT
51a0: 45 5f 49 4f 45 52 52 5f 2a 20 24 72 63 5d 7d 20  E_IOERR_* $rc]} 
51b0: 7b 73 65 74 20 72 63 20 53 51 4c 49 54 45 5f 49  {set rc SQLITE_I
51c0: 4f 45 52 52 7d 0a 20 20 20 20 69 66 20 7b 24 72  OERR}.    if {$r
51d0: 63 20 21 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22  c != "SQLITE_OK"
51e0: 7d 20 7b 20 65 72 72 6f 72 20 5b 73 71 6c 69 74  } { error [sqlit
51f0: 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20 24  e3_test_errstr $
5200: 72 63 5d 20 7d 0a 20 20 20 20 73 65 74 20 7b 7d  rc] }.    set {}
5210: 20 7b 7d 0a 20 20 7d 20 2d 74 65 73 74 20 7b 0a   {}.  } -test {.
5220: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73      faultsim_tes
5230: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 20  t_result {0 {}} 
5240: 7b 31 20 7b 73 71 6c 69 74 65 33 5f 62 61 63 6b  {1 {sqlite3_back
5250: 75 70 5f 69 6e 69 74 28 29 20 66 61 69 6c 65 64  up_init() failed
5260: 7d 7d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 66 61 75  }}.  }.}..do_fau
5270: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
5280: 66 61 75 6c 74 2d 31 34 63 20 2d 70 72 65 70 20  fault-14c -prep 
5290: 7b 0a 20 20 63 61 74 63 68 20 7b 20 64 62 32 20  {.  catch { db2 
52a0: 63 6c 6f 73 65 20 7d 0a 20 20 66 61 75 6c 74 73  close }.  faults
52b0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
52c0: 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20  eopen.  sqlite3 
52d0: 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 64  db2 test.db2.  d
52e0: 62 32 20 65 76 61 6c 20 7b 20 0a 20 20 20 20 50  b2 eval { .    P
52f0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
5300: 73 20 3d 20 6f 66 66 3b 20 0a 20 20 20 20 50 52  s = off; .    PR
5310: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
5320: 20 34 30 39 36 3b 20 0a 20 20 20 20 43 52 45 41   4096; .    CREA
5330: 54 45 20 54 41 42 4c 45 20 78 78 28 61 29 3b 0a  TE TABLE xx(a);.
5340: 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20    }.} -body {.  
5350: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42  sqlite3_backup B
5360: 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69   db2 main db mai
5370: 6e 0a 20 20 42 20 73 74 65 70 20 32 30 30 0a 20  n.  B step 200. 
5380: 20 73 65 74 20 72 63 20 5b 42 20 66 69 6e 69 73   set rc [B finis
5390: 68 5d 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  h].  if {[string
53a0: 20 6d 61 74 63 68 20 53 51 4c 49 54 45 5f 49 4f   match SQLITE_IO
53b0: 45 52 52 5f 2a 20 24 72 63 5d 7d 20 7b 73 65 74  ERR_* $rc]} {set
53c0: 20 72 63 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc SQLITE_IOERR
53d0: 7d 0a 20 20 69 66 20 7b 24 72 63 20 21 3d 20 22  }.  if {$rc != "
53e0: 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b 20 65 72  SQLITE_OK"} { er
53f0: 72 6f 72 20 5b 73 71 6c 69 74 65 33 5f 74 65 73  ror [sqlite3_tes
5400: 74 5f 65 72 72 73 74 72 20 24 72 63 5d 20 7d 0a  t_errstr $rc] }.
5410: 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 7d 20 2d 74    set {} {}.} -t
5420: 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  est {.  faultsim
5430: 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20  _test_result {0 
5440: 7b 7d 7d 20 7b 31 20 7b 73 71 6c 69 74 65 33 5f  {}} {1 {sqlite3_
5450: 62 61 63 6b 75 70 5f 69 6e 69 74 28 29 20 66 61  backup_init() fa
5460: 69 6c 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73  iled}}.}..do_tes
5470: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 35 2d  t pagerfault-15-
5480: 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  pre1 {.  faultsi
5490: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
54a0: 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
54b0: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b  string a_string;
54c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
54d0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
54e0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c  EATE TABLE t1(x,
54f0: 20 79 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   y UNIQUE);.    
5500: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5510: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
5520: 28 31 31 29 2c 20 61 5f 73 74 72 69 6e 67 28 32  (11), a_string(2
5530: 32 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  2));.      INSER
5540: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5550: 28 61 5f 73 74 72 69 6e 67 28 31 31 29 2c 20 61  (a_string(11), a
5560: 5f 73 74 72 69 6e 67 28 32 32 29 29 3b 0a 20 20  _string(22));.  
5570: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
5580: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e  faultsim_save_an
5590: 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f  d_close.} {}.do_
55a0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61  faultsim_test pa
55b0: 67 65 72 66 61 75 6c 74 2d 31 35 20 2d 70 72 65  gerfault-15 -pre
55c0: 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  p {.  faultsim_r
55d0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
55e0: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
55f0: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 3b 0a 7d  ring a_string;.}
5600: 20 2d 62 6f 64 79 20 7b 0a 20 20 64 62 20 65 76   -body {.  db ev
5610: 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  al { SELECT * FR
5620: 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31 20 7d 20  OM t1 LIMIT 1 } 
5630: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
5640: 20 20 20 20 20 20 42 45 47 49 4e 3b 20 49 4e 53        BEGIN; INS
5650: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5660: 45 53 28 61 5f 73 74 72 69 6e 67 28 33 33 33 29  ES(a_string(333)
5670: 2c 20 61 5f 73 74 72 69 6e 67 28 35 35 35 29 29  , a_string(555))
5680: 3b 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20  ; COMMIT;.      
5690: 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e  BEGIN; INSERT IN
56a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73  TO t1 VALUES(a_s
56b0: 74 72 69 6e 67 28 33 33 33 29 2c 20 61 5f 73 74  tring(333), a_st
56c0: 72 69 6e 67 28 35 35 35 29 29 3b 20 43 4f 4d 4d  ring(555)); COMM
56d0: 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20  IT;.    }.  }.} 
56e0: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
56f0: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
5700: 30 20 7b 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d  0 {}}.  faultsim
5710: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
5720: 0a 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  .}...do_test pag
5730: 65 72 66 61 75 6c 74 2d 31 36 2d 70 72 65 31 20  erfault-16-pre1 
5740: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
5750: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
5760: 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54   execsql { CREAT
5770: 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 20  E TABLE t1(x, y 
5780: 55 4e 49 51 55 45 29 20 7d 0a 20 20 66 61 75 6c  UNIQUE) }.  faul
5790: 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c  tsim_save_and_cl
57a0: 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c  ose.} {}.do_faul
57b0: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
57c0: 61 75 6c 74 2d 31 36 20 2d 70 72 65 70 20 7b 0a  ault-16 -prep {.
57d0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
57e0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20  re_and_reopen.} 
57f0: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
5800: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c  l {.    PRAGMA l
5810: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78  ocking_mode = ex
5820: 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41  clusive;.    PRA
5830: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
5840: 20 3d 20 77 61 6c 3b 0a 20 20 20 20 49 4e 53 45   = wal;.    INSE
5850: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5860: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
5870: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5880: 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 50 52  ES(3, 4);.    PR
5890: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
58a0: 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20  e = delete;.    
58b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
58c0: 41 4c 55 45 53 28 34 2c 20 35 29 3b 0a 20 20 20  ALUES(4, 5);.   
58d0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
58e0: 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20  mode = wal;.    
58f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5900: 41 4c 55 45 53 28 36 2c 20 37 29 3b 0a 20 20 20  ALUES(6, 7);.   
5910: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
5920: 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a  mode = persist;.
5930: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5940: 74 31 20 56 41 4c 55 45 53 28 38 2c 20 39 29 3b  t1 VALUES(8, 9);
5950: 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  .  }.} -test {. 
5960: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
5970: 65 73 75 6c 74 20 7b 30 20 7b 65 78 63 6c 75 73  esult {0 {exclus
5980: 69 76 65 20 77 61 6c 20 64 65 6c 65 74 65 20 77  ive wal delete w
5990: 61 6c 20 70 65 72 73 69 73 74 7d 7d 0a 20 20 66  al persist}}.  f
59a0: 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74  aultsim_integrit
59b0: 79 5f 63 68 65 63 6b 0a 7d 0a 0a 0a 23 2d 2d 2d  y_check.}...#---
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a00: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61  ------.# Test fa
5a10: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 77 68  ult injection wh
5a20: 69 6c 65 20 63 68 61 6e 67 69 6e 67 20 69 6e 74  ile changing int
5a30: 6f 20 61 6e 64 20 6f 75 74 20 6f 66 20 57 41 4c  o and out of WAL
5a40: 20 6d 6f 64 65 2e 0a 23 0a 64 6f 5f 74 65 73 74   mode..#.do_test
5a50: 20 70 61 67 65 72 66 61 75 6c 74 2d 31 37 2d 70   pagerfault-17-p
5a60: 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  re1 {.  faultsim
5a70: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
5a80: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
5a90: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5aa0: 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(a PRIMARY KEY
5ab0: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
5ac0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
5ad0: 31 38 36 32 2c 20 27 42 6f 74 68 61 27 29 3b 0a  1862, 'Botha');.
5ae0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5af0: 74 31 20 56 41 4c 55 45 53 28 31 38 37 30 2c 20  t1 VALUES(1870, 
5b00: 27 53 6d 75 74 73 27 29 3b 0a 20 20 20 20 49 4e  'Smuts');.    IN
5b10: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5b20: 55 45 53 28 31 38 36 36 2c 20 27 48 65 72 74 7a  UES(1866, 'Hertz
5b30: 6f 67 27 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c  og');.  }.  faul
5b40: 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c  tsim_save_and_cl
5b50: 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c  ose.} {}.do_faul
5b60: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
5b70: 61 75 6c 74 2d 31 37 61 20 2d 70 72 65 70 20 7b  ault-17a -prep {
5b80: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
5b90: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d  ore_and_reopen.}
5ba0: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
5bb0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
5bc0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77  journal_mode = w
5bd0: 61 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  al;.    PRAGMA j
5be0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
5bf0: 6c 65 74 65 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73  lete;.  }.} -tes
5c00: 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74  t {.  faultsim_t
5c10: 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 77  est_result {0 {w
5c20: 61 6c 20 64 65 6c 65 74 65 7d 7d 0a 20 20 66 61  al delete}}.  fa
5c30: 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79  ultsim_integrity
5c40: 5f 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c  _check.}.do_faul
5c50: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
5c60: 61 75 6c 74 2d 31 37 62 20 2d 70 72 65 70 20 7b  ault-17b -prep {
5c70: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
5c80: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
5c90: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
5ca0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
5cb0: 4f 46 46 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  OFF }.} -body {.
5cc0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5cd0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
5ce0: 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 49  ode = wal;.    I
5cf0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
5d00: 4c 55 45 53 28 32 32 2c 20 27 43 6c 61 72 6b 65  LUES(22, 'Clarke
5d10: 27 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  ');.    PRAGMA j
5d20: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
5d30: 6c 65 74 65 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73  lete;.  }.} -tes
5d40: 74 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74  t {.  faultsim_t
5d50: 65 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 77  est_result {0 {w
5d60: 61 6c 20 64 65 6c 65 74 65 7d 7d 0a 20 20 66 61  al delete}}.  fa
5d70: 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74 79  ultsim_integrity
5d80: 5f 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75 6c  _check.}.do_faul
5d90: 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66  tsim_test pagerf
5da0: 61 75 6c 74 2d 31 37 63 20 2d 70 72 65 70 20 7b  ault-17c -prep {
5db0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
5dc0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
5dd0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
5de0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
5df0: 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b  ode = exclusive;
5e00: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
5e10: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a  nal_mode = wal;.
5e20: 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20    }.} -body {.  
5e30: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
5e40: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
5e50: 64 65 6c 65 74 65 20 7d 0a 7d 20 2d 74 65 73 74  delete }.} -test
5e60: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65   {.  faultsim_te
5e70: 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 64 65 6c  st_result {0 del
5e80: 65 74 65 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  ete}.  faultsim_
5e90: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
5ea0: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
5eb0: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 37  st pagerfault-17
5ec0: 64 20 2d 70 72 65 70 20 7b 0a 20 20 63 61 74 63  d -prep {.  catc
5ed0: 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a  h { db2 close }.
5ee0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
5ef0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
5f00: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
5f10: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
5f20: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
5f30: 6f 64 65 20 3d 20 64 65 6c 65 74 65 20 7d 0a 20  ode = delete }. 
5f40: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
5f50: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
5f60: 20 77 61 6c 20 7d 0a 20 20 65 78 65 63 73 71 6c   wal }.  execsql
5f70: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
5f80: 31 20 56 41 4c 55 45 53 28 39 39 2c 20 27 42 72  1 VALUES(99, 'Br
5f90: 61 64 6d 61 6e 27 29 20 7d 20 64 62 32 0a 7d 20  adman') } db2.} 
5fa0: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
5fb0: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
5fc0: 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65  al_mode = delete
5fd0: 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66   }.} -test {.  f
5fe0: 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73  aultsim_test_res
5ff0: 75 6c 74 20 7b 31 20 7b 64 61 74 61 62 61 73 65  ult {1 {database
6000: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 66   is locked}}.  f
6010: 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69 74  aultsim_integrit
6020: 79 5f 63 68 65 63 6b 0a 7d 0a 64 6f 5f 66 61 75  y_check.}.do_fau
6030: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
6040: 66 61 75 6c 74 2d 31 37 65 20 2d 70 72 65 70 20  fault-17e -prep 
6050: 7b 0a 20 20 63 61 74 63 68 20 7b 20 64 62 32 20  {.  catch { db2 
6060: 63 6c 6f 73 65 20 7d 0a 20 20 66 61 75 6c 74 73  close }.  faults
6070: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
6080: 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20  eopen.  sqlite3 
6090: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78  db2 test.db.  ex
60a0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a  ecsql { PRAGMA j
60b0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
60c0: 6c 65 74 65 20 7d 0a 20 20 65 78 65 63 73 71 6c  lete }.  execsql
60d0: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
60e0: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20  l_mode = wal }. 
60f0: 20 73 65 74 20 3a 3a 63 68 61 6e 20 5b 6c 61 75   set ::chan [lau
6100: 6e 63 68 5f 74 65 73 74 66 69 78 74 75 72 65 5d  nch_testfixture]
6110: 0a 20 20 74 65 73 74 66 69 78 74 75 72 65 20 24  .  testfixture $
6120: 3a 3a 63 68 61 6e 20 7b 0a 20 20 20 20 73 71 6c  ::chan {.    sql
6130: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
6140: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e      db eval { IN
6150: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6160: 55 45 53 28 31 30 31 2c 20 27 4c 61 74 68 61 6d  UES(101, 'Latham
6170: 27 29 20 7d 0a 20 20 7d 0a 20 20 63 61 74 63 68  ') }.  }.  catch
6180: 20 7b 20 74 65 73 74 66 69 78 74 75 72 65 20 24   { testfixture $
6190: 3a 3a 63 68 61 6e 20 73 71 6c 69 74 65 5f 61 62  ::chan sqlite_ab
61a0: 6f 72 74 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  ort }.  catch { 
61b0: 63 6c 6f 73 65 20 24 3a 3a 63 68 61 6e 20 7d 0a  close $::chan }.
61c0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63  } -body {.  exec
61d0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
61e0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65  rnal_mode = dele
61f0: 74 65 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  te }.} -test {. 
6200: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
6210: 65 73 75 6c 74 20 7b 30 20 64 65 6c 65 74 65 7d  esult {0 delete}
6220: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65  .  faultsim_inte
6230: 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 23  grity_check.}..#
6240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
6290: 20 66 61 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e   fault-injection
62a0: 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20 66   when changing f
62b0: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  rom journal_mode
62c0: 3d 70 65 72 73 69 73 74 20 74 6f 20 0a 23 20 6a  =persist to .# j
62d0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
62e0: 74 65 20 28 74 68 69 73 20 69 6e 76 6f 6c 76 65  te (this involve
62f0: 73 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a  s deleting the j
6300: 6f 75 72 6e 61 6c 20 66 69 6c 65 29 2e 0a 23 0a  ournal file)..#.
6310: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  do_test pagerfau
6320: 6c 74 2d 31 38 2d 70 72 65 31 20 7b 0a 20 20 66  lt-18-pre1 {.  f
6330: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
6340: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
6350: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
6360: 20 54 41 42 4c 45 20 71 71 28 78 29 3b 0a 20 20   TABLE qq(x);.  
6370: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 71    INSERT INTO qq
6380: 20 56 41 4c 55 45 53 28 27 48 65 72 62 65 72 74   VALUES('Herbert
6390: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
63a0: 4e 54 4f 20 71 71 20 56 41 4c 55 45 53 28 27 4d  NTO qq VALUES('M
63b0: 61 63 61 6c 69 73 74 65 72 27 29 3b 0a 20 20 20  acalister');.   
63c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 71 20   INSERT INTO qq 
63d0: 56 41 4c 55 45 53 28 27 4d 61 63 6b 65 6e 7a 69  VALUES('Mackenzi
63e0: 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  e');.    INSERT 
63f0: 49 4e 54 4f 20 71 71 20 56 41 4c 55 45 53 28 27  INTO qq VALUES('
6400: 4c 69 6c 6c 65 79 27 29 3b 0a 20 20 20 20 49 4e  Lilley');.    IN
6410: 53 45 52 54 20 49 4e 54 4f 20 71 71 20 56 41 4c  SERT INTO qq VAL
6420: 55 45 53 28 27 50 61 6c 6d 65 72 27 29 3b 0a 20  UES('Palmer');. 
6430: 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61   }.  faultsim_sa
6440: 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b  ve_and_close.} {
6450: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
6460: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 31 38  st pagerfault-18
6470: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
6480: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
6490: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
64a0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
64b0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
64c0: 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54  SIST;.    INSERT
64d0: 20 49 4e 54 4f 20 71 71 20 56 41 4c 55 45 53 28   INTO qq VALUES(
64e0: 27 42 65 61 74 74 79 27 29 3b 0a 20 20 7d 0a 7d  'Beatty');.  }.}
64f0: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
6500: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
6510: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74  nal_mode = delet
6520: 65 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20  e }.} -test {.  
6530: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
6540: 73 75 6c 74 20 7b 30 20 64 65 6c 65 74 65 7d 0a  sult {0 delete}.
6550: 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67    faultsim_integ
6560: 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 64 6f  rity_check.}..do
6570: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70  _faultsim_test p
6580: 61 67 65 72 66 61 75 6c 74 2d 31 39 61 20 2d 70  agerfault-19a -p
6590: 72 65 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  rep {.  sqlite3 
65a0: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 64 62  db :memory:.  db
65b0: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
65c0: 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
65d0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  l {.    PRAGMA a
65e0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46 55 4c  uto_vacuum = FUL
65f0: 4c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  L;.    BEGIN;.  
6600: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6610: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
6620: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6630: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
6640: 35 30 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  5000), a_string(
6650: 36 30 30 30 29 29 3b 0a 20 20 20 20 43 4f 4d 4d  6000));.    COMM
6660: 49 54 3b 0a 20 20 7d 0a 7d 20 2d 62 6f 64 79 20  IT;.  }.} -body 
6670: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
6680: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6690: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t2(a, b);.    IN
66a0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
66b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 0a  ECT * FROM t1; .
66c0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
66d0: 74 31 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20  t1;.  }.} -test 
66e0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
66f0: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a  t_result {0 {}}.
6700: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
6710: 66 61 75 6c 74 2d 31 39 2d 70 72 65 31 20 7b 0a  fault-19-pre1 {.
6720: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
6730: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
6740: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
6750: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
6760: 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41  = FULL;.    CREA
6770: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 20  TE TABLE t1(x); 
6780: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6790: 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 43 52  ALUES(1);.    CR
67a0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29  EATE TABLE t2(x)
67b0: 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32  ; INSERT INTO t2
67c0: 20 56 41 4c 55 45 53 28 32 29 3b 0a 20 20 20 20   VALUES(2);.    
67d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
67e0: 78 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  x); INSERT INTO 
67f0: 74 33 20 56 41 4c 55 45 53 28 33 29 3b 0a 20 20  t3 VALUES(3);.  
6800: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
6810: 34 28 78 29 3b 20 49 4e 53 45 52 54 20 49 4e 54  4(x); INSERT INT
6820: 4f 20 74 34 20 56 41 4c 55 45 53 28 34 29 3b 0a  O t4 VALUES(4);.
6830: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6840: 20 74 35 28 78 29 3b 20 49 4e 53 45 52 54 20 49   t5(x); INSERT I
6850: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 35 29  NTO t5 VALUES(5)
6860: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
6870: 4c 45 20 74 36 28 78 29 3b 20 49 4e 53 45 52 54  LE t6(x); INSERT
6880: 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28   INTO t6 VALUES(
6890: 36 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  6);.  }.  faults
68a0: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
68b0: 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73  e.} {}.do_faults
68c0: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
68d0: 6c 74 2d 31 39 62 20 2d 70 72 65 70 20 7b 0a 20  lt-19b -prep {. 
68e0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
68f0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d  e_and_reopen.} -
6900: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
6910: 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20   { .    BEGIN;. 
6920: 20 20 20 20 20 55 50 44 41 54 45 20 74 34 20 53       UPDATE t4 S
6930: 45 54 20 78 20 3d 20 78 2b 31 3b 0a 20 20 20 20  ET x = x+1;.    
6940: 20 20 55 50 44 41 54 45 20 74 36 20 53 45 54 20    UPDATE t6 SET 
6950: 78 20 3d 20 78 2b 31 3b 0a 20 20 20 20 20 20 53  x = x+1;.      S
6960: 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
6970: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 33 20        UPDATE t3 
6980: 53 45 54 20 78 20 3d 20 78 2b 31 3b 0a 20 20 20  SET x = x+1;.   
6990: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74       SAVEPOINT t
69a0: 77 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 44 52  wo;.          DR
69b0: 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 20  OP TABLE t2;.   
69c0: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
69d0: 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ne;.    COMMIT;.
69e0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
69f0: 4d 20 74 33 3b 0a 20 20 20 20 53 45 4c 45 43 54  M t3;.    SELECT
6a00: 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 20 20   * FROM t4;.    
6a10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36  SELECT * FROM t6
6a20: 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  ;.  }.} -test {.
6a30: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
6a40: 72 65 73 75 6c 74 20 7b 30 20 7b 33 20 35 20 37  result {0 {3 5 7
6a50: 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}.}..#---------
6a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 0a 23 20 54 68 69 73 20 74 65 73 74 73 20 66 61  .# This tests fa
6ab0: 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 69 6e  ult-injection in
6ac0: 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20   a special case 
6ad0: 69 6e 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  in the auto-vacu
6ae0: 75 6d 20 63 6f 64 65 2e 0a 23 0a 64 6f 5f 74 65  um code..#.do_te
6af0: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 30  st pagerfault-20
6b00: 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73  -pre1 {.  faults
6b10: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
6b20: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
6b30: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
6b40: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
6b50: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
6b60: 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20  uum = FULL;.    
6b70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 30 28  CREATE TABLE t0(
6b80: 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 66 61 75  a, b);.  }.  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 30 20 2d 70 72 65 70 20 7b  fault-20 -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 65 78 65 63 73   -body {.  execs
6c00: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
6c10: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
6c20: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
6c30: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6c40: 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t2(a, b);.     
6c50: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a   DROP TABLE t1;.
6c60: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
6c70: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c  } -test {.  faul
6c80: 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74  tsim_test_result
6c90: 20 7b 30 20 7b 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65   {0 {}}.}..do_te
6ca0: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 31  st pagerfault-21
6cb0: 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73  -pre1 {.  faults
6cc0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
6cd0: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
6ce0: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
6cf0: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
6d00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 30   CREATE TABLE t0
6d10: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
6d20: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
6d30: 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28 31 2c  NTO t0 VALUES(1,
6d40: 20 32 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74   2);.  }.  fault
6d50: 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f  sim_save_and_clo
6d60: 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74  se.} {}.do_fault
6d70: 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61  sim_test pagerfa
6d80: 75 6c 74 2d 32 31 20 2d 70 72 65 70 20 7b 0a 20  ult-21 -prep {. 
6d90: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
6da0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d  e_and_reopen.} -
6db0: 62 6f 64 79 20 7b 0a 20 20 64 62 20 65 76 61 6c  body {.  db eval
6dc0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
6dd0: 20 74 30 20 4c 49 4d 49 54 20 31 20 7d 20 7b 0a   t0 LIMIT 1 } {.
6de0: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e      db eval { IN
6df0: 53 45 52 54 20 49 4e 54 4f 20 74 30 20 53 45 4c  SERT INTO t0 SEL
6e00: 45 43 54 20 61 2b 31 2c 20 62 20 46 52 4f 4d 20  ECT a+1, b FROM 
6e10: 74 30 20 7d 0a 20 20 20 20 64 62 20 65 76 61 6c  t0 }.    db eval
6e20: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
6e30: 30 20 53 45 4c 45 43 54 20 61 2b 32 2c 20 62 20  0 SELECT a+2, b 
6e40: 46 52 4f 4d 20 74 30 20 7d 0a 20 20 7d 0a 7d 20  FROM t0 }.  }.} 
6e50: 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73  -test {.  faults
6e60: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
6e70: 30 20 7b 7d 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  0 {}}.}...#-----
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 66 61 75 6c  ----.# Test faul
6ed0: 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 61 6e 64 20  t-injection and 
6ee0: 72 6f 6c 6c 62 61 63 6b 20 77 68 65 6e 20 74 68  rollback when th
6ef0: 65 20 6e 52 65 73 65 72 76 65 20 68 65 61 64 65  e nReserve heade
6f00: 72 20 76 61 6c 75 65 20 0a 23 20 69 73 20 6e 6f  r value .# is no
6f10: 6e 2d 7a 65 72 6f 2e 0a 23 0a 64 6f 5f 74 65 73  n-zero..#.do_tes
6f20: 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 31 2d  t pagerfault-21-
6f30: 70 72 65 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  pre1 {.  faultsi
6f40: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
6f50: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
6f60: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
6f70: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
6f80: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
6f90: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
6fa0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
6fb0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
6fc0: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 68  }.  db close.  h
6fd0: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
6fe0: 64 62 20 32 30 20 20 20 20 31 30 0a 20 20 68 65  db 20    10.  he
6ff0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
7000: 62 20 31 30 35 20 30 33 46 30 0a 20 20 73 71 6c  b 105 03F0.  sql
7010: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
7020: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
7030: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
7040: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
7050: 54 45 20 54 41 42 4c 45 20 74 30 28 61 20 50 52  TE TABLE t0(a PR
7060: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49  IMARY KEY, b UNI
7070: 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  QUE);.    INSERT
7080: 20 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28   INTO t0 VALUES(
7090: 61 5f 73 74 72 69 6e 67 28 32 32 32 29 2c 20 61  a_string(222), a
70a0: 5f 73 74 72 69 6e 67 28 33 33 33 29 29 3b 0a 20  _string(333));. 
70b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
70c0: 30 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  0 VALUES(a_strin
70d0: 67 28 32 32 33 29 2c 20 61 5f 73 74 72 69 6e 67  g(223), a_string
70e0: 28 33 33 34 29 29 3b 0a 20 20 20 20 49 4e 53 45  (334));.    INSE
70f0: 52 54 20 49 4e 54 4f 20 74 30 20 56 41 4c 55 45  RT INTO t0 VALUE
7100: 53 28 61 5f 73 74 72 69 6e 67 28 32 32 34 29 2c  S(a_string(224),
7110: 20 61 5f 73 74 72 69 6e 67 28 33 33 35 29 29 3b   a_string(335));
7120: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7130: 20 74 30 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t0 VALUES(a_str
7140: 69 6e 67 28 32 32 35 29 2c 20 61 5f 73 74 72 69  ing(225), a_stri
7150: 6e 67 28 33 33 36 29 29 3b 0a 20 20 7d 0a 20 20  ng(336));.  }.  
7160: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e  faultsim_save_an
7170: 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f  d_close.} {}..do
7180: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70  _faultsim_test p
7190: 61 67 65 72 66 61 75 6c 74 2d 32 31 20 2d 70 72  agerfault-21 -pr
71a0: 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  ep {.  faultsim_
71b0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
71c0: 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 65  en.} -body {.  e
71d0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
71e0: 49 4e 54 4f 20 74 30 20 53 45 4c 45 43 54 20 61  INTO t0 SELECT a
71f0: 7c 7c 27 78 27 2c 20 62 7c 7c 27 78 27 20 46 52  ||'x', b||'x' FR
7200: 4f 4d 20 74 30 20 7d 0a 7d 20 2d 74 65 73 74 20  OM t0 }.} -test 
7210: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
7220: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a  t_result {0 {}}.
7230: 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67    faultsim_integ
7240: 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a 69 66 63  rity_check.}.ifc
7250: 61 70 61 62 6c 65 20 63 72 61 73 68 74 65 73 74  apable crashtest
7260: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
7270: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
7280: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
7290: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
72a0: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41   = 1024;.    PRA
72b0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
72c0: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 50 52 41 47   = WAL;.    PRAG
72d0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
72e0: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 20 20  = DELETE;.  }.  
72f0: 64 62 20 63 6c 6f 73 65 0a 20 20 68 65 78 69 6f  db close.  hexio
7300: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 32  _write test.db 2
7310: 30 20 20 20 20 31 30 0a 20 20 68 65 78 69 6f 5f  0    10.  hexio_
7320: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 31 30  write test.db 10
7330: 35 20 30 33 46 30 0a 0a 20 20 73 71 6c 69 74 65  5 03F0..  sqlite
7340: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
7350: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
7360: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
7370: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
7380: 54 41 42 4c 45 20 74 30 28 61 20 50 52 49 4d 41  TABLE t0(a PRIMA
7390: 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45  RY KEY, b UNIQUE
73a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
73b0: 54 4f 20 74 30 20 56 41 4c 55 45 53 28 61 5f 73  TO t0 VALUES(a_s
73c0: 74 72 69 6e 67 28 32 32 32 29 2c 20 61 5f 73 74  tring(222), a_st
73d0: 72 69 6e 67 28 33 33 33 29 29 3b 0a 20 20 20 20  ring(333));.    
73e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20 56  INSERT INTO t0 V
73f0: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32  ALUES(a_string(2
7400: 32 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 33  23), a_string(33
7410: 34 29 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74  4));.  }.  fault
7420: 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f  sim_save_and_clo
7430: 73 65 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  se..  for {set i
7440: 54 65 73 74 20 31 7d 20 7b 24 69 54 65 73 74 3c  Test 1} {$iTest<
7450: 35 30 7d 20 7b 69 6e 63 72 20 69 54 65 73 74 7d  50} {incr iTest}
7460: 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70   {.    do_test p
7470: 61 67 65 72 66 61 75 6c 74 2d 32 31 2e 63 72 61  agerfault-21.cra
7480: 73 68 2e 24 69 54 65 73 74 2e 31 20 7b 0a 20 20  sh.$iTest.1 {.  
7490: 20 20 20 20 63 72 61 73 68 73 71 6c 20 2d 64 65      crashsql -de
74a0: 6c 61 79 20 31 20 2d 66 69 6c 65 20 74 65 73 74  lay 1 -file test
74b0: 2e 64 62 20 2d 73 65 65 64 20 24 69 54 65 73 74  .db -seed $iTest
74c0: 20 7b 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e   {.        BEGIN
74d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 43 52 45 41  ;.          CREA
74e0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
74f0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49  IMARY KEY, b UNI
7500: 51 55 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20  QUE);.          
7510: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
7520: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
7530: 74 30 3b 0a 20 20 20 20 20 20 20 20 43 4f 4d 4d  t0;.        COMM
7540: 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  IT;.      }.    
7550: 7d 20 7b 31 20 7b 63 68 69 6c 64 20 70 72 6f 63  } {1 {child proc
7560: 65 73 73 20 65 78 69 74 65 64 20 61 62 6e 6f 72  ess exited abnor
7570: 6d 61 6c 6c 79 7d 7d 0a 20 20 20 20 64 6f 5f 74  mally}}.    do_t
7580: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32  est pagerfault-2
7590: 32 2e 24 69 54 65 73 74 2e 32 20 7b 0a 20 20 20  2.$iTest.2 {.   
75a0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
75b0: 73 74 2e 64 62 0a 20 20 20 20 20 20 65 78 65 63  st.db.      exec
75c0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74  sql { PRAGMA int
75d0: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a 20  egrity_check }. 
75e0: 20 20 20 7d 20 7b 6f 6b 7d 0a 20 20 20 20 64 62     } {ok}.    db
75f0: 20 63 6c 6f 73 65 0a 20 20 7d 0a 7d 0a 0a 0a 23   close.  }.}...#
7600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 57 68 65 6e  ---------.# When
7650: 20 61 20 33 2e 37 2e 30 20 63 6c 69 65 6e 74 20   a 3.7.0 client 
7660: 6f 70 65 6e 73 20 61 20 77 72 69 74 65 2d 74 72  opens a write-tr
7670: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 64  ansaction on a d
7680: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
7690: 74 0a 23 20 68 61 73 20 62 65 65 6e 20 61 70 70  t.# has been app
76a0: 65 6e 64 65 64 20 74 6f 20 6f 72 20 74 72 75 6e  ended to or trun
76b0: 63 61 74 65 64 20 62 79 20 61 20 70 72 65 2d 33  cated by a pre-3
76c0: 37 30 20 63 6c 69 65 6e 74 2c 20 69 74 20 75 70  70 client, it up
76d0: 64 61 74 65 73 0a 23 20 74 68 65 20 64 62 2d 73  dates.# the db-s
76e0: 69 7a 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ize in the file 
76f0: 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
7700: 6c 79 2e 20 54 68 69 73 20 74 65 73 74 20 63 61  ly. This test ca
7710: 73 65 20 70 72 6f 76 6f 6b 65 73 0a 23 20 65 72  se provokes.# er
7720: 72 6f 72 73 20 64 75 72 69 6e 67 20 74 68 61 74  rors during that
7730: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f   operation..#.do
7740: 5f 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74  _test pagerfault
7750: 2d 32 32 2d 70 72 65 31 20 7b 0a 20 20 66 61 75  -22-pre1 {.  fau
7760: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
7770: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
7780: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
7790: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
77a0: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
77b0: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
77c0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
77d0: 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 43 52 45  uum = 0;.    CRE
77e0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b  ATE TABLE t1(a);
77f0: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
7800: 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20  X i1 ON t1(a);. 
7810: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7820: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
7830: 67 28 33 30 30 30 29 29 3b 0a 20 20 20 20 43 52  g(3000));.    CR
7840: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 29  EATE TABLE t2(a)
7850: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
7860: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 29 3b 0a  O t2 VALUES(1);.
7870: 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20    }.  db close. 
7880: 20 73 71 6c 33 36 32 33 31 20 7b 20 49 4e 53 45   sql36231 { INSE
7890: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
78a0: 53 28 61 5f 73 74 72 69 6e 67 28 33 30 30 30 29  S(a_string(3000)
78b0: 29 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73  ) }.  faultsim_s
78c0: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20  ave_and_close.} 
78d0: 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74  {}.do_faultsim_t
78e0: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32  est pagerfault-2
78f0: 32 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  2 -prep {.  faul
7900: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
7910: 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20  _reopen.} -body 
7920: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
7930: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
7940: 55 45 53 28 32 29 20 7d 0a 20 20 65 78 65 63 73  UES(2) }.  execs
7950: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
7960: 4f 4d 20 74 32 20 7d 0a 7d 20 2d 74 65 73 74 20  OM t2 }.} -test 
7970: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73  {.  faultsim_tes
7980: 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 31 20 32  t_result {0 {1 2
7990: 7d 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69 6e  }}.  faultsim_in
79a0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d 0a  tegrity_check.}.
79b0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 50 72  -----------.# Pr
7a00: 6f 76 6f 6b 65 20 61 6e 20 4f 4f 4d 20 65 72 72  ovoke an OOM err
7a10: 6f 72 20 64 75 72 69 6e 67 20 61 20 63 6f 6d 6d  or during a comm
7a20: 69 74 20 6f 66 20 6d 75 6c 74 69 2d 66 69 6c 65  it of multi-file
7a30: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 6e   transaction. On
7a40: 65 20 6f 66 0a 23 20 74 68 65 20 64 61 74 61 62  e of.# the datab
7a50: 61 73 65 73 20 77 72 69 74 74 65 6e 20 64 75 72  ases written dur
7a60: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
7a70: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ion is an in-mem
7a80: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 23 20  ory database..# 
7a90: 54 68 69 73 20 74 65 73 74 20 63 61 75 73 65 73  This test causes
7aa0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65   rollback of the
7ab0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
7ac0: 61 73 65 20 61 66 74 65 72 20 43 6f 6d 6d 69 74  ase after Commit
7ad0: 50 68 61 73 65 4f 6e 65 28 29 0a 23 20 68 61 73  PhaseOne().# has
7ae0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
7af0: 74 75 72 6e 65 64 2e 20 69 2e 65 2e 20 74 68 65  turned. i.e. the
7b00: 20 73 65 72 69 65 73 20 6f 66 20 63 61 6c 6c 73   series of calls
7b10: 20 66 6f 72 20 74 68 65 20 61 62 6f 72 74 65 64   for the aborted
7b20: 20 63 6f 6d 6d 69 74 20 0a 23 20 69 73 3a 0a 23   commit .# is:.#
7b30: 0a 23 20 20 20 50 61 67 65 72 43 6f 6d 6d 69 74  .#   PagerCommit
7b40: 50 68 61 73 65 4f 6e 65 28 3c 69 6e 2d 6d 65 6d  PhaseOne(<in-mem
7b50: 6f 72 79 2d 64 62 3e 29 20 20 20 2d 3e 20 20 20  ory-db>)   ->   
7b60: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 20 20 50 61  SQLITE_OK.#   Pa
7b70: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
7b80: 65 28 3c 66 69 6c 65 2d 64 62 3e 29 20 20 20 20  e(<file-db>)    
7b90: 20 20 20 20 2d 3e 20 20 20 53 51 4c 49 54 45 5f      ->   SQLITE_
7ba0: 49 4f 45 52 52 0a 23 20 20 20 50 61 67 65 72 52  IOERR.#   PagerR
7bb0: 6f 6c 6c 62 61 63 6b 28 3c 69 6e 2d 6d 65 6d 6f  ollback(<in-memo
7bc0: 72 79 2d 64 62 3e 29 0a 23 20 20 20 50 61 67 65  ry-db>).#   Page
7bd0: 72 52 6f 6c 6c 62 61 63 6b 28 3c 66 69 6c 65 2d  rRollback(<file-
7be0: 64 62 3e 29 0a 23 0a 64 6f 5f 66 61 75 6c 74 73  db>).#.do_faults
7bf0: 69 6d 5f 74 65 73 74 20 70 61 67 65 72 66 61 75  im_test pagerfau
7c00: 6c 74 2d 32 33 20 2d 70 72 65 70 20 7b 0a 20 20  lt-23 -prep {.  
7c10: 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20  foreach f [glob 
7c20: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74  -nocomplain test
7c30: 2e 64 62 2a 5d 20 7b 20 66 69 6c 65 20 64 65 6c  .db*] { file del
7c40: 65 74 65 20 2d 66 6f 72 63 65 20 24 66 20 7d 0a  ete -force $f }.
7c50: 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65    sqlite3 db :me
7c60: 6d 6f 72 79 3a 0a 20 20 64 62 20 65 76 61 6c 20  mory:.  db eval 
7c70: 7b 20 0a 20 20 20 20 41 54 54 41 43 48 20 27 74  { .    ATTACH 't
7c80: 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b  est.db2' AS aux;
7c90: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7ca0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
7cb0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78  CREATE TABLE aux
7cc0: 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d  .t2(a, b);.  }.}
7cd0: 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73   -body {.  execs
7ce0: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
7cf0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
7d00: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32  TO t1 VALUES(1,2
7d10: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
7d20: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33  INTO t2 VALUES(3
7d30: 2c 34 29 3b 20 0a 20 20 20 20 43 4f 4d 4d 49 54  ,4); .    COMMIT
7d40: 3b 0a 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  ;.  }.} -test {.
7d50: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
7d60: 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 20 20  result {0 {}}.  
7d70: 66 61 75 6c 74 73 69 6d 5f 69 6e 74 65 67 72 69  faultsim_integri
7d80: 74 79 5f 63 68 65 63 6b 0a 7d 0a 0a 64 6f 5f 66  ty_check.}..do_f
7d90: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67  aultsim_test pag
7da0: 65 72 66 61 75 6c 74 2d 32 34 20 2d 70 72 65 70  erfault-24 -prep
7db0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
7dc0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
7dd0: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
7de0: 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20  MA temp_store = 
7df0: 66 69 6c 65 20 7d 0a 20 20 65 78 65 63 73 71 6c  file }.  execsql
7e00: 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
7e10: 78 28 61 2c 20 62 29 20 7d 0a 7d 20 2d 62 6f 64  x(a, b) }.} -bod
7e20: 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  y {.  execsql { 
7e30: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
7e40: 45 20 74 31 28 61 2c 20 62 29 20 7d 0a 7d 20 2d  E t1(a, b) }.} -
7e50: 74 65 73 74 20 7b 0a 20 20 66 61 75 6c 74 73 69  test {.  faultsi
7e60: 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b 30  m_test_result {0
7e70: 20 7b 7d 7d 20 5c 0a 20 20 20 20 7b 31 20 7b 75   {}} \.    {1 {u
7e80: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
7e90: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
7ea0: 73 65 20 66 69 6c 65 20 66 6f 72 20 73 74 6f 72  se file for stor
7eb0: 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
7ec0: 62 6c 65 73 7d 7d 0a 20 20 73 65 74 20 69 63 20  bles}}.  set ic 
7ed0: 5b 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d  [db eval { PRAGM
7ee0: 41 20 74 65 6d 70 2e 69 6e 74 65 67 72 69 74 79  A temp.integrity
7ef0: 5f 63 68 65 63 6b 20 7d 5d 0a 20 20 69 66 20 7b  _check }].  if {
7f00: 24 69 63 20 21 3d 20 22 6f 6b 22 7d 20 7b 20 65  $ic != "ok"} { e
7f10: 72 72 6f 72 20 22 49 6e 74 65 67 72 69 74 79 20  rror "Integrity 
7f20: 63 68 65 63 6b 3a 20 24 69 63 22 20 7d 0a 7d 0a  check: $ic" }.}.
7f30: 0a 70 72 6f 63 20 6c 6f 63 6b 72 6f 77 73 20 7b  .proc lockrows {
7f40: 6e 7d 20 7b 0a 20 20 69 66 20 7b 24 6e 3d 3d 30  n} {.  if {$n==0
7f50: 7d 20 7b 20 72 65 74 75 72 6e 20 22 22 20 7d 0a  } { return "" }.
7f60: 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45    db eval { SELE
7f70: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
7f80: 52 45 20 6f 69 64 20 3d 20 24 6e 20 7d 20 7b 20  RE oid = $n } { 
7f90: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 6f 63  .    return [loc
7fa0: 6b 72 6f 77 73 20 5b 65 78 70 72 20 7b 24 6e 2d  krows [expr {$n-
7fb0: 31 7d 5d 5d 0a 20 20 7d 0a 7d 0a 0a 0a 64 6f 5f  1}]].  }.}...do_
7fc0: 74 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d  test pagerfault-
7fd0: 32 35 2d 70 72 65 31 20 7b 0a 20 20 66 61 75 6c  25-pre1 {.  faul
7fe0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
7ff0: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
8000: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
8010: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
8020: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
8030: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
8040: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
8050: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 43 52 45 41  um = 0;.    CREA
8060: 54 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a  TE TABLE t1(a);.
8070: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8080: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
8090: 6e 67 28 35 30 30 29 29 3b 0a 20 20 20 20 49 4e  ng(500));.    IN
80a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
80b0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
80c0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
80d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
80e0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
80f0: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
8100: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
8110: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35  ELECT a_string(5
8120: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
8130: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8140: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
8150: 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
8160: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
8170: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
8180: 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (500) FROM t1;. 
8190: 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61   }.  faultsim_sa
81a0: 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b  ve_and_close.} {
81b0: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
81c0: 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32 35  st pagerfault-25
81d0: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
81e0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
81f0: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
8200: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
8210: 6e 67 0a 20 20 73 65 74 20 3a 3a 63 68 61 6e 6e  ng.  set ::chann
8220: 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20  el [db incrblob 
8230: 2d 72 65 61 64 6f 6e 6c 79 20 74 31 20 61 20 31  -readonly t1 a 1
8240: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  ].  execsql { . 
8250: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
8260: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42  size = 10;.    B
8270: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
8280: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
8290: 53 28 61 5f 73 74 72 69 6e 67 28 33 30 30 30 29  S(a_string(3000)
82a0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
82b0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
82c0: 5f 73 74 72 69 6e 67 28 33 30 30 30 29 29 3b 0a  _string(3000));.
82d0: 20 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20    }.} -body {.  
82e0: 6c 6f 63 6b 72 6f 77 73 20 33 30 0a 7d 20 2d 74  lockrows 30.} -t
82f0: 65 73 74 20 7b 0a 20 20 63 61 74 63 68 20 7b 20  est {.  catch { 
8300: 6c 6f 63 6b 72 6f 77 73 20 33 30 20 7d 0a 20 20  lockrows 30 }.  
8310: 63 61 74 63 68 20 7b 20 64 62 20 65 76 61 6c 20  catch { db eval 
8320: 43 4f 4d 4d 49 54 20 7d 0a 20 20 63 6c 6f 73 65  COMMIT }.  close
8330: 20 24 3a 3a 63 68 61 6e 6e 65 6c 0a 20 20 66 61   $::channel.  fa
8340: 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75  ultsim_test_resu
8350: 6c 74 20 7b 30 20 7b 7d 7d 20 0a 7d 0a 0a 64 6f  lt {0 {}} .}..do
8360: 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 70  _faultsim_test p
8370: 61 67 65 72 66 61 75 6c 74 2d 32 36 20 2d 70 72  agerfault-26 -pr
8380: 65 70 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  ep {.  faultsim_
8390: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
83a0: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
83b0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
83c0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50  ze = 1024;.    P
83d0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
83e0: 64 65 20 3d 20 74 72 75 6e 63 61 74 65 3b 0a 20  de = truncate;. 
83f0: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
8400: 61 63 75 75 6d 20 3d 20 66 75 6c 6c 3b 0a 20 20  acuum = full;.  
8410: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
8420: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 3b  _mode=exclusive;
8430: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8440: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
8450: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
8460: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
8470: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
8480: 65 20 3d 20 34 30 39 36 3b 0a 20 20 7d 0a 7d 20  e = 4096;.  }.} 
8490: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
84a0: 6c 20 7b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a  l {.    VACUUM;.
84b0: 20 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20    }.} -test {.  
84c0: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
84d0: 73 75 6c 74 20 7b 30 20 7b 7d 7d 0a 0a 20 20 73  sult {0 {}}..  s
84e0: 65 74 20 63 6f 6e 74 65 6e 74 73 20 5b 64 62 20  et contents [db 
84f0: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  eval {SELECT * F
8500: 52 4f 4d 20 74 31 7d 5d 0a 20 20 69 66 20 7b 24  ROM t1}].  if {$
8510: 63 6f 6e 74 65 6e 74 73 20 21 3d 20 22 31 20 32  contents != "1 2
8520: 22 7d 20 7b 20 65 72 72 6f 72 20 22 42 61 64 20  "} { error "Bad 
8530: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
8540: 73 20 28 24 63 6f 6e 74 65 6e 74 73 29 22 20 7d  s ($contents)" }
8550: 0a 0a 20 20 73 65 74 20 73 7a 20 5b 66 69 6c 65  ..  set sz [file
8560: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 20   size test.db]. 
8570: 20 69 66 20 7b 24 74 65 73 74 72 63 21 3d 30 20   if {$testrc!=0 
8580: 26 26 20 24 73 7a 21 3d 31 30 32 34 2a 33 20 26  && $sz!=1024*3 &
8590: 26 20 24 73 7a 21 3d 34 30 39 36 2a 33 7d 20 7b  & $sz!=4096*3} {
85a0: 20 0a 20 20 20 20 65 72 72 6f 72 20 22 45 78 70   .    error "Exp
85b0: 65 63 74 65 64 20 66 69 6c 65 20 73 69 7a 65 20  ected file size 
85c0: 74 6f 20 62 65 20 33 30 37 32 20 6f 72 20 31 32  to be 3072 or 12
85d0: 32 38 38 20 62 79 74 65 73 20 2d 20 61 63 74 75  288 bytes - actu
85e0: 61 6c 20 73 69 7a 65 20 24 73 7a 20 62 79 74 65  al size $sz byte
85f0: 73 22 0a 20 20 7d 0a 20 20 69 66 20 7b 24 74 65  s".  }.  if {$te
8600: 73 74 72 63 3d 3d 30 20 26 26 20 24 73 7a 21 3d  strc==0 && $sz!=
8610: 34 30 39 36 2a 33 7d 20 7b 20 0a 20 20 20 20 65  4096*3} { .    e
8620: 72 72 6f 72 20 22 45 78 70 65 63 74 65 64 20 66  rror "Expected f
8630: 69 6c 65 20 73 69 7a 65 20 74 6f 20 62 65 20 31  ile size to be 1
8640: 32 32 38 38 20 62 79 74 65 73 20 2d 20 61 63 74  2288 bytes - act
8650: 75 61 6c 20 73 69 7a 65 20 24 73 7a 20 62 79 74  ual size $sz byt
8660: 65 73 22 0a 20 20 7d 0a 7d 20 0a 0a 64 6f 5f 74  es".  }.} ..do_t
8670: 65 73 74 20 70 61 67 65 72 66 61 75 6c 74 2d 32  est pagerfault-2
8680: 37 2d 70 72 65 20 7b 0a 20 20 66 61 75 6c 74 73  7-pre {.  faults
8690: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
86a0: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
86b0: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
86c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
86d0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
86e0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
86f0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
8700: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
8710: 54 41 42 4c 45 20 74 32 28 61 20 55 4e 49 51 55  TABLE t2(a UNIQU
8720: 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20  E, b UNIQUE);.  
8730: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
8740: 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e   VALUES( a_strin
8750: 67 28 38 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(800), a_string
8760: 28 38 30 30 29 20 29 3b 0a 20 20 20 20 49 4e 53  (800) );.    INS
8770: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
8780: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
8790: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
87a0: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53  FROM t2;.    INS
87b0: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
87c0: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
87d0: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
87e0: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53  FROM t2;.    INS
87f0: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
8800: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
8810: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
8820: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53  FROM t2;.    INS
8830: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
8840: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
8850: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
8860: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53  FROM t2;.    INS
8870: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
8880: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
8890: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
88a0: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53  FROM t2;.    INS
88b0: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
88c0: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
88d0: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
88e0: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53  FROM t2;.    INS
88f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8900: 45 53 20 28 61 5f 73 74 72 69 6e 67 28 32 30 30  ES (a_string(200
8910: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30  00), a_string(20
8920: 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 66 61 75  000));.  }.  fau
8930: 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63  ltsim_save_and_c
8940: 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75  lose.} {}.do_fau
8950: 6c 74 73 69 6d 5f 74 65 73 74 20 70 61 67 65 72  ltsim_test pager
8960: 66 61 75 6c 74 2d 32 37 20 2d 66 61 75 6c 74 73  fault-27 -faults
8970: 20 69 6f 65 72 72 2d 70 65 72 73 69 73 74 65 6e   ioerr-persisten
8980: 74 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c  t -prep {.  faul
8990: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
89a0: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
89b0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
89c0: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ing.  execsql { 
89d0: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
89e0: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
89f0: 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45   BEGIN EXCLUSIVE
8a00: 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 63 68  ;.  }.  set ::ch
8a10: 61 6e 6e 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c  annel [db incrbl
8a20: 6f 62 20 74 31 20 61 20 31 5d 0a 7d 20 2d 62 6f  ob t1 a 1].} -bo
8a30: 64 79 20 7b 0a 20 20 70 75 74 73 20 24 3a 3a 63  dy {.  puts $::c
8a40: 68 61 6e 6e 65 6c 20 5b 73 74 72 69 6e 67 20 72  hannel [string r
8a50: 65 70 65 61 74 20 61 62 63 20 36 30 30 30 5d 0a  epeat abc 6000].
8a60: 20 20 66 6c 75 73 68 20 24 3a 3a 63 68 61 6e 6e    flush $::chann
8a70: 65 6c 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20 63  el.} -test {.  c
8a80: 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45  atchsql { UPDATE
8a90: 20 74 32 20 53 45 54 20 61 20 3d 20 61 5f 73 74   t2 SET a = a_st
8aa0: 72 69 6e 67 28 38 30 30 29 2c 20 62 20 3d 20 61  ring(800), b = a
8ab0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 7d 0a 20  _string(800) }. 
8ac0: 20 63 61 74 63 68 20 7b 20 63 6c 6f 73 65 20 24   catch { close $
8ad0: 3a 3a 63 68 61 6e 6e 65 6c 20 7d 0a 20 20 63 61  ::channel }.  ca
8ae0: 74 63 68 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43  tchsql { ROLLBAC
8af0: 4b 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 69  K }.  faultsim_i
8b00: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 7d  ntegrity_check.}
8b10: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a     ..finish_test..