/ Hex Artifact Content
Login

Artifact 8f5de9d32ab9ab95475a9efe7f47a940aa889418:


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 6f 72 63 65   close.    force
09b0: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74  delete test.db t
09c0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20  est.db-journal. 
09d0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
09e0: 73 74 2e 64 62 0a 20 20 20 20 64 6f 5f 74 65 73  st.db.    do_tes
09f0: 74 20 63 72 61 73 68 33 2d 31 2e 24 74 6e 2e 31  t crash3-1.$tn.1
0a00: 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   {.      execsql
0a10: 20 7b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d   {.        PRAGM
0a20: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
0a30: 32 34 3b 0a 20 20 20 20 20 20 20 20 42 45 47 49  24;.        BEGI
0a40: 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  N;.        CREAT
0a50: 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62  E TABLE abc(a, b
0a60: 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  , c);.        IN
0a70: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
0a80: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
0a90: 20 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20         COMMIT;. 
0aa0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a       }.    } {}.
0ab0: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 0a      db close.  .
0ac0: 20 20 20 20 73 65 74 20 63 72 61 73 68 66 69 6c      set crashfil
0ad0: 65 20 74 65 73 74 2e 64 62 0a 20 20 20 20 69 66  e test.db.    if
0ae0: 20 7b 28 24 69 69 25 32 29 3d 3d 30 7d 20 7b 20   {($ii%2)==0} { 
0af0: 61 70 70 65 6e 64 20 63 72 61 73 68 66 69 6c 65  append crashfile
0b00: 20 2d 6a 6f 75 72 6e 61 6c 20 7d 0a 20 20 20 20   -journal }.    
0b10: 73 65 74 20 72 61 6e 64 20 22 53 45 4c 45 43 54  set rand "SELECT
0b20: 20 72 61 6e 64 73 74 72 28 24 74 6e 2c 24 74 6e   randstr($tn,$tn
0b30: 29 3b 22 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  );".    do_test 
0b40: 63 72 61 73 68 33 2d 31 2e 24 74 6e 2e 32 20 5b  crash3-1.$tn.2 [
0b50: 73 75 62 73 74 20 7b 0a 20 20 20 20 20 20 63 72  subst {.      cr
0b60: 61 73 68 73 71 6c 20 2d 66 69 6c 65 20 24 63 72  ashsql -file $cr
0b70: 61 73 68 66 69 6c 65 20 2d 63 68 61 72 20 61 74  ashfile -char at
0b80: 6f 6d 69 63 20 7b 24 72 61 6e 64 20 24 73 71 6c  omic {$rand $sql
0b90: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  }.      sqlite3 
0ba0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 20  db test.db.     
0bb0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
0bc0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
0bd0: 6b 3b 20 7d 0a 20 20 20 20 7d 5d 20 7b 6f 6b 7d  k; }.    }] {ok}
0be0: 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65 73 74 32  .  .    do_test2
0bf0: 20 63 72 61 73 68 33 2d 31 2e 24 74 6e 2e 33 20   crash3-1.$tn.3 
0c00: 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  {.      execsql 
0c10: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0c20: 61 62 63 20 7d 0a 20 20 20 20 7d 20 7b 31 20 32  abc }.    } {1 2
0c30: 20 33 7d 20 24 72 65 73 32 0a 0a 20 20 20 20 69   3} $res2..    i
0c40: 6e 63 72 20 74 6e 0a 20 20 7d 0a 7d 0a 0a 23 20  ncr tn.  }.}..# 
0c50: 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
0c60: 20 62 6f 74 68 20 74 68 65 20 49 4f 43 41 50 5f   both the IOCAP_
0c70: 53 45 51 55 45 4e 54 49 41 4c 20 61 6e 64 20 49  SEQUENTIAL and I
0c80: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
0c90: 20 66 6c 61 67 73 2e 0a 23 0a 64 62 20 63 6c 6f   flags..#.db clo
0ca0: 73 65 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  se.forcedelete t
0cb0: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a  est.db test.db-j
0cc0: 6f 75 72 6e 61 6c 0a 73 71 6c 69 74 65 33 20 64  ournal.sqlite3 d
0cd0: 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73  b test.db.do_tes
0ce0: 74 20 63 72 61 73 68 33 2d 32 2e 30 20 7b 0a 20  t crash3-2.0 {. 
0cf0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
0d00: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
0d10: 20 54 41 42 4c 45 20 61 62 63 28 61 20 50 52 49   TABLE abc(a PRI
0d20: 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b  MARY KEY, b, c);
0d30: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0d40: 45 20 64 65 66 28 64 20 50 52 49 4d 41 52 59 20  E def(d PRIMARY 
0d50: 4b 45 59 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20  KEY, e, f);.    
0d60: 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63  PRAGMA default_c
0d70: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
0d80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0d90: 61 62 63 20 56 41 4c 55 45 53 28 72 61 6e 64 73  abc VALUES(rands
0da0: 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61 6e 64  tr(10,1000),rand
0db0: 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61 6e  str(10,1000),ran
0dc0: 64 73 74 72 28 31 30 2c 31 30 30 30 29 29 3b 0a  dstr(10,1000));.
0dd0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0de0: 61 62 63 20 0a 20 20 20 20 20 20 53 45 4c 45 43  abc .      SELEC
0df0: 54 20 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30  T randstr(10,100
0e00: 30 29 2c 72 61 6e 64 73 74 72 28 31 30 2c 31 30  0),randstr(10,10
0e10: 30 30 29 2c 72 61 6e 64 73 74 72 28 31 30 2c 31  00),randstr(10,1
0e20: 30 30 30 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20  000) FROM abc;. 
0e30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
0e40: 62 63 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54  bc .      SELECT
0e50: 20 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30   randstr(10,1000
0e60: 29 2c 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30  ),randstr(10,100
0e70: 30 29 2c 72 61 6e 64 73 74 72 28 31 30 2c 31 30  0),randstr(10,10
0e80: 30 30 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20  00) FROM abc;.  
0e90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
0ea0: 63 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  c .      SELECT 
0eb0: 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29  randstr(10,1000)
0ec0: 2c 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30  ,randstr(10,1000
0ed0: 29 2c 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30  ),randstr(10,100
0ee0: 30 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20  0) FROM abc;.   
0ef0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
0f00: 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 72   .      SELECT r
0f10: 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c  andstr(10,1000),
0f20: 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29  randstr(10,1000)
0f30: 2c 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30  ,randstr(10,1000
0f40: 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20  ) FROM abc;.    
0f50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
0f60: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 72 61  .      SELECT ra
0f70: 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72  ndstr(10,1000),r
0f80: 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c  andstr(10,1000),
0f90: 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29  randstr(10,1000)
0fa0: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 49   FROM abc;.    I
0fb0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 0a  NSERT INTO abc .
0fc0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e        SELECT ran
0fd0: 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61  dstr(10,1000),ra
0fe0: 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72  ndstr(10,1000),r
0ff0: 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 20  andstr(10,1000) 
1000: 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 43 4f  FROM abc;.    CO
1010: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  MMIT;.  }.} {}..
1020: 73 65 74 20 74 6e 20 31 0a 66 6f 72 65 61 63 68  set tn 1.foreach
1030: 20 7b 3a 3a 63 72 61 73 68 66 69 6c 65 20 3a 3a   {::crashfile ::
1040: 64 65 6c 61 79 20 3a 3a 63 68 61 72 7d 20 7b 0a  delay ::char} {.
1050: 20 20 74 65 73 74 2e 64 62 20 20 20 20 20 20 20    test.db       
1060: 20 20 31 20 73 65 71 75 65 6e 74 69 61 6c 0a 20    1 sequential. 
1070: 20 74 65 73 74 2e 64 62 20 20 20 20 20 20 20 20   test.db        
1080: 20 31 20 73 61 66 65 5f 61 70 70 65 6e 64 0a 20   1 safe_append. 
1090: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
10a0: 20 31 20 73 65 71 75 65 6e 74 69 61 6c 0a 20 20   1 sequential.  
10b0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
10c0: 31 20 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20  1 safe_append.  
10d0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
10e0: 32 20 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20  2 safe_append.  
10f0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
1100: 32 20 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 74  2 sequential.  t
1110: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 33  est.db-journal 3
1120: 20 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 74 65   sequential.  te
1130: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 33 20  st.db-journal 3 
1140: 73 61 66 65 5f 61 70 70 65 6e 64 0a 7d 20 7b 0a  safe_append.} {.
1150: 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d    for {set ii 0}
1160: 20 7b 24 69 69 20 3c 20 31 30 30 7d 20 7b 69 6e   {$ii < 100} {in
1170: 63 72 20 69 69 7d 20 7b 0a 20 20 20 20 73 65 74  cr ii} {.    set
1180: 20 3a 3a 53 51 4c 20 5b 73 75 62 73 74 20 7b 0a   ::SQL [subst {.
1190: 20 20 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e        SELECT ran
11a0: 64 73 74 72 28 24 69 69 2c 24 69 69 2b 31 30 29  dstr($ii,$ii+10)
11b0: 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  ;.      BEGIN;. 
11c0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
11d0: 20 61 62 63 20 57 48 45 52 45 20 72 61 6e 64 6f   abc WHERE rando
11e0: 6d 28 29 25 35 3b 0a 20 20 20 20 20 20 49 4e 53  m()%5;.      INS
11f0: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 0a 20 20  ERT INTO abc .  
1200: 20 20 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e        SELECT ran
1210: 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72 61  dstr(10,1000),ra
1220: 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c 72  ndstr(10,1000),r
1230: 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 20  andstr(10,1000) 
1240: 0a 20 20 20 20 20 20 20 20 46 52 4f 4d 20 61 62  .        FROM ab
1250: 63 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  c.        WHERE 
1260: 28 72 61 6e 64 6f 6d 28 29 25 35 29 3d 3d 30 3b  (random()%5)==0;
1270: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
1280: 4f 4d 20 64 65 66 20 57 48 45 52 45 20 72 61 6e  OM def WHERE ran
1290: 64 6f 6d 28 29 25 35 3b 0a 20 20 20 20 20 20 49  dom()%5;.      I
12a0: 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 66 20 0a  NSERT INTO def .
12b0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 72          SELECT r
12c0: 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29 2c  andstr(10,1000),
12d0: 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30 29  randstr(10,1000)
12e0: 2c 72 61 6e 64 73 74 72 28 31 30 2c 31 30 30 30  ,randstr(10,1000
12f0: 29 20 0a 20 20 20 20 20 20 20 20 46 52 4f 4d 20  ) .        FROM 
1300: 64 65 66 0a 20 20 20 20 20 20 20 20 57 48 45 52  def.        WHER
1310: 45 20 28 72 61 6e 64 6f 6d 28 29 25 35 29 3d 3d  E (random()%5)==
1320: 30 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  0;.      COMMIT;
1330: 0a 20 20 20 20 7d 5d 0a 0a 20 20 20 20 64 6f 5f  .    }]..    do_
1340: 74 65 73 74 20 63 72 61 73 68 33 2d 32 2e 24 74  test crash3-2.$t
1350: 6e 2e 24 69 69 20 7b 0a 20 20 20 20 20 20 63 72  n.$ii {.      cr
1360: 61 73 68 73 71 6c 20 2d 66 69 6c 65 20 24 3a 3a  ashsql -file $::
1370: 63 72 61 73 68 66 69 6c 65 20 2d 64 65 6c 61 79  crashfile -delay
1380: 20 24 3a 3a 64 65 6c 61 79 20 2d 63 68 61 72 20   $::delay -char 
1390: 24 3a 3a 63 68 61 72 20 24 3a 3a 53 51 4c 0a 20  $::char $::SQL. 
13a0: 20 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20       db close.  
13b0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
13c0: 65 73 74 2e 64 62 0a 20 20 20 20 20 20 65 78 65  est.db.      exe
13d0: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74  csql {PRAGMA int
13e0: 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 0a 20 20  egrity_check}.  
13f0: 20 20 7d 20 7b 6f 6b 7d 0a 20 20 7d 0a 20 20 69    } {ok}.  }.  i
1400: 6e 63 72 20 74 6e 0a 7d 0a 0a 23 20 54 68 65 20  ncr tn.}..# The 
1410: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
1420: 74 65 73 74 73 20 61 6e 20 69 6e 74 65 72 61 63  tests an interac
1430: 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 49 4f 43  tion between IOC
1440: 41 50 5f 41 54 4f 4d 49 43 20 61 6e 64 0a 23 20  AP_ATOMIC and.# 
1450: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1460: 2e 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c 20  . At one point, 
1470: 69 66 20 62 6f 74 68 20 66 6c 61 67 73 20 77 65  if both flags we
1480: 72 65 20 73 65 74 2c 20 73 6d 61 6c 6c 0a 23 20  re set, small.# 
1490: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68  journal files th
14a0: 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 6c  at contained onl
14b0: 79 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2c  y a single page,
14c0: 20 62 75 74 20 77 65 72 65 20 72 65 71 75 69 72   but were requir
14d0: 65 64 20 0a 23 20 66 6f 72 20 73 6f 6d 65 20 6f  ed .# for some o
14e0: 74 68 65 72 20 72 65 61 73 6f 6e 20 28 69 2e 65  ther reason (i.e
14f0: 2e 20 6e 54 72 75 6e 6b 29 20 77 65 72 65 20 6e  . nTrunk) were n
1500: 6f 74 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ot being written
1510: 20 74 6f 0a 23 20 64 69 73 6b 2e 0a 23 0a 66 6f   to.# disk..#.fo
1520: 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69  r {set ii 0} {$i
1530: 69 20 3c 20 31 30 7d 20 7b 69 6e 63 72 20 69 69  i < 10} {incr ii
1540: 7d 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  } {.  db close. 
1550: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
1560: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75  t.db test.db-jou
1570: 72 6e 61 6c 0a 20 20 63 72 61 73 68 73 71 6c 20  rnal.  crashsql 
1580: 2d 66 69 6c 65 20 74 65 73 74 2e 64 62 20 2d 63  -file test.db -c
1590: 68 61 72 20 7b 73 65 71 75 65 6e 74 69 61 6c 20  har {sequential 
15a0: 61 74 6f 6d 69 63 7d 20 7b 0a 20 20 20 20 43 52  atomic} {.    CR
15b0: 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61  EATE TABLE abc(a
15c0: 2c 20 62 2c 20 63 29 3b 0a 20 20 7d 0a 20 20 73  , b, c);.  }.  s
15d0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
15e0: 62 0a 20 20 64 6f 5f 74 65 73 74 20 63 72 61 73  b.  do_test cras
15f0: 68 33 2d 33 2e 24 69 69 20 7b 0a 20 20 20 20 65  h3-3.$ii {.    e
1600: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69  xecsql {PRAGMA i
1610: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 0a  ntegrity_check}.
1620: 20 20 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 66 69 6e 69    } {ok}.}..fini
1630: 73 68 5f 74 65 73 74 0a                          sh_test.