/ Hex Artifact Content
Login

Artifact 776f9363554c029fcce71d9e6600fa0ba6359ce7:


0000: 23 20 32 30 30 37 20 41 75 67 75 73 74 20 32 33  # 2007 August 23
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: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 65  file contains te
0180: 73 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20  sts that verify 
0190: 74 68 61 74 20 53 51 4c 69 74 65 20 63 61 6e 20  that SQLite can 
01a0: 63 6f 72 72 65 63 74 6c 79 20 72 6f 6c 6c 62 61  correctly rollba
01b0: 63 6b 0a 23 20 64 61 74 61 62 61 73 65 73 20 61  ck.# databases a
01c0: 66 74 65 72 20 63 72 61 73 68 65 73 20 77 68 65  fter crashes whe
01d0: 6e 20 75 73 69 6e 67 20 74 68 65 20 73 70 65 63  n using the spec
01e0: 69 61 6c 20 49 4f 20 6d 6f 64 65 73 20 74 72 69  ial IO modes tri
01f0: 67 67 65 72 65 64 20 0a 23 20 62 79 20 64 65 76  ggered .# by dev
0200: 69 63 65 20 49 4f 43 41 50 20 66 6c 61 67 73 2e  ice IOCAP flags.
0210: 0a 23 0a 23 20 24 49 64 3a 20 63 72 61 73 68 33  .#.# $Id: crash3
0220: 2e 74 65 73 74 2c 76 20 31 2e 34 20 32 30 30 38  .test,v 1.4 2008
0230: 2f 30 37 2f 31 32 20 31 34 3a 35 32 3a 32 30 20  /07/12 14:52:20 
0240: 64 72 68 20 45 78 70 20 24 0a 0a 73 65 74 20 74  drh Exp $..set t
0250: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0260: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0270: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
0280: 74 65 72 2e 74 63 6c 0a 0a 69 66 63 61 70 61 62  ter.tcl..ifcapab
0290: 6c 65 20 21 63 72 61 73 68 74 65 73 74 20 7b 0a  le !crashtest {.
02a0: 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20    finish_test.  
02b0: 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 64  return.}..proc d
02c0: 6f 5f 74 65 73 74 32 20 7b 6e 61 6d 65 20 74 63  o_test2 {name tc
02d0: 6c 20 72 65 73 31 20 72 65 73 32 7d 20 7b 0a 20  l res1 res2} {. 
02e0: 20 73 65 74 20 73 63 72 69 70 74 20 5b 73 75 62   set script [sub
02f0: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 7b  st -nocommands {
0300: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24 6e 61  .    do_test $na
0310: 6d 65 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72  me {.      set r
0320: 65 73 31 20 7b 24 72 65 73 31 7d 0a 20 20 20 20  es1 {$res1}.    
0330: 20 20 73 65 74 20 72 65 73 32 20 7b 24 72 65 73    set res2 {$res
0340: 32 7d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73  2}.      set res
0350: 20 5b 65 76 61 6c 20 7b 24 74 63 6c 7d 5d 0a 20   [eval {$tcl}]. 
0360: 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 72 65       if {[set re
0370: 73 5d 20 65 71 20 5b 73 65 74 20 72 65 73 31 5d  s] eq [set res1]
0380: 20 7c 7c 20 5b 73 65 74 20 72 65 73 5d 20 65 71   || [set res] eq
0390: 20 5b 73 65 74 20 72 65 73 32 5d 7d 20 7b 0a 20   [set res2]} {. 
03a0: 20 20 20 20 20 20 20 73 65 74 20 72 65 73 20 22         set res "
03b0: 7b 5b 73 65 74 20 72 65 73 31 5d 7d 20 6f 72 20  {[set res1]} or 
03c0: 7b 5b 73 65 74 20 72 65 73 32 5d 7d 22 0a 20 20  {[set res2]}".  
03d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 20      }.      set 
03e0: 72 65 73 0a 20 20 20 20 7d 20 7b 7b 24 72 65 73  res.    } {{$res
03f0: 31 7d 20 6f 72 20 7b 24 72 65 73 32 7d 7d 0a 20  1} or {$res2}}. 
0400: 20 7d 5d 0a 20 20 75 70 6c 65 76 65 6c 20 24 73   }].  uplevel $s
0410: 63 72 69 70 74 0a 7d 0a 0a 23 20 54 68 69 73 20  cript.}..# This 
0420: 62 6c 6f 63 6b 20 74 65 73 74 73 20 63 72 61 73  block tests cras
0430: 68 2d 72 65 63 6f 76 65 72 79 20 77 68 65 6e 20  h-recovery when 
0440: 74 68 65 20 49 4f 43 41 50 5f 41 54 4f 4d 49 43  the IOCAP_ATOMIC
0450: 20 66 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 23   flags is set..#
0460: 0a 23 20 45 61 63 68 20 69 74 65 72 61 74 69 6f  .# Each iteratio
0470: 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n of the followi
0480: 6e 67 20 6c 6f 6f 70 20 73 65 74 73 20 75 70 20  ng loop sets up 
0490: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
04a0: 63 6f 6e 74 61 69 6e 0a 23 20 74 68 65 20 66 6f  contain.# the fo
04b0: 6c 6c 6f 77 69 6e 67 20 73 63 68 65 6d 61 20 61  llowing schema a
04c0: 6e 64 20 64 61 74 61 3a 0a 23 0a 23 20 20 20 20  nd data:.#.#    
04d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63  CREATE TABLE abc
04e0: 28 61 2c 20 62 2c 20 63 29 3b 0a 23 20 20 20 20  (a, b, c);.#    
04f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
0500: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
0510: 0a 23 0a 23 20 54 68 65 6e 20 65 78 65 63 75 74  .#.# Then execut
0520: 65 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  e the SQL statem
0530: 65 6e 74 2c 20 73 63 68 65 64 75 6c 69 6e 67 20  ent, scheduling 
0540: 61 20 63 72 61 73 68 20 66 6f 72 20 70 61 72 74  a crash for part
0550: 2d 77 61 79 20 74 68 72 6f 75 67 68 0a 23 20 74  -way through.# t
0560: 68 65 20 66 69 72 73 74 20 73 79 6e 63 28 29 20  he first sync() 
0570: 6f 66 20 65 69 74 68 65 72 20 74 68 65 20 64 61  of either the da
0580: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74  tabase file or t
0590: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
05a0: 28 6f 66 74 65 6e 0a 23 20 74 68 65 20 6a 6f 75  (often.# the jou
05b0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
05c0: 20 72 65 71 75 69 72 65 64 20 2d 20 6d 65 61 6e   required - mean
05d0: 69 6e 67 20 6e 6f 20 63 72 61 73 68 20 6f 63 63  ing no crash occ
05e0: 75 72 73 29 2e 0a 23 0a 23 20 41 66 74 65 72 20  urs)..#.# After 
05f0: 74 68 65 20 63 72 61 73 68 20 28 6f 72 20 61 62  the crash (or ab
0600: 73 65 6e 63 65 20 6f 66 20 61 20 63 72 61 73 68  sence of a crash
0610: 29 2c 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  ), open the data
0620: 62 61 73 65 20 61 6e 64 20 0a 23 20 76 65 72 69  base and .# veri
0630: 66 79 20 74 68 61 74 3a 0a 23 0a 23 20 20 20 2a  fy that:.#.#   *
0640: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 63   The integrity c
0650: 68 65 63 6b 20 70 61 73 73 65 73 2c 20 61 6e 64  heck passes, and
0660: 0a 23 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  .#   * The conte
0670: 6e 74 73 20 6f 66 20 74 61 62 6c 65 20 61 62 63  nts of table abc
0680: 20 69 73 20 65 69 74 68 65 72 20 7b 31 20 32 20   is either {1 2 
0690: 33 7d 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  3} or the value 
06a0: 73 70 65 63 69 66 69 65 64 0a 23 20 20 20 20 20  specified.#     
06b0: 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
06c0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
06d0: 74 20 62 65 6c 6f 77 2e 0a 23 0a 23 20 54 68 65  t below..#.# The
06e0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 72 65   procedure is re
06f0: 70 65 61 74 65 64 20 31 30 20 74 69 6d 65 73 20  peated 10 times 
0700: 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74 61  for each SQL sta
0710: 74 65 6d 65 6e 74 2e 20 46 69 76 65 20 74 69 6d  tement. Five tim
0720: 65 73 0a 23 20 77 69 74 68 20 74 68 65 20 63 72  es.# with the cr
0730: 61 73 68 20 73 63 68 65 64 75 6c 65 64 20 66 6f  ash scheduled fo
0740: 72 20 6d 69 64 77 61 79 20 74 68 72 6f 75 67 68  r midway through
0750: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
0760: 61 6c 20 73 79 6e 63 20 28 69 66 20 0a 23 20 61  al sync (if .# a
0770: 6e 79 29 2c 20 61 6e 64 20 66 69 76 65 20 74 69  ny), and five ti
0780: 6d 65 73 20 77 69 74 68 20 74 68 65 20 63 72 61  mes with the cra
0790: 73 68 20 6d 69 64 77 61 79 20 74 68 72 6f 75 67  sh midway throug
07a0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
07b0: 79 6e 63 2e 0a 23 0a 73 65 74 20 74 6e 20 31 0a  ync..#.set tn 1.
07c0: 66 6f 72 65 61 63 68 20 7b 73 71 6c 20 72 65 73  foreach {sql res
07d0: 32 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 7b 49 4e  2} [list \.  {IN
07e0: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
07f0: 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 7d 20 20  LUES(4, 5, 6)}  
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 20    {1 2 3 4 5 6} 
0820: 5c 0a 20 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d  \.  {DELETE FROM
0830: 20 61 62 63 7d 20 20 20 20 20 20 20 20 20 20 20   abc}           
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 20 20 20 20 20 7b 7d 20 20 20 20 5c           {}    \
0860: 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  .  {INSERT INTO 
0870: 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  abc SELECT * FRO
0880: 4d 20 61 62 63 7d 20 20 20 20 20 20 20 20 20 20  M abc}          
0890: 20 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 31          {1 2 3 1
08a0: 20 32 20 33 7d 20 5c 0a 20 20 7b 55 50 44 41 54   2 3} \.  {UPDAT
08b0: 45 20 61 62 63 20 53 45 54 20 61 20 3d 20 32 7d  E abc SET a = 2}
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
08e0: 32 20 32 20 33 7d 20 20 20 20 20 20 20 5c 0a 20  2 2 3}       \. 
08f0: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62   {INSERT INTO ab
0900: 63 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 72  c VALUES(4, 5, r
0910: 61 6e 64 73 74 72 28 31 30 30 30 2c 31 30 30 30  andstr(1000,1000
0920: 29 29 7d 20 20 20 7b 6e 2f 61 7d 20 5c 0a 20 20  ))}   {n/a} \.  
0930: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 65  {CREATE TABLE de
0940: 66 28 64 2c 20 65 2c 20 66 29 7d 20 20 20 20 20  f(d, e, f)}     
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 7b 6e 2f 61 7d 20 5c 0a 5d 20 7b       {n/a} \.] {
0970: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30  .  for {set ii 0
0980: 7d 20 7b 24 69 69 20 3c 20 31 30 7d 20 7b 69 6e  } {$ii < 10} {in
0990: 63 72 20 69 69 7d 20 7b 0a 0a 20 20 20 20 64 62  cr ii} {..    db
09a0: 20 63 6c 6f 73 65 0a 20 20 20 20 66 69 6c 65 20   close.    file 
09b0: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
09c0: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f  st.db test.db-jo
09d0: 75 72 6e 61 6c 0a 20 20 20 20 73 71 6c 69 74 65  urnal.    sqlite
09e0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
09f0: 20 64 6f 5f 74 65 73 74 20 63 72 61 73 68 33 2d   do_test crash3-
0a00: 31 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20  1.$tn.1 {.      
0a10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
0a20: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
0a30: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20  ze = 1024;.     
0a40: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
0a50: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
0a60: 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20  bc(a, b, c);.   
0a70: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0a80: 20 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32   abc VALUES(1, 2
0a90: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  , 3);.        CO
0aa0: 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  MMIT;.      }.  
0ab0: 20 20 7d 20 7b 7d 0a 20 20 20 20 64 62 20 63 6c    } {}.    db cl
0ac0: 6f 73 65 0a 20 20 0a 20 20 20 20 73 65 74 20 63  ose.  .    set c
0ad0: 72 61 73 68 66 69 6c 65 20 74 65 73 74 2e 64 62  rashfile test.db
0ae0: 0a 20 20 20 20 69 66 20 7b 28 24 69 69 25 32 29  .    if {($ii%2)
0af0: 3d 3d 30 7d 20 7b 20 61 70 70 65 6e 64 20 63 72  ==0} { append cr
0b00: 61 73 68 66 69 6c 65 20 2d 6a 6f 75 72 6e 61 6c  ashfile -journal
0b10: 20 7d 0a 20 20 20 20 73 65 74 20 72 61 6e 64 20   }.    set rand 
0b20: 22 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28  "SELECT randstr(
0b30: 24 74 6e 2c 24 74 6e 29 3b 22 0a 20 20 20 20 64  $tn,$tn);".    d
0b40: 6f 5f 74 65 73 74 20 63 72 61 73 68 33 2d 31 2e  o_test crash3-1.
0b50: 24 74 6e 2e 32 20 5b 73 75 62 73 74 20 7b 0a 20  $tn.2 [subst {. 
0b60: 20 20 20 20 20 63 72 61 73 68 73 71 6c 20 2d 66       crashsql -f
0b70: 69 6c 65 20 24 63 72 61 73 68 66 69 6c 65 20 2d  ile $crashfile -
0b80: 63 68 61 72 20 61 74 6f 6d 69 63 20 7b 24 72 61  char atomic {$ra
0b90: 6e 64 20 24 73 71 6c 7d 0a 20 20 20 20 20 20 73  nd $sql}.      s
0ba0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
0bb0: 62 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  b.      execsql 
0bc0: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
0bd0: 74 79 5f 63 68 65 63 6b 3b 20 7d 0a 20 20 20 20  ty_check; }.    
0be0: 7d 5d 20 7b 6f 6b 7d 0a 20 20 0a 20 20 20 20 64  }] {ok}.  .    d
0bf0: 6f 5f 74 65 73 74 32 20 63 72 61 73 68 33 2d 31  o_test2 crash3-1
0c00: 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 20 20 65  .$tn.3 {.      e
0c10: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0c20: 2a 20 46 52 4f 4d 20 61 62 63 20 7d 0a 20 20 20  * FROM abc }.   
0c30: 20 7d 20 7b 31 20 32 20 33 7d 20 24 72 65 73 32   } {1 2 3} $res2
0c40: 0a 0a 20 20 20 20 69 6e 63 72 20 74 6e 0a 20 20  ..    incr tn.  
0c50: 7d 0a 7d 0a 0a 23 20 54 68 69 73 20 62 6c 6f 63  }.}..# This bloc
0c60: 6b 20 74 65 73 74 73 20 62 6f 74 68 20 74 68 65  k tests both the
0c70: 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
0c80: 4c 20 61 6e 64 20 49 4f 43 41 50 5f 53 41 46 45  L and IOCAP_SAFE
0c90: 5f 41 50 50 45 4e 44 20 66 6c 61 67 73 2e 0a 23  _APPEND flags..#
0ca0: 0a 64 62 20 63 6c 6f 73 65 0a 66 69 6c 65 20 64  .db close.file d
0cb0: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
0cc0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75  t.db test.db-jou
0cd0: 72 6e 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 20  rnal.sqlite3 db 
0ce0: 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20  test.db.do_test 
0cf0: 63 72 61 73 68 33 2d 32 2e 30 20 7b 0a 20 20 65  crash3-2.0 {.  e
0d00: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
0d10: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
0d20: 41 42 4c 45 20 61 62 63 28 61 20 50 52 49 4d 41  ABLE abc(a PRIMA
0d30: 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20  RY KEY, b, c);. 
0d40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0d50: 64 65 66 28 64 20 50 52 49 4d 41 52 59 20 4b 45  def(d PRIMARY KE
0d60: 59 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20 50 52  Y, e, f);.    PR
0d70: 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63 61 63  AGMA default_cac
0d80: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
0d90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
0da0: 63 20 56 41 4c 55 45 53 28 72 61 6e 64 73 74 72  c VALUES(randstr
0db0: 28 31 30 2c 31 30 30 30 29 2c 72 61 6e 64 73 74  (10,1000),randst
0dc0: 72 28 31 30 2c 31 30 30 30 29 2c 72 61 6e 64 73  r(10,1000),rands
0dd0: 74 72 28 31 30 2c 31 30 30 30 29 29 3b 0a 20 20  tr(10,1000));.  
0de0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
0df0: 63 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  c .      SELECT 
0e00: 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29  randstr(10,1000)
0e10: 2c 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30  ,randstr(10,1000
0e20: 29 2c 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30  ),randstr(10,100
0e30: 30 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20  0) FROM abc;.   
0e40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
0e50: 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 72   .      SELECT r
0e60: 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c  andstr(10,1000),
0e70: 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29  randstr(10,1000)
0e80: 2c 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30  ,randstr(10,1000
0e90: 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20  ) FROM abc;.    
0ea0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
0eb0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 72 61  .      SELECT ra
0ec0: 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72  ndstr(10,1000),r
0ed0: 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c  andstr(10,1000),
0ee0: 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29  randstr(10,1000)
0ef0: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 49   FROM abc;.    I
0f00: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 0a  NSERT INTO abc .
0f10: 20 20 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e        SELECT ran
0f20: 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61  dstr(10,1000),ra
0f30: 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72  ndstr(10,1000),r
0f40: 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 20  andstr(10,1000) 
0f50: 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 49 4e  FROM abc;.    IN
0f60: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 0a 20  SERT INTO abc . 
0f70: 20 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64       SELECT rand
0f80: 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61 6e  str(10,1000),ran
0f90: 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61  dstr(10,1000),ra
0fa0: 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 20 46  ndstr(10,1000) F
0fb0: 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 49 4e 53  ROM abc;.    INS
0fc0: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 0a 20 20  ERT INTO abc .  
0fd0: 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64 73      SELECT rands
0fe0: 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61 6e 64  tr(10,1000),rand
0ff0: 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61 6e  str(10,1000),ran
1000: 64 73 74 72 28 31 30 2c 31 30 30 30 29 20 46 52  dstr(10,1000) FR
1010: 4f 4d 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d  OM abc;.    COMM
1020: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 73 65  IT;.  }.} {}..se
1030: 74 20 74 6e 20 31 0a 66 6f 72 65 61 63 68 20 7b  t tn 1.foreach {
1040: 3a 3a 63 72 61 73 68 66 69 6c 65 20 3a 3a 64 65  ::crashfile ::de
1050: 6c 61 79 20 3a 3a 63 68 61 72 7d 20 7b 0a 20 20  lay ::char} {.  
1060: 74 65 73 74 2e 64 62 20 20 20 20 20 20 20 20 20  test.db         
1070: 31 20 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 74  1 sequential.  t
1080: 65 73 74 2e 64 62 20 20 20 20 20 20 20 20 20 31  est.db         1
1090: 20 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20 74   safe_append.  t
10a0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 31  est.db-journal 1
10b0: 20 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 74 65   sequential.  te
10c0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 31 20  st.db-journal 1 
10d0: 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20 74 65  safe_append.  te
10e0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 32 20  st.db-journal 2 
10f0: 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20 74 65  safe_append.  te
1100: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 32 20  st.db-journal 2 
1110: 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 74 65 73  sequential.  tes
1120: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 33 20 73  t.db-journal 3 s
1130: 65 71 75 65 6e 74 69 61 6c 0a 20 20 74 65 73 74  equential.  test
1140: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 33 20 73 61  .db-journal 3 sa
1150: 66 65 5f 61 70 70 65 6e 64 0a 7d 20 7b 0a 20 20  fe_append.} {.  
1160: 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b  for {set ii 0} {
1170: 24 69 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72  $ii < 100} {incr
1180: 20 69 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 3a   ii} {.    set :
1190: 3a 53 51 4c 20 5b 73 75 62 73 74 20 7b 0a 20 20  :SQL [subst {.  
11a0: 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64 73      SELECT rands
11b0: 74 72 28 24 69 69 2c 24 69 69 2b 31 30 29 3b 0a  tr($ii,$ii+10);.
11c0: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
11d0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61     DELETE FROM a
11e0: 62 63 20 57 48 45 52 45 20 72 61 6e 64 6f 6d 28  bc WHERE random(
11f0: 29 25 35 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  )%5;.      INSER
1200: 54 20 49 4e 54 4f 20 61 62 63 20 0a 20 20 20 20  T INTO abc .    
1210: 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64 73      SELECT rands
1220: 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61 6e 64  tr(10,1000),rand
1230: 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61 6e  str(10,1000),ran
1240: 64 73 74 72 28 31 30 2c 31 30 30 30 29 20 0a 20  dstr(10,1000) . 
1250: 20 20 20 20 20 20 20 46 52 4f 4d 20 61 62 63 0a         FROM abc.
1260: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 28 72          WHERE (r
1270: 61 6e 64 6f 6d 28 29 25 35 29 3d 3d 30 3b 0a 20  andom()%5)==0;. 
1280: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
1290: 20 64 65 66 20 57 48 45 52 45 20 72 61 6e 64 6f   def WHERE rando
12a0: 6d 28 29 25 35 3b 0a 20 20 20 20 20 20 49 4e 53  m()%5;.      INS
12b0: 45 52 54 20 49 4e 54 4f 20 64 65 66 20 0a 20 20  ERT INTO def .  
12c0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e        SELECT ran
12d0: 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61  dstr(10,1000),ra
12e0: 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72  ndstr(10,1000),r
12f0: 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 20  andstr(10,1000) 
1300: 0a 20 20 20 20 20 20 20 20 46 52 4f 4d 20 64 65  .        FROM de
1310: 66 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  f.        WHERE 
1320: 28 72 61 6e 64 6f 6d 28 29 25 35 29 3d 3d 30 3b  (random()%5)==0;
1330: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
1340: 20 20 20 7d 5d 0a 0a 20 20 20 20 64 6f 5f 74 65     }]..    do_te
1350: 73 74 20 63 72 61 73 68 33 2d 32 2e 24 74 6e 2e  st crash3-2.$tn.
1360: 24 69 69 20 7b 0a 20 20 20 20 20 20 63 72 61 73  $ii {.      cras
1370: 68 73 71 6c 20 2d 66 69 6c 65 20 24 3a 3a 63 72  hsql -file $::cr
1380: 61 73 68 66 69 6c 65 20 2d 64 65 6c 61 79 20 24  ashfile -delay $
1390: 3a 3a 64 65 6c 61 79 20 2d 63 68 61 72 20 24 3a  ::delay -char $:
13a0: 3a 63 68 61 72 20 24 3a 3a 53 51 4c 0a 20 20 20  :char $::SQL.   
13b0: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
13c0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
13d0: 74 2e 64 62 0a 20 20 20 20 20 20 65 78 65 63 73  t.db.      execs
13e0: 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67  ql {PRAGMA integ
13f0: 72 69 74 79 5f 63 68 65 63 6b 7d 0a 20 20 20 20  rity_check}.    
1400: 7d 20 7b 6f 6b 7d 0a 20 20 7d 0a 20 20 69 6e 63  } {ok}.  }.  inc
1410: 72 20 74 6e 0a 7d 0a 0a 23 20 54 68 65 20 66 6f  r tn.}..# The fo
1420: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 74 65  llowing block te
1430: 73 74 73 20 61 6e 20 69 6e 74 65 72 61 63 74 69  sts an interacti
1440: 6f 6e 20 62 65 74 77 65 65 6e 20 49 4f 43 41 50  on between IOCAP
1450: 5f 41 54 4f 4d 49 43 20 61 6e 64 0a 23 20 49 4f  _ATOMIC and.# IO
1460: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 2e 20  CAP_SEQUENTIAL. 
1470: 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c 20 69 66  At one point, if
1480: 20 62 6f 74 68 20 66 6c 61 67 73 20 77 65 72 65   both flags were
1490: 20 73 65 74 2c 20 73 6d 61 6c 6c 0a 23 20 6a 6f   set, small.# jo
14a0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
14b0: 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 6c 79 20   contained only 
14c0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2c 20 62  a single page, b
14d0: 75 74 20 77 65 72 65 20 72 65 71 75 69 72 65 64  ut were required
14e0: 20 0a 23 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68   .# for some oth
14f0: 65 72 20 72 65 61 73 6f 6e 20 28 69 2e 65 2e 20  er reason (i.e. 
1500: 6e 54 72 75 6e 6b 29 20 77 65 72 65 20 6e 6f 74  nTrunk) were not
1510: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 74   being written t
1520: 6f 0a 23 20 64 69 73 6b 2e 0a 23 0a 66 6f 72 20  o.# disk..#.for 
1530: 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69 20  {set ii 0} {$ii 
1540: 3c 20 31 30 7d 20 7b 69 6e 63 72 20 69 69 7d 20  < 10} {incr ii} 
1550: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66  {.  db close.  f
1560: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
1570: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
1580: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 63 72 61 73  b-journal.  cras
1590: 68 73 71 6c 20 2d 66 69 6c 65 20 74 65 73 74 2e  hsql -file test.
15a0: 64 62 20 2d 63 68 61 72 20 7b 73 65 71 75 65 6e  db -char {sequen
15b0: 74 69 61 6c 20 61 74 6f 6d 69 63 7d 20 7b 0a 20  tial atomic} {. 
15c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
15d0: 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20  abc(a, b, c);.  
15e0: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  }.  sqlite3 db t
15f0: 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74  est.db.  do_test
1600: 20 63 72 61 73 68 33 2d 33 2e 24 69 69 20 7b 0a   crash3-3.$ii {.
1610: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41      execsql {PRA
1620: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
1630: 65 63 6b 7d 0a 20 20 7d 20 7b 6f 6b 7d 0a 7d 0a  eck}.  } {ok}.}.
1640: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.