/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact d497d43f4704e88e64c9e55c7e5edd8b5bcc6f5b:


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 31 30 20 32 30 30 37 2f  est,v 1.10 2007/
0250: 30 39 2f 31 32 20 31 37 3a 30 31 3a 34 35 20 64  09/12 17:01:45 d
0260: 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24  anielk1977 Exp $
0270: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
0280: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0290: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
02a0: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a  dir/tester.tcl..
02b0: 23 20 54 65 73 74 20 73 75 6d 6d 61 72 79 3a 0a  # Test summary:.
02c0: 23 0a 23 20 69 6f 2d 31 2e 2a 20 2d 20 20 54 65  #.# io-1.* -  Te
02d0: 73 74 20 74 68 61 74 20 71 75 69 63 6b 2d 62 61  st that quick-ba
02e0: 6c 61 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 6a  lance does not j
02f0: 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 75 6e 6e  ournal pages unn
0300: 65 63 65 73 73 61 72 69 6c 79 2e 0a 23 0a 23 20  ecessarily..#.# 
0310: 69 6f 2d 32 2e 2a 20 2d 20 20 54 65 73 74 20 74  io-2.* -  Test t
0320: 68 65 20 22 61 74 6f 6d 69 63 2d 77 72 69 74 65  he "atomic-write
0330: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 22 2e 0a   optimization"..
0340: 23 0a 23 20 69 6f 2d 33 2e 2a 20 2d 20 20 54 65  #.# io-3.* -  Te
0350: 73 74 20 74 68 65 20 49 4f 20 74 72 61 66 66 69  st the IO traffi
0360: 63 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 20 74  c enhancements t
0370: 72 69 67 67 65 72 65 64 20 77 68 65 6e 20 74 68  riggered when th
0380: 65 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 49  e .#           I
0390: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
03a0: 64 65 76 69 63 65 20 63 61 70 61 62 69 6c 69 74  device capabilit
03b0: 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 28 6e  y flag is set (n
03c0: 6f 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 66  o .#           f
03d0: 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 6f 6e 20  sync() calls on 
03e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
03f0: 29 2e 0a 23 0a 23 20 69 6f 2d 34 2e 2a 20 2d 20  )..#.# io-4.* - 
0400: 20 54 65 73 74 20 74 68 65 20 49 4f 20 74 72 61   Test the IO tra
0410: 66 66 69 63 20 65 6e 68 61 6e 63 65 6d 65 6e 74  ffic enhancement
0420: 73 20 74 72 69 67 67 65 72 65 64 20 77 68 65 6e  s triggered when
0430: 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20 20   the .#         
0440: 20 20 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50    IOCAP_SAFE_APP
0450: 45 4e 44 20 64 65 76 69 63 65 20 63 61 70 61 62  END device capab
0460: 69 6c 69 74 79 20 66 6c 61 67 20 69 73 20 73 65  ility flag is se
0470: 74 20 28 66 65 77 65 72 20 0a 23 20 20 20 20 20  t (fewer .#     
0480: 20 20 20 20 20 20 66 73 79 6e 63 28 29 20 63 61        fsync() ca
0490: 6c 6c 73 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  lls on the journ
04a0: 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 6e 65 65 64  al file, no need
04b0: 20 74 6f 20 73 65 74 20 6e 52 65 63 0a 23 20 20   to set nRec.#  
04c0: 20 20 20 20 20 20 20 20 20 66 69 65 6c 64 20 69           field i
04d0: 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 6a 6f 75  n the single jou
04e0: 72 6e 61 6c 20 68 65 61 64 65 72 29 2e 0a 23 0a  rnal header)..#.
04f0: 23 20 69 6f 2d 35 2e 2a 20 2d 20 20 54 65 73 74  # io-5.* -  Test
0500: 20 74 68 61 74 20 74 68 65 20 64 65 66 61 75 6c   that the defaul
0510: 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
0520: 65 6c 65 63 74 65 64 20 61 6e 64 20 75 73 65 64  elected and used
0530: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 63 6f   .#           co
0540: 72 72 65 63 74 6c 79 2e 0a 23 20 20 20 20 20 20  rrectly..#      
0550: 20 20 20 20 20 0a 0a 73 65 74 20 3a 3a 6e 57 72       ..set ::nWr
0560: 69 74 65 20 30 0a 70 72 6f 63 20 6e 57 72 69 74  ite 0.proc nWrit
0570: 65 20 7b 64 62 7d 20 7b 0a 20 20 73 65 74 20 62  e {db} {.  set b
0580: 74 20 5b 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62  t [btree_from_db
0590: 20 24 64 62 5d 0a 20 20 64 62 5f 65 6e 74 65 72   $db].  db_enter
05a0: 20 24 64 62 0a 20 20 61 72 72 61 79 20 73 65 74   $db.  array set
05b0: 20 73 74 61 74 73 20 5b 62 74 72 65 65 5f 70 61   stats [btree_pa
05c0: 67 65 72 5f 73 74 61 74 73 20 24 62 74 5d 0a 20  ger_stats $bt]. 
05d0: 20 64 62 5f 6c 65 61 76 65 20 24 64 62 0a 20 20   db_leave $db.  
05e0: 73 65 74 20 72 65 73 20 5b 65 78 70 72 20 24 73  set res [expr $s
05f0: 74 61 74 73 28 77 72 69 74 65 29 20 2d 20 24 3a  tats(write) - $:
0600: 3a 6e 57 72 69 74 65 5d 0a 20 20 73 65 74 20 3a  :nWrite].  set :
0610: 3a 6e 57 72 69 74 65 20 24 73 74 61 74 73 28 77  :nWrite $stats(w
0620: 72 69 74 65 29 0a 20 20 73 65 74 20 72 65 73 0a  rite).  set res.
0630: 7d 0a 0a 73 65 74 20 3a 3a 6e 53 79 6e 63 20 30  }..set ::nSync 0
0640: 0a 70 72 6f 63 20 6e 53 79 6e 63 20 7b 7d 20 7b  .proc nSync {} {
0650: 0a 20 20 73 65 74 20 72 65 73 20 5b 65 78 70 72  .  set res [expr
0660: 20 7b 24 3a 3a 73 71 6c 69 74 65 5f 73 79 6e 63   {$::sqlite_sync
0670: 5f 63 6f 75 6e 74 20 2d 20 24 3a 3a 6e 53 79 6e  _count - $::nSyn
0680: 63 7d 5d 0a 20 20 73 65 74 20 3a 3a 6e 53 79 6e  c}].  set ::nSyn
0690: 63 20 24 3a 3a 73 71 6c 69 74 65 5f 73 79 6e 63  c $::sqlite_sync
06a0: 5f 63 6f 75 6e 74 0a 20 20 73 65 74 20 72 65 73  _count.  set res
06b0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 31  .}..do_test io-1
06c0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
06d0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
06e0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
06f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
0700: 62 63 28 61 2c 62 29 3b 0a 20 20 7d 0a 20 20 6e  bc(a,b);.  }.  n
0710: 57 72 69 74 65 20 64 62 0a 7d 20 7b 32 7d 0a 0a  Write db.} {2}..
0720: 23 20 49 6e 73 65 72 74 20 69 6e 74 6f 20 74 68  # Insert into th
0730: 65 20 74 61 62 6c 65 20 34 20 72 65 63 6f 72 64  e table 4 record
0740: 73 20 6f 66 20 61 70 72 6f 78 69 6d 61 74 65 6c  s of aproximatel
0750: 79 20 32 34 30 20 62 79 74 65 73 20 65 61 63 68  y 240 bytes each
0760: 2e 0a 23 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ..# This should 
0770: 63 6f 6d 70 6c 65 74 65 6c 79 20 66 69 6c 6c 20  completely fill 
0780: 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  the root-page of
0790: 20 74 68 65 20 74 61 62 6c 65 2e 20 45 61 63 68   the table. Each
07a0: 0a 23 20 49 4e 53 45 52 54 20 63 61 75 73 65 73  .# INSERT causes
07b0: 20 32 20 64 62 20 70 61 67 65 73 20 74 6f 20 62   2 db pages to b
07c0: 65 20 77 72 69 74 74 65 6e 20 2d 20 74 68 65 20  e written - the 
07d0: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 22 61 62  root-page of "ab
07e0: 63 22 0a 23 20 61 6e 64 20 70 61 67 65 20 31 20  c".# and page 1 
07f0: 28 64 62 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  (db change-count
0800: 65 72 20 70 61 67 65 29 2e 0a 64 6f 5f 74 65 73  er page)..do_tes
0810: 74 20 69 6f 2d 31 2e 32 20 7b 0a 20 20 73 65 74  t io-1.2 {.  set
0820: 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20 65 78   ret [list].  ex
0830: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
0840: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 31  NTO abc VALUES(1
0850: 2c 72 61 6e 64 73 74 72 28 32 33 30 2c 32 33 30  ,randstr(230,230
0860: 29 29 3b 20 7d 0a 20 20 6c 61 70 70 65 6e 64 20  )); }.  lappend 
0870: 72 65 74 20 5b 6e 57 72 69 74 65 20 64 62 5d 0a  ret [nWrite db].
0880: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
0890: 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55  RT INTO abc VALU
08a0: 45 53 28 32 2c 72 61 6e 64 73 74 72 28 32 33 30  ES(2,randstr(230
08b0: 2c 32 33 30 29 29 3b 20 7d 0a 20 20 6c 61 70 70  ,230)); }.  lapp
08c0: 65 6e 64 20 72 65 74 20 5b 6e 57 72 69 74 65 20  end ret [nWrite 
08d0: 64 62 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  db].  execsql { 
08e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
08f0: 56 41 4c 55 45 53 28 33 2c 72 61 6e 64 73 74 72  VALUES(3,randstr
0900: 28 32 33 30 2c 32 33 30 29 29 3b 20 7d 0a 20 20  (230,230)); }.  
0910: 6c 61 70 70 65 6e 64 20 72 65 74 20 5b 6e 57 72  lappend ret [nWr
0920: 69 74 65 20 64 62 5d 0a 20 20 65 78 65 63 73 71  ite db].  execsq
0930: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
0940: 61 62 63 20 56 41 4c 55 45 53 28 34 2c 72 61 6e  abc VALUES(4,ran
0950: 64 73 74 72 28 32 33 30 2c 32 33 30 29 29 3b 20  dstr(230,230)); 
0960: 7d 0a 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20  }.  lappend ret 
0970: 5b 6e 57 72 69 74 65 20 64 62 5d 0a 7d 20 7b 32  [nWrite db].} {2
0980: 20 32 20 32 20 32 7d 0a 0a 23 20 49 6e 73 65 72   2 2 2}..# Inser
0990: 74 20 61 6e 6f 74 68 65 72 20 32 34 30 20 62 79  t another 240 by
09a0: 74 65 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20  te record. This 
09b0: 63 61 75 73 65 73 20 74 77 6f 20 6c 65 61 66 20  causes two leaf 
09c0: 70 61 67 65 73 0a 23 20 74 6f 20 62 65 20 61 64  pages.# to be ad
09d0: 64 65 64 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  ded to the root 
09e0: 70 61 67 65 20 6f 66 20 61 62 63 2e 20 34 20 70  page of abc. 4 p
09f0: 61 67 65 73 20 69 6e 20 74 6f 74 61 6c 0a 23 20  ages in total.# 
0a00: 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74  are written to t
0a10: 68 65 20 64 62 20 66 69 6c 65 20 2d 20 74 68 65  he db file - the
0a20: 20 74 77 6f 20 6c 65 61 66 20 70 61 67 65 73 2c   two leaf pages,
0a30: 20 74 68 65 20 72 6f 6f 74 0a 23 20 6f 66 20 61   the root.# of a
0a40: 62 63 20 61 6e 64 20 74 68 65 20 63 68 61 6e 67  bc and the chang
0a50: 65 2d 63 6f 75 6e 74 65 72 20 70 61 67 65 2e 0a  e-counter page..
0a60: 64 6f 5f 74 65 73 74 20 69 6f 2d 31 2e 33 20 7b  do_test io-1.3 {
0a70: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
0a80: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c  ERT INTO abc VAL
0a90: 55 45 53 28 35 2c 72 61 6e 64 73 74 72 28 32 33  UES(5,randstr(23
0aa0: 30 2c 32 33 30 29 29 3b 20 7d 0a 20 20 6e 57 72  0,230)); }.  nWr
0ab0: 69 74 65 20 64 62 0a 7d 20 7b 34 7d 0a 0a 23 20  ite db.} {4}..# 
0ac0: 49 6e 73 65 72 74 20 61 6e 6f 74 68 65 72 20 33  Insert another 3
0ad0: 20 32 34 30 20 62 79 74 65 20 72 65 63 6f 72 64   240 byte record
0ae0: 73 2e 20 41 66 74 65 72 20 74 68 69 73 2c 20 74  s. After this, t
0af0: 68 65 20 74 72 65 65 20 63 6f 6e 73 69 73 74 73  he tree consists
0b00: 20 6f 66 20 0a 23 20 74 68 65 20 72 6f 6f 74 2d   of .# the root-
0b10: 6e 6f 64 65 2c 20 77 68 69 63 68 20 69 73 20 63  node, which is c
0b20: 6c 6f 73 65 20 74 6f 20 65 6d 70 74 79 2c 20 61  lose to empty, a
0b30: 6e 64 20 74 77 6f 20 6c 65 61 66 20 70 61 67 65  nd two leaf page
0b40: 73 2c 20 62 6f 74 68 20 6f 66 20 0a 23 20 77 68  s, both of .# wh
0b50: 69 63 68 20 61 72 65 20 66 75 6c 6c 2e 20 0a 64  ich are full. .d
0b60: 6f 5f 74 65 73 74 20 69 6f 2d 31 2e 34 20 7b 0a  o_test io-1.4 {.
0b70: 20 20 73 65 74 20 72 65 74 20 5b 6c 69 73 74 5d    set ret [list]
0b80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
0b90: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c  ERT INTO abc VAL
0ba0: 55 45 53 28 36 2c 72 61 6e 64 73 74 72 28 32 33  UES(6,randstr(23
0bb0: 30 2c 32 33 30 29 29 3b 20 7d 0a 20 20 6c 61 70  0,230)); }.  lap
0bc0: 70 65 6e 64 20 72 65 74 20 5b 6e 57 72 69 74 65  pend ret [nWrite
0bd0: 20 64 62 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b   db].  execsql {
0be0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
0bf0: 20 56 41 4c 55 45 53 28 37 2c 72 61 6e 64 73 74   VALUES(7,randst
0c00: 72 28 32 33 30 2c 32 33 30 29 29 3b 20 7d 0a 20  r(230,230)); }. 
0c10: 20 6c 61 70 70 65 6e 64 20 72 65 74 20 5b 6e 57   lappend ret [nW
0c20: 72 69 74 65 20 64 62 5d 0a 20 20 65 78 65 63 73  rite db].  execs
0c30: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
0c40: 20 61 62 63 20 56 41 4c 55 45 53 28 38 2c 72 61   abc VALUES(8,ra
0c50: 6e 64 73 74 72 28 32 33 30 2c 32 33 30 29 29 3b  ndstr(230,230));
0c60: 20 7d 0a 20 20 6c 61 70 70 65 6e 64 20 72 65 74   }.  lappend ret
0c70: 20 5b 6e 57 72 69 74 65 20 64 62 5d 0a 7d 20 7b   [nWrite db].} {
0c80: 32 20 32 20 32 7d 0a 0a 23 20 54 68 69 73 20 69  2 2 2}..# This i
0c90: 6e 73 65 72 74 20 73 68 6f 75 6c 64 20 75 73 65  nsert should use
0ca0: 20 74 68 65 20 71 75 69 63 6b 2d 62 61 6c 61 6e   the quick-balan
0cb0: 63 65 20 74 72 69 63 6b 20 74 6f 20 61 64 64 20  ce trick to add 
0cc0: 61 20 74 68 69 72 64 20 6c 65 61 66 0a 23 20 74  a third leaf.# t
0cd0: 6f 20 74 68 65 20 62 2d 74 72 65 65 20 75 73 65  o the b-tree use
0ce0: 64 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65  d to store table
0cf0: 20 61 62 63 2e 20 49 74 20 73 68 6f 75 6c 64 20   abc. It should 
0d00: 6f 6e 6c 79 20 62 65 20 6e 65 63 65 73 73 61 72  only be necessar
0d10: 79 20 74 6f 0a 23 20 77 72 69 74 65 20 74 6f 20  y to.# write to 
0d20: 33 20 70 61 67 65 73 20 74 6f 20 64 6f 20 74 68  3 pages to do th
0d30: 69 73 3a 20 74 68 65 20 63 68 61 6e 67 65 2d 63  is: the change-c
0d40: 6f 75 6e 74 65 72 2c 20 74 68 65 20 72 6f 6f 74  ounter, the root
0d50: 2d 70 61 67 65 20 61 6e 64 0a 23 20 74 68 65 20  -page and.# the 
0d60: 6e 65 77 20 6c 65 61 66 20 70 61 67 65 2e 0a 64  new leaf page..d
0d70: 6f 5f 74 65 73 74 20 69 6f 2d 31 2e 35 20 7b 0a  o_test io-1.5 {.
0d80: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
0d90: 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55  RT INTO abc VALU
0da0: 45 53 28 39 2c 72 61 6e 64 73 74 72 28 32 33 30  ES(9,randstr(230
0db0: 2c 32 33 30 29 29 3b 20 7d 0a 20 20 6e 57 72 69  ,230)); }.  nWri
0dc0: 74 65 20 64 62 0a 7d 20 7b 33 7d 0a 0a 69 66 63  te db.} {3}..ifc
0dd0: 61 70 61 62 6c 65 20 61 74 6f 6d 69 63 77 72 69  apable atomicwri
0de0: 74 65 20 7b 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  te {..#---------
0df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0e30: 54 65 73 74 20 63 61 73 65 73 20 69 6f 2d 32 2e  Test cases io-2.
0e40: 2a 20 74 65 73 74 20 74 68 65 20 61 74 6f 6d 69  * test the atomi
0e50: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
0e60: 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  tion..#.do_test 
0e70: 69 6f 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  io-2.1 {.  execs
0e80: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
0e90: 20 61 62 63 3b 20 56 41 43 55 55 4d 3b 20 7d 0a   abc; VACUUM; }.
0ea0: 7d 20 7b 7d 0a 0a 23 20 43 6c 65 61 72 20 74 68  } {}..# Clear th
0eb0: 65 20 77 72 69 74 65 20 61 6e 64 20 73 79 6e 63  e write and sync
0ec0: 20 63 6f 75 6e 74 73 2e 0a 6e 57 72 69 74 65 20   counts..nWrite 
0ed0: 64 62 20 3b 20 6e 53 79 6e 63 0a 0a 23 20 54 68  db ; nSync..# Th
0ee0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 49 4e 53 45  e following INSE
0ef0: 52 54 20 75 70 64 61 74 65 73 20 32 20 70 61 67  RT updates 2 pag
0f00: 65 73 20 61 6e 64 20 72 65 71 75 69 72 65 73 20  es and requires 
0f10: 34 20 63 61 6c 6c 73 20 74 6f 20 66 73 79 6e 63  4 calls to fsync
0f20: 28 29 3a 0a 23 0a 23 20 20 20 31 29 20 54 68 65  ():.#.#   1) The
0f30: 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68   directory in wh
0f40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
0f50: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
0f60: 0a 23 20 20 20 32 29 20 54 68 65 20 6a 6f 75 72  .#   2) The jour
0f70: 6e 61 6c 20 66 69 6c 65 20 28 74 6f 20 73 79 6e  nal file (to syn
0f80: 63 20 74 68 65 20 70 61 67 65 20 64 61 74 61 29  c the page data)
0f90: 2c 0a 23 20 20 20 33 29 20 54 68 65 20 6a 6f 75  ,.#   3) The jou
0fa0: 72 6e 61 6c 20 66 69 6c 65 20 28 74 6f 20 73 79  rnal file (to sy
0fb0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
0fc0: 69 6c 65 20 68 65 61 64 65 72 29 2c 0a 23 20 20  ile header),.#  
0fd0: 20 34 29 20 54 68 65 20 64 61 74 61 62 61 73 65   4) The database
0fe0: 20 66 69 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74   file..#.do_test
0ff0: 20 69 6f 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63   io-2.2 {.  exec
1000: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
1010: 4f 20 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20  O abc VALUES(1, 
1020: 32 29 20 7d 0a 20 20 6c 69 73 74 20 5b 6e 57 72  2) }.  list [nWr
1030: 69 74 65 20 64 62 5d 20 5b 6e 53 79 6e 63 5d 0a  ite db] [nSync].
1040: 7d 20 7b 32 20 34 7d 0a 0a 23 20 53 65 74 20 74  } {2 4}..# Set t
1050: 68 65 20 64 65 76 69 63 65 2d 63 68 61 72 61 63  he device-charac
1060: 74 65 72 69 73 74 69 63 20 6d 61 73 6b 20 74 6f  teristic mask to
1070: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 53 51 4c   include the SQL
1080: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1090: 2c 0a 23 20 74 68 65 6e 20 64 6f 20 61 6e 6f 74  ,.# then do anot
10a0: 68 65 72 20 49 4e 53 45 52 54 20 73 69 6d 69 6c  her INSERT simil
10b0: 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 69 6e  ar to the one in
10c0: 20 69 6f 2d 32 2e 32 2e 20 54 68 69 73 20 73 68   io-2.2. This sh
10d0: 6f 75 6c 64 0a 23 20 6f 6e 6c 79 20 77 72 69 74  ould.# only writ
10e0: 65 20 31 20 70 61 67 65 20 61 6e 64 20 72 65 71  e 1 page and req
10f0: 75 69 72 65 20 61 20 73 69 6e 67 6c 65 20 66 73  uire a single fs
1100: 79 6e 63 28 29 2e 0a 23 20 0a 23 20 54 68 65 20  ync()..# .# The 
1110: 73 69 6e 67 6c 65 20 66 73 79 6e 63 28 29 20 69  single fsync() i
1120: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
1130: 69 6c 65 2e 20 4f 6e 6c 79 20 6f 6e 65 20 70 61  ile. Only one pa
1140: 67 65 20 69 73 20 72 65 70 6f 72 74 65 64 20 61  ge is reported a
1150: 73 0a 23 20 77 72 69 74 74 65 6e 20 62 65 63 61  s.# written beca
1160: 75 73 65 20 70 61 67 65 20 31 20 2d 20 74 68 65  use page 1 - the
1170: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1180: 70 61 67 65 20 2d 20 69 73 20 77 72 69 74 74 65  page - is writte
1190: 6e 20 75 73 69 6e 67 0a 23 20 61 6e 20 6f 75 74  n using.# an out
11a0: 2d 6f 66 2d 62 61 6e 64 20 6d 65 74 68 6f 64 20  -of-band method 
11b0: 74 68 61 74 20 62 79 70 61 73 73 65 73 20 74 68  that bypasses th
11c0: 65 20 77 72 69 74 65 20 63 6f 75 6e 74 65 72 2e  e write counter.
11d0: 0a 23 0a 73 71 6c 69 74 65 33 5f 73 69 6d 75 6c  .#.sqlite3_simul
11e0: 61 74 65 5f 64 65 76 69 63 65 20 2d 63 68 61 72  ate_device -char
11f0: 20 61 74 6f 6d 69 63 0a 64 6f 5f 74 65 73 74 20   atomic.do_test 
1200: 69 6f 2d 32 2e 33 20 7b 0a 20 20 65 78 65 63 73  io-2.3 {.  execs
1210: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
1220: 20 61 62 63 20 56 41 4c 55 45 53 28 33 2c 20 34   abc VALUES(3, 4
1230: 29 20 7d 0a 20 20 6c 69 73 74 20 5b 6e 57 72 69  ) }.  list [nWri
1240: 74 65 20 64 62 5d 20 5b 6e 53 79 6e 63 5d 0a 7d  te db] [nSync].}
1250: 20 7b 31 20 31 7d 0a 0a 23 20 54 65 73 74 20 74   {1 1}..# Test t
1260: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1270: 66 69 6c 65 20 69 73 20 6e 6f 74 20 63 72 65 61  file is not crea
1280: 74 65 64 20 61 6e 64 20 74 68 65 20 63 68 61 6e  ted and the chan
1290: 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 0a 23 20  ge-counter is.# 
12a0: 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  updated when the
12b0: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
12c0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
12d0: 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6f  ed..#.do_test io
12e0: 2d 32 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  -2.4.1 {.  execs
12f0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
1300: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1310: 61 62 63 20 56 41 4c 55 45 53 28 35 2c 20 36 29  abc VALUES(5, 6)
1320: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20  ;.  }.  sqlite3 
1330: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78  db2 test.db.  ex
1340: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
1350: 20 46 52 4f 4d 20 61 62 63 20 7d 20 64 62 32 0a   FROM abc } db2.
1360: 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74  } {1 2 3 4}.do_t
1370: 65 73 74 20 69 6f 2d 32 2e 34 2e 32 20 7b 0a 20  est io-2.4.2 {. 
1380: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
1390: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
13a0: 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e  0}.do_test io-2.
13b0: 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.3 {.  execsql 
13c0: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65  { COMMIT }.  exe
13d0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
13e0: 46 52 4f 4d 20 61 62 63 20 7d 20 64 62 32 0a 7d  FROM abc } db2.}
13f0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 64   {1 2 3 4 5 6}.d
1400: 62 32 20 63 6c 6f 73 65 0a 0a 23 20 54 65 73 74  b2 close..# Test
1410: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1420: 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
1430: 64 20 61 6e 64 20 73 79 6e 63 28 29 64 20 69 66  d and sync()d if
1440: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1450: 0a 23 20 6d 6f 64 69 66 69 65 73 20 6d 6f 72 65  .# modifies more
1460: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
1470: 73 65 20 70 61 67 65 2c 20 65 76 65 6e 20 69 66  se page, even if
1480: 20 74 68 65 20 49 4f 43 41 50 5f 41 54 4f 4d 49   the IOCAP_ATOMI
1490: 43 20 66 6c 61 67 0a 23 20 69 73 20 73 65 74 2e  C flag.# is set.
14a0: 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e  .#.do_test io-2.
14b0: 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.1 {.  execsql 
14c0: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64  { CREATE TABLE d
14d0: 65 66 28 64 2c 20 65 29 20 7d 0a 20 20 6e 57 72  ef(d, e) }.  nWr
14e0: 69 74 65 20 64 62 20 3b 20 6e 53 79 6e 63 0a 20  ite db ; nSync. 
14f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
1500: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
1510: 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53   INTO abc VALUES
1520: 28 37 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 66 69  (7, 8);.  }.  fi
1530: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
1540: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
1550: 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e 35 2e 32  do_test io-2.5.2
1560: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   {.  execsql { I
1570: 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 66 20 56  NSERT INTO def V
1580: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
1590: 20 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   }.  file exists
15a0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
15b0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 69  .} {1}.do_test i
15c0: 6f 2d 32 2e 35 2e 33 20 7b 0a 20 20 65 78 65 63  o-2.5.3 {.  exec
15d0: 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20  sql { COMMIT }. 
15e0: 20 6c 69 73 74 20 5b 6e 57 72 69 74 65 20 64 62   list [nWrite db
15f0: 5d 20 5b 6e 53 79 6e 63 5d 0a 7d 20 7b 33 20 34  ] [nSync].} {3 4
1600: 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20 74  }..# Test that t
1610: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1620: 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 73  is created and s
1630: 79 6e 63 28 29 64 20 69 66 20 74 68 65 20 74 72  ync()d if the tr
1640: 61 6e 73 61 63 74 69 6f 6e 0a 23 20 6d 6f 64 69  ansaction.# modi
1650: 66 69 65 73 20 61 20 73 69 6e 67 6c 65 20 64 61  fies a single da
1660: 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20  tabase page and 
1670: 61 6c 73 6f 20 61 70 70 65 6e 64 73 20 61 20 70  also appends a p
1680: 61 67 65 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  age to the file.
1690: 0a 23 20 49 6e 74 65 72 6e 61 6c 6c 79 2c 20 74  .# Internally, t
16a0: 68 69 73 20 63 61 73 65 20 69 73 20 68 61 6e 64  his case is hand
16b0: 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
16c0: 74 6f 20 74 68 65 20 6f 6e 65 20 61 62 6f 76 65  to the one above
16d0: 2e 20 54 68 65 0a 23 20 6a 6f 75 72 6e 61 6c 20  . The.# journal 
16e0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 63 74 75  file is not actu
16f0: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 75 6e 74  ally created unt
1700: 69 6c 20 74 68 65 20 27 43 4f 4d 4d 49 54 27 20  il the 'COMMIT' 
1710: 73 74 61 74 65 6d 65 6e 74 0a 23 20 69 73 20 65  statement.# is e
1720: 78 65 63 75 74 65 64 2e 0a 23 0a 64 6f 5f 74 65  xecuted..#.do_te
1730: 73 74 20 69 6f 2d 32 2e 36 2e 31 20 7b 0a 20 20  st io-2.6.1 {.  
1740: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
1750: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
1760: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
1770: 39 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 2c  9, randstr(1000,
1780: 31 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 66 69  1000));.  }.  fi
1790: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
17a0: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
17b0: 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e 36 2e 32  do_test io-2.6.2
17c0: 20 7b 0a 20 20 23 20 43 72 65 61 74 65 20 61 20   {.  # Create a 
17d0: 66 69 6c 65 20 61 74 20 22 74 65 73 74 2e 64 62  file at "test.db
17e0: 2d 6a 6f 75 72 6e 61 6c 22 2e 20 54 68 69 73 20  -journal". This 
17f0: 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 53 51 4c  will prevent SQL
1800: 69 74 65 20 66 72 6f 6d 0a 20 20 23 20 6f 70 65  ite from.  # ope
1810: 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ning the journal
1820: 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
1830: 63 63 65 73 73 2e 20 41 73 20 61 20 72 65 73 75  ccess. As a resu
1840: 6c 74 2c 20 74 68 65 20 43 4f 4d 4d 49 54 0a 20  lt, the COMMIT. 
1850: 20 23 20 73 68 6f 75 6c 64 20 66 61 69 6c 20 77   # should fail w
1860: 69 74 68 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ith SQLITE_CANTO
1870: 50 45 4e 20 61 6e 64 20 74 68 65 20 74 72 61 6e  PEN and the tran
1880: 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62  saction rolled b
1890: 61 63 6b 2e 0a 20 20 23 0a 20 20 73 65 74 20 66  ack..  #.  set f
18a0: 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d  d [open test.db-
18b0: 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20 20 70 75 74  journal w].  put
18c0: 73 20 24 66 64 20 22 54 68 69 73 20 69 73 20 6e  s $fd "This is n
18d0: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
18e0: 65 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20  e".  close $fd. 
18f0: 20 63 61 74 63 68 73 71 6c 20 7b 20 43 4f 4d 4d   catchsql { COMM
1900: 49 54 20 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c  IT }.} {1 {unabl
1910: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
1920: 73 65 20 66 69 6c 65 7d 7d 0a 64 6f 5f 74 65 73  se file}}.do_tes
1930: 74 20 69 6f 2d 32 2e 36 2e 33 20 7b 0a 20 20 66  t io-2.6.3 {.  f
1940: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
1950: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
1960: 6c 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 43  l.  catchsql { C
1970: 4f 4d 4d 49 54 20 7d 0a 7d 20 7b 31 20 7b 63 61  OMMIT }.} {1 {ca
1980: 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f  nnot commit - no
1990: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19a0: 61 63 74 69 76 65 7d 7d 0a 64 6f 5f 74 65 73 74  active}}.do_test
19b0: 20 69 6f 2d 32 2e 36 2e 34 20 7b 0a 20 20 65 78   io-2.6.4 {.  ex
19c0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
19d0: 20 46 52 4f 4d 20 61 62 63 20 7d 0a 7d 20 7b 31   FROM abc }.} {1
19e0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 7d 0a   2 3 4 5 6 7 8}.
19f0: 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 66  ..# Test that if
1a00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 6f   the database mo
1a10: 64 69 66 69 63 61 74 69 6f 6e 20 69 73 20 70 61  dification is pa
1a20: 72 74 20 6f 66 20 6d 75 6c 74 69 2d 66 69 6c 65  rt of multi-file
1a30: 20 63 6f 6d 6d 69 74 2c 0a 23 20 74 68 65 20 6a   commit,.# the j
1a40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
1a50: 6c 77 61 79 73 20 63 72 65 61 74 65 64 2e 20 49  lways created. I
1a60: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
1a70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20   journal file.# 
1a80: 69 73 20 63 72 65 61 74 65 64 20 64 75 72 69 6e  is created durin
1a90: 67 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  g execution of t
1aa0: 68 65 20 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d  he COMMIT statem
1ab0: 65 6e 74 2c 20 73 6f 20 77 65 20 68 61 76 65 20  ent, so we have 
1ac0: 74 6f 0a 23 20 75 73 65 20 74 68 65 20 73 61 6d  to.# use the sam
1ad0: 65 20 74 65 63 68 6e 69 71 75 65 20 74 6f 20 63  e technique to c
1ae0: 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20  heck that it is 
1af0: 63 72 65 61 74 65 64 20 61 73 20 69 6e 20 74 68  created as in th
1b00: 65 20 61 62 6f 76 65 20 0a 23 20 62 6c 6f 63 6b  e above .# block
1b10: 2e 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66  ..file delete -f
1b20: 6f 72 63 65 20 74 65 73 74 32 2e 64 62 20 74 65  orce test2.db te
1b30: 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 64  st2.db-journal.d
1b40: 6f 5f 74 65 73 74 20 69 6f 2d 32 2e 37 2e 31 20  o_test io-2.7.1 
1b50: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1b60: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32 2e    ATTACH 'test2.
1b70: 64 62 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20  db' AS aux;.    
1b80: 50 52 41 47 4d 41 20 61 75 78 2e 70 61 67 65 5f  PRAGMA aux.page_
1b90: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
1ba0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
1bb0: 78 2e 61 62 63 32 28 61 2c 20 62 29 3b 0a 20 20  x.abc2(a, b);.  
1bc0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
1bd0: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c  ERT INTO abc VAL
1be0: 55 45 53 28 39 2c 20 31 30 29 3b 0a 20 20 7d 0a  UES(9, 10);.  }.
1bf0: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
1c00: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
1c10: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 32  {0}.do_test io-2
1c20: 2e 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .7.2 {.  execsql
1c30: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61   { INSERT INTO a
1c40: 62 63 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  bc2 SELECT * FRO
1c50: 4d 20 61 62 63 20 7d 0a 20 20 66 69 6c 65 20 65  M abc }.  file e
1c60: 78 69 73 74 73 20 74 65 73 74 32 2e 64 62 2d 6a  xists test2.db-j
1c70: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f  ournal.} {0}.do_
1c80: 74 65 73 74 20 69 6f 2d 32 2e 37 2e 33 20 7b 0a  test io-2.7.3 {.
1c90: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
1ca0: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 20 55 4e  CT * FROM abc UN
1cb0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a  ION ALL SELECT *
1cc0: 20 46 52 4f 4d 20 61 62 63 32 20 7d 0a 7d 20 7b   FROM abc2 }.} {
1cd0: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
1ce0: 39 20 31 30 20 31 20 32 20 33 20 34 20 35 20 36  9 10 1 2 3 4 5 6
1cf0: 20 37 20 38 20 39 20 31 30 7d 0a 64 6f 5f 74 65   7 8 9 10}.do_te
1d00: 73 74 20 69 6f 2d 32 2e 37 2e 34 20 7b 0a 20 20  st io-2.7.4 {.  
1d10: 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73  set fd [open tes
1d20: 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d  t2.db-journal w]
1d30: 0a 20 20 70 75 74 73 20 24 66 64 20 22 54 68 69  .  puts $fd "Thi
1d40: 73 20 69 73 20 6e 6f 74 20 61 20 6a 6f 75 72 6e  s is not a journ
1d50: 61 6c 20 66 69 6c 65 22 0a 20 20 63 6c 6f 73 65  al file".  close
1d60: 20 24 66 64 0a 20 20 63 61 74 63 68 73 71 6c 20   $fd.  catchsql 
1d70: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 7d 20 7b 31 20  { COMMIT }.} {1 
1d80: 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  {unable to open 
1d90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a  database file}}.
1da0: 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e 37 2e 35  do_test io-2.7.5
1db0: 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65   {.  file delete
1dc0: 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62   -force test2.db
1dd0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 63 61 74 63 68  -journal.  catch
1de0: 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 7d  sql { COMMIT }.}
1df0: 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 63 6f 6d 6d   {1 {cannot comm
1e00: 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  it - no transact
1e10: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 7d 7d 0a  ion is active}}.
1e20: 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e 37 2e 36  do_test io-2.7.6
1e30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
1e40: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
1e50: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
1e60: 54 20 2a 20 46 52 4f 4d 20 61 62 63 32 20 7d 0a  T * FROM abc2 }.
1e70: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
1e80: 20 38 7d 0a 0a 23 20 54 72 79 20 61 6e 20 65 78   8}..# Try an ex
1e90: 70 6c 69 63 69 74 20 52 4f 4c 4c 42 41 43 4b 20  plicit ROLLBACK 
1ea0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
1eb0: 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
1ec0: 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6f  ed..#.do_test io
1ed0: 2d 32 2e 38 2e 31 20 7b 0a 20 20 65 78 65 63 73  -2.8.1 {.  execs
1ee0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
1ef0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
1f00: 61 62 63 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20  abc;.  }.  file 
1f10: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
1f20: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f  ournal.} {0}.do_
1f30: 74 65 73 74 20 69 6f 2d 32 2e 38 2e 32 20 7b 0a  test io-2.8.2 {.
1f40: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
1f50: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 20 7d 0a  CT * FROM abc }.
1f60: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 69 6f 2d  } {}.do_test io-
1f70: 32 2e 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  2.8.3 {.  execsq
1f80: 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  l {.    ROLLBACK
1f90: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
1fa0: 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 0a 7d 20 7b  ROM abc;.  }.} {
1fb0: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 7d  1 2 3 4 5 6 7 8}
1fc0: 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20 74 68  ..# Test that th
1fd0: 65 20 61 74 6f 6d 69 63 20 77 72 69 74 65 20 6f  e atomic write o
1fe0: 70 74 69 6d 69 73 61 74 69 6f 6e 20 69 73 20 6e  ptimisation is n
1ff0: 6f 74 20 65 6e 61 62 6c 65 64 20 69 66 20 74 68  ot enabled if th
2000: 65 20 73 65 63 74 6f 72 0a 23 20 73 69 7a 65 20  e sector.# size 
2010: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
2020: 68 65 20 70 61 67 65 2d 73 69 7a 65 2e 0a 23 0a  he page-size..#.
2030: 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e 39 2e 31  do_test io-2.9.1
2040: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 69 6d   {.  sqlite3_sim
2050: 75 6c 61 74 65 5f 64 65 76 69 63 65 20 2d 63 68  ulate_device -ch
2060: 61 72 20 61 74 6f 6d 69 63 20 2d 73 65 63 74 6f  ar atomic -secto
2070: 72 73 69 7a 65 20 32 30 34 38 0a 20 20 65 78 65  rsize 2048.  exe
2080: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
2090: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
20a0: 4f 20 61 62 63 20 56 41 4c 55 45 53 28 39 2c 20  O abc VALUES(9, 
20b0: 31 30 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20  10);.  }.  file 
20c0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
20d0: 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f  ournal.} {1}.do_
20e0: 74 65 73 74 20 69 6f 2d 32 2e 39 2e 32 20 7b 0a  test io-2.9.2 {.
20f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c    execsql { ROLL
2100: 42 41 43 4b 3b 20 7d 0a 20 20 64 62 20 63 6c 6f  BACK; }.  db clo
2110: 73 65 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65  se.  file delete
2120: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
2130: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
2140: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
2150: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
2160: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
2170: 5f 73 69 7a 65 20 3d 20 32 30 34 38 3b 0a 20 20  _size = 2048;.  
2180: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
2190: 62 63 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20  bc(a, b);.  }.  
21a0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
21b0: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
21c0: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
21d0: 39 2c 20 31 30 29 3b 0a 20 20 7d 0a 20 20 66 69  9, 10);.  }.  fi
21e0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
21f0: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
2200: 64 6f 5f 74 65 73 74 20 69 6f 2d 32 2e 39 2e 33  do_test io-2.9.3
2210: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
2220: 4f 4d 4d 49 54 20 7d 0a 7d 20 7b 7d 0a 0a 23 20  OMMIT }.} {}..# 
2230: 54 65 73 74 20 61 20 63 6f 75 70 6c 65 20 6f 66  Test a couple of
2240: 20 74 68 65 20 6d 6f 72 65 20 73 70 65 63 69 66   the more specif
2250: 69 63 20 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20  ic IOCAP_ATOMIC 
2260: 66 6c 61 67 73 20 0a 23 20 28 69 2e 65 20 49 4f  flags .# (i.e IO
2270: 43 41 50 5f 41 54 4f 4d 49 43 32 4b 20 65 74 63  CAP_ATOMIC2K etc
2280: 2e 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6f  .)..#.do_test io
2290: 2d 32 2e 31 30 2e 31 20 7b 0a 20 20 73 71 6c 69  -2.10.1 {.  sqli
22a0: 74 65 33 5f 73 69 6d 75 6c 61 74 65 5f 64 65 76  te3_simulate_dev
22b0: 69 63 65 20 2d 63 68 61 72 20 61 74 6f 6d 69 63  ice -char atomic
22c0: 31 6b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  1k.  execsql {. 
22d0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e     BEGIN;.    IN
22e0: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
22f0: 4c 55 45 53 28 31 31 2c 20 31 32 29 3b 0a 20 20  LUES(11, 12);.  
2300: 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20  }.  file exists 
2310: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
2320: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 69 6f  } {1}.do_test io
2330: 2d 32 2e 31 30 2e 32 20 7b 0a 20 20 65 78 65 63  -2.10.2 {.  exec
2340: 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d  sql { ROLLBACK }
2350: 0a 20 20 73 71 6c 69 74 65 33 5f 73 69 6d 75 6c  .  sqlite3_simul
2360: 61 74 65 5f 64 65 76 69 63 65 20 2d 63 68 61 72  ate_device -char
2370: 20 61 74 6f 6d 69 63 32 6b 0a 20 20 65 78 65 63   atomic2k.  exec
2380: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
2390: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
23a0: 20 61 62 63 20 56 41 4c 55 45 53 28 31 31 2c 20   abc VALUES(11, 
23b0: 31 32 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20  12);.  }.  file 
23c0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
23d0: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f  ournal.} {0}.do_
23e0: 74 65 73 74 20 69 6f 2d 32 2e 31 30 2e 33 20 7b  test io-2.10.3 {
23f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c  .  execsql { ROL
2400: 4c 42 41 43 4b 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  LBACK }.} {}..do
2410: 5f 74 65 73 74 20 69 6f 2d 32 2e 31 31 2e 30 20  _test io-2.11.0 
2420: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
2430: 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e     PRAGMA lockin
2440: 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69  g_mode = exclusi
2450: 76 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c  ve;.    PRAGMA l
2460: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b 0a 20 20 7d  ocking_mode;.  }
2470: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 65 78  .} {exclusive ex
2480: 63 6c 75 73 69 76 65 7d 0a 62 72 65 61 6b 70 6f  clusive}.breakpo
2490: 69 6e 74 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 32  int.do_test io-2
24a0: 2e 31 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  .11.1 {.  execsq
24b0: 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20  l { .    INSERT 
24c0: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
24d0: 31 31 2c 20 31 32 29 3b 0a 20 20 7d 0a 20 20 66  11, 12);.  }.  f
24e0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
24f0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
2500: 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 0a 64 6f 5f  .breakpoint..do_
2510: 74 65 73 74 20 69 6f 2d 32 2e 31 31 2e 32 20 7b  test io-2.11.2 {
2520: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
2530: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
2540: 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 3b 0a  _mode = normal;.
2550: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2560: 61 62 63 20 56 41 4c 55 45 53 28 31 33 2c 20 31  abc VALUES(13, 1
2570: 34 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 65  4);.  }.  file e
2580: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
2590: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 7d 20 3b  urnal.} {0}..} ;
25a0: 23 20 2f 2a 20 69 66 63 61 70 61 62 6c 65 20 61  # /* ifcapable a
25b0: 74 6f 6d 69 63 77 72 69 74 65 20 2a 2f 0a 0a 23  tomicwrite */..#
25c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2600: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61  ------.# Test ca
2610: 73 65 73 20 69 6f 2d 33 2e 2a 20 74 65 73 74 20  ses io-3.* test 
2620: 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
2630: 54 49 41 4c 20 6f 70 74 69 6d 69 7a 61 74 69 6f  TIAL optimizatio
2640: 6e 2e 0a 23 0a 73 71 6c 69 74 65 33 5f 73 69 6d  n..#.sqlite3_sim
2650: 75 6c 61 74 65 5f 64 65 76 69 63 65 20 2d 63 68  ulate_device -ch
2660: 61 72 20 73 65 71 75 65 6e 74 69 61 6c 20 2d 73  ar sequential -s
2670: 65 63 74 6f 72 73 69 7a 65 20 30 0a 69 66 63 61  ectorsize 0.ifca
2680: 70 61 62 6c 65 20 70 61 67 65 72 5f 70 72 61 67  pable pager_prag
2690: 6d 61 73 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  mas {.  do_test 
26a0: 69 6f 2d 33 2e 31 20 7b 0a 20 20 20 20 64 62 20  io-3.1 {.    db 
26b0: 63 6c 6f 73 65 0a 20 20 20 20 66 69 6c 65 20 64  close.    file d
26c0: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
26d0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75  t.db test.db-jou
26e0: 72 6e 61 6c 0a 20 20 20 20 73 71 6c 69 74 65 33  rnal.    sqlite3
26f0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20   db test.db.    
2700: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
2710: 62 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 6f 5f 74  b.  } {0}.  do_t
2720: 65 73 74 20 69 6f 2d 33 2e 32 20 7b 0a 20 20 20  est io-3.2 {.   
2730: 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54   execsql { CREAT
2740: 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62  E TABLE abc(a, b
2750: 29 20 7d 0a 20 20 20 20 6e 53 79 6e 63 0a 20 20  ) }.    nSync.  
2760: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2770: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
2780: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 20 20  ize = 10;.      
2790: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
27a0: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c  ERT INTO abc VAL
27b0: 55 45 53 28 27 68 65 6c 6c 6f 27 2c 20 27 77 6f  UES('hello', 'wo
27c0: 72 6c 64 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  rld');.      INS
27d0: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c  ERT INTO abc SEL
27e0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a  ECT * FROM abc;.
27f0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2800: 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46  O abc SELECT * F
2810: 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 20 20 49  ROM abc;.      I
2820: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53  NSERT INTO abc S
2830: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
2840: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2850: 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a  NTO abc SELECT *
2860: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 20   FROM abc;.     
2870: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
2880: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
2890: 62 63 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bc;.      INSERT
28a0: 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54   INTO abc SELECT
28b0: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20   * FROM abc;.   
28c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
28d0: 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  bc SELECT * FROM
28e0: 20 61 62 63 3b 0a 20 20 20 20 20 20 49 4e 53 45   abc;.      INSE
28f0: 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45  RT INTO abc SELE
2900: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20  CT * FROM abc;. 
2910: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2920: 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52   abc SELECT * FR
2930: 4f 4d 20 61 62 63 3b 0a 20 20 20 20 20 20 49 4e  OM abc;.      IN
2940: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45  SERT INTO abc SE
2950: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b  LECT * FROM abc;
2960: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2970: 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20  TO abc SELECT * 
2980: 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 7d 0a  FROM abc;.    }.
2990: 20 20 20 20 23 20 46 69 6c 65 20 68 61 73 20 67      # File has g
29a0: 72 6f 77 6e 20 2d 20 73 68 6f 77 69 6e 67 20 74  rown - showing t
29b0: 68 65 72 65 20 77 61 73 20 61 20 63 61 63 68 65  here was a cache
29c0: 2d 73 70 69 6c 6c 20 2d 20 62 75 74 20 74 68 65  -spill - but the
29d0: 72 65 20 0a 20 20 20 20 23 20 68 61 76 65 20 62  re .    # have b
29e0: 65 65 6e 20 6e 6f 20 63 61 6c 6c 73 20 74 6f 20  een no calls to 
29f0: 66 73 79 6e 63 28 29 3a 0a 20 20 20 20 6c 69 73  fsync():.    lis
2a00: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
2a10: 74 2e 64 62 5d 20 5b 6e 53 79 6e 63 5d 0a 20 20  t.db] [nSync].  
2a20: 7d 20 7b 33 31 37 34 34 20 30 7d 0a 20 20 64 6f  } {31744 0}.  do
2a30: 5f 74 65 73 74 20 69 6f 2d 33 2e 33 20 7b 0a 20  _test io-3.3 {. 
2a40: 20 20 20 23 20 54 68 65 20 43 4f 4d 4d 49 54 20     # The COMMIT 
2a50: 72 65 71 75 69 72 65 73 20 61 20 73 69 6e 67 6c  requires a singl
2a60: 65 20 66 73 79 6e 63 28 29 20 2d 20 74 6f 20 74  e fsync() - to t
2a70: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a80: 2e 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  ..    execsql { 
2a90: 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 6c 69 73  COMMIT }.    lis
2aa0: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
2ab0: 74 2e 64 62 5d 20 5b 6e 53 79 6e 63 5d 0a 20 20  t.db] [nSync].  
2ac0: 7d 20 7b 33 39 39 33 36 20 31 7d 0a 7d 0a 0a 23  } {39936 1}.}..#
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b10: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61  ------.# Test ca
2b20: 73 65 73 20 69 6f 2d 34 2e 2a 20 74 65 73 74 20  ses io-4.* test 
2b30: 74 68 65 20 49 4f 43 41 50 5f 53 41 46 45 5f 41  the IOCAP_SAFE_A
2b40: 50 50 45 4e 44 20 6f 70 74 69 6d 69 7a 61 74 69  PPEND optimizati
2b50: 6f 6e 2e 0a 23 0a 73 71 6c 69 74 65 33 5f 73 69  on..#.sqlite3_si
2b60: 6d 75 6c 61 74 65 5f 64 65 76 69 63 65 20 2d 63  mulate_device -c
2b70: 68 61 72 20 73 61 66 65 5f 61 70 70 65 6e 64 0a  har safe_append.
2b80: 0a 23 20 57 69 74 68 20 74 68 65 20 53 41 46 45  .# With the SAFE
2b90: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 73 65 74  _APPEND flag set
2ba0: 2c 20 73 69 6d 70 6c 65 20 74 72 61 6e 73 61 63  , simple transac
2bb0: 74 69 6f 6e 73 20 72 65 71 75 69 72 65 20 33 2c  tions require 3,
2bc0: 20 72 61 74 68 65 72 0a 23 20 74 68 61 6e 20 34   rather.# than 4
2bd0: 2c 20 63 61 6c 6c 73 20 74 6f 20 66 73 79 6e 63  , calls to fsync
2be0: 28 29 2e 20 54 68 65 20 66 73 79 6e 63 28 29 20  (). The fsync() 
2bf0: 63 61 6c 6c 73 20 61 72 65 20 6f 6e 3a 0a 23 0a  calls are on:.#.
2c00: 23 20 20 20 31 29 20 54 68 65 20 64 69 72 65 63  #   1) The direc
2c10: 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 68  tory in which th
2c20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2c30: 73 20 63 72 65 61 74 65 64 2c 20 28 75 6e 69 78  s created, (unix
2c40: 20 6f 6e 6c 79 29 0a 23 20 20 20 32 29 20 54 68   only).#   2) Th
2c50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
2c60: 74 6f 20 73 79 6e 63 20 74 68 65 20 70 61 67 65  to sync the page
2c70: 20 64 61 74 61 29 2c 0a 23 20 20 20 33 29 20 54   data),.#   3) T
2c80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c90: 2e 0a 23 0a 23 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ..#.# Normally, 
2ca0: 77 68 65 6e 20 74 68 65 20 53 41 46 45 5f 41 50  when the SAFE_AP
2cb0: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 6e 6f 74  PEND flag is not
2cc0: 20 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 61   set, there is a
2cd0: 6e 6f 74 68 65 72 20 66 73 79 6e 63 28 29 0a 23  nother fsync().#
2ce0: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
2cf0: 66 69 6c 65 20 62 65 74 77 65 65 6e 20 73 74 65  file between ste
2d00: 70 73 20 28 32 29 20 61 6e 64 20 28 33 29 20 61  ps (2) and (3) a
2d10: 62 6f 76 65 2e 0a 23 0a 69 66 20 7b 24 3a 3a 74  bove..#.if {$::t
2d20: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74  cl_platform(plat
2d30: 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d 20 7b  form)=="unix"} {
2d40: 0a 20 20 73 65 74 20 65 78 70 65 63 74 65 64 5f  .  set expected_
2d50: 73 79 6e 63 5f 63 6f 75 6e 74 20 33 0a 7d 20 65  sync_count 3.} e
2d60: 6c 73 65 20 7b 0a 20 20 73 65 74 20 65 78 70 65  lse {.  set expe
2d70: 63 74 65 64 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  cted_sync_count 
2d80: 32 0a 7d 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 34  2.}.do_test io-4
2d90: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
2da0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63   DELETE FROM abc
2db0: 20 7d 0a 20 20 6e 53 79 6e 63 0a 20 20 65 78 65   }.  nSync.  exe
2dc0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
2dd0: 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 27 61  TO abc VALUES('a
2de0: 27 2c 20 27 62 27 29 20 7d 0a 20 20 6e 53 79 6e  ', 'b') }.  nSyn
2df0: 63 0a 7d 20 24 65 78 70 65 63 74 65 64 5f 73 79  c.} $expected_sy
2e00: 6e 63 5f 63 6f 75 6e 74 0a 0a 23 20 57 69 74 68  nc_count..# With
2e10: 20 53 41 46 45 5f 41 50 50 45 4e 44 20 73 65 74   SAFE_APPEND set
2e20: 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
2e30: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2e40: 66 69 6c 65 20 68 65 61 64 65 72 20 73 68 6f 75  file header shou
2e50: 6c 64 0a 23 20 62 65 20 73 65 74 20 74 6f 20 30  ld.# be set to 0
2e60: 78 46 46 46 46 46 46 46 46 20 62 65 66 6f 72 65  xFFFFFFFF before
2e70: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
2e80: 61 6c 20 73 79 6e 63 2e 20 54 68 65 20 6e 52 65  al sync. The nRe
2e90: 63 20 66 69 65 6c 64 0a 23 20 6f 63 63 75 70 69  c field.# occupi
2ea0: 65 73 20 62 79 74 65 73 20 38 2d 31 31 20 6f 66  es bytes 8-11 of
2eb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ec0: 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6f 2d  e..#.do_test io-
2ed0: 34 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  4.2.1 {.  execsq
2ee0: 6c 20 7b 20 42 45 47 49 4e 20 7d 0a 20 20 65 78  l { BEGIN }.  ex
2ef0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
2f00: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 27  NTO abc VALUES('
2f10: 63 27 2c 20 27 64 27 29 20 7d 0a 20 20 66 69 6c  c', 'd') }.  fil
2f20: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
2f30: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 69  -journal.} {1}.i
2f40: 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  f {$::tcl_platfo
2f50: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75  rm(platform)=="u
2f60: 6e 69 78 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  nix"} {.  do_tes
2f70: 74 20 69 6f 2d 34 2e 32 2e 32 20 7b 0a 20 20 20  t io-4.2.2 {.   
2f80: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65   set fd [open te
2f90: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 0a 20  st.db-journal]. 
2fa0: 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66     fconfigure $f
2fb0: 64 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62  d -translation b
2fc0: 69 6e 61 72 79 20 2d 65 6e 63 6f 64 69 6e 67 20  inary -encoding 
2fd0: 62 69 6e 61 72 79 0a 20 20 20 20 73 65 65 6b 20  binary.    seek 
2fe0: 24 66 64 20 38 0a 20 20 20 20 73 65 74 20 62 6c  $fd 8.    set bl
2ff0: 6f 62 20 5b 72 65 61 64 20 24 66 64 20 34 5d 0a  ob [read $fd 4].
3000: 20 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20      close $fd.  
3010: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 62    binary scan $b
3020: 6c 6f 62 20 69 20 72 65 73 0a 20 20 20 20 66 6f  lob i res.    fo
3030: 72 6d 61 74 20 30 78 25 58 20 24 72 65 73 0a 20  rmat 0x%X $res. 
3040: 20 7d 20 7b 30 78 46 46 46 46 46 46 46 46 7d 0a   } {0xFFFFFFFF}.
3050: 7d 0a 64 6f 5f 74 65 73 74 20 69 6f 2d 34 2e 32  }.do_test io-4.2
3060: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
3070: 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 6e 53 79 6e   COMMIT }.  nSyn
3080: 63 0a 7d 20 24 65 78 70 65 63 74 65 64 5f 73 79  c.} $expected_sy
3090: 6e 63 5f 63 6f 75 6e 74 0a 73 71 6c 69 74 65 33  nc_count.sqlite3
30a0: 5f 73 69 6d 75 6c 61 74 65 5f 64 65 76 69 63 65  _simulate_device
30b0: 20 2d 63 68 61 72 20 73 61 66 65 5f 61 70 70 65   -char safe_appe
30c0: 6e 64 0a 0a 23 20 57 69 74 68 20 53 41 46 45 5f  nd..# With SAFE_
30d0: 41 50 50 45 4e 44 20 73 65 74 2c 20 74 68 65 72  APPEND set, ther
30e0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 65 76  e should only ev
30f0: 65 72 20 62 65 20 6f 6e 65 20 6a 6f 75 72 6e 61  er be one journa
3100: 6c 2d 68 65 61 64 65 72 0a 23 20 77 72 69 74 74  l-header.# writt
3110: 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
3120: 73 65 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  se, even though 
3130: 74 68 65 20 73 79 6e 63 2d 6d 6f 64 65 20 69 73  the sync-mode is
3140: 20 22 66 75 6c 6c 22 2e 0a 23 0a 64 6f 5f 74 65   "full"..#.do_te
3150: 73 74 20 69 6f 2d 34 2e 33 2e 31 20 7b 0a 20 20  st io-4.3.1 {.  
3160: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
3170: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45  SERT INTO abc SE
3180: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b  LECT * FROM abc;
3190: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
31a0: 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52   abc SELECT * FR
31b0: 4f 4d 20 61 62 63 3b 0a 20 20 20 20 49 4e 53 45  OM abc;.    INSE
31c0: 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45  RT INTO abc SELE
31d0: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20  CT * FROM abc;. 
31e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
31f0: 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  bc SELECT * FROM
3200: 20 61 62 63 3b 0a 20 20 20 20 49 4e 53 45 52 54   abc;.    INSERT
3210: 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54   INTO abc SELECT
3220: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20   * FROM abc;.   
3230: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
3240: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
3250: 62 63 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  bc;.    INSERT I
3260: 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a  NTO abc SELECT *
3270: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 49   FROM abc;.    I
3280: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53  NSERT INTO abc S
3290: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
32a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
32b0: 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46  O abc SELECT * F
32c0: 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 49 4e 53  ROM abc;.    INS
32d0: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c  ERT INTO abc SEL
32e0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a  ECT * FROM abc;.
32f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3300: 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  abc SELECT * FRO
3310: 4d 20 61 62 63 3b 0a 20 20 7d 0a 20 20 65 78 70  M abc;.  }.  exp
3320: 72 20 7b 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  r {[file size te
3330: 73 74 2e 64 62 5d 2f 31 30 32 34 7d 0a 7d 20 7b  st.db]/1024}.} {
3340: 34 33 7d 0a 69 66 63 61 70 61 62 6c 65 20 70 61  43}.ifcapable pa
3350: 67 65 72 5f 70 72 61 67 6d 61 73 20 7b 0a 20 20  ger_pragmas {.  
3360: 64 6f 5f 74 65 73 74 20 69 6f 2d 34 2e 33 2e 32  do_test io-4.3.2
3370: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3380: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 73 79  .      PRAGMA sy
3390: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c  nchronous = full
33a0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63  ;.      PRAGMA c
33b0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
33c0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e        PRAGMA syn
33d0: 63 68 72 6f 6e 6f 75 73 3b 0a 20 20 20 20 7d 0a  chronous;.    }.
33e0: 20 20 7d 20 7b 32 7d 0a 7d 0a 64 6f 5f 74 65 73    } {2}.}.do_tes
33f0: 74 20 69 6f 2d 34 2e 33 2e 33 20 7b 0a 20 20 65  t io-4.3.3 {.  e
3400: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
3410: 49 4e 3b 0a 20 20 20 20 55 50 44 41 54 45 20 61  IN;.    UPDATE a
3420: 62 63 20 53 45 54 20 61 20 3d 20 27 78 27 3b 0a  bc SET a = 'x';.
3430: 20 20 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74    }.  file exist
3440: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
3450: 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  l.} {1}.do_test 
3460: 69 6f 2d 34 2e 33 2e 34 20 7b 0a 20 20 23 20 54  io-4.3.4 {.  # T
3470: 68 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  he UPDATE statem
3480: 65 6e 74 20 69 6e 20 74 68 65 20 73 74 61 74 65  ent in the state
3490: 6d 65 6e 74 20 61 62 6f 76 65 20 6d 6f 64 69 66  ment above modif
34a0: 69 65 73 20 34 31 20 70 61 67 65 73 20 0a 20 20  ies 41 pages .  
34b0: 23 20 28 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  # (all pages in 
34c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 65 78 63  the database exc
34d0: 65 70 74 20 70 61 67 65 20 31 20 61 6e 64 20 74  ept page 1 and t
34e0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
34f0: 0a 20 20 23 20 61 62 63 29 2e 20 42 65 63 61 75  .  # abc). Becau
3500: 73 65 20 74 68 65 20 63 61 63 68 65 5f 73 69 7a  se the cache_siz
3510: 65 20 69 73 20 73 65 74 20 74 6f 20 31 30 2c 20  e is set to 10, 
3520: 74 68 69 73 20 6d 75 73 74 20 68 61 76 65 20 72  this must have r
3530: 65 71 75 69 72 65 64 0a 20 20 23 20 61 74 20 6c  equired.  # at l
3540: 65 61 73 74 20 34 20 63 61 63 68 65 2d 73 70 69  east 4 cache-spi
3550: 6c 6c 73 2e 20 49 66 20 74 68 65 72 65 20 77 65  lls. If there we
3560: 72 65 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 68 65  re no journal he
3570: 61 64 65 72 73 20 77 72 69 74 74 65 6e 0a 20 20  aders written.  
3580: 23 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  # to the journal
3590: 20 66 69 6c 65 20 61 66 74 65 72 20 74 68 65 20   file after the 
35a0: 63 61 63 68 65 2d 73 70 69 6c 6c 2c 20 74 68 65  cache-spill, the
35b0: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
35c0: 65 0a 20 20 23 20 6a 6f 75 72 6e 61 6c 20 66 69  e.  # journal fi
35d0: 6c 65 20 69 73 20 67 69 76 65 20 62 79 3a 0a 20  le is give by:. 
35e0: 20 23 0a 20 20 23 20 20 20 20 3c 6a 72 6e 6c 20   #.  #    <jrnl 
35f0: 66 69 6c 65 20 73 69 7a 65 3e 20 3d 20 3c 6a 72  file size> = <jr
3600: 6e 6c 20 68 65 61 64 65 72 20 73 69 7a 65 3e 20  nl header size> 
3610: 2b 20 6e 50 61 67 65 20 2a 20 28 3c 70 61 67 65  + nPage * (<page
3620: 2d 73 69 7a 65 3e 20 2b 20 38 29 0a 20 20 23 0a  -size> + 8).  #.
3630: 20 20 23 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    # If the journ
3640: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
3650: 20 61 64 64 69 74 69 6f 6e 61 6c 20 68 65 61 64   additional head
3660: 65 72 73 2c 20 74 68 69 73 20 66 6f 72 6d 75 6c  ers, this formul
3670: 61 0a 20 20 23 20 77 69 6c 6c 20 6e 6f 74 20 70  a.  # will not p
3680: 72 65 64 69 63 74 20 74 68 65 20 73 69 7a 65 20  redict the size 
3690: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
36a0: 69 6c 65 2e 0a 20 20 23 0a 20 20 66 69 6c 65 20  ile..  #.  file 
36b0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
36c0: 72 6e 61 6c 0a 7d 20 5b 65 78 70 72 20 31 30 32  rnal.} [expr 102
36d0: 34 20 2b 20 28 31 30 32 34 2b 38 29 2a 34 31 5d  4 + (1024+8)*41]
36e0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
3730: 20 63 61 73 65 73 20 69 6f 2d 35 2e 2a 20 74 65   cases io-5.* te
3740: 73 74 20 74 68 61 74 20 74 68 65 20 64 65 66 61  st that the defa
3750: 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
3760: 20 73 65 6c 65 63 74 65 64 20 61 6e 64 0a 23 20   selected and.# 
3770: 75 73 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  used correctly..
3780: 23 0a 73 65 74 20 74 6e 20 30 0a 66 6f 72 65 61  #.set tn 0.forea
3790: 63 68 20 7b 63 68 61 72 20 20 20 20 20 20 20 20  ch {char        
37a0: 20 20 20 20 20 20 20 20 20 73 65 63 74 6f 72 73           sectors
37b0: 69 7a 65 20 70 67 73 69 7a 65 7d 20 7b 0a 20 20  ize pgsize} {.  
37c0: 20 20 20 20 20 20 20 7b 7d 20 20 20 20 20 20 20         {}       
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
37e0: 32 20 20 20 20 20 20 31 30 32 34 0a 20 20 20 20  2      1024.    
37f0: 20 20 20 20 20 7b 7d 20 20 20 20 20 20 20 20 20       {}         
3800: 20 20 20 20 20 20 20 20 20 20 20 31 30 32 34 20             1024 
3810: 20 20 20 20 20 31 30 32 34 0a 20 20 20 20 20 20       1024.      
3820: 20 20 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20     {}           
3830: 20 20 20 20 20 20 20 20 20 32 30 34 38 20 20 20           2048   
3840: 20 20 20 32 30 34 38 0a 20 20 20 20 20 20 20 20     2048.        
3850: 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20 20 20   {}             
3860: 20 20 20 20 20 20 20 38 31 39 32 20 20 20 20 20         8192     
3870: 20 38 31 39 32 0a 20 20 20 20 20 20 20 20 20 7b   8192.         {
3880: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
3890: 20 20 20 20 31 36 33 38 34 20 20 20 20 20 20 38      16384      8
38a0: 31 39 32 0a 20 20 20 20 20 20 20 20 20 7b 61 74  192.         {at
38b0: 6f 6d 69 63 7d 20 20 20 20 20 20 20 20 20 20 20  omic}           
38c0: 20 20 20 20 35 31 32 20 20 20 20 20 20 38 31 39      512      819
38d0: 32 0a 20 20 20 20 20 20 20 20 20 7b 61 74 6f 6d  2.         {atom
38e0: 69 63 35 31 32 7d 20 20 20 20 20 20 20 20 20 20  ic512}          
38f0: 20 20 35 31 32 20 20 20 20 20 20 31 30 32 34 0a    512      1024.
3900: 20 20 20 20 20 20 20 20 20 7b 61 74 6f 6d 69 63           {atomic
3910: 32 4b 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  2K}             
3920: 35 31 32 20 20 20 20 20 20 32 30 34 38 0a 20 20  512      2048.  
3930: 20 20 20 20 20 20 20 7b 61 74 6f 6d 69 63 32 4b         {atomic2K
3940: 7d 20 20 20 20 20 20 20 20 20 20 20 20 34 30 39  }            409
3950: 36 20 20 20 20 20 20 34 30 39 36 0a 20 20 20 20  6      4096.    
3960: 20 20 20 20 20 7b 61 74 6f 6d 69 63 32 4b 20 61       {atomic2K a
3970: 74 6f 6d 69 63 7d 20 20 20 20 20 20 35 31 32 20  tomic}      512 
3980: 20 20 20 20 20 38 31 39 32 0a 20 20 20 20 20 20       8192.      
3990: 20 20 20 7b 61 74 6f 6d 69 63 36 34 4b 7d 20 20     {atomic64K}  
39a0: 20 20 20 20 20 20 20 20 20 20 35 31 32 20 20 20            512   
39b0: 20 20 20 31 30 32 34 0a 7d 20 7b 0a 20 20 69 6e     1024.} {.  in
39c0: 63 72 20 74 6e 0a 20 20 64 62 20 63 6c 6f 73 65  cr tn.  db close
39d0: 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  .  file delete -
39e0: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65  force test.db te
39f0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  st.db-journal.  
3a00: 73 71 6c 69 74 65 33 5f 73 69 6d 75 6c 61 74 65  sqlite3_simulate
3a10: 5f 64 65 76 69 63 65 20 2d 63 68 61 72 20 24 63  _device -char $c
3a20: 68 61 72 20 2d 73 65 63 74 6f 72 73 69 7a 65 20  har -sectorsize 
3a30: 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 73 71  $sectorsize.  sq
3a40: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
3a50: 0a 20 20 69 66 63 61 70 61 62 6c 65 20 21 61 74  .  ifcapable !at
3a60: 6f 6d 69 63 77 72 69 74 65 20 7b 0a 20 20 20 20  omicwrite {.    
3a70: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 61 74  if {[regexp {^at
3a80: 6f 6d 69 63 7d 20 24 63 68 61 72 5d 7d 20 63 6f  omic} $char]} co
3a90: 6e 74 69 6e 75 65 0a 20 20 7d 0a 20 20 64 6f 5f  ntinue.  }.  do_
3aa0: 74 65 73 74 20 69 6f 2d 35 2e 24 74 6e 20 7b 0a  test io-5.$tn {.
3ab0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3ac0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3ad0: 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20   abc(a, b, c);. 
3ae0: 20 20 20 7d 0a 20 20 20 20 65 78 70 72 20 7b 5b     }.    expr {[
3af0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
3b00: 62 5d 2f 32 7d 0a 20 20 7d 20 24 70 67 73 69 7a  b]/2}.  } $pgsiz
3b10: 65 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 73 69 6d  e.}..sqlite3_sim
3b20: 75 6c 61 74 65 5f 64 65 76 69 63 65 20 2d 63 68  ulate_device -ch
3b30: 61 72 20 7b 7d 20 2d 73 65 63 74 6f 72 73 69 7a  ar {} -sectorsiz
3b40: 65 20 30 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  e 0.finish_test.