/ Hex Artifact Content
Login

Artifact 4457436593be8c136f9148487c7dccd5e9013af2:


0000: 23 20 32 30 31 30 20 46 65 62 72 75 61 72 79 20  # 2010 February 
0010: 38 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  8.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an 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 2a 0a 23 20 54 68 69 73 20 66  *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73  ry.  The.# focus
01b0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   of this file is
01c0: 20 74 65 73 74 69 6e 67 20 74 68 65 20 6f 70 65   testing the ope
01d0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ration of the li
01e0: 62 72 61 72 79 20 77 68 65 6e 0a 23 20 72 65 63  brary when.# rec
01f0: 6f 76 65 72 69 6e 67 20 61 20 64 61 74 61 62 61  overing a databa
0200: 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 73  se following a s
0210: 69 6d 75 6c 61 74 65 64 20 73 79 73 74 65 6d 20  imulated system 
0220: 66 61 69 6c 75 72 65 20 69 6e 20 0a 23 20 22 50  failure in .# "P
0230: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
0240: 64 65 3d 57 41 4c 22 20 6d 6f 64 65 2e 0a 23 0a  de=WAL" mode..#.
0250: 0a 23 0a 23 20 54 68 65 73 65 20 61 72 65 20 27  .#.# These are '
0260: 77 61 72 6d 2d 62 6f 64 79 27 20 74 65 73 74 73  warm-body' tests
0270: 20 6f 66 20 64 61 74 61 62 61 73 65 20 72 65 63   of database rec
0280: 6f 76 65 72 79 20 75 73 65 64 20 77 68 69 6c 65  overy used while
0290: 20 64 65 76 65 6c 6f 70 69 6e 67 20 0a 23 20 74   developing .# t
02a0: 68 65 20 57 41 4c 20 63 6f 64 65 2e 20 54 68 65  he WAL code. The
02b0: 79 20 73 65 72 76 65 20 74 6f 20 70 72 6f 76 65  y serve to prove
02c0: 20 74 68 61 74 20 61 20 66 65 77 20 72 65 61 6c   that a few real
02d0: 6c 79 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  ly simple cases 
02e0: 77 6f 72 6b 3a 0a 23 0a 23 20 77 61 6c 63 72 61  work:.#.# walcra
02f0: 73 68 2d 31 2e 2a 3a 20 52 65 63 6f 76 65 72 20  sh-1.*: Recover 
0300: 61 20 64 61 74 61 62 61 73 65 2e 0a 23 20 77 61  a database..# wa
0310: 6c 63 72 61 73 68 2d 32 2e 2a 3a 20 52 65 63 6f  lcrash-2.*: Reco
0320: 76 65 72 20 61 20 64 61 74 61 62 61 73 65 20 77  ver a database w
0330: 68 65 72 65 20 74 68 65 20 66 61 69 6c 65 64 20  here the failed 
0340: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
0350: 6e 65 64 20 6d 6f 72 65 0a 23 20 20 20 20 20 20  ned more.#      
0360: 20 20 20 20 20 20 20 20 20 74 68 61 6e 20 6f 6e           than on
0370: 65 20 70 61 67 65 2e 0a 23 20 77 61 6c 63 72 61  e page..# walcra
0380: 73 68 2d 33 2e 2a 3a 20 52 65 63 6f 76 65 72 20  sh-3.*: Recover 
0390: 6d 75 6c 74 69 70 6c 65 20 64 61 74 61 62 61 73  multiple databas
03a0: 65 73 20 77 68 65 72 65 20 74 68 65 20 66 61 69  es where the fai
03b0: 6c 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  led transaction 
03c0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
03d0: 20 77 61 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c   was a multi-fil
03e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23  e transaction..#
03f0: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
0400: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0410: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
0420: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 69  dir/tester.tcl.i
0430: 66 63 61 70 61 62 6c 65 20 21 77 61 6c 20 7b 66  fcapable !wal {f
0440: 69 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65 74  inish_test ; ret
0450: 75 72 6e 20 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a  urn }..db close.
0460: 0a 73 65 74 20 73 65 65 64 20 30 0a 73 65 74 20  .set seed 0.set 
0470: 52 45 50 45 41 54 53 20 31 30 30 0a 0a 23 20 77  REPEATS 100..# w
0480: 61 6c 63 72 61 73 68 2d 31 2e 2a 0a 23 0a 66 6f  alcrash-1.*.#.fo
0490: 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 20  r {set i 1} {$i 
04a0: 3c 20 24 52 45 50 45 41 54 53 7d 20 7b 69 6e 63  < $REPEATS} {inc
04b0: 72 20 69 7d 20 7b 0a 20 20 66 6f 72 63 65 64 65  r i} {.  forcede
04c0: 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73  lete test.db tes
04d0: 74 2e 64 62 2d 77 61 6c 0a 20 20 64 6f 5f 74 65  t.db-wal.  do_te
04e0: 73 74 20 77 61 6c 63 72 61 73 68 2d 31 2e 24 69  st walcrash-1.$i
04f0: 2e 31 20 7b 0a 20 20 20 20 63 72 61 73 68 73 71  .1 {.    crashsq
0500: 6c 20 2d 64 65 6c 61 79 20 34 20 2d 66 69 6c 65  l -delay 4 -file
0510: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 2d 73 65   test.db-wal -se
0520: 65 64 20 5b 69 6e 63 72 20 73 65 65 64 5d 20 7b  ed [incr seed] {
0530: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
0540: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
0550: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
0560: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
0570: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0580: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 31 29   t1 VALUES(1, 1)
0590: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
05a0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
05b0: 20 33 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   3);.      INSER
05c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
05d0: 28 33 2c 20 36 29 3b 0a 20 20 20 20 7d 0a 20 20  (3, 6);.    }.  
05e0: 7d 20 7b 31 20 7b 63 68 69 6c 64 20 70 72 6f 63  } {1 {child proc
05f0: 65 73 73 20 65 78 69 74 65 64 20 61 62 6e 6f 72  ess exited abnor
0600: 6d 61 6c 6c 79 7d 7d 0a 20 20 64 6f 5f 74 65 73  mally}}.  do_tes
0610: 74 20 77 61 6c 63 72 61 73 68 2d 31 2e 24 69 2e  t walcrash-1.$i.
0620: 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  2 {.    sqlite3 
0630: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  db test.db.    e
0640: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0650: 73 75 6d 28 61 29 3d 3d 6d 61 78 28 62 29 20 46  sum(a)==max(b) F
0660: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 7d  ROM t1 }.  } {1}
0670: 0a 20 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  .  integrity_che
0680: 63 6b 20 77 61 6c 63 72 61 73 68 2d 31 2e 24 69  ck walcrash-1.$i
0690: 2e 33 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .3.  db close.  
06a0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72  .  do_test walcr
06b0: 61 73 68 2d 31 2e 24 69 2e 34 20 7b 0a 20 20 20  ash-1.$i.4 {.   
06c0: 20 63 72 61 73 68 73 71 6c 20 2d 64 65 6c 61 79   crashsql -delay
06d0: 20 32 20 2d 66 69 6c 65 20 74 65 73 74 2e 64 62   2 -file test.db
06e0: 2d 77 61 6c 20 2d 73 65 65 64 20 5b 69 6e 63 72  -wal -seed [incr
06f0: 20 73 65 65 64 5d 20 7b 0a 20 20 20 20 20 20 49   seed] {.      I
0700: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0710: 4c 55 45 53 28 34 2c 20 28 53 45 4c 45 43 54 20  LUES(4, (SELECT 
0720: 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 31 29 20  sum(a) FROM t1) 
0730: 2b 20 34 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  + 4);.      INSE
0740: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0750: 53 28 35 2c 20 28 53 45 4c 45 43 54 20 73 75 6d  S(5, (SELECT sum
0760: 28 61 29 20 46 52 4f 4d 20 74 31 29 20 2b 20 35  (a) FROM t1) + 5
0770: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  );.    }.  } {1 
0780: 7b 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 65  {child process e
0790: 78 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c 6c 79  xited abnormally
07a0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  }}.  do_test wal
07b0: 63 72 61 73 68 2d 31 2e 24 69 2e 35 20 7b 0a 20  crash-1.$i.5 {. 
07c0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
07d0: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
07e0: 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 61  l { SELECT sum(a
07f0: 29 3d 3d 6d 61 78 28 62 29 20 46 52 4f 4d 20 74  )==max(b) FROM t
0800: 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 69 6e  1 }.  } {1}.  in
0810: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 77 61  tegrity_check wa
0820: 6c 63 72 61 73 68 2d 31 2e 24 69 2e 36 0a 20 20  lcrash-1.$i.6.  
0830: 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73 68  do_test walcrash
0840: 2d 31 2e 24 69 2e 37 20 7b 0a 20 20 20 20 65 78  -1.$i.7 {.    ex
0850: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6d  ecsql { PRAGMA m
0860: 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ain.journal_mode
0870: 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64   }.  } {wal}.  d
0880: 62 20 63 6c 6f 73 65 0a 7d 0a 0a 23 20 77 61 6c  b close.}..# wal
0890: 63 72 61 73 68 2d 32 2e 2a 0a 23 0a 66 6f 72 20  crash-2.*.#.for 
08a0: 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c 20  {set i 1} {$i < 
08b0: 24 52 45 50 45 41 54 53 7d 20 7b 69 6e 63 72 20  $REPEATS} {incr 
08c0: 69 7d 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65  i} {.  forcedele
08d0: 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  te test.db test.
08e0: 64 62 2d 77 61 6c 0a 20 20 64 6f 5f 74 65 73 74  db-wal.  do_test
08f0: 20 77 61 6c 63 72 61 73 68 2d 32 2e 24 69 2e 31   walcrash-2.$i.1
0900: 20 7b 0a 20 20 20 20 63 72 61 73 68 73 71 6c 20   {.    crashsql 
0910: 2d 64 65 6c 61 79 20 35 20 2d 66 69 6c 65 20 74  -delay 5 -file t
0920: 65 73 74 2e 64 62 2d 77 61 6c 20 2d 73 65 65 64  est.db-wal -seed
0930: 20 5b 69 6e 63 72 20 73 65 65 64 5d 20 7b 0a 20   [incr seed] {. 
0940: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
0950: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
0960: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
0970: 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20  LE t1(a PRIMARY 
0980: 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 49  KEY, b);.      I
0990: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
09a0: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
09b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
09c0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
09d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
09e0: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 39 29   t1 VALUES(5, 9)
09f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  ;.    }.  } {1 {
0a00: 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 65 78  child process ex
0a10: 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c 6c 79 7d  ited abnormally}
0a20: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63  }.  do_test walc
0a30: 72 61 73 68 2d 32 2e 24 69 2e 32 20 7b 0a 20 20  rash-2.$i.2 {.  
0a40: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
0a50: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
0a60: 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 61 29   { SELECT sum(a)
0a70: 3d 3d 6d 61 78 28 62 29 20 46 52 4f 4d 20 74 31  ==max(b) FROM t1
0a80: 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 69 6e 74   }.  } {1}.  int
0a90: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 77 61 6c  egrity_check wal
0aa0: 63 72 61 73 68 2d 32 2e 24 69 2e 33 0a 20 20 64  crash-2.$i.3.  d
0ab0: 62 20 63 6c 6f 73 65 0a 20 20 0a 20 20 64 6f 5f  b close.  .  do_
0ac0: 74 65 73 74 20 77 61 6c 63 72 61 73 68 2d 32 2e  test walcrash-2.
0ad0: 24 69 2e 34 20 7b 0a 20 20 20 20 63 72 61 73 68  $i.4 {.    crash
0ae0: 73 71 6c 20 2d 64 65 6c 61 79 20 32 20 2d 66 69  sql -delay 2 -fi
0af0: 6c 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 2d  le test.db-wal -
0b00: 73 65 65 64 20 5b 69 6e 63 72 20 73 65 65 64 5d  seed [incr seed]
0b10: 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   {.      INSERT 
0b20: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36  INTO t1 VALUES(6
0b30: 2c 20 28 53 45 4c 45 43 54 20 73 75 6d 28 61 29  , (SELECT sum(a)
0b40: 20 46 52 4f 4d 20 74 31 29 20 2b 20 36 29 3b 0a   FROM t1) + 6);.
0b50: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0b60: 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 28  O t1 VALUES(7, (
0b70: 53 45 4c 45 43 54 20 73 75 6d 28 61 29 20 46 52  SELECT sum(a) FR
0b80: 4f 4d 20 74 31 29 20 2b 20 37 29 3b 0a 20 20 20  OM t1) + 7);.   
0b90: 20 7d 0a 20 20 7d 20 7b 31 20 7b 63 68 69 6c 64   }.  } {1 {child
0ba0: 20 70 72 6f 63 65 73 73 20 65 78 69 74 65 64 20   process exited 
0bb0: 61 62 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 20 20 64  abnormally}}.  d
0bc0: 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73 68 2d  o_test walcrash-
0bd0: 32 2e 24 69 2e 35 20 7b 0a 20 20 20 20 73 71 6c  2.$i.5 {.    sql
0be0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
0bf0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
0c00: 4c 45 43 54 20 73 75 6d 28 61 29 3d 3d 6d 61 78  LECT sum(a)==max
0c10: 28 62 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  (b) FROM t1 }.  
0c20: 7d 20 7b 31 7d 0a 20 20 69 6e 74 65 67 72 69 74  } {1}.  integrit
0c30: 79 5f 63 68 65 63 6b 20 77 61 6c 63 72 61 73 68  y_check walcrash
0c40: 2d 32 2e 24 69 2e 36 0a 20 20 64 6f 5f 74 65 73  -2.$i.6.  do_tes
0c50: 74 20 77 61 6c 63 72 61 73 68 2d 32 2e 24 69 2e  t walcrash-2.$i.
0c60: 36 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  6 {.    execsql 
0c70: 7b 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f  { PRAGMA main.jo
0c80: 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 20 20 7d  urnal_mode }.  }
0c90: 20 7b 77 61 6c 7d 0a 20 20 64 62 20 63 6c 6f 73   {wal}.  db clos
0ca0: 65 0a 7d 0a 0a 23 20 77 61 6c 63 72 61 73 68 2d  e.}..# walcrash-
0cb0: 33 2e 2a 0a 23 0a 23 20 66 6f 72 20 7b 73 65 74  3.*.#.# for {set
0cc0: 20 69 20 31 7d 20 7b 24 69 20 3c 20 24 52 45 50   i 1} {$i < $REP
0cd0: 45 41 54 53 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  EATS} {incr i} {
0ce0: 0a 23 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65  .#   forcedelete
0cf0: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
0d00: 2d 77 61 6c 0a 23 20 20 20 66 6f 72 63 65 64 65  -wal.#   forcede
0d10: 6c 65 74 65 20 74 65 73 74 32 2e 64 62 20 74 65  lete test2.db te
0d20: 73 74 32 2e 64 62 2d 77 61 6c 0a 23 20 0a 23 20  st2.db-wal.# .# 
0d30: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61    do_test walcra
0d40: 73 68 2d 33 2e 24 69 2e 31 20 7b 0a 23 20 20 20  sh-3.$i.1 {.#   
0d50: 20 20 63 72 61 73 68 73 71 6c 20 2d 64 65 6c 61    crashsql -dela
0d60: 79 20 32 20 2d 66 69 6c 65 20 74 65 73 74 32 2e  y 2 -file test2.
0d70: 64 62 2d 77 61 6c 20 2d 73 65 65 64 20 5b 69 6e  db-wal -seed [in
0d80: 63 72 20 73 65 65 64 5d 20 7b 0a 23 20 20 20 20  cr seed] {.#    
0d90: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
0da0: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 23 20  l_mode = WAL;.# 
0db0: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65        ATTACH 'te
0dc0: 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a  st2.db' AS aux;.
0dd0: 23 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54  #       CREATE T
0de0: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
0df0: 59 20 4b 45 59 2c 20 62 29 3b 0a 23 20 20 20 20  Y KEY, b);.#    
0e00: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0e10: 61 75 78 2e 74 32 28 61 20 50 52 49 4d 41 52 59  aux.t2(a PRIMARY
0e20: 20 4b 45 59 2c 20 62 29 3b 0a 23 20 20 20 20 20   KEY, b);.#     
0e30: 20 20 42 45 47 49 4e 3b 0a 23 20 20 20 20 20 20    BEGIN;.#      
0e40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0e50: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
0e60: 23 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  #         INSERT
0e70: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
0e80: 31 2c 20 32 29 3b 0a 23 20 20 20 20 20 20 20 43  1, 2);.#       C
0e90: 4f 4d 4d 49 54 3b 0a 23 20 20 20 20 20 7d 0a 23  OMMIT;.#     }.#
0ea0: 20 20 20 7d 20 7b 31 20 7b 63 68 69 6c 64 20 70     } {1 {child p
0eb0: 72 6f 63 65 73 73 20 65 78 69 74 65 64 20 61 62  rocess exited ab
0ec0: 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 23 20 0a 23 20  normally}}.# .# 
0ed0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61    do_test walcra
0ee0: 73 68 2d 33 2e 24 69 2e 32 20 7b 0a 23 20 20 20  sh-3.$i.2 {.#   
0ef0: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62    sqlite3_wal db
0f00: 20 74 65 73 74 2e 64 62 0a 23 20 20 20 20 20 65   test.db.#     e
0f10: 78 65 63 73 71 6c 20 7b 20 0a 23 20 20 20 20 20  xecsql { .#     
0f20: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32 2e    ATTACH 'test2.
0f30: 64 62 27 20 41 53 20 61 75 78 3b 0a 23 20 20 20  db' AS aux;.#   
0f40: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
0f50: 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
0f60: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 23 20  CT * FROM t2;.# 
0f70: 20 20 20 20 7d 0a 23 20 20 20 7d 20 7b 7d 0a 23      }.#   } {}.#
0f80: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72     do_test walcr
0f90: 61 73 68 2d 33 2e 24 69 2e 33 20 7b 20 65 78 65  ash-3.$i.3 { exe
0fa0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6d 61  csql { PRAGMA ma
0fb0: 69 6e 2e 69 6e 74 65 67 72 69 74 79 5f 63 68 65  in.integrity_che
0fc0: 63 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a 23 20 20 20  ck } } {ok}.#   
0fd0: 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73 68  do_test walcrash
0fe0: 2d 33 2e 24 69 2e 34 20 7b 20 65 78 65 63 73 71  -3.$i.4 { execsq
0ff0: 6c 20 7b 20 50 52 41 47 4d 41 20 61 75 78 2e 69  l { PRAGMA aux.i
1000: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 20  ntegrity_check  
1010: 7d 20 7d 20 7b 6f 6b 7d 0a 23 20 0a 23 20 20 20  } } {ok}.# .#   
1020: 64 62 20 63 6c 6f 73 65 0a 23 20 7d 0a 0a 23 20  db close.# }..# 
1030: 77 61 6c 63 72 61 73 68 2d 34 2e 2a 0a 23 0a 66  walcrash-4.*.#.f
1040: 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69  or {set i 1} {$i
1050: 20 3c 20 24 52 45 50 45 41 54 53 7d 20 7b 69 6e   < $REPEATS} {in
1060: 63 72 20 69 7d 20 7b 0a 20 20 66 6f 72 63 65 64  cr i} {.  forced
1070: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65  elete test.db te
1080: 73 74 2e 64 62 2d 77 61 6c 0a 20 20 66 6f 72 63  st.db-wal.  forc
1090: 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62  edelete test2.db
10a0: 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 0a 20   test2.db-wal.. 
10b0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73   do_test walcras
10c0: 68 2d 34 2e 24 69 2e 31 20 7b 0a 20 20 20 20 63  h-4.$i.1 {.    c
10d0: 72 61 73 68 73 71 6c 20 2d 64 65 6c 61 79 20 34  rashsql -delay 4
10e0: 20 2d 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 77   -file test.db-w
10f0: 61 6c 20 2d 73 65 65 64 20 5b 69 6e 63 72 20 73  al -seed [incr s
1100: 65 65 64 5d 20 2d 62 6c 6f 63 6b 73 69 7a 65 20  eed] -blocksize 
1110: 34 30 39 36 20 7b 0a 20 20 20 20 20 20 50 52 41  4096 {.      PRA
1120: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
1130: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 50 52   = WAL;.      PR
1140: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
1150: 20 31 30 32 34 3b 0a 20 20 20 20 20 20 43 52 45   1024;.      CRE
1160: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
1170: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
1180: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1190: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
11a0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
11b0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
11c0: 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  , 4);.    }.  } 
11d0: 7b 31 20 7b 63 68 69 6c 64 20 70 72 6f 63 65 73  {1 {child proces
11e0: 73 20 65 78 69 74 65 64 20 61 62 6e 6f 72 6d 61  s exited abnorma
11f0: 6c 6c 79 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  lly}}..  do_test
1200: 20 77 61 6c 63 72 61 73 68 2d 34 2e 24 69 2e 32   walcrash-4.$i.2
1210: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
1220: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  b test.db.    ex
1230: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53  ecsql { .      S
1240: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1250: 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20  WHERE a = 1;.   
1260: 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 64   }.  } {1 2}.  d
1270: 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73 68 2d  o_test walcrash-
1280: 34 2e 24 69 2e 33 20 7b 20 65 78 65 63 73 71 6c  4.$i.3 { execsql
1290: 20 7b 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69   { PRAGMA main.i
12a0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
12b0: 20 7d 20 7b 6f 6b 7d 0a 20 20 64 6f 5f 74 65 73   } {ok}.  do_tes
12c0: 74 20 77 61 6c 63 72 61 73 68 2d 34 2e 24 69 2e  t walcrash-4.$i.
12d0: 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 50 52  4 { execsql { PR
12e0: 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61  AGMA main.journa
12f0: 6c 5f 6d 6f 64 65 20 7d 20 7d 20 7b 77 61 6c 7d  l_mode } } {wal}
1300: 0a 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 0a 0a  ..  db close.}..
1310: 23 20 77 61 6c 63 72 61 73 68 2d 35 2e 2a 0a 23  # walcrash-5.*.#
1320: 0a 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b  .for {set i 1} {
1330: 24 69 20 3c 20 24 52 45 50 45 41 54 53 7d 20 7b  $i < $REPEATS} {
1340: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 66 6f 72 63  incr i} {.  forc
1350: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20  edelete test.db 
1360: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 66 6f  test.db-wal.  fo
1370: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e  rcedelete test2.
1380: 64 62 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a  db test2.db-wal.
1390: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72  .  do_test walcr
13a0: 61 73 68 2d 35 2e 24 69 2e 31 20 7b 0a 20 20 20  ash-5.$i.1 {.   
13b0: 20 63 72 61 73 68 73 71 6c 20 2d 64 65 6c 61 79   crashsql -delay
13c0: 20 31 33 20 2d 66 69 6c 65 20 74 65 73 74 2e 64   13 -file test.d
13d0: 62 2d 77 61 6c 20 2d 73 65 65 64 20 5b 69 6e 63  b-wal -seed [inc
13e0: 72 20 73 65 65 64 5d 20 2d 62 6c 6f 63 6b 73 69  r seed] -blocksi
13f0: 7a 65 20 34 30 39 36 20 7b 0a 20 20 20 20 20 20  ze 4096 {.      
1400: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
1410: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20  ode = WAL;.     
1420: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
1430: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20  e = 1024;.      
1440: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43  BEGIN;.        C
1450: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
1460: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
1470: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
1480: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
1490: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20  domblob(900));. 
14a0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
14b0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
14c0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20  domblob(900));. 
14d0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
14e0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
14f0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
1500: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20  M t1;           
1510: 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 43 4f  /* 4 */.      CO
1520: 4d 4d 49 54 3b 0a 20 20 20 20 20 20 49 4e 53 45  MMIT;.      INSE
1530: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
1540: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
1550: 29 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20  ) FROM t1 LIMIT 
1560: 34 3b 20 20 20 2f 2a 20 38 20 2a 2f 0a 20 20 20  4;   /* 8 */.   
1570: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1580: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
1590: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
15a0: 20 4c 49 4d 49 54 20 34 3b 20 20 20 2f 2a 20 31   LIMIT 4;   /* 1
15b0: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
15c0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
15d0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
15e0: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 34   FROM t1 LIMIT 4
15f0: 3b 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20  ;   /* 16 */.   
1600: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1610: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
1620: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
1630: 20 4c 49 4d 49 54 20 34 3b 20 20 20 2f 2a 20 32   LIMIT 4;   /* 2
1640: 30 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  0 */.      INSER
1650: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1660: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
1670: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 34   FROM t1 LIMIT 4
1680: 3b 20 20 20 2f 2a 20 32 34 20 2a 2f 0a 20 20 20  ;   /* 24 */.   
1690: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
16a0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
16b0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
16c0: 20 4c 49 4d 49 54 20 34 3b 20 20 20 2f 2a 20 32   LIMIT 4;   /* 2
16d0: 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  8 */.      INSER
16e0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
16f0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
1700: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 34   FROM t1 LIMIT 4
1710: 3b 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 0a 20 20  ;   /* 32 */..  
1720: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
1730: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 20  heckpoint;.     
1740: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1750: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
1760: 62 28 39 30 30 29 29 3b 0a 20 20 20 20 20 20 49  b(900));.      I
1770: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1780: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
1790: 39 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  900));.      INS
17a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
17b0: 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  ES(randomblob(90
17c0: 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  0));.    }.  } {
17d0: 31 20 7b 63 68 69 6c 64 20 70 72 6f 63 65 73 73  1 {child process
17e0: 20 65 78 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c   exited abnormal
17f0: 6c 79 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  ly}}..  do_test 
1800: 77 61 6c 63 72 61 73 68 2d 35 2e 24 69 2e 32 20  walcrash-5.$i.2 
1810: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  {.    sqlite3 db
1820: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65   test.db.    exe
1830: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
1840: 75 6e 74 28 2a 29 3d 3d 33 33 20 4f 52 20 63 6f  unt(*)==33 OR co
1850: 75 6e 74 28 2a 29 3d 3d 33 34 20 46 52 4f 4d 20  unt(*)==34 FROM 
1860: 74 31 20 57 48 45 52 45 20 78 20 21 3d 20 31 20  t1 WHERE x != 1 
1870: 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74  }.  } {1}.  do_t
1880: 65 73 74 20 77 61 6c 63 72 61 73 68 2d 35 2e 24  est walcrash-5.$
1890: 69 2e 33 20 7b 20 65 78 65 63 73 71 6c 20 7b 20  i.3 { execsql { 
18a0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 74 65  PRAGMA main.inte
18b0: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7d 20  grity_check } } 
18c0: 7b 6f 6b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  {ok}.  do_test w
18d0: 61 6c 63 72 61 73 68 2d 35 2e 24 69 2e 34 20 7b  alcrash-5.$i.4 {
18e0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
18f0: 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d  A main.journal_m
1900: 6f 64 65 20 7d 20 7d 20 7b 77 61 6c 7d 0a 0a 20  ode } } {wal}.. 
1910: 20 64 62 20 63 6c 6f 73 65 0a 7d 0a 0a 23 20 77   db close.}..# w
1920: 61 6c 63 72 61 73 68 2d 36 2e 2a 0a 23 0a 66 6f  alcrash-6.*.#.fo
1930: 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 20  r {set i 1} {$i 
1940: 3c 20 24 52 45 50 45 41 54 53 7d 20 7b 69 6e 63  < $REPEATS} {inc
1950: 72 20 69 7d 20 7b 0a 20 20 66 6f 72 63 65 64 65  r i} {.  forcede
1960: 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73  lete test.db tes
1970: 74 2e 64 62 2d 77 61 6c 0a 20 20 66 6f 72 63 65  t.db-wal.  force
1980: 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62 20  delete test2.db 
1990: 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 0a 20 20  test2.db-wal..  
19a0: 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73 68  do_test walcrash
19b0: 2d 36 2e 24 69 2e 31 20 7b 0a 20 20 20 20 63 72  -6.$i.1 {.    cr
19c0: 61 73 68 73 71 6c 20 2d 64 65 6c 61 79 20 31 34  ashsql -delay 14
19d0: 20 2d 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 77   -file test.db-w
19e0: 61 6c 20 2d 73 65 65 64 20 5b 69 6e 63 72 20 73  al -seed [incr s
19f0: 65 65 64 5d 20 2d 62 6c 6f 63 6b 73 69 7a 65 20  eed] -blocksize 
1a00: 35 31 32 20 7b 0a 20 20 20 20 20 20 50 52 41 47  512 {.      PRAG
1a10: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
1a20: 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 50 52 41  = WAL;.      PRA
1a30: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
1a40: 31 30 32 34 3b 0a 20 20 20 20 20 20 42 45 47 49  1024;.      BEGI
1a50: 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  N;.        CREAT
1a60: 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52 49  E TABLE t1(x PRI
1a70: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 20  MARY KEY);.     
1a80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1a90: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
1aa0: 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 20  lob(900));.     
1ab0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1ac0: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
1ad0: 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 20  lob(900));.     
1ae0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1af0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
1b00: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
1b10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  ;           /* 4
1b20: 20 2a 2f 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54   */.      COMMIT
1b30: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1b40: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
1b50: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
1b60: 4f 4d 20 74 31 20 4c 49 4d 49 54 20 34 3b 20 20  OM t1 LIMIT 4;  
1b70: 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 20 20 49   /* 8 */.      I
1b80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1b90: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
1ba0: 39 30 30 29 20 46 52 4f 4d 20 74 31 20 4c 49 4d  900) FROM t1 LIM
1bb0: 49 54 20 34 3b 20 20 20 2f 2a 20 31 32 20 2a 2f  IT 4;   /* 12 */
1bc0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1bd0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
1be0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
1bf0: 4d 20 74 31 20 4c 49 4d 49 54 20 34 3b 20 20 20  M t1 LIMIT 4;   
1c00: 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49  /* 16 */.      I
1c10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1c20: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
1c30: 39 30 30 29 20 46 52 4f 4d 20 74 31 20 4c 49 4d  900) FROM t1 LIM
1c40: 49 54 20 34 3b 20 20 20 2f 2a 20 32 30 20 2a 2f  IT 4;   /* 20 */
1c50: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1c60: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
1c70: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
1c80: 4d 20 74 31 20 4c 49 4d 49 54 20 34 3b 20 20 20  M t1 LIMIT 4;   
1c90: 2f 2a 20 32 34 20 2a 2f 0a 20 20 20 20 20 20 49  /* 24 */.      I
1ca0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1cb0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
1cc0: 39 30 30 29 20 46 52 4f 4d 20 74 31 20 4c 49 4d  900) FROM t1 LIM
1cd0: 49 54 20 34 3b 20 20 20 2f 2a 20 32 38 20 2a 2f  IT 4;   /* 28 */
1ce0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1cf0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
1d00: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
1d10: 4d 20 74 31 20 4c 49 4d 49 54 20 34 3b 20 20 20  M t1 LIMIT 4;   
1d20: 2f 2a 20 33 32 20 2a 2f 0a 0a 20 20 20 20 20 20  /* 32 */..      
1d30: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
1d40: 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 49 4e 53  point;.      INS
1d50: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1d60: 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  ES(randomblob(90
1d70: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
1d80: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1d90: 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  S(randomblob(900
1da0: 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  0));.      INSER
1db0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1dc0: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 30  (randomblob(9000
1dd0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  ));.    }.  } {1
1de0: 20 7b 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20   {child process 
1df0: 65 78 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c 6c  exited abnormall
1e00: 79 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77  y}}..  do_test w
1e10: 61 6c 63 72 61 73 68 2d 36 2e 24 69 2e 32 20 7b  alcrash-6.$i.2 {
1e20: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
1e30: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63  test.db.    exec
1e40: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
1e50: 6e 74 28 2a 29 3d 3d 33 34 20 4f 52 20 63 6f 75  nt(*)==34 OR cou
1e60: 6e 74 28 2a 29 3d 3d 33 35 20 46 52 4f 4d 20 74  nt(*)==35 FROM t
1e70: 31 20 57 48 45 52 45 20 78 20 21 3d 20 31 20 7d  1 WHERE x != 1 }
1e80: 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74 65  .  } {1}.  do_te
1e90: 73 74 20 77 61 6c 63 72 61 73 68 2d 36 2e 24 69  st walcrash-6.$i
1ea0: 2e 33 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 50  .3 { execsql { P
1eb0: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 74 65 67  RAGMA main.integ
1ec0: 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7d 20 7b  rity_check } } {
1ed0: 6f 6b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  ok}.  do_test wa
1ee0: 6c 63 72 61 73 68 2d 36 2e 24 69 2e 34 20 7b 20  lcrash-6.$i.4 { 
1ef0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1f00: 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f   main.journal_mo
1f10: 64 65 20 7d 20 7d 20 7b 77 61 6c 7d 0a 0a 20 20  de } } {wal}..  
1f20: 64 62 20 63 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d  db close.}..#---
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f70: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 74 65  ------.# This te
1f80: 73 74 20 63 61 73 65 20 73 69 6d 75 6c 61 74 65  st case simulate
1f90: 73 20 61 20 63 72 61 73 68 20 77 68 69 6c 65 20  s a crash while 
1fa0: 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68  checkpointing th
1fb0: 65 20 64 61 74 61 62 61 73 65 2e 20 50 61 67 65  e database. Page
1fc0: 0a 23 20 31 20 69 73 20 6f 6e 65 20 6f 66 20 74  .# 1 is one of t
1fd0: 68 65 20 70 61 67 65 73 20 6f 76 65 72 77 72 69  he pages overwri
1fe0: 74 74 65 6e 20 62 79 20 74 68 65 20 63 68 65 63  tten by the chec
1ff0: 6b 70 6f 69 6e 74 2e 20 54 68 69 73 20 69 73 20  kpoint. This is 
2000: 61 20 73 70 65 63 69 61 6c 0a 23 20 63 61 73 65  a special.# case
2010: 20 62 65 63 61 75 73 65 20 69 74 20 6d 65 61 6e   because it mean
2020: 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  s the content of
2030: 20 70 61 67 65 20 31 20 6d 61 79 20 62 65 20 64   page 1 may be d
2040: 61 6d 61 67 65 64 2e 20 53 51 4c 69 74 65 20 77  amaged. SQLite w
2050: 69 6c 6c 0a 23 20 68 61 76 65 20 74 6f 20 64 65  ill.# have to de
2060: 74 65 72 6d 69 6e 65 3a 0a 23 0a 23 20 20 20 28  termine:.#.#   (
2070: 61 29 20 74 68 61 74 20 74 68 65 20 64 61 74 61  a) that the data
2080: 62 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61  base is a WAL da
2090: 74 61 62 61 73 65 2c 20 61 6e 64 20 0a 23 20 20  tabase, and .#  
20a0: 20 28 62 29 20 74 68 65 20 64 61 74 61 62 61 73   (b) the databas
20b0: 65 20 70 61 67 65 2d 73 69 7a 65 0a 23 0a 23 20  e page-size.#.# 
20c0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6c 6f 67  based on the log
20d0: 20 66 69 6c 65 2e 0a 23 0a 66 6f 72 20 7b 73 65   file..#.for {se
20e0: 74 20 69 20 31 7d 20 7b 24 69 20 3c 20 24 52 45  t i 1} {$i < $RE
20f0: 50 45 41 54 53 7d 20 7b 69 6e 63 72 20 69 7d 20  PEATS} {incr i} 
2100: 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  {.  forcedelete 
2110: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
2120: 77 61 6c 0a 0a 20 20 23 20 53 65 6c 65 63 74 20  wal..  # Select 
2130: 61 20 70 61 67 65 2d 73 69 7a 65 20 66 6f 72 20  a page-size for 
2140: 74 68 69 73 20 74 65 73 74 2e 0a 20 20 23 0a 20  this test..  #. 
2150: 20 73 65 74 20 70 67 73 7a 20 5b 6c 69 6e 64 65   set pgsz [linde
2160: 78 20 7b 35 31 32 20 31 30 32 34 20 32 30 34 38  x {512 1024 2048
2170: 20 34 30 39 36 20 38 31 39 32 20 31 36 33 38 34   4096 8192 16384
2180: 7d 20 5b 65 78 70 72 20 24 69 25 36 5d 5d 0a 0a  } [expr $i%6]]..
2190: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61    do_test walcra
21a0: 73 68 2d 37 2e 24 69 2e 31 20 7b 0a 20 20 20 20  sh-7.$i.1 {.    
21b0: 63 72 61 73 68 73 71 6c 20 2d 64 65 6c 61 79 20  crashsql -delay 
21c0: 33 20 2d 66 69 6c 65 20 74 65 73 74 2e 64 62 20  3 -file test.db 
21d0: 2d 73 65 65 64 20 5b 69 6e 63 72 20 73 65 65 64  -seed [incr seed
21e0: 5d 20 2d 62 6c 6f 63 6b 73 69 7a 65 20 35 31 32  ] -blocksize 512
21f0: 20 22 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   ".      PRAGMA 
2200: 70 61 67 65 5f 73 69 7a 65 20 3d 20 24 70 67 73  page_size = $pgs
2210: 7a 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  z;.      PRAGMA 
2220: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77  journal_mode = w
2230: 61 6c 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  al;.      BEGIN;
2240: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
2250: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
2260: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2270: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
2280: 20 32 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49   2);.      COMMI
2290: 54 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  T;.      PRAGMA 
22a0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
22b0: 20 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44        CREATE IND
22c0: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
22d0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c        PRAGMA wal
22e0: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20  _checkpoint;.   
22f0: 20 22 0a 20 20 7d 20 7b 31 20 7b 63 68 69 6c 64   ".  } {1 {child
2300: 20 70 72 6f 63 65 73 73 20 65 78 69 74 65 64 20   process exited 
2310: 61 62 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 0a 20 20  abnormally}}..  
2320: 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73 68  do_test walcrash
2330: 2d 37 2e 24 69 2e 32 20 7b 0a 20 20 20 20 73 71  -7.$i.2 {.    sq
2340: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
2350: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
2360: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20  ELECT b FROM t1 
2370: 57 48 45 52 45 20 61 20 3d 20 31 20 7d 0a 20 20  WHERE a = 1 }.  
2380: 7d 20 7b 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20  } {2}.  do_test 
2390: 77 61 6c 63 72 61 73 68 2d 37 2e 24 69 2e 33 20  walcrash-7.$i.3 
23a0: 7b 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47  { execsql { PRAG
23b0: 4d 41 20 6d 61 69 6e 2e 69 6e 74 65 67 72 69 74  MA main.integrit
23c0: 79 5f 63 68 65 63 6b 20 7d 20 7d 20 7b 6f 6b 7d  y_check } } {ok}
23d0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72  .  do_test walcr
23e0: 61 73 68 2d 37 2e 24 69 2e 34 20 7b 20 65 78 65  ash-7.$i.4 { exe
23f0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6d 61  csql { PRAGMA ma
2400: 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  in.journal_mode 
2410: 7d 20 7d 20 7b 77 61 6c 7d 0a 0a 20 20 64 62 20  } } {wal}..  db 
2420: 63 6c 6f 73 65 0a 7d 0a 0a 66 69 6e 69 73 68 5f  close.}..finish_
2430: 74 65 73 74 0a 0a                                test..