/ Hex Artifact Content
Login

Artifact 61442a9964ab6b124fc5254e4258b45747842e6f:


0000: 23 20 32 30 30 39 20 4a 61 6e 75 61 72 79 20 38  # 2009 January 8
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n 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 2a 2a 0a 23 0a 23 20 54 68 69 73 20  ******.#.# This 
0170: 74 65 73 74 20 76 65 72 69 66 69 65 73 20 61 20  test verifies a 
0180: 63 6f 75 70 6c 65 20 6f 66 20 73 70 65 63 69 66  couple of specif
0190: 69 63 20 70 6f 74 65 6e 74 69 61 6c 20 64 61 74  ic potential dat
01a0: 61 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 23 20  a corruption .# 
01b0: 73 63 65 6e 61 72 69 6f 73 20 69 6e 76 6f 6c 76  scenarios involv
01c0: 69 6e 67 20 63 72 61 73 68 65 73 20 6f 72 20 70  ing crashes or p
01d0: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 23  ower failures..#
01e0: 0a 23 20 4c 61 74 65 72 3a 20 41 6c 73 6f 2c 20  .# Later: Also, 
01f0: 73 6f 6d 65 20 6f 74 68 65 72 20 73 70 65 63 69  some other speci
0200: 66 69 63 20 73 63 65 6e 61 72 69 6f 73 20 72 65  fic scenarios re
0210: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 76 65 72  quired for cover
0220: 61 67 65 0a 23 20 74 65 73 74 69 6e 67 20 74 68  age.# testing th
0230: 61 74 20 64 6f 20 6e 6f 74 20 6c 65 61 64 20 74  at do not lead t
0240: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 23 0a  o corruption..#.
0250: 23 20 24 49 64 3a 20 63 72 61 73 68 38 2e 74 65  # $Id: crash8.te
0260: 73 74 2c 76 20 31 2e 34 20 32 30 30 39 2f 30 31  st,v 1.4 2009/01
0270: 2f 31 31 20 30 30 3a 34 34 3a 34 38 20 64 72 68  /11 00:44:48 drh
0280: 20 45 78 70 20 24 0a 0a 0a 73 65 74 20 74 65 73   Exp $...set tes
0290: 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  tdir [file dirna
02a0: 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63  me $argv0].sourc
02b0: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
02c0: 72 2e 74 63 6c 0a 0a 69 66 63 61 70 61 62 6c 65  r.tcl..ifcapable
02d0: 20 21 63 72 61 73 68 74 65 73 74 20 7b 0a 20 20   !crashtest {.  
02e0: 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72 65  finish_test.  re
02f0: 74 75 72 6e 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  turn.}..do_test 
0300: 63 72 61 73 68 38 2d 31 2e 31 20 7b 0a 20 20 65  crash8-1.1 {.  e
0310: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
0320: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d  GMA auto_vacuum=
0330: 4f 46 46 3b 0a 20 20 20 20 43 52 45 41 54 45 20  OFF;.    CREATE 
0340: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
0350: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
0360: 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 29 3b   i1 ON t1(a, b);
0370: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0380: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61   t1 VALUES(1, ra
0390: 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29  ndstr(1000,1000)
03a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
03b0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
03c0: 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30  randstr(1000,100
03d0: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
03e0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
03f0: 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31  , randstr(1000,1
0400: 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  000));.    INSER
0410: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0420: 28 34 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30  (4, randstr(1000
0430: 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  ,1000));.    INS
0440: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0450: 45 53 28 35 2c 20 72 61 6e 64 73 74 72 28 31 30  ES(5, randstr(10
0460: 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 49  00,1000));.    I
0470: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0480: 4c 55 45 53 28 36 2c 20 72 61 6e 64 73 74 72 28  LUES(6, randstr(
0490: 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20  1000,1000));.   
04a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
04b0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
04c0: 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62  TE TABLE t3(a, b
04d0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
04e0: 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20 20  BLE t4(a, b);.  
04f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0500: 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  5(a, b);.    CRE
0510: 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c 20  ATE TABLE t6(a, 
0520: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
0530: 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a 20  ABLE t7(a, b);. 
0540: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0550: 74 38 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t8(a, b);.    CR
0560: 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 61 2c  EATE TABLE t9(a,
0570: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
0580: 54 41 42 4c 45 20 74 31 30 28 61 2c 20 62 29 3b  TABLE t10(a, b);
0590: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
05a0: 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 7d 0a  grity_check.  }.
05b0: 7d 20 7b 6f 6b 7d 0a 0a 0a 23 20 50 6f 74 65 6e  } {ok}...# Poten
05c0: 74 69 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  tial corruption 
05d0: 73 63 65 6e 61 72 69 6f 20 31 2e 20 41 20 73 65  scenario 1. A se
05e0: 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 6f 70 65  cond process ope
05f0: 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
0600: 0a 23 20 61 6e 64 20 6d 6f 64 69 66 69 65 73 20  .# and modifies 
0610: 61 20 6c 61 72 67 65 20 70 6f 72 74 69 6f 6e 20  a large portion 
0620: 6f 66 20 69 74 2e 20 49 74 20 74 68 65 6e 20 6f  of it. It then o
0630: 70 65 6e 73 20 61 20 73 65 63 6f 6e 64 20 74 72  pens a second tr
0640: 61 6e 73 61 63 74 69 6f 6e 0a 23 20 61 6e 64 20  ansaction.# and 
0650: 6d 6f 64 69 66 69 65 73 20 61 20 73 6d 61 6c 6c  modifies a small
0660: 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
0670: 61 62 61 73 65 2c 20 62 75 74 20 63 72 61 73 68  abase, but crash
0680: 65 73 20 62 65 66 6f 72 65 20 69 74 20 63 6f 6d  es before it com
0690: 6d 69 74 73 0a 23 20 74 68 65 20 74 72 61 6e 73  mits.# the trans
06a0: 61 63 74 69 6f 6e 2e 20 0a 23 0a 23 20 57 68 65  action. .#.# Whe
06b0: 6e 20 74 68 65 20 66 69 72 73 74 20 70 72 6f 63  n the first proc
06c0: 65 73 73 20 61 63 63 65 73 73 65 64 20 74 68 65  ess accessed the
06d0: 20 64 61 74 61 62 61 73 65 20 61 67 61 69 6e 2c   database again,
06e0: 20 69 74 20 77 61 73 20 72 6f 6c 6c 69 6e 67 20   it was rolling 
06f0: 62 61 63 6b 0a 23 20 74 68 65 20 61 62 6f 72 74  back.# the abort
0700: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ed transaction, 
0710: 62 75 74 20 77 61 73 20 6e 6f 74 20 70 75 72 67  but was not purg
0720: 69 6e 67 20 69 74 73 20 69 6e 2d 6d 65 6d 6f 72  ing its in-memor
0730: 79 20 63 61 63 68 65 20 28 77 68 69 63 68 0a 23  y cache (which.#
0740: 20 77 61 73 20 6c 6f 61 64 65 64 20 62 65 66 6f   was loaded befo
0750: 72 65 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  re the second pr
0760: 6f 63 65 73 73 20 6d 61 64 65 20 69 74 73 20 66  ocess made its f
0770: 69 72 73 74 2c 20 73 75 63 63 65 73 73 66 75 6c  irst, successful
0780: 2c 20 0a 23 20 6d 6f 64 69 66 69 63 61 74 69 6f  , .# modificatio
0790: 6e 29 2e 20 50 72 6f 64 75 63 69 6e 67 20 61 6e  n). Producing an
07a0: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
07b0: 63 68 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 63  che..#.do_test c
07c0: 72 61 73 68 38 2d 31 2e 32 20 7b 0a 20 20 63 72  rash8-1.2 {.  cr
07d0: 61 73 68 73 71 6c 20 2d 64 65 6c 61 79 20 32 20  ashsql -delay 2 
07e0: 2d 66 69 6c 65 20 74 65 73 74 2e 64 62 20 7b 0a  -file test.db {.
07f0: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
0800: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
0810: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
0820: 3d 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31  = randstr(1000,1
0830: 30 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  000);.    INSERT
0840: 20 49 4e 54 4f 20 74 39 20 56 41 4c 55 45 53 28   INTO t9 VALUES(
0850: 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20  1, 2);.  }.} {1 
0860: 7b 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 65  {child process e
0870: 78 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c 6c 79  xited abnormally
0880: 7d 7d 0a 64 6f 5f 74 65 73 74 20 63 72 61 73 68  }}.do_test crash
0890: 38 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  8-1.3 {.  execsq
08a0: 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72  l {PRAGMA integr
08b0: 69 74 79 5f 63 68 65 63 6b 7d 0a 7d 20 7b 6f 6b  ity_check}.} {ok
08c0: 7d 0a 0a 23 20 50 6f 74 65 6e 74 69 61 6c 20 63  }..# Potential c
08d0: 6f 72 72 75 70 74 69 6f 6e 20 73 63 65 6e 61 72  orruption scenar
08e0: 69 6f 20 32 2e 20 54 68 65 20 73 65 63 6f 6e 64  io 2. The second
08f0: 20 70 72 6f 63 65 73 73 2c 20 6f 70 65 72 61 74   process, operat
0900: 69 6e 67 20 69 6e 0a 23 20 70 65 72 73 69 73 74  ing in.# persist
0910: 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
0920: 2c 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20  , makes a large 
0930: 63 68 61 6e 67 65 20 74 6f 20 74 68 65 20 64 61  change to the da
0940: 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20 77 69  tabase file.# wi
0950: 74 68 20 61 20 73 6d 61 6c 6c 20 69 6e 2d 6d 65  th a small in-me
0960: 6d 6f 72 79 20 63 61 63 68 65 2e 20 53 75 63 68  mory cache. Such
0970: 20 74 68 61 74 20 6d 6f 72 65 20 74 68 61 6e 20   that more than 
0980: 6f 6e 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  one journal-head
0990: 65 72 0a 23 20 77 61 73 20 77 72 69 74 74 65 6e  er.# was written
09a0: 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 49 74   to the file. It
09b0: 20 74 68 65 6e 20 6f 70 65 6e 73 20 61 20 73 65   then opens a se
09c0: 63 6f 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  cond transaction
09d0: 20 61 6e 64 20 6d 61 6b 65 73 0a 23 20 61 20 73   and makes.# a s
09e0: 6d 61 6c 6c 65 72 20 63 68 61 6e 67 65 20 74 68  maller change th
09f0: 61 74 20 72 65 71 75 69 72 65 73 20 6f 6e 6c 79  at requires only
0a00: 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   a single journa
0a10: 6c 2d 68 65 61 64 65 72 20 74 6f 20 62 65 0a 23  l-header to be.#
0a20: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
0a30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
0a40: 65 20 73 65 63 6f 6e 64 20 63 68 61 6e 67 65 20  e second change 
0a50: 69 73 20 73 75 63 68 20 74 68 61 74 20 74 68 65  is such that the
0a60: 20 0a 23 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74   .# journal cont
0a70: 65 6e 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ent written to t
0a80: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  he persistent jo
0a90: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 61 63 74  urnal file exact
0aa0: 6c 79 20 6f 76 65 72 77 72 69 74 65 73 0a 23 20  ly overwrites.# 
0ab0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
0ac0: 6c 2d 68 65 61 64 65 72 20 61 6e 64 20 73 65 74  l-header and set
0ad0: 20 6f 66 20 73 75 62 73 65 71 75 65 6e 74 20 72   of subsequent r
0ae0: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 62  ecords written b
0af0: 79 20 74 68 65 0a 23 20 66 69 72 73 74 2c 20 73  y the.# first, s
0b00: 75 63 63 65 73 73 66 75 6c 2c 20 63 68 61 6e 67  uccessful, chang
0b10: 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 72  e. The second pr
0b20: 6f 63 65 73 73 20 63 72 61 73 68 65 73 20 62 65  ocess crashes be
0b30: 66 6f 72 65 20 69 74 20 63 61 6e 0a 23 20 63 6f  fore it can.# co
0b40: 6d 6d 69 74 20 69 74 73 20 73 65 63 6f 6e 64 20  mmit its second 
0b50: 63 68 61 6e 67 65 2e 0a 23 0a 23 20 57 68 65 6e  change..#.# When
0b60: 20 74 68 65 20 66 69 72 73 74 20 70 72 6f 63 65   the first proce
0b70: 73 73 20 61 63 63 65 73 73 65 64 20 74 68 65 20  ss accessed the 
0b80: 64 61 74 61 62 61 73 65 20 61 67 61 69 6e 2c 20  database again, 
0b90: 69 74 20 77 61 73 20 72 6f 6c 6c 69 6e 67 20 62  it was rolling b
0ba0: 61 63 6b 0a 23 20 74 68 65 20 73 65 63 6f 6e 64  ack.# the second
0bb0: 20 61 62 6f 72 74 65 64 20 74 72 61 6e 73 61 63   aborted transac
0bc0: 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 6e 74 69  tion, then conti
0bd0: 6e 75 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  nuing to rollbac
0be0: 6b 20 74 68 65 20 73 65 63 6f 6e 64 0a 23 20 61  k the second.# a
0bf0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 6a 6f  nd subsequent jo
0c00: 75 72 6e 61 6c 2d 68 65 61 64 65 72 73 20 77 72  urnal-headers wr
0c10: 69 74 74 65 6e 20 62 79 20 74 68 65 20 66 69 72  itten by the fir
0c20: 73 74 2c 20 73 75 63 63 65 73 73 66 75 6c 2c 20  st, successful, 
0c30: 63 68 61 6e 67 65 2e 0a 23 20 44 61 74 61 62 61  change..# Databa
0c40: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 23  se corruption..#
0c50: 0a 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38 2e  .do_test crash8.
0c60: 32 2e 31 20 7b 0a 20 20 63 72 61 73 68 73 71 6c  2.1 {.  crashsql
0c70: 20 2d 64 65 6c 61 79 20 32 20 2d 66 69 6c 65 20   -delay 2 -file 
0c80: 74 65 73 74 2e 64 62 20 7b 0a 20 20 20 20 50 52  test.db {.    PR
0c90: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
0ca0: 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20  e = persist;.   
0cb0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
0cc0: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 55 50 44  ze = 10;.    UPD
0cd0: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 72  ATE t1 SET b = r
0ce0: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
0cf0: 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61  );.    PRAGMA ca
0d00: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 30 3b 0a  che_size = 100;.
0d10: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0d20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
0d30: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
0d40: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
0d50: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 61  NTO t3 VALUES('a
0d60: 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 20 20 49  ', 'b');.      I
0d70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
0d80: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
0d90: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0da0: 4f 20 74 35 20 56 41 4c 55 45 53 28 27 61 27 2c  O t5 VALUES('a',
0db0: 20 27 62 27 29 3b 0a 20 20 20 20 20 20 49 4e 53   'b');.      INS
0dc0: 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55  ERT INTO t6 VALU
0dd0: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
0de0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0df0: 74 37 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t7 VALUES('a', '
0e00: 62 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  b');.      INSER
0e10: 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53  T INTO t8 VALUES
0e20: 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
0e30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 39    INSERT INTO t9
0e40: 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
0e50: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
0e60: 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28  INTO t10 VALUES(
0e70: 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 43  'a', 'b');.    C
0e80: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OMMIT;.  }.} {1 
0e90: 7b 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 65  {child process e
0ea0: 78 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c 6c 79  xited abnormally
0eb0: 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 63 72 61 73  }}..do_test cras
0ec0: 68 38 2d 32 2e 33 20 7b 0a 20 20 65 78 65 63 73  h8-2.3 {.  execs
0ed0: 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67  ql {PRAGMA integ
0ee0: 72 69 74 79 5f 63 68 65 63 6b 7d 0a 7d 20 7b 6f  rity_check}.} {o
0ef0: 6b 7d 0a 0a 70 72 6f 63 20 72 65 61 64 5f 66 69  k}..proc read_fi
0f00: 6c 65 20 7b 7a 46 69 6c 65 7d 20 7b 0a 20 20 73  le {zFile} {.  s
0f10: 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 7a 46 69  et fd [open $zFi
0f20: 6c 65 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72 65  le].  fconfigure
0f30: 20 24 66 64 20 2d 74 72 61 6e 73 6c 61 74 69 6f   $fd -translatio
0f40: 6e 20 62 69 6e 61 72 79 20 0a 20 20 73 65 74 20  n binary .  set 
0f50: 7a 44 61 74 61 20 5b 72 65 61 64 20 24 66 64 5d  zData [read $fd]
0f60: 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 72  .  close $fd.  r
0f70: 65 74 75 72 6e 20 24 7a 44 61 74 61 0a 7d 0a 70  eturn $zData.}.p
0f80: 72 6f 63 20 77 72 69 74 65 5f 66 69 6c 65 20 7b  roc write_file {
0f90: 7a 46 69 6c 65 20 7a 44 61 74 61 7d 20 7b 0a 20  zFile zData} {. 
0fa0: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 7a   set fd [open $z
0fb0: 46 69 6c 65 20 77 5d 0a 20 20 66 63 6f 6e 66 69  File w].  fconfi
0fc0: 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e 73 6c  gure $fd -transl
0fd0: 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 0a 20 20  ation binary .  
0fe0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
0ff0: 24 66 64 20 24 7a 44 61 74 61 0a 20 20 63 6c 6f  $fd $zData.  clo
1000: 73 65 20 24 66 64 0a 7d 0a 0a 23 20 54 68 65 20  se $fd.}..# The 
1010: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
1020: 63 68 65 63 6b 20 74 68 61 74 20 53 51 4c 69 74  check that SQLit
1030: 65 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  e will not roll 
1040: 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
1050: 61 6c 0a 23 20 66 69 6c 65 20 69 66 20 74 68 65  al.# file if the
1060: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
1070: 6c 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ld in the first 
1080: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
1090: 64 65 72 20 69 73 0a 23 20 73 75 73 70 65 63 74  der is.# suspect
10a0: 2e 20 44 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  . Definition of 
10b0: 73 75 73 70 65 63 74 3a 0a 23 20 0a 23 20 20 20  suspect:.# .#   
10c0: 20 61 29 20 4e 6f 74 20 61 20 70 6f 77 65 72 20   a) Not a power 
10d0: 6f 66 20 32 2c 20 6f 72 20 20 20 20 20 20 20 20  of 2, or        
10e0: 20 20 20 20 20 20 20 20 28 63 72 61 73 68 38 2d          (crash8-
10f0: 33 2e 35 29 0a 23 20 20 20 20 62 29 20 47 72 65  3.5).#    b) Gre
1100: 61 74 65 72 20 74 68 61 6e 20 30 78 30 31 30 30  ater than 0x0100
1110: 30 30 30 30 20 28 31 36 4d 42 29 2c 20 6f 72 20  0000 (16MB), or 
1120: 20 28 63 72 61 73 68 38 2d 33 2e 36 29 0a 23 20   (crash8-3.6).# 
1130: 20 20 20 63 29 20 4c 65 73 73 20 74 68 61 6e 20     c) Less than 
1140: 35 31 32 2e 20 20 20 20 20 20 20 20 20 20 20 20  512.            
1150: 20 20 20 20 20 20 20 20 20 20 28 63 72 61 73 68            (crash
1160: 38 2d 33 2e 37 29 0a 23 0a 23 20 41 6c 73 6f 20  8-3.7).#.# Also 
1170: 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
1180: 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 62 61   will not rollba
1190: 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
11a0: 20 66 69 6c 65 20 77 69 74 68 20 61 0a 23 20 73   file with a.# s
11b0: 75 73 70 65 63 74 20 70 61 67 65 2d 73 69 7a 65  uspect page-size
11c0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 22  . In this case "
11d0: 73 75 73 70 65 63 74 22 20 6d 65 61 6e 73 3a 0a  suspect" means:.
11e0: 23 20 0a 23 20 20 20 20 61 29 20 4e 6f 74 20 61  # .#    a) Not a
11f0: 20 70 6f 77 65 72 20 6f 66 20 32 2c 20 6f 72 0a   power of 2, or.
1200: 23 20 20 20 20 62 29 20 4c 65 73 73 20 74 68 61  #    b) Less tha
1210: 6e 20 35 31 32 2c 20 6f 72 0a 23 20 20 20 20 63  n 512, or.#    c
1220: 29 20 47 72 65 61 74 65 72 20 74 68 61 6e 20 53  ) Greater than S
1230: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
1240: 49 5a 45 0a 23 0a 64 6f 5f 74 65 73 74 20 63 72  IZE.#.do_test cr
1250: 61 73 68 38 2d 33 2e 31 20 7b 0a 20 20 6c 69 73  ash8-3.1 {.  lis
1260: 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74  t [file exists t
1270: 65 73 74 2e 64 62 2d 6a 6f 75 72 61 6c 5d 20 5b  est.db-joural] [
1280: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
1290: 2e 64 62 5d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f  .db].} {0 1}.do_
12a0: 74 65 73 74 20 63 72 61 73 68 38 2d 33 2e 32 20  test crash8-3.2 
12b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
12c0: 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
12d0: 6e 6f 75 73 20 3d 20 6f 66 66 3b 0a 20 20 20 20  nous = off;.    
12e0: 42 45 47 49 4e 3b 0a 20 20 20 20 44 45 4c 45 54  BEGIN;.    DELET
12f0: 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53  E FROM t1;.    S
1300: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1310: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 30  ROM t1;.  }.} {0
1320: 7d 0a 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38  }.do_test crash8
1330: 2d 33 2e 33 20 7b 0a 20 20 73 65 74 20 7a 4a 6f  -3.3 {.  set zJo
1340: 75 72 6e 61 6c 20 5b 72 65 61 64 5f 66 69 6c 65  urnal [read_file
1350: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
1360: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  ].  execsql { . 
1370: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53     COMMIT;.    S
1380: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1390: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 30  ROM t1;.  }.} {0
13a0: 7d 0a 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38  }.do_test crash8
13b0: 2d 33 2e 34 20 7b 0a 20 20 62 69 6e 61 72 79 20  -3.4 {.  binary 
13c0: 73 63 61 6e 20 5b 73 74 72 69 6e 67 20 72 61 6e  scan [string ran
13d0: 67 65 20 24 7a 4a 6f 75 72 6e 61 6c 20 32 30 20  ge $zJournal 20 
13e0: 32 33 5d 20 49 20 6e 53 65 63 74 6f 72 0a 20 20  23] I nSector.  
13f0: 73 65 74 20 6e 53 65 63 74 6f 72 0a 7d 20 7b 35  set nSector.} {5
1400: 31 32 7d 0a 0a 64 6f 5f 74 65 73 74 20 63 72 61  12}..do_test cra
1410: 73 68 38 2d 33 2e 35 20 7b 0a 20 20 73 65 74 20  sh8-3.5 {.  set 
1420: 7a 4a 6f 75 72 6e 61 6c 32 20 5b 73 74 72 69 6e  zJournal2 [strin
1430: 67 20 72 65 70 6c 61 63 65 20 24 7a 4a 6f 75 72  g replace $zJour
1440: 6e 61 6c 20 32 30 20 32 33 20 5b 62 69 6e 61 72  nal 20 23 [binar
1450: 79 20 66 6f 72 6d 61 74 20 49 20 35 31 33 5d 5d  y format I 513]]
1460: 0a 20 20 77 72 69 74 65 5f 66 69 6c 65 20 74 65  .  write_file te
1470: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 24 7a  st.db-journal $z
1480: 4a 6f 75 72 6e 61 6c 32 0a 0a 20 20 65 78 65 63  Journal2..  exec
1490: 73 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45 43  sql { .    SELEC
14a0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
14b0: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
14c0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20  ntegrity_check. 
14d0: 20 7d 0a 7d 20 7b 30 20 6f 6b 7d 0a 64 6f 5f 74   }.} {0 ok}.do_t
14e0: 65 73 74 20 63 72 61 73 68 38 2d 33 2e 36 20 7b  est crash8-3.6 {
14f0: 0a 20 20 73 65 74 20 7a 4a 6f 75 72 6e 61 6c 32  .  set zJournal2
1500: 20 5b 73 74 72 69 6e 67 20 72 65 70 6c 61 63 65   [string replace
1510: 20 24 7a 4a 6f 75 72 6e 61 6c 20 32 30 20 32 33   $zJournal 20 23
1520: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
1530: 49 20 30 78 32 30 30 30 30 30 30 5d 5d 0a 20 20  I 0x2000000]].  
1540: 77 72 69 74 65 5f 66 69 6c 65 20 74 65 73 74 2e  write_file test.
1550: 64 62 2d 6a 6f 75 72 6e 61 6c 20 24 7a 4a 6f 75  db-journal $zJou
1560: 72 6e 61 6c 32 0a 20 20 65 78 65 63 73 71 6c 20  rnal2.  execsql 
1570: 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  { .    SELECT co
1580: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
1590: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
15a0: 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 7d 0a 7d  rity_check.  }.}
15b0: 20 7b 30 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20   {0 ok}.do_test 
15c0: 63 72 61 73 68 38 2d 33 2e 37 20 7b 0a 20 20 73  crash8-3.7 {.  s
15d0: 65 74 20 7a 4a 6f 75 72 6e 61 6c 32 20 5b 73 74  et zJournal2 [st
15e0: 72 69 6e 67 20 72 65 70 6c 61 63 65 20 24 7a 4a  ring replace $zJ
15f0: 6f 75 72 6e 61 6c 20 32 30 20 32 33 20 5b 62 69  ournal 20 23 [bi
1600: 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 20 32 35  nary format I 25
1610: 36 5d 5d 0a 20 20 77 72 69 74 65 5f 66 69 6c 65  6]].  write_file
1620: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
1630: 20 24 7a 4a 6f 75 72 6e 61 6c 32 0a 20 20 65 78   $zJournal2.  ex
1640: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c  ecsql { .    SEL
1650: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1660: 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41  M t1;.    PRAGMA
1670: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
1680: 0a 20 20 7d 0a 7d 20 7b 30 20 6f 6b 7d 0a 0a 64  .  }.} {0 ok}..d
1690: 6f 5f 74 65 73 74 20 63 72 61 73 68 38 2d 33 2e  o_test crash8-3.
16a0: 38 20 7b 0a 20 20 73 65 74 20 7a 4a 6f 75 72 6e  8 {.  set zJourn
16b0: 61 6c 32 20 5b 73 74 72 69 6e 67 20 72 65 70 6c  al2 [string repl
16c0: 61 63 65 20 24 7a 4a 6f 75 72 6e 61 6c 20 32 34  ace $zJournal 24
16d0: 20 32 37 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d   27 [binary form
16e0: 61 74 20 49 20 35 31 33 5d 5d 0a 20 20 77 72 69  at I 513]].  wri
16f0: 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d  te_file test.db-
1700: 6a 6f 75 72 6e 61 6c 20 24 7a 4a 6f 75 72 6e 61  journal $zJourna
1710: 6c 32 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  l2..  execsql { 
1720: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
1730: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
1740: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
1750: 74 79 5f 63 68 65 63 6b 0a 20 20 7d 0a 7d 20 7b  ty_check.  }.} {
1760: 30 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 63 72  0 ok}.do_test cr
1770: 61 73 68 38 2d 33 2e 39 20 7b 0a 20 20 73 65 74  ash8-3.9 {.  set
1780: 20 62 69 67 20 5b 65 78 70 72 20 24 53 51 4c 49   big [expr $SQLI
1790: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
17a0: 20 2a 20 32 5d 0a 20 20 73 65 74 20 7a 4a 6f 75   * 2].  set zJou
17b0: 72 6e 61 6c 32 20 5b 73 74 72 69 6e 67 20 72 65  rnal2 [string re
17c0: 70 6c 61 63 65 20 24 7a 4a 6f 75 72 6e 61 6c 20  place $zJournal 
17d0: 32 34 20 32 37 20 5b 62 69 6e 61 72 79 20 66 6f  24 27 [binary fo
17e0: 72 6d 61 74 20 49 20 24 62 69 67 5d 5d 0a 20 20  rmat I $big]].  
17f0: 77 72 69 74 65 5f 66 69 6c 65 20 74 65 73 74 2e  write_file test.
1800: 64 62 2d 6a 6f 75 72 6e 61 6c 20 24 7a 4a 6f 75  db-journal $zJou
1810: 72 6e 61 6c 32 0a 20 20 65 78 65 63 73 71 6c 20  rnal2.  execsql 
1820: 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  { .    SELECT co
1830: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
1840: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
1850: 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 7d 0a 7d  rity_check.  }.}
1860: 20 7b 30 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20   {0 ok}.do_test 
1870: 63 72 61 73 68 38 2d 33 2e 31 30 20 7b 0a 20 20  crash8-3.10 {.  
1880: 73 65 74 20 7a 4a 6f 75 72 6e 61 6c 32 20 5b 73  set zJournal2 [s
1890: 74 72 69 6e 67 20 72 65 70 6c 61 63 65 20 24 7a  tring replace $z
18a0: 4a 6f 75 72 6e 61 6c 20 32 34 20 32 37 20 5b 62  Journal 24 27 [b
18b0: 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 20 32  inary format I 2
18c0: 35 36 5d 5d 0a 20 20 77 72 69 74 65 5f 66 69 6c  56]].  write_fil
18d0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
18e0: 6c 20 24 7a 4a 6f 75 72 6e 61 6c 32 0a 20 20 65  l $zJournal2.  e
18f0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 53 45  xecsql { .    SE
1900: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1910: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
1920: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
1930: 6b 0a 20 20 7d 0a 7d 20 7b 30 20 6f 6b 7d 0a 0a  k.  }.} {0 ok}..
1940: 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38 2d 33  do_test crash8-3
1950: 2e 31 31 20 7b 0a 20 20 73 65 74 20 66 64 20 5b  .11 {.  set fd [
1960: 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f 75  open test.db-jou
1970: 72 6e 61 6c 20 77 5d 0a 20 20 66 63 6f 6e 66 69  rnal w].  fconfi
1980: 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e 73 6c  gure $fd -transl
1990: 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 0a 20 20  ation binary .  
19a0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
19b0: 24 66 64 20 24 7a 4a 6f 75 72 6e 61 6c 0a 20 20  $fd $zJournal.  
19c0: 63 6c 6f 73 65 20 24 66 64 0a 20 20 65 78 65 63  close $fd.  exec
19d0: 73 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45 43  sql { .    SELEC
19e0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
19f0: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
1a00: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20  ntegrity_check. 
1a10: 20 7d 0a 7d 20 7b 36 20 6f 6b 7d 0a 0a 0a 23 20   }.} {6 ok}...# 
1a20: 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  If a connection 
1a30: 72 75 6e 6e 69 6e 67 20 69 6e 20 70 65 72 73 69  running in persi
1a40: 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  stent-journal mo
1a50: 64 65 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  de is part of a 
1a60: 0a 23 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72  .# multi-file tr
1a70: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 75  ansaction, it mu
1a80: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
1a90: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
1aa0: 6c 20 6e 61 6d 65 0a 23 20 61 70 70 65 6e 64 65  l name.# appende
1ab0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
1ac0: 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 64   file contents d
1ad0: 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
1ae0: 20 69 73 20 6c 6f 63 61 74 65 64 0a 23 20 61 74   is located.# at
1af0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b00: 70 68 79 73 69 63 61 6c 20 6a 6f 75 72 6e 61 6c  physical journal
1b10: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
1b20: 77 61 73 20 61 6c 72 65 61 64 79 20 61 0a 23 20  was already a.# 
1b30: 6c 61 72 67 65 20 6a 6f 75 72 6e 61 6c 20 66 69  large journal fi
1b40: 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  le allocated at 
1b50: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1b60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1b70: 69 73 0a 23 20 6d 61 79 20 6d 65 61 6e 20 74 72  is.# may mean tr
1b80: 75 6e 63 61 74 69 6e 67 20 74 68 65 20 66 69 6c  uncating the fil
1b90: 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6d 61  e so that the ma
1ba0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
1bb0: 65 20 72 65 61 6c 6c 79 0a 23 20 69 73 20 61 74  e really.# is at
1bc0: 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e   the physical en
1bd0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 23  d of the file..#
1be0: 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .# This block of
1bf0: 20 74 65 73 74 73 20 74 65 73 74 20 74 68 61 74   tests test that
1c00: 20 53 51 4c 69 74 65 20 63 6f 72 72 65 63 74 6c   SQLite correctl
1c10: 79 20 74 72 75 6e 63 61 74 65 73 20 73 75 63 68  y truncates such
1c20: 0a 23 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  .# journal files
1c30: 2c 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 72  , and that the r
1c40: 65 73 75 6c 74 73 20 62 65 68 61 76 65 20 63 6f  esults behave co
1c50: 72 72 65 63 74 6c 79 20 69 66 20 61 20 68 6f 74  rrectly if a hot
1c60: 2d 6a 6f 75 72 6e 61 6c 0a 23 20 72 6f 6c 6c 62  -journal.# rollb
1c70: 61 63 6b 20 6f 63 63 75 72 73 2e 0a 23 0a 69 66  ack occurs..#.if
1c80: 63 61 70 61 62 6c 65 20 70 72 61 67 6d 61 20 7b  capable pragma {
1c90: 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 66 6f  .  reset_db.  fo
1ca0: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e  rcedelete test2.
1cb0: 64 62 0a 0a 20 20 64 6f 5f 74 65 73 74 20 63 72  db..  do_test cr
1cc0: 61 73 68 38 2d 34 2e 31 20 7b 0a 20 20 20 20 65  ash8-4.1 {.    e
1cd0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
1ce0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
1cf0: 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20  de = persist;.  
1d00: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1d10: 20 61 62 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   ab(a, b);.     
1d20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
1d30: 56 41 4c 55 45 53 28 30 2c 20 27 61 62 63 27 29  VALUES(0, 'abc')
1d40: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1d50: 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 28 31 2c  NTO ab VALUES(1,
1d60: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 49 4e   NULL);.      IN
1d70: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c  SERT INTO ab VAL
1d80: 55 45 53 28 32 2c 20 4e 55 4c 4c 29 3b 0a 20 20  UES(2, NULL);.  
1d90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1da0: 61 62 20 56 41 4c 55 45 53 28 33 2c 20 4e 55 4c  ab VALUES(3, NUL
1db0: 4c 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  L);.      INSERT
1dc0: 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 28   INTO ab VALUES(
1dd0: 34 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  4, NULL);.      
1de0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56  INSERT INTO ab V
1df0: 41 4c 55 45 53 28 35 2c 20 4e 55 4c 4c 29 3b 0a  ALUES(5, NULL);.
1e00: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1e10: 4f 20 61 62 20 56 41 4c 55 45 53 28 36 2c 20 4e  O ab VALUES(6, N
1e20: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 55 50 44 41  ULL);.      UPDA
1e30: 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 72 61  TE ab SET b = ra
1e40: 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30 29  ndstr(1000,1000)
1e50: 3b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27  ;.      ATTACH '
1e60: 74 65 73 74 32 2e 64 62 27 20 41 53 20 61 75 78  test2.db' AS aux
1e70: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
1e80: 75 78 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  ux.journal_mode 
1e90: 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 20  = persist;.     
1ea0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
1eb0: 78 2e 61 62 28 61 2c 20 62 29 3b 0a 20 20 20 20  x.ab(a, b);.    
1ec0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 75    INSERT INTO au
1ed0: 78 2e 61 62 20 53 45 4c 45 43 54 20 2a 20 46 52  x.ab SELECT * FR
1ee0: 4f 4d 20 6d 61 69 6e 2e 61 62 3b 0a 0a 20 20 20  OM main.ab;..   
1ef0: 20 20 20 55 50 44 41 54 45 20 61 75 78 2e 61 62     UPDATE aux.ab
1f00: 20 53 45 54 20 62 20 3d 20 72 61 6e 64 73 74 72   SET b = randstr
1f10: 28 31 30 30 30 2c 31 30 30 30 29 20 57 48 45 52  (1000,1000) WHER
1f20: 45 20 61 3e 3d 31 3b 0a 20 20 20 20 20 20 55 50  E a>=1;.      UP
1f30: 44 41 54 45 20 61 62 20 53 45 54 20 62 20 3d 20  DATE ab SET b = 
1f40: 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30  randstr(1000,100
1f50: 30 29 20 57 48 45 52 45 20 61 3e 3d 31 3b 0a 20  0) WHERE a>=1;. 
1f60: 20 20 20 7d 0a 20 20 20 20 6c 69 73 74 20 5b 66     }.    list [f
1f70: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
1f80: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5b 66 69 6c  db-journal] [fil
1f90: 65 20 65 78 69 73 74 73 20 74 65 73 74 32 2e 64  e exists test2.d
1fa0: 62 2d 6a 6f 75 72 6e 61 6c 5d 0a 20 20 7d 20 7b  b-journal].  } {
1fb0: 31 20 31 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  1 1}..  do_test 
1fc0: 63 72 61 73 68 38 2d 34 2e 32 20 7b 0a 20 20 20  crash8-4.2 {.   
1fd0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
1fe0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20   BEGIN;.        
1ff0: 55 50 44 41 54 45 20 61 75 78 2e 61 62 20 53 45  UPDATE aux.ab SE
2000: 54 20 62 20 3d 20 27 64 65 66 27 20 57 48 45 52  T b = 'def' WHER
2010: 45 20 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  E a = 0;.       
2020: 20 55 50 44 41 54 45 20 6d 61 69 6e 2e 61 62 20   UPDATE main.ab 
2030: 53 45 54 20 62 20 3d 20 27 64 65 66 27 20 57 48  SET b = 'def' WH
2040: 45 52 45 20 61 20 3d 20 30 3b 0a 20 20 20 20 20  ERE a = 0;.     
2050: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20   COMMIT;.    }. 
2060: 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74   } {}..  do_test
2070: 20 63 72 61 73 68 38 2d 34 2e 33 20 7b 0a 20 20   crash8-4.3 {.  
2080: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2090: 20 20 55 50 44 41 54 45 20 61 75 78 2e 61 62 20    UPDATE aux.ab 
20a0: 53 45 54 20 62 20 3d 20 72 61 6e 64 73 74 72 28  SET b = randstr(
20b0: 31 30 30 30 2c 31 30 30 30 29 20 57 48 45 52 45  1000,1000) WHERE
20c0: 20 61 3e 3d 31 3b 0a 20 20 20 20 20 20 55 50 44   a>=1;.      UPD
20d0: 41 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 72  ATE ab SET b = r
20e0: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
20f0: 29 20 57 48 45 52 45 20 61 3e 3d 31 3b 0a 20 20  ) WHERE a>=1;.  
2100: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 73 65    }.  } {}..  se
2110: 74 20 63 6f 6e 74 65 6e 74 73 5f 6d 61 69 6e 20  t contents_main 
2120: 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54  [db eval {SELECT
2130: 20 62 20 46 52 4f 4d 20 6d 61 69 6e 2e 61 62 20   b FROM main.ab 
2140: 57 48 45 52 45 20 61 20 3d 20 31 7d 5d 0a 20 20  WHERE a = 1}].  
2150: 73 65 74 20 63 6f 6e 74 65 6e 74 73 5f 61 75 78  set contents_aux
2160: 20 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45    [db eval {SELE
2170: 43 54 20 62 20 46 52 4f 4d 20 20 61 75 78 2e 61  CT b FROM  aux.a
2180: 62 20 57 48 45 52 45 20 61 20 3d 20 31 7d 5d 0a  b WHERE a = 1}].
2190: 0a 20 20 64 6f 5f 74 65 73 74 20 63 72 61 73 68  .  do_test crash
21a0: 38 2d 34 2e 34 20 7b 0a 20 20 20 20 63 72 61 73  8-4.4 {.    cras
21b0: 68 73 71 6c 20 2d 66 69 6c 65 20 74 65 73 74 32  hsql -file test2
21c0: 2e 64 62 20 2d 64 65 6c 61 79 20 31 20 7b 0a 20  .db -delay 1 {. 
21d0: 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73       ATTACH 'tes
21e0: 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20  t2.db' AS aux;. 
21f0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
2200: 20 20 20 20 55 50 44 41 54 45 20 61 75 78 2e 61      UPDATE aux.a
2210: 62 20 53 45 54 20 62 20 3d 20 27 67 68 69 27 20  b SET b = 'ghi' 
2220: 57 48 45 52 45 20 61 20 3d 20 30 3b 0a 20 20 20  WHERE a = 0;.   
2230: 20 20 20 20 20 55 50 44 41 54 45 20 6d 61 69 6e       UPDATE main
2240: 2e 61 62 20 53 45 54 20 62 20 3d 20 27 67 68 69  .ab SET b = 'ghi
2250: 27 20 57 48 45 52 45 20 61 20 3d 20 30 3b 0a 20  ' WHERE a = 0;. 
2260: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20       COMMIT;.   
2270: 20 7d 0a 20 20 7d 20 7b 31 20 7b 63 68 69 6c 64   }.  } {1 {child
2280: 20 70 72 6f 63 65 73 73 20 65 78 69 74 65 64 20   process exited 
2290: 61 62 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 0a 20 20  abnormally}}..  
22a0: 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38 2d 34  do_test crash8-4
22b0: 2e 35 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 66  .5 {.    list [f
22c0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
22d0: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5b 66 69 6c  db-journal] [fil
22e0: 65 20 65 78 69 73 74 73 20 74 65 73 74 32 2e 64  e exists test2.d
22f0: 62 2d 6a 6f 75 72 6e 61 6c 5d 0a 20 20 7d 20 7b  b-journal].  } {
2300: 31 20 31 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  1 1}..  do_test 
2310: 63 72 61 73 68 38 2d 34 2e 36 20 7b 0a 20 20 20  crash8-4.6 {.   
2320: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2330: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 6d   SELECT b FROM m
2340: 61 69 6e 2e 61 62 20 57 48 45 52 45 20 61 20 3d  ain.ab WHERE a =
2350: 20 30 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   0;.      SELECT
2360: 20 62 20 46 52 4f 4d 20 61 75 78 2e 61 62 20 57   b FROM aux.ab W
2370: 48 45 52 45 20 61 20 3d 20 30 3b 0a 20 20 20 20  HERE a = 0;.    
2380: 7d 0a 20 20 7d 20 7b 64 65 66 20 64 65 66 7d 0a  }.  } {def def}.
2390: 0a 20 20 64 6f 5f 74 65 73 74 20 63 72 61 73 68  .  do_test crash
23a0: 38 2d 34 2e 37 20 7b 0a 20 20 20 20 63 72 61 73  8-4.7 {.    cras
23b0: 68 73 71 6c 20 2d 66 69 6c 65 20 74 65 73 74 32  hsql -file test2
23c0: 2e 64 62 20 2d 64 65 6c 61 79 20 31 20 7b 0a 20  .db -delay 1 {. 
23d0: 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73       ATTACH 'tes
23e0: 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20  t2.db' AS aux;. 
23f0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
2400: 20 20 20 20 55 50 44 41 54 45 20 61 75 78 2e 61      UPDATE aux.a
2410: 62 20 53 45 54 20 62 20 3d 20 27 6a 6b 6c 27 20  b SET b = 'jkl' 
2420: 57 48 45 52 45 20 61 20 3d 20 30 3b 0a 20 20 20  WHERE a = 0;.   
2430: 20 20 20 20 20 55 50 44 41 54 45 20 6d 61 69 6e       UPDATE main
2440: 2e 61 62 20 53 45 54 20 62 20 3d 20 27 6a 6b 6c  .ab SET b = 'jkl
2450: 27 20 57 48 45 52 45 20 61 20 3d 20 30 3b 0a 20  ' WHERE a = 0;. 
2460: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20       COMMIT;.   
2470: 20 7d 0a 20 20 7d 20 7b 31 20 7b 63 68 69 6c 64   }.  } {1 {child
2480: 20 70 72 6f 63 65 73 73 20 65 78 69 74 65 64 20   process exited 
2490: 61 62 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 0a 20 20  abnormally}}..  
24a0: 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38 2d 34  do_test crash8-4
24b0: 2e 38 20 7b 0a 20 20 20 20 73 65 74 20 66 64 20  .8 {.    set fd 
24c0: 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f  [open test.db-jo
24d0: 75 72 6e 61 6c 5d 0a 20 20 20 20 66 63 6f 6e 66  urnal].    fconf
24e0: 69 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e 73  igure $fd -trans
24f0: 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20  lation binary.  
2500: 20 20 73 65 65 6b 20 24 66 64 20 2d 31 36 20 65    seek $fd -16 e
2510: 6e 64 0a 20 20 20 20 62 69 6e 61 72 79 20 73 63  nd.    binary sc
2520: 61 6e 20 5b 72 65 61 64 20 24 66 64 20 34 5d 20  an [read $fd 4] 
2530: 49 20 6c 65 6e 0a 0a 20 20 20 20 73 65 65 6b 20  I len..    seek 
2540: 24 66 64 20 5b 65 78 70 72 20 7b 2d 31 20 2a 20  $fd [expr {-1 * 
2550: 28 24 6c 65 6e 20 2b 20 31 36 29 7d 5d 20 65 6e  ($len + 16)}] en
2560: 64 0a 20 20 20 20 73 65 74 20 7a 4d 61 73 74 65  d.    set zMaste
2570: 72 4a 6f 75 72 6e 61 6c 20 5b 72 65 61 64 20 24  rJournal [read $
2580: 66 64 20 24 6c 65 6e 5d 0a 20 20 20 20 63 6c 6f  fd $len].    clo
2590: 73 65 20 24 66 64 0a 0a 20 20 20 20 66 69 6c 65  se $fd..    file
25a0: 20 65 78 69 73 74 73 20 24 7a 4d 61 73 74 65 72   exists $zMaster
25b0: 4a 6f 75 72 6e 61 6c 0a 20 20 7d 20 7b 31 7d 0a  Journal.  } {1}.
25c0: 0a 20 20 64 6f 5f 74 65 73 74 20 63 72 61 73 68  .  do_test crash
25d0: 38 2d 34 2e 39 20 7b 0a 20 20 20 20 65 78 65 63  8-4.9 {.    exec
25e0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 62 20 46  sql { SELECT b F
25f0: 52 4f 4d 20 61 75 78 2e 61 62 20 57 48 45 52 45  ROM aux.ab WHERE
2600: 20 61 20 3d 20 30 20 7d 0a 20 20 7d 20 7b 64 65   a = 0 }.  } {de
2610: 66 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 63 72  f}..  do_test cr
2620: 61 73 68 38 2d 34 2e 31 30 20 7b 0a 20 20 20 20  ash8-4.10 {.    
2630: 64 65 6c 65 74 65 5f 66 69 6c 65 20 24 7a 4d 61  delete_file $zMa
2640: 73 74 65 72 4a 6f 75 72 6e 61 6c 0a 20 20 20 20  sterJournal.    
2650: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
2660: 20 62 20 46 52 4f 4d 20 6d 61 69 6e 2e 61 62 20   b FROM main.ab 
2670: 57 48 45 52 45 20 61 20 3d 20 30 20 7d 0a 20 20  WHERE a = 0 }.  
2680: 7d 20 7b 6a 6b 6c 7d 0a 7d 0a 0a 23 0a 23 20 53  } {jkl}.}..#.# S
2690: 69 6e 63 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ince the followi
26a0: 6e 67 20 74 65 73 74 73 20 28 63 72 61 73 68 38  ng tests (crash8
26b0: 2d 35 2e 2a 29 20 72 65 6c 79 20 75 70 6f 6e 20  -5.*) rely upon 
26c0: 62 65 69 6e 67 20 61 62 6c 65 0a 23 20 74 6f 20  being able.# to 
26d0: 63 6f 70 79 20 61 20 66 69 6c 65 20 77 68 69 6c  copy a file whil
26e0: 65 20 6f 70 65 6e 2c 20 74 68 65 79 20 77 69 6c  e open, they wil
26f0: 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 57 69  l not work on Wi
2700: 6e 64 6f 77 73 2e 0a 23 0a 69 66 20 7b 24 3a 3a  ndows..#.if {$::
2710: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
2720: 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d 20  tform)=="unix"} 
2730: 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31  {.  for {set i 1
2740: 7d 20 7b 24 69 20 3c 20 31 30 7d 20 7b 69 6e 63  } {$i < 10} {inc
2750: 72 20 69 7d 20 7b 0a 20 20 20 20 63 61 74 63 68  r i} {.    catch
2760: 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20   { db close }.  
2770: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
2780: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f  st.db test.db-jo
2790: 75 72 6e 61 6c 0a 20 20 20 20 73 71 6c 69 74 65  urnal.    sqlite
27a0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
27b0: 20 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38 2d   do_test crash8-
27c0: 35 2e 24 69 2e 31 20 7b 0a 20 20 20 20 20 20 65  5.$i.1 {.      e
27d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20  xecsql {.       
27e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
27f0: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (x PRIMARY KEY);
2800: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2810: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
2820: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b  andomblob(900));
2830: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2840: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
2850: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
2860: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20  ROM t1;.        
2870: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2880: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
2890: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (900) FROM t1;. 
28a0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
28b0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
28c0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
28d0: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 49 4e  M t1;.        IN
28e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
28f0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
2900: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
2910: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2920: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
2930: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
2940: 74 31 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  t1;.        INSE
2950: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2960: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
2970: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
2980: 20 20 20 20 2f 2a 20 36 34 20 72 6f 77 73 20 2a      /* 64 rows *
2990: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
29a0: 63 72 61 73 68 73 71 6c 20 2d 66 69 6c 65 20 74  crashsql -file t
29b0: 65 73 74 2e 64 62 20 2d 64 65 6c 61 79 20 5b 65  est.db -delay [e
29c0: 78 70 72 20 28 24 3a 3a 69 25 32 29 20 2b 20 31  xpr ($::i%2) + 1
29d0: 5d 20 7b 0a 20 20 20 20 20 20 20 20 50 52 41 47  ] {.        PRAG
29e0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
29f0: 31 30 3b 0a 20 20 20 20 20 20 20 20 42 45 47 49  10;.        BEGI
2a00: 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 55 50 44  N;.          UPD
2a10: 41 54 45 20 74 31 20 53 45 54 20 78 20 3d 20 72  ATE t1 SET x = r
2a20: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 3b 0a  andomblob(900);.
2a30: 20 20 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b          ROLLBACK
2a40: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
2a50: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2a60: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
2a70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a80: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
2a90: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
2aa0: 20 7d 0a 20 20 20 20 7d 20 7b 6f 6b 7d 0a 20 20   }.    } {ok}.  
2ab0: 0a 20 20 20 20 63 61 74 63 68 20 7b 20 64 62 20  .    catch { db 
2ac0: 63 6c 6f 73 65 20 7d 0a 20 20 20 20 66 6f 72 63  close }.    forc
2ad0: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20  edelete test.db 
2ae0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
2af0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
2b00: 65 73 74 2e 64 62 0a 20 20 20 20 64 6f 5f 74 65  est.db.    do_te
2b10: 73 74 20 63 72 61 73 68 38 2d 35 2e 24 69 2e 32  st crash8-5.$i.2
2b20: 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   {.      execsql
2b30: 20 7b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d   {.        PRAGM
2b40: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
2b50: 30 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  0;.        CREAT
2b60: 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52 49  E TABLE t1(x PRI
2b70: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 20  MARY KEY);.     
2b80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2b90: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
2ba0: 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 20  lob(900));.     
2bb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2bc0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
2bd0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
2be0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
2bf0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2c00: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
2c10: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
2c20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2c30: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
2c40: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(900) FROM t1;.
2c50: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2c60: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
2c70: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
2c80: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 49  OM t1;.        I
2c90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2ca0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
2cb0: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  900) FROM t1;.  
2cc0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2cd0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
2ce0: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
2cf0: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
2d00: 20 36 34 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   64 rows */.    
2d10: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2d20: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
2d30: 45 54 20 78 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f  ET x = randomblo
2d40: 62 28 39 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a  b(900);.      }.
2d50: 20 20 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74        forcedelet
2d60: 65 20 74 65 73 74 58 2e 64 62 20 74 65 73 74 58  e testX.db testX
2d70: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74  .db-journal test
2d80: 58 2e 64 62 2d 77 61 6c 0a 20 20 20 20 20 20 66  X.db-wal.      f
2d90: 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62  orcecopy test.db
2da0: 20 74 65 73 74 58 2e 64 62 0a 20 20 20 20 20 20   testX.db.      
2db0: 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64  forcecopy test.d
2dc0: 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 58 2e  b-journal testX.
2dd0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  db-journal.     
2de0: 20 64 62 20 63 6c 6f 73 65 0a 0a 20 20 20 20 20   db close..     
2df0: 20 63 72 61 73 68 73 71 6c 20 2d 66 69 6c 65 20   crashsql -file 
2e00: 74 65 73 74 2e 64 62 20 2d 64 65 6c 61 79 20 5b  test.db -delay [
2e10: 65 78 70 72 20 28 24 3a 3a 69 25 32 29 20 2b 20  expr ($::i%2) + 
2e20: 31 5d 20 7b 0a 20 20 20 20 20 20 20 20 53 45 4c  1] {.        SEL
2e30: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
2e40: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20 20  e_master;.      
2e50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2e60: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
2e70: 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 20 20  ob(900));.      
2e80: 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
2e90: 20 64 62 32 20 74 65 73 74 58 2e 64 62 0a 20 20   db2 testX.db.  
2ea0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52      execsql { PR
2eb0: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
2ec0: 68 65 63 6b 20 7d 20 64 62 32 0a 20 20 20 20 7d  heck } db2.    }
2ed0: 20 7b 6f 6b 7d 0a 20 20 7d 0a 20 20 63 61 74 63   {ok}.  }.  catc
2ee0: 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 7d 0a  h {db2 close}.}.
2ef0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.