/ Hex Artifact Content
Login

Artifact ca9db7cd57a1b02cd983863c1be1153e1900e68b:


0000: 23 20 32 30 30 37 20 41 75 67 75 73 74 20 32 31  # 2007 August 21
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 65 20 66  ******.#.# The f
0170: 6f 63 75 73 20 6f 66 20 74 68 69 73 20 66 69 6c  ocus of this fil
0180: 65 20 69 73 20 74 65 73 74 69 6e 67 20 73 6f 6d  e is testing som
0190: 65 20 73 70 65 63 69 66 69 63 20 63 68 61 72 61  e specific chara
01a0: 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
01b0: 65 20 0a 23 20 49 4f 20 74 72 61 66 66 69 63 20  e .# IO traffic 
01c0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 53 51 4c  generated by SQL
01d0: 69 74 65 20 28 6d 61 6b 69 6e 67 20 73 75 72 65  ite (making sure
01e0: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 77   SQLite is not w
01f0: 72 69 74 69 6e 67 20 6f 75 74 0a 23 20 6d 6f 72  riting out.# mor
0200: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  e database pages
0210: 20 74 68 61 6e 20 69 74 20 68 61 73 20 74 6f 2c   than it has to,
0220: 20 73 74 75 66 66 20 6c 69 6b 65 20 74 68 61 74   stuff like that
0230: 29 2e 0a 23 0a 23 20 24 49 64 3a 20 69 6f 2e 74  )..#.# $Id: io.t
0240: 65 73 74 2c 76 20 31 2e 33 20 32 30 30 37 2f 30  est,v 1.3 2007/0
0250: 38 2f 32 33 20 30 38 3a 30 36 3a 34 35 20 64 61  8/23 08:06:45 da
0260: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
0270: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
0280: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0290: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
02a0: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 23  ir/tester.tcl..#
02b0: 20 54 65 73 74 20 73 75 6d 6d 61 72 79 3a 0a 23   Test summary:.#
02c0: 0a 23 20 69 6f 2d 31 2e 2a 20 2d 20 20 54 65 73  .# io-1.* -  Tes
02d0: 74 20 74 68 61 74 20 71 75 69 63 6b 2d 62 61 6c  t that quick-bal
02e0: 61 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 6a 6f  ance does not jo
02f0: 75 72 6e 61 6c 20 70 61 67 65 73 20 75 6e 6e 65  urnal pages unne
0300: 63 65 73 73 61 72 69 6c 79 2e 0a 23 20 69 6f 2d  cessarily..# io-
0310: 32 2e 2a 20 2d 20 20 54 65 73 74 20 74 68 61 74  2.* -  Test that
0320: 20 77 68 65 6e 20 74 68 65 20 61 74 6f 6d 69 63   when the atomic
0330: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 73 61 74  -write optimisat
0340: 69 6f 6e 20 69 73 20 75 73 65 64 20 6e 6f 0a 23  ion is used no.#
0350: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
0360: 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
0370: 65 64 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20  ed..#           
0380: 0a 0a 73 65 74 20 3a 3a 6e 57 72 69 74 65 20 30  ..set ::nWrite 0
0390: 0a 70 72 6f 63 20 6e 57 72 69 74 65 20 7b 64 62  .proc nWrite {db
03a0: 7d 20 7b 0a 20 20 73 65 74 20 62 74 20 5b 62 74  } {.  set bt [bt
03b0: 72 65 65 5f 66 72 6f 6d 5f 64 62 20 24 64 62 5d  ree_from_db $db]
03c0: 0a 20 20 64 62 5f 65 6e 74 65 72 20 24 64 62 0a  .  db_enter $db.
03d0: 20 20 61 72 72 61 79 20 73 65 74 20 73 74 61 74    array set stat
03e0: 73 20 5b 62 74 72 65 65 5f 70 61 67 65 72 5f 73  s [btree_pager_s
03f0: 74 61 74 73 20 24 62 74 5d 0a 20 20 64 62 5f 6c  tats $bt].  db_l
0400: 65 61 76 65 20 24 64 62 0a 20 20 73 65 74 20 72  eave $db.  set r
0410: 65 73 20 5b 65 78 70 72 20 24 73 74 61 74 73 28  es [expr $stats(
0420: 77 72 69 74 65 29 20 2d 20 24 3a 3a 6e 57 72 69  write) - $::nWri
0430: 74 65 5d 0a 20 20 73 65 74 20 3a 3a 6e 57 72 69  te].  set ::nWri
0440: 74 65 20 24 73 74 61 74 73 28 77 72 69 74 65 29  te $stats(write)
0450: 0a 20 20 73 65 74 20 72 65 73 0a 7d 0a 0a 73 65  .  set res.}..se
0460: 74 20 3a 3a 6e 53 79 6e 63 20 30 0a 70 72 6f 63  t ::nSync 0.proc
0470: 20 6e 53 79 6e 63 20 7b 7d 20 7b 0a 20 20 73 65   nSync {} {.  se
0480: 74 20 72 65 73 20 5b 65 78 70 72 20 7b 24 3a 3a  t res [expr {$::
0490: 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e  sqlite_sync_coun
04a0: 74 20 2d 20 24 3a 3a 6e 53 79 6e 63 7d 5d 0a 20  t - $::nSync}]. 
04b0: 20 73 65 74 20 3a 3a 6e 53 79 6e 63 20 24 3a 3a   set ::nSync $::
04c0: 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e  sqlite_sync_coun
04d0: 74 0a 20 20 73 65 74 20 72 65 73 0a 7d 0a 0a 64  t.  set res.}..d
04e0: 6f 5f 74 65 73 74 20 69 6f 2d 31 2e 31 20 7b 0a  o_test io-1.1 {.
04f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0500: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
0510: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
0520: 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c  ATE TABLE abc(a,
0530: 62 29 3b 0a 20 20 7d 0a 20 20 6e 57 72 69 74 65  b);.  }.  nWrite
0540: 20 64 62 0a 7d 20 7b 32 7d 0a 0a 23 20 49 6e 73   db.} {2}..# Ins
0550: 65 72 74 20 69 6e 74 6f 20 74 68 65 20 74 61 62  ert into the tab
0560: 6c 65 20 34 20 72 65 63 6f 72 64 73 20 6f 66 20  le 4 records of 
0570: 61 70 72 6f 78 69 6d 61 74 65 6c 79 20 32 34 30  aproximately 240
0580: 20 62 79 74 65 73 20 65 61 63 68 2e 0a 23 20 54   bytes each..# T
0590: 68 69 73 20 73 68 6f 75 6c 64 20 63 6f 6d 70 6c  his should compl
05a0: 65 74 65 6c 79 20 66 69 6c 6c 20 74 68 65 20 72  etely fill the r
05b0: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68 65 20  oot-page of the 
05c0: 74 61 62 6c 65 2e 20 45 61 63 68 0a 23 20 49 4e  table. Each.# IN
05d0: 53 45 52 54 20 63 61 75 73 65 73 20 32 20 64 62  SERT causes 2 db
05e0: 20 70 61 67 65 73 20 74 6f 20 62 65 20 77 72 69   pages to be wri
05f0: 74 74 65 6e 20 2d 20 74 68 65 20 72 6f 6f 74 2d  tten - the root-
0600: 70 61 67 65 20 6f 66 20 22 61 62 63 22 0a 23 20  page of "abc".# 
0610: 61 6e 64 20 70 61 67 65 20 31 20 28 64 62 20 63  and page 1 (db c
0620: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 70 61  hange-counter pa
0630: 67 65 29 2e 0a 64 6f 5f 74 65 73 74 20 69 6f 2d  ge)..do_test io-
0640: 31 2e 32 20 7b 0a 20 20 73 65 74 20 72 65 74 20  1.2 {.  set ret 
0650: 5b 6c 69 73 74 5d 0a 20 20 65 78 65 63 73 71 6c  [list].  execsql
0660: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61   { INSERT INTO a
0670: 62 63 20 56 41 4c 55 45 53 28 31 2c 72 61 6e 64  bc VALUES(1,rand
0680: 73 74 72 28 32 33 30 2c 32 33 30 29 29 3b 20 7d  str(230,230)); }
0690: 0a 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20 5b  .  lappend ret [
06a0: 6e 57 72 69 74 65 20 64 62 5d 0a 20 20 65 78 65  nWrite db].  exe
06b0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
06c0: 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 32 2c  TO abc VALUES(2,
06d0: 72 61 6e 64 73 74 72 28 32 33 30 2c 32 33 30 29  randstr(230,230)
06e0: 29 3b 20 7d 0a 20 20 6c 61 70 70 65 6e 64 20 72  ); }.  lappend r
06f0: 65 74 20 5b 6e 57 72 69 74 65 20 64 62 5d 0a 20  et [nWrite db]. 
0700: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
0710: 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45  T INTO abc VALUE
0720: 53 28 33 2c 72 61 6e 64 73 74 72 28 32 33 30 2c  S(3,randstr(230,
0730: 32 33 30 29 29 3b 20 7d 0a 20 20 6c 61 70 70 65  230)); }.  lappe
0740: 6e 64 20 72 65 74 20 5b 6e 57 72 69 74 65 20 64  nd ret [nWrite d
0750: 62 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49  b].  execsql { I
0760: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
0770: 41 4c 55 45 53 28 34 2c 72 61 6e 64 73 74 72 28  ALUES(4,randstr(
0780: 32 33 30 2c 32 33 30 29 29 3b 20 7d 0a 20 20 6c  230,230)); }.  l
0790: 61 70 70 65 6e 64 20 72 65 74 20 5b 6e 57 72 69  append ret [nWri
07a0: 74 65 20 64 62 5d 0a 7d 20 7b 32 20 32 20 32 20  te db].} {2 2 2 
07b0: 32 7d 0a 0a 23 20 49 6e 73 65 72 74 20 61 6e 6f  2}..# Insert ano
07c0: 74 68 65 72 20 32 34 30 20 62 79 74 65 20 72 65  ther 240 byte re
07d0: 63 6f 72 64 2e 20 54 68 69 73 20 63 61 75 73 65  cord. This cause
07e0: 73 20 74 77 6f 20 6c 65 61 66 20 70 61 67 65 73  s two leaf pages
07f0: 0a 23 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  .# to be added t
0800: 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
0810: 6f 66 20 61 62 63 2e 20 34 20 70 61 67 65 73 20  of abc. 4 pages 
0820: 69 6e 20 74 6f 74 61 6c 0a 23 20 61 72 65 20 77  in total.# are w
0830: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 62  ritten to the db
0840: 20 66 69 6c 65 20 2d 20 74 68 65 20 74 77 6f 20   file - the two 
0850: 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 20  leaf pages, the 
0860: 72 6f 6f 74 0a 23 20 6f 66 20 61 62 63 20 61 6e  root.# of abc an
0870: 64 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  d the change-cou
0880: 6e 74 65 72 20 70 61 67 65 2e 0a 64 6f 5f 74 65  nter page..do_te
0890: 73 74 20 69 6f 2d 31 2e 33 20 7b 0a 20 20 65 78  st io-1.3 {.  ex
08a0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
08b0: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 35  NTO abc VALUES(5
08c0: 2c 72 61 6e 64 73 74 72 28 32 33 30 2c 32 33 30  ,randstr(230,230
08d0: 29 29 3b 20 7d 0a 20 20 6e 57 72 69 74 65 20 64  )); }.  nWrite d
08e0: 62 0a 7d 20 7b 34 7d 0a 0a 23 20 49 6e 73 65 72  b.} {4}..# Inser
08f0: 74 20 61 6e 6f 74 68 65 72 20 33 20 32 34 30 20  t another 3 240 
0900: 62 79 74 65 20 72 65 63 6f 72 64 73 2e 20 41 66  byte records. Af
0910: 74 65 72 20 74 68 69 73 2c 20 74 68 65 20 74 72  ter this, the tr
0920: 65 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 0a  ee consists of .
0930: 23 20 74 68 65 20 72 6f 6f 74 2d 6e 6f 64 65 2c  # the root-node,
0940: 20 77 68 69 63 68 20 69 73 20 63 6c 6f 73 65 20   which is close 
0950: 74 6f 20 65 6d 70 74 79 2c 20 61 6e 64 20 74 77  to empty, and tw
0960: 6f 20 6c 65 61 66 20 70 61 67 65 73 2c 20 62 6f  o leaf pages, bo
0970: 74 68 20 6f 66 20 0a 23 20 77 68 69 63 68 20 61  th of .# which a
0980: 72 65 20 66 75 6c 6c 2e 20 0a 64 6f 5f 74 65 73  re full. .do_tes
0990: 74 20 69 6f 2d 31 2e 34 20 7b 0a 20 20 73 65 74  t io-1.4 {.  set
09a0: 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20 65 78   ret [list].  ex
09b0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
09c0: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 36  NTO abc VALUES(6
09d0: 2c 72 61 6e 64 73 74 72 28 32 33 30 2c 32 33 30  ,randstr(230,230
09e0: 29 29 3b 20 7d 0a 20 20 6c 61 70 70 65 6e 64 20  )); }.  lappend 
09f0: 72 65 74 20 5b 6e 57 72 69 74 65 20 64 62 5d 0a  ret [nWrite db].
0a00: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
0a10: 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55  RT INTO abc VALU
0a20: 45 53 28 37 2c 72 61 6e 64 73 74 72 28 32 33 30  ES(7,randstr(230
0a30: 2c 32 33 30 29 29 3b 20 7d 0a 20 20 6c 61 70 70  ,230)); }.  lapp
0a40: 65 6e 64 20 72 65 74 20 5b 6e 57 72 69 74 65 20  end ret [nWrite 
0a50: 64 62 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  db].  execsql { 
0a60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
0a70: 56 41 4c 55 45 53 28 38 2c 72 61 6e 64 73 74 72  VALUES(8,randstr
0a80: 28 32 33 30 2c 32 33 30 29 29 3b 20 7d 0a 20 20  (230,230)); }.  
0a90: 6c 61 70 70 65 6e 64 20 72 65 74 20 5b 6e 57 72  lappend ret [nWr
0aa0: 69 74 65 20 64 62 5d 0a 7d 20 7b 32 20 32 20 32  ite db].} {2 2 2
0ab0: 7d 0a 0a 23 20 54 68 69 73 20 69 6e 73 65 72 74  }..# This insert
0ac0: 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 65 20   should use the 
0ad0: 71 75 69 63 6b 2d 62 61 6c 61 6e 63 65 20 74 72  quick-balance tr
0ae0: 69 63 6b 20 74 6f 20 61 64 64 20 61 20 74 68 69  ick to add a thi
0af0: 72 64 20 6c 65 61 66 0a 23 20 74 6f 20 74 68 65  rd leaf.# to the
0b00: 20 62 2d 74 72 65 65 20 75 73 65 64 20 74 6f 20   b-tree used to 
0b10: 73 74 6f 72 65 20 74 61 62 6c 65 20 61 62 63 2e  store table abc.
0b20: 20 49 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20   It should only 
0b30: 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  be necessary to.
0b40: 23 20 77 72 69 74 65 20 74 6f 20 33 20 70 61 67  # write to 3 pag
0b50: 65 73 20 74 6f 20 64 6f 20 74 68 69 73 3a 20 74  es to do this: t
0b60: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
0b70: 72 2c 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  r, the root-page
0b80: 20 61 6e 64 0a 23 20 74 68 65 20 6e 65 77 20 6c   and.# the new l
0b90: 65 61 66 20 70 61 67 65 2e 0a 64 6f 5f 74 65 73  eaf page..do_tes
0ba0: 74 20 69 6f 2d 31 2e 35 20 7b 0a 20 20 65 78 65  t io-1.5 {.  exe
0bb0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0bc0: 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 39 2c  TO abc VALUES(9,
0bd0: 72 61 6e 64 73 74 72 28 32 33 30 2c 32 33 30 29  randstr(230,230)
0be0: 29 3b 20 7d 0a 20 20 6e 57 72 69 74 65 20 64 62  ); }.  nWrite db
0bf0: 0a 7d 20 7b 33 7d 0a 0a 0a 0a 23 2d 2d 2d 2d 2d  .} {3}....#-----
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c40: 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73 20 69  -.# Test cases i
0c50: 6f 2d 32 2e 2a 20 74 65 73 74 20 74 68 65 20 61  o-2.* test the a
0c60: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
0c70: 6d 69 7a 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  mization..#.do_t
0c80: 65 73 74 20 69 6f 2d 32 2e 31 20 7b 0a 20 20 65  est io-2.1 {.  e
0c90: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  xecsql { DELETE 
0ca0: 46 52 4f 4d 20 61 62 63 3b 20 56 41 43 55 55 4d  FROM abc; VACUUM
0cb0: 3b 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 43 6c 65 61  ; }.} {}..# Clea
0cc0: 72 20 74 68 65 20 77 72 69 74 65 20 61 6e 64 20  r the write and 
0cd0: 73 79 6e 63 20 63 6f 75 6e 74 73 2e 0a 6e 57 72  sync counts..nWr
0ce0: 69 74 65 20 64 62 20 3b 20 6e 53 79 6e 63 0a 0a  ite db ; nSync..
0cf0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
0d00: 49 4e 53 45 52 54 20 75 70 64 61 74 65 73 20 32  INSERT updates 2
0d10: 20 70 61 67 65 73 20 61 6e 64 20 72 65 71 75 69   pages and requi
0d20: 72 65 73 20 34 20 63 61 6c 6c 73 20 74 6f 20 66  res 4 calls to f
0d30: 73 79 6e 63 28 29 3a 0a 23 0a 23 20 20 20 31 29  sync():.#.#   1)
0d40: 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   The directory i
0d50: 6e 20 77 68 69 63 68 20 74 68 65 20 6a 6f 75 72  n which the jour
0d60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
0d70: 74 65 64 2c 0a 23 20 20 20 32 29 20 54 68 65 20  ted,.#   2) The 
0d80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 74 6f  journal file (to
0d90: 20 73 79 6e 63 20 74 68 65 20 70 61 67 65 20 64   sync the page d
0da0: 61 74 61 29 2c 0a 23 20 20 20 33 29 20 54 68 65  ata),.#   3) The
0db0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 74   journal file (t
0dc0: 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  o sync the journ
0dd0: 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 29 2c  al file header),
0de0: 0a 23 20 20 20 34 29 20 54 68 65 20 64 61 74 61  .#   4) The data
0df0: 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 64 6f 5f  base file..#.do_
0e00: 74 65 73 74 20 69 6f 2d 32 2e 32 20 7b 0a 20 20  test io-2.2 {.  
0e10: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
0e20: 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53   INTO abc VALUES
0e30: 28 31 2c 20 32 29 20 7d 0a 20 20 6c 69 73 74 20  (1, 2) }.  list 
0e40: 5b 6e 57 72 69 74 65 20 64 62 5d 20 5b 6e 53 79  [nWrite db] [nSy
0e50: 6e 63 5d 0a 7d 20 7b 32 20 34 7d 0a 0a 23 20 53  nc].} {2 4}..# S
0e60: 65 74 20 74 68 65 20 64 65 76 69 63 65 2d 63 68  et the device-ch
0e70: 61 72 61 63 74 65 72 69 73 74 69 63 20 6d 61 73  aracteristic mas
0e80: 6b 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  k to include the
0e90: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
0ea0: 4f 4d 49 43 2c 0a 23 20 74 68 65 6e 20 64 6f 20  OMIC,.# then do 
0eb0: 61 6e 6f 74 68 65 72 20 49 4e 53 45 52 54 20 73  another INSERT s
0ec0: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e  imilar to the on
0ed0: 65 20 69 6e 20 69 6f 2d 32 2e 32 2e 20 54 68 69  e in io-2.2. Thi
0ee0: 73 20 73 68 6f 75 6c 64 0a 23 20 6f 6e 6c 79 20  s should.# only 
0ef0: 77 72 69 74 65 20 31 20 70 61 67 65 20 61 6e 64  write 1 page and
0f00: 20 72 65 71 75 69 72 65 20 61 20 73 69 6e 67 6c   require a singl
0f10: 65 20 66 73 79 6e 63 28 29 2e 0a 23 20 0a 23 20  e fsync()..# .# 
0f20: 54 68 65 20 73 69 6e 67 6c 65 20 66 73 79 6e 63  The single fsync
0f30: 28 29 20 69 73 20 74 68 65 20 64 61 74 61 62 61  () is the databa
0f40: 73 65 20 66 69 6c 65 2e 20 4f 6e 6c 79 20 6f 6e  se file. Only on
0f50: 65 20 70 61 67 65 20 69 73 20 72 65 70 6f 72 74  e page is report
0f60: 65 64 20 61 73 0a 23 20 77 72 69 74 74 65 6e 20  ed as.# written 
0f70: 62 65 63 61 75 73 65 20 70 61 67 65 20 31 20 2d  because page 1 -
0f80: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
0f90: 74 65 72 20 70 61 67 65 20 2d 20 69 73 20 77 72  ter page - is wr
0fa0: 69 74 74 65 6e 20 75 73 69 6e 67 0a 23 20 61 6e  itten using.# an
0fb0: 20 6f 75 74 2d 6f 66 2d 62 61 6e 64 20 6d 65 74   out-of-band met
0fc0: 68 6f 64 20 74 68 61 74 20 62 79 70 61 73 73 65  hod that bypasse
0fd0: 73 20 74 68 65 20 77 72 69 74 65 20 63 6f 75 6e  s the write coun
0fe0: 74 65 72 2e 0a 23 0a 73 71 6c 69 74 65 33 5f 73  ter..#.sqlite3_s
0ff0: 69 6d 75 6c 61 74 65 5f 64 65 76 69 63 65 20 2d  imulate_device -
1000: 63 68 61 72 20 61 74 6f 6d 69 63 0a 64 6f 5f 74  char atomic.do_t
1010: 65 73 74 20 69 6f 2d 32 2e 33 20 7b 0a 20 20 65  est io-2.3 {.  e
1020: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
1030: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
1040: 33 2c 20 34 29 20 7d 0a 20 20 6c 69 73 74 20 5b  3, 4) }.  list [
1050: 6e 57 72 69 74 65 20 64 62 5d 20 5b 6e 53 79 6e  nWrite db] [nSyn
1060: 63 5d 0a 7d 20 7b 31 20 31 7d 0a 0a 23 20 54 65  c].} {1 1}..# Te
1070: 73 74 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  st that the jour
1080: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1090: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
10a0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
10b0: 73 0a 23 20 75 70 64 61 74 65 64 20 77 68 65 6e  s.# updated when
10c0: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
10d0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
10e0: 73 20 75 73 65 64 2e 0a 23 0a 64 6f 5f 74 65 73  s used..#.do_tes
10f0: 74 20 69 6f 2d 32 2e 34 2e 31 20 7b 0a 20 20 65  t io-2.4.1 {.  e
1100: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
1110: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
1120: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 35  NTO abc VALUES(5
1130: 2c 20 36 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 6);.  }.  sqli
1140: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
1150: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
1160: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 20 7d 20  CT * FROM abc } 
1170: 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a  db2.} {1 2 3 4}.
1180: 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e 34 2e 32  do_test io-2.4.2
1190: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   {.  file exists
11a0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
11b0: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 69  .} {0}.do_test i
11c0: 6f 2d 32 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63  o-2.4.3 {.  exec
11d0: 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20  sql { COMMIT }. 
11e0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
11f0: 54 20 2a 20 46 52 4f 4d 20 61 62 63 20 7d 20 64  T * FROM abc } d
1200: 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  b2.} {1 2 3 4 5 
1210: 36 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23 20  6}.db2 close..# 
1220: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 6a 6f  Test that the jo
1230: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72  urnal file is cr
1240: 65 61 74 65 64 20 61 6e 64 20 73 79 6e 63 28 29  eated and sync()
1250: 64 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  d if the transac
1260: 74 69 6f 6e 0a 23 20 6d 6f 64 69 66 69 65 73 20  tion.# modifies 
1270: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
1280: 74 61 62 61 73 65 20 70 61 67 65 2c 20 65 76 65  tabase page, eve
1290: 6e 20 69 66 20 74 68 65 20 49 4f 43 41 50 5f 41  n if the IOCAP_A
12a0: 54 4f 4d 49 43 20 66 6c 61 67 0a 23 20 69 73 20  TOMIC flag.# is 
12b0: 73 65 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69  set..#.do_test i
12c0: 6f 2d 32 2e 35 2e 31 20 7b 0a 20 20 65 78 65 63  o-2.5.1 {.  exec
12d0: 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42  sql { CREATE TAB
12e0: 4c 45 20 64 65 66 28 64 2c 20 65 29 20 7d 0a 20  LE def(d, e) }. 
12f0: 20 6e 57 72 69 74 65 20 64 62 20 3b 20 6e 53 79   nWrite db ; nSy
1300: 6e 63 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  nc.  execsql {. 
1310: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e     BEGIN;.    IN
1320: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
1330: 4c 55 45 53 28 37 2c 20 38 29 3b 0a 20 20 7d 0a  LUES(7, 8);.  }.
1340: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
1350: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
1360: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 32  {0}.do_test io-2
1370: 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .5.2 {.  execsql
1380: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64   { INSERT INTO d
1390: 65 66 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  ef VALUES('a', '
13a0: 62 27 29 3b 20 7d 0a 20 20 66 69 6c 65 20 65 78  b'); }.  file ex
13b0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
13c0: 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  rnal.} {1}.do_te
13d0: 73 74 20 69 6f 2d 32 2e 35 2e 33 20 7b 0a 20 20  st io-2.5.3 {.  
13e0: 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54  execsql { COMMIT
13f0: 20 7d 0a 20 20 6c 69 73 74 20 5b 6e 57 72 69 74   }.  list [nWrit
1400: 65 20 64 62 5d 20 5b 6e 53 79 6e 63 5d 0a 7d 20  e db] [nSync].} 
1410: 7b 33 20 34 7d 0a 0a 23 20 54 65 73 74 20 74 68  {3 4}..# Test th
1420: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
1430: 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ile is created a
1440: 6e 64 20 73 79 6e 63 28 29 64 20 69 66 20 74 68  nd sync()d if th
1450: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20  e transaction.# 
1460: 6d 6f 64 69 66 69 65 73 20 61 20 73 69 6e 67 6c  modifies a singl
1470: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
1480: 61 6e 64 20 61 6c 73 6f 20 61 70 70 65 6e 64 73  and also appends
1490: 20 61 20 70 61 67 65 20 74 6f 20 74 68 65 20 66   a page to the f
14a0: 69 6c 65 2e 0a 23 20 49 6e 74 65 72 6e 61 6c 6c  ile..# Internall
14b0: 79 2c 20 74 68 69 73 20 63 61 73 65 20 69 73 20  y, this case is 
14c0: 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
14d0: 74 6c 79 20 74 6f 20 74 68 65 20 6f 6e 65 20 61  tly to the one a
14e0: 62 6f 76 65 2e 20 54 68 65 0a 23 20 6a 6f 75 72  bove. The.# jour
14f0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1500: 61 63 74 75 61 6c 6c 79 20 63 72 65 61 74 65 64  actually created
1510: 20 75 6e 74 69 6c 20 74 68 65 20 27 43 4f 4d 4d   until the 'COMM
1520: 49 54 27 20 73 74 61 74 65 6d 65 6e 74 0a 23 20  IT' statement.# 
1530: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 23 0a 64  is executed..#.d
1540: 6f 5f 74 65 73 74 20 69 6f 2d 32 2e 36 2e 31 20  o_test io-2.6.1 
1550: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1560: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
1570: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c  ERT INTO abc VAL
1580: 55 45 53 28 39 2c 20 72 61 6e 64 73 74 72 28 31  UES(9, randstr(1
1590: 30 30 30 2c 31 30 30 30 29 29 3b 0a 20 20 7d 0a  000,1000));.  }.
15a0: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
15b0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
15c0: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 32  {0}.do_test io-2
15d0: 2e 36 2e 32 20 7b 0a 20 20 23 20 43 72 65 61 74  .6.2 {.  # Creat
15e0: 65 20 61 20 66 69 6c 65 20 61 74 20 22 74 65 73  e a file at "tes
15f0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 22 2e 20 54  t.db-journal". T
1600: 68 69 73 20 77 69 6c 6c 20 70 72 65 76 65 6e 74  his will prevent
1610: 20 53 51 4c 69 74 65 20 66 72 6f 6d 0a 20 20 23   SQLite from.  #
1620: 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75   opening the jou
1630: 72 6e 61 6c 20 66 6f 72 20 65 78 63 6c 75 73 69  rnal for exclusi
1640: 76 65 20 61 63 63 65 73 73 2e 20 41 73 20 61 20  ve access. As a 
1650: 72 65 73 75 6c 74 2c 20 74 68 65 20 43 4f 4d 4d  result, the COMM
1660: 49 54 0a 20 20 23 20 73 68 6f 75 6c 64 20 66 61  IT.  # should fa
1670: 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 43  il with SQLITE_C
1680: 41 4e 54 4f 50 45 4e 20 61 6e 64 20 74 68 65 20  ANTOPEN and the 
1690: 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
16a0: 65 64 20 62 61 63 6b 2e 0a 20 20 23 0a 20 20 73  ed back..  #.  s
16b0: 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74  et fd [open test
16c0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20  .db-journal w]. 
16d0: 20 70 75 74 73 20 24 66 64 20 22 54 68 69 73 20   puts $fd "This 
16e0: 69 73 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  is not a journal
16f0: 20 66 69 6c 65 22 0a 20 20 63 6c 6f 73 65 20 24   file".  close $
1700: 66 64 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  fd.  catchsql { 
1710: 43 4f 4d 4d 49 54 20 7d 0a 7d 20 7b 31 20 7b 75  COMMIT }.} {1 {u
1720: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
1730: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 64 6f  tabase file}}.do
1740: 5f 74 65 73 74 20 69 6f 2d 32 2e 36 2e 33 20 7b  _test io-2.6.3 {
1750: 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  .  file delete -
1760: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 6a 6f  force test.db-jo
1770: 75 72 6e 61 6c 0a 20 20 63 61 74 63 68 73 71 6c  urnal.  catchsql
1780: 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 7d 20 7b 31   { COMMIT }.} {1
1790: 20 7b 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20   {cannot commit 
17a0: 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e  - no transaction
17b0: 20 69 73 20 61 63 74 69 76 65 7d 7d 0a 64 6f 5f   is active}}.do_
17c0: 74 65 73 74 20 69 6f 2d 32 2e 36 2e 34 20 7b 0a  test io-2.6.4 {.
17d0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
17e0: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 20 7d 0a  CT * FROM abc }.
17f0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
1800: 20 38 7d 0a 0a 0a 23 20 54 65 73 74 20 74 68 61   8}...# Test tha
1810: 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  t if the databas
1820: 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 69  e modification i
1830: 73 20 70 61 72 74 20 6f 66 20 6d 75 6c 74 69 2d  s part of multi-
1840: 66 69 6c 65 20 63 6f 6d 6d 69 74 2c 0a 23 20 74  file commit,.# t
1850: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1860: 69 73 20 61 6c 77 61 79 73 20 63 72 65 61 74 65  is always create
1870: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  d. In this case,
1880: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1890: 65 0a 23 20 69 73 20 63 72 65 61 74 65 64 20 64  e.# is created d
18a0: 75 72 69 6e 67 20 65 78 65 63 75 74 69 6f 6e 20  uring execution 
18b0: 6f 66 20 74 68 65 20 43 4f 4d 4d 49 54 20 73 74  of the COMMIT st
18c0: 61 74 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 68  atement, so we h
18d0: 61 76 65 20 74 6f 0a 23 20 75 73 65 20 74 68 65  ave to.# use the
18e0: 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20   same technique 
18f0: 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 69 74  to check that it
1900: 20 69 73 20 63 72 65 61 74 65 64 20 61 73 20 69   is created as i
1910: 6e 20 74 68 65 20 61 62 6f 76 65 20 0a 23 20 62  n the above .# b
1920: 6c 6f 63 6b 2e 0a 66 69 6c 65 20 64 65 6c 65 74  lock..file delet
1930: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64  e -force test2.d
1940: 62 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e  b test2.db-journ
1950: 61 6c 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e  al.do_test io-2.
1960: 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.1 {.  execsql 
1970: 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  {.    ATTACH 'te
1980: 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a  st2.db' AS aux;.
1990: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
19a0: 20 61 75 78 2e 61 62 63 32 28 61 2c 20 62 29 3b   aux.abc2(a, b);
19b0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
19c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
19d0: 56 41 4c 55 45 53 28 39 2c 20 31 30 29 3b 0a 20  VALUES(9, 10);. 
19e0: 20 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   }.  file exists
19f0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
1a00: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 69  .} {0}.do_test i
1a10: 6f 2d 32 2e 37 2e 32 20 7b 0a 20 20 65 78 65 63  o-2.7.2 {.  exec
1a20: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
1a30: 4f 20 61 62 63 32 20 53 45 4c 45 43 54 20 2a 20  O abc2 SELECT * 
1a40: 46 52 4f 4d 20 61 62 63 20 7d 0a 20 20 66 69 6c  FROM abc }.  fil
1a50: 65 20 65 78 69 73 74 73 20 74 65 73 74 32 2e 64  e exists test2.d
1a60: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
1a70: 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e 37 2e 33  do_test io-2.7.3
1a80: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
1a90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
1aa0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
1ab0: 54 20 2a 20 46 52 4f 4d 20 61 62 63 32 20 7d 0a  T * FROM abc2 }.
1ac0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
1ad0: 20 38 20 39 20 31 30 20 31 20 32 20 33 20 34 20   8 9 10 1 2 3 4 
1ae0: 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a 64 6f  5 6 7 8 9 10}.do
1af0: 5f 74 65 73 74 20 69 6f 2d 32 2e 37 2e 34 20 7b  _test io-2.7.4 {
1b00: 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20  .  set fd [open 
1b10: 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c  test2.db-journal
1b20: 20 77 5d 0a 20 20 70 75 74 73 20 24 66 64 20 22   w].  puts $fd "
1b30: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 6a 6f  This is not a jo
1b40: 75 72 6e 61 6c 20 66 69 6c 65 22 0a 20 20 63 6c  urnal file".  cl
1b50: 6f 73 65 20 24 66 64 0a 20 20 63 61 74 63 68 73  ose $fd.  catchs
1b60: 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 7d 20  ql { COMMIT }.} 
1b70: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70  {1 {unable to op
1b80: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1b90: 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e  }}.do_test io-2.
1ba0: 37 2e 35 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c  7.5 {.  file del
1bb0: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32  ete -force test2
1bc0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 63 61  .db-journal.  ca
1bd0: 74 63 68 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20  tchsql { COMMIT 
1be0: 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 63  }.} {1 {cannot c
1bf0: 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73  ommit - no trans
1c00: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
1c10: 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e  }}.do_test io-2.
1c20: 37 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.6 {.  execsql 
1c30: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1c40: 61 62 63 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45  abc UNION ALL SE
1c50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 32  LECT * FROM abc2
1c60: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20   }.} {1 2 3 4 5 
1c70: 36 20 37 20 38 7d 0a 0a 23 20 54 72 79 20 61 6e  6 7 8}..# Try an
1c80: 20 65 78 70 6c 69 63 69 74 20 52 4f 4c 4c 42 41   explicit ROLLBA
1c90: 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f  CK before the jo
1ca0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72  urnal file is cr
1cb0: 65 61 74 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  eated..#.do_test
1cc0: 20 69 6f 2d 32 2e 38 2e 31 20 7b 0a 20 20 65 78   io-2.8.1 {.  ex
1cd0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
1ce0: 4e 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  N;.    DELETE FR
1cf0: 4f 4d 20 61 62 63 3b 0a 20 20 7d 0a 20 20 66 69  OM abc;.  }.  fi
1d00: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
1d10: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
1d20: 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e 38 2e 32  do_test io-2.8.2
1d30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
1d40: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
1d50: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
1d60: 69 6f 2d 32 2e 38 2e 33 20 7b 0a 20 20 65 78 65  io-2.8.3 {.  exe
1d70: 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42  csql {.    ROLLB
1d80: 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  ACK;.    SELECT 
1d90: 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 0a  * FROM abc;.  }.
1da0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
1db0: 20 38 7d 0a 0a 73 71 6c 69 74 65 33 5f 73 69 6d   8}..sqlite3_sim
1dc0: 75 6c 61 74 65 5f 64 65 76 69 63 65 20 2d 63 68  ulate_device -ch
1dd0: 61 72 20 7b 7d 20 2d 73 65 63 74 6f 72 73 69 7a  ar {} -sectorsiz
1de0: 65 20 30 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  e 0..finish_test
1df0: 0a 0a                                            ..