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

Artifact a63907617d8e74fb54b4bff23eca8a4435625245:


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 64 6f 5f 6e 6f 74 5f 75 73  turn.}.do_not_us
0300: 65 5f 63 6f 64 65 63 0a 0a 64 6f 5f 74 65 73 74  e_codec..do_test
0310: 20 63 72 61 73 68 38 2d 31 2e 31 20 7b 0a 20 20   crash8-1.1 {.  
0320: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
0330: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
0340: 3d 4f 46 46 3b 0a 20 20 20 20 43 52 45 41 54 45  =OFF;.    CREATE
0350: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
0360: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
0370: 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 29  X i1 ON t1(a, b)
0380: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0390: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72  O t1 VALUES(1, r
03a0: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
03b0: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
03c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
03d0: 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30   randstr(1000,10
03e0: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
03f0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0400: 33 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c  3, randstr(1000,
0410: 31 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  1000));.    INSE
0420: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0430: 53 28 34 2c 20 72 61 6e 64 73 74 72 28 31 30 30  S(4, randstr(100
0440: 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20 49 4e  0,1000));.    IN
0450: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0460: 55 45 53 28 35 2c 20 72 61 6e 64 73 74 72 28 31  UES(5, randstr(1
0470: 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 20 20  000,1000));.    
0480: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0490: 41 4c 55 45 53 28 36 2c 20 72 61 6e 64 73 74 72  ALUES(6, randstr
04a0: 28 31 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20  (1000,1000));.  
04b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
04c0: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  2(a, b);.    CRE
04d0: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
04e0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
04f0: 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20  ABLE t4(a, b);. 
0500: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0510: 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t5(a, b);.    CR
0520: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c  EATE TABLE t6(a,
0530: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
0540: 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a  TABLE t7(a, b);.
0550: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0560: 20 74 38 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t8(a, b);.    C
0570: 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 61  REATE TABLE t9(a
0580: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
0590: 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20 62 29   TABLE t10(a, b)
05a0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  ;.    PRAGMA int
05b0: 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 7d  egrity_check.  }
05c0: 0a 7d 20 7b 6f 6b 7d 0a 0a 0a 23 20 50 6f 74 65  .} {ok}...# Pote
05d0: 6e 74 69 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  ntial corruption
05e0: 20 73 63 65 6e 61 72 69 6f 20 31 2e 20 41 20 73   scenario 1. A s
05f0: 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 6f 70  econd process op
0600: 65 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ens the database
0610: 20 0a 23 20 61 6e 64 20 6d 6f 64 69 66 69 65 73   .# and modifies
0620: 20 61 20 6c 61 72 67 65 20 70 6f 72 74 69 6f 6e   a large portion
0630: 20 6f 66 20 69 74 2e 20 49 74 20 74 68 65 6e 20   of it. It then 
0640: 6f 70 65 6e 73 20 61 20 73 65 63 6f 6e 64 20 74  opens a second t
0650: 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 61 6e 64  ransaction.# and
0660: 20 6d 6f 64 69 66 69 65 73 20 61 20 73 6d 61 6c   modifies a smal
0670: 6c 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  l part of the da
0680: 74 61 62 61 73 65 2c 20 62 75 74 20 63 72 61 73  tabase, but cras
0690: 68 65 73 20 62 65 66 6f 72 65 20 69 74 20 63 6f  hes before it co
06a0: 6d 6d 69 74 73 0a 23 20 74 68 65 20 74 72 61 6e  mmits.# the tran
06b0: 73 61 63 74 69 6f 6e 2e 20 0a 23 0a 23 20 57 68  saction. .#.# Wh
06c0: 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 72 6f  en the first pro
06d0: 63 65 73 73 20 61 63 63 65 73 73 65 64 20 74 68  cess accessed th
06e0: 65 20 64 61 74 61 62 61 73 65 20 61 67 61 69 6e  e database again
06f0: 2c 20 69 74 20 77 61 73 20 72 6f 6c 6c 69 6e 67  , it was rolling
0700: 20 62 61 63 6b 0a 23 20 74 68 65 20 61 62 6f 72   back.# the abor
0710: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ted transaction,
0720: 20 62 75 74 20 77 61 73 20 6e 6f 74 20 70 75 72   but was not pur
0730: 67 69 6e 67 20 69 74 73 20 69 6e 2d 6d 65 6d 6f  ging its in-memo
0740: 72 79 20 63 61 63 68 65 20 28 77 68 69 63 68 0a  ry cache (which.
0750: 23 20 77 61 73 20 6c 6f 61 64 65 64 20 62 65 66  # was loaded bef
0760: 6f 72 65 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ore the second p
0770: 72 6f 63 65 73 73 20 6d 61 64 65 20 69 74 73 20  rocess made its 
0780: 66 69 72 73 74 2c 20 73 75 63 63 65 73 73 66 75  first, successfu
0790: 6c 2c 20 0a 23 20 6d 6f 64 69 66 69 63 61 74 69  l, .# modificati
07a0: 6f 6e 29 2e 20 50 72 6f 64 75 63 69 6e 67 20 61  on). Producing a
07b0: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
07c0: 61 63 68 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ache..#.do_test 
07d0: 63 72 61 73 68 38 2d 31 2e 32 20 7b 0a 20 20 63  crash8-1.2 {.  c
07e0: 72 61 73 68 73 71 6c 20 2d 64 65 6c 61 79 20 32  rashsql -delay 2
07f0: 20 2d 66 69 6c 65 20 74 65 73 74 2e 64 62 20 7b   -file test.db {
0800: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
0810: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
0820: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
0830: 20 3d 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c   = randstr(1000,
0840: 31 30 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52  1000);.    INSER
0850: 54 20 49 4e 54 4f 20 74 39 20 56 41 4c 55 45 53  T INTO t9 VALUES
0860: 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 31  (1, 2);.  }.} {1
0870: 20 7b 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20   {child process 
0880: 65 78 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c 6c  exited abnormall
0890: 79 7d 7d 0a 64 6f 5f 74 65 73 74 20 63 72 61 73  y}}.do_test cras
08a0: 68 38 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  h8-1.3 {.  execs
08b0: 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67  ql {PRAGMA integ
08c0: 72 69 74 79 5f 63 68 65 63 6b 7d 0a 7d 20 7b 6f  rity_check}.} {o
08d0: 6b 7d 0a 0a 23 20 50 6f 74 65 6e 74 69 61 6c 20  k}..# Potential 
08e0: 63 6f 72 72 75 70 74 69 6f 6e 20 73 63 65 6e 61  corruption scena
08f0: 72 69 6f 20 32 2e 20 54 68 65 20 73 65 63 6f 6e  rio 2. The secon
0900: 64 20 70 72 6f 63 65 73 73 2c 20 6f 70 65 72 61  d process, opera
0910: 74 69 6e 67 20 69 6e 0a 23 20 70 65 72 73 69 73  ting in.# persis
0920: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
0930: 65 2c 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65  e, makes a large
0940: 20 63 68 61 6e 67 65 20 74 6f 20 74 68 65 20 64   change to the d
0950: 61 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20 77  atabase file.# w
0960: 69 74 68 20 61 20 73 6d 61 6c 6c 20 69 6e 2d 6d  ith a small in-m
0970: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 53 75 63  emory cache. Suc
0980: 68 20 74 68 61 74 20 6d 6f 72 65 20 74 68 61 6e  h that more than
0990: 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   one journal-hea
09a0: 64 65 72 0a 23 20 77 61 73 20 77 72 69 74 74 65  der.# was writte
09b0: 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 49  n to the file. I
09c0: 74 20 74 68 65 6e 20 6f 70 65 6e 73 20 61 20 73  t then opens a s
09d0: 65 63 6f 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  econd transactio
09e0: 6e 20 61 6e 64 20 6d 61 6b 65 73 0a 23 20 61 20  n and makes.# a 
09f0: 73 6d 61 6c 6c 65 72 20 63 68 61 6e 67 65 20 74  smaller change t
0a00: 68 61 74 20 72 65 71 75 69 72 65 73 20 6f 6e 6c  hat requires onl
0a10: 79 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  y a single journ
0a20: 61 6c 2d 68 65 61 64 65 72 20 74 6f 20 62 65 0a  al-header to be.
0a30: 23 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  # written to the
0a40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
0a50: 68 65 20 73 65 63 6f 6e 64 20 63 68 61 6e 67 65  he second change
0a60: 20 69 73 20 73 75 63 68 20 74 68 61 74 20 74 68   is such that th
0a70: 65 20 0a 23 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  e .# journal con
0a80: 74 65 6e 74 20 77 72 69 74 74 65 6e 20 74 6f 20  tent written to 
0a90: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a  the persistent j
0aa0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 61 63  ournal file exac
0ab0: 74 6c 79 20 6f 76 65 72 77 72 69 74 65 73 0a 23  tly overwrites.#
0ac0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
0ad0: 61 6c 2d 68 65 61 64 65 72 20 61 6e 64 20 73 65  al-header and se
0ae0: 74 20 6f 66 20 73 75 62 73 65 71 75 65 6e 74 20  t of subsequent 
0af0: 72 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20  records written 
0b00: 62 79 20 74 68 65 0a 23 20 66 69 72 73 74 2c 20  by the.# first, 
0b10: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 68 61 6e  successful, chan
0b20: 67 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70  ge. The second p
0b30: 72 6f 63 65 73 73 20 63 72 61 73 68 65 73 20 62  rocess crashes b
0b40: 65 66 6f 72 65 20 69 74 20 63 61 6e 0a 23 20 63  efore it can.# c
0b50: 6f 6d 6d 69 74 20 69 74 73 20 73 65 63 6f 6e 64  ommit its second
0b60: 20 63 68 61 6e 67 65 2e 0a 23 0a 23 20 57 68 65   change..#.# Whe
0b70: 6e 20 74 68 65 20 66 69 72 73 74 20 70 72 6f 63  n the first proc
0b80: 65 73 73 20 61 63 63 65 73 73 65 64 20 74 68 65  ess accessed the
0b90: 20 64 61 74 61 62 61 73 65 20 61 67 61 69 6e 2c   database again,
0ba0: 20 69 74 20 77 61 73 20 72 6f 6c 6c 69 6e 67 20   it was rolling 
0bb0: 62 61 63 6b 0a 23 20 74 68 65 20 73 65 63 6f 6e  back.# the secon
0bc0: 64 20 61 62 6f 72 74 65 64 20 74 72 61 6e 73 61  d aborted transa
0bd0: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 6e 74  ction, then cont
0be0: 69 6e 75 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  inuing to rollba
0bf0: 63 6b 20 74 68 65 20 73 65 63 6f 6e 64 0a 23 20  ck the second.# 
0c00: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 6a  and subsequent j
0c10: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 73 20 77  ournal-headers w
0c20: 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 66 69  ritten by the fi
0c30: 72 73 74 2c 20 73 75 63 63 65 73 73 66 75 6c 2c  rst, successful,
0c40: 20 63 68 61 6e 67 65 2e 0a 23 20 44 61 74 61 62   change..# Datab
0c50: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
0c60: 23 0a 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38  #.do_test crash8
0c70: 2e 32 2e 31 20 7b 0a 20 20 63 72 61 73 68 73 71  .2.1 {.  crashsq
0c80: 6c 20 2d 64 65 6c 61 79 20 32 20 2d 66 69 6c 65  l -delay 2 -file
0c90: 20 74 65 73 74 2e 64 62 20 7b 0a 20 20 20 20 50   test.db {.    P
0ca0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
0cb0: 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20  de = persist;.  
0cc0: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
0cd0: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 55 50  ize = 10;.    UP
0ce0: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
0cf0: 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30  randstr(1000,100
0d00: 30 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  0);.    PRAGMA c
0d10: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 30 3b  ache_size = 100;
0d20: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
0d30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
0d40: 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
0d50: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
0d60: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
0d70: 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 20 20  a', 'b');.      
0d80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
0d90: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
0da0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0db0: 54 4f 20 74 35 20 56 41 4c 55 45 53 28 27 61 27  TO t5 VALUES('a'
0dc0: 2c 20 27 62 27 29 3b 0a 20 20 20 20 20 20 49 4e  , 'b');.      IN
0dd0: 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c  SERT INTO t6 VAL
0de0: 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
0df0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0e00: 20 74 37 20 56 41 4c 55 45 53 28 27 61 27 2c 20   t7 VALUES('a', 
0e10: 27 62 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  'b');.      INSE
0e20: 52 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45  RT INTO t8 VALUE
0e30: 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20  S('a', 'b');.   
0e40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0e50: 39 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  9 VALUES('a', 'b
0e60: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
0e70: 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53   INTO t10 VALUES
0e80: 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
0e90: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 31  COMMIT;.  }.} {1
0ea0: 20 7b 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20   {child process 
0eb0: 65 78 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c 6c  exited abnormall
0ec0: 79 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 63 72 61  y}}..do_test cra
0ed0: 73 68 38 2d 32 2e 33 20 7b 0a 20 20 65 78 65 63  sh8-2.3 {.  exec
0ee0: 73 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65  sql {PRAGMA inte
0ef0: 67 72 69 74 79 5f 63 68 65 63 6b 7d 0a 7d 20 7b  grity_check}.} {
0f00: 6f 6b 7d 0a 0a 70 72 6f 63 20 72 65 61 64 5f 66  ok}..proc read_f
0f10: 69 6c 65 20 7b 7a 46 69 6c 65 7d 20 7b 0a 20 20  ile {zFile} {.  
0f20: 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 7a 46  set fd [open $zF
0f30: 69 6c 65 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72  ile].  fconfigur
0f40: 65 20 24 66 64 20 2d 74 72 61 6e 73 6c 61 74 69  e $fd -translati
0f50: 6f 6e 20 62 69 6e 61 72 79 20 0a 20 20 73 65 74  on binary .  set
0f60: 20 7a 44 61 74 61 20 5b 72 65 61 64 20 24 66 64   zData [read $fd
0f70: 5d 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20  ].  close $fd.  
0f80: 72 65 74 75 72 6e 20 24 7a 44 61 74 61 0a 7d 0a  return $zData.}.
0f90: 70 72 6f 63 20 77 72 69 74 65 5f 66 69 6c 65 20  proc write_file 
0fa0: 7b 7a 46 69 6c 65 20 7a 44 61 74 61 7d 20 7b 0a  {zFile zData} {.
0fb0: 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 24    set fd [open $
0fc0: 7a 46 69 6c 65 20 77 5d 0a 20 20 66 63 6f 6e 66  zFile w].  fconf
0fd0: 69 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e 73  igure $fd -trans
0fe0: 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 0a 20  lation binary . 
0ff0: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
1000: 20 24 66 64 20 24 7a 44 61 74 61 0a 20 20 63 6c   $fd $zData.  cl
1010: 6f 73 65 20 24 66 64 0a 7d 0a 0a 23 20 54 68 65  ose $fd.}..# The
1020: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
1030: 20 63 68 65 63 6b 20 74 68 61 74 20 53 51 4c 69   check that SQLi
1040: 74 65 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  te will not roll
1050: 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
1060: 6e 61 6c 0a 23 20 66 69 6c 65 20 69 66 20 74 68  nal.# file if th
1070: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  e sector-size fi
1080: 65 6c 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  eld in the first
1090: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
10a0: 61 64 65 72 20 69 73 0a 23 20 73 75 73 70 65 63  ader is.# suspec
10b0: 74 2e 20 44 65 66 69 6e 69 74 69 6f 6e 20 6f 66  t. Definition of
10c0: 20 73 75 73 70 65 63 74 3a 0a 23 20 0a 23 20 20   suspect:.# .#  
10d0: 20 20 61 29 20 4e 6f 74 20 61 20 70 6f 77 65 72    a) Not a power
10e0: 20 6f 66 20 32 2c 20 6f 72 20 20 20 20 20 20 20   of 2, or       
10f0: 20 20 20 20 20 20 20 20 20 28 63 72 61 73 68 38           (crash8
1100: 2d 33 2e 35 29 0a 23 20 20 20 20 62 29 20 47 72  -3.5).#    b) Gr
1110: 65 61 74 65 72 20 74 68 61 6e 20 30 78 30 31 30  eater than 0x010
1120: 30 30 30 30 30 20 28 31 36 4d 42 29 2c 20 6f 72  00000 (16MB), or
1130: 20 20 28 63 72 61 73 68 38 2d 33 2e 36 29 0a 23    (crash8-3.6).#
1140: 20 20 20 20 63 29 20 4c 65 73 73 20 74 68 61 6e      c) Less than
1150: 20 35 31 32 2e 20 20 20 20 20 20 20 20 20 20 20   512.           
1160: 20 20 20 20 20 20 20 20 20 20 20 28 63 72 61 73             (cras
1170: 68 38 2d 33 2e 37 29 0a 23 0a 23 20 41 6c 73 6f  h8-3.7).#.# Also
1180: 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
1190: 65 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 62  e will not rollb
11a0: 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
11b0: 6c 20 66 69 6c 65 20 77 69 74 68 20 61 0a 23 20  l file with a.# 
11c0: 73 75 73 70 65 63 74 20 70 61 67 65 2d 73 69 7a  suspect page-siz
11d0: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
11e0: 22 73 75 73 70 65 63 74 22 20 6d 65 61 6e 73 3a  "suspect" means:
11f0: 0a 23 20 0a 23 20 20 20 20 61 29 20 4e 6f 74 20  .# .#    a) Not 
1200: 61 20 70 6f 77 65 72 20 6f 66 20 32 2c 20 6f 72  a power of 2, or
1210: 0a 23 20 20 20 20 62 29 20 4c 65 73 73 20 74 68  .#    b) Less th
1220: 61 6e 20 35 31 32 2c 20 6f 72 0a 23 20 20 20 20  an 512, or.#    
1230: 63 29 20 47 72 65 61 74 65 72 20 74 68 61 6e 20  c) Greater than 
1240: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
1250: 53 49 5a 45 0a 23 0a 64 6f 5f 74 65 73 74 20 63  SIZE.#.do_test c
1260: 72 61 73 68 38 2d 33 2e 31 20 7b 0a 20 20 6c 69  rash8-3.1 {.  li
1270: 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  st [file exists 
1280: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 61 6c 5d 20  test.db-joural] 
1290: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73  [file exists tes
12a0: 74 2e 64 62 5d 0a 7d 20 7b 30 20 31 7d 0a 64 6f  t.db].} {0 1}.do
12b0: 5f 74 65 73 74 20 63 72 61 73 68 38 2d 33 2e 32  _test crash8-3.2
12c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
12d0: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
12e0: 6f 6e 6f 75 73 20 3d 20 6f 66 66 3b 0a 20 20 20  onous = off;.   
12f0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 44 45 4c 45   BEGIN;.    DELE
1300: 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  TE FROM t1;.    
1310: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1320: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
1330: 30 7d 0a 64 6f 5f 74 65 73 74 20 63 72 61 73 68  0}.do_test crash
1340: 38 2d 33 2e 33 20 7b 0a 20 20 73 65 74 20 7a 4a  8-3.3 {.  set zJ
1350: 6f 75 72 6e 61 6c 20 5b 72 65 61 64 5f 66 69 6c  ournal [read_fil
1360: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
1370: 6c 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  l].  execsql { .
1380: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
1390: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
13a0: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
13b0: 30 7d 0a 64 6f 5f 74 65 73 74 20 63 72 61 73 68  0}.do_test crash
13c0: 38 2d 33 2e 34 20 7b 0a 20 20 62 69 6e 61 72 79  8-3.4 {.  binary
13d0: 20 73 63 61 6e 20 5b 73 74 72 69 6e 67 20 72 61   scan [string ra
13e0: 6e 67 65 20 24 7a 4a 6f 75 72 6e 61 6c 20 32 30  nge $zJournal 20
13f0: 20 32 33 5d 20 49 20 6e 53 65 63 74 6f 72 0a 20   23] I nSector. 
1400: 20 73 65 74 20 6e 53 65 63 74 6f 72 0a 7d 20 7b   set nSector.} {
1410: 35 31 32 7d 0a 0a 64 6f 5f 74 65 73 74 20 63 72  512}..do_test cr
1420: 61 73 68 38 2d 33 2e 35 20 7b 0a 20 20 73 65 74  ash8-3.5 {.  set
1430: 20 7a 4a 6f 75 72 6e 61 6c 32 20 5b 73 74 72 69   zJournal2 [stri
1440: 6e 67 20 72 65 70 6c 61 63 65 20 24 7a 4a 6f 75  ng replace $zJou
1450: 72 6e 61 6c 20 32 30 20 32 33 20 5b 62 69 6e 61  rnal 20 23 [bina
1460: 72 79 20 66 6f 72 6d 61 74 20 49 20 35 31 33 5d  ry format I 513]
1470: 5d 0a 20 20 77 72 69 74 65 5f 66 69 6c 65 20 74  ].  write_file t
1480: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 24  est.db-journal $
1490: 7a 4a 6f 75 72 6e 61 6c 32 0a 0a 20 20 65 78 65  zJournal2..  exe
14a0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45  csql { .    SELE
14b0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
14c0: 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   t1;.    PRAGMA 
14d0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
14e0: 20 20 7d 0a 7d 20 7b 30 20 6f 6b 7d 0a 64 6f 5f    }.} {0 ok}.do_
14f0: 74 65 73 74 20 63 72 61 73 68 38 2d 33 2e 36 20  test crash8-3.6 
1500: 7b 0a 20 20 73 65 74 20 7a 4a 6f 75 72 6e 61 6c  {.  set zJournal
1510: 32 20 5b 73 74 72 69 6e 67 20 72 65 70 6c 61 63  2 [string replac
1520: 65 20 24 7a 4a 6f 75 72 6e 61 6c 20 32 30 20 32  e $zJournal 20 2
1530: 33 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74  3 [binary format
1540: 20 49 20 30 78 32 30 30 30 30 30 30 5d 5d 0a 20   I 0x2000000]]. 
1550: 20 77 72 69 74 65 5f 66 69 6c 65 20 74 65 73 74   write_file test
1560: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 24 7a 4a 6f  .db-journal $zJo
1570: 75 72 6e 61 6c 32 0a 20 20 65 78 65 63 73 71 6c  urnal2.  execsql
1580: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63   { .    SELECT c
1590: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
15a0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
15b0: 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 7d 0a  grity_check.  }.
15c0: 7d 20 7b 30 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74  } {0 ok}.do_test
15d0: 20 63 72 61 73 68 38 2d 33 2e 37 20 7b 0a 20 20   crash8-3.7 {.  
15e0: 73 65 74 20 7a 4a 6f 75 72 6e 61 6c 32 20 5b 73  set zJournal2 [s
15f0: 74 72 69 6e 67 20 72 65 70 6c 61 63 65 20 24 7a  tring replace $z
1600: 4a 6f 75 72 6e 61 6c 20 32 30 20 32 33 20 5b 62  Journal 20 23 [b
1610: 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 20 32  inary format I 2
1620: 35 36 5d 5d 0a 20 20 77 72 69 74 65 5f 66 69 6c  56]].  write_fil
1630: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
1640: 6c 20 24 7a 4a 6f 75 72 6e 61 6c 32 0a 20 20 65  l $zJournal2.  e
1650: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 53 45  xecsql { .    SE
1660: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1670: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
1680: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
1690: 6b 0a 20 20 7d 0a 7d 20 7b 30 20 6f 6b 7d 0a 0a  k.  }.} {0 ok}..
16a0: 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38 2d 33  do_test crash8-3
16b0: 2e 38 20 7b 0a 20 20 73 65 74 20 7a 4a 6f 75 72  .8 {.  set zJour
16c0: 6e 61 6c 32 20 5b 73 74 72 69 6e 67 20 72 65 70  nal2 [string rep
16d0: 6c 61 63 65 20 24 7a 4a 6f 75 72 6e 61 6c 20 32  lace $zJournal 2
16e0: 34 20 32 37 20 5b 62 69 6e 61 72 79 20 66 6f 72  4 27 [binary for
16f0: 6d 61 74 20 49 20 35 31 33 5d 5d 0a 20 20 77 72  mat I 513]].  wr
1700: 69 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62  ite_file test.db
1710: 2d 6a 6f 75 72 6e 61 6c 20 24 7a 4a 6f 75 72 6e  -journal $zJourn
1720: 61 6c 32 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b  al2..  execsql {
1730: 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75   .    SELECT cou
1740: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
1750: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
1760: 69 74 79 5f 63 68 65 63 6b 0a 20 20 7d 0a 7d 20  ity_check.  }.} 
1770: 7b 30 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 63  {0 ok}.do_test c
1780: 72 61 73 68 38 2d 33 2e 39 20 7b 0a 20 20 73 65  rash8-3.9 {.  se
1790: 74 20 62 69 67 20 5b 65 78 70 72 20 24 53 51 4c  t big [expr $SQL
17a0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
17b0: 45 20 2a 20 32 5d 0a 20 20 73 65 74 20 7a 4a 6f  E * 2].  set zJo
17c0: 75 72 6e 61 6c 32 20 5b 73 74 72 69 6e 67 20 72  urnal2 [string r
17d0: 65 70 6c 61 63 65 20 24 7a 4a 6f 75 72 6e 61 6c  eplace $zJournal
17e0: 20 32 34 20 32 37 20 5b 62 69 6e 61 72 79 20 66   24 27 [binary f
17f0: 6f 72 6d 61 74 20 49 20 24 62 69 67 5d 5d 0a 20  ormat I $big]]. 
1800: 20 77 72 69 74 65 5f 66 69 6c 65 20 74 65 73 74   write_file test
1810: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 24 7a 4a 6f  .db-journal $zJo
1820: 75 72 6e 61 6c 32 0a 20 20 65 78 65 63 73 71 6c  urnal2.  execsql
1830: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63   { .    SELECT c
1840: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
1850: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
1860: 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 7d 0a  grity_check.  }.
1870: 7d 20 7b 30 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74  } {0 ok}.do_test
1880: 20 63 72 61 73 68 38 2d 33 2e 31 30 20 7b 0a 20   crash8-3.10 {. 
1890: 20 73 65 74 20 7a 4a 6f 75 72 6e 61 6c 32 20 5b   set zJournal2 [
18a0: 73 74 72 69 6e 67 20 72 65 70 6c 61 63 65 20 24  string replace $
18b0: 7a 4a 6f 75 72 6e 61 6c 20 32 34 20 32 37 20 5b  zJournal 24 27 [
18c0: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 20  binary format I 
18d0: 32 35 36 5d 5d 0a 20 20 77 72 69 74 65 5f 66 69  256]].  write_fi
18e0: 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  le test.db-journ
18f0: 61 6c 20 24 7a 4a 6f 75 72 6e 61 6c 32 0a 20 20  al $zJournal2.  
1900: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 53  execsql { .    S
1910: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1920: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
1930: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
1940: 63 6b 0a 20 20 7d 0a 7d 20 7b 30 20 6f 6b 7d 0a  ck.  }.} {0 ok}.
1950: 0a 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38 2d  .do_test crash8-
1960: 33 2e 31 31 20 7b 0a 20 20 73 65 74 20 66 64 20  3.11 {.  set fd 
1970: 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f  [open test.db-jo
1980: 75 72 6e 61 6c 20 77 5d 0a 20 20 66 63 6f 6e 66  urnal w].  fconf
1990: 69 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e 73  igure $fd -trans
19a0: 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 0a 20  lation binary . 
19b0: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
19c0: 20 24 66 64 20 24 7a 4a 6f 75 72 6e 61 6c 0a 20   $fd $zJournal. 
19d0: 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 65 78 65   close $fd.  exe
19e0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45  csql { .    SELE
19f0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1a00: 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   t1;.    PRAGMA 
1a10: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a  integrity_check.
1a20: 20 20 7d 0a 7d 20 7b 36 20 6f 6b 7d 0a 0a 0a 23    }.} {6 ok}...#
1a30: 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e   If a connection
1a40: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 70 65 72 73   running in pers
1a50: 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
1a60: 6f 64 65 20 69 73 20 70 61 72 74 20 6f 66 20 61  ode is part of a
1a70: 20 0a 23 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74   .# multi-file t
1a80: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
1a90: 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
1aa0: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
1ab0: 61 6c 20 6e 61 6d 65 0a 23 20 61 70 70 65 6e 64  al name.# append
1ac0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
1ad0: 6c 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20  l file contents 
1ae0: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
1af0: 74 20 69 73 20 6c 6f 63 61 74 65 64 0a 23 20 61  t is located.# a
1b00: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1b10: 20 70 68 79 73 69 63 61 6c 20 6a 6f 75 72 6e 61   physical journa
1b20: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  l file. If there
1b30: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 0a 23   was already a.#
1b40: 20 6c 61 72 67 65 20 6a 6f 75 72 6e 61 6c 20 66   large journal f
1b50: 69 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74  ile allocated at
1b60: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1b70: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  e transaction, t
1b80: 68 69 73 0a 23 20 6d 61 79 20 6d 65 61 6e 20 74  his.# may mean t
1b90: 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 66 69  runcating the fi
1ba0: 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6d  le so that the m
1bb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
1bc0: 6d 65 20 72 65 61 6c 6c 79 0a 23 20 69 73 20 61  me really.# is a
1bd0: 74 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 65  t the physical e
1be0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  nd of the file..
1bf0: 23 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  #.# This block o
1c00: 66 20 74 65 73 74 73 20 74 65 73 74 20 74 68 61  f tests test tha
1c10: 74 20 53 51 4c 69 74 65 20 63 6f 72 72 65 63 74  t SQLite correct
1c20: 6c 79 20 74 72 75 6e 63 61 74 65 73 20 73 75 63  ly truncates suc
1c30: 68 0a 23 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  h.# journal file
1c40: 73 2c 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  s, and that the 
1c50: 72 65 73 75 6c 74 73 20 62 65 68 61 76 65 20 63  results behave c
1c60: 6f 72 72 65 63 74 6c 79 20 69 66 20 61 20 68 6f  orrectly if a ho
1c70: 74 2d 6a 6f 75 72 6e 61 6c 0a 23 20 72 6f 6c 6c  t-journal.# roll
1c80: 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 23 0a 69  back occurs..#.i
1c90: 66 63 61 70 61 62 6c 65 20 70 72 61 67 6d 61 20  fcapable pragma 
1ca0: 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 66  {.  reset_db.  f
1cb0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32  orcedelete test2
1cc0: 2e 64 62 0a 0a 20 20 64 6f 5f 74 65 73 74 20 63  .db..  do_test c
1cd0: 72 61 73 68 38 2d 34 2e 31 20 7b 0a 20 20 20 20  rash8-4.1 {.    
1ce0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
1cf0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
1d00: 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20  ode = persist;. 
1d10: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
1d20: 45 20 61 62 28 61 2c 20 62 29 3b 0a 20 20 20 20  E ab(a, b);.    
1d30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
1d40: 20 56 41 4c 55 45 53 28 30 2c 20 27 61 62 63 27   VALUES(0, 'abc'
1d50: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
1d60: 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 28 31  INTO ab VALUES(1
1d70: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 49  , NULL);.      I
1d80: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56 41  NSERT INTO ab VA
1d90: 4c 55 45 53 28 32 2c 20 4e 55 4c 4c 29 3b 0a 20  LUES(2, NULL);. 
1da0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1db0: 20 61 62 20 56 41 4c 55 45 53 28 33 2c 20 4e 55   ab VALUES(3, NU
1dc0: 4c 4c 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  LL);.      INSER
1dd0: 54 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53  T INTO ab VALUES
1de0: 28 34 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  (4, NULL);.     
1df0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
1e00: 56 41 4c 55 45 53 28 35 2c 20 4e 55 4c 4c 29 3b  VALUES(5, NULL);
1e10: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1e20: 54 4f 20 61 62 20 56 41 4c 55 45 53 28 36 2c 20  TO ab VALUES(6, 
1e30: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 55 50 44  NULL);.      UPD
1e40: 41 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 72  ATE ab SET b = r
1e50: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
1e60: 29 3b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20  );.      ATTACH 
1e70: 27 74 65 73 74 32 2e 64 62 27 20 41 53 20 61 75  'test2.db' AS au
1e80: 78 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  x;.      PRAGMA 
1e90: 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  aux.journal_mode
1ea0: 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20   = persist;.    
1eb0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
1ec0: 75 78 2e 61 62 28 61 2c 20 62 29 3b 0a 20 20 20  ux.ab(a, b);.   
1ed0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
1ee0: 75 78 2e 61 62 20 53 45 4c 45 43 54 20 2a 20 46  ux.ab SELECT * F
1ef0: 52 4f 4d 20 6d 61 69 6e 2e 61 62 3b 0a 0a 20 20  ROM main.ab;..  
1f00: 20 20 20 20 55 50 44 41 54 45 20 61 75 78 2e 61      UPDATE aux.a
1f10: 62 20 53 45 54 20 62 20 3d 20 72 61 6e 64 73 74  b SET b = randst
1f20: 72 28 31 30 30 30 2c 31 30 30 30 29 20 57 48 45  r(1000,1000) WHE
1f30: 52 45 20 61 3e 3d 31 3b 0a 20 20 20 20 20 20 55  RE a>=1;.      U
1f40: 50 44 41 54 45 20 61 62 20 53 45 54 20 62 20 3d  PDATE ab SET b =
1f50: 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30   randstr(1000,10
1f60: 30 30 29 20 57 48 45 52 45 20 61 3e 3d 31 3b 0a  00) WHERE a>=1;.
1f70: 20 20 20 20 7d 0a 20 20 20 20 6c 69 73 74 20 5b      }.    list [
1f80: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
1f90: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5b 66 69  .db-journal] [fi
1fa0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 32 2e  le exists test2.
1fb0: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 0a 20 20 7d 20  db-journal].  } 
1fc0: 7b 31 20 31 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  {1 1}..  do_test
1fd0: 20 63 72 61 73 68 38 2d 34 2e 32 20 7b 0a 20 20   crash8-4.2 {.  
1fe0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1ff0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
2000: 20 55 50 44 41 54 45 20 61 75 78 2e 61 62 20 53   UPDATE aux.ab S
2010: 45 54 20 62 20 3d 20 27 64 65 66 27 20 57 48 45  ET b = 'def' WHE
2020: 52 45 20 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  RE a = 0;.      
2030: 20 20 55 50 44 41 54 45 20 6d 61 69 6e 2e 61 62    UPDATE main.ab
2040: 20 53 45 54 20 62 20 3d 20 27 64 65 66 27 20 57   SET b = 'def' W
2050: 48 45 52 45 20 61 20 3d 20 30 3b 0a 20 20 20 20  HERE a = 0;.    
2060: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a    COMMIT;.    }.
2070: 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73    } {}..  do_tes
2080: 74 20 63 72 61 73 68 38 2d 34 2e 33 20 7b 0a 20  t crash8-4.3 {. 
2090: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
20a0: 20 20 20 55 50 44 41 54 45 20 61 75 78 2e 61 62     UPDATE aux.ab
20b0: 20 53 45 54 20 62 20 3d 20 72 61 6e 64 73 74 72   SET b = randstr
20c0: 28 31 30 30 30 2c 31 30 30 30 29 20 57 48 45 52  (1000,1000) WHER
20d0: 45 20 61 3e 3d 31 3b 0a 20 20 20 20 20 20 55 50  E a>=1;.      UP
20e0: 44 41 54 45 20 61 62 20 53 45 54 20 62 20 3d 20  DATE ab SET b = 
20f0: 72 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30  randstr(1000,100
2100: 30 29 20 57 48 45 52 45 20 61 3e 3d 31 3b 0a 20  0) WHERE a>=1;. 
2110: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 73     }.  } {}..  s
2120: 65 74 20 63 6f 6e 74 65 6e 74 73 5f 6d 61 69 6e  et contents_main
2130: 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43   [db eval {SELEC
2140: 54 20 62 20 46 52 4f 4d 20 6d 61 69 6e 2e 61 62  T b FROM main.ab
2150: 20 57 48 45 52 45 20 61 20 3d 20 31 7d 5d 0a 20   WHERE a = 1}]. 
2160: 20 73 65 74 20 63 6f 6e 74 65 6e 74 73 5f 61 75   set contents_au
2170: 78 20 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c  x  [db eval {SEL
2180: 45 43 54 20 62 20 46 52 4f 4d 20 20 61 75 78 2e  ECT b FROM  aux.
2190: 61 62 20 57 48 45 52 45 20 61 20 3d 20 31 7d 5d  ab WHERE a = 1}]
21a0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 63 72 61 73  ..  do_test cras
21b0: 68 38 2d 34 2e 34 20 7b 0a 20 20 20 20 63 72 61  h8-4.4 {.    cra
21c0: 73 68 73 71 6c 20 2d 66 69 6c 65 20 74 65 73 74  shsql -file test
21d0: 32 2e 64 62 20 2d 64 65 6c 61 79 20 31 20 7b 0a  2.db -delay 1 {.
21e0: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65        ATTACH 'te
21f0: 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a  st2.db' AS aux;.
2200: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
2210: 20 20 20 20 20 55 50 44 41 54 45 20 61 75 78 2e       UPDATE aux.
2220: 61 62 20 53 45 54 20 62 20 3d 20 27 67 68 69 27  ab SET b = 'ghi'
2230: 20 57 48 45 52 45 20 61 20 3d 20 30 3b 0a 20 20   WHERE a = 0;.  
2240: 20 20 20 20 20 20 55 50 44 41 54 45 20 6d 61 69        UPDATE mai
2250: 6e 2e 61 62 20 53 45 54 20 62 20 3d 20 27 67 68  n.ab SET b = 'gh
2260: 69 27 20 57 48 45 52 45 20 61 20 3d 20 30 3b 0a  i' WHERE a = 0;.
2270: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
2280: 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 63 68 69 6c    }.  } {1 {chil
2290: 64 20 70 72 6f 63 65 73 73 20 65 78 69 74 65 64  d process exited
22a0: 20 61 62 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 0a 20   abnormally}}.. 
22b0: 20 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38 2d   do_test crash8-
22c0: 34 2e 35 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b  4.5 {.    list [
22d0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
22e0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5b 66 69  .db-journal] [fi
22f0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 32 2e  le exists test2.
2300: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 0a 20 20 7d 20  db-journal].  } 
2310: 7b 31 20 31 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  {1 1}..  do_test
2320: 20 63 72 61 73 68 38 2d 34 2e 36 20 7b 0a 20 20   crash8-4.6 {.  
2330: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2340: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
2350: 6d 61 69 6e 2e 61 62 20 57 48 45 52 45 20 61 20  main.ab WHERE a 
2360: 3d 20 30 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  = 0;.      SELEC
2370: 54 20 62 20 46 52 4f 4d 20 61 75 78 2e 61 62 20  T b FROM aux.ab 
2380: 57 48 45 52 45 20 61 20 3d 20 30 3b 0a 20 20 20  WHERE a = 0;.   
2390: 20 7d 0a 20 20 7d 20 7b 64 65 66 20 64 65 66 7d   }.  } {def def}
23a0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 63 72 61 73  ..  do_test cras
23b0: 68 38 2d 34 2e 37 20 7b 0a 20 20 20 20 63 72 61  h8-4.7 {.    cra
23c0: 73 68 73 71 6c 20 2d 66 69 6c 65 20 74 65 73 74  shsql -file test
23d0: 32 2e 64 62 20 2d 64 65 6c 61 79 20 31 20 7b 0a  2.db -delay 1 {.
23e0: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65        ATTACH 'te
23f0: 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a  st2.db' AS aux;.
2400: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
2410: 20 20 20 20 20 55 50 44 41 54 45 20 61 75 78 2e       UPDATE aux.
2420: 61 62 20 53 45 54 20 62 20 3d 20 27 6a 6b 6c 27  ab SET b = 'jkl'
2430: 20 57 48 45 52 45 20 61 20 3d 20 30 3b 0a 20 20   WHERE a = 0;.  
2440: 20 20 20 20 20 20 55 50 44 41 54 45 20 6d 61 69        UPDATE mai
2450: 6e 2e 61 62 20 53 45 54 20 62 20 3d 20 27 6a 6b  n.ab SET b = 'jk
2460: 6c 27 20 57 48 45 52 45 20 61 20 3d 20 30 3b 0a  l' WHERE a = 0;.
2470: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
2480: 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 63 68 69 6c    }.  } {1 {chil
2490: 64 20 70 72 6f 63 65 73 73 20 65 78 69 74 65 64  d process exited
24a0: 20 61 62 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 0a 20   abnormally}}.. 
24b0: 20 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38 2d   do_test crash8-
24c0: 34 2e 38 20 7b 0a 20 20 20 20 73 65 74 20 66 64  4.8 {.    set fd
24d0: 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a   [open test.db-j
24e0: 6f 75 72 6e 61 6c 5d 0a 20 20 20 20 66 63 6f 6e  ournal].    fcon
24f0: 66 69 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e  figure $fd -tran
2500: 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20  slation binary. 
2510: 20 20 20 73 65 65 6b 20 24 66 64 20 2d 31 36 20     seek $fd -16 
2520: 65 6e 64 0a 20 20 20 20 62 69 6e 61 72 79 20 73  end.    binary s
2530: 63 61 6e 20 5b 72 65 61 64 20 24 66 64 20 34 5d  can [read $fd 4]
2540: 20 49 20 6c 65 6e 0a 0a 20 20 20 20 73 65 65 6b   I len..    seek
2550: 20 24 66 64 20 5b 65 78 70 72 20 7b 2d 31 20 2a   $fd [expr {-1 *
2560: 20 28 24 6c 65 6e 20 2b 20 31 36 29 7d 5d 20 65   ($len + 16)}] e
2570: 6e 64 0a 20 20 20 20 73 65 74 20 7a 4d 61 73 74  nd.    set zMast
2580: 65 72 4a 6f 75 72 6e 61 6c 20 5b 72 65 61 64 20  erJournal [read 
2590: 24 66 64 20 24 6c 65 6e 5d 0a 20 20 20 20 63 6c  $fd $len].    cl
25a0: 6f 73 65 20 24 66 64 0a 0a 20 20 20 20 66 69 6c  ose $fd..    fil
25b0: 65 20 65 78 69 73 74 73 20 24 7a 4d 61 73 74 65  e exists $zMaste
25c0: 72 4a 6f 75 72 6e 61 6c 0a 20 20 7d 20 7b 31 7d  rJournal.  } {1}
25d0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 63 72 61 73  ..  do_test cras
25e0: 68 38 2d 34 2e 39 20 7b 0a 20 20 20 20 65 78 65  h8-4.9 {.    exe
25f0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 62 20  csql { SELECT b 
2600: 46 52 4f 4d 20 61 75 78 2e 61 62 20 57 48 45 52  FROM aux.ab WHER
2610: 45 20 61 20 3d 20 30 20 7d 0a 20 20 7d 20 7b 64  E a = 0 }.  } {d
2620: 65 66 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 63  ef}..  do_test c
2630: 72 61 73 68 38 2d 34 2e 31 30 20 7b 0a 20 20 20  rash8-4.10 {.   
2640: 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 24 7a 4d   delete_file $zM
2650: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 0a 20 20 20  asterJournal.   
2660: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
2670: 54 20 62 20 46 52 4f 4d 20 6d 61 69 6e 2e 61 62  T b FROM main.ab
2680: 20 57 48 45 52 45 20 61 20 3d 20 30 20 7d 0a 20   WHERE a = 0 }. 
2690: 20 7d 20 7b 6a 6b 6c 7d 0a 7d 0a 0a 23 0a 23 20   } {jkl}.}..#.# 
26a0: 53 69 6e 63 65 20 74 68 65 20 66 6f 6c 6c 6f 77  Since the follow
26b0: 69 6e 67 20 74 65 73 74 73 20 28 63 72 61 73 68  ing tests (crash
26c0: 38 2d 35 2e 2a 29 20 72 65 6c 79 20 75 70 6f 6e  8-5.*) rely upon
26d0: 20 62 65 69 6e 67 20 61 62 6c 65 0a 23 20 74 6f   being able.# to
26e0: 20 63 6f 70 79 20 61 20 66 69 6c 65 20 77 68 69   copy a file whi
26f0: 6c 65 20 6f 70 65 6e 2c 20 74 68 65 79 20 77 69  le open, they wi
2700: 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 57  ll not work on W
2710: 69 6e 64 6f 77 73 2e 0a 23 0a 69 66 20 7b 24 3a  indows..#.if {$:
2720: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c  :tcl_platform(pl
2730: 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d  atform)=="unix"}
2740: 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20   {.  for {set i 
2750: 31 7d 20 7b 24 69 20 3c 20 31 30 7d 20 7b 69 6e  1} {$i < 10} {in
2760: 63 72 20 69 7d 20 7b 0a 20 20 20 20 63 61 74 63  cr i} {.    catc
2770: 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20  h { db close }. 
2780: 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74     forcedelete t
2790: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a  est.db test.db-j
27a0: 6f 75 72 6e 61 6c 0a 20 20 20 20 73 71 6c 69 74  ournal.    sqlit
27b0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
27c0: 20 20 64 6f 5f 74 65 73 74 20 63 72 61 73 68 38    do_test crash8
27d0: 2d 35 2e 24 69 2e 31 20 7b 0a 20 20 20 20 20 20  -5.$i.1 {.      
27e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
27f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2800: 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  1(x PRIMARY KEY)
2810: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
2820: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2830: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
2840: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
2850: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2860: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
2870: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
2880: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2890: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
28a0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(900) FROM t1;.
28b0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
28c0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
28d0: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
28e0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 49  OM t1;.        I
28f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2900: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
2910: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  900) FROM t1;.  
2920: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2930: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
2940: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
2950: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 49 4e 53   t1;.        INS
2960: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
2970: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
2980: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
2990: 20 20 20 20 20 2f 2a 20 36 34 20 72 6f 77 73 20       /* 64 rows 
29a0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
29b0: 20 63 72 61 73 68 73 71 6c 20 2d 66 69 6c 65 20   crashsql -file 
29c0: 74 65 73 74 2e 64 62 20 2d 64 65 6c 61 79 20 5b  test.db -delay [
29d0: 65 78 70 72 20 28 24 3a 3a 69 25 32 29 20 2b 20  expr ($::i%2) + 
29e0: 31 5d 20 7b 0a 20 20 20 20 20 20 20 20 50 52 41  1] {.        PRA
29f0: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
2a00: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 42 45 47   10;.        BEG
2a10: 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 55 50  IN;.          UP
2a20: 44 41 54 45 20 74 31 20 53 45 54 20 78 20 3d 20  DATE t1 SET x = 
2a30: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 3b  randomblob(900);
2a40: 0a 20 20 20 20 20 20 20 20 52 4f 4c 4c 42 41 43  .        ROLLBAC
2a50: 4b 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  K;.        INSER
2a60: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2a70: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29  (randomblob(900)
2a80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a90: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
2aa0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
2ab0: 6b 20 7d 0a 20 20 20 20 7d 20 7b 6f 6b 7d 0a 20  k }.    } {ok}. 
2ac0: 20 0a 20 20 20 20 63 61 74 63 68 20 7b 20 64 62   .    catch { db
2ad0: 20 63 6c 6f 73 65 20 7d 0a 20 20 20 20 66 6f 72   close }.    for
2ae0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
2af0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
2b00: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
2b10: 74 65 73 74 2e 64 62 0a 20 20 20 20 64 6f 5f 74  test.db.    do_t
2b20: 65 73 74 20 63 72 61 73 68 38 2d 35 2e 24 69 2e  est crash8-5.$i.
2b30: 32 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71  2 {.      execsq
2b40: 6c 20 7b 0a 20 20 20 20 20 20 20 20 50 52 41 47  l {.        PRAG
2b50: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
2b60: 31 30 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  10;.        CREA
2b70: 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52  TE TABLE t1(x PR
2b80: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
2b90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2ba0: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
2bb0: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
2bc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2bd0: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
2be0: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
2bf0: 31 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  1;.        INSER
2c00: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
2c10: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
2c20: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
2c30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2c40: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
2c50: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
2c60: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2c70: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
2c80: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
2c90: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20  ROM t1;.        
2ca0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2cb0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
2cc0: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (900) FROM t1;. 
2cd0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
2ce0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
2cf0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
2d00: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f  M t1;          /
2d10: 2a 20 36 34 20 72 6f 77 73 20 2a 2f 0a 20 20 20  * 64 rows */.   
2d20: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
2d30: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
2d40: 53 45 54 20 78 20 3d 20 72 61 6e 64 6f 6d 62 6c  SET x = randombl
2d50: 6f 62 28 39 30 30 29 3b 0a 20 20 20 20 20 20 7d  ob(900);.      }
2d60: 0a 20 20 20 20 20 20 66 6f 72 63 65 64 65 6c 65  .      forcedele
2d70: 74 65 20 74 65 73 74 58 2e 64 62 20 74 65 73 74  te testX.db test
2d80: 58 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73  X.db-journal tes
2d90: 74 58 2e 64 62 2d 77 61 6c 0a 20 20 20 20 20 20  tX.db-wal.      
2da0: 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64  forcecopy test.d
2db0: 62 20 74 65 73 74 58 2e 64 62 0a 20 20 20 20 20  b testX.db.     
2dc0: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e   forcecopy test.
2dd0: 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 58  db-journal testX
2de0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  .db-journal.    
2df0: 20 20 64 62 20 63 6c 6f 73 65 0a 0a 20 20 20 20    db close..    
2e00: 20 20 63 72 61 73 68 73 71 6c 20 2d 66 69 6c 65    crashsql -file
2e10: 20 74 65 73 74 2e 64 62 20 2d 64 65 6c 61 79 20   test.db -delay 
2e20: 5b 65 78 70 72 20 28 24 3a 3a 69 25 32 29 20 2b  [expr ($::i%2) +
2e30: 20 31 5d 20 7b 0a 20 20 20 20 20 20 20 20 53 45   1] {.        SE
2e40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
2e50: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20  te_master;.     
2e60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2e70: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
2e80: 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 20  lob(900));.     
2e90: 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
2ea0: 33 20 64 62 32 20 74 65 73 74 58 2e 64 62 0a 20  3 db2 testX.db. 
2eb0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50       execsql { P
2ec0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
2ed0: 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20 20 20  check } db2.    
2ee0: 7d 20 7b 6f 6b 7d 0a 20 20 7d 0a 20 20 63 61 74  } {ok}.  }.  cat
2ef0: 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 7d  ch {db2 close}.}
2f00: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.