/ Hex Artifact Content
Login

Artifact c8f202a460ba6a1cd7a36888042ca471220bb42d:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  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 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e 6f 74 20  n.tcl..# Do not 
0210: 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 20  use a codec for 
0220: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0230: 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 62  le, as the datab
0240: 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d 61  ase file is.# ma
0250: 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 74  nipulated direct
0260: 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 72  ly using tcl scr
0270: 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 20  ipts (using the 
0280: 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 6f  [hexio_write] co
0290: 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f 74  mmand)..#.do_not
02a0: 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 20  _use_codec..#.# 
02b0: 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 74  pager1-1.*: Test
02c0: 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 6c   inter-process l
02d0: 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 20  ocking (clients 
02e0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
02f0: 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 65  esses)..#.# page
0300: 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e 74  r1-2.*: Test int
0310: 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b 69  ra-process locki
0320: 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c 69  ng (multiple cli
0330: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ents in this pro
0340: 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 72  cess)..#.# pager
0350: 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e 74  1-3.*: Savepoint
0360: 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a   related tests..
0370: 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a 20  #.# pager1-4.*: 
0380: 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c 61  Hot-journal rela
0390: 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 70  ted tests..#.# p
03a0: 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 73  ager1-5.*: Cases
03b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c 74   related to mult
03c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
03d0: 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a 20  #.# pager1-6.*: 
03e0: 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f  Cases related to
03f0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
0400: 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 67  e_count".#.# pag
0410: 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 73  er1-7.*: Cases s
0420: 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47  pecific to "PRAG
0430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0440: 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 61  TRUNCATE".#.# pa
0450: 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 20  ger1-8.*: Cases 
0460: 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  using temporary 
0470: 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
0480: 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  tabases..#.# pag
0490: 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 72  er1-9.*: Tests r
04a0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  elated to the ba
04b0: 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 61  ckup API..#.# pa
04c0: 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 20  ger1-10.*: Test 
04d0: 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 64  that the assumed
04e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
04f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d 69  tor-size is limi
0500: 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ted to.#        
0510: 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 20        64KB..#.# 
0520: 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 73  pager1-12.*: Tes
0530: 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 52  ts involving "PR
0540: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
0550: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a 3a  #.# pager1-13.*:
0560: 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 20   Cases specific 
0570: 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  to "PRAGMA journ
0580: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
0590: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e 2a  .#.# pager1-14.*
05a0: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
05b0: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
05c0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 0a  nal_mode=OFF".#.
05d0: 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 56  # pager1-15.*: V
05e0: 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76  arying sqlite3_v
05f0: 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 20  fs.szOsFile.#.# 
0600: 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 72  pager1-16.*: Var
0610: 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ying sqlite3_vfs
0620: 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 20  .mxPathname.#.# 
0630: 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 73  pager1-17.*: Tes
0640: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 50  ts related to "P
0650: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
0660: 6f 63 6b 22 0a 23 0a 23 20 70 61 67 65 72 31 2d  ock".#.# pager1-
0670: 31 38 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  18.*: Test that 
0680: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
0690: 72 65 73 70 6f 6e 64 73 20 63 6f 72 72 65 63 74  responds correct
06a0: 6c 79 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ly if the b-tree
06b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
06c0: 72 65 71 75 65 73 74 73 20 61 6e 20 69 6e 76 61  requests an inva
06d0: 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
06e0: 28 64 75 65 20 74 6f 20 64 62 20 63 6f 72 72 75  (due to db corru
06f0: 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72 6f 63 20  ption)..#..proc 
0700: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
0710: 20 7b 69 64 20 74 61 62 6c 65 20 7b 73 63 72 69   {id table {scri
0720: 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73 65 74 20  pt {}}} {.  set 
0730: 63 6e 74 20 30 0a 20 20 64 62 20 65 76 61 6c 20  cnt 0.  db eval 
0740: 22 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  "SELECT rowid, *
0750: 20 46 52 4f 4d 20 24 74 61 62 6c 65 20 57 48 45   FROM $table WHE
0760: 52 45 20 72 6f 77 69 64 20 3d 20 28 24 69 64 2d  RE rowid = ($id-
0770: 31 29 22 20 7b 0a 20 20 20 20 72 65 63 75 72 73  1)" {.    recurs
0780: 69 76 65 5f 73 65 6c 65 63 74 20 24 72 6f 77 69  ive_select $rowi
0790: 64 20 24 74 61 62 6c 65 20 24 73 63 72 69 70 74  d $table $script
07a0: 0a 20 20 20 20 69 6e 63 72 20 63 6e 74 0a 20 20  .    incr cnt.  
07b0: 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d 3d 30 7d  }.  if {$cnt==0}
07c0: 20 7b 20 65 76 61 6c 20 24 73 63 72 69 70 74 20   { eval $script 
07d0: 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74 72 69 6e  }.}..set a_strin
07e0: 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70 72 6f 63  g_counter 1.proc
07f0: 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d 20 7b 0a   a_string {n} {.
0800: 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74 72 69 6e    global a_strin
0810: 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69 6e 63 72  g_counter.  incr
0820: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
0830: 72 0a 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65  r.  string range
0840: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
0850: 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  "${a_string_coun
0860: 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20 24 6e 0a  ter}." $n] 1 $n.
0870: 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  }.db func a_stri
0880: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 64 6f 5f  ng a_string..do_
0890: 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
08a0: 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72 65 61 74   tn {..  # Creat
08b0: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
08c0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
08d0: 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  using connection
08e0: 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 0a 20 20   [db]. Check .  
08f0: 23 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  # that connectio
0900: 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62  ns [db2] and [db
0910: 33 5d 20 63 61 6e 20 73 65 65 20 74 68 65 20 73  3] can see the s
0920: 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65 6e  chema and conten
0930: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0940: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 20 7b 0a   pager1-$tn.1 {.
0950: 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20      sql1 {.     
0960: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0970: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
0980: 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  b);.      CREATE
0990: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
09a0: 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
09b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
09c0: 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e 53 45 52  1, 'one'); INSER
09d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
09e0: 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20  (2, 'two');.    
09f0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0a00: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 20  st pager1-$tn.2 
0a10: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0a20: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0a30: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0a40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a50: 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  .3 { sql3 { SELE
0a60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a70: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 0a   {1 one 2 two}..
0a80: 20 20 23 20 4f 70 65 6e 20 61 20 74 72 61 6e 73    # Open a trans
0a90: 61 63 74 69 6f 6e 20 61 6e 64 20 61 64 64 20 61  action and add a
0aa0: 20 72 6f 77 20 75 73 69 6e 67 20 5b 64 62 5d 2e   row using [db].
0ab0: 20 54 68 69 73 20 70 75 74 73 20 5b 64 62 5d 20   This puts [db] 
0ac0: 69 6e 0a 20 20 23 20 52 45 53 45 52 56 45 44 20  in.  # RESERVED 
0ad0: 73 74 61 74 65 2e 20 43 68 65 63 6b 20 74 68 61  state. Check tha
0ae0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64  t connections [d
0af0: 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 20 63 61  b2] and [db3] ca
0b00: 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72 65 61 64  n still.  # read
0b10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
0b20: 6e 74 65 6e 74 20 61 73 20 69 74 20 77 61 73 20  ntent as it was 
0b30: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
0b40: 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 23 20 6f  action was.  # o
0b50: 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73 68 6f 75  pened. [db] shou
0b60: 6c 64 20 73 65 65 20 74 68 65 20 69 6e 73 65 72  ld see the inser
0b70: 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a 20 20 64  ted row..  #.  d
0b80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
0b90: 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b  n.4 {.    sql1 {
0ba0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
0bb0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0bc0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27  O t1 VALUES(3, '
0bd0: 74 68 72 65 65 27 29 3b 0a 20 20 20 20 7d 0a 20  three');.    }. 
0be0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0bf0: 70 61 67 65 72 31 2d 24 74 6e 2e 35 20 7b 20 73  pager1-$tn.5 { s
0c00: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
0c10: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
0c20: 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f 5f 74 65  e 2 two}.  do_te
0c30: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 37 20  st pager1-$tn.7 
0c40: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
0c50: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c60: 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72   one 2 two 3 thr
0c70: 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 73 74  ee}..  # [db] st
0c80: 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ill has an open 
0c90: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
0ca0: 6e 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  n. Check that th
0cb0: 69 73 20 70 72 65 76 65 6e 74 73 0a 20 20 23 20  is prevents.  # 
0cc0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
0cd0: 73 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 20  s (specifically 
0ce0: 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77 72 69 74  [db2]) from writ
0cf0: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
0d00: 61 73 65 2e 0a 20 20 23 0a 20 20 23 20 45 76 65  ase..  #.  # Eve
0d10: 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70 65 6e 73  n if [db2] opens
0d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
0d30: 69 72 73 74 2c 20 69 74 20 6d 61 79 20 6e 6f 74  irst, it may not
0d40: 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20   write to the.  
0d50: 23 20 64 61 74 61 62 61 73 65 2e 20 41 66 74 65  # database. Afte
0d60: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
0d70: 20 77 72 69 74 65 20 74 68 65 20 64 62 20 77 69   write the db wi
0d80: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
0d90: 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32 5d 20 69  on, .  # [db2] i
0da0: 73 20 6c 65 66 74 20 77 69 74 68 20 61 6e 20 6f  s left with an o
0db0: 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
0dc0: 20 62 75 74 20 6e 6f 74 20 61 20 72 65 61 64 2d   but not a read-
0dd0: 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74 68 65 20  lock on.  # the 
0de0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 53  main database. S
0df0: 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 70 72  o it does not pr
0e00: 65 76 65 6e 74 20 5b 64 62 5d 20 66 72 6f 6d 20  event [db] from 
0e10: 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20 20 23 0a  committing..  #.
0e20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0e30: 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20 20 63 73  -$tn.8 { .    cs
0e40: 71 6c 32 20 7b 20 55 50 44 41 54 45 20 74 31 20  ql2 { UPDATE t1 
0e50: 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d  SET a = a + 10 }
0e60: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
0e70: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
0e80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0e90: 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63 73 71 6c  tn.9 { .    csql
0ea0: 32 20 7b 20 0a 20 20 20 20 20 20 42 45 47 49 4e  2 { .      BEGIN
0eb0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
0ec0: 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30  1 SET a = a + 10
0ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  ;.    }.  } {1 {
0ee0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
0ef0: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
0f00: 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20 74  db] commit its t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 43 68 65  ransactions. Che
0f20: 63 6b 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6e  ck the other con
0f30: 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a 20 20 23  nections can.  #
0f40: 20 6e 6f 77 20 73 65 65 20 74 68 65 20 6e 65 77   now see the new
0f50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
0f60: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0f70: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 30 20 7b   pager1-$tn.10 {
0f80: 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql1 { COMMIT }
0f90: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0fa0: 70 61 67 65 72 31 2d 24 74 6e 2e 31 31 20 7b 20  pager1-$tn.11 { 
0fb0: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql1 { SELECT * 
0fc0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
0fd0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
0fe0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
0ff0: 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73 71 6c 32  r1-$tn.12 { sql2
1000: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1010: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1020: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20   two 3 three}.  
1030: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1040: 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20 7b 20 53  tn.13 { sql3 { S
1050: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1060: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
1070: 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 43   3 three}..  # C
1080: 68 65 63 6b 20 74 68 61 74 2c 20 61 73 20 6e 6f  heck that, as no
1090: 74 65 64 20 61 62 6f 76 65 2c 20 5b 64 62 32 5d  ted above, [db2]
10a0: 20 72 65 61 6c 6c 79 20 64 69 64 20 6b 65 65 70   really did keep
10b0: 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   an open transac
10c0: 74 69 6f 6e 0a 20 20 23 20 61 66 74 65 72 20 74  tion.  # after t
10d0: 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
10e0: 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
10f0: 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a 20 20 64   failed..  #.  d
1100: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1110: 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.14 { .    csql
1120: 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a 20 20 7d  2 { BEGIN } .  }
1130: 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61 72   {1 {cannot star
1140: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1150: 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1160: 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  tion}}.  do_test
1170: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b   pager1-$tn.15 {
1180: 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42 41 43 4b   sql2 { ROLLBACK
1190: 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61 76   } } {}..  # Hav
11a0: 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 74  e [db2] open a t
11b0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74  ransaction and t
11c0: 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ake a read-lock 
11d0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
11e0: 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20  .  # Check that 
11f0: 74 68 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64  this prevents [d
1200: 62 5d 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  b] from writing 
1210: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1220: 28 6f 75 74 73 69 64 65 0a 20 20 23 20 6f 66 20  (outside.  # of 
1230: 61 6e 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  any transaction)
1240: 2e 20 41 66 74 65 72 20 74 68 69 73 20 66 61 69  . After this fai
1250: 6c 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 5b  ls, check that [
1260: 64 62 33 5d 20 63 61 6e 20 72 65 61 64 0a 20 20  db3] can read.  
1270: 23 20 74 68 65 20 64 62 20 28 73 68 6f 77 69 6e  # the db (showin
1280: 67 20 74 68 61 74 20 5b 64 62 5d 20 64 69 64 20  g that [db] did 
1290: 6e 6f 74 20 74 61 6b 65 20 61 20 50 45 4e 44 49  not take a PENDI
12a0: 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29 0a 20 20  NG lock etc.).  
12b0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  #.  do_test page
12c0: 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a 20 20 20  r1-$tn.15 { .   
12d0: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53   sql2 { BEGIN; S
12e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
12f0: 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32 20   }.  } {1 one 2 
1300: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64  two 3 three}.  d
1310: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1320: 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.16 { .    csql
1330: 31 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  1 { UPDATE t1 SE
1340: 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d 0a 20  T a = a + 10 }. 
1350: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
1360: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
1370: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1380: 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c  .17 { sql3 { SEL
1390: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
13a0: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
13b0: 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 54 68 69   three}..  # Thi
13c0: 73 20 74 69 6d 65 2c 20 68 61 76 65 20 5b 64 62  s time, have [db
13d0: 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63  ] open a transac
13e0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 77 72 69 74  tion before writ
13f0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1400: 2e 0a 20 20 23 20 54 68 69 73 20 77 6f 72 6b 73  ..  # This works
1410: 20 2d 20 5b 64 62 5d 20 67 65 74 73 20 61 20 52   - [db] gets a R
1420: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 69  ESERVED lock whi
1430: 63 68 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 66  ch does not conf
1440: 6c 69 63 74 20 77 69 74 68 0a 20 20 23 20 74 68  lict with.  # th
1450: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 5b 64  e SHARED lock [d
1460: 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e 67 2e 0a  b2] is holding..
1470: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61    #.  do_test pa
1480: 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b 20 0a 20  ger1-$tn.18 { . 
1490: 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20     sql1 { .     
14a0: 20 42 45 47 49 4e 3b 20 20 0a 20 20 20 20 20 20   BEGIN;  .      
14b0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
14c0: 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20 20 20 7d  = a + 10; .    }
14d0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
14e0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2d 31 39 20  t pager1-$tn-19 
14f0: 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 50 52  { .    sql1 { PR
1500: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
1510: 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 72 65   } .  } {main re
1520: 73 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73  served temp clos
1530: 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ed}.  do_test pa
1540: 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b 20 0a 20  ger1-$tn-20 { . 
1550: 20 20 20 73 71 6c 32 20 7b 20 50 52 41 47 4d 41     sql2 { PRAGMA
1560: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20 0a   lock_status } .
1570: 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61 72 65 64    } {main shared
1580: 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 20   temp closed}.. 
1590: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c   # Check that al
15a0: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  l connections ca
15b0: 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74 68 65  n still read the
15c0: 20 64 61 74 61 62 61 73 65 2e 20 4f 6e 6c 79 20   database. Only 
15d0: 5b 64 62 5d 20 73 65 65 73 0a 20 20 23 20 74 68  [db] sees.  # th
15e0: 65 20 75 70 64 61 74 65 64 20 63 6f 6e 74 65 6e  e updated conten
15f0: 74 20 28 61 73 20 74 68 65 20 74 72 61 6e 73 61  t (as the transa
1600: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  ction has not be
1610: 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 79 65 74  en committed yet
1620: 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  )..  #.  do_test
1630: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 31 20 7b   pager1-$tn.21 {
1640: 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a   sql1 { SELECT *
1650: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 31   FROM t1 } } {11
1660: 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33 20 74   one 12 two 13 t
1670: 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  hree}.  do_test 
1680: 70 61 67 65 72 31 2d 24 74 6e 2e 32 32 20 7b 20  pager1-$tn.22 { 
1690: 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
16a0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
16b0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
16c0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
16d0: 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73 71 6c 33  r1-$tn.23 { sql3
16e0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
16f0: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1700: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20   two 3 three}.. 
1710: 20 23 20 42 65 63 61 75 73 65 20 5b 64 62 32 5d   # Because [db2]
1720: 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 53   still has the S
1730: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b 64 62 5d  HARED lock, [db]
1740: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   is unable to co
1750: 6d 6d 69 74 20 74 68 65 0a 20 20 23 20 74 72 61  mmit the.  # tra
1760: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
1770: 74 72 69 65 73 2c 20 61 6e 20 65 72 72 6f 72 20  tries, an error 
1780: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1790: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  the connection .
17a0: 20 20 23 20 75 70 67 72 61 64 65 73 20 74 6f 20    # upgrades to 
17b0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
17c0: 20 20 23 0a 20 20 23 20 4f 6e 63 65 20 74 68 69    #.  # Once thi
17d0: 73 20 68 61 70 70 65 6e 73 2c 20 5b 64 62 5d 20  s happens, [db] 
17e0: 63 61 6e 20 72 65 61 64 20 74 68 65 20 64 61 74  can read the dat
17f0: 61 62 61 73 65 20 61 6e 64 20 73 65 65 20 74 68  abase and see th
1800: 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2c 0a 20  e new content,. 
1810: 20 23 20 5b 64 62 32 5d 20 28 73 74 69 6c 6c 20   # [db2] (still 
1820: 68 6f 6c 64 69 6e 67 20 53 48 41 52 45 44 29 20  holding SHARED) 
1830: 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74  can still read t
1840: 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 2c 20  he old content, 
1850: 62 75 74 20 5b 64 62 33 5d 0a 20 20 23 20 28 6e  but [db3].  # (n
1860: 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c  ot holding any l
1870: 6f 63 6b 29 20 69 73 20 70 72 65 76 65 6e 74 65  ock) is prevente
1880: 64 20 62 79 20 5b 64 62 5d 27 73 20 50 45 4e 44  d by [db]'s PEND
1890: 49 4e 47 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ING from reading
18a0: 0a 20 20 23 20 74 68 65 20 64 61 74 61 62 61 73  .  # the databas
18b0: 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  e..  #.  do_test
18c0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 34 20 7b   pager1-$tn.24 {
18d0: 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20   csql1 { COMMIT 
18e0: 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  } } {1 {database
18f0: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
1900: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1910: 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73 71 6c 31  n-25 { .    sql1
1920: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73   { PRAGMA lock_s
1930: 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61  tatus } .  } {ma
1940: 69 6e 20 70 65 6e 64 69 6e 67 20 74 65 6d 70 20  in pending temp 
1950: 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73  closed}.  do_tes
1960: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 36 20  t pager1-$tn.26 
1970: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
1980: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
1990: 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33  11 one 12 two 13
19a0: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
19b0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37 20  t pager1-$tn.27 
19c0: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
19d0: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
19e0: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
19f0: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1a00: 61 67 65 72 31 2d 24 74 6e 2e 32 38 20 7b 20 63  ager1-$tn.28 { c
1a10: 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql3 { SELECT * 
1a20: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b  FROM t1 } } {1 {
1a30: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
1a40: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
1a50: 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20  db2] commit its 
1a60: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1a70: 2c 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  , releasing the 
1a80: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 74 0a 20  SHARED lock it. 
1a90: 20 23 20 69 73 20 68 6f 6c 64 69 6e 67 2e 20 4e   # is holding. N
1aa0: 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b 64 62 32  ow, neither [db2
1ab0: 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d 61 79 20  ] nor [db3] may 
1ac0: 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1ad0: 65 20 28 61 73 20 5b 64 62 5d 0a 20 20 23 20 69  e (as [db].  # i
1ae0: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
1af0: 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20 20 23 0a  a PENDING)..  #.
1b00: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1b10: 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c 32 20 7b  -$tn.29 { sql2 {
1b20: 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20   COMMIT } } {}. 
1b30: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b40: 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c 32 20 7b  $tn.30 { csql2 {
1b50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1b60: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1b70: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
1b80: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b90: 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c 33 20 7b  $tn.31 { csql3 {
1ba0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1bb0: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1bc0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a  se is locked}}..
1bd0: 20 20 23 20 5b 64 62 5d 20 69 73 20 6e 6f 77 20    # [db] is now 
1be0: 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20 74  able to commit t
1bf0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
1c00: 4f 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61 63  Once the transac
1c10: 74 69 6f 6e 20 69 73 20 0a 20 20 23 20 63 6f 6d  tion is .  # com
1c20: 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74 68 72 65  mitted, all thre
1c30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  e connections ca
1c40: 6e 20 72 65 61 64 20 74 68 65 20 6e 65 77 20 63  n read the new c
1c50: 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f  ontent..  #.  do
1c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1c70: 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20 55 50 44  .25 { sql1 { UPD
1c80: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61  ATE t1 SET a = a
1c90: 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f  +10 } } {}.  do_
1ca0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1cb0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d  26 { sql1 { COMM
1cc0: 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  IT } } {}.  do_t
1cd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1ce0: 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  7 { sql1 { SELEC
1cf0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
1d00: 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32  {21 one 22 two 2
1d10: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
1d20: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37  st pager1-$tn.27
1d30: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1d40: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1d50: 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33  21 one 22 two 23
1d60: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1d70: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1d80: 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20  { sql3 { SELECT 
1d90: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 32  * FROM t1 } } {2
1da0: 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20  1 one 22 two 23 
1db0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 49 6e 73 74  three}..  # Inst
1dc0: 61 6c 6c 20 61 20 62 75 73 79 2d 68 61 6e 64 6c  all a busy-handl
1dd0: 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  er for connectio
1de0: 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20 20 73 65  n [db]..  #.  se
1df0: 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69 73 74 5d  t ::nbusy [list]
1e00: 0a 20 20 70 72 6f 63 20 62 75 73 79 20 7b 6e 7d  .  proc busy {n}
1e10: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a   {.    lappend :
1e20: 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20 20 69 66  :nbusy $n.    if
1e30: 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c 32 20 43   {$n>5} { sql2 C
1e40: 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72 65 74 75  OMMIT }.    retu
1e50: 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62 20 62 75  rn 0.  }.  db bu
1e60: 73 79 20 62 75 73 79 0a 0a 20 20 64 6f 5f 74 65  sy busy..  do_te
1e70: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 39  st pager1-$tn.29
1e80: 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 42   { .    sql1 { B
1e90: 45 47 49 4e 20 3b 20 49 4e 53 45 52 54 20 49 4e  EGIN ; INSERT IN
1ea0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 27  TO t1 VALUES('x'
1eb0: 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d 20 7b 7d  , 'y') } .  } {}
1ec0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1ed0: 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20 20 20 20  1-$tn.30 { .    
1ee0: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20 53  sql2 { BEGIN ; S
1ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1f00: 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e 65 20 32  } .  } {21 one 2
1f10: 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a  2 two 23 three}.
1f20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1f30: 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c 31 20 43  -$tn.31 { sql1 C
1f40: 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f  OMMIT } {}.  do_
1f50: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1f60: 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62 75 73 79  32 { set ::nbusy
1f70: 20 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35 20   } {0 1 2 3 4 5 
1f80: 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  6}.}..#---------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 0a 23 20 53 61 76 65 70 6f 69 6e 74 20 72 65 6c  .# Savepoint rel
1fe0: 61 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e  ated test cases.
1ff0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 33 2e 31 2e  .#.# pager1-3.1.
2000: 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20 73 61 76  2.*: Force a sav
2010: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
2020: 74 6f 20 63 61 75 73 65 20 74 68 65 20 64 61 74  to cause the dat
2030: 61 62 61 73 65 20 66 69 6c 65 0a 23 20 20 20 20  abase file.#    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20               to 
2050: 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67 65 72 31  grow..#.# pager1
2060: 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65 20 61 20  -3.1.3.*: Use a 
2070: 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
2080: 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f  in synchronous=o
2090: 66 66 20 6d 6f 64 65 20 61 73 20 70 61 72 74 0a  ff mode as part.
20a0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
20b0: 20 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74    of a savepoint
20c0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 0a 64 6f   rollback..# .do
20d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31  _test pager1-3.1
20e0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
20f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
2100: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
2110: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2120: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
2130: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
2140: 54 41 42 4c 45 20 63 6f 75 6e 74 65 72 28 0a 20  TABLE counter(. 
2150: 20 20 20 20 20 69 20 43 48 45 43 4b 20 28 69 3c       i CHECK (i<
2160: 35 29 2c 20 0a 20 20 20 20 20 20 75 20 43 48 45  5), .      u CHE
2170: 43 4b 20 28 75 3c 31 30 29 0a 20 20 20 20 29 3b  CK (u<10).    );
2180: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2190: 20 63 6f 75 6e 74 65 72 20 56 41 4c 55 45 53 28   counter VALUES(
21a0: 30 2c 20 30 29 3b 0a 20 20 20 20 43 52 45 41 54  0, 0);.    CREAT
21b0: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 41 46  E TRIGGER tr1 AF
21c0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
21d0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
21e0: 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20  ATE counter SET 
21f0: 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20 45 4e 44  i = i+1;.    END
2200: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
2210: 47 47 45 52 20 74 72 32 20 41 46 54 45 52 20 55  GGER tr2 AFTER U
2220: 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47 49  PDATE ON t1 BEGI
2230: 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 63  N.      UPDATE c
2240: 6f 75 6e 74 65 72 20 53 45 54 20 75 20 3d 20 75  ounter SET u = u
2250: 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  +1;.    END;.  }
2260: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
2270: 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74  ECT * FROM count
2280: 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a 0a 64 6f  er }.} {0 0}..do
2290: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
22a0: 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a 20 20 50  ger1-3.1.2 {.  P
22b0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
22c0: 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a   = 10;.  BEGIN;.
22d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
22e0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
22f0: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2300: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2310: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e  t1 VALUES(2, ran
2320: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2340: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61 6e  t1 VALUES(3, ran
2350: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2360: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2370: 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20 7b 33 20  M counter;.} {3 
2380: 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  0}.do_catchsql_t
2390: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31 2e 33  est pager1-3.1.3
23a0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
23b0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 33  TO t1 SELECT a+3
23c0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
23d0: 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 31 20  0) FROM t1.} {1 
23e0: 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  {constraint fail
23f0: 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ed}}.do_execsql_
2400: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 34 20  test pager1-3.4 
2410: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
2420: 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20 30 7d 0a  counter } {3 0}.
2430: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2440: 70 61 67 65 72 31 2d 33 2e 35 20 7b 20 53 45 4c  pager1-3.5 { SEL
2450: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 7d 20  ECT a FROM t1 } 
2460: 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78 65 63 73  {1 2 3}.do_execs
2470: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2480: 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d  .6 { COMMIT } {}
2490: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71  ..foreach {tn sq
24a0: 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20 20 7b 20  l tcl} {.  7  { 
24b0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
24c0: 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50 52  us = NORMAL ; PR
24d0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20  AGMA temp_store 
24e0: 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74 65 73 74  = 0 } {.    test
24f0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
2500: 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72  1.    tv devchar
2510: 20 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20 7d   safe_append.  }
2520: 0a 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 73  .  8  { PRAGMA s
2530: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52  ynchronous = NOR
2540: 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20 74 65 6d  MAL ; PRAGMA tem
2550: 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d 20 7b 0a  p_store = 2 } {.
2560: 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d      testvfs tv -
2570: 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76  default 1.    tv
2580: 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e 74   devchar sequent
2590: 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20 7b 20 50  ial.  }.  9  { P
25a0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
25b0: 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20 7d 0a 20  s = FULL } { }. 
25c0: 20 31 30 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   10 { PRAGMA syn
25d0: 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41  chronous = NORMA
25e0: 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20 7b 20 50  L } { }.  11 { P
25f0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
2600: 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d 0a 20 20  s = OFF } { }.  
2610: 31 32 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63  12 { PRAGMA sync
2620: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 3b  hronous = FULL ;
2630: 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e   PRAGMA fullfsyn
2640: 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20 20 31 33  c = 1 } { }.  13
2650: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2660: 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b  onous = FULL } {
2670: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
2680: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74  -default 1.    t
2690: 76 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e  v devchar sequen
26a0: 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34 20 7b 20  tial.  }.  14 { 
26b0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
26c0: 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 20  ode = EXCLUSIVE 
26d0: 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20 20 64 6f  } {.  }.} {.  do
26e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24  _test pager1-3.$
26f0: 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76 61 6c 20  tn.1 {.    eval 
2700: 24 74 63 6c 0a 20 20 20 20 66 61 75 6c 74 73 69  $tcl.    faultsi
2710: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
2720: 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20  pen.    db func 
2730: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
2740: 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 73  g.    execsql $s
2750: 71 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  ql.    execsql {
2760: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
2770: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20  to_vacuum = 2;. 
2780: 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
2790: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
27a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
27b0: 7a 28 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d  z(x INTEGER PRIM
27c0: 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
27d0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
27e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
27f0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73  VALUES(NULL, a_s
2800: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
2810: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2820: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2830: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2840: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20 32  OM z;     --   2
2850: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2860: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2870: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2880: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
2890: 20 20 20 34 0a 20 20 20 20 20 20 20 20 49 4e 53     4.        INS
28a0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
28b0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
28c0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
28d0: 20 20 2d 2d 20 20 20 38 0a 20 20 20 20 20 20 20    --   8.       
28e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
28f0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2900: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2910: 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a 20 20 20  ;     --  16.   
2920: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2930: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2940: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2950: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 33 32  OM z;     --  32
2960: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2970: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2980: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2990: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
29a0: 20 20 36 34 0a 20 20 20 20 20 20 20 20 49 4e 53    64.        INS
29b0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
29c0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
29d0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
29e0: 20 20 2d 2d 20 31 32 38 0a 20 20 20 20 20 20 20    -- 128.       
29f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
2a00: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2a10: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2a20: 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a 20 20 20  ;     -- 256.   
2a30: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
2a40: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
2a50: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2a60: 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20 20 64 6f  m }.  } {2}.  do
2a70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
2a80: 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20 7b 0a 20  ger1-3.$tn.2 {. 
2a90: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
2aa0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56 41  INSERT INTO z VA
2ab0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72  LUES(NULL, a_str
2ac0: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20  ing(800));.     
2ad0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56   INSERT INTO z V
2ae0: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74  ALUES(NULL, a_st
2af0: 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20  ring(800));.    
2b00: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
2b10: 0a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  .        UPDATE 
2b20: 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c 4c 20 57  z SET y = NULL W
2b30: 48 45 52 45 20 78 3e 32 35 36 3b 0a 20 20 20 20  HERE x>256;.    
2b40: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65      PRAGMA incre
2b50: 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20  mental_vacuum;. 
2b60: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f         SELECT co
2b70: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 20 57 48  unt(*) FROM z WH
2b80: 45 52 45 20 78 20 3c 20 31 30 30 3b 0a 20 20 20  ERE x < 100;.   
2b90: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
2ba0: 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ne;.    COMMIT;.
2bb0: 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64 6f 5f 65    } {99}..  do_e
2bc0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
2bd0: 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  r1-3.$tn.3 {.   
2be0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41   BEGIN;.      SA
2bf0: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
2c00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2c10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2c20: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
2c30: 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  e;.    COMMIT;. 
2c40: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2c50: 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 7d 20 7b  *) FROM z;.  } {
2c60: 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73  258}..  do_execs
2c70: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2c80: 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 53 41 56  .$tn.4 {.    SAV
2c90: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
2ca0: 20 20 55 50 44 41 54 45 20 7a 20 53 45 54 20 79    UPDATE z SET y
2cb0: 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20 52 4f 4c   = y||x;.    ROL
2cc0: 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
2cd0: 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71  } {}.  do_execsq
2ce0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2cf0: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53 45 4c 45  $tn.5 {.    SELE
2d00: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2d10: 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20   z;.    RELEASE 
2d20: 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  one;.    PRAGMA 
2d30: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
2d40: 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d 0a 0a 20  .  } {258 ok}.. 
2d50: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2d60: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 36 20   pager1-3.$tn.6 
2d70: 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  {.    SAVEPOINT 
2d80: 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45 41 53 45  one;.    RELEASE
2d90: 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 0a 20 20   one;.  } {}..  
2da0: 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68  db close.  catch
2db0: 20 7b 20 74 76 20 64 65 6c 65 74 65 20 7d 0a 7d   { tv delete }.}
2dc0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 48  ------------.# H
2e10: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
2e20: 61 63 6b 20 72 65 6c 61 74 65 64 20 74 65 73 74  ack related test
2e30: 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65   cases..#.# page
2e40: 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73 74 20 74  r1.4.1.*: Test t
2e50: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f  hat the pager mo
2e60: 64 75 6c 65 20 64 65 6c 65 74 65 73 20 76 65 72  dule deletes ver
2e70: 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c 69 64 0a  y small invalid.
2e80: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
2e90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23  journal files..#
2ea0: 0a 23 20 70 61 67 65 72 31 2e 34 2e 32 2e 2a 3a  .# pager1.4.2.*:
2eb0: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
2ec0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2ed0: 20 70 6f 69 6e 74 65 72 20 61 74 20 74 68 65 20   pointer at the 
2ee0: 65 6e 64 20 6f 66 20 61 0a 23 20 20 20 20 20 20  end of a.#      
2ef0: 20 20 20 20 20 20 20 20 20 68 6f 74 2d 6a 6f 75           hot-jou
2f00: 72 6e 61 6c 20 66 69 6c 65 20 61 70 70 65 61 72  rnal file appear
2f10: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 20  s to be corrupt 
2f20: 28 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e  (checksum does n
2f30: 6f 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ot.#            
2f40: 20 20 20 63 6f 6d 70 75 74 65 29 20 74 68 65 20     compute) the 
2f50: 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e  associated journ
2f60: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
2f70: 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20 20 20 20  k (and no.#     
2f80: 20 20 20 20 20 20 20 20 20 20 78 41 63 63 65 73            xAcces
2f90: 73 28 29 20 63 61 6c 6c 20 74 6f 20 63 68 65 63  s() call to chec
2fa0: 6b 20 66 6f 72 20 74 68 65 20 70 72 65 73 65 6e  k for the presen
2fb0: 63 65 20 6f 66 20 61 6e 79 20 6d 61 73 74 65 72  ce of any master
2fc0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
2fd0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
2fe0: 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20 70 61 67  s made)..#.# pag
2ff0: 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65 73 74 20  er1.4.3.*: Test 
3000: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
3010: 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  s of a hot-journ
3020: 61 6c 20 61 72 65 20 69 67 6e 6f 72 65 64 20 69  al are ignored i
3030: 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  f the.#         
3040: 20 20 20 20 20 20 70 61 67 65 2d 73 69 7a 65 20        page-size 
3050: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
3060: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
3070: 61 64 65 72 20 61 70 70 65 61 72 20 74 6f 0a 23  ader appear to.#
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3090: 65 20 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20 6c  e invalid (too l
30a0: 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61 6c 6c 20  arge, too small 
30b0: 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65 72 20 6f  or not a power o
30c0: 66 20 32 29 2e 0a 23 0a 23 20 70 61 67 65 72 31  f 2)..#.# pager1
30d0: 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20 68 6f 74  .4.4.*: Test hot
30e0: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
30f0: 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  k of journal fil
3100: 65 20 77 69 74 68 20 61 20 6d 61 73 74 65 72 0a  e with a master.
3110: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3120: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
3130: 67 65 6e 65 72 61 74 65 64 20 69 6e 20 76 61 72  generated in var
3140: 69 6f 75 73 20 22 50 52 41 47 4d 41 20 73 79 6e  ious "PRAGMA syn
3150: 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20 20 20 20  chronous".#     
3160: 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 73 2e            modes.
3170: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 35 2e  .#.# pager1.4.5.
3180: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 68 6f 74  *: Test that hot
3190: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
31a0: 6b 20 73 74 6f 70 73 20 69 66 20 69 74 20 65 6e  k stops if it en
31b0: 63 6f 75 6e 74 65 72 73 20 61 0a 23 20 20 20 20  counters a.#    
31c0: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
31d0: 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72 20 77 68  al-record for wh
31e0: 69 63 68 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ich the checksum
31f0: 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65   fails..#.# page
3200: 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73 74 20 74  r1.4.6.*: Test t
3210: 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67  hat when rolling
3220: 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
3230: 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nal that contain
3240: 73 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  s a.#           
3250: 20 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e      master journ
3260: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20  al pointer, the 
3270: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
3280: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 0a 23  ile is deleted.#
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
32a0: 66 74 65 72 20 61 6c 6c 20 74 68 65 20 68 6f 74  fter all the hot
32b0: 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61 74 20 72  -journals that r
32c0: 65 66 65 72 20 74 6f 20 69 74 20 61 72 65 20 64  efer to it are d
32d0: 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70 61 67 65  eleted..#.# page
32e0: 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73 74 20 74  r1.4.7.*: Test t
32f0: 68 61 74 20 69 66 20 61 20 68 6f 74 2d 6a 6f 75  hat if a hot-jou
3300: 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
3310: 20 62 75 74 20 61 20 63 6c 69 65 6e 74 20 63 61   but a client ca
3320: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
3330: 20 20 6f 70 65 6e 20 69 74 20 66 6f 72 20 72 65    open it for re
3340: 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74 68 65 20  ading only, the 
3350: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
3360: 62 65 20 61 63 63 65 73 73 65 64 20 61 6e 64 0a  be accessed and.
3370: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3380: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
3390: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 20 0a  is returned..# .
33a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
33b0: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
33c0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
33d0: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  pen.  execsql { 
33e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
33f0: 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20 20 20 49  E x(y, z);.    I
3400: 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41 4c  NSERT INTO x VAL
3410: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
3420: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65   set fd [open te
3430: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d  st.db-journal w]
3440: 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69  .  puts -nonewli
3450: 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f 77 6f 72  ne $fd "hellowor
3460: 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  ld".  close $fd.
3470: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
3480: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
3490: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {1}.do_test page
34a0: 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78 65 63 73  r1.4.1.2 { execs
34b0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
34c0: 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32 7d 0a 64  OM x } } {1 2}.d
34d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
34e0: 31 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  1.3 { file exist
34f0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
3500: 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65 74 20 75  l } {0}..# Set u
3510: 70 20 61 20 5b 74 65 73 74 76 66 73 5d 20 74 6f  p a [testvfs] to
3520: 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   snapshot the fi
3530: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
3540: 65 66 6f 72 65 20 53 51 4c 69 74 65 0a 23 20 64  efore SQLite.# d
3550: 65 6c 65 74 65 73 20 74 68 65 20 6d 61 73 74 65  eletes the maste
3560: 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 63 6f 6d  r-journal to com
3570: 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  mit a multi-file
3580: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
3590: 23 20 49 6e 20 73 75 62 73 65 71 75 65 6e 74 20  # In subsequent 
35a0: 74 65 73 74 20 63 61 73 65 73 2c 20 69 6e 76 6f  test cases, invo
35b0: 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69 6d 5f 72  king [faultsim_r
35c0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
35d0: 6e 5d 20 73 65 74 73 0a 23 20 75 70 20 74 68 65  n] sets.# up the
35e0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
35f0: 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64 61 74 61  contain two data
3600: 62 61 73 65 73 2c 20 74 77 6f 20 68 6f 74 2d 6a  bases, two hot-j
3610: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 6e 64  ournal files and
3620: 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72  .# a master-jour
3630: 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  nal..#.do_test p
3640: 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b 0a 20 20  ager1.4.2.1 {.  
3650: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3660: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3670: 66 73 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  fs filter xDelet
3680: 65 0a 20 20 74 73 74 76 66 73 20 73 63 72 69 70  e.  tstvfs scrip
3690: 74 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63  t xDeleteCallbac
36a0: 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c 65 74 65  k.  proc xDelete
36b0: 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64  Callback {method
36c0: 20 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20   file args} {.  
36d0: 20 20 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65    set file [file
36e0: 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20   tail $file].   
36f0: 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 6d 61   if { [string ma
3700: 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c 65 5d 20  tch *mj* $file] 
3710: 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  } { faultsim_sav
3720: 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  e }.  }.  faults
3730: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
3740: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
3750: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
3760: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3770: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
3780: 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50  2' AS aux;.    P
3790: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
37a0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
37b0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 63 61 63   PRAGMA main.cac
37c0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37d0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 63 61 63    PRAGMA aux.cac
37e0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3800: 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  1(a UNIQUE, b UN
3810: 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54  IQUE);.    CREAT
3820: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61  E TABLE aux.t2(a
3830: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
3840: 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  E);.    INSERT I
3850: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
3860: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
3870: 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20  tring(300));.   
3880: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3890: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38a0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38b0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
38c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
38d0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38e0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
3900: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3910: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3920: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
3930: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3940: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
3950: 67 28 32 30 31 29 2c 20 61 5f 73 74 72 69 6e 67  g(201), a_string
3960: 28 33 30 31 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (301) FROM t1;. 
3970: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3980: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
3990: 69 6e 67 28 32 30 32 29 2c 20 61 5f 73 74 72 69  ing(202), a_stri
39a0: 6e 67 28 33 30 32 29 20 46 52 4f 4d 20 74 31 3b  ng(302) FROM t1;
39b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
39c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
39d0: 74 72 69 6e 67 28 32 30 33 29 2c 20 61 5f 73 74  tring(203), a_st
39e0: 72 69 6e 67 28 33 30 33 29 20 46 52 4f 4d 20 74  ring(303) FROM t
39f0: 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  1;.      INSERT 
3a00: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
3a10: 5f 73 74 72 69 6e 67 28 32 30 34 29 2c 20 61 5f  _string(204), a_
3a20: 73 74 72 69 6e 67 28 33 30 34 29 20 46 52 4f 4d  string(304) FROM
3a30: 20 74 31 3b 0a 20 20 20 20 20 20 52 45 50 4c 41   t1;.      REPLA
3a40: 43 45 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  CE INTO t2 SELEC
3a50: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
3a60: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64   COMMIT;.  }.  d
3a70: 62 20 63 6c 6f 73 65 0a 20 20 74 73 74 76 66 73  b close.  tstvfs
3a80: 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 0a 69 66   delete.} {}..if
3a90: 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
3aa0: 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69  m(platform)!="wi
3ab0: 6e 64 6f 77 73 22 7d 20 7b 0a 64 6f 5f 74 65 73  ndows"} {.do_tes
3ac0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 32 20 7b  t pager1.4.2.2 {
3ad0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
3ae0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
3af0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3b00: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3b10: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3b20: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3b30: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d  ck;.  }.} {4 ok}
3b40: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
3b50: 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75 6c 74 73  4.2.3 {.  faults
3b60: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
3b70: 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61 63 68 20  eopen.  foreach 
3b80: 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2d  f [glob test.db-
3b90: 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65  mj*] { forcedele
3ba0: 74 65 20 24 66 20 7d 0a 20 20 65 78 65 63 73 71  te $f }.  execsq
3bb0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  l {.    SELECT c
3bc0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
3bd0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
3be0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
3bf0: 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f 5f 74 65  .} {64 ok}.do_te
3c00: 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 34 20  st pager1.4.2.4 
3c10: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
3c20: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
3c30: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
3c40: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
3c50: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
3c60: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d  est.db-journal]-
3c70: 32 30 5d 20 31 32 33 34 35 36 0a 20 20 65 78 65  20] 123456.  exe
3c80: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3c90: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3ca0: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3cb0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3cc0: 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f    }.} {4 ok}.do_
3cd0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3ce0: 35 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  5 {.  faultsim_r
3cf0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3d00: 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  n.  hexio_write 
3d10: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
3d20: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
3d30: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3d40: 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20 66  ]-20] 123456.  f
3d50: 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 74  oreach f [glob t
3d60: 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f  est.db-mj*] { fo
3d70: 72 63 65 64 65 6c 65 74 65 20 24 66 20 7d 0a 20  rcedelete $f }. 
3d80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3d90: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3da0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3db0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3dc0: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d  ck;.  }.} {4 ok}
3dd0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  .}..do_test page
3de0: 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20 74 65 73  r1.4.3.1 {.  tes
3df0: 74 76 66 73 20 74 73 74 76 66 73 20 2d 64 65 66  tvfs tstvfs -def
3e00: 61 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73 20  ault 1.  tstvfs 
3e10: 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74  filter xSync.  t
3e20: 73 74 76 66 73 20 73 63 72 69 70 74 20 78 53 79  stvfs script xSy
3e30: 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f  ncCallback.  pro
3e40: 63 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 20  c xSyncCallback 
3e50: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72 67  {method file arg
3e60: 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c  s} {.    set fil
3e70: 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  e [file tail $fi
3e80: 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 30 3d 3d  le].    if { 0==
3e90: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a  [string match *j
3ea0: 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d 20 7d 20  ournal $file] } 
3eb0: 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20  { faultsim_save 
3ec0: 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  }.  }.  faultsim
3ed0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
3ee0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
3ef0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
3f00: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
3f10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3f20: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
3f30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3f40: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
3f50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3f60: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
3f70: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  }.  db close.  t
3f80: 73 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b  stvfs delete.} {
3f90: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6f  }..foreach {tn o
3fa0: 66 73 74 20 76 61 6c 75 65 20 72 65 73 75 6c 74  fst value result
3fb0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 32 20  } {.          2 
3fc0: 20 20 32 30 20 20 20 20 33 31 20 20 20 20 20 20    20    31      
3fd0: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20   {1 2 3 4}.     
3fe0: 20 20 20 20 20 33 20 20 20 32 30 20 20 20 20 33       3   20    3
3ff0: 32 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  2       {1 2 3 4
4000: 7d 0a 20 20 20 20 20 20 20 20 20 20 34 20 20 20  }.          4   
4010: 32 30 20 20 20 20 33 33 20 20 20 20 20 20 20 7b  20    33       {
4020: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4030: 20 20 20 35 20 20 20 32 30 20 20 20 20 36 35 35     5   20    655
4040: 33 36 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  36    {1 2 3 4}.
4050: 20 20 20 20 20 20 20 20 20 20 36 20 20 20 32 30            6   20
4060: 20 20 20 20 31 33 31 30 37 32 20 20 20 7b 31 20      131072   {1 
4070: 32 20 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20  2 3 4}..        
4080: 20 20 37 20 20 20 32 34 20 20 20 20 35 31 31 20    7   24    511 
4090: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20       {1 2 3 4}. 
40a0: 20 20 20 20 20 20 20 20 20 38 20 20 20 32 34 20           8   24 
40b0: 20 20 20 35 31 33 20 20 20 20 20 20 7b 31 20 32     513      {1 2
40c0: 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20   3 4}.          
40d0: 39 20 20 20 32 34 20 20 20 20 31 33 31 30 37 32  9   24    131072
40e0: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20     {1 2 3 4}..  
40f0: 20 20 20 20 20 20 20 31 30 20 20 20 33 32 20 20         10   32  
4100: 20 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 7d    65536    {1 2}
4110: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  .} {.  do_test p
4120: 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e 20 7b 0a  ager1.4.3.$tn {.
4130: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
4140: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
4150: 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20      hexio_write 
4160: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
4170: 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74 20 25 2e  $ofst [format %.
4180: 38 78 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 65  8x $value].    e
4190: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
41a0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
41b0: 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20 63 6c 6f  $result.}.db clo
41c0: 73 65 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56  se..# Set up a V
41d0: 46 53 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  FS that snapshot
41e0: 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
41f0: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 61 20  m just before a 
4200: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 23  master journal.#
4210: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
4220: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75 6c   to commit a mul
4230: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
4240: 69 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c 6c  ion. Specificall
4250: 79 2c 20 74 68 65 0a 23 20 66 69 6c 65 2d 73 79  y, the.# file-sy
4260: 73 74 65 6d 20 69 73 20 73 61 76 65 64 20 6a 75  stem is saved ju
4270: 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 78 44  st before the xD
4280: 65 6c 65 74 65 28 29 20 63 61 6c 6c 20 74 6f 20  elete() call to 
4290: 72 65 6d 6f 76 65 20 74 68 65 20 0a 23 20 6d 61  remove the .# ma
42a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
42b0: 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d  e from the file-
42c0: 73 79 73 74 65 6d 2e 0a 23 0a 74 65 73 74 76 66  system..#.testvf
42d0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
42e0: 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f  tv script copy_o
42f0: 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73 65 74 20  n_mj_delete.set 
4300: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65  ::mj_filename_le
4310: 6e 67 74 68 20 30 0a 70 72 6f 63 20 63 6f 70 79  ngth 0.proc copy
4320: 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d  _on_mj_delete {m
4330: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
4340: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
4350: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20  ring match *mj* 
4360: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
4370: 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73  name]]} { .    s
4380: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
4390: 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67 20  _length [string 
43a0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65  length $filename
43b0: 5d 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73  ].    faultsim_s
43c0: 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave .  }.  retur
43d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 73  n SQLITE_OK.}..s
43e0: 65 74 20 70 77 64 20 5b 70 77 64 5d 0a 66 6f 72  et pwd [pwd].for
43f0: 65 61 63 68 20 7b 74 6e 31 20 74 63 6c 7d 20 7b  each {tn1 tcl} {
4400: 0a 20 20 31 20 7b 20 73 65 74 20 70 72 65 66 69  .  1 { set prefi
4410: 78 20 22 74 65 73 74 2e 64 62 22 20 7d 0a 20 20  x "test.db" }.  
4420: 32 20 7b 20 0a 20 20 20 20 23 20 54 68 69 73 20  2 { .    # This 
4430: 74 65 73 74 20 64 65 70 65 6e 64 73 20 6f 6e 20  test depends on 
4440: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  the underlying V
4450: 46 53 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f  FS being able to
4460: 20 6f 70 65 6e 20 70 61 74 68 73 0a 20 20 20 20   open paths.    
4470: 23 20 35 31 32 20 62 79 74 65 73 20 69 6e 20 6c  # 512 bytes in l
4480: 65 6e 67 74 68 2e 20 54 68 65 20 69 64 65 61 20  ength. The idea 
4490: 69 73 20 74 6f 20 63 72 65 61 74 65 20 61 20 68  is to create a h
44a0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
44b0: 74 68 61 74 0a 20 20 20 20 23 20 63 6f 6e 74 61  that.    # conta
44c0: 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75  ins a master-jou
44d0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20  rnal pointer so 
44e0: 6c 61 72 67 65 20 74 68 61 74 20 69 74 20 63 6f  large that it co
44f0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  uld contain.    
4500: 23 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 72  # a valid page r
4510: 65 63 6f 72 64 20 28 69 66 20 74 68 65 20 66 69  ecord (if the fi
4520: 6c 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  le page-size is 
4530: 35 31 32 20 62 79 74 65 73 29 2e 20 53 6f 20 61  512 bytes). So a
4540: 73 20 74 6f 0a 20 20 20 20 23 20 6d 61 6b 65 20  s to.    # make 
4550: 73 75 72 65 20 53 51 4c 69 74 65 20 64 6f 65 73  sure SQLite does
4560: 6e 27 74 20 67 65 74 20 63 6f 6e 66 75 73 65 64  n't get confused
4570: 20 62 79 20 74 68 69 73 2e 0a 20 20 20 20 23 0a   by this..    #.
4580: 20 20 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67      set nPadding
4590: 20 5b 65 78 70 72 20 35 31 31 20 2d 20 24 3a 3a   [expr 511 - $::
45a0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67  mj_filename_leng
45b0: 74 68 5d 0a 20 20 20 20 69 66 20 7b 24 74 63 6c  th].    if {$tcl
45c0: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
45d0: 72 6d 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d 20  rm)=="windows"} 
45e0: 7b 0a 20 20 20 20 20 20 23 20 54 42 44 20 6e 65  {.      # TBD ne
45f0: 65 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  ed to figure out
4600: 20 68 6f 77 20 74 6f 20 64 6f 20 74 68 69 73 20   how to do this 
4610: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 57 69  correctly for Wi
4620: 6e 64 6f 77 73 21 21 21 0a 20 20 20 20 20 20 73  ndows!!!.      s
4630: 65 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70  et nPadding [exp
4640: 72 20 32 35 35 20 2d 20 24 3a 3a 6d 6a 5f 66 69  r 255 - $::mj_fi
4650: 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20  lename_length]. 
4660: 20 20 20 7d 0a 0a 20 20 20 20 23 20 57 65 20 63     }..    # We c
4670: 61 6e 6e 6f 74 20 6a 75 73 74 20 63 72 65 61 74  annot just creat
4680: 65 20 61 20 72 65 61 6c 6c 79 20 6c 6f 6e 67 20  e a really long 
4690: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
46a0: 6d 65 20 74 6f 20 6f 70 65 6e 2c 20 61 73 0a 20  me to open, as. 
46b0: 20 20 20 23 20 4c 69 6e 75 78 20 6c 69 6d 69 74     # Linux limit
46c0: 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70 6f  s a single compo
46d0: 6e 65 6e 74 20 6f 66 20 61 20 70 61 74 68 20 74  nent of a path t
46e0: 6f 20 32 35 35 20 62 79 74 65 73 20 62 79 20 64  o 255 bytes by d
46f0: 65 66 61 75 6c 74 0a 20 20 20 20 23 20 28 61 6e  efault.    # (an
4700: 64 20 70 72 65 73 75 6d 61 62 6c 79 20 6f 74 68  d presumably oth
4710: 65 72 20 73 79 73 74 65 6d 73 20 68 61 76 65 20  er systems have 
4720: 6c 69 6d 69 74 73 20 74 6f 6f 29 2e 20 53 6f 20  limits too). So 
4730: 63 72 65 61 74 65 20 61 20 64 69 72 65 63 74 6f  create a directo
4740: 72 79 0a 20 20 20 20 23 20 68 69 65 72 61 72 63  ry.    # hierarc
4750: 68 79 20 74 6f 20 77 6f 72 6b 20 69 6e 2e 0a 20  hy to work in.. 
4760: 20 20 20 23 0a 20 20 20 20 73 65 74 20 64 69 72     #.    set dir
4770: 6e 61 6d 65 20 22 64 31 32 33 34 35 36 37 38 39  name "d123456789
4780: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
4790: 36 37 38 39 30 2f 22 0a 20 20 20 20 73 65 74 20  67890/".    set 
47a0: 6e 44 69 72 20 5b 65 78 70 72 20 24 6e 50 61 64  nDir [expr $nPad
47b0: 64 69 6e 67 20 2f 20 33 32 5d 0a 20 20 20 20 69  ding / 32].    i
47c0: 66 20 7b 20 24 6e 44 69 72 20 7d 20 7b 0a 20 20  f { $nDir } {.  
47d0: 20 20 20 20 73 65 74 20 70 20 5b 73 74 72 69 6e      set p [strin
47e0: 67 20 72 65 70 65 61 74 20 24 64 69 72 6e 61 6d  g repeat $dirnam
47f0: 65 20 24 6e 44 69 72 5d 0a 20 20 20 20 20 20 66  e $nDir].      f
4800: 69 6c 65 20 6d 6b 64 69 72 20 24 70 0a 20 20 20  ile mkdir $p.   
4810: 20 20 20 63 64 20 24 70 0a 20 20 20 20 7d 0a 0a     cd $p.    }..
4820: 20 20 20 20 73 65 74 20 70 61 64 64 69 6e 67 20      set padding 
4830: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78  [string repeat x
4840: 20 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67   [expr $nPadding
4850: 20 25 33 32 5d 5d 0a 20 20 20 20 73 65 74 20 70   %32]].    set p
4860: 72 65 66 69 78 20 22 74 65 73 74 2e 64 62 24 7b  refix "test.db${
4870: 70 61 64 64 69 6e 67 7d 22 0a 20 20 7d 0a 7d 20  padding}".  }.} 
4880: 7b 0a 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20  {.  eval $tcl.  
4890: 66 6f 72 65 61 63 68 20 7b 74 6e 32 20 73 71 6c  foreach {tn2 sql
48a0: 7d 20 7b 0a 20 20 20 20 6f 20 7b 20 0a 20 20 20  } {.    o { .   
48b0: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73     PRAGMA main.s
48c0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a  ynchronous=OFF;.
48d0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
48e0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46  .synchronous=OFF
48f0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
4900: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
4910: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LETE;.    }.    
4920: 6f 35 31 32 20 7b 20 0a 20 20 20 20 20 20 50 52  o512 { .      PR
4930: 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72  AGMA main.synchr
4940: 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20  onous=OFF;.     
4950: 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63   PRAGMA aux.sync
4960: 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20  hronous=OFF;.   
4970: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70     PRAGMA main.p
4980: 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a  age_size = 512;.
4990: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
49a0: 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32  .page_size = 512
49b0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
49c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
49d0: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LETE;.    }.    
49e0: 6e 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d  n { .      PRAGM
49f0: 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f  A main.synchrono
4a00: 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  us=NORMAL;.     
4a10: 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63   PRAGMA aux.sync
4a20: 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a  hronous=NORMAL;.
4a30: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
4a40: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
4a50: 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 20  TE;.    }.    f 
4a60: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
4a70: 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73  main.synchronous
4a80: 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41  =FULL;.      PRA
4a90: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
4aa0: 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ous=FULL;.      
4ab0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
4ac0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
4ad0: 20 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 73    }.  } {..    s
4ae0: 65 74 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24 7b  et tn "${tn1}.${
4af0: 74 6e 32 7d 22 0a 20 20 0a 20 20 20 20 23 20 53  tn2}".  .    # S
4b00: 65 74 20 75 70 20 61 20 63 6f 6e 6e 65 63 74 69  et up a connecti
4b10: 6f 6e 20 74 6f 20 68 61 76 65 20 74 77 6f 20 64  on to have two d
4b20: 61 74 61 62 61 73 65 73 2c 20 74 65 73 74 2e 64  atabases, test.d
4b30: 62 20 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20 20  b (main) and .  
4b40: 20 20 23 20 74 65 73 74 2e 64 62 32 20 28 61 75    # test.db2 (au
4b50: 78 29 2e 20 54 68 65 6e 20 72 75 6e 20 61 20 6d  x). Then run a m
4b60: 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
4b70: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20 54  ction on them. T
4b80: 68 65 0a 20 20 20 20 23 20 56 46 53 20 77 69 6c  he.    # VFS wil
4b90: 6c 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66  l snapshot the f
4ba0: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20  ile-system just 
4bb0: 62 65 66 6f 72 65 20 74 68 65 20 6d 61 73 74 65  before the maste
4bc0: 72 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23 20  r-journal.    # 
4bd0: 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
4be0: 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
4bf0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 23  ansaction..    #
4c00: 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 78  .    tv filter x
4c10: 44 65 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74 65  Delete.    do_te
4c20: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
4c30: 6e 2e 31 20 7b 0a 20 20 20 20 20 20 66 61 75 6c  n.1 {.      faul
4c40: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
4c50: 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20  reopen $prefix. 
4c60: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20       execsql ". 
4c70: 20 20 20 20 20 20 20 41 54 54 41 43 48 20 27 24         ATTACH '$
4c80: 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75  {prefix}2' AS au
4c90: 78 3b 0a 20 20 20 20 20 20 20 20 24 73 71 6c 0a  x;.        $sql.
4ca0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
4cb0: 41 42 4c 45 20 61 28 78 29 3b 0a 20 20 20 20 20  ABLE a(x);.     
4cc0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4cd0: 61 75 78 2e 62 28 78 29 3b 0a 20 20 20 20 20 20  aux.b(x);.      
4ce0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20    INSERT INTO a 
4cf0: 56 41 4c 55 45 53 28 27 64 6f 75 62 6c 65 2d 79  VALUES('double-y
4d00: 6f 75 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  ou');.        IN
4d10: 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55  SERT INTO a VALU
4d20: 45 53 28 27 77 68 79 27 29 3b 0a 20 20 20 20 20  ES('why');.     
4d30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
4d40: 20 56 41 4c 55 45 53 28 27 7a 65 64 27 29 3b 0a   VALUES('zed');.
4d50: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4d60: 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 77 6f  NTO b VALUES('wo
4d70: 6e 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  n');.        INS
4d80: 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45  ERT INTO b VALUE
4d90: 53 28 27 74 6f 6f 27 29 3b 0a 20 20 20 20 20 20  S('too');.      
4da0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
4db0: 56 41 4c 55 45 53 28 27 66 72 65 65 27 29 3b 0a  VALUES('free');.
4dc0: 20 20 20 20 20 20 22 0a 20 20 20 20 20 20 65 78        ".      ex
4dd0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20  ecsql {.        
4de0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 20  BEGIN;.         
4df0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 53   INSERT INTO a S
4e00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 20 57  ELECT * FROM b W
4e10: 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20  HERE rowid<=3;. 
4e20: 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20           INSERT 
4e30: 49 4e 54 4f 20 62 20 53 45 4c 45 43 54 20 2a 20  INTO b SELECT * 
4e40: 46 52 4f 4d 20 61 20 57 48 45 52 45 20 72 6f 77  FROM a WHERE row
4e50: 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 43  id<=3;.        C
4e60: 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20  OMMIT;.      }. 
4e70: 20 20 20 7d 20 7b 7d 0a 20 20 20 20 74 76 20 66     } {}.    tv f
4e80: 69 6c 74 65 72 20 7b 7d 0a 20 20 20 20 0a 20 20  ilter {}.    .  
4e90: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74    # Check that t
4ea0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
4eb0: 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 73 75 63  as committed suc
4ec0: 63 65 73 73 66 75 6c 6c 79 2e 0a 20 20 20 20 23  cessfully..    #
4ed0: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
4ee0: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
4ef0: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 53 45  $tn.2 {.      SE
4f00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20  LECT * FROM a.  
4f10: 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20    } {double-you 
4f20: 77 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20  why zed won too 
4f30: 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65  free}.    do_exe
4f40: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
4f50: 2d 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  -4.4.$tn.3 {.   
4f60: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4f70: 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f   b.    } {won to
4f80: 6f 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f  o free double-yo
4f90: 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 0a  u why zed}.    .
4fa0: 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74 68      # Restore th
4fb0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e  e file-system an
4fc0: 64 20 72 65 6f 70 65 6e 20 74 68 65 20 64 61 74  d reopen the dat
4fd0: 61 62 61 73 65 73 2e 20 43 68 65 63 6b 20 74 68  abases. Check th
4fe0: 61 74 20 69 74 20 6e 6f 77 0a 20 20 20 20 23 20  at it now.    # 
4ff0: 61 70 70 65 61 72 73 20 74 68 61 74 20 74 68 65  appears that the
5000: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
5010: 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 20 28   not committed (
5020: 62 65 63 61 75 73 65 20 74 68 65 20 66 69 6c 65  because the file
5030: 2d 73 79 73 74 65 6d 0a 20 20 20 20 23 20 77 61  -system.    # wa
5040: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68  s restored to th
5050: 65 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  e state where it
5060: 20 68 61 64 20 6e 6f 74 20 62 65 65 6e 29 2e 0a   had not been)..
5070: 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73      #.    do_tes
5080: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
5090: 2e 34 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74  .4 {.      fault
50a0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
50b0: 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20  reopen $prefix. 
50c0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 41 54       execsql "AT
50d0: 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32  TACH '${prefix}2
50e0: 27 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20  ' AS aux".    } 
50f0: 7b 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71  {}.    do_execsq
5100: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  l_test pager1-4.
5110: 34 2e 24 74 6e 2e 35 20 7b 53 45 4c 45 43 54 20  4.$tn.5 {SELECT 
5120: 2a 20 46 52 4f 4d 20 61 7d 20 7b 64 6f 75 62 6c  * FROM a} {doubl
5130: 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20  e-you why zed}. 
5140: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
5150: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5160: 6e 2e 36 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  n.6 {SELECT * FR
5170: 4f 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66  OM b} {won too f
5180: 72 65 65 7d 0a 20 20 20 20 0a 20 20 20 20 23 20  ree}.    .    # 
5190: 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  Restore the file
51a0: 2d 73 79 73 74 65 6d 20 61 67 61 69 6e 2e 20 54  -system again. T
51b0: 68 69 73 20 74 69 6d 65 2c 20 62 65 66 6f 72 65  his time, before
51c0: 20 72 65 6f 70 65 6e 69 6e 67 20 74 68 65 20 64   reopening the d
51d0: 61 74 61 62 61 73 65 73 2c 0a 20 20 20 20 23 20  atabases,.    # 
51e0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
51f0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r-journal file f
5200: 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73  rom the file-sys
5210: 74 65 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70 65  tem. It now appe
5220: 61 72 73 20 74 68 61 74 0a 20 20 20 20 23 20 74  ars that.    # t
5230: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
5240: 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e 6f  as committed (no
5250: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5260: 66 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c 62  file == no rollb
5270: 61 63 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20 20  ack)..    #.    
5280: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  do_test pager1-4
5290: 2e 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 20  .4.$tn.7 {.     
52a0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
52b0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72  e_and_reopen $pr
52c0: 65 66 69 78 0a 20 20 20 20 20 20 66 6f 72 65 61  efix.      forea
52d0: 63 68 20 66 20 5b 67 6c 6f 62 20 24 7b 70 72 65  ch f [glob ${pre
52e0: 66 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63  fix}-mj*] { forc
52f0: 65 64 65 6c 65 74 65 20 24 66 20 7d 0a 20 20 20  edelete $f }.   
5300: 20 20 20 65 78 65 63 73 71 6c 20 22 41 54 54 41     execsql "ATTA
5310: 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32 27 20  CH '${prefix}2' 
5320: 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d  AS aux".    } {}
5330: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
5340: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
5350: 24 74 6e 2e 38 20 7b 0a 20 20 20 20 20 20 53 45  $tn.8 {.      SE
5360: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20  LECT * FROM a.  
5370: 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20    } {double-you 
5380: 77 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20  why zed won too 
5390: 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65  free}.    do_exe
53a0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
53b0: 2d 34 2e 34 2e 24 74 6e 2e 39 20 7b 0a 20 20 20  -4.4.$tn.9 {.   
53c0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
53d0: 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f   b.    } {won to
53e0: 6f 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f  o free double-yo
53f0: 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 7d 0a 0a  u why zed}.  }..
5400: 20 20 63 64 20 24 70 77 64 0a 7d 0a 64 62 20 63    cd $pwd.}.db c
5410: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 66  lose.tv delete.f
5420: 6f 72 63 65 64 65 6c 65 74 65 20 24 64 69 72 6e  orcedelete $dirn
5430: 61 6d 65 0a 0a 0a 23 20 53 65 74 20 75 70 20 61  ame...# Set up a
5440: 20 56 46 53 20 74 6f 20 6d 61 6b 65 20 61 20 63   VFS to make a c
5450: 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  opy of the file-
5460: 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f  system just befo
5470: 72 65 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20  re deleting a.# 
5480: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
5490: 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  commit a transac
54a0: 74 69 6f 6e 2e 20 54 68 65 20 74 72 61 6e 73 61  tion. The transa
54b0: 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65  ction modifies e
54c0: 78 61 63 74 6c 79 0a 23 20 74 77 6f 20 64 61 74  xactly.# two dat
54d0: 61 62 61 73 65 20 70 61 67 65 73 20 28 61 6e 64  abase pages (and
54e0: 20 70 61 67 65 20 31 20 2d 20 74 68 65 20 63 68   page 1 - the ch
54f0: 61 6e 67 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23  ange counter)..#
5500: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
5510: 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72  ault 1.tv sector
5520: 73 69 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69  size 512.tv scri
5530: 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e  pt copy_on_journ
5540: 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c  al_delete.tv fil
5550: 74 65 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63  ter xDelete.proc
5560: 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c   copy_on_journal
5570: 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20  _delete {method 
5580: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
5590: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  .  if {[string m
55a0: 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66  atch *journal $f
55b0: 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73  ilename]} faults
55c0: 69 6d 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72  im_save .  retur
55d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61  n SQLITE_OK.}.fa
55e0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
55f0: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63  d_reopen.do_exec
5600: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5610: 34 2e 35 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  4.5.1 {.  PRAGMA
5620: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
5630: 44 45 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41  DELETE;.  PRAGMA
5640: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
5650: 34 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  4;.  CREATE TABL
5660: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52  E t1(a, b);.  CR
5670: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
5680: 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   b);.  INSERT IN
5690: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 27  TO t1 VALUES('I'
56a0: 2c 20 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52  , 'II');.  INSER
56b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
56c0: 28 27 49 49 49 27 2c 20 27 49 56 27 29 3b 0a 20  ('III', 'IV');. 
56d0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
56e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
56f0: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
5700: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
5710: 45 53 28 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d  ES(3, 4);.  COMM
5720: 49 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74  IT;.} {delete}.t
5730: 76 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43  v filter {}..# C
5740: 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  heck the transac
5750: 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
5760: 65 64 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ed:.#.do_execsql
5770: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5780: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .2 {.  SELECT * 
5790: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
57a0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
57b0: 49 20 49 49 20 31 20 32 20 49 49 49 20 49 56 20  I II 1 2 III IV 
57c0: 33 20 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20  3 4}..# Now try 
57d0: 66 6f 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20  four tests:.#.# 
57e0: 20 70 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52   pager1-4.5.3: R
57f0: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5800: 73 79 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68  system. Check th
5810: 61 74 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  at the whole tra
5820: 6e 73 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20  nsaction .#     
5830: 20 20 20 20 20 20 20 20 20 20 20 69 73 20 72 6f             is ro
5840: 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20  lled back..#.#  
5850: 70 61 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65  pager1-4.5.4: Re
5860: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73  store the file-s
5870: 79 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74  ystem. Corrupt t
5880: 68 65 20 66 69 72 73 74 20 72 65 63 6f 72 64 20  he first record 
5890: 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  in the.#        
58a0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e          journal.
58b0: 20 43 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73   Check the trans
58c0: 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f  action is not ro
58d0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20  lled back..#.#  
58e0: 70 61 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65  pager1-4.5.5: Re
58f0: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73  store the file-s
5900: 79 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74  ystem. Corrupt t
5910: 68 65 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64  he second record
5920: 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20   in the.#       
5930: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
5940: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  . Check that the
5950: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
5960: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
5970: 20 69 73 20 0a 23 20 20 20 20 20 20 20 20 20 20   is .#          
5980: 20 20 20 20 20 20 70 6c 61 79 65 64 20 62 61 63        played bac
5990: 6b 2c 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73  k, but not the s
59a0: 65 63 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65  econd..#.#  page
59b0: 72 31 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72  r1-4.5.6: Restor
59c0: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
59d0: 6d 2e 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74  m. Try to open t
59e0: 68 65 20 64 61 74 61 62 61 73 65 20 77 69 74 68  he database with
59f0: 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20   a.#            
5a00: 20 20 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e      readonly con
5a10: 6e 65 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68  nection. This sh
5a20: 6f 75 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20  ould fail, as a 
5a30: 72 65 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20  read-only.#     
5a40: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65             conne
5a50: 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c  ction cannot rol
5a60: 6c 20 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  l back the datab
5a70: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c  ase file..#.faul
5a80: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5a90: 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73  _reopen.do_execs
5aa0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5ab0: 2e 35 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.3 {.  SELECT 
5ac0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
5ad0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
5ae0: 20 7b 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66   {I II III IV}.f
5af0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
5b00: 61 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f  and_reopen.hexio
5b10: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a  _write test.db-j
5b20: 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32  ournal [expr 512
5b30: 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30  +4+1024 - 202] 0
5b40: 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0a  123456789ABCDEF.
5b50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5b60: 70 61 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20  pager1.4.5.4 {. 
5b70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5b80: 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  1;.  SELECT * FR
5b90: 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31  OM t2;.} {I II 1
5ba0: 20 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66   2 III IV 3 4}.f
5bb0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
5bc0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f  and_reopen.hexio
5bd0: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a  _write test.db-j
5be0: 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32  ournal [expr 512
5bf0: 2b 34 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34  +4+1024+4+4+1024
5c00: 20 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37   - 202] 01234567
5c10: 38 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63  89ABCDEF.do_exec
5c20: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5c30: 34 2e 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54  4.5.5 {.  SELECT
5c40: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
5c50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
5c60: 7d 20 7b 49 20 49 49 20 49 49 49 20 49 56 20 33  } {I II III IV 3
5c70: 20 34 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65   4}..faultsim_re
5c80: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5c90: 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65  .db close.sqlite
5ca0: 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65  3 db test.db -re
5cb0: 61 64 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63  adonly 1.do_catc
5cc0: 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  hsql_test pager1
5cd0: 2e 34 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43  .4.5.6 {.  SELEC
5ce0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53  T * FROM t1;.  S
5cf0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
5d00: 0a 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20  .} {1 {disk I/O 
5d10: 65 72 72 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65  error}}.db close
5d20: 0a 0a 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65  ..# Snapshot the
5d30: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73   file-system jus
5d40: 74 20 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66  t before multi-f
5d50: 69 6c 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65  ile commit. Save
5d60: 20 74 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74   the name.# of t
5d70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5d80: 6c 20 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f  l file in $::mj_
5d90: 66 69 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73  filename..#.tv s
5da0: 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a  cript copy_on_mj
5db0: 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65  _delete.tv filte
5dc0: 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63  r xDelete.proc c
5dd0: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
5de0: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
5df0: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
5e00: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d  [string match *m
5e10: 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  j* [file tail $f
5e20: 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20  ilename]]} { .  
5e30: 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e    set ::mj_filen
5e40: 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20  ame $filename.  
5e50: 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20    faultsim_save 
5e60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5e70: 4c 49 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73  LITE_OK.}.do_tes
5e80: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b  t pager1.4.6.1 {
5e90: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
5ea0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
5eb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
5ec0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
5ed0: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20  e = DELETE;.    
5ee0: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32  ATTACH 'test.db2
5ef0: 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20 43 52  ' AS two;.    CR
5f00: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
5f10: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
5f20: 54 41 42 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20  TABLE two.t2(a, 
5f30: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
5f40: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
5f50: 20 27 74 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e   't1.1');.    IN
5f60: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
5f70: 55 45 53 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a  UES(1, 't2.1');.
5f80: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
5f90: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
5fa0: 20 3d 20 27 74 31 2e 32 27 3b 0a 20 20 20 20 20   = 't1.2';.     
5fb0: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62   UPDATE t2 SET b
5fc0: 20 3d 20 27 74 32 2e 32 27 3b 0a 20 20 20 20 43   = 't2.2';.    C
5fd0: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20  OMMIT;.  }.  tv 
5fe0: 66 69 6c 74 65 72 20 7b 7d 0a 20 20 64 62 20 63  filter {}.  db c
5ff0: 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74  lose.} {}..fault
6000: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
6010: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
6020: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
6030: 36 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  6.2 { SELECT * F
6040: 52 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20  ROM t1 }        
6050: 20 20 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74     {1 t1.1}.do_t
6060: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
6070: 72 31 2e 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20  r1.4.6.3 { file 
6080: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
6090: 65 6e 61 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65  ename } {1}.do_e
60a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
60b0: 72 31 2e 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54  r1.4.6.4 {.  ATT
60c0: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
60d0: 53 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20  S two;.  SELECT 
60e0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20  * FROM t2;.} {1 
60f0: 74 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61  t2.1}.do_test pa
6100: 67 65 72 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c  ger1.4.6.5 { fil
6110: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
6120: 69 6c 65 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66  ilename } {0}..f
6130: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
6140: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c  and_reopen.db cl
6150: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ose.do_test page
6160: 72 31 2e 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74  r1.4.6.8 {.  set
6170: 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20   ::mj_filename1 
6180: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20  $::mj_filename. 
6190: 20 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65   tv filter xDele
61a0: 74 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  te.  sqlite3 db 
61b0: 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73  test.db2.  execs
61c0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
61d0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
61e0: 45 4c 45 54 45 3b 0a 20 20 20 20 41 54 54 41 43  ELETE;.    ATTAC
61f0: 48 20 27 74 65 73 74 2e 64 62 33 27 20 41 53 20  H 'test.db3' AS 
6200: 74 68 72 65 65 3b 0a 20 20 20 20 43 52 45 41 54  three;.    CREAT
6210: 45 20 54 41 42 4c 45 20 74 68 72 65 65 2e 74 33  E TABLE three.t3
6220: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
6230: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
6240: 53 28 31 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20  S(1, 't3.1');.  
6250: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55    BEGIN;.      U
6260: 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d  PDATE t2 SET b =
6270: 20 27 74 32 2e 33 27 3b 0a 20 20 20 20 20 20 55   't2.3';.      U
6280: 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d  PDATE t3 SET b =
6290: 20 27 74 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d   't3.3';.    COM
62a0: 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20  MIT;.  }.  expr 
62b0: 7b 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31  {$::mj_filename1
62c0: 20 21 3d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61   != $::mj_filena
62d0: 6d 65 7d 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73  me}.} {1}.faults
62e0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
62f0: 65 6f 70 65 6e 0a 74 76 20 66 69 6c 74 65 72 20  eopen.tv filter 
6300: 7b 7d 0a 0a 23 20 54 68 65 20 66 69 6c 65 2d 73  {}..# The file-s
6310: 79 73 74 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69  ystem now contai
6320: 6e 73 3a 0a 23 0a 23 20 20 20 2a 20 74 68 72 65  ns:.#.#   * thre
6330: 65 20 64 61 74 61 62 61 73 65 73 0a 23 20 20 20  e databases.#   
6340: 2a 20 74 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72  * three hot-jour
6350: 6e 61 6c 20 66 69 6c 65 73 0a 23 20 20 20 2a 20  nal files.#   * 
6360: 74 77 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  two master-journ
6370: 61 6c 20 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68  al files..#.# Th
6380: 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61  e hot-journals a
6390: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
63a0: 65 73 74 2e 64 62 32 20 61 6e 64 20 74 65 73 74  est.db2 and test
63b0: 2e 64 62 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20  .db3 point to.# 
63c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24  master journal $
63d0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54  ::mj_filename. T
63e0: 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  he hot-journal f
63f0: 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
6400: 69 74 68 0a 23 20 74 65 73 74 2e 64 62 20 70 6f  ith.# test.db po
6410: 69 6e 74 73 20 74 6f 20 6d 61 73 74 65 72 20 6a  ints to master j
6420: 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c  ournal $::mj_fil
6430: 65 6e 61 6d 65 31 2e 20 53 6f 20 72 65 61 64 69  ename1. So readi
6440: 6e 67 20 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64  ng from.# test.d
6450: 62 20 73 68 6f 75 6c 64 20 64 65 6c 65 74 65 20  b should delete 
6460: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e  $::mj_filename1.
6470: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
6480: 31 2e 34 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72  1.4.6.9 {.  lsor
6490: 74 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a  t [glob test.db*
64a0: 5d 0a 7d 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74  ].} [lsort [list
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74             \.  t
64e0: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 20  est.db test.db2 
64f0: 74 65 73 74 2e 64 62 33 20 20 20 20 20 20 20 20  test.db3        
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64        \.  test.d
6520: 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64  b-journal test.d
6530: 62 32 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e  b2-journal test.
6540: 64 62 33 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20  db3-journal     
6550: 20 5c 0a 20 20 5b 66 69 6c 65 20 74 61 69 6c 20   \.  [file tail 
6560: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20  $::mj_filename] 
6570: 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a  [file tail $::mj
6580: 5f 66 69 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a  _filename1].]]..
6590: 23 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  # The master-jou
65a0: 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  rnal $::mj_filen
65b0: 61 6d 65 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f  ame1 contains po
65c0: 69 6e 74 65 72 73 20 74 6f 20 74 65 73 74 2e 64  inters to test.d
65d0: 62 20 61 6e 64 20 0a 23 20 74 65 73 74 2e 64 62  b and .# test.db
65e0: 32 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 68  2. However the h
65f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63  ot-journal assoc
6600: 69 61 74 65 64 20 77 69 74 68 20 74 65 73 74 2e  iated with test.
6610: 64 62 32 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20  db2 points to.# 
6620: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
6630: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72  er-journal. Ther
6640: 65 66 6f 72 65 2c 20 72 65 61 64 69 6e 67 20 66  efore, reading f
6650: 72 6f 6d 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79  rom test.db only
6660: 20 73 68 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f   should.# be eno
6670: 75 67 68 20 74 6f 20 63 61 75 73 65 20 53 51 4c  ugh to cause SQL
6680: 69 74 65 20 74 6f 20 64 65 6c 65 74 65 20 24 3a  ite to delete $:
6690: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23  :mj_filename1..#
66a0: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
66b0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b   pager1.4.6.10 {
66c0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
66d0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b  mj_filename  } {
66e0: 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20  1}.do_test      
66f0: 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 31     pager1.4.6.11
6700: 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24   { file exists $
6710: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d  ::mj_filename1 }
6720: 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {1}.do_execsql_
6730: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6740: 31 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  12 { SELECT * FR
6750: 4f 4d 20 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d  OM t1 } {1 t1.1}
6760: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
6770: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b   pager1.4.6.13 {
6780: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
6790: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b  mj_filename  } {
67a0: 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20  1}.do_test      
67b0: 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34     pager1.4.6.14
67c0: 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24   { file exists $
67d0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d  ::mj_filename1 }
67e0: 20 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   {0}..do_execsql
67f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36  _test pager1.4.6
6800: 2e 31 32 20 7b 0a 20 20 41 54 54 41 43 48 20 27  .12 {.  ATTACH '
6810: 74 65 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f  test.db2' AS two
6820: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
6830: 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d  M t2;.} {1 t2.1}
6840: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
6850: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b   pager1.4.6.13 {
6860: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
6870: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b  mj_filename }  {
6880: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
6890: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34  st pager1.4.6.14
68a0: 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73   {.  ATTACH 'tes
68b0: 74 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b  t.db3' AS three;
68c0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
68d0: 20 74 33 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a   t3;.} {1 t3.1}.
68e0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
68f0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20  pager1.4.6.15 { 
6900: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6910: 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30  j_filename }  {0
6920: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  }..db close.tv d
6930: 65 6c 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74  elete..testvfs t
6940: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20  v -default 1.tv 
6950: 73 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74  sectorsize 512.t
6960: 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e  v script copy_on
6970: 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a  _journal_delete.
6980: 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  tv filter xDelet
6990: 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a  e.proc copy_on_j
69a0: 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d  ournal_delete {m
69b0: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
69c0: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
69d0: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72  ring match *jour
69e0: 6e 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20  nal $filename]} 
69f0: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20  faultsim_save . 
6a00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6a10: 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c  K.}.faultsim_del
6a20: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ete_and_reopen.d
6a30: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
6a40: 61 67 65 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20  ager1.4.7.1 {.  
6a50: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
6a60: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
6a70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
6a80: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
6a90: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
6aa0: 58 20 69 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20  X i1 ON t1(y);. 
6ab0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6ac0: 56 41 4c 55 45 53 28 27 49 27 2c 20 20 20 27 6f  VALUES('I',   'o
6ad0: 6e 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ne');.  INSERT I
6ae0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49  NTO t1 VALUES('I
6af0: 49 27 2c 20 20 27 66 6f 75 72 27 29 3b 0a 20 20  I',  'four');.  
6b00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6b10: 41 4c 55 45 53 28 27 49 49 49 27 2c 20 27 6e 69  ALUES('III', 'ni
6b20: 6e 65 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  ne');.  BEGIN;. 
6b30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6b40: 31 20 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27  1 VALUES('IV', '
6b50: 73 69 78 74 65 65 6e 27 29 3b 0a 20 20 20 20 49  sixteen');.    I
6b60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6b70: 4c 55 45 53 28 27 56 27 20 2c 20 27 74 77 65 6e  LUES('V' , 'twen
6b80: 74 79 66 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d  tyfive');.  COMM
6b90: 49 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74  IT;.} {delete}.t
6ba0: 76 20 66 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63  v filter {}.db c
6bb0: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 20 0a  lose.tv delete .
6bc0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
6bd0: 2e 37 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69  .7.2 {.  faultsi
6be0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6bf0: 6f 70 65 6e 0a 20 20 63 61 74 63 68 20 7b 66 69  open.  catch {fi
6c00: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
6c10: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70  st.db-journal -p
6c20: 65 72 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d  ermissions r----
6c30: 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66  ----}.  catch {f
6c40: 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74  ile attributes t
6c50: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d  est.db-journal -
6c60: 72 65 61 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61  readonly 1}.  ca
6c70: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
6c80: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
6c90: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
6ca0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
6cb0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
6cc0: 34 2e 37 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f  4.7.3 {.  db clo
6cd0: 73 65 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65  se.  catch {file
6ce0: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
6cf0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72  .db-journal -per
6d00: 6d 69 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72  missions rw-rw-r
6d10: 77 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c  w-}.  catch {fil
6d20: 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73  e attributes tes
6d30: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65  t.db-journal -re
6d40: 61 64 6f 6e 6c 79 20 30 7d 0a 20 20 64 65 6c 65  adonly 0}.  dele
6d50: 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d  te_file test.db-
6d60: 6a 6f 75 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65  journal.  file e
6d70: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
6d80: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d  urnal.} {0}..#--
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
6de0: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 64 65  llowing tests de
6df0: 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 2d 66 69  al with multi-fi
6e00: 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20  le commits..#.# 
6e10: 70 61 67 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68  pager1-5.1.*: Th
6e20: 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
6e30: 75 6c 74 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74  ulti-file cannot
6e40: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 62 65   be committed be
6e50: 63 61 75 73 65 0a 23 20 20 20 20 20 20 20 20 20  cause.#         
6e60: 20 20 20 20 20 20 61 6e 6f 74 68 65 72 20 63 6f        another co
6e70: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
6e80: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
6e90: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a  k on one of the.
6ea0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
6eb0: 66 69 6c 65 73 2e 20 41 66 74 65 72 20 74 68 65  files. After the
6ec0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
6ed0: 72 65 6d 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d  removed, the COM
6ee0: 4d 49 54 20 73 75 63 63 65 65 64 73 2e 0a 23 0a  MIT succeeds..#.
6ef0: 23 20 70 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20  # pager1-5.2.*: 
6f00: 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  Multi-file commi
6f10: 74 73 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  ts with journal_
6f20: 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23  mode=memory..#.#
6f30: 20 70 61 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d   pager1-5.3.*: M
6f40: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
6f50: 73 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  s with journal_m
6f60: 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20  ode=memory..#.# 
6f70: 70 61 67 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68  pager1-5.4.*: Ch
6f80: 65 63 6b 20 74 68 61 74 20 77 69 74 68 20 73 79  eck that with sy
6f90: 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c  nchronous=normal
6fa0: 2c 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  , the master-jou
6fb0: 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20  rnal file.#     
6fc0: 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 20 69            name i
6fd0: 73 20 61 64 64 65 64 20 74 6f 20 61 20 6a 6f 75  s added to a jou
6fe0: 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69  rnal file immedi
6ff0: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
7000: 6c 61 73 74 0a 23 20 20 20 20 20 20 20 20 20 20  last.#          
7010: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63       journal rec
7020: 6f 72 64 2e 20 42 75 74 20 77 69 74 68 20 73 79  ord. But with sy
7030: 6e 63 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20  nchronous=full, 
7040: 65 78 74 72 61 20 75 6e 75 73 65 64 20 73 70 61  extra unused spa
7050: 63 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ce.#            
7060: 20 20 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20     is allocated 
7070: 62 65 74 77 65 65 6e 20 74 68 65 20 6c 61 73 74  between the last
7080: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
7090: 61 6e 64 20 74 68 65 20 0a 23 20 20 20 20 20 20  and the .#      
70a0: 20 20 20 20 20 20 20 20 20 6d 61 73 74 65 72 2d           master-
70b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
70c0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6d 61  e so that the ma
70d0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
70e0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
70f0: 20 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20    name does not 
7100: 6c 69 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  lie on the same 
7110: 73 65 63 74 6f 72 20 61 73 20 74 68 65 20 6c 61  sector as the la
7120: 73 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  st journal file.
7130: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
7140: 72 65 63 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65  record..#.# page
7150: 72 31 2d 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20  r1-5.5.*: Check 
7160: 74 68 61 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  that in journal_
7170: 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 6d 6f 64  mode=PERSIST mod
7180: 65 2c 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e, a journal fil
7190: 65 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20  e is.#          
71a0: 20 20 20 20 20 74 72 75 6e 63 61 74 65 64 20 74       truncated t
71b0: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 77 68 65  o zero bytes whe
71c0: 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  n a multi-file t
71d0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23  ransaction is .#
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
71f0: 6f 6d 6d 69 74 74 65 64 20 28 69 6e 73 74 65 61  ommitted (instea
7200: 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 63  d of the first c
7210: 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 62  ouple of bytes b
7220: 65 69 6e 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a  eing zeroed)..#.
7230: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
7240: 2d 35 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  -5.1.1 {.  fault
7250: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
7260: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
7270: 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  {.    ATTACH 'te
7280: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a  st.db2' AS aux;.
7290: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
72a0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t1(a, b);.    C
72b0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e  REATE TABLE aux.
72c0: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t2(a, b);.    IN
72d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
72e0: 55 45 53 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29  UES(17, 'Lenin')
72f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
7300: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 32 2c 20  O t1 VALUES(22, 
7310: 27 53 74 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49  'Stalin');.    I
7320: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7330: 4c 55 45 53 28 35 33 2c 20 27 4b 68 72 75 73 68  LUES(53, 'Khrush
7340: 63 68 65 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  chev');.  }.} {}
7350: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7360: 35 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  5.1.2 {.  execsq
7370: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
7380: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
7390: 20 74 31 20 56 41 4c 55 45 53 28 36 34 2c 20 27   t1 VALUES(64, '
73a0: 42 72 65 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20  Brezhnev');.    
73b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
73c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
73d0: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
73e0: 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20   db2 test.db2.  
73f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
7400: 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  GIN;.      SELEC
7410: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
7420: 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73   db2.} {}.do_tes
7430: 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b  t pager1-5.1.3 {
7440: 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d  .  catchsql COMM
7450: 49 54 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  IT.} {1 {databas
7460: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f  e is locked}}.do
7470: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
7480: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43  .4 {.  execsql C
7490: 4f 4d 4d 49 54 20 64 62 32 0a 20 20 65 78 65 63  OMMIT db2.  exec
74a0: 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65  sql COMMIT.  exe
74b0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
74c0: 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20  FROM t2 } db2.} 
74d0: 7b 31 37 20 4c 65 6e 69 6e 20 32 32 20 53 74 61  {17 Lenin 22 Sta
74e0: 6c 69 6e 20 35 33 20 4b 68 72 75 73 68 63 68 65  lin 53 Khrushche
74f0: 76 20 36 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64  v 64 Brezhnev}.d
7500: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7510: 31 2e 35 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73  1.5 {.  db2 clos
7520: 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  e.} {}..do_test 
7530: 70 61 67 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20  pager1-5.2.1 {. 
7540: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
7550: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
7560: 64 65 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20  de = memory;.   
7570: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
7580: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
7590: 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f  UES(84, 'Andropo
75a0: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
75b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
75c0: 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29  (84, 'Andropov')
75d0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
75e0: 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f  }.} {memory}.do_
75f0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 33 2e  test pager1-5.3.
7600: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
7610: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7620: 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20  al_mode = off;. 
7630: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
7640: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
7650: 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61  ALUES(85, 'Gorba
7660: 63 68 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e  chev');.      IN
7670: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
7680: 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68  UES(85, 'Gorbach
7690: 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  ev');.    COMMIT
76a0: 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64  ;.  }.} {off}..d
76b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
76c0: 34 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  4.1 {.  db close
76d0: 0a 20 20 74 65 73 74 76 66 73 20 74 76 0a 20 20  .  testvfs tv.  
76e0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
76f0: 64 62 20 2d 76 66 73 20 74 76 0a 20 20 65 78 65  db -vfs tv.  exe
7700: 63 73 71 6c 20 7b 20 41 54 54 41 43 48 20 27 74  csql { ATTACH 't
7710: 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 20  est.db2' AS aux 
7720: 7d 0a 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78  }..  tv filter x
7730: 44 65 6c 65 74 65 0a 20 20 74 76 20 73 63 72 69  Delete.  tv scri
7740: 70 74 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73  pt max_journal_s
7750: 69 7a 65 0a 20 20 74 76 20 73 65 63 74 6f 72 73  ize.  tv sectors
7760: 69 7a 65 20 35 31 32 0a 20 20 73 65 74 20 3a 3a  ize 512.  set ::
7770: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20  max_journal 0.  
7780: 70 72 6f 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c  proc max_journal
7790: 5f 73 69 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72  _size {method ar
77a0: 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 7a  gs} {.    set sz
77b0: 20 30 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73   0.    catch { s
77c0: 65 74 20 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65  et sz [file size
77d0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
77e0: 5d 20 7d 0a 20 20 20 20 69 66 20 7b 24 73 7a 20  ] }.    if {$sz 
77f0: 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  > $::max_journal
7800: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a  } {.      set ::
7810: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a  max_journal $sz.
7820: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
7830: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20   SQLITE_OK.  }. 
7840: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
7850: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
7860: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
7870: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
7880: 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20  ous = NORMAL;.  
7890: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
78a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
78b0: 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63  LUES(85, 'Gorbac
78c0: 68 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  hev');.      INS
78d0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
78e0: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
78f0: 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  v');.    COMMIT;
7900: 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78  .  }.  set ::max
7910: 5f 6a 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72  _journal.} [expr
7920: 20 32 36 31 35 2b 5b 73 74 72 69 6e 67 20 6c 65   2615+[string le
7930: 6e 67 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 6f 5f  ngth [pwd]]].do_
7940: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e  test pager1-5.4.
7950: 32 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f  2 {.  set ::max_
7960: 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 65 78 65 63  journal 0.  exec
7970: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
7980: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66   synchronous = f
7990: 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ull;.    BEGIN;.
79a0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
79b0: 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27  M t1 WHERE b = '
79c0: 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 20 20 44 45  Lenin';.      DE
79d0: 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45  LETE FROM t2 WHE
79e0: 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a  RE b = 'Lenin';.
79f0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
7a00: 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72    set ::max_jour
7a10: 6e 61 6c 0a 7d 20 5b 65 78 70 72 20 33 31 31 31  nal.} [expr 3111
7a20: 2b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  +[string length 
7a30: 5b 70 77 64 5d 5d 5d 0a 64 62 20 63 6c 6f 73 65  [pwd]]].db close
7a40: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 64 6f 5f 74  .tv delete..do_t
7a50: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 31  est pager1-5.5.1
7a60: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
7a70: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
7a80: 6c 20 7b 20 0a 20 20 20 20 41 54 54 41 43 48 20  l { .    ATTACH 
7a90: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75  'test.db2' AS au
7aa0: 78 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  x;.    PRAGMA jo
7ab0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
7ac0: 53 49 53 54 3b 0a 20 20 20 20 43 52 45 41 54 45  SIST;.    CREATE
7ad0: 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b   TABLE t3(a, b);
7ae0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7af0: 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t3 SELECT rando
7b00: 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
7b10: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
7b20: 4f 4d 20 74 31 3b 0a 20 20 20 20 55 50 44 41 54  OM t1;.    UPDAT
7b30: 45 20 74 33 20 53 45 54 20 62 20 3d 20 72 61 6e  E t3 SET b = ran
7b40: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 3b 0a 20  domblob(1500);. 
7b50: 20 7d 0a 20 20 65 78 70 72 20 5b 66 69 6c 65 20   }.  expr [file 
7b60: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
7b70: 72 6e 61 6c 5d 20 3e 20 31 35 30 30 30 0a 7d 20  rnal] > 15000.} 
7b80: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {1}.do_test page
7b90: 72 31 2d 35 2e 35 2e 32 20 7b 0a 20 20 65 78 65  r1-5.5.2 {.  exe
7ba0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
7bb0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
7bc0: 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b  full;.    BEGIN;
7bd0: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
7be0: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20  OM t1 WHERE b = 
7bf0: 27 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 20 20  'Stalin';.      
7c00: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57  DELETE FROM t2 W
7c10: 48 45 52 45 20 62 20 3d 20 27 53 74 61 6c 69 6e  HERE b = 'Stalin
7c20: 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  ';.    COMMIT;. 
7c30: 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
7c40: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d  est.db-journal.}
7c50: 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   {0}...#--------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
7cb0: 67 20 74 65 73 74 73 20 77 6f 72 6b 20 77 69 74  g tests work wit
7cc0: 68 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61  h "PRAGMA max_pa
7cd0: 67 65 5f 63 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74  ge_count".#.do_t
7ce0: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 20 7b  est pager1-6.1 {
7cf0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
7d00: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
7d10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
7d20: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
7d30: 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41   = none;.    PRA
7d40: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
7d50: 6e 74 20 3d 20 31 30 3b 0a 20 20 20 20 43 52 45  nt = 10;.    CRE
7d60: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
7d70: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
7d80: 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20  ABLE t3(a, b);. 
7d90: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7da0: 74 34 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t4(a, b);.    CR
7db0: 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c  EATE TABLE t5(a,
7dc0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
7dd0: 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a  TABLE t6(a, b);.
7de0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7df0: 20 74 37 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t7(a, b);.    C
7e00: 52 45 41 54 45 20 54 41 42 4c 45 20 74 38 28 61  REATE TABLE t8(a
7e10: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
7e20: 20 54 41 42 4c 45 20 74 39 28 61 2c 20 62 29 3b   TABLE t9(a, b);
7e30: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7e40: 45 20 74 31 30 28 61 2c 20 62 29 3b 0a 20 20 7d  E t10(a, b);.  }
7e50: 0a 7d 20 7b 31 30 7d 0a 64 6f 5f 63 61 74 63 68  .} {10}.do_catch
7e60: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
7e70: 36 2e 32 20 7b 0a 20 20 43 52 45 41 54 45 20 54  6.2 {.  CREATE T
7e80: 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29 0a 7d  ABLE t11(a, b).}
7e90: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 6f 72   {1 {database or
7ea0: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a   disk is full}}.
7eb0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7ec0: 70 61 67 65 72 31 2d 36 2e 34 20 7b 20 50 52 41  pager1-6.4 { PRA
7ed0: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
7ee0: 6e 74 20 20 20 20 20 20 7d 20 7b 31 30 7d 0a 64  nt      } {10}.d
7ef0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
7f00: 61 67 65 72 31 2d 36 2e 35 20 7b 20 50 52 41 47  ager1-6.5 { PRAG
7f10: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
7f20: 74 20 3d 20 31 35 20 7d 20 7b 31 35 7d 0a 64 6f  t = 15 } {15}.do
7f30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
7f40: 67 65 72 31 2d 36 2e 36 20 7b 20 43 52 45 41 54  ger1-6.6 { CREAT
7f50: 45 20 54 41 42 4c 45 20 74 31 31 28 61 2c 20 62  E TABLE t11(a, b
7f60: 29 20 20 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78  )     } {}.do_ex
7f70: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
7f80: 31 2d 36 2e 37 20 7b 0a 20 20 42 45 47 49 4e 3b  1-6.7 {.  BEGIN;
7f90: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7fa0: 20 74 31 31 20 56 41 4c 55 45 53 28 31 2c 20 32   t11 VALUES(1, 2
7fb0: 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61  );.    PRAGMA ma
7fc0: 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31  x_page_count = 1
7fd0: 33 3b 0a 7d 20 7b 31 33 7d 0a 64 6f 5f 65 78 65  3;.} {13}.do_exe
7fe0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
7ff0: 2d 36 2e 38 20 7b 0a 20 20 20 20 49 4e 53 45 52  -6.8 {.    INSER
8000: 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45  T INTO t11 VALUE
8010: 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 50 52 41  S(3, 4);.    PRA
8020: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
8030: 6e 74 20 3d 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a  nt = 10;.} {11}.
8040: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8050: 70 61 67 65 72 31 2d 36 2e 39 20 7b 20 43 4f 4d  pager1-6.9 { COM
8060: 4d 49 54 20 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65  MIT } {}..do_exe
8070: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
8080: 2d 36 2e 31 30 20 7b 20 50 52 41 47 4d 41 20 6d  -6.10 { PRAGMA m
8090: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20  ax_page_count = 
80a0: 31 30 20 7d 20 7b 31 31 7d 0a 64 6f 5f 65 78 65  10 } {11}.do_exe
80b0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
80c0: 2d 36 2e 31 31 20 7b 20 53 45 4c 45 43 54 20 2a  -6.11 { SELECT *
80d0: 20 46 52 4f 4d 20 74 31 31 20 7d 20 20 20 20 20   FROM t11 }     
80e0: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 64       {1 2 3 4}.d
80f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
8100: 61 67 65 72 31 2d 36 2e 31 32 20 7b 20 50 52 41  ager1-6.12 { PRA
8110: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
8120: 6e 74 20 7d 20 20 20 20 20 20 7b 31 31 7d 0a 0a  nt }      {11}..
8130: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
8180: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
8190: 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52 41  s work with "PRA
81a0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
81b0: 3d 54 52 55 4e 43 41 54 45 22 20 61 6e 64 0a 23  =TRUNCATE" and.#
81c0: 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67   "PRAGMA locking
81d0: 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 22  _mode=EXCLUSIVE"
81e0: 2e 0a 23 0a 23 20 45 61 63 68 20 74 65 73 74 20  ..#.# Each test 
81f0: 69 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  is specified wit
8200: 68 20 35 20 76 61 72 69 61 62 6c 65 73 2e 20 41  h 5 variables. A
8210: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20  s follows:.#.#  
8220: 20 24 74 6e 3a 20 20 54 65 73 74 20 4e 75 6d 62   $tn:  Test Numb
8230: 65 72 2e 20 55 73 65 64 20 61 73 20 70 61 72 74  er. Used as part
8240: 20 6f 66 20 74 68 65 20 5b 64 6f 5f 74 65 73 74   of the [do_test
8250: 5d 20 74 65 73 74 20 6e 61 6d 65 73 2e 0a 23 20  ] test names..# 
8260: 20 20 24 73 71 6c 3a 20 53 51 4c 20 74 6f 20 65    $sql: SQL to e
8270: 78 65 63 75 74 65 2e 0a 23 20 20 20 24 72 65 73  xecute..#   $res
8280: 3a 20 45 78 70 65 63 74 65 64 20 72 65 73 75 6c  : Expected resul
8290: 74 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20 24  t of executing $
82a0: 73 71 6c 2e 0a 23 20 20 20 24 6a 73 3a 20 20 54  sql..#   $js:  T
82b0: 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65  he expected size
82c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
82d0: 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20  file, in bytes, 
82e0: 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a  after executing.
82f0: 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51  #         the SQ
8300: 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20  L script. Or -1 
8310: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  if the journal i
8320: 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74  s not expected t
8330: 6f 20 65 78 69 73 74 2e 0a 23 20 20 20 24 77 73  o exist..#   $ws
8340: 3a 20 20 54 68 65 20 65 78 70 65 63 74 65 64 20  :  The expected 
8350: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 41 4c 20  size of the WAL 
8360: 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20  file, in bytes, 
8370: 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a  after executing.
8380: 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51  #         the SQ
8390: 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20  L script. Or -1 
83a0: 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
83b0: 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65 78  t expected to ex
83c0: 69 73 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  ist..#.ifcapable
83d0: 20 77 61 6c 20 7b 0a 20 20 66 61 75 6c 74 73 69   wal {.  faultsi
83e0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
83f0: 70 65 6e 0a 20 20 66 6f 72 65 61 63 68 20 7b 74  pen.  foreach {t
8400: 6e 20 73 71 6c 20 72 65 73 20 6a 73 20 77 73 7d  n sql res js ws}
8410: 20 5b 73 75 62 73 74 20 7b 0a 20 20 0a 20 20 20   [subst {.  .   
8420: 20 31 20 20 7b 0a 20 20 20 20 20 20 43 52 45 41   1  {.      CREA
8430: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
8440: 29 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  );.      PRAGMA 
8450: 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b  auto_vacuum=OFF;
8460: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 73 79  .      PRAGMA sy
8470: 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
8480: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70  ;.      PRAGMA p
8490: 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20  age_size=1024;. 
84a0: 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
84b0: 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
84c0: 56 45 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  VE;.      PRAGMA
84d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52   journal_mode=TR
84e0: 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 49 4e  UNCATE;.      IN
84f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
8500: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d  UES(1, 2);.    }
8510: 20 7b 65 78 63 6c 75 73 69 76 65 20 74 72 75 6e   {exclusive trun
8520: 63 61 74 65 7d 20 30 20 2d 31 0a 20 20 0a 20 20  cate} 0 -1.  .  
8530: 20 20 32 20 20 7b 0a 20 20 20 20 20 20 42 45 47    2  {.      BEG
8540: 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20  IN IMMEDIATE;.  
8550: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
8560: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f  ROM t1;.      CO
8570: 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32  MMIT;.    } {1 2
8580: 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 33 20  } 0 -1.  .    3 
8590: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
85a0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
85b0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
85c0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31  COMMIT;.    } {1
85d0: 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20   2} 0 -1.  .    
85e0: 34 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  4  { PRAGMA jour
85f0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d  nal_mode = WAL }
8600: 20 20 20 20 77 61 6c 20 20 20 20 20 20 20 2d 31      wal       -1
8610: 20 2d 31 0a 20 20 20 20 35 20 20 7b 20 49 4e 53   -1.    5  { INS
8620: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8630: 45 53 28 33 2c 20 34 29 20 7d 20 20 7b 7d 20 20  ES(3, 4) }  {}  
8640: 20 20 20 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69        -1 [wal_fi
8650: 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a  le_size 1 1024].
8660: 20 20 20 20 36 20 20 7b 20 50 52 41 47 4d 41 20      6  { PRAGMA 
8670: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 4e  locking_mode = N
8680: 4f 52 4d 41 4c 20 7d 20 65 78 63 6c 75 73 69 76  ORMAL } exclusiv
8690: 65 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  e -1 [wal_file_s
86a0: 69 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 20 20  ize 1 1024].    
86b0: 37 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  7  { INSERT INTO
86c0: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29   t1 VALUES(5, 6)
86d0: 3b 20 7d 20 7b 7d 20 20 20 20 20 20 20 20 2d 31  ; } {}        -1
86e0: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
86f0: 32 20 31 30 32 34 5d 0a 20 20 0a 20 20 20 20 38  2 1024].  .    8
8700: 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e    { PRAGMA journ
8710: 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41  al_mode = TRUNCA
8720: 54 45 20 7d 20 74 72 75 6e 63 61 74 65 20 20 20  TE } truncate   
8730: 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20 20 20         0 -1.    
8740: 39 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  9  { INSERT INTO
8750: 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38 29   t1 VALUES(7, 8)
8760: 20 7d 20 20 20 20 7b 7d 20 20 20 20 20 20 20 20   }    {}        
8770: 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20 20          0 -1.   
8780: 20 31 30 20 7b 20 53 45 4c 45 43 54 20 2a 20 46   10 { SELECT * F
8790: 52 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20  ROM t1 }        
87a0: 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 20         {1 2 3 4 
87b0: 35 20 36 20 37 20 38 7d 20 30 20 2d 31 0a 20 20  5 6 7 8} 0 -1.  
87c0: 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 64 6f 5f 65  .  }] {.    do_e
87d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
87e0: 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20 24 73 71  r1-7.1.$tn.1 $sq
87f0: 6c 20 24 72 65 73 0a 20 20 20 20 63 61 74 63 68  l $res.    catch
8800: 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b 20 73 65   { set J -1 ; se
8810: 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  t J [file size t
8820: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20  est.db-journal] 
8830: 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73 65  }.    catch { se
8840: 74 20 57 20 2d 31 20 3b 20 73 65 74 20 57 20 5b  t W -1 ; set W [
8850: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
8860: 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20 64 6f 5f  b-wal] }.    do_
8870: 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 31 2e  test pager1-7.1.
8880: 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20 24 4a 20  $tn.2 { list $J 
8890: 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a 73 20 24  $W } [list $js $
88a0: 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65  ws].  }.}..do_te
88b0: 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 31 20  st pager1-7.2.1 
88c0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
88d0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
88e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
88f0: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
8900: 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 3b 0a  de = EXCLUSIVE;.
8910: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8920: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 42   t1(a, b);.    B
8930: 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 52 41 47  EGIN;.      PRAG
8940: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
8950: 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 20 20  = delete;.      
8960: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
8970: 6f 64 65 20 3d 20 74 72 75 6e 63 61 74 65 3b 0a  ode = truncate;.
8980: 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65    }.} {exclusive
8990: 20 64 65 6c 65 74 65 20 74 72 75 6e 63 61 74 65   delete truncate
89a0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
89b0: 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  -7.2.2 {.  execs
89c0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
89d0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
89e0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
89f0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8a00: 64 65 20 3d 20 70 65 72 73 69 73 74 20 7d 0a 7d  de = persist }.}
8a10: 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64 6f 5f 74   {truncate}.do_t
8a20: 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 33  est pager1-7.2.3
8a30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
8a40: 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65 63 73 71  OMMIT }.  execsq
8a50: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
8a60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65  ournal_mode = pe
8a70: 72 73 69 73 74 3b 0a 20 20 20 20 50 52 41 47 4d  rsist;.    PRAGM
8a80: 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  A journal_size_l
8a90: 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b 70 65 72  imit;.  }.} {per
8aa0: 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d 2d  sist -1}..#-----
8ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8af0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
8b00: 77 69 6e 67 20 74 65 73 74 73 2c 20 70 61 67 65  wing tests, page
8b10: 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20 74 68 61  r1-8.*, test tha
8b20: 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 66 69  t the special fi
8b30: 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a 6d 65 6d  lenames .# ":mem
8b40: 6f 72 79 3a 22 20 61 6e 64 20 22 22 20 6f 70 65  ory:" and "" ope
8b50: 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  n temporary data
8b60: 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68  bases..#.foreach
8b70: 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65 7d 20 7b   {tn filename} {
8b80: 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20  .  1 :memory:.  
8b90: 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65  2 "".} {.  do_te
8ba0: 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e  st pager1-8.$tn.
8bb0: 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d  1 {.    faultsim
8bc0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
8bd0: 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a  en.    db close.
8be0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 24      sqlite3 db $
8bf0: 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 65 78 65  filename.    exe
8c00: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
8c10: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
8c20: 3d 20 31 3b 0a 20 20 20 20 20 20 43 52 45 41 54  = 1;.      CREAT
8c30: 45 20 54 41 42 4c 45 20 78 31 28 78 29 3b 0a 20  E TABLE x1(x);. 
8c40: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
8c50: 20 78 31 20 56 41 4c 55 45 53 28 27 43 68 61 72   x1 VALUES('Char
8c60: 6c 65 73 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  les');.      INS
8c70: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
8c80: 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a 20 20 20  ES('James');.   
8c90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
8ca0: 31 20 56 41 4c 55 45 53 28 27 4d 61 72 79 27 29  1 VALUES('Mary')
8cb0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
8cc0: 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 7d 0a   FROM x1;.    }.
8cd0: 20 20 7d 20 7b 43 68 61 72 6c 65 73 20 4a 61 6d    } {Charles Jam
8ce0: 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64 6f 5f 74  es Mary}..  do_t
8cf0: 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e  est pager1-8.$tn
8d00: 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .2 {.    sqlite3
8d10: 20 64 62 32 20 24 66 69 6c 65 6e 61 6d 65 0a 20   db2 $filename. 
8d20: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45     catchsql { SE
8d30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d  LECT * FROM x1 }
8d40: 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20   db2.  } {1 {no 
8d50: 73 75 63 68 20 74 61 62 6c 65 3a 20 78 31 7d 7d  such table: x1}}
8d60: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
8d70: 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e  est pager1-8.$tn
8d80: 2e 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  .3 {.    BEGIN;.
8d90: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
8da0: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 57 69 6c  O x1 VALUES('Wil
8db0: 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20 20 49 4e  liam');.      IN
8dc0: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
8dd0: 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a 20 20 20  UES('Anne');.   
8de0: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20 7b   ROLLBACK;.  } {
8df0: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8e40: 23 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  # The next block
8e50: 20 6f 66 20 74 65 73 74 73 20 2d 20 70 61 67 65   of tests - page
8e60: 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c 20 77 69  r1-9.* - deal wi
8e70: 74 68 20 69 6e 74 65 72 61 63 74 69 6f 6e 73 20  th interactions 
8e80: 62 65 74 77 65 65 6e 0a 23 20 74 68 65 20 70 61  between.# the pa
8e90: 67 65 72 20 61 6e 64 20 74 68 65 20 62 61 63 6b  ger and the back
8ea0: 75 70 20 41 50 49 2e 20 54 65 73 74 20 63 61 73  up API. Test cas
8eb0: 65 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31  es:.#.#   pager1
8ec0: 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61  -9.1.*: Test tha
8ed0: 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c  t a backup compl
8ee0: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
8ef0: 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20  y even if the.# 
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 73 6f 75 72 63 65 20 64 62 20 69 73 20 77 72 69  source db is wri
8f20: 74 74 65 6e 20 74 6f 20 64 75 72 69 6e 67 20 74  tten to during t
8f30: 68 65 20 62 61 63 6b 75 70 20 6f 70 2e 0a 23 0a  he backup op..#.
8f40: 23 20 20 20 70 61 67 65 72 31 2d 39 2e 32 2e 2a  #   pager1-9.2.*
8f50: 3a 20 54 65 73 74 20 74 68 61 74 20 61 20 62 61  : Test that a ba
8f60: 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65 73 20 73  ckup completes s
8f70: 75 63 63 65 73 73 66 75 6c 6c 79 20 65 76 65 6e  uccessfully even
8f80: 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20 20   if the.#       
8f90: 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65            source
8fa0: 20 64 62 20 69 73 20 77 72 69 74 74 65 6e 20 74   db is written t
8fb0: 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f 6c 6c 65  o and then rolle
8fc0: 64 20 62 61 63 6b 20 64 75 72 69 6e 67 20 61 20  d back during a 
8fd0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
8fe0: 20 20 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74     backup operat
8ff0: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ion..#.do_test p
9000: 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b 0a 20 20  ager1-9.0.1 {.  
9010: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
9020: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
9030: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
9040: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
9050: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
9060: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
9070: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
9080: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 28  CREATE TABLE ab(
9090: 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20  a, b, UNIQUE(a, 
90a0: 62 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  b));.      INSER
90b0: 54 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53  T INTO ab VALUES
90c0: 28 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  ( a_string(200),
90d0: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 29   a_string(300) )
90e0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
90f0: 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f  NTO ab SELECT a_
9100: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
9110: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
9120: 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ab;.      INSERT
9130: 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20   INTO ab SELECT 
9140: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
9150: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
9160: 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45  M ab;.      INSE
9170: 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43  RT INTO ab SELEC
9180: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
9190: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
91a0: 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e  ROM ab;.      IN
91b0: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c  SERT INTO ab SEL
91c0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
91d0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
91e0: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20   FROM ab;.      
91f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53  INSERT INTO ab S
9200: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
9210: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
9220: 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20  0) FROM ab;.    
9230: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
9240: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
9250: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
9260: 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20  300) FROM ab;.  
9270: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9280: 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  ab SELECT a_stri
9290: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
92a0: 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a  g(300) FROM ab;.
92b0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
92c0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
92d0: 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20 20 73 71  er1-9.0.2 {.  sq
92e0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
92f0: 62 32 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 20  b2.  db2 eval { 
9300: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
9310: 65 20 3d 20 31 30 20 7d 0a 20 20 73 71 6c 69 74  e = 10 }.  sqlit
9320: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
9330: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c  main db main.  l
9340: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
9350: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
9360: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
9370: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
9380: 70 61 67 65 72 31 2d 39 2e 30 2e 33 20 7b 0a 20  pager1-9.0.3 {. 
9390: 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  db one {SELECT m
93a0: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
93b0: 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20   ab}.} [db2 one 
93c0: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
93d0: 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 0a  , b) FROM ab}]..
93e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
93f0: 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.1 {.  execsql
9400: 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54   { UPDATE ab SET
9410: 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30   a = a_string(20
9420: 31 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  1) }.  sqlite3_b
9430: 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e  ackup B db2 main
9440: 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65   db main.  B ste
9450: 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f  p 30.} {SQLITE_O
9460: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
9470: 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  1-9.1.2 {.  exec
9480: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20  sql { UPDATE ab 
9490: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
94a0: 28 33 30 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b  (301) }.  list [
94b0: 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42  B step 10000] [B
94c0: 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49   finish].} {SQLI
94d0: 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f  TE_DONE SQLITE_O
94e0: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
94f0: 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62 20 6f 6e  1-9.1.3 {. db on
9500: 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  e {SELECT md5sum
9510: 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a  (a, b) FROM ab}.
9520: 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45  } [db2 one {SELE
9530: 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20  CT md5sum(a, b) 
9540: 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73  FROM ab}].do_tes
9550: 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 34 20 7b  t pager1-9.1.4 {
9560: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
9570: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9580: 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 0a 64 6f  ab } } {128}..do
9590: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32  _test pager1-9.2
95a0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
95b0: 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20 61   UPDATE ab SET a
95c0: 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29   = a_string(202)
95d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63   }.  sqlite3_bac
95e0: 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64  kup B db2 main d
95f0: 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20  b main.  B step 
9600: 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  30.} {SQLITE_OK}
9610: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9620: 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  9.2.2 {.  execsq
9630: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
9640: 20 20 20 20 20 20 55 50 44 41 54 45 20 61 62 20        UPDATE ab 
9650: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
9660: 28 33 30 31 29 3b 0a 20 20 20 20 52 4f 4c 4c 42  (301);.    ROLLB
9670: 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20  ACK;.  }.  list 
9680: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
9690: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
96a0: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
96b0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
96c0: 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64 62 20 6f  r1-9.2.3 {. db o
96d0: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
96e0: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
96f0: 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c  .} [db2 one {SEL
9700: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
9710: 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65   FROM ab}].do_te
9720: 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 34 20  st pager1-9.2.4 
9730: 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45  { execsql { SELE
9740: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
9750: 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 64 62   ab } } {128}.db
9760: 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65   close.db2 close
9770: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
9780: 2d 39 2e 33 2e 31 20 7b 0a 20 20 74 65 73 74 76  -9.3.1 {.  testv
9790: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
97a0: 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65  .  tv sectorsize
97b0: 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69 6d   4096.  faultsim
97c0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
97d0: 65 6e 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  en..  execsql { 
97e0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
97f0: 20 3d 20 31 30 32 34 20 7d 0a 20 20 66 6f 72 20   = 1024 }.  for 
9800: 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69 20  {set ii 0} {$ii 
9810: 3c 20 34 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b  < 4} {incr ii} {
9820: 20 65 78 65 63 73 71 6c 20 22 43 52 45 41 54 45   execsql "CREATE
9830: 20 54 41 42 4c 45 20 74 24 7b 69 69 7d 28 61 2c   TABLE t${ii}(a,
9840: 20 62 29 22 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74   b)" }.} {}.do_t
9850: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e 32  est pager1-9.3.2
9860: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
9870: 20 74 65 73 74 2e 64 62 32 0a 0a 20 20 65 78 65   test.db2..  exe
9880: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
9890: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30  A page_size = 40
98a0: 39 36 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73  96;.    PRAGMA s
98b0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46  ynchronous = OFF
98c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
98d0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
98e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
98f0: 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a  (a, b);.  } db2.
9900: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
9910: 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20  p B db2 main db 
9920: 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30  main.  B step 30
9930: 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20  .  list [B step 
9940: 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68  10000] [B finish
9950: 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45  ].} {SQLITE_DONE
9960: 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74   SQLITE_OK}.do_t
9970: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e 33  est pager1-9.3.3
9980: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20   {.  db2 close. 
9990: 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64   db close.  tv d
99a0: 65 6c 65 74 65 0a 20 20 66 69 6c 65 20 73 69 7a  elete.  file siz
99b0: 65 20 74 65 73 74 2e 64 62 32 0a 7d 20 5b 66 69  e test.db2.} [fi
99c0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
99d0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
99e0: 2d 39 2e 34 2e 31 20 7b 0a 20 20 66 61 75 6c 74  -9.4.1 {.  fault
99f0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
9a00: 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20  eopen.  sqlite3 
9a10: 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65  db2 test.db2.  e
9a20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
9a30: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
9a40: 34 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54 45  4096;.    CREATE
9a50: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
9a60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9a70: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20  E t2(a, b);.  } 
9a80: 64 62 32 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  db2.  sqlite3_ba
9a90: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
9aa0: 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74 20 5b  db main.  list [
9ab0: 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42  B step 10000] [B
9ac0: 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49   finish].} {SQLI
9ad0: 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f  TE_DONE SQLITE_O
9ae0: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
9af0: 31 2d 39 2e 34 2e 32 20 7b 0a 20 20 6c 69 73 74  1-9.4.2 {.  list
9b00: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
9b10: 2e 64 62 32 5d 20 5b 66 69 6c 65 20 73 69 7a 65  .db2] [file size
9b20: 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 30 20 30   test.db].} {0 0
9b30: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d  }.db2 close..#--
9b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b80: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
9b90: 68 61 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f  hat regardless o
9ba0: 66 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  f the value retu
9bb0: 72 6e 65 64 20 62 79 20 78 53 65 63 74 6f 72 53  rned by xSectorS
9bc0: 69 7a 65 28 29 2c 20 74 68 65 0a 23 20 6d 69 6e  ize(), the.# min
9bd0: 69 6d 75 6d 20 65 66 66 65 63 74 69 76 65 20 73  imum effective s
9be0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 35 31  ector-size is 51
9bf0: 32 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  2 and the maximu
9c00: 6d 20 36 35 35 33 36 20 62 79 74 65 73 2e 0a 23  m 65536 bytes..#
9c10: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
9c20: 61 75 6c 74 20 31 0a 66 6f 72 65 61 63 68 20 73  ault 1.foreach s
9c30: 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20 20 20  ectorsize {.    
9c40: 33 32 20 20 20 36 34 20 20 20 31 32 38 20 20 20  32   64   128   
9c50: 32 35 36 20 20 20 35 31 32 20 20 20 31 30 32 34  256   512   1024
9c60: 20 20 20 32 30 34 38 20 0a 20 20 20 20 34 30 39     2048 .    409
9c70: 36 20 38 31 39 32 20 31 36 33 38 34 20 33 32 37  6 8192 16384 327
9c80: 36 38 20 36 35 35 33 36 20 31 33 31 30 37 32 20  68 65536 131072 
9c90: 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74 76 20  262144.} {.  tv 
9ca0: 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63 74  sectorsize $sect
9cb0: 6f 72 73 69 7a 65 0a 20 20 73 65 74 20 65 66 66  orsize.  set eff
9cc0: 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 69   $sectorsize.  i
9cd0: 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3c  f {$sectorsize <
9ce0: 20 35 31 32 7d 20 20 20 7b 20 73 65 74 20 65 66   512}   { set ef
9cf0: 66 20 35 31 32 20 7d 0a 20 20 69 66 20 7b 24 73  f 512 }.  if {$s
9d00: 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33  ectorsize > 6553
9d10: 36 7d 20 7b 20 73 65 74 20 65 66 66 20 36 35 35  6} { set eff 655
9d20: 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  36 }..  do_test 
9d30: 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74 6f  pager1-10.$secto
9d40: 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 66 61  rsize.1 {.    fa
9d50: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
9d60: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20  d_reopen.    db 
9d70: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
9d80: 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73  string.    execs
9d90: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
9da0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
9db0: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20   PERSIST;.      
9dc0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
9dd0: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20 42   = 1024;.      B
9de0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52  EGIN;.        CR
9df0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
9e00: 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45   b);.        CRE
9e10: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
9e20: 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  b);.        CREA
9e30: 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62  TE TABLE t3(a, b
9e40: 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  );.      COMMIT;
9e50: 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 20  .    }.    file 
9e60: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
9e70: 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24  rnal.  } [expr $
9e80: 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35  sectorsize > 655
9e90: 33 36 20 3f 20 36 35 35 33 36 20 3a 20 24 73 65  36 ? 65536 : $se
9ea0: 63 74 6f 72 73 69 7a 65 5d 0a 0a 20 20 64 6f 5f  ctorsize]..  do_
9eb0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
9ec0: 73 65 63 74 6f 72 73 69 7a 65 2e 32 20 7b 0a 20  sectorsize.2 {. 
9ed0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
9ee0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9ef0: 74 33 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t3 VALUES(a_stri
9f00: 6e 67 28 33 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(300), a_strin
9f10: 67 28 33 30 30 29 29 3b 0a 20 20 20 20 20 20 49  g(300));.      I
9f20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
9f30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20  LECT * FROM t3; 
9f40: 20 20 20 20 20 20 20 2f 2a 20 20 32 20 2a 2f 0a         /*  2 */.
9f50: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9f60: 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52  O t3 SELECT * FR
9f70: 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a  OM t3;        /*
9f80: 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    4 */.      INS
9f90: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
9fa0: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20  CT * FROM t3;   
9fb0: 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20       /*  8 */.  
9fc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9fd0: 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t3 SELECT * FROM
9fe0: 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 31   t3;        /* 1
9ff0: 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  6 */.      INSER
a000: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
a010: 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20   * FROM t3;     
a020: 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20     /* 32 */.    
a030: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74  }.  } {}..  do_t
a040: 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73  est pager1-10.$s
a050: 65 63 74 6f 72 73 69 7a 65 2e 33 20 7b 0a 20 20  ectorsize.3 {.  
a060: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73    db close.    s
a070: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
a080: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  b.    execsql { 
a090: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61  .      PRAGMA ca
a0a0: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
a0b0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
a0c0: 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65 5f  }.    recursive_
a0d0: 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62  select 32 t3 {db
a0e0: 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e   eval "INSERT IN
a0f0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
a100: 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  2)"}.    execsql
a110: 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b   {.      COMMIT;
a120: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
a130: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20  FROM t2;.    }. 
a140: 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f 74   } {1 2}..  do_t
a150: 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73  est pager1-10.$s
a160: 65 63 74 6f 72 73 69 7a 65 2e 34 20 7b 0a 20 20  ectorsize.4 {.  
a170: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a180: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a190: 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43  6(a, b);.      C
a1a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61  REATE TABLE t7(a
a1b0: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , b);.      CREA
a1c0: 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62  TE TABLE t5(a, b
a1d0: 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41  );.      DROP TA
a1e0: 42 4c 45 20 74 36 3b 0a 20 20 20 20 20 20 44 52  BLE t6;.      DR
a1f0: 4f 50 20 54 41 42 4c 45 20 74 37 3b 0a 20 20 20  OP TABLE t7;.   
a200: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
a210: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
a220: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
a230: 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20  LE t6(a, b);.   
a240: 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65   }.    recursive
a250: 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64  _select 32 t3 {d
a260: 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49  b eval "INSERT I
a270: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c  NTO t5 VALUES(1,
a280: 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71   2)"}.    execsq
a290: 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  l {.      COMMIT
a2a0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
a2b0: 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d 0a   FROM t5;.    }.
a2c0: 20 20 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a 64    } {1 2}.  .}.d
a2d0: 62 20 63 6c 6f 73 65 0a 0a 74 76 20 73 65 63 74  b close..tv sect
a2e0: 6f 72 73 69 7a 65 20 34 30 39 36 0a 64 6f 5f 74  orsize 4096.do_t
a2f0: 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e  est pager1.10.x.
a300: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
a310: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
a320: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a330: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
a340: 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20  uum = none;.    
a350: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
a360: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
a370: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
a380: 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  .  }.  for {set 
a390: 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20 7b 69 6e  i 0} {$i<30} {in
a3a0: 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63  cr i} {.    exec
a3b0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
a3c0: 4f 20 74 31 20 56 41 4c 55 45 53 28 7a 65 72 6f  O t1 VALUES(zero
a3d0: 62 6c 6f 62 28 39 30 30 29 29 20 7d 0a 20 20 7d  blob(900)) }.  }
a3e0: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
a3f0: 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d 0a 64  t.db.} {32768}.d
a400: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30  o_test pager1.10
a410: 2e 78 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .x.2 {.  execsql
a420: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
a430: 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 44  BLE t2(x);.    D
a440: 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20  ROP TABLE t2;.  
a450: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
a460: 73 74 2e 64 62 0a 7d 20 7b 33 33 37 39 32 7d 0a  st.db.} {33792}.
a470: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31  do_test pager1.1
a480: 30 2e 78 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  0.x.3 {.  execsq
a490: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
a4a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a4b0: 74 32 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65 63  t2(x);.  }.  rec
a4c0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 30  ursive_select 30
a4d0: 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   t1.  execsql {.
a4e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a4f0: 20 74 33 28 78 29 3b 0a 20 20 20 20 43 4f 4d 4d   t3(x);.    COMM
a500: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 62  IT;.  }.} {}..db
a510: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
a520: 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  ..testvfs tv -de
a530: 66 61 75 6c 74 20 31 0a 66 61 75 6c 74 73 69 6d  fault 1.faultsim
a540: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
a550: 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72  en.db func a_str
a560: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 64 6f 5f  ing a_string.do_
a570: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
a580: 65 72 31 2d 31 31 2e 31 20 7b 0a 20 20 50 52 41  er1-11.1 {.  PRA
a590: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
a5a0: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 50 52 41   = DELETE;.  PRA
a5b0: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
a5c0: 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20   10;.  BEGIN;.  
a5d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a    CREATE TABLE z
a5e0: 7a 28 74 6f 70 20 50 52 49 4d 41 52 59 20 4b 45  z(top PRIMARY KE
a5f0: 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  Y);.    INSERT I
a600: 4e 54 4f 20 7a 7a 20 56 41 4c 55 45 53 28 61 5f  NTO zz VALUES(a_
a610: 73 74 72 69 6e 67 28 32 32 32 29 29 3b 0a 20 20  string(222));.  
a620: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
a630: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
a640: 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78  ((SELECT 222+max
a650: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29  (rowid) FROM zz)
a660: 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49  ) FROM zz;.    I
a670: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
a680: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
a690: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
a6a0: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
a6b0: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
a6c0: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
a6d0: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
a6e0: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
a6f0: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
a700: 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   zz;.    INSERT 
a710: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
a720: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
a730: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
a740: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
a750: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
a760: 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74  O zz SELECT a_st
a770: 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32  ring((SELECT 222
a780: 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d  +max(rowid) FROM
a790: 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20   zz)) FROM zz;. 
a7a0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 42 45 47 49 4e   COMMIT;.  BEGIN
a7b0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 7a 20  ;.    UPDATE zz 
a7c0: 53 45 54 20 74 6f 70 20 3d 20 61 5f 73 74 72 69  SET top = a_stri
a7d0: 6e 67 28 33 34 35 29 3b 0a 7d 20 7b 64 65 6c 65  ng(345);.} {dele
a7e0: 74 65 7d 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75  te}..proc lockou
a7f0: 74 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20  t {method args} 
a800: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
a810: 49 4f 45 52 52 20 7d 0a 74 76 20 73 63 72 69 70  IOERR }.tv scrip
a820: 74 20 6c 6f 63 6b 6f 75 74 0a 74 76 20 66 69 6c  t lockout.tv fil
a830: 74 65 72 20 7b 78 57 72 69 74 65 20 78 54 72 75  ter {xWrite xTru
a840: 6e 63 61 74 65 20 78 53 79 6e 63 7d 0a 64 6f 5f  ncate xSync}.do_
a850: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61  catchsql_test pa
a860: 67 65 72 31 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d  ger1-11.2 { COMM
a870: 49 54 20 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f  IT } {1 {disk I/
a880: 4f 20 65 72 72 6f 72 7d 7d 0a 0a 74 76 20 73 63  O error}}..tv sc
a890: 72 69 70 74 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  ript {}.do_test 
a8a0: 70 61 67 65 72 31 2d 31 31 2e 33 20 7b 0a 20 20  pager1-11.3 {.  
a8b0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
a8c0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
a8d0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
a8e0: 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41  al_mode = TRUNCA
a8f0: 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  TE;.    PRAGMA i
a900: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
a910: 20 20 7d 20 64 62 32 0a 7d 20 7b 74 72 75 6e 63    } db2.} {trunc
a920: 61 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20  ate ok}.do_test 
a930: 70 61 67 65 72 31 2d 31 31 2e 34 20 7b 0a 20 20  pager1-11.4 {.  
a940: 64 62 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65  db2 close.  file
a950: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
a960: 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f  journal.} {0}.do
a970: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
a980: 67 65 72 31 2d 31 31 2e 35 20 7b 20 53 45 4c 45  ger1-11.5 { SELE
a990: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
a9a0: 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62 20 63 6c   zz } {32}.db cl
a9b0: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 20 20  ose.tv delete.  
a9c0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
a9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
aa10: 73 74 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f  st "PRAGMA page_
aa20: 73 69 7a 65 22 0a 23 0a 74 65 73 74 76 66 73 20  size".#.testvfs 
aa30: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76  tv -default 1.tv
aa40: 20 73 65 63 74 6f 72 73 69 7a 65 20 31 30 32 34   sectorsize 1024
aa50: 0a 66 6f 72 65 61 63 68 20 70 61 67 65 73 69 7a  .foreach pagesiz
aa60: 65 20 7b 0a 20 20 20 20 35 31 32 20 20 20 31 30  e {.    512   10
aa70: 32 34 20 20 20 32 30 34 38 20 34 30 39 36 20 38  24   2048 4096 8
aa80: 31 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20  192 16384 32768 
aa90: 0a 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .} {.  faultsim_
aaa0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
aab0: 6e 0a 0a 20 20 23 20 54 68 65 20 73 65 63 74 6f  n..  # The secto
aac0: 72 2d 73 69 7a 65 20 28 61 63 63 6f 72 64 69 6e  r-size (accordin
aad0: 67 20 74 6f 20 74 68 65 20 56 46 53 29 20 69 73  g to the VFS) is
aae0: 20 31 30 32 34 20 62 79 74 65 73 2e 20 53 6f 20   1024 bytes. So 
aaf0: 69 66 20 74 68 65 0a 20 20 23 20 70 61 67 65 2d  if the.  # page-
ab00: 73 69 7a 65 20 72 65 71 75 65 73 74 65 64 20 75  size requested u
ab10: 73 69 6e 67 20 22 50 52 41 47 4d 41 20 70 61 67  sing "PRAGMA pag
ab20: 65 5f 73 69 7a 65 22 20 69 73 20 67 72 65 61 74  e_size" is great
ab30: 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 23 20  er than the.  # 
ab40: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c  compile time val
ab50: 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 4d 41 58  ue of SQLITE_MAX
ab60: 5f 50 41 47 45 5f 53 49 5a 45 2c 20 74 68 65 6e  _PAGE_SIZE, then
ab70: 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 0a   the effective .
ab80: 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72 65    # page-size re
ab90: 6d 61 69 6e 73 20 31 30 32 34 20 62 79 74 65 73  mains 1024 bytes
aba0: 2e 0a 20 20 23 0a 20 20 73 65 74 20 65 66 66 20  ..  #.  set eff 
abb0: 24 70 61 67 65 73 69 7a 65 0a 20 20 69 66 20 7b  $pagesize.  if {
abc0: 24 65 66 66 20 3e 20 24 3a 3a 53 51 4c 49 54 45  $eff > $::SQLITE
abd0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 7d 20  _MAX_PAGE_SIZE} 
abe0: 7b 20 73 65 74 20 65 66 66 20 31 30 32 34 20 7d  { set eff 1024 }
abf0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
ac00: 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e  r1-12.$pagesize.
ac10: 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  1 {.    sqlite3 
ac20: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20  db2 test.db.    
ac30: 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20  execsql ".      
ac40: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
ac50: 20 3d 20 24 70 61 67 65 73 69 7a 65 3b 0a 20 20   = $pagesize;.  
ac60: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
ac70: 76 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  v AS SELECT * FR
ac80: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
ac90: 3b 0a 20 20 20 20 22 20 64 62 32 0a 20 20 20 20  ;.    " db2.    
aca0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
acb0: 62 0a 20 20 7d 20 24 65 66 66 0a 20 20 64 6f 5f  b.  } $eff.  do_
acc0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24  test pager1-12.$
acd0: 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20  pagesize.2 {.   
ace0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
acf0: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
ad00: 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54   { .      SELECT
ad10: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76   count(*) FROM v
ad20: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d  ;.      PRAGMA m
ad30: 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20  ain.page_size;. 
ad40: 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69     } db2.  } [li
ad50: 73 74 20 31 20 24 65 66 66 5d 0a 20 20 64 6f 5f  st 1 $eff].  do_
ad60: 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24  test pager1-12.$
ad70: 70 61 67 65 73 69 7a 65 2e 33 20 7b 0a 20 20 20  pagesize.3 {.   
ad80: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
ad90: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
ada0: 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20  ) FROM v;.      
adb0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65  PRAGMA main.page
adc0: 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  _size;.    }.  }
add0: 20 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a 20   [list 1 $eff]. 
ade0: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 64 62 20   db2 close.}.db 
adf0: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
ae00: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
ae10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
ae50: 73 74 20 73 70 65 63 61 6c 20 22 50 52 41 47 4d  st specal "PRAGM
ae60: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50  A journal_mode=P
ae70: 45 52 53 49 53 54 22 20 74 65 73 74 20 63 61 73  ERSIST" test cas
ae80: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31  es..#.# pager1-1
ae90: 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73 74  3.1.*: This test
aea0: 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
aeb0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20   encountered in 
aec0: 70 65 72 73 69 73 74 65 6e 74 20 0a 23 20 20 20  persistent .#   
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
aee0: 72 6e 61 6c 20 6d 6f 64 65 3a 20 49 66 20 74 68  rnal mode: If th
aef0: 65 20 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69  e journal associ
af00: 61 74 65 64 20 77 69 74 68 20 61 20 74 72 61 6e  ated with a tran
af10: 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20  saction.#       
af20: 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
af30: 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6a 6f 75  ler than the jou
af40: 72 6e 61 6c 20 66 69 6c 65 20 28 62 65 63 61 75  rnal file (becau
af50: 73 65 20 61 20 70 72 65 76 69 6f 75 73 20 0a 23  se a previous .#
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65 66 74  transaction left
af80: 20 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e 6f   a very large no
af90: 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  n-hot journal fi
afa0: 6c 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20  le in the.#     
afb0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 2d             file-
afc0: 73 79 73 74 65 6d 29 2c 20 74 68 65 6e 20 53 51  system), then SQ
afd0: 4c 69 74 65 20 68 61 73 20 74 6f 20 62 65 20 63  Lite has to be c
afe0: 61 72 65 66 75 6c 20 74 68 61 74 20 74 68 65 72  areful that ther
aff0: 65 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20  e is.#          
b000: 20 20 20 20 20 20 6e 6f 74 20 61 20 6a 6f 75 72        not a jour
b010: 6e 61 6c 2d 68 65 61 64 65 72 20 6c 65 66 74 20  nal-header left 
b020: 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 65 76  over from a prev
b030: 69 6f 75 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  ious transaction
b040: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b050: 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f    immediately fo
b060: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6a 6f 75 72  llowing the jour
b070: 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6a 75 73 74  nal content just
b080: 20 77 72 69 74 74 65 6e 2e 0a 23 20 20 20 20 20   written..#     
b090: 20 20 20 20 20 20 20 20 20 20 20 49 66 20 74 68             If th
b0a0: 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 65 20  ere is, and the 
b0b0: 70 72 6f 63 65 73 73 20 63 72 61 73 68 65 73 20  process crashes 
b0c0: 73 6f 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  so that the jour
b0d0: 6e 61 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20  nal.#           
b0e0: 20 20 20 20 20 62 65 63 6f 6d 65 73 20 61 20 68       becomes a h
b0f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d  ot-journal and m
b100: 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
b110: 63 6b 20 62 79 20 61 6e 6f 74 68 65 72 0a 23 20  ck by another.# 
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b130: 72 6f 63 65 73 73 2c 20 74 68 65 72 65 20 69 73  rocess, there is
b140: 20 61 20 64 61 6e 67 65 72 20 74 68 61 74 20 74   a danger that t
b150: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
b160: 20 6d 61 79 20 72 6f 6c 6c 0a 23 20 20 20 20 20   may roll.#     
b170: 20 20 20 20 20 20 20 20 20 20 20 62 61 63 6b 20             back 
b180: 74 68 65 20 61 62 6f 72 74 65 64 20 74 72 61 6e  the aborted tran
b190: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f  saction, then co
b1a0: 6e 74 69 6e 75 65 20 63 6f 70 79 69 6e 67 20 64  ntinue copying d
b1b0: 61 74 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  ata.#           
b1c0: 20 20 20 20 20 66 72 6f 6d 20 61 6e 20 6f 6c 64       from an old
b1d0: 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  er transaction f
b1e0: 72 6f 6d 20 74 68 65 20 72 65 6d 61 69 6e 64 65  rom the remainde
b1f0: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
b200: 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  ..#             
b210: 20 20 20 53 65 65 20 74 68 65 20 73 79 6e 63 4a     See the syncJ
b220: 6f 75 72 6e 61 6c 28 29 20 66 75 6e 63 74 69 6f  ournal() functio
b230: 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 23  n for details..#
b240: 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 2a  .# pager1-13.2.*
b250: 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 74  : Same test as t
b260: 68 65 20 70 72 65 76 69 6f 75 73 2e 20 54 68 69  he previous. Thi
b270: 73 20 74 69 6d 65 2c 20 74 68 72 6f 77 20 61 6e  s time, throw an
b280: 20 69 6e 64 65 78 20 69 6e 74 6f 0a 23 20 20 20   index into.#   
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
b2a0: 20 6d 69 78 20 74 6f 20 6d 61 6b 65 20 74 68 65   mix to make the
b2b0: 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
b2c0: 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20   more likely to 
b2d0: 63 61 74 63 68 0a 23 20 20 20 20 20 20 20 20 20  catch.#         
b2e0: 20 20 20 20 20 20 20 65 72 72 6f 72 73 2e 0a 23         errors..#
b2f0: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
b300: 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74  ault 1.tv script
b310: 20 78 53 79 6e 63 43 62 0a 74 76 20 66 69 6c 74   xSyncCb.tv filt
b320: 65 72 20 78 53 79 6e 63 0a 70 72 6f 63 20 78 53  er xSync.proc xS
b330: 79 6e 63 43 62 20 7b 6d 65 74 68 6f 64 20 66 69  yncCb {method fi
b340: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
b350: 20 73 65 74 20 74 20 5b 66 69 6c 65 20 74 61 69   set t [file tai
b360: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 69  l $filename].  i
b370: 66 20 7b 24 74 20 3d 3d 20 22 74 65 73 74 2e 64  f {$t == "test.d
b380: 62 22 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  b"} faultsim_sav
b390: 65 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e.  return SQLIT
b3a0: 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f  E_OK.}.faultsim_
b3b0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
b3c0: 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  n.db func a_stri
b3d0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 23 20 54  ng a_string..# T
b3e0: 68 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  he UPDATE statem
b3f0: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
b400: 66 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  f this test case
b410: 20 63 72 65 61 74 65 73 20 61 20 72 65 61 6c 6c   creates a reall
b420: 79 20 62 69 67 0a 23 20 6a 6f 75 72 6e 61 6c 2e  y big.# journal.
b430: 20 53 69 6e 63 65 20 74 68 65 20 63 61 63 68 65   Since the cache
b440: 2d 73 69 7a 65 20 69 73 20 6f 6e 6c 79 20 31 30  -size is only 10
b450: 20 70 61 67 65 73 2c 20 74 68 65 20 6a 6f 75 72   pages, the jour
b460: 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 0a 23 20  nal contains .# 
b470: 66 72 65 71 75 65 6e 74 20 6a 6f 75 72 6e 61 6c  frequent journal
b480: 20 68 65 61 64 65 72 73 2e 0a 23 0a 64 6f 5f 65   headers..#.do_e
b490: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
b4a0: 72 31 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 50 52  r1-13.1.1 {.  PR
b4b0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
b4c0: 20 31 30 32 34 3b 0a 20 20 50 52 41 47 4d 41 20   1024;.  PRAGMA 
b4d0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
b4e0: 45 52 53 49 53 54 3b 0a 20 20 50 52 41 47 4d 41  ERSIST;.  PRAGMA
b4f0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
b500: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43  ;.  BEGIN;.    C
b510: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
b520: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
b530: 20 4b 45 59 2c 20 62 20 42 4c 4f 42 29 3b 0a 20   KEY, b BLOB);. 
b540: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
b550: 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61  1 VALUES(NULL, a
b560: 5f 73 74 72 69 6e 67 28 34 30 30 29 29 3b 0a 20  _string(400));. 
b570: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
b580: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  1 SELECT NULL, a
b590: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
b5a0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f  M t1;          /
b5b0: 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 49 4e 53  *   2 */.    INS
b5c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
b5d0: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
b5e0: 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(400) FROM t1; 
b5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34 20           /*   4 
b600: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
b610: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
b620: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  L, a_string(400)
b630: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
b640: 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20     /*   8 */.   
b650: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
b660: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
b670: 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20  tring(400) FROM 
b680: 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t1;          /* 
b690: 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52   16 */.    INSER
b6a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
b6b0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
b6c0: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  400) FROM t1;   
b6d0: 20 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f         /*  32 */
b6e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b6f0: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
b700: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
b710: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
b720: 20 2f 2a 20 20 36 34 20 2a 2f 0a 20 20 20 20 49   /*  64 */.    I
b730: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
b740: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
b750: 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31  ing(400) FROM t1
b760: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 32  ;          /* 12
b770: 38 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20  8 */.  COMMIT;. 
b780: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
b790: 20 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29   = a_string(400)
b7a0: 3b 0a 7d 20 7b 70 65 72 73 69 73 74 7d 0a 0a 69  ;.} {persist}..i
b7b0: 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  f {$::tcl_platfo
b7c0: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77  rm(platform)!="w
b7d0: 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 52 75 6e  indows"} {.# Run
b7e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66   transactions of
b7f0: 20 69 6e 63 72 65 61 73 69 6e 67 20 73 69 7a 65   increasing size
b800: 73 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f  s. Eventually, o
b810: 6e 65 20 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e  ne (or more than
b820: 20 6f 6e 65 29 0a 23 20 6f 66 20 74 68 65 73 65   one).# of these
b830: 20 77 69 6c 6c 20 77 72 69 74 65 20 6a 75 73 74   will write just
b840: 20 65 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20   enough content 
b850: 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
b860: 6f 6c 64 20 68 65 61 64 65 72 73 20 63 72 65 61  old headers crea
b870: 74 65 64 20 0a 23 20 62 79 20 74 68 65 20 74 72  ted .# by the tr
b880: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
b890: 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65   block above lie
b8a0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  s immediately af
b8b0: 74 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  ter the content.
b8c0: 23 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20  # journalled by 
b8d0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
b8e0: 73 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b  saction..#.for {
b8f0: 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70  set nUp 1} {$nUp
b900: 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20  <64} {incr nUp} 
b910: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
b920: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e  est pager1-13.1.
b930: 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20  2.$nUp.1 { .    
b940: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
b950: 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20  = a_string(399) 
b960: 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a  WHERE a <= $nUp.
b970: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63    } {}.  do_exec
b980: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b990: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20  13.1.2.$nUp.2 { 
b9a0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
b9b0: 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a  _check } {ok} ..
b9c0: 20 20 23 20 54 72 79 20 74 6f 20 61 63 63 65 73    # Try to acces
b9d0: 73 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f  s the snapshot o
b9e0: 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
b9f0: 6d 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33  m..  #.  sqlite3
ba00: 20 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a   db2 sv_test.db.
ba10: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ba20: 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b  -13.1.2.$nUp.3 {
ba30: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
ba40: 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68  ELECT sum(length
ba50: 28 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64  (b)) FROM t1 } d
ba60: 62 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32  b2.  } [expr {12
ba70: 38 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29  8*400 - ($nUp-1)
ba80: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }].  do_test pag
ba90: 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e  er1-13.1.2.$nUp.
baa0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
bab0: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
bac0: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20  ty_check } db2. 
bad0: 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c   } {ok}.  db2 cl
bae0: 6f 73 65 0a 7d 0a 7d 0a 0a 69 66 20 7b 24 3a 3a  ose.}.}..if {$::
baf0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
bb00: 74 66 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73  tform)!="windows
bb10: 22 7d 20 7b 0a 23 20 53 61 6d 65 20 74 65 73 74  "} {.# Same test
bb20: 20 61 73 20 61 62 6f 76 65 2e 20 42 75 74 20 74   as above. But t
bb30: 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 61 6e  his time with an
bb40: 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61   index on the ta
bb50: 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ble..#.do_execsq
bb60: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
bb70: 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .2.1 {.  CREATE 
bb80: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62  INDEX i1 ON t1(b
bb90: 29 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53  );.  UPDATE t1 S
bba0: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
bbb0: 34 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b  400);.} {}.for {
bbc0: 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70  set nUp 1} {$nUp
bbd0: 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20  <64} {incr nUp} 
bbe0: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
bbf0: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
bc00: 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20  2.$nUp.1 { .    
bc10: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
bc20: 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20  = a_string(399) 
bc30: 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a  WHERE a <= $nUp.
bc40: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63    } {}.  do_exec
bc50: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
bc60: 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20  13.2.2.$nUp.2 { 
bc70: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
bc80: 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20  _check } {ok} . 
bc90: 20 73 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f   sqlite3 db2 sv_
bca0: 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73  test.db.  do_tes
bcb0: 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e  t pager1-13.2.2.
bcc0: 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65  $nUp.3 {.    exe
bcd0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75  csql { SELECT su
bce0: 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f  m(length(b)) FRO
bcf0: 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b  M t1 } db2.  } [
bd00: 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20  expr {128*400 - 
bd10: 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f  ($nUp-1)}].  do_
bd20: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32  test pager1-13.2
bd30: 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20  .2.$nUp.4 {.    
bd40: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
bd50: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
bd60: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a   } db2.  } {ok}.
bd70: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a    db2 close.}.}.
bd80: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
bd90: 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete..#----------
bda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
bde0: 23 20 54 65 73 74 20 73 70 65 63 61 6c 20 22 50  # Test specal "P
bdf0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
be00: 64 65 3d 4f 46 46 22 20 74 65 73 74 20 63 61 73  de=OFF" test cas
be10: 65 73 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64  es..#.faultsim_d
be20: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
be30: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
be40: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b   pager1-14.1.1 {
be50: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
be60: 6c 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20  l_mode = OFF;.  
be70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
be80: 61 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a  a, b);.  BEGIN;.
be90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bea0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
beb0: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c  .  COMMIT;.  SEL
bec0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d  ECT * FROM t1;.}
bed0: 20 7b 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61   {off 1 2}.do_ca
bee0: 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65  tchsql_test page
bef0: 72 31 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45  r1-14.1.2 {.  BE
bf00: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
bf10: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
bf20: 2c 20 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b  , 4);.  ROLLBACK
bf30: 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78  ;.} {0 {}}.do_ex
bf40: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
bf50: 31 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  1-14.1.3 {.  SEL
bf60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d  ECT * FROM t1;.}
bf70: 20 7b 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73   {1 2}.do_catchs
bf80: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
bf90: 34 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b  4.1.4 {.  BEGIN;
bfa0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
bfb0: 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29   t1(rowid, a, b)
bfc0: 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20   SELECT a+3, b, 
bfd0: 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  b FROM t1;.    I
bfe0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f  NSERT INTO t1(ro
bff0: 77 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43  wid, a, b) SELEC
c000: 54 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d  T a+3, b, b FROM
c010: 20 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d 41   t1;.} {1 {PRIMA
c020: 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20 75  RY KEY must be u
c030: 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65 63 73  nique}}.do_execs
c040: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c050: 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49 54  4.1.5 {.  COMMIT
c060: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
c070: 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20 32 20 32  M t1;.} {1 2 2 2
c080: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
c090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
c0d0: 54 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e 64  Test opening and
c0e0: 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67   closing the pag
c0f0: 65 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77 69  er sub-system wi
c100: 74 68 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c  th different val
c110: 75 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73 71  ues.# for the sq
c120: 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69  lite3_vfs.szOsFi
c130: 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a 66  le variable..#.f
c140: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
c150: 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65  nd_reopen.do_exe
c160: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c170: 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  -15.0 {.  CREATE
c180: 20 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29 3b   TABLE tx(y, z);
c190: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
c1a0: 78 20 56 41 4c 55 45 53 28 27 41 79 75 74 74 68  x VALUES('Ayutth
c1b0: 61 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27 29  aya', 'Beijing')
c1c0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
c1d0: 74 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64 6f  tx VALUES('Londo
c1e0: 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d 20  n', 'Tokyo');.} 
c1f0: 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 20  {}.db close.for 
c200: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35 31  {set i 0} {$i<51
c210: 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b 0a  3} {incr i 3} {.
c220: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65    testvfs tv -de
c230: 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69 6c  fault 1 -szosfil
c240: 65 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20 64  e $i.  sqlite3 d
c250: 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 65  b test.db.  do_e
c260: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
c270: 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20 20  r1-15.$i.1 {.   
c280: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
c290: 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61 79  x;.  } {Ayutthay
c2a0: 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f 6e  a Beijing London
c2b0: 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c 6f   Tokyo}.  db clo
c2c0: 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d  se.  tv delete.}
c2d0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
c2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43  ------------.# C
c320: 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20  heck that it is 
c330: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
c340: 6f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  open a database 
c350: 66 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c 6c  file if the full
c360: 20 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20 61   path.# to the a
c370: 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e 61  ssociated journa
c380: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6c  l file will be l
c390: 6f 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69 74  onger than sqlit
c3a0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
c3b0: 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20  e..#.testvfs tv 
c3c0: 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63  -default 1.tv sc
c3d0: 72 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76 20  ript xOpenCb.tv 
c3e0: 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72 6f  filter xOpen.pro
c3f0: 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68 6f  c xOpenCb {metho
c400: 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d  d filename args}
c410: 20 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c 65 5f   {.  set ::file_
c420: 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  len [string leng
c430: 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 7d 0a  th $filename].}.
c440: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
c450: 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  db.db close.tv d
c460: 65 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65 74 20  elete..for {set 
c470: 69 69 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65  ii [expr $::file
c480: 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20 3c 20  _len-5]} {$ii < 
c490: 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65  [expr $::file_le
c4a0: 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69 69 7d  n+20]} {incr ii}
c4b0: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
c4c0: 2d 64 65 66 61 75 6c 74 20 31 20 2d 6d 78 70 61  -default 1 -mxpa
c4d0: 74 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20 23 20  thname $ii..  # 
c4e0: 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  The length of th
c4f0: 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 66  e full path to f
c500: 69 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a 6f 75  ile "test.db-jou
c510: 72 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66 69 6c  rnal" is ($::fil
c520: 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20 49 66  e_len+8)..  # If
c530: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20   the configured 
c540: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
c550: 74 68 6e 61 6d 65 20 76 61 6c 75 65 20 67 72 65  thname value gre
c560: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
c570: 61 6c 20 74 6f 0a 20 20 23 20 74 68 69 73 2c 20  al to.  # this, 
c580: 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 63 61  then the file ca
c590: 6e 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f 74 68  n be opened. Oth
c5a0: 65 72 77 69 73 65 2c 20 69 74 20 63 61 6e 6e 6f  erwise, it canno
c5b0: 74 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 69 69  t..  #.  if {$ii
c5c0: 20 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c   >= [expr $::fil
c5d0: 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20 20 20  e_len+8]} {.    
c5e0: 73 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d 0a 20  set res {0 {}}. 
c5f0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65   } else {.    se
c600: 74 20 72 65 73 20 7b 31 20 7b 75 6e 61 62 6c 65  t res {1 {unable
c610: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
c620: 65 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a 20 20  e file}}.  }..  
c630: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
c640: 36 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20 6c 69  6.1.$ii {.    li
c650: 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69  st [catch { sqli
c660: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d  te3 db test.db }
c670: 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 24   msg] $msg.  } $
c680: 72 65 73 0a 0a 20 20 63 61 74 63 68 20 7b 64 62  res..  catch {db
c690: 20 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64 65 6c   close}.  tv del
c6a0: 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ete.}..#--------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6f0: 2d 0a 23 20 54 65 73 74 20 22 50 52 41 47 4d 41  -.# Test "PRAGMA
c700: 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 22 2e   omit_readlock".
c710: 20 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 31   .#.#   pager1-1
c720: 37 2e 24 74 6e 2e 31 2e 2a 3a 20 54 65 73 74 20  7.$tn.1.*: Test 
c730: 74 68 61 74 20 69 66 20 61 20 73 65 63 6f 6e 64  that if a second
c740: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
c750: 61 6e 20 6f 70 65 6e 20 0a 23 20 20 20 20 20 20  an open .#      
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
c780: 2c 20 69 74 20 69 73 20 6e 6f 74 20 75 73 75 61  , it is not usua
c790: 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  lly possible to 
c7a0: 77 72 69 74 65 20 0a 23 20 20 20 20 20 20 20 20  write .#        
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
c7c0: 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 23 20  e database..#.# 
c7d0: 20 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e    pager1-17.$tn.
c7e0: 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69  2.*: Test that i
c7f0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e  f the second con
c800: 6e 65 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  nection was open
c810: 65 64 20 77 69 74 68 0a 23 20 20 20 20 20 20 20  ed with.#       
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
c830: 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  he SQLITE_OPEN_R
c840: 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20 61 6e  EADONLY flag, an
c850: 64 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  d .#            
c860: 20 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d            "PRAGM
c870: 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20  A omit_readlock 
c880: 3d 20 31 22 20 69 73 20 65 78 65 63 75 74 65 64  = 1" is executed
c890: 20 62 65 66 6f 72 65 20 61 74 74 61 63 68 69 6e   before attachin
c8a0: 67 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  g.#             
c8b0: 20 20 20 20 20 20 20 20 20 74 68 65 20 64 61 74           the dat
c8c0: 61 62 61 73 65 20 61 6e 64 20 6f 70 65 6e 69 6e  abase and openin
c8d0: 67 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  g a read-transac
c8e0: 74 69 6f 6e 20 6f 6e 20 69 74 2c 20 69 74 20 69  tion on it, it i
c8f0: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
c900: 20 20 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c           possibl
c910: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64  e to write the d
c920: 62 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  b..#.#   pager1-
c930: 31 37 2e 24 74 6e 2e 33 2e 2a 3a 20 54 65 73 74  17.$tn.3.*: Test
c940: 20 74 68 61 74 20 69 66 20 74 68 65 20 73 65 63   that if the sec
c950: 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ond connection w
c960: 61 73 20 2a 6e 6f 74 2a 20 6f 70 65 6e 65 64 20  as *not* opened 
c970: 77 69 74 68 0a 23 20 20 20 20 20 20 20 20 20 20  with.#          
c980: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
c990: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
c9a0: 4f 4e 4c 59 20 66 6c 61 67 2c 20 65 78 65 63 75  ONLY flag, execu
c9b0: 74 69 6e 67 20 0a 23 20 20 20 20 20 20 20 20 20  ting .#         
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50 52               "PR
c9d0: 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f  AGMA omit_readlo
c9e0: 63 6b 20 3d 20 31 22 20 68 61 73 20 6e 6f 20 65  ck = 1" has no e
c9f0: 66 66 65 63 74 2e 0a 23 0a 64 6f 5f 6d 75 6c 74  ffect..#.do_mult
ca00: 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20  iclient_test tn 
ca10: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  {.  do_test page
ca20: 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 31 20 7b 0a  r1-17.$tn.1.1 {.
ca30: 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20      sql1 { .    
ca40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
ca50: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49  1(a, b);.      I
ca60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
ca70: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
ca80: 7d 0a 20 20 20 20 73 71 6c 32 20 7b 0a 20 20 20  }.    sql2 {.   
ca90: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
caa0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
cab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32  ;.    }.  } {1 2
cac0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
cad0: 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 32 20 7b 0a  r1-17.$tn.1.2 {.
cae0: 20 20 20 20 63 73 71 6c 31 20 7b 20 49 4e 53 45      csql1 { INSE
caf0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
cb00: 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 31  S(3, 4) }.  } {1
cb10: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
cb20: 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  cked}}.  do_test
cb30: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31   pager1-17.$tn.1
cb40: 2e 33 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  .3 {.    sql2 { 
cb50: 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 73 71 6c  COMMIT }.    sql
cb60: 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  1 { INSERT INTO 
cb70: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20  t1 VALUES(3, 4) 
cb80: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74  }.  } {}..  do_t
cb90: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
cba0: 6e 2e 32 2e 31 20 7b 0a 20 20 20 20 63 6f 64 65  n.2.1 {.    code
cbb0: 32 20 7b 0a 20 20 20 20 20 20 64 62 32 20 63 6c  2 {.      db2 cl
cbc0: 6f 73 65 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ose.      sqlite
cbd0: 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79 3a 20 2d  3 db2 :memory: -
cbe0: 72 65 61 64 6f 6e 6c 79 20 31 0a 20 20 20 20 7d  readonly 1.    }
cbf0: 0a 20 20 20 20 73 71 6c 32 20 7b 20 0a 20 20 20  .    sql2 { .   
cc00: 20 20 20 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72     PRAGMA omit_r
cc10: 65 61 64 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  eadlock = 1;.   
cc20: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
cc30: 64 62 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20  db' AS two;.    
cc40: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
cc50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
cc60: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20  .    }.  } {1 2 
cc70: 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  3 4}.  do_test p
cc80: 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 32  ager1-17.$tn.2.2
cc90: 20 7b 20 73 71 6c 31 20 22 49 4e 53 45 52 54 20   { sql1 "INSERT 
cca0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35  INTO t1 VALUES(5
ccb0: 2c 20 36 29 22 20 7d 20 7b 7d 0a 20 20 64 6f 5f  , 6)" } {}.  do_
ccc0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24  test pager1-17.$
ccd0: 74 6e 2e 32 2e 33 20 7b 20 73 71 6c 32 20 22 53  tn.2.3 { sql2 "S
cce0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22  ELECT * FROM t1"
ccf0: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b 31   }            {1
cd00: 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73   2 3 4}.  do_tes
cd10: 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e  t pager1-17.$tn.
cd20: 32 2e 34 20 7b 20 73 71 6c 32 20 22 43 4f 4d 4d  2.4 { sql2 "COMM
cd30: 49 54 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  IT ; SELECT * FR
cd40: 4f 4d 20 74 31 22 20 7d 20 20 20 7b 31 20 32 20  OM t1" }   {1 2 
cd50: 33 20 34 20 35 20 36 7d 0a 0a 20 20 64 6f 5f 74  3 4 5 6}..  do_t
cd60: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
cd70: 6e 2e 33 2e 31 20 7b 0a 20 20 20 20 63 6f 64 65  n.3.1 {.    code
cd80: 32 20 7b 0a 20 20 20 20 20 20 64 62 32 20 63 6c  2 {.      db2 cl
cd90: 6f 73 65 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ose.      sqlite
cda0: 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79 3a 0a 20  3 db2 :memory:. 
cdb0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20     }.    sql2 { 
cdc0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6f 6d  .      PRAGMA om
cdd0: 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 3b  it_readlock = 1;
cde0: 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74  .      ATTACH 't
cdf0: 65 73 74 2e 64 62 27 20 41 53 20 74 77 6f 3b 0a  est.db' AS two;.
ce00: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
ce10: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
ce20: 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t1;.    }.  } {
ce30: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20 64  1 2 3 4 5 6}.  d
ce40: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37  o_test pager1-17
ce50: 2e 24 74 6e 2e 33 2e 32 20 7b 0a 20 20 63 73 71  .$tn.3.2 {.  csq
ce60: 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l1 { INSERT INTO
ce70: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
ce80: 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62   }.  } {1 {datab
ce90: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
cea0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ceb0: 2d 31 37 2e 24 74 6e 2e 33 2e 33 20 7b 20 73 71  -17.$tn.3.3 { sq
cec0: 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 7d  l2 COMMIT } {}.}
ced0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
cee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
cf20: 65 73 74 20 74 68 65 20 70 61 67 65 72 73 20 72  est the pagers r
cf30: 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 62  esponse to the b
cf40: 2d 74 72 65 65 20 6c 61 79 65 72 20 72 65 71 75  -tree layer requ
cf50: 65 73 74 69 6e 67 20 69 6c 6c 65 67 61 6c 20 70  esting illegal p
cf60: 61 67 65 20 0a 23 20 6e 75 6d 62 65 72 73 3a 0a  age .# numbers:.
cf70: 23 0a 23 20 20 20 2b 20 54 68 65 20 6c 6f 63 6b  #.#   + The lock
cf80: 69 6e 67 20 70 61 67 65 2c 0a 23 20 20 20 2b 20  ing page,.#   + 
cf90: 50 61 67 65 20 30 2c 0a 23 20 20 20 2b 20 41 20  Page 0,.#   + A 
cfa0: 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
cfb0: 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
cfc0: 74 68 61 6e 20 28 32 5e 33 31 2d 31 29 2e 0a 23  than (2^31-1)..#
cfd0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
cfe0: 31 38 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  18.1 {.  faultsi
cff0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
d000: 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
d010: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
d020: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
d030: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
d040: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
d050: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
d060: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
d070: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
d080: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
d090: 73 74 72 69 6e 67 28 32 30 30 29 29 3b 0a 20 20  string(200));.  
d0a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d0b0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d0c0: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d0d0: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d0e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d0f0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d100: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d110: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d120: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d130: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d140: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d150: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d160: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d170: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d180: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d190: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d1a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d1b0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d1c0: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d1d0: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d1e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d1f0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d200: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d210: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d220: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d230: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d240: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d250: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d260: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
d270: 61 67 65 72 31 2d 31 38 2e 32 20 7b 0a 20 20 73  ager1-18.2 {.  s
d280: 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20  et root [db one 
d290: 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65  "SELECT rootpage
d2a0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
d2b0: 74 65 72 22 5d 0a 20 20 73 65 74 20 6c 6f 63 6b  ter"].  set lock
d2c0: 69 6e 67 70 61 67 65 20 5b 65 78 70 72 20 28 30  ingpage [expr (0
d2d0: 78 31 30 30 30 30 2f 31 30 32 34 29 20 2b 20 31  x10000/1024) + 1
d2e0: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ].  execsql {.  
d2f0: 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c    PRAGMA writabl
d300: 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  e_schema = 1;.  
d310: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
d320: 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70  master SET rootp
d330: 61 67 65 20 3d 20 24 6c 6f 63 6b 69 6e 67 70 61  age = $lockingpa
d340: 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
d350: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
d360: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
d370: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
d380: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t1 } db2.} {1 {d
d390: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d3a0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d3b0: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
d3c0: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 33 20  est pager1-18.3 
d3d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
d3e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
d3f0: 32 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  2(x);.    INSERT
d400: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
d410: 61 5f 73 74 72 69 6e 67 28 35 30 30 30 29 29 3b  a_string(5000));
d420: 0a 20 20 7d 0a 20 20 73 65 74 20 70 67 6e 6f 20  .  }.  set pgno 
d430: 5b 65 78 70 72 20 28 5b 66 69 6c 65 20 73 69 7a  [expr ([file siz
d440: 65 20 74 65 73 74 2e 64 62 5d 20 2f 20 31 30 32  e test.db] / 102
d450: 34 29 2d 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72  4)-2].  hexio_wr
d460: 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ite test.db [exp
d470: 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34  r ($pgno-1)*1024
d480: 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 00000000.  sql
d490: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
d4a0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d4b0: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46  LECT length(x) F
d4c0: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
d4d0: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
d4e0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
d4f0: 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  med}}.db2 close.
d500: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d510: 38 2e 34 20 7b 0a 20 20 68 65 78 69 6f 5f 77 72  8.4 {.  hexio_wr
d520: 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ite test.db [exp
d530: 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34  r ($pgno-1)*1024
d540: 5d 20 39 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 90000000.  sql
d550: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
d560: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d570: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46  LECT length(x) F
d580: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
d590: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
d5a0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
d5b0: 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  med}}.db2 close.
d5c0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d5d0: 38 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  8.5 {.  sqlite3 
d5e0: 64 62 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20  db "".  execsql 
d5f0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
d600: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
d610: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
d620: 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47  (a, b);.    PRAG
d630: 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
d640: 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41  ma = 1;.    UPDA
d650: 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TE sqlite_master
d660: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 35 20   SET rootpage=5 
d670: 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d  WHERE tbl_name =
d680: 20 27 74 31 27 3b 0a 20 20 20 20 50 52 41 47 4d   't1';.    PRAGM
d690: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
d6a0: 61 20 3d 20 30 3b 0a 20 20 20 20 41 4c 54 45 52  a = 0;.    ALTER
d6b0: 20 54 41 42 4c 45 20 74 31 20 52 45 4e 41 4d 45   TABLE t1 RENAME
d6c0: 20 54 4f 20 78 31 3b 0a 20 20 7d 0a 20 20 63 61   TO x1;.  }.  ca
d6d0: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
d6e0: 2a 20 46 52 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31  * FROM x1 }.} {1
d6f0: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
d700: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
d710: 65 64 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 64  ed}}.db close..d
d720: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38  o_test pager1-18
d730: 2e 36 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .6 {.  faultsim_
d740: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
d750: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
d760: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
d770: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
d780: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
d790: 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
d7a0: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
d7b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
d7c0: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
d7d0: 67 28 38 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  g(800));.    INS
d7e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
d7f0: 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29  ES(a_string(800)
d800: 29 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 6f  );.  }..  set ro
d810: 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45  ot [db one "SELE
d820: 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
d830: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d   sqlite_master"]
d840: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 0a 20 20 68  .  db close..  h
d850: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
d860: 64 62 20 5b 65 78 70 72 20 28 24 72 6f 6f 74 2d  db [expr ($root-
d870: 31 29 2a 31 30 32 34 20 2b 20 38 5d 20 30 30 30  1)*1024 + 8] 000
d880: 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
d890: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  db test.db.  cat
d8a0: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c  chsql { SELECT l
d8b0: 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20 74 31  ength(x) FROM t1
d8c0: 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73   }.} {1 {databas
d8d0: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
d8e0: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 0a 64 6f 5f  malformed}}..do_
d8f0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 39 2e 31  test pager1-19.1
d900: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
d910: 22 22 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  "".  db func a_s
d920: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
d930: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
d940: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
d950: 3d 20 35 31 32 3b 0a 20 20 20 20 50 52 41 47 4d  = 512;.    PRAGM
d960: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
d970: 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  1;.    CREATE TA
d980: 42 4c 45 20 74 31 28 61 61 2c 20 61 62 2c 20 61  BLE t1(aa, ab, a
d990: 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61  c, ad, ae, af, a
d9a0: 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61  g, ah, ai, aj, a
d9b0: 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20  k, al, am, an,. 
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62     ba, bb, bc, b
d9e0: 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62  d, be, bf, bg, b
d9f0: 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62  h, bi, bj, bk, b
da00: 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20  l, bm, bn,.     
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
da20: 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63  a, cb, cc, cd, c
da30: 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63  e, cf, cg, ch, c
da40: 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63  i, cj, ck, cl, c
da50: 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, cn,.         
da60: 20 20 20 20 20 20 20 20 20 20 20 64 61 2c 20 64             da, d
da70: 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64  b, dc, dd, de, d
da80: 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64  f, dg, dh, di, d
da90: 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64  j, dk, dl, dm, d
daa0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dab0: 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65         ea, eb, e
dac0: 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65  c, ed, ee, ef, e
dad0: 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65  g, eh, ei, ej, e
dae0: 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20  k, el, em, en,. 
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66     fa, fb, fc, f
db10: 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66  d, fe, ff, fg, f
db20: 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66  h, fi, fj, fk, f
db30: 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20  l, fm, fn,.     
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
db50: 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67  a, gb, gc, gd, g
db60: 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67  e, gf, gg, gh, g
db70: 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67  i, gj, gk, gl, g
db80: 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, gn,.         
db90: 20 20 20 20 20 20 20 20 20 20 20 68 61 2c 20 68             ha, h
dba0: 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68  b, hc, hd, he, h
dbb0: 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68  f, hg, hh, hi, h
dbc0: 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68  j, hk, hl, hm, h
dbd0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dbe0: 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69         ia, ib, i
dbf0: 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69  c, id, ie, if, i
dc00: 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69  g, ih, ii, ij, i
dc10: 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20  k, il, im, ix,. 
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a     ja, jb, jc, j
dc40: 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a  d, je, jf, jg, j
dc50: 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a  h, ji, jj, jk, j
dc60: 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20  l, jm, jn,.     
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
dc80: 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b  a, kb, kc, kd, k
dc90: 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b  e, kf, kg, kh, k
dca0: 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b  i, kj, kk, kl, k
dcb0: 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, kn,.         
dcc0: 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c             la, l
dcd0: 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c  b, lc, ld, le, l
dce0: 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c  f, lg, lh, li, l
dcf0: 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c  j, lk, ll, lm, l
dd00: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dd10: 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d         ma, mb, m
dd20: 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d  c, md, me, mf, m
dd30: 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d  g, mh, mi, mj, m
dd40: 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20  k, ml, mm, mn.  
dd50: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
dd60: 54 41 42 4c 45 20 74 32 28 61 61 2c 20 61 62 2c  TABLE t2(aa, ab,
dd70: 20 61 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c   ac, ad, ae, af,
dd80: 20 61 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c   ag, ah, ai, aj,
dd90: 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c   ak, al, am, an,
dda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ddb0: 20 20 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c       ba, bb, bc,
ddc0: 20 62 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c   bd, be, bf, bg,
ddd0: 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c   bh, bi, bj, bk,
dde0: 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20   bl, bm, bn,.   
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 63 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c   ca, cb, cc, cd,
de10: 20 63 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c   ce, cf, cg, ch,
de20: 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c   ci, cj, ck, cl,
de30: 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20   cm, cn,.       
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 2c               da,
de50: 20 64 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c   db, dc, dd, de,
de60: 20 64 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c   df, dg, dh, di,
de70: 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c   dj, dk, dl, dm,
de80: 20 64 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   dn,.           
de90: 20 20 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c           ea, eb,
dea0: 20 65 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c   ec, ed, ee, ef,
deb0: 20 65 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c   eg, eh, ei, ej,
dec0: 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c   ek, el, em, en,
ded0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dee0: 20 20 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c       fa, fb, fc,
def0: 20 66 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c   fd, fe, ff, fg,
df00: 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c   fh, fi, fj, fk,
df10: 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20   fl, fm, fn,.   
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 67 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c   ga, gb, gc, gd,
df40: 20 67 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c   ge, gf, gg, gh,
df50: 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c   gi, gj, gk, gl,
df60: 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20   gm, gn,.       
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 2c               ha,
df80: 20 68 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c   hb, hc, hd, he,
df90: 20 68 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c   hf, hg, hh, hi,
dfa0: 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c   hj, hk, hl, hm,
dfb0: 20 68 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   hn,.           
dfc0: 20 20 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c           ia, ib,
dfd0: 20 69 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c   ic, id, ie, if,
dfe0: 20 69 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c   ig, ih, ii, ij,
dff0: 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c   ik, il, im, ix,
e000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e010: 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c       ja, jb, jc,
e020: 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c   jd, je, jf, jg,
e030: 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c   jh, ji, jj, jk,
e040: 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20   jl, jm, jn,.   
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c   ka, kb, kc, kd,
e070: 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c   ke, kf, kg, kh,
e080: 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c   ki, kj, kk, kl,
e090: 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20   km, kn,.       
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c               la,
e0b0: 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c   lb, lc, ld, le,
e0c0: 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c   lf, lg, lh, li,
e0d0: 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c   lj, lk, ll, lm,
e0e0: 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   ln,.           
e0f0: 20 20 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c           ma, mb,
e100: 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c   mc, md, me, mf,
e110: 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c   mg, mh, mi, mj,
e120: 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a   mk, ml, mm, mn.
e130: 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52      );.    INSER
e140: 54 20 49 4e 54 4f 20 74 31 28 61 61 29 20 56 41  T INTO t1(aa) VA
e150: 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31  LUES( a_string(1
e160: 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20 49 4e  00000) );.    IN
e170: 53 45 52 54 20 49 4e 54 4f 20 74 32 28 61 61 29  SERT INTO t2(aa)
e180: 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e   VALUES( a_strin
e190: 67 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20 20  g(100000) );.   
e1a0: 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b   VACUUM;.  }.} {
e1b0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
e1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
e200: 54 65 73 74 20 61 20 63 6f 75 70 6c 65 20 6f 66  Test a couple of
e210: 20 73 70 65 63 69 61 6c 20 63 61 73 65 73 20 74   special cases t
e220: 68 61 74 20 63 6f 6d 65 20 75 70 20 77 68 69 6c  hat come up whil
e230: 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 0a 23 20  e committing .# 
e240: 74 72 61 6e 73 61 63 74 69 6f 6e 73 3a 0a 23 0a  transactions:.#.
e250: 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e 31 2e  #   pager1-20.1.
e260: 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61 6e  *: Committing an
e270: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
e280: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ase transaction 
e290: 77 68 65 6e 20 74 68 65 20 0a 23 20 20 20 20 20  when the .#     
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
e2b0: 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65  abase has not be
e2c0: 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 74 20 61  en modified at a
e2d0: 6c 6c 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  ll..#.#   pager1
e2e0: 2d 32 30 2e 32 2e 2a 3a 20 41 73 20 61 62 6f 76  -20.2.*: As abov
e2f0: 65 2c 20 62 75 74 20 77 69 74 68 20 61 20 6e 6f  e, but with a no
e300: 72 6d 61 6c 20 64 62 20 69 6e 20 65 78 63 6c 75  rmal db in exclu
e310: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
e320: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
e330: 32 30 2e 33 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69  20.3.*: Committi
e340: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
e350: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 77 68 65   in WAL mode whe
e360: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
e370: 68 61 73 0a 23 20 20 20 20 20 20 20 20 20 20 20  has.#           
e380: 20 20 20 20 20 20 20 62 65 65 6e 20 6d 6f 64 69         been modi
e390: 66 69 65 64 2c 20 62 75 74 20 61 6c 6c 20 64 69  fied, but all di
e3a0: 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20 62  rty pages have b
e3b0: 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 0a  een flushed to .
e3c0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
e3d0: 20 20 20 64 69 73 6b 20 62 65 66 6f 72 65 20 74     disk before t
e3e0: 68 65 20 63 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f  he commit..#.do_
e3f0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31  test pager1-20.1
e400: 2e 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62  .1 {.  catch {db
e410: 20 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65   close}.  sqlite
e420: 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20  3 db :memory:.  
e430: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
e440: 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74  EATE TABLE one(t
e450: 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20  wo, three);.    
e460: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20  INSERT INTO one 
e470: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
e480: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
e490: 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 32  st pager1-20.1.2
e4a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
e4b0: 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49     BEGIN EXCLUSI
e4c0: 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  VE;.    COMMIT;.
e4d0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73    }.} {}..do_tes
e4e0: 74 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 31 20  t pager1-20.2.1 
e4f0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
e500: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
e510: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
e520: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
e530: 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a  de = exclusive;.
e540: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
e550: 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73  al_mode = persis
e560: 74 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  t;.    CREATE TA
e570: 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72  BLE one(two, thr
e580: 65 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ee);.    INSERT 
e590: 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28  INTO one VALUES(
e5a0: 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d  'a', 'b');.  }.}
e5b0: 20 7b 65 78 63 6c 75 73 69 76 65 20 70 65 72 73   {exclusive pers
e5c0: 69 73 74 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ist}.do_test pag
e5d0: 65 72 31 2d 32 30 2e 32 2e 32 20 7b 0a 20 20 65  er1-20.2.2 {.  e
e5e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
e5f0: 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  IN EXCLUSIVE;.  
e600: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
e610: 7b 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 77 61  {}..ifcapable wa
e620: 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  l {.  do_test pa
e630: 67 65 72 31 2d 32 30 2e 33 2e 31 20 7b 0a 20 20  ger1-20.3.1 {.  
e640: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
e650: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20  e_and_reopen.   
e660: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
e670: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65  g a_string.    e
e680: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
e690: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
e6a0: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 50 52 41   = 10;.      PRA
e6b0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
e6c0: 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 42 45   = wal;.      BE
e6d0: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45  GIN;.        CRE
e6e0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
e6f0: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
e700: 54 41 42 4c 45 20 74 32 28 79 29 3b 0a 20 20 20  TABLE t2(y);.   
e710: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
e720: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
e730: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20  ing(800));.     
e740: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e750: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
e760: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
e770: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a          /*   2 *
e780: 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  /.        INSERT
e790: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
e7a0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
e7b0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
e7c0: 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 20  *   4 */.       
e7d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
e7e0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
e7f0: 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  800) FROM t1;   
e800: 20 20 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a        /*   8 */.
e810: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
e820: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
e830: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
e840: 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   t1;         /* 
e850: 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 49   16 */.        I
e860: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
e870: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
e880: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
e890: 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20      /*  32 */.  
e8a0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
e8b0: 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f  }.  } {wal}.  do
e8c0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e  _test pager1-20.
e8d0: 33 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  3.2 {.    execsq
e8e0: 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  l {.      BEGIN;
e8f0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
e900: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 78 78  TO t2 VALUES('xx
e910: 78 78 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xx');.    }.    
e920: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
e930: 20 33 32 20 74 31 0a 20 20 20 20 65 78 65 63 73   32 t1.    execs
e940: 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d  ql COMMIT.  } {}
e950: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
e960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
e9a0: 20 54 65 73 74 20 74 68 61 74 20 61 20 57 41 4c   Test that a WAL
e9b0: 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f   database may no
e9c0: 74 20 62 65 20 6f 70 65 6e 65 64 20 69 66 3a 0a  t be opened if:.
e9d0: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e  #.#   pager1-21.
e9e0: 31 2e 2a 3a 20 54 68 65 20 56 46 53 20 68 61 73  1.*: The VFS has
e9f0: 20 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c 65 73   an iVersion les
ea00: 73 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23 20 20  s than 2, or.#  
ea10: 20 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a 3a 20   pager1-21.2.*: 
ea20: 54 68 65 20 56 46 53 20 64 6f 65 73 20 6e 6f 74  The VFS does not
ea30: 20 70 72 6f 76 69 64 65 20 78 53 68 6d 58 58 58   provide xShmXXX
ea40: 28 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a 69 66  () methods..#.if
ea50: 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20  capable wal {.  
ea60: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
ea70: 31 2e 30 20 7b 0a 20 20 20 20 66 61 75 6c 74 73  1.0 {.    faults
ea80: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
ea90: 6f 70 65 6e 0a 20 20 20 20 65 78 65 63 73 71 6c  open.    execsql
eaa0: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
eab0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
eac0: 41 4c 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  AL;.      CREATE
ead0: 20 54 41 42 4c 45 20 6b 6f 28 63 20 44 45 46 41   TABLE ko(c DEFA
eae0: 55 4c 54 20 27 61 62 63 27 2c 20 62 20 44 45 46  ULT 'abc', b DEF
eaf0: 41 55 4c 54 20 27 64 65 66 27 29 3b 0a 20 20 20  AULT 'def');.   
eb00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b     INSERT INTO k
eb10: 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53  o DEFAULT VALUES
eb20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c  ;.    }.  } {wal
eb30: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
eb40: 72 31 2d 32 31 2e 31 20 7b 0a 20 20 20 20 74 65  r1-21.1 {.    te
eb50: 73 74 76 66 73 20 74 76 20 2d 6e 6f 73 68 6d 20  stvfs tv -noshm 
eb60: 31 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  1.    sqlite3 db
eb70: 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74  2 test.db -vfs t
eb80: 76 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  v.    catchsql {
eb90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b   SELECT * FROM k
eba0: 6f 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b  o } db2.  } {1 {
ebb0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
ebc0: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20  atabase file}}. 
ebd0: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20   db2 close.  tv 
ebe0: 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74  delete.  do_test
ebf0: 20 70 61 67 65 72 31 2d 32 31 2e 32 20 7b 0a 20   pager1-21.2 {. 
ec00: 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 69     testvfs tv -i
ec10: 76 65 72 73 69 6f 6e 20 31 0a 20 20 20 20 73 71  version 1.    sq
ec20: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
ec30: 62 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61  b -vfs tv.    ca
ec40: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
ec50: 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a  * FROM ko } db2.
ec60: 20 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74    } {1 {unable t
ec70: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
ec80: 66 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f  file}}.  db2 clo
ec90: 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d  se.  tv delete.}
eca0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
ecb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ece0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
ecf0: 65 73 74 20 74 68 61 74 20 61 20 22 50 52 41 47  est that a "PRAG
ed00: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
ed10: 74 22 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31  t":.#.#   pager1
ed20: 2d 32 32 2e 31 2e 2a 3a 20 69 73 20 61 20 6e 6f  -22.1.*: is a no
ed30: 2d 6f 70 20 6f 6e 20 61 20 6e 6f 6e 2d 57 41 4c  -op on a non-WAL
ed40: 20 64 62 2c 20 61 6e 64 0a 23 20 20 20 70 61 67   db, and.#   pag
ed50: 65 72 31 2d 32 32 2e 32 2e 2a 3a 20 64 6f 65 73  er1-22.2.*: does
ed60: 20 6e 6f 74 20 63 61 75 73 65 20 78 53 79 6e 63   not cause xSync
ed70: 20 63 61 6c 6c 73 20 77 69 74 68 20 61 20 73 79   calls with a sy
ed80: 6e 63 68 72 6f 6e 6f 75 73 3d 6f 66 66 20 64 62  nchronous=off db
ed90: 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61  ..#.ifcapable wa
eda0: 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  l {.  do_test pa
edb0: 67 65 72 31 2d 32 32 2e 31 2e 31 20 7b 0a 20 20  ger1-22.1.1 {.  
edc0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
edd0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20  e_and_reopen.   
ede0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
edf0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f   CREATE TABLE ko
ee00: 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27  (c DEFAULT 'abc'
ee10: 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66  , b DEFAULT 'def
ee20: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
ee30: 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54   INTO ko DEFAULT
ee40: 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20   VALUES;.    }. 
ee50: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41     execsql { PRA
ee60: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
ee70: 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 2d 31 20 2d  nt }.  } {0 -1 -
ee80: 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  1}.  do_test pag
ee90: 65 72 31 2d 32 32 2e 32 2e 31 20 7b 0a 20 20 20  er1-22.2.1 {.   
eea0: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
eeb0: 61 75 6c 74 20 31 0a 20 20 20 20 74 76 20 66 69  ault 1.    tv fi
eec0: 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 20 20 74  lter xSync.    t
eed0: 76 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62  v script xSyncCb
eee0: 0a 20 20 20 20 70 72 6f 63 20 78 53 79 6e 63 43  .    proc xSyncC
eef0: 62 20 7b 61 72 67 73 7d 20 7b 69 6e 63 72 20 3a  b {args} {incr :
ef00: 3a 73 79 6e 63 63 6f 75 6e 74 7d 0a 20 20 20 20  :synccount}.    
ef10: 73 65 74 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 20  set ::synccount 
ef20: 30 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  0.    sqlite3 db
ef30: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65   test.db.    exe
ef40: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
ef50: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
ef60: 3d 20 6f 66 66 3b 0a 20 20 20 20 20 20 50 52 41  = off;.      PRA
ef70: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
ef80: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 49 4e   = WAL;.      IN
ef90: 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46  SERT INTO ko DEF
efa0: 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20  AULT VALUES;.   
efb0: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
efc0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
efd0: 6b 70 6f 69 6e 74 20 7d 0a 20 20 20 20 73 65 74  kpoint }.    set
efe0: 20 73 79 6e 63 63 6f 75 6e 74 0a 20 20 7d 20 7b   synccount.  } {
eff0: 30 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  0}.  db close.  
f000: 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d  tv delete.}..#--
f010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f050: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20  -------.# Tests 
f060: 66 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a 6f 75  for changing jou
f070: 72 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20  rnal mode..#.#  
f080: 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a 3a 20   pager1-23.1.*: 
f090: 54 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 63  Test that when c
f0a0: 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50 45 52  hanging from PER
f0b0: 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 6d  SIST to DELETE m
f0c0: 6f 64 65 2c 0a 23 20 20 20 20 20 20 20 20 20 20  ode,.#          
f0d0: 20 20 20 20 20 20 20 20 74 68 65 20 6a 6f 75 72          the jour
f0e0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65  nal file is dele
f0f0: 74 65 64 2e 0a 23 0a 23 20 20 20 70 61 67 65 72  ted..#.#   pager
f100: 31 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74  1-23.2.*: Same t
f110: 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75  est as above, bu
f120: 74 20 77 68 69 6c 65 20 61 20 73 68 61 72 65 64  t while a shared
f130: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20   lock is held.# 
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
f160: 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67   file..#.#   pag
f170: 65 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d 65  er1-23.3.*: Same
f180: 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20   test as above, 
f190: 62 75 74 20 77 68 69 6c 65 20 61 20 72 65 73 65  but while a rese
f1a0: 72 76 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c  rved lock is hel
f1b0: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
f1c0: 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
f1d0: 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20  base file..#.#  
f1e0: 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a 3a 20   pager1-23.4.*: 
f1f0: 41 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20 77 68  And, for fun, wh
f200: 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65  ile holding an e
f210: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 23  xclusive lock..#
f220: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 35  .#   pager1-23.5
f230: 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 76  .*: Try to set v
f240: 61 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74  arious different
f250: 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 77   journal modes w
f260: 69 74 68 20 61 6e 0a 23 20 20 20 20 20 20 20 20  ith an.#        
f270: 20 20 20 20 20 20 20 20 20 20 69 6e 2d 6d 65 6d            in-mem
f280: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6f 6e  ory database (on
f290: 6c 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20 4f 46  ly MEMORY and OF
f2a0: 46 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a  F should work)..
f2b0: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e  #.#   pager1-23.
f2c0: 36 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20  6.*: Try to set 
f2d0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
f2e0: 6d 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d  mal on an in-mem
f2f0: 6f 72 79 20 64 61 74 61 62 61 73 65 0a 23 20 20  ory database.#  
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 28 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 2d 20  (doesn't work - 
f320: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
f330: 73 65 73 20 61 6c 77 61 79 73 20 75 73 65 0a 23  ses always use.#
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65    locking_mode=e
f360: 78 63 6c 75 73 69 76 65 29 2e 0a 23 0a 64 6f 5f  xclusive)..#.do_
f370: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31  test pager1-23.1
f380: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
f390: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
f3a0: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
f3b0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
f3c0: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
f3d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
f3e0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a  E t1(a, b);.  }.
f3f0: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
f400: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
f410: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {1}.do_test page
f420: 72 31 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 65 78  r1-23.1.2 {.  ex
f430: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a  ecsql { PRAGMA j
f440: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
f450: 4c 45 54 45 20 7d 0a 20 20 66 69 6c 65 20 65 78  LETE }.  file ex
f460: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
f470: 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74  rnal.} {0}..do_t
f480: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e  est pager1-23.2.
f490: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
f4a0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
f4b0: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
f4c0: 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  T;.    INSERT IN
f4d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 43 61  TO t1 VALUES('Ca
f4e0: 6e 62 65 72 72 61 27 2c 20 27 41 43 54 27 29 3b  nberra', 'ACT');
f4f0: 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b  .  }.  db eval {
f500: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
f510: 31 20 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61  1 } {.    db eva
f520: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
f530: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
f540: 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c   }.  }.  execsql
f550: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f560: 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65  l_mode }.} {dele
f570: 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  te}.do_test page
f580: 72 31 2d 32 33 2e 32 2e 32 20 7b 0a 20 20 66 69  r1-23.2.2 {.  fi
f590: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
f5a0: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
f5b0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f5c0: 32 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  23.3.1 {.  execs
f5d0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
f5e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
f5f0: 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45  ERSIST;.    INSE
f600: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
f610: 53 28 27 44 61 72 77 69 6e 27 2c 20 27 4e 54 27  S('Darwin', 'NT'
f620: 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d  );.    BEGIN IMM
f630: 45 44 49 41 54 45 3b 0a 20 20 7d 0a 20 20 64 62  EDIATE;.  }.  db
f640: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a   eval { PRAGMA j
f650: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
f660: 4c 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c  LETE }.  execsql
f670: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f680: 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65  l_mode }.} {dele
f690: 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  te}.do_test page
f6a0: 72 31 2d 32 33 2e 33 2e 32 20 7b 0a 20 20 66 69  r1-23.3.2 {.  fi
f6b0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
f6c0: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
f6d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f6e0: 33 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  3.3.3 {.  execsq
f6f0: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64  l COMMIT.} {}..d
f700: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f710: 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.1 {.  execsql
f720: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
f730: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
f740: 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54  SIST;.    INSERT
f750: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
f760: 27 41 64 65 6c 61 69 64 65 27 2c 20 27 53 41 27  'Adelaide', 'SA'
f770: 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43  );.    BEGIN EXC
f780: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 64 62  LUSIVE;.  }.  db
f790: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a   eval { PRAGMA j
f7a0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
f7b0: 4c 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c  LETE }.  execsql
f7c0: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f7d0: 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65  l_mode }.} {dele
f7e0: 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  te}.do_test page
f7f0: 72 31 2d 32 33 2e 34 2e 32 20 7b 0a 20 20 66 69  r1-23.4.2 {.  fi
f800: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
f810: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
f820: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f830: 33 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  3.4.3 {.  execsq
f840: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64  l COMMIT.} {}..d
f850: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f860: 2e 35 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .5.1 {.  faultsi
f870: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
f880: 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62  pen.  sqlite3 db
f890: 20 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66   :memory:.} {}.f
f8a0: 6f 72 65 61 63 68 20 7b 74 6e 20 6d 6f 64 65 20  oreach {tn mode 
f8b0: 70 6f 73 73 69 62 6c 65 7d 20 7b 0a 20 20 32 20  possible} {.  2 
f8c0: 20 6f 66 66 20 20 20 20 20 20 31 0a 20 20 33 20   off      1.  3 
f8d0: 20 6d 65 6d 6f 72 79 20 20 20 31 0a 20 20 34 20   memory   1.  4 
f8e0: 20 70 65 72 73 69 73 74 20 20 30 0a 20 20 35 20   persist  0.  5 
f8f0: 20 64 65 6c 65 74 65 20 20 20 30 0a 20 20 36 20   delete   0.  6 
f900: 20 77 61 6c 20 20 20 20 20 20 30 0a 20 20 37 20   wal      0.  7 
f910: 20 74 72 75 6e 63 61 74 65 20 30 0a 7d 20 7b 0a   truncate 0.} {.
f920: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
f930: 2d 32 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20 20  -23.5.$tn.1 {.  
f940: 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
f950: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f960: 20 6f 66 66 22 0a 20 20 20 20 65 78 65 63 73 71   off".    execsq
f970: 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  l "PRAGMA journa
f980: 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a  l_mode = $mode".
f990: 20 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c    } [if $possibl
f9a0: 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b  e {list $mode} {
f9b0: 6c 69 73 74 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f  list off}].  do_
f9c0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35  test pager1-23.5
f9d0: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65  .$tn.2 {.    exe
f9e0: 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75  csql "PRAGMA jou
f9f0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f  rnal_mode = memo
fa00: 72 79 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ry".    execsql 
fa10: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
fa20: 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20  mode = $mode".  
fa30: 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20  } [if $possible 
fa40: 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69  {list $mode} {li
fa50: 73 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f  st memory}].}.do
fa60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fa70: 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.1 {.  execsql 
fa80: 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  {PRAGMA locking_
fa90: 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d  mode = normal}.}
faa0: 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f   {exclusive}.do_
fab0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
fac0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
fad0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
fae0: 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 7d  ode = exclusive}
faf0: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64  .} {exclusive}.d
fb00: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
fb10: 2e 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .6.3 {.  execsql
fb20: 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67   {PRAGMA locking
fb30: 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73  _mode}.} {exclus
fb40: 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ive}.do_test pag
fb50: 65 72 31 2d 32 33 2e 36 2e 34 20 7b 0a 20 20 65  er1-23.6.4 {.  e
fb60: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6d  xecsql {PRAGMA m
fb70: 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ain.locking_mode
fb80: 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a  }.} {exclusive}.
fb90: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
fba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f  -----------.#.do
fbe0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e  _test pager1-24.
fbf0: 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
fc00: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
fc10: 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  en.  db func a_s
fc20: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
fc30: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
fc40: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
fc50: 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d   = 10;.    PRAGM
fc60: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
fc70: 46 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54 45  FULL;.    CREATE
fc80: 20 54 41 42 4c 45 20 78 31 28 78 2c 20 79 2c 20   TABLE x1(x, y, 
fc90: 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79  z, PRIMARY KEY(y
fca0: 2c 20 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54  , z));.    CREAT
fcb0: 45 20 54 41 42 4c 45 20 78 32 28 78 2c 20 79 2c  E TABLE x2(x, y,
fcc0: 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   z, PRIMARY KEY(
fcd0: 79 2c 20 7a 29 29 3b 0a 20 20 20 20 49 4e 53 45  y, z));.    INSE
fce0: 52 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45  RT INTO x2 VALUE
fcf0: 53 28 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c  S(a_string(400),
fd00: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
fd10: 61 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a  a_string(600));.
fd20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
fd30: 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  x2 SELECT a_stri
fd40: 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(600), a_strin
fd50: 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(400), a_string
fd60: 28 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20  (500) FROM x2;. 
fd70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
fd80: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
fd90: 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(500), a_string
fda0: 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (600), a_string(
fdb0: 34 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  400) FROM x2;.  
fdc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
fdd0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
fde0: 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
fdf0: 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  500), a_string(6
fe00: 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
fe10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
fe20: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
fe30: 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34  600), a_string(4
fe40: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30  00), a_string(50
fe50: 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
fe60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
fe70: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35  ELECT a_string(5
fe80: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
fe90: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  0), a_string(400
fea0: 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
feb0: 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
fec0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30  LECT a_string(40
fed0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
fee0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
fef0: 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
ff00: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c  SERT INTO x1 SEL
ff10: 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20  ECT * FROM x2;. 
ff20: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
ff30: 70 61 67 65 72 31 2d 32 34 2e 31 2e 32 20 7b 0a  pager1-24.1.2 {.
ff40: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
ff50: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c  BEGIN;.      DEL
ff60: 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52  ETE FROM x1 WHER
ff70: 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 7d 0a  E rowid<32;.  }.
ff80: 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65    recursive_sele
ff90: 63 74 20 36 34 20 78 32 0a 7d 20 7b 7d 0a 64 6f  ct 64 x2.} {}.do
ffa0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e  _test pager1-24.
ffb0: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
ffc0: 7b 20 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  { .      UPDATE 
ffd0: 78 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72  x1 SET z = a_str
ffe0: 69 6e 67 28 33 30 30 29 20 57 48 45 52 45 20 72  ing(300) WHERE r
fff0: 6f 77 69 64 3e 34 30 3b 0a 20 20 20 20 43 4f 4d  owid>40;.    COM
10000 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  MIT;.    PRAGMA 
10010 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
10020 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
10030 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20  t(*) FROM x1;.  
10040 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f  }.} {ok 33}..do_
10050 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
10060 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
10070 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
10080 20 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x1;.    INSERT 
10090 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a  INTO x1 SELECT *
100a0 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 42 45   FROM x2;.    BE
100b0 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  GIN;.      DELET
100c0 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20  E FROM x1 WHERE 
100d0 72 6f 77 69 64 3c 33 32 3b 0a 20 20 20 20 20 20  rowid<32;.      
100e0 55 50 44 41 54 45 20 78 31 20 53 45 54 20 7a 20  UPDATE x1 SET z 
100f0 3d 20 61 5f 73 74 72 69 6e 67 28 32 39 39 29 20  = a_string(299) 
10100 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a  WHERE rowid>40;.
10110 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f    }.  recursive_
10120 73 65 6c 65 63 74 20 36 34 20 78 32 20 7b 64 62  select 64 x2 {db
10130 20 65 76 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20 20   eval COMMIT}.  
10140 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
10150 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
10160 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54  heck;.    SELECT
10170 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78   count(*) FROM x
10180 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d  1;.  }.} {ok 33}
10190 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
101a0 2d 32 34 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63  -24.1.5 {.  exec
101b0 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
101c0 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e   FROM x1;.    IN
101d0 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c  SERT INTO x1 SEL
101e0 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20  ECT * FROM x2;. 
101f0 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73   }.  recursive_s
10200 65 6c 65 63 74 20 36 34 20 78 32 20 7b 20 64 62  elect 64 x2 { db
10210 20 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41   eval {CREATE TA
10220 42 4c 45 20 78 33 28 78 2c 20 79 2c 20 7a 29 7d  BLE x3(x, y, z)}
10230 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   }.  execsql { S
10240 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 33 20  ELECT * FROM x3 
10250 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  }.} {}..#-------
10260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102a0 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  --.#.do_test pag
102b0 65 72 31 2d 32 35 2d 31 20 7b 0a 20 20 66 61 75  er1-25-1 {.  fau
102c0 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
102d0 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
102e0 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
102f0 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61       SAVEPOINT a
10300 62 63 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  bc;.        CREA
10310 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
10320 29 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43  );.      ROLLBAC
10330 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f  K TO abc;.    CO
10340 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63  MMIT;.  }.  db c
10350 6c 6f 73 65 0a 7d 20 7b 7d 0a 62 72 65 61 6b 70  lose.} {}.breakp
10360 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20 70 61 67  oint.do_test pag
10370 65 72 31 2d 32 35 2d 32 20 7b 0a 20 20 66 61 75  er1-25-2 {.  fau
10380 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
10390 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
103a0 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  l {.    SAVEPOIN
103b0 54 20 61 62 63 3b 0a 20 20 20 20 20 20 43 52 45  T abc;.      CRE
103c0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
103d0 62 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  b);.    ROLLBACK
103e0 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d   TO abc;.    COM
103f0 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c  MIT;.  }.  db cl
10400 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  ose.} {}..#-----
10410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10450 2d 2d 2d 2d 0a 23 20 53 65 63 74 6f 72 2d 73 69  ----.# Sector-si
10460 7a 65 20 74 65 73 74 73 2e 0a 23 0a 64 6f 5f 74  ze tests..#.do_t
10470 65 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31 20  est pager1-26.1 
10480 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d  {.  testvfs tv -
10490 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 73  default 1.  tv s
104a0 65 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 20  ectorsize 4096. 
104b0 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
104c0 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62  _and_reopen.  db
104d0 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
104e0 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
104f0 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
10500 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a  age_size = 512;.
10510 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
10520 20 74 62 6c 28 61 20 50 52 49 4d 41 52 59 20 4b   tbl(a PRIMARY K
10530 45 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20  EY, b UNIQUE);. 
10540 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
10550 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
10560 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
10570 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
10580 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  0));.      INSER
10590 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
105a0 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
105b0 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
105c0 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
105d0 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
105e0 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
105f0 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10600 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
10610 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
10620 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10630 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
10640 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
10650 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10660 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72  tbl SELECT a_str
10670 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
10680 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b  g(600) FROM tbl;
10690 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
106a0 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f  TO tbl SELECT a_
106b0 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
106c0 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74  ring(600) FROM t
106d0 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bl;.      INSERT
106e0 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
106f0 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
10700 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
10710 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
10720 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
10730 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
10740 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10750 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 43 4f  FROM tbl;.    CO
10760 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  MMIT;.  }.} {}.d
10770 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
10780 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20 55  ager1-26.1 {.  U
10790 50 44 41 54 45 20 74 62 6c 20 53 45 54 20 62 20  PDATE tbl SET b 
107a0 3d 20 61 5f 73 74 72 69 6e 67 28 35 35 30 29 3b  = a_string(550);
107b0 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74  .} {}.db close.t
107c0 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d  v delete..#-----
107d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10810 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ----.#.do_test p
10820 61 67 65 72 31 2e 32 37 2e 31 20 7b 0a 20 20 66  ager1.27.1 {.  f
10830 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
10840 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69  nd_reopen.  sqli
10850 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  te3_pager_refcou
10860 6e 74 73 20 64 62 0a 20 20 65 78 65 63 73 71 6c  nts db.  execsql
10870 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
10880 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
10890 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20   t1(a, b);.  }. 
108a0 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72   sqlite3_pager_r
108b0 65 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65 78  efcounts db.  ex
108c0 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  ecsql COMMIT.} {
108d0 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
108e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
10920 54 65 73 74 20 74 68 61 74 20 61 74 74 65 6d 70  Test that attemp
10930 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20 61 20 77  ting to open a w
10940 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10950 20 77 69 74 68 20 0a 23 20 6c 6f 63 6b 69 6e 67   with .# locking
10960 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
10970 69 6e 20 57 41 4c 20 6d 6f 64 65 20 66 61 69 6c  in WAL mode fail
10980 73 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  s if there are o
10990 74 68 65 72 20 63 6c 69 65 6e 74 73 20 6f 6e 20  ther clients on 
109a0 0a 23 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  .# the same data
109b0 62 61 73 65 2e 0a 23 0a 63 61 74 63 68 20 7b 20  base..#.catch { 
109c0 64 62 20 63 6c 6f 73 65 20 7d 0a 69 66 63 61 70  db close }.ifcap
109d0 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f  able wal {.  do_
109e0 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
109f0 20 74 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73   tn {.    do_tes
10a00 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10a10 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b  1 {.      sql1 {
10a20 20 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41   .        PRAGMA
10a30 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
10a40 57 41 4c 3b 0a 20 20 20 20 20 20 20 20 43 52 45  WAL;.        CRE
10a50 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
10a60 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  b);.        INSE
10a70 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
10a80 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20  S('a', 'b');.   
10a90 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d     }.    } {wal}
10aa0 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
10ab0 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 73  er1-28.$tn.2 { s
10ac0 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
10ad0 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 61 20 62 7d  ROM t1 } } {a b}
10ae0 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  ..    do_test pa
10af0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20  ger1-28.$tn.3 { 
10b00 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f  sql1 { PRAGMA lo
10b10 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
10b20 73 69 76 65 20 7d 20 7d 20 7b 65 78 63 6c 75 73  sive } } {exclus
10b30 69 76 65 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  ive}.    do_test
10b40 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34   pager1-28.$tn.4
10b50 20 7b 20 0a 20 20 20 20 20 20 63 73 71 6c 31 20   { .      csql1 
10b60 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20  { BEGIN; INSERT 
10b70 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
10b80 63 27 2c 20 27 64 27 29 3b 20 7d 0a 20 20 20 20  c', 'd'); }.    
10b90 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
10ba0 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 20 20 63  s locked}}.    c
10bb0 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73 65  ode2 { db2 close
10bc0 20 3b 20 73 71 6c 69 74 65 33 20 64 62 32 20 74   ; sqlite3 db2 t
10bd0 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 64 6f 5f  est.db }.    do_
10be0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10bf0 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 73 71  tn.4 { .      sq
10c00 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l1 { INSERT INTO
10c10 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20   t1 VALUES('c', 
10c20 27 64 27 29 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20  'd'); COMMIT }. 
10c30 20 20 20 7d 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23     } {}.  }.}..#
10c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e 6f 72 6d  ---------.# Norm
10c90 61 6c 6c 79 2c 20 77 68 65 6e 20 63 68 61 6e 67  ally, when chang
10ca0 69 6e 67 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ing from journal
10cb0 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 74 6f  _mode=PERSIST to
10cc0 20 44 45 4c 45 54 45 20 74 68 65 20 70 61 67 65   DELETE the page
10cd0 72 0a 23 20 61 74 74 65 6d 70 74 73 20 74 6f 20  r.# attempts to 
10ce0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
10cf0 61 6c 20 66 69 6c 65 2e 20 48 6f 77 65 76 65 72  al file. However
10d00 2c 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 20 6f  , if it cannot o
10d10 62 74 61 69 6e 20 61 0a 23 20 52 45 53 45 52 56  btain a.# RESERV
10d20 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
10d30 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
10d40 69 73 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  is step is skipp
10d50 65 64 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c  ed..#.do_multicl
10d60 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20  ient_test tn {. 
10d70 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10d80 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73  28.$tn.1 {.    s
10d90 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41  ql1 { .      PRA
10da0 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
10db0 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
10dc0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
10dd0 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49  1(a, b);.      I
10de0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
10df0 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
10e00 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69      }.  } {persi
10e10 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  st}.  do_test pa
10e20 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20  ger1-28.$tn.2 { 
10e30 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
10e40 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a  .db-journal } 1.
10e50 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10e60 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31  -28.$tn.3 { sql1
10e70 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
10e80 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
10e90 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f  } } delete.  do_
10ea0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10eb0 74 6e 2e 34 20 7b 20 66 69 6c 65 20 65 78 69 73  tn.4 { file exis
10ec0 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
10ed0 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73  al } 0..  do_tes
10ee0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10ef0 35 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a  5 {.    sql1 { .
10f00 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
10f10 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
10f20 49 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  IST;.      INSER
10f30 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
10f40 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20  ('c', 'd');.    
10f50 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a  }.  } {persist}.
10f60 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10f70 2d 32 38 2e 24 74 6e 2e 36 20 7b 20 66 69 6c 65  -28.$tn.6 { file
10f80 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
10f90 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f  journal } 1.  do
10fa0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10fb0 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32  $tn.7 {.    sql2
10fc0 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54   { BEGIN; INSERT
10fd0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
10fe0 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d  'e', 'f'); }.  }
10ff0 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
11000 67 65 72 31 2d 32 38 2e 24 74 6e 2e 38 20 20 7b  ger1-28.$tn.8  {
11010 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
11020 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
11030 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11040 31 2d 32 38 2e 24 74 6e 2e 39 20 20 7b 20 73 71  1-28.$tn.9  { sq
11050 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  l1 { PRAGMA jour
11060 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
11070 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64  E } } delete.  d
11080 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11090 2e 24 74 6e 2e 31 30 20 7b 20 66 69 6c 65 20 65  .$tn.10 { file e
110a0 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
110b0 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f  urnal } 1..  do_
110c0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
110d0 74 6e 2e 31 31 20 7b 20 73 71 6c 32 20 43 4f 4d  tn.11 { sql2 COM
110e0 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  MIT } {}.  do_te
110f0 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11100 2e 31 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .12 { file exist
11110 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
11120 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 0..  do_test
11130 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31   pager1-28-$tn.1
11140 33 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b 20  3 {.    code1 { 
11150 73 65 74 20 63 68 61 6e 6e 65 6c 20 5b 64 62 20  set channel [db 
11160 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e  incrblob -readon
11170 6c 79 20 74 31 20 61 20 32 5d 20 7d 0a 20 20 20  ly t1 a 2] }.   
11180 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50 52   sql1 {.      PR
11190 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
111a0 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
111b0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
111c0 31 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68  1 VALUES('g', 'h
111d0 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70  ');.    }.  } {p
111e0 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73  ersist}.  do_tes
111f0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11200 31 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  14 { file exists
11210 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
11220 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70   } 1.  do_test p
11230 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 35 20  ager1-28.$tn.15 
11240 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47  {.    sql2 { BEG
11250 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  IN; INSERT INTO 
11260 74 31 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27  t1 VALUES('e', '
11270 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  f'); }.  } {}.  
11280 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11290 38 2e 24 74 6e 2e 31 36 20 7b 20 73 71 6c 31 20  8.$tn.16 { sql1 
112a0 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
112b0 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d  _mode = DELETE }
112c0 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74   } delete.  do_t
112d0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
112e0 6e 2e 31 37 20 7b 20 66 69 6c 65 20 65 78 69 73  n.17 { file exis
112f0 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
11300 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73  al } 1..  do_tes
11310 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11320 31 37 20 7b 20 63 73 71 6c 32 20 7b 20 43 4f 4d  17 { csql2 { COM
11330 4d 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61  MIT } } {1 {data
11340 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
11350 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11360 31 2d 32 38 2d 24 74 6e 2e 31 38 20 7b 20 63 6f  1-28-$tn.18 { co
11370 64 65 31 20 7b 20 72 65 61 64 20 24 63 68 61 6e  de1 { read $chan
11380 6e 65 6c 20 7d 20 7d 20 63 0a 20 20 64 6f 5f 74  nel } } c.  do_t
11390 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74  est pager1-28-$t
113a0 6e 2e 31 39 20 7b 20 63 6f 64 65 31 20 7b 20 63  n.19 { code1 { c
113b0 6c 6f 73 65 20 24 63 68 61 6e 6e 65 6c 20 7d 20  lose $channel } 
113c0 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
113d0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 30 20  ager1-28.$tn.20 
113e0 7b 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20  { sql2 { COMMIT 
113f0 7d 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73  } } {}.}..do_tes
11400 74 20 70 61 67 65 72 31 2d 32 39 2e 31 20 7b 0a  t pager1-29.1 {.
11410 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
11420 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
11430 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
11440 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
11450 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41  1024;.    PRAGMA
11460 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 66   auto_vacuum = f
11470 75 6c 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ull;.    PRAGMA 
11480 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
11490 6c 75 73 69 76 65 3b 0a 20 20 20 20 43 52 45 41  lusive;.    CREA
114a0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
114b0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
114c0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
114d0 32 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  2);.  }.  file s
114e0 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65  ize test.db.} [e
114f0 78 70 72 20 31 30 32 34 2a 33 5d 0a 64 6f 5f 74  xpr 1024*3].do_t
11500 65 73 74 20 70 61 67 65 72 31 2d 32 39 2e 32 20  est pager1-29.2 
11510 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
11520 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
11530 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 56  ze = 4096;.    V
11540 41 43 55 55 4d 3b 0a 20 20 7d 0a 20 20 66 69 6c  ACUUM;.  }.  fil
11550 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d  e size test.db.}
11560 20 5b 65 78 70 72 20 34 30 39 36 2a 33 5d 0a 0a   [expr 4096*3]..
11570 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
11580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
115c0 74 20 74 68 61 74 20 69 66 20 61 6e 20 65 6d 70  t that if an emp
115d0 74 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ty database file
115e0 20 28 73 69 7a 65 20 30 20 62 79 74 65 73 29 20   (size 0 bytes) 
115f0 69 73 20 6f 70 65 6e 65 64 20 69 6e 20 0a 23 20  is opened in .# 
11600 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e  exclusive-lockin
11610 67 20 6d 6f 64 65 2c 20 61 6e 79 20 6a 6f 75 72  g mode, any jour
11620 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65  nal file is dele
11630 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
11640 65 2d 73 79 73 74 65 6d 0a 23 20 77 69 74 68 6f  e-system.# witho
11650 75 74 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ut being rolled 
11660 62 61 63 6b 2e 20 41 6e 64 20 74 68 61 74 20 74  back. And that t
11670 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
11680 20 6f 62 74 61 69 6e 65 64 20 77 68 69 6c 65 0a   obtained while.
11690 23 20 64 6f 69 6e 67 20 74 68 69 73 20 69 73 20  # doing this is 
116a0 6e 6f 74 20 72 65 6c 65 61 73 65 64 2e 0a 23 0a  not released..#.
116b0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  do_test pager1-3
116c0 30 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  0.1 {.  db close
116d0 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74  .  delete_file t
116e0 65 73 74 2e 64 62 0a 20 20 64 65 6c 65 74 65 5f  est.db.  delete_
116f0 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  file test.db-jou
11700 72 6e 61 6c 0a 20 20 73 65 74 20 66 64 20 5b 6f  rnal.  set fd [o
11710 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  pen test.db-jour
11720 6e 61 6c 20 77 5d 0a 20 20 73 65 65 6b 20 24 66  nal w].  seek $f
11730 64 20 5b 65 78 70 72 20 35 31 32 2b 31 30 33 32  d [expr 512+1032
11740 2a 32 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65  *2].  puts -none
11750 77 6c 69 6e 65 20 24 66 64 20 78 0a 20 20 63 6c  wline $fd x.  cl
11760 6f 73 65 20 24 66 64 0a 0a 20 20 73 71 6c 69 74  ose $fd..  sqlit
11770 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
11780 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
11790 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
117a0 65 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  e=EXCLUSIVE;.   
117b0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
117c0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
117d0 74 65 72 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ter;.    PRAGMA 
117e0 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d  lock_status;.  }
117f0 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 30 20  .} {exclusive 0 
11800 6d 61 69 6e 20 72 65 73 65 72 76 65 64 20 74 65  main reserved te
11810 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 23 2d 2d 2d  mp closed}..#---
11820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11860 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
11870 61 74 20 69 66 20 74 68 65 20 22 70 61 67 65 2d  at if the "page-
11880 73 69 7a 65 22 20 66 69 65 6c 64 20 69 6e 20 61  size" field in a
11890 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
118a0 69 73 20 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  is 0, the journa
118b0 6c 0a 23 20 66 69 6c 65 20 63 61 6e 20 73 74 69  l.# file can sti
118c0 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
118d0 6b 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  k. This is requi
118e0 72 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64  red for backward
118f0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
11900 0a 23 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  .# versions of S
11910 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33  QLite prior to 3
11920 2e 35 2e 38 20 61 6c 77 61 79 73 20 73 65 74 20  .5.8 always set 
11930 74 68 69 73 20 66 69 65 6c 64 20 74 6f 20 7a 65  this field to ze
11940 72 6f 2e 0a 23 0a 69 66 20 7b 24 74 63 6c 5f 70  ro..#.if {$tcl_p
11950 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d  latform(platform
11960 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 64 6f 5f  )=="unix"} {.do_
11970 74 65 73 74 20 70 61 67 65 72 31 2d 33 31 2e 31  test pager1-31.1
11980 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
11990 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
119a0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
119b0 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
119c0 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47  e = 10;.    PRAG
119d0 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
119e0 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20  024;.    CREATE 
119f0 54 41 42 4c 45 20 74 31 28 78 2c 20 79 2c 20 55  TABLE t1(x, y, U
11a00 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
11a10 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11a20 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
11a30 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
11a40 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20  blob(1500));.   
11a50 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11a60 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
11a70 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11a80 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
11a90 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
11aa0 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
11ab0 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
11ac0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
11ad0 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
11ae0 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11af0 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
11b00 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
11b10 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
11b20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11b30 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
11b40 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11b50 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
11b60 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
11b70 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
11b80 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
11b90 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11ba0 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
11bb0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
11bc0 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
11bd0 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11be0 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
11bf0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11c00 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
11c10 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
11c20 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
11c30 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
11c40 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
11c50 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11c60 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
11c70 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
11c80 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11c90 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
11ca0 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11cb0 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
11cc0 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
11cd0 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
11ce0 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
11cf0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
11d00 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 47  FROM t1;.    BEG
11d10 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  IN;.      UPDATE
11d20 20 74 31 20 53 45 54 20 79 20 3d 20 72 61 6e 64   t1 SET y = rand
11d30 6f 6d 62 6c 6f 62 28 31 34 39 39 29 3b 0a 20 20  omblob(1499);.  
11d40 7d 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65  }.  copy_file te
11d50 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a 20  st.db test.db2. 
11d60 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e   copy_file test.
11d70 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e  db-journal test.
11d80 64 62 32 2d 6a 6f 75 72 6e 61 6c 0a 20 20 0a 20  db2-journal.  . 
11d90 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
11da0 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 32 34  t.db2-journal 24
11db0 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69   00000000.  sqli
11dc0 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32  te3 db2 test.db2
11dd0 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
11de0 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
11df0 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d  eck } db2.} {ok}
11e00 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
11e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
11e50 20 54 65 73 74 20 74 68 61 74 20 61 20 64 61 74   Test that a dat
11e60 61 62 61 73 65 20 66 69 6c 65 20 63 61 6e 20 62  abase file can b
11e70 65 20 22 70 72 65 2d 68 69 6e 74 65 64 22 20 74  e "pre-hinted" t
11e80 6f 20 61 20 63 65 72 74 61 69 6e 20 73 69 7a 65  o a certain size
11e90 20 61 6e 64 20 74 68 61 74 0a 23 20 73 75 62 73   and that.# subs
11ea0 65 71 75 65 6e 74 20 73 70 69 6c 6c 69 6e 67 20  equent spilling 
11eb0 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63  of the pager cac
11ec0 68 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 75  he does not resu
11ed0 6c 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  lt in the databa
11ee0 73 65 0a 23 20 66 69 6c 65 20 62 65 69 6e 67 20  se.# file being 
11ef0 73 68 72 75 6e 6b 2e 0a 23 0a 63 61 74 63 68 20  shrunk..#.catch 
11f00 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72 63 65  {db close}.force
11f10 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 0a  delete test.db..
11f20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  do_test pager1-3
11f30 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  2.1 {.  sqlite3 
11f40 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
11f50 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
11f60 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29  E TABLE t1(x, y)
11f70 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
11f80 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
11f90 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
11fa0 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
11fb0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11fc0 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d  VALUES(1, random
11fd0 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20  blob(10000));.  
11fe0 7d 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  }.  file_control
11ff0 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20  _chunksize_test 
12000 64 62 20 6d 61 69 6e 20 31 30 32 34 0a 20 20 66  db main 1024.  f
12010 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65  ile_control_size
12020 68 69 6e 74 5f 74 65 73 74 20 64 62 20 6d 61 69  hint_test db mai
12030 6e 20 32 30 39 37 31 35 32 30 3b 20 23 20 32 30  n 20971520; # 20
12040 4d 42 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  MB.  execsql {. 
12050 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
12060 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 49  size = 10;.    I
12070 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
12080 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(1, randombl
12090 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20 20  ob(10000));.    
120a0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
120b0 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62  ALUES(2, randomb
120c0 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20  lob(10000));.   
120d0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
120e0 53 45 4c 45 43 54 20 78 2b 32 2c 20 72 61 6e 64  SELECT x+2, rand
120f0 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72  omblob(10000) fr
12100 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  om t1;.    INSER
12110 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
12120 20 78 2b 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62   x+4, randomblob
12130 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b  (10000) from t1;
12140 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12150 20 74 31 20 53 45 4c 45 43 54 20 78 2b 38 2c 20   t1 SELECT x+8, 
12160 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30  randomblob(10000
12170 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49  ) from t1;.    I
12180 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
12190 4c 45 43 54 20 78 2b 31 36 2c 20 72 61 6e 64 6f  LECT x+16, rando
121a0 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f  mblob(10000) fro
121b0 6d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54  m t1;.    SELECT
121c0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
121d0 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  1;.    COMMIT;. 
121e0 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   }.  db close.  
121f0 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
12200 62 0a 7d 20 7b 32 30 39 37 31 35 32 30 7d 0a 0a  b.} {20971520}..
12210 23 20 43 6c 65 61 6e 75 70 20 32 30 4d 42 20 66  # Cleanup 20MB f
12220 69 6c 65 20 6c 65 66 74 20 62 79 20 74 68 65 20  ile left by the 
12230 70 72 65 76 69 6f 75 73 20 74 65 73 74 2e 0a 66  previous test..f
12240 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
12250 64 62 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  db..finish_test.