/ Hex Artifact Content
Login

Artifact 065a041da88f980df3830f09b7fe308337bb594a:


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 69 66 20 21 5b 77 61 6c 5f 69  urn }.if ![wal_i
0460: 73 5f 6f 6b 5d 20 7b 20 66 69 6e 69 73 68 5f 74  s_ok] { finish_t
0470: 65 73 74 3b 20 72 65 74 75 72 6e 20 7d 0a 0a 64  est; return }..d
0480: 62 20 63 6c 6f 73 65 0a 0a 73 65 74 20 73 65 65  b close..set see
0490: 64 20 30 0a 73 65 74 20 52 45 50 45 41 54 53 20  d 0.set REPEATS 
04a0: 31 30 30 0a 0a 23 20 77 61 6c 63 72 61 73 68 2d  100..# walcrash-
04b0: 31 2e 2a 0a 23 0a 66 6f 72 20 7b 73 65 74 20 69  1.*.#.for {set i
04c0: 20 31 7d 20 7b 24 69 20 3c 20 24 52 45 50 45 41   1} {$i < $REPEA
04d0: 54 53 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  TS} {incr i} {. 
04e0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
04f0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
0500: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72  .  do_test walcr
0510: 61 73 68 2d 31 2e 24 69 2e 31 20 7b 0a 20 20 20  ash-1.$i.1 {.   
0520: 20 63 72 61 73 68 73 71 6c 20 2d 64 65 6c 61 79   crashsql -delay
0530: 20 34 20 2d 66 69 6c 65 20 74 65 73 74 2e 64 62   4 -file test.db
0540: 2d 77 61 6c 20 2d 73 65 65 64 20 5b 69 6e 63 72  -wal -seed [incr
0550: 20 73 65 65 64 5d 20 7b 0a 20 20 20 20 20 20 50   seed] {.      P
0560: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
0570: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20  de = WAL;.      
0580: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0590: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  a, b);.      INS
05a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
05b0: 45 53 28 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  ES(1, 1);.      
05c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
05d0: 41 4c 55 45 53 28 32 2c 20 33 29 3b 0a 20 20 20  ALUES(2, 3);.   
05e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
05f0: 31 20 56 41 4c 55 45 53 28 33 2c 20 36 29 3b 0a  1 VALUES(3, 6);.
0600: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 63 68      }.  } {1 {ch
0610: 69 6c 64 20 70 72 6f 63 65 73 73 20 65 78 69 74  ild process exit
0620: 65 64 20 61 62 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a  ed abnormally}}.
0630: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61    do_test walcra
0640: 73 68 2d 31 2e 24 69 2e 32 20 7b 0a 20 20 20 20  sh-1.$i.2 {.    
0650: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
0660: 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  db.    execsql {
0670: 20 53 45 4c 45 43 54 20 73 75 6d 28 61 29 3d 3d   SELECT sum(a)==
0680: 6d 61 78 28 62 29 20 46 52 4f 4d 20 74 31 20 7d  max(b) FROM t1 }
0690: 0a 20 20 7d 20 7b 31 7d 0a 20 20 69 6e 74 65 67  .  } {1}.  integ
06a0: 72 69 74 79 5f 63 68 65 63 6b 20 77 61 6c 63 72  rity_check walcr
06b0: 61 73 68 2d 31 2e 24 69 2e 33 0a 20 20 64 62 20  ash-1.$i.3.  db 
06c0: 63 6c 6f 73 65 0a 20 20 0a 20 20 64 6f 5f 74 65  close.  .  do_te
06d0: 73 74 20 77 61 6c 63 72 61 73 68 2d 31 2e 24 69  st walcrash-1.$i
06e0: 2e 34 20 7b 0a 20 20 20 20 63 72 61 73 68 73 71  .4 {.    crashsq
06f0: 6c 20 2d 64 65 6c 61 79 20 32 20 2d 66 69 6c 65  l -delay 2 -file
0700: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 2d 73 65   test.db-wal -se
0710: 65 64 20 5b 69 6e 63 72 20 73 65 65 64 5d 20 7b  ed [incr seed] {
0720: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0730: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20  TO t1 VALUES(4, 
0740: 28 53 45 4c 45 43 54 20 73 75 6d 28 61 29 20 46  (SELECT sum(a) F
0750: 52 4f 4d 20 74 31 29 20 2b 20 34 29 3b 0a 20 20  ROM t1) + 4);.  
0760: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0770: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 28 53 45  t1 VALUES(5, (SE
0780: 4c 45 43 54 20 73 75 6d 28 61 29 20 46 52 4f 4d  LECT sum(a) FROM
0790: 20 74 31 29 20 2b 20 35 29 3b 0a 20 20 20 20 7d   t1) + 5);.    }
07a0: 0a 20 20 7d 20 7b 31 20 7b 63 68 69 6c 64 20 70  .  } {1 {child p
07b0: 72 6f 63 65 73 73 20 65 78 69 74 65 64 20 61 62  rocess exited ab
07c0: 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 20 20 64 6f 5f  normally}}.  do_
07d0: 74 65 73 74 20 77 61 6c 63 72 61 73 68 2d 31 2e  test walcrash-1.
07e0: 24 69 2e 35 20 7b 0a 20 20 20 20 73 71 6c 69 74  $i.5 {.    sqlit
07f0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
0800: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0810: 43 54 20 73 75 6d 28 61 29 3d 3d 6d 61 78 28 62  CT sum(a)==max(b
0820: 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  ) FROM t1 }.  } 
0830: 7b 31 7d 0a 20 20 69 6e 74 65 67 72 69 74 79 5f  {1}.  integrity_
0840: 63 68 65 63 6b 20 77 61 6c 63 72 61 73 68 2d 31  check walcrash-1
0850: 2e 24 69 2e 36 0a 20 20 64 6f 5f 74 65 73 74 20  .$i.6.  do_test 
0860: 77 61 6c 63 72 61 73 68 2d 31 2e 24 69 2e 37 20  walcrash-1.$i.7 
0870: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
0880: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
0890: 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 20 20 7d 20 7b  nal_mode }.  } {
08a0: 77 61 6c 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  wal}.  db close.
08b0: 7d 0a 0a 23 20 77 61 6c 63 72 61 73 68 2d 32 2e  }..# walcrash-2.
08c0: 2a 0a 23 0a 66 6f 72 20 7b 73 65 74 20 69 20 31  *.#.for {set i 1
08d0: 7d 20 7b 24 69 20 3c 20 24 52 45 50 45 41 54 53  } {$i < $REPEATS
08e0: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 66  } {incr i} {.  f
08f0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
0900: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  db test.db-wal. 
0910: 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73   do_test walcras
0920: 68 2d 32 2e 24 69 2e 31 20 7b 0a 20 20 20 20 63  h-2.$i.1 {.    c
0930: 72 61 73 68 73 71 6c 20 2d 64 65 6c 61 79 20 35  rashsql -delay 5
0940: 20 2d 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 77   -file test.db-w
0950: 61 6c 20 2d 73 65 65 64 20 5b 69 6e 63 72 20 73  al -seed [incr s
0960: 65 65 64 5d 20 7b 0a 20 20 20 20 20 20 50 52 41  eed] {.      PRA
0970: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
0980: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52   = WAL;.      CR
0990: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
09a0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
09b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
09c0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
09d0: 32 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  2);.      INSERT
09e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
09f0: 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 49 4e 53  3, 4);.      INS
0a00: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0a10: 45 53 28 35 2c 20 39 29 3b 0a 20 20 20 20 7d 0a  ES(5, 9);.    }.
0a20: 20 20 7d 20 7b 31 20 7b 63 68 69 6c 64 20 70 72    } {1 {child pr
0a30: 6f 63 65 73 73 20 65 78 69 74 65 64 20 61 62 6e  ocess exited abn
0a40: 6f 72 6d 61 6c 6c 79 7d 7d 0a 20 20 64 6f 5f 74  ormally}}.  do_t
0a50: 65 73 74 20 77 61 6c 63 72 61 73 68 2d 32 2e 24  est walcrash-2.$
0a60: 69 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  i.2 {.    sqlite
0a70: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
0a80: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
0a90: 54 20 73 75 6d 28 61 29 3d 3d 6d 61 78 28 62 29  T sum(a)==max(b)
0aa0: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b   FROM t1 }.  } {
0ab0: 31 7d 0a 20 20 69 6e 74 65 67 72 69 74 79 5f 63  1}.  integrity_c
0ac0: 68 65 63 6b 20 77 61 6c 63 72 61 73 68 2d 32 2e  heck walcrash-2.
0ad0: 24 69 2e 33 0a 20 20 64 62 20 63 6c 6f 73 65 0a  $i.3.  db close.
0ae0: 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c    .  do_test wal
0af0: 63 72 61 73 68 2d 32 2e 24 69 2e 34 20 7b 0a 20  crash-2.$i.4 {. 
0b00: 20 20 20 63 72 61 73 68 73 71 6c 20 2d 64 65 6c     crashsql -del
0b10: 61 79 20 32 20 2d 66 69 6c 65 20 74 65 73 74 2e  ay 2 -file test.
0b20: 64 62 2d 77 61 6c 20 2d 73 65 65 64 20 5b 69 6e  db-wal -seed [in
0b30: 63 72 20 73 65 65 64 5d 20 7b 0a 20 20 20 20 20  cr seed] {.     
0b40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0b50: 56 41 4c 55 45 53 28 36 2c 20 28 53 45 4c 45 43  VALUES(6, (SELEC
0b60: 54 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 31  T sum(a) FROM t1
0b70: 29 20 2b 20 36 29 3b 0a 20 20 20 20 20 20 49 4e  ) + 6);.      IN
0b80: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0b90: 55 45 53 28 37 2c 20 28 53 45 4c 45 43 54 20 73  UES(7, (SELECT s
0ba0: 75 6d 28 61 29 20 46 52 4f 4d 20 74 31 29 20 2b  um(a) FROM t1) +
0bb0: 20 37 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   7);.    }.  } {
0bc0: 31 20 7b 63 68 69 6c 64 20 70 72 6f 63 65 73 73  1 {child process
0bd0: 20 65 78 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c   exited abnormal
0be0: 6c 79 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  ly}}.  do_test w
0bf0: 61 6c 63 72 61 73 68 2d 32 2e 24 69 2e 35 20 7b  alcrash-2.$i.5 {
0c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
0c10: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63  test.db.    exec
0c20: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d  sql { SELECT sum
0c30: 28 61 29 3d 3d 6d 61 78 28 62 29 20 46 52 4f 4d  (a)==max(b) FROM
0c40: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20   t1 }.  } {1}.  
0c50: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
0c60: 77 61 6c 63 72 61 73 68 2d 32 2e 24 69 2e 36 0a  walcrash-2.$i.6.
0c70: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61    do_test walcra
0c80: 73 68 2d 32 2e 24 69 2e 36 20 7b 0a 20 20 20 20  sh-2.$i.6 {.    
0c90: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
0ca0: 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f   main.journal_mo
0cb0: 64 65 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20  de }.  } {wal}. 
0cc0: 20 64 62 20 63 6c 6f 73 65 0a 7d 0a 0a 23 20 77   db close.}..# w
0cd0: 61 6c 63 72 61 73 68 2d 33 2e 2a 0a 23 0a 23 20  alcrash-3.*.#.# 
0ce0: 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24  for {set i 1} {$
0cf0: 69 20 3c 20 24 52 45 50 45 41 54 53 7d 20 7b 69  i < $REPEATS} {i
0d00: 6e 63 72 20 69 7d 20 7b 0a 23 20 20 20 66 6f 72  ncr i} {.#   for
0d10: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
0d20: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 23 20 20   test.db-wal.#  
0d30: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
0d40: 74 32 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 77  t2.db test2.db-w
0d50: 61 6c 0a 23 20 0a 23 20 20 20 64 6f 5f 74 65 73  al.# .#   do_tes
0d60: 74 20 77 61 6c 63 72 61 73 68 2d 33 2e 24 69 2e  t walcrash-3.$i.
0d70: 31 20 7b 0a 23 20 20 20 20 20 63 72 61 73 68 73  1 {.#     crashs
0d80: 71 6c 20 2d 64 65 6c 61 79 20 32 20 2d 66 69 6c  ql -delay 2 -fil
0d90: 65 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 20 2d  e test2.db-wal -
0da0: 73 65 65 64 20 5b 69 6e 63 72 20 73 65 65 64 5d  seed [incr seed]
0db0: 20 7b 0a 23 20 20 20 20 20 20 20 50 52 41 47 4d   {.#       PRAGM
0dc0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
0dd0: 20 57 41 4c 3b 0a 23 20 20 20 20 20 20 20 41 54   WAL;.#       AT
0de0: 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20  TACH 'test2.db' 
0df0: 41 53 20 61 75 78 3b 0a 23 20 20 20 20 20 20 20  AS aux;.#       
0e00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0e10: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
0e20: 29 3b 0a 23 20 20 20 20 20 20 20 43 52 45 41 54  );.#       CREAT
0e30: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61  E TABLE aux.t2(a
0e40: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
0e50: 3b 0a 23 20 20 20 20 20 20 20 42 45 47 49 4e 3b  ;.#       BEGIN;
0e60: 0a 23 20 20 20 20 20 20 20 20 20 49 4e 53 45 52  .#         INSER
0e70: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0e80: 28 31 2c 20 32 29 3b 0a 23 20 20 20 20 20 20 20  (1, 2);.#       
0e90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
0ea0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 23   VALUES(1, 2);.#
0eb0: 20 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 23         COMMIT;.#
0ec0: 20 20 20 20 20 7d 0a 23 20 20 20 7d 20 7b 31 20       }.#   } {1 
0ed0: 7b 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 65  {child process e
0ee0: 78 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c 6c 79  xited abnormally
0ef0: 7d 7d 0a 23 20 0a 23 20 20 20 64 6f 5f 74 65 73  }}.# .#   do_tes
0f00: 74 20 77 61 6c 63 72 61 73 68 2d 33 2e 24 69 2e  t walcrash-3.$i.
0f10: 32 20 7b 0a 23 20 20 20 20 20 73 71 6c 69 74 65  2 {.#     sqlite
0f20: 33 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62  3_wal db test.db
0f30: 0a 23 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .#     execsql {
0f40: 20 0a 23 20 20 20 20 20 20 20 41 54 54 41 43 48   .#       ATTACH
0f50: 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20 61   'test2.db' AS a
0f60: 75 78 3b 0a 23 20 20 20 20 20 20 20 53 45 4c 45  ux;.#       SELE
0f70: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 45 58 43  CT * FROM t1 EXC
0f80: 45 50 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  EPT SELECT * FRO
0f90: 4d 20 74 32 3b 0a 23 20 20 20 20 20 7d 0a 23 20  M t2;.#     }.# 
0fa0: 20 20 7d 20 7b 7d 0a 23 20 20 20 64 6f 5f 74 65    } {}.#   do_te
0fb0: 73 74 20 77 61 6c 63 72 61 73 68 2d 33 2e 24 69  st walcrash-3.$i
0fc0: 2e 33 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 50  .3 { execsql { P
0fd0: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 74 65 67  RAGMA main.integ
0fe0: 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7d 20 7b  rity_check } } {
0ff0: 6f 6b 7d 0a 23 20 20 20 64 6f 5f 74 65 73 74 20  ok}.#   do_test 
1000: 77 61 6c 63 72 61 73 68 2d 33 2e 24 69 2e 34 20  walcrash-3.$i.4 
1010: 7b 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47  { execsql { PRAG
1020: 4d 41 20 61 75 78 2e 69 6e 74 65 67 72 69 74 79  MA aux.integrity
1030: 5f 63 68 65 63 6b 20 20 7d 20 7d 20 7b 6f 6b 7d  _check  } } {ok}
1040: 0a 23 20 0a 23 20 20 20 64 62 20 63 6c 6f 73 65  .# .#   db close
1050: 0a 23 20 7d 0a 0a 23 20 77 61 6c 63 72 61 73 68  .# }..# walcrash
1060: 2d 34 2e 2a 0a 23 0a 66 6f 72 20 7b 73 65 74 20  -4.*.#.for {set 
1070: 69 20 31 7d 20 7b 24 69 20 3c 20 24 52 45 50 45  i 1} {$i < $REPE
1080: 41 54 53 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  ATS} {incr i} {.
1090: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
10a0: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61  st.db test.db-wa
10b0: 6c 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  l.  forcedelete 
10c0: 74 65 73 74 32 2e 64 62 20 74 65 73 74 32 2e 64  test2.db test2.d
10d0: 62 2d 77 61 6c 0a 0a 20 20 64 6f 5f 74 65 73 74  b-wal..  do_test
10e0: 20 77 61 6c 63 72 61 73 68 2d 34 2e 24 69 2e 31   walcrash-4.$i.1
10f0: 20 7b 0a 20 20 20 20 63 72 61 73 68 73 71 6c 20   {.    crashsql 
1100: 2d 64 65 6c 61 79 20 34 20 2d 66 69 6c 65 20 74  -delay 4 -file t
1110: 65 73 74 2e 64 62 2d 77 61 6c 20 2d 73 65 65 64  est.db-wal -seed
1120: 20 5b 69 6e 63 72 20 73 65 65 64 5d 20 2d 62 6c   [incr seed] -bl
1130: 6f 63 6b 73 69 7a 65 20 34 30 39 36 20 7b 0a 20  ocksize 4096 {. 
1140: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
1150: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
1160: 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67        PRAGMA pag
1170: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
1180: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
1190: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
11a0: 45 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e  EY, b);.      IN
11b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11c0: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20  UES(1, 2);.     
11d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11e0: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
11f0: 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 63 68 69 6c    }.  } {1 {chil
1200: 64 20 70 72 6f 63 65 73 73 20 65 78 69 74 65 64  d process exited
1210: 20 61 62 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 0a 20   abnormally}}.. 
1220: 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73   do_test walcras
1230: 68 2d 34 2e 24 69 2e 32 20 7b 0a 20 20 20 20 73  h-4.$i.2 {.    s
1240: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1250: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  b.    execsql { 
1260: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
1270: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
1280: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  = 1;.    }.  } {
1290: 31 20 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  1 2}.  do_test w
12a0: 61 6c 63 72 61 73 68 2d 34 2e 24 69 2e 33 20 7b  alcrash-4.$i.3 {
12b0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
12c0: 41 20 6d 61 69 6e 2e 69 6e 74 65 67 72 69 74 79  A main.integrity
12d0: 5f 63 68 65 63 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a  _check } } {ok}.
12e0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61    do_test walcra
12f0: 73 68 2d 34 2e 24 69 2e 34 20 7b 20 65 78 65 63  sh-4.$i.4 { exec
1300: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6d 61 69  sql { PRAGMA mai
1310: 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  n.journal_mode }
1320: 20 7d 20 7b 77 61 6c 7d 0a 0a 20 20 64 62 20 63   } {wal}..  db c
1330: 6c 6f 73 65 0a 7d 0a 0a 23 20 77 61 6c 63 72 61  lose.}..# walcra
1340: 73 68 2d 35 2e 2a 0a 23 0a 66 6f 72 20 7b 73 65  sh-5.*.#.for {se
1350: 74 20 69 20 31 7d 20 7b 24 69 20 3c 20 24 52 45  t i 1} {$i < $RE
1360: 50 45 41 54 53 7d 20 7b 69 6e 63 72 20 69 7d 20  PEATS} {incr i} 
1370: 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  {.  forcedelete 
1380: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
1390: 77 61 6c 0a 20 20 66 6f 72 63 65 64 65 6c 65 74  wal.  forcedelet
13a0: 65 20 74 65 73 74 32 2e 64 62 20 74 65 73 74 32  e test2.db test2
13b0: 2e 64 62 2d 77 61 6c 0a 0a 20 20 64 6f 5f 74 65  .db-wal..  do_te
13c0: 73 74 20 77 61 6c 63 72 61 73 68 2d 35 2e 24 69  st walcrash-5.$i
13d0: 2e 31 20 7b 0a 20 20 20 20 63 72 61 73 68 73 71  .1 {.    crashsq
13e0: 6c 20 2d 64 65 6c 61 79 20 31 33 20 2d 66 69 6c  l -delay 13 -fil
13f0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 2d 73  e test.db-wal -s
1400: 65 65 64 20 5b 69 6e 63 72 20 73 65 65 64 5d 20  eed [incr seed] 
1410: 2d 62 6c 6f 63 6b 73 69 7a 65 20 34 30 39 36 20  -blocksize 4096 
1420: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  {.      PRAGMA j
1430: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
1440: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
1450: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
1460: 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  ;.      BEGIN;. 
1470: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
1480: 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59  BLE t1(x PRIMARY
1490: 20 4b 45 59 29 3b 0a 20 20 20 20 20 20 20 20 49   KEY);.        I
14a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
14b0: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
14c0: 39 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20 49  900));.        I
14d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
14e0: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
14f0: 39 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20 49  900));.        I
1500: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1510: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
1520: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
1530: 20 20 20 20 20 20 20 20 2f 2a 20 34 20 2a 2f 0a          /* 4 */.
1540: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
1550: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1560: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
1570: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
1580: 31 20 4c 49 4d 49 54 20 34 3b 20 20 20 2f 2a 20  1 LIMIT 4;   /* 
1590: 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  8 */.      INSER
15a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
15b0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
15c0: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 34   FROM t1 LIMIT 4
15d0: 3b 20 20 20 2f 2a 20 31 32 20 2a 2f 0a 20 20 20  ;   /* 12 */.   
15e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
15f0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
1600: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
1610: 20 4c 49 4d 49 54 20 34 3b 20 20 20 2f 2a 20 31   LIMIT 4;   /* 1
1620: 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  6 */.      INSER
1630: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1640: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
1650: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 34   FROM t1 LIMIT 4
1660: 3b 20 20 20 2f 2a 20 32 30 20 2a 2f 0a 20 20 20  ;   /* 20 */.   
1670: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1680: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
1690: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
16a0: 20 4c 49 4d 49 54 20 34 3b 20 20 20 2f 2a 20 32   LIMIT 4;   /* 2
16b0: 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  4 */.      INSER
16c0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
16d0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
16e0: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 34   FROM t1 LIMIT 4
16f0: 3b 20 20 20 2f 2a 20 32 38 20 2a 2f 0a 20 20 20  ;   /* 28 */.   
1700: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1710: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
1720: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
1730: 20 4c 49 4d 49 54 20 34 3b 20 20 20 2f 2a 20 33   LIMIT 4;   /* 3
1740: 32 20 2a 2f 0a 0a 20 20 20 20 20 20 50 52 41 47  2 */..      PRAG
1750: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
1760: 74 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  t;.      INSERT 
1770: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
1780: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b  andomblob(900));
1790: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
17a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
17b0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20  domblob(900));. 
17c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
17d0: 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t1 VALUES(rando
17e0: 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20  mblob(900));.   
17f0: 20 7d 0a 20 20 7d 20 7b 31 20 7b 63 68 69 6c 64   }.  } {1 {child
1800: 20 70 72 6f 63 65 73 73 20 65 78 69 74 65 64 20   process exited 
1810: 61 62 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 0a 20 20  abnormally}}..  
1820: 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73 68  do_test walcrash
1830: 2d 35 2e 24 69 2e 32 20 7b 0a 20 20 20 20 73 71  -5.$i.2 {.    sq
1840: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
1850: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
1860: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 3d 3d  ELECT count(*)==
1870: 33 33 20 4f 52 20 63 6f 75 6e 74 28 2a 29 3d 3d  33 OR count(*)==
1880: 33 34 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  34 FROM t1 WHERE
1890: 20 78 20 21 3d 20 31 20 7d 0a 20 20 7d 20 7b 31   x != 1 }.  } {1
18a0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 63  }.  do_test walc
18b0: 72 61 73 68 2d 35 2e 24 69 2e 33 20 7b 20 65 78  rash-5.$i.3 { ex
18c0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6d  ecsql { PRAGMA m
18d0: 61 69 6e 2e 69 6e 74 65 67 72 69 74 79 5f 63 68  ain.integrity_ch
18e0: 65 63 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a 20 20 64  eck } } {ok}.  d
18f0: 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73 68 2d  o_test walcrash-
1900: 35 2e 24 69 2e 34 20 7b 20 65 78 65 63 73 71 6c  5.$i.4 { execsql
1910: 20 7b 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a   { PRAGMA main.j
1920: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 20 7d 20  ournal_mode } } 
1930: 7b 77 61 6c 7d 0a 0a 20 20 64 62 20 63 6c 6f 73  {wal}..  db clos
1940: 65 0a 7d 0a 0a 23 20 77 61 6c 63 72 61 73 68 2d  e.}..# walcrash-
1950: 36 2e 2a 0a 23 0a 66 6f 72 20 7b 73 65 74 20 69  6.*.#.for {set i
1960: 20 31 7d 20 7b 24 69 20 3c 20 24 52 45 50 45 41   1} {$i < $REPEA
1970: 54 53 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  TS} {incr i} {. 
1980: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
1990: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
19a0: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
19b0: 65 73 74 32 2e 64 62 20 74 65 73 74 32 2e 64 62  est2.db test2.db
19c0: 2d 77 61 6c 0a 0a 20 20 64 6f 5f 74 65 73 74 20  -wal..  do_test 
19d0: 77 61 6c 63 72 61 73 68 2d 36 2e 24 69 2e 31 20  walcrash-6.$i.1 
19e0: 7b 0a 20 20 20 20 63 72 61 73 68 73 71 6c 20 2d  {.    crashsql -
19f0: 64 65 6c 61 79 20 31 34 20 2d 66 69 6c 65 20 74  delay 14 -file t
1a00: 65 73 74 2e 64 62 2d 77 61 6c 20 2d 73 65 65 64  est.db-wal -seed
1a10: 20 5b 69 6e 63 72 20 73 65 65 64 5d 20 2d 62 6c   [incr seed] -bl
1a20: 6f 63 6b 73 69 7a 65 20 35 31 32 20 7b 0a 20 20  ocksize 512 {.  
1a30: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
1a40: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
1a50: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
1a60: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
1a70: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
1a80: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1a90: 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(x PRIMARY KEY
1aa0: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
1ab0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1ac0: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29  (randomblob(900)
1ad0: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
1ae0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1af0: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29  (randomblob(900)
1b00: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
1b10: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1b20: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
1b30: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
1b40: 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20      /* 4 */.    
1b50: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20    COMMIT;.      
1b60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1b70: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
1b80: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 20 4c 49  (900) FROM t1 LI
1b90: 4d 49 54 20 34 3b 20 20 20 2f 2a 20 38 20 2a 2f  MIT 4;   /* 8 */
1ba0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1bb0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
1bc0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
1bd0: 4d 20 74 31 20 4c 49 4d 49 54 20 34 3b 20 20 20  M t1 LIMIT 4;   
1be0: 2f 2a 20 31 32 20 2a 2f 0a 20 20 20 20 20 20 49  /* 12 */.      I
1bf0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1c00: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
1c10: 39 30 30 29 20 46 52 4f 4d 20 74 31 20 4c 49 4d  900) FROM t1 LIM
1c20: 49 54 20 34 3b 20 20 20 2f 2a 20 31 36 20 2a 2f  IT 4;   /* 16 */
1c30: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1c40: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
1c50: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
1c60: 4d 20 74 31 20 4c 49 4d 49 54 20 34 3b 20 20 20  M t1 LIMIT 4;   
1c70: 2f 2a 20 32 30 20 2a 2f 0a 20 20 20 20 20 20 49  /* 20 */.      I
1c80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1c90: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
1ca0: 39 30 30 29 20 46 52 4f 4d 20 74 31 20 4c 49 4d  900) FROM t1 LIM
1cb0: 49 54 20 34 3b 20 20 20 2f 2a 20 32 34 20 2a 2f  IT 4;   /* 24 */
1cc0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1cd0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
1ce0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
1cf0: 4d 20 74 31 20 4c 49 4d 49 54 20 34 3b 20 20 20  M t1 LIMIT 4;   
1d00: 2f 2a 20 32 38 20 2a 2f 0a 20 20 20 20 20 20 49  /* 28 */.      I
1d10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1d20: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
1d30: 39 30 30 29 20 46 52 4f 4d 20 74 31 20 4c 49 4d  900) FROM t1 LIM
1d40: 49 54 20 34 3b 20 20 20 2f 2a 20 33 32 20 2a 2f  IT 4;   /* 32 */
1d50: 0a 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 77  ..      PRAGMA w
1d60: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20  al_checkpoint;. 
1d70: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1d80: 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t1 VALUES(rando
1d90: 6d 62 6c 6f 62 28 39 30 30 30 29 29 3b 0a 20 20  mblob(9000));.  
1da0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1db0: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
1dc0: 62 6c 6f 62 28 39 30 30 30 29 29 3b 0a 20 20 20  blob(9000));.   
1dd0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1de0: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
1df0: 6c 6f 62 28 39 30 30 30 29 29 3b 0a 20 20 20 20  lob(9000));.    
1e00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1e10: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
1e20: 6f 62 28 39 30 30 30 29 29 3b 0a 20 20 20 20 7d  ob(9000));.    }
1e30: 0a 20 20 7d 20 7b 31 20 7b 63 68 69 6c 64 20 70  .  } {1 {child p
1e40: 72 6f 63 65 73 73 20 65 78 69 74 65 64 20 61 62  rocess exited ab
1e50: 6e 6f 72 6d 61 6c 6c 79 7d 7d 0a 0a 20 20 64 6f  normally}}..  do
1e60: 5f 74 65 73 74 20 77 61 6c 63 72 61 73 68 2d 36  _test walcrash-6
1e70: 2e 24 69 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69  .$i.2 {.    sqli
1e80: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
1e90: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
1ea0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 42 45 54  ECT count(*) BET
1eb0: 57 45 45 4e 20 33 34 20 41 4e 44 20 33 36 20 46  WEEN 34 AND 36 F
1ec0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 21  ROM t1 WHERE x !
1ed0: 3d 20 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20  = 1 }.  } {1}.  
1ee0: 64 6f 5f 74 65 73 74 20 77 61 6c 63 72 61 73 68  do_test walcrash
1ef0: 2d 36 2e 24 69 2e 33 20 7b 20 65 78 65 63 73 71  -6.$i.3 { execsq
1f00: 6c 20 7b 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e  l { PRAGMA main.
1f10: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
1f20: 7d 20 7d 20 7b 6f 6b 7d 0a 20 20 64 6f 5f 74 65  } } {ok}.  do_te
1f30: 73 74 20 77 61 6c 63 72 61 73 68 2d 36 2e 24 69  st walcrash-6.$i
1f40: 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 50  .4 { execsql { P
1f50: 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e  RAGMA main.journ
1f60: 61 6c 5f 6d 6f 64 65 20 7d 20 7d 20 7b 77 61 6c  al_mode } } {wal
1f70: 7d 0a 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 0a  }..  db close.}.
1f80: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
1fd0: 69 73 20 74 65 73 74 20 63 61 73 65 20 73 69 6d  is test case sim
1fe0: 75 6c 61 74 65 73 20 61 20 63 72 61 73 68 20 77  ulates a crash w
1ff0: 68 69 6c 65 20 63 68 65 63 6b 70 6f 69 6e 74 69  hile checkpointi
2000: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
2010: 20 50 61 67 65 0a 23 20 31 20 69 73 20 6f 6e 65   Page.# 1 is one
2020: 20 6f 66 20 74 68 65 20 70 61 67 65 73 20 6f 76   of the pages ov
2030: 65 72 77 72 69 74 74 65 6e 20 62 79 20 74 68 65  erwritten by the
2040: 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 54 68 69   checkpoint. Thi
2050: 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 0a 23  s is a special.#
2060: 20 63 61 73 65 20 62 65 63 61 75 73 65 20 69 74   case because it
2070: 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 74 65   means the conte
2080: 6e 74 20 6f 66 20 70 61 67 65 20 31 20 6d 61 79  nt of page 1 may
2090: 20 62 65 20 64 61 6d 61 67 65 64 2e 20 53 51 4c   be damaged. SQL
20a0: 69 74 65 20 77 69 6c 6c 0a 23 20 68 61 76 65 20  ite will.# have 
20b0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 3a 0a 23 0a  to determine:.#.
20c0: 23 20 20 20 28 61 29 20 74 68 61 74 20 74 68 65  #   (a) that the
20d0: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
20e0: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  AL database, and
20f0: 20 0a 23 20 20 20 28 62 29 20 74 68 65 20 64 61   .#   (b) the da
2100: 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65  tabase page-size
2110: 0a 23 0a 23 20 62 61 73 65 64 20 6f 6e 20 74 68  .#.# based on th
2120: 65 20 6c 6f 67 20 66 69 6c 65 2e 0a 23 0a 66 6f  e log file..#.fo
2130: 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 20  r {set i 1} {$i 
2140: 3c 20 24 52 45 50 45 41 54 53 7d 20 7b 69 6e 63  < $REPEATS} {inc
2150: 72 20 69 7d 20 7b 0a 20 20 66 6f 72 63 65 64 65  r i} {.  forcede
2160: 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73  lete test.db tes
2170: 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 23 20 53 65  t.db-wal..  # Se
2180: 6c 65 63 74 20 61 20 70 61 67 65 2d 73 69 7a 65  lect a page-size
2190: 20 66 6f 72 20 74 68 69 73 20 74 65 73 74 2e 0a   for this test..
21a0: 20 20 23 0a 20 20 73 65 74 20 70 67 73 7a 20 5b    #.  set pgsz [
21b0: 6c 69 6e 64 65 78 20 7b 35 31 32 20 31 30 32 34  lindex {512 1024
21c0: 20 32 30 34 38 20 34 30 39 36 20 38 31 39 32 20   2048 4096 8192 
21d0: 31 36 33 38 34 7d 20 5b 65 78 70 72 20 24 69 25  16384} [expr $i%
21e0: 36 5d 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77  6]]..  do_test w
21f0: 61 6c 63 72 61 73 68 2d 37 2e 24 69 2e 31 20 7b  alcrash-7.$i.1 {
2200: 0a 20 20 20 20 63 72 61 73 68 73 71 6c 20 2d 64  .    crashsql -d
2210: 65 6c 61 79 20 33 20 2d 66 69 6c 65 20 74 65 73  elay 3 -file tes
2220: 74 2e 64 62 20 2d 73 65 65 64 20 5b 69 6e 63 72  t.db -seed [incr
2230: 20 73 65 65 64 5d 20 2d 62 6c 6f 63 6b 73 69 7a   seed] -blocksiz
2240: 65 20 35 31 32 20 22 0a 20 20 20 20 20 20 50 52  e 512 ".      PR
2250: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
2260: 20 24 70 67 73 7a 3b 0a 20 20 20 20 20 20 50 52   $pgsz;.      PR
2270: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
2280: 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 42  e = wal;.      B
2290: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52  EGIN;.        CR
22a0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
22b0: 20 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53   b);.        INS
22c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
22d0: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  ES(1, 2);.      
22e0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 50 52  COMMIT;.      PR
22f0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
2300: 69 6e 74 3b 0a 20 20 20 20 20 20 43 52 45 41 54  int;.      CREAT
2310: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
2320: 28 61 29 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  (a);.      PRAGM
2330: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
2340: 3b 0a 20 20 20 20 22 0a 20 20 7d 20 7b 31 20 7b  ;.    ".  } {1 {
2350: 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 65 78  child process ex
2360: 69 74 65 64 20 61 62 6e 6f 72 6d 61 6c 6c 79 7d  ited abnormally}
2370: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  }..  do_test wal
2380: 63 72 61 73 68 2d 37 2e 24 69 2e 32 20 7b 0a 20  crash-7.$i.2 {. 
2390: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
23a0: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
23b0: 6c 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f  l { SELECT b FRO
23c0: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 31  M t1 WHERE a = 1
23d0: 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20 20 64 6f 5f   }.  } {2}.  do_
23e0: 74 65 73 74 20 77 61 6c 63 72 61 73 68 2d 37 2e  test walcrash-7.
23f0: 24 69 2e 33 20 7b 20 65 78 65 63 73 71 6c 20 7b  $i.3 { execsql {
2400: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 74   PRAGMA main.int
2410: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7d  egrity_check } }
2420: 20 7b 6f 6b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   {ok}.  do_test 
2430: 77 61 6c 63 72 61 73 68 2d 37 2e 24 69 2e 34 20  walcrash-7.$i.4 
2440: 7b 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47  { execsql { PRAG
2450: 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f  MA main.journal_
2460: 6d 6f 64 65 20 7d 20 7d 20 7b 77 61 6c 7d 0a 0a  mode } } {wal}..
2470: 20 20 64 62 20 63 6c 6f 73 65 0a 7d 0a 0a 66 69    db close.}..fi
2480: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.