/ Hex Artifact Content
Login

Artifact 1e07368795dc6205a046a7a29f4455a9d5195d19:


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 64 6f 5f   delete.} {}.do_
3a90: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3aa0: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
3ab0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3ac0: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3ad0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3ae0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3af0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3b00: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3b10: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
3b20: 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75  r1.4.2.3 {.  fau
3b30: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
3b40: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
3b50: 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e  ch f [glob test.
3b60: 64 62 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20 64  db-mj*] { file d
3b70: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66 20  elete -force $f 
3b80: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3b90: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3ba0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3bb0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3bc0: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 36 34  check;.  }.} {64
3bd0: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   ok}.do_test pag
3be0: 65 72 31 2e 34 2e 32 2e 34 20 7b 0a 20 20 66 61  er1.4.2.4 {.  fa
3bf0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
3c00: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65 78 69  nd_reopen.  hexi
3c10: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d  o_write test.db-
3c20: 6a 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 5b 66  journal [expr [f
3c30: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
3c40: 2d 6a 6f 75 72 6e 61 6c 5d 2d 32 30 5d 20 31 32  -journal]-20] 12
3c50: 33 34 35 36 0a 20 20 65 78 65 63 73 71 6c 20 7b  3456.  execsql {
3c60: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
3c70: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
3c80: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
3c90: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
3ca0: 7b 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70  {4 ok}.do_test p
3cb0: 61 67 65 72 31 2e 34 2e 32 2e 35 20 7b 0a 20 20  ager1.4.2.5 {.  
3cc0: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
3cd0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65  _and_reopen.  he
3ce0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
3cf0: 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20  b-journal [expr 
3d00: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
3d10: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d 32 30 5d 20  db-journal]-20] 
3d20: 31 32 33 34 35 36 0a 20 20 66 6f 72 65 61 63 68  123456.  foreach
3d30: 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62   f [glob test.db
3d40: 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20 64 65 6c  -mj*] { file del
3d50: 65 74 65 20 2d 66 6f 72 63 65 20 24 66 20 7d 0a  ete -force $f }.
3d60: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3d70: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
3d80: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41  FROM t1;.    PRA
3d90: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
3da0: 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b  eck;.  }.} {4 ok
3db0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
3dc0: 31 2e 34 2e 33 2e 31 20 7b 0a 20 20 74 65 73 74  1.4.3.1 {.  test
3dd0: 76 66 73 20 74 73 74 76 66 73 20 2d 64 65 66 61  vfs tstvfs -defa
3de0: 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73 20 66  ult 1.  tstvfs f
3df0: 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74 73  ilter xSync.  ts
3e00: 74 76 66 73 20 73 63 72 69 70 74 20 78 53 79 6e  tvfs script xSyn
3e10: 63 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f 63  cCallback.  proc
3e20: 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 20 7b   xSyncCallback {
3e30: 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72 67 73  method file args
3e40: 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c 65  } {.    set file
3e50: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
3e60: 65 5d 0a 20 20 20 20 69 66 20 7b 20 30 3d 3d 5b  e].    if { 0==[
3e70: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f  string match *jo
3e80: 75 72 6e 61 6c 20 24 66 69 6c 65 5d 20 7d 20 7b  urnal $file] } {
3e90: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 7d   faultsim_save }
3ea0: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
3eb0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
3ec0: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3ed0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
3ee0: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
3ef0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3f00: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
3f10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3f20: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
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 33 2c 20 34 29 3b 0a 20 20 7d  ALUES(3, 4);.  }
3f50: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73  .  db close.  ts
3f60: 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d  tvfs delete.} {}
3f70: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6f 66  ..foreach {tn of
3f80: 73 74 20 76 61 6c 75 65 20 72 65 73 75 6c 74 7d  st value result}
3f90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 32 20 20   {.          2  
3fa0: 20 32 30 20 20 20 20 33 31 20 20 20 20 20 20 20   20    31       
3fb0: 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20  {1 2 3 4}.      
3fc0: 20 20 20 20 33 20 20 20 32 30 20 20 20 20 33 32      3   20    32
3fd0: 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d         {1 2 3 4}
3fe0: 0a 20 20 20 20 20 20 20 20 20 20 34 20 20 20 32  .          4   2
3ff0: 30 20 20 20 20 33 33 20 20 20 20 20 20 20 7b 31  0    33       {1
4000: 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20   2 3 4}.        
4010: 20 20 35 20 20 20 32 30 20 20 20 20 36 35 35 33    5   20    6553
4020: 36 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20  6    {1 2 3 4}. 
4030: 20 20 20 20 20 20 20 20 20 36 20 20 20 32 30 20           6   20 
4040: 20 20 20 31 33 31 30 37 32 20 20 20 7b 31 20 32     131072   {1 2
4050: 20 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20 20   3 4}..         
4060: 20 37 20 20 20 32 34 20 20 20 20 35 31 31 20 20   7   24    511  
4070: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
4080: 20 20 20 20 20 20 20 20 38 20 20 20 32 34 20 20          8   24  
4090: 20 20 35 31 33 20 20 20 20 20 20 7b 31 20 32 20    513      {1 2 
40a0: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 39  3 4}.          9
40b0: 20 20 20 32 34 20 20 20 20 31 33 31 30 37 32 20     24    131072 
40c0: 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 20    {1 2 3 4}..   
40d0: 20 20 20 20 20 20 31 30 20 20 20 33 32 20 20 20        10   32   
40e0: 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 7d 0a   65536    {1 2}.
40f0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } {.  do_test pa
4100: 67 65 72 31 2e 34 2e 33 2e 24 74 6e 20 7b 0a 20  ger1.4.3.$tn {. 
4110: 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74     faultsim_rest
4120: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
4130: 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74     hexio_write t
4140: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 24  est.db-journal $
4150: 6f 66 73 74 20 5b 66 6f 72 6d 61 74 20 25 2e 38  ofst [format %.8
4160: 78 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 65 78  x $value].    ex
4170: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
4180: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 24   FROM t1 }.  } $
4190: 72 65 73 75 6c 74 0a 7d 0a 64 62 20 63 6c 6f 73  result.}.db clos
41a0: 65 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56 46  e..# Set up a VF
41b0: 53 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 73  S that snapshots
41c0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
41d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 61 20 6d   just before a m
41e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 23 20  aster journal.# 
41f0: 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
4200: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74  to commit a mult
4210: 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
4220: 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79  on. Specifically
4230: 2c 20 74 68 65 0a 23 20 66 69 6c 65 2d 73 79 73  , the.# file-sys
4240: 74 65 6d 20 69 73 20 73 61 76 65 64 20 6a 75 73  tem is saved jus
4250: 74 20 62 65 66 6f 72 65 20 74 68 65 20 78 44 65  t before the xDe
4260: 6c 65 74 65 28 29 20 63 61 6c 6c 20 74 6f 20 72  lete() call to r
4270: 65 6d 6f 76 65 20 74 68 65 20 0a 23 20 6d 61 73  emove the .# mas
4280: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
4290: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73   from the file-s
42a0: 79 73 74 65 6d 2e 0a 23 0a 74 65 73 74 76 66 73  ystem..#.testvfs
42b0: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74   tv -default 1.t
42c0: 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e  v script copy_on
42d0: 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73 65 74 20 3a  _mj_delete.set :
42e0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e  :mj_filename_len
42f0: 67 74 68 20 30 0a 70 72 6f 63 20 63 6f 70 79 5f  gth 0.proc copy_
4300: 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d 65  on_mj_delete {me
4310: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
4320: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
4330: 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 5b  ing match *mj* [
4340: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e  file tail $filen
4350: 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73 65  ame]]} { .    se
4360: 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f  t ::mj_filename_
4370: 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67 20 6c  length [string l
4380: 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d  ength $filename]
4390: 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73 61  .    faultsim_sa
43a0: 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ve .  }.  return
43b0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 73 65   SQLITE_OK.}..se
43c0: 74 20 70 77 64 20 5b 70 77 64 5d 0a 66 6f 72 65  t pwd [pwd].fore
43d0: 61 63 68 20 7b 74 6e 31 20 74 63 6c 7d 20 7b 0a  ach {tn1 tcl} {.
43e0: 20 20 31 20 7b 20 73 65 74 20 70 72 65 66 69 78    1 { set prefix
43f0: 20 22 74 65 73 74 2e 64 62 22 20 7d 0a 20 20 32   "test.db" }.  2
4400: 20 7b 20 0a 20 20 20 20 23 20 54 68 69 73 20 74   { .    # This t
4410: 65 73 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  est depends on t
4420: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46  he underlying VF
4430: 53 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20  S being able to 
4440: 6f 70 65 6e 20 70 61 74 68 73 0a 20 20 20 20 23  open paths.    #
4450: 20 35 31 32 20 62 79 74 65 73 20 69 6e 20 6c 65   512 bytes in le
4460: 6e 67 74 68 2e 20 54 68 65 20 69 64 65 61 20 69  ngth. The idea i
4470: 73 20 74 6f 20 63 72 65 61 74 65 20 61 20 68 6f  s to create a ho
4480: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t-journal file t
4490: 68 61 74 0a 20 20 20 20 23 20 63 6f 6e 74 61 69  hat.    # contai
44a0: 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72  ns a master-jour
44b0: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20 6c  nal pointer so l
44c0: 61 72 67 65 20 74 68 61 74 20 69 74 20 63 6f 75  arge that it cou
44d0: 6c 64 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 23  ld contain.    #
44e0: 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 72 65   a valid page re
44f0: 63 6f 72 64 20 28 69 66 20 74 68 65 20 66 69 6c  cord (if the fil
4500: 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 35  e page-size is 5
4510: 31 32 20 62 79 74 65 73 29 2e 20 53 6f 20 61 73  12 bytes). So as
4520: 20 74 6f 0a 20 20 20 20 23 20 6d 61 6b 65 20 73   to.    # make s
4530: 75 72 65 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ure SQLite doesn
4540: 27 74 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  't get confused 
4550: 62 79 20 74 68 69 73 2e 0a 20 20 20 20 23 0a 20  by this..    #. 
4560: 20 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67 20     set nPadding 
4570: 5b 65 78 70 72 20 35 31 31 20 2d 20 24 3a 3a 6d  [expr 511 - $::m
4580: 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74  j_filename_lengt
4590: 68 5d 0a 20 20 20 20 69 66 20 7b 24 74 63 6c 5f  h].    if {$tcl_
45a0: 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72  platform(platfor
45b0: 6d 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b  m)=="windows"} {
45c0: 0a 20 20 20 20 20 20 23 20 54 42 44 20 6e 65 65  .      # TBD nee
45d0: 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  d to figure out 
45e0: 68 6f 77 20 74 6f 20 64 6f 20 74 68 69 73 20 63  how to do this c
45f0: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 57 69 6e  orrectly for Win
4600: 64 6f 77 73 21 21 21 0a 20 20 20 20 20 20 73 65  dows!!!.      se
4610: 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72  t nPadding [expr
4620: 20 32 35 35 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c   255 - $::mj_fil
4630: 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20  ename_length].  
4640: 20 20 7d 0a 0a 20 20 20 20 23 20 57 65 20 63 61    }..    # We ca
4650: 6e 6e 6f 74 20 6a 75 73 74 20 63 72 65 61 74 65  nnot just create
4660: 20 61 20 72 65 61 6c 6c 79 20 6c 6f 6e 67 20 64   a really long d
4670: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
4680: 65 20 74 6f 20 6f 70 65 6e 2c 20 61 73 0a 20 20  e to open, as.  
4690: 20 20 23 20 4c 69 6e 75 78 20 6c 69 6d 69 74 73    # Linux limits
46a0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70 6f 6e   a single compon
46b0: 65 6e 74 20 6f 66 20 61 20 70 61 74 68 20 74 6f  ent of a path to
46c0: 20 32 35 35 20 62 79 74 65 73 20 62 79 20 64 65   255 bytes by de
46d0: 66 61 75 6c 74 0a 20 20 20 20 23 20 28 61 6e 64  fault.    # (and
46e0: 20 70 72 65 73 75 6d 61 62 6c 79 20 6f 74 68 65   presumably othe
46f0: 72 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 6c  r systems have l
4700: 69 6d 69 74 73 20 74 6f 6f 29 2e 20 53 6f 20 63  imits too). So c
4710: 72 65 61 74 65 20 61 20 64 69 72 65 63 74 6f 72  reate a director
4720: 79 0a 20 20 20 20 23 20 68 69 65 72 61 72 63 68  y.    # hierarch
4730: 79 20 74 6f 20 77 6f 72 6b 20 69 6e 2e 0a 20 20  y to work in..  
4740: 20 20 23 0a 20 20 20 20 73 65 74 20 64 69 72 6e    #.    set dirn
4750: 61 6d 65 20 22 64 31 32 33 34 35 36 37 38 39 30  ame "d1234567890
4760: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
4770: 37 38 39 30 2f 22 0a 20 20 20 20 73 65 74 20 6e  7890/".    set n
4780: 44 69 72 20 5b 65 78 70 72 20 24 6e 50 61 64 64  Dir [expr $nPadd
4790: 69 6e 67 20 2f 20 33 32 5d 0a 20 20 20 20 69 66  ing / 32].    if
47a0: 20 7b 20 24 6e 44 69 72 20 7d 20 7b 0a 20 20 20   { $nDir } {.   
47b0: 20 20 20 73 65 74 20 70 20 5b 73 74 72 69 6e 67     set p [string
47c0: 20 72 65 70 65 61 74 20 24 64 69 72 6e 61 6d 65   repeat $dirname
47d0: 20 24 6e 44 69 72 5d 0a 20 20 20 20 20 20 66 69   $nDir].      fi
47e0: 6c 65 20 6d 6b 64 69 72 20 24 70 0a 20 20 20 20  le mkdir $p.    
47f0: 20 20 63 64 20 24 70 0a 20 20 20 20 7d 0a 0a 20    cd $p.    }.. 
4800: 20 20 20 73 65 74 20 70 61 64 64 69 6e 67 20 5b     set padding [
4810: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78 20  string repeat x 
4820: 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20  [expr $nPadding 
4830: 25 33 32 5d 5d 0a 20 20 20 20 73 65 74 20 70 72  %32]].    set pr
4840: 65 66 69 78 20 22 74 65 73 74 2e 64 62 24 7b 70  efix "test.db${p
4850: 61 64 64 69 6e 67 7d 22 0a 20 20 7d 0a 7d 20 7b  adding}".  }.} {
4860: 0a 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20 66  .  eval $tcl.  f
4870: 6f 72 65 61 63 68 20 7b 74 6e 32 20 73 71 6c 7d  oreach {tn2 sql}
4880: 20 7b 0a 20 20 20 20 6f 20 7b 20 0a 20 20 20 20   {.    o { .    
4890: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
48a0: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20  nchronous=OFF;. 
48b0: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
48c0: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b  synchronous=OFF;
48d0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
48e0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
48f0: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ETE;.    }.    o
4900: 35 31 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41  512 { .      PRA
4910: 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f  GMA main.synchro
4920: 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20  nous=OFF;.      
4930: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
4940: 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20  ronous=OFF;.    
4950: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61    PRAGMA main.pa
4960: 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
4970: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
4980: 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b  page_size = 512;
4990: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
49a0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
49b0: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ETE;.    }.    n
49c0: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
49d0: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
49e0: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
49f0: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
4a00: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
4a10: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
4a20: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
4a30: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 20 7b  E;.    }.    f {
4a40: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d   .      PRAGMA m
4a50: 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ain.synchronous=
4a60: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41 47  FULL;.      PRAG
4a70: 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f  MA aux.synchrono
4a80: 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50  us=FULL;.      P
4a90: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4aa0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4ab0: 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 73 65   }.  } {..    se
4ac0: 74 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24 7b 74  t tn "${tn1}.${t
4ad0: 6e 32 7d 22 0a 20 20 0a 20 20 20 20 23 20 53 65  n2}".  .    # Se
4ae0: 74 20 75 70 20 61 20 63 6f 6e 6e 65 63 74 69 6f  t up a connectio
4af0: 6e 20 74 6f 20 68 61 76 65 20 74 77 6f 20 64 61  n to have two da
4b00: 74 61 62 61 73 65 73 2c 20 74 65 73 74 2e 64 62  tabases, test.db
4b10: 20 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20 20 20   (main) and .   
4b20: 20 23 20 74 65 73 74 2e 64 62 32 20 28 61 75 78   # test.db2 (aux
4b30: 29 2e 20 54 68 65 6e 20 72 75 6e 20 61 20 6d 75  ). Then run a mu
4b40: 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
4b50: 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20 54 68  tion on them. Th
4b60: 65 0a 20 20 20 20 23 20 56 46 53 20 77 69 6c 6c  e.    # VFS will
4b70: 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   snapshot the fi
4b80: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
4b90: 65 66 6f 72 65 20 74 68 65 20 6d 61 73 74 65 72  efore the master
4ba0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23 20 66  -journal.    # f
4bb0: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 74  ile is deleted t
4bc0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
4bd0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 23 0a  nsaction..    #.
4be0: 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 78 44      tv filter xD
4bf0: 65 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74 65 73  elete.    do_tes
4c00: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
4c10: 2e 31 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74  .1 {.      fault
4c20: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
4c30: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
4c40: 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
4c50: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 24 7b        ATTACH '${
4c60: 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78  prefix}2' AS aux
4c70: 3b 0a 20 20 20 20 20 20 20 20 24 73 71 6c 0a 20  ;.        $sql. 
4c80: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
4c90: 42 4c 45 20 61 28 78 29 3b 0a 20 20 20 20 20 20  BLE a(x);.      
4ca0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
4cb0: 75 78 2e 62 28 78 29 3b 0a 20 20 20 20 20 20 20  ux.b(x);.       
4cc0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56   INSERT INTO a V
4cd0: 41 4c 55 45 53 28 27 64 6f 75 62 6c 65 2d 79 6f  ALUES('double-yo
4ce0: 75 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  u');.        INS
4cf0: 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45  ERT INTO a VALUE
4d00: 53 28 27 77 68 79 27 29 3b 0a 20 20 20 20 20 20  S('why');.      
4d10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20    INSERT INTO a 
4d20: 56 41 4c 55 45 53 28 27 7a 65 64 27 29 3b 0a 20  VALUES('zed');. 
4d30: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4d40: 54 4f 20 62 20 56 41 4c 55 45 53 28 27 77 6f 6e  TO b VALUES('won
4d50: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
4d60: 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53  RT INTO b VALUES
4d70: 28 27 74 6f 6f 27 29 3b 0a 20 20 20 20 20 20 20  ('too');.       
4d80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56   INSERT INTO b V
4d90: 41 4c 55 45 53 28 27 66 72 65 65 27 29 3b 0a 20  ALUES('free');. 
4da0: 20 20 20 20 20 22 0a 20 20 20 20 20 20 65 78 65       ".      exe
4db0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 42  csql {.        B
4dc0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  EGIN;.          
4dd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 53 45  INSERT INTO a SE
4de0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 20 57 48  LECT * FROM b WH
4df0: 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20  ERE rowid<=3;.  
4e00: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4e10: 4e 54 4f 20 62 20 53 45 4c 45 43 54 20 2a 20 46  NTO b SELECT * F
4e20: 52 4f 4d 20 61 20 57 48 45 52 45 20 72 6f 77 69  ROM a WHERE rowi
4e30: 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 43 4f  d<=3;.        CO
4e40: 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  MMIT;.      }.  
4e50: 20 20 7d 20 7b 7d 0a 20 20 20 20 74 76 20 66 69    } {}.    tv fi
4e60: 6c 74 65 72 20 7b 7d 0a 20 20 20 20 0a 20 20 20  lter {}.    .   
4e70: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68   # Check that th
4e80: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
4e90: 73 20 63 6f 6d 6d 69 74 74 65 64 20 73 75 63 63  s committed succ
4ea0: 65 73 73 66 75 6c 6c 79 2e 0a 20 20 20 20 23 0a  essfully..    #.
4eb0: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
4ec0: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
4ed0: 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 53 45 4c  tn.2 {.      SEL
4ee0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20  ECT * FROM a.   
4ef0: 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77   } {double-you w
4f00: 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66  hy zed won too f
4f10: 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63  ree}.    do_exec
4f20: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
4f30: 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  4.4.$tn.3 {.    
4f40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4f50: 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f  b.    } {won too
4f60: 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75   free double-you
4f70: 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 0a 20   why zed}.    . 
4f80: 20 20 20 23 20 52 65 73 74 6f 72 65 20 74 68 65     # Restore the
4f90: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64   file-system and
4fa0: 20 72 65 6f 70 65 6e 20 74 68 65 20 64 61 74 61   reopen the data
4fb0: 62 61 73 65 73 2e 20 43 68 65 63 6b 20 74 68 61  bases. Check tha
4fc0: 74 20 69 74 20 6e 6f 77 0a 20 20 20 20 23 20 61  t it now.    # a
4fd0: 70 70 65 61 72 73 20 74 68 61 74 20 74 68 65 20  ppears that the 
4fe0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
4ff0: 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 20 28 62  not committed (b
5000: 65 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 2d  ecause the file-
5010: 73 79 73 74 65 6d 0a 20 20 20 20 23 20 77 61 73  system.    # was
5020: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68 65   restored to the
5030: 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
5040: 68 61 64 20 6e 6f 74 20 62 65 65 6e 29 2e 0a 20  had not been).. 
5050: 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74     #.    do_test
5060: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5070: 34 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73  4 {.      faults
5080: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5090: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
50a0: 20 20 20 20 65 78 65 63 73 71 6c 20 22 41 54 54      execsql "ATT
50b0: 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32 27  ACH '${prefix}2'
50c0: 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20 7b   AS aux".    } {
50d0: 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c  }.    do_execsql
50e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
50f0: 2e 24 74 6e 2e 35 20 7b 53 45 4c 45 43 54 20 2a  .$tn.5 {SELECT *
5100: 20 46 52 4f 4d 20 61 7d 20 7b 64 6f 75 62 6c 65   FROM a} {double
5110: 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20  -you why zed}.  
5120: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
5130: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
5140: 2e 36 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  .6 {SELECT * FRO
5150: 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72  M b} {won too fr
5160: 65 65 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52  ee}.    .    # R
5170: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5180: 73 79 73 74 65 6d 20 61 67 61 69 6e 2e 20 54 68  system again. Th
5190: 69 73 20 74 69 6d 65 2c 20 62 65 66 6f 72 65 20  is time, before 
51a0: 72 65 6f 70 65 6e 69 6e 67 20 74 68 65 20 64 61  reopening the da
51b0: 74 61 62 61 73 65 73 2c 0a 20 20 20 20 23 20 64  tabases,.    # d
51c0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
51d0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72  -journal file fr
51e0: 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  om the file-syst
51f0: 65 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70 65 61  em. It now appea
5200: 72 73 20 74 68 61 74 0a 20 20 20 20 23 20 74 68  rs that.    # th
5210: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
5220: 73 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e 6f 20  s committed (no 
5230: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
5240: 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c 62 61  ile == no rollba
5250: 63 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20 20 64  ck)..    #.    d
5260: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  o_test pager1-4.
5270: 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 20 20  4.$tn.7 {.      
5280: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
5290: 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 65  _and_reopen $pre
52a0: 66 69 78 0a 20 20 20 20 20 20 66 6f 72 65 61 63  fix.      foreac
52b0: 68 20 66 20 5b 67 6c 6f 62 20 24 7b 70 72 65 66  h f [glob ${pref
52c0: 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20  ix}-mj*] { file 
52d0: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66  delete -force $f
52e0: 20 7d 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   }.      execsql
52f0: 20 22 41 54 54 41 43 48 20 27 24 7b 70 72 65 66   "ATTACH '${pref
5300: 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a 20 20  ix}2' AS aux".  
5310: 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f 65 78    } {}.    do_ex
5320: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
5330: 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b 0a 20 20  1-4.4.$tn.8 {.  
5340: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
5350: 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62 6c  M a.    } {doubl
5360: 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77 6f  e-you why zed wo
5370: 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20  n too free}.    
5380: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5390: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 39  pager1-4.4.$tn.9
53a0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
53b0: 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20 7b  * FROM b.    } {
53c0: 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f 75  won too free dou
53d0: 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d  ble-you why zed}
53e0: 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70 77 64 0a  .  }..  cd $pwd.
53f0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  }.db close.tv de
5400: 6c 65 74 65 0a 66 69 6c 65 20 64 65 6c 65 74 65  lete.file delete
5410: 20 2d 66 6f 72 63 65 20 24 64 69 72 6e 61 6d 65   -force $dirname
5420: 0a 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56 46  ...# Set up a VF
5430: 53 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  S to make a copy
5440: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
5450: 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20  tem just before 
5460: 64 65 6c 65 74 69 6e 67 20 61 0a 23 20 6a 6f 75  deleting a.# jou
5470: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 63 6f 6d  rnal file to com
5480: 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
5490: 6e 2e 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  n. The transacti
54a0: 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65 78 61 63  on modifies exac
54b0: 74 6c 79 0a 23 20 74 77 6f 20 64 61 74 61 62 61  tly.# two databa
54c0: 73 65 20 70 61 67 65 73 20 28 61 6e 64 20 70 61  se pages (and pa
54d0: 67 65 20 31 20 2d 20 74 68 65 20 63 68 61 6e 67  ge 1 - the chang
54e0: 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23 0a 74 65  e counter)..#.te
54f0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
5500: 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a  t 1.tv sectorsiz
5510: 65 20 35 31 32 0a 74 76 20 73 63 72 69 70 74 20  e 512.tv script 
5520: 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f  copy_on_journal_
5530: 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72  delete.tv filter
5540: 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f   xDelete.proc co
5550: 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65  py_on_journal_de
5560: 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c  lete {method fil
5570: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
5580: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
5590: 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65  h *journal $file
55a0: 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f  name]} faultsim_
55b0: 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53  save .  return S
55c0: 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74  QLITE_OK.}.fault
55d0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
55e0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
55f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5600: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f  .1 {.  PRAGMA jo
5610: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
5620: 45 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 70 61  ETE;.  PRAGMA pa
5630: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
5640: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
5650: 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54  1(a, b);.  CREAT
5660: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
5670: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
5680: 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27  t1 VALUES('I', '
5690: 49 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  II');.  INSERT I
56a0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 49  NTO t2 VALUES('I
56b0: 49 49 27 2c 20 27 49 56 27 29 3b 0a 20 20 42 45  II', 'IV');.  BE
56c0: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
56d0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
56e0: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
56f0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
5700: 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b  3, 4);.  COMMIT;
5710: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20 66  .} {delete}.tv f
5720: 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65 63  ilter {}..# Chec
5730: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
5740: 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 3a  n was committed:
5750: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
5760: 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32 20  st pager1.4.5.2 
5770: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
5780: 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a  M t1;.  SELECT *
5790: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49   FROM t2;.} {I I
57a0: 49 20 31 20 32 20 49 49 49 20 49 56 20 33 20 34  I 1 2 III IV 3 4
57b0: 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f 75  }..# Now try fou
57c0: 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70 61  r tests:.#.#  pa
57d0: 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73 74  ger1-4.5.3: Rest
57e0: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
57f0: 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74 20  tem. Check that 
5800: 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
5810: 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20 20  ction .#        
5820: 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c 65          is rolle
5830: 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67  d back..#.#  pag
5840: 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74 6f  er1-4.5.4: Resto
5850: 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  re the file-syst
5860: 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20  em. Corrupt the 
5870: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
5880: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
5890: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68       journal. Ch
58a0: 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  eck the transact
58b0: 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c 65  ion is not rolle
58c0: 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67  d back..#.#  pag
58d0: 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74 6f  er1-4.5.5: Resto
58e0: 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  re the file-syst
58f0: 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20  em. Corrupt the 
5900: 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69 6e  second record in
5910: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
5920: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43        journal. C
5930: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66 69  heck that the fi
5940: 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68  rst record in th
5950: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
5960: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
5970: 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20     played back, 
5980: 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63 6f  but not the seco
5990: 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  nd..#.#  pager1-
59a0: 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20 74  4.5.6: Restore t
59b0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
59c0: 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  Try to open the 
59d0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 0a  database with a.
59e0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
59f0: 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65 63   readonly connec
5a00: 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c  tion. This shoul
5a10: 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65 61  d fail, as a rea
5a20: 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20 20  d-only.#        
5a30: 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
5a40: 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20 62  on cannot roll b
5a50: 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
5a60: 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69   file..#.faultsi
5a70: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
5a80: 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  open.do_execsql_
5a90: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
5aa0: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  3 {.  SELECT * F
5ab0: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
5ac0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49   * FROM t2;.} {I
5ad0: 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75 6c   II III IV}.faul
5ae0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5af0: 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 72  _reopen.hexio_wr
5b00: 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ite test.db-jour
5b10: 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 2b  nal [expr 512+4+
5b20: 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32 33  1024 - 202] 0123
5b30: 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f 5f  456789ABCDEF.do_
5b40: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
5b50: 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53 45  er1.4.5.4 {.  SE
5b60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
5b70: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5b80: 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 20  t2;.} {I II 1 2 
5b90: 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75 6c  III IV 3 4}.faul
5ba0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5bb0: 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 72  _reopen.hexio_wr
5bc0: 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ite test.db-jour
5bd0: 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 2b  nal [expr 512+4+
5be0: 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d 20  1024+4+4+1024 - 
5bf0: 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39 41  202] 0123456789A
5c00: 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71 6c  BCDEF.do_execsql
5c10: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5c20: 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .5 {.  SELECT * 
5c30: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
5c40: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
5c50: 49 20 49 49 20 49 49 49 20 49 56 20 33 20 34 7d  I II III IV 3 4}
5c60: 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f  ..faultsim_resto
5c70: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62  re_and_reopen.db
5c80: 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64   close.sqlite3 d
5c90: 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f  b test.db -reado
5ca0: 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73 71  nly 1.do_catchsq
5cb0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5cc0: 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.6 {.  SELECT *
5cd0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5ce0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5cf0: 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72  {1 {disk I/O err
5d00: 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 23  or}}.db close..#
5d10: 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   Snapshot the fi
5d20: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
5d30: 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69 6c 65  efore multi-file
5d40: 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20 74 68   commit. Save th
5d50: 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68 65 20  e name.# of the 
5d60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5d70: 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66 69 6c  ile in $::mj_fil
5d80: 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63 72 69  ename..#.tv scri
5d90: 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65  pt copy_on_mj_de
5da0: 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78  lete.tv filter x
5db0: 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79  Delete.proc copy
5dc0: 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d  _on_mj_delete {m
5dd0: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
5de0: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
5df0: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20  ring match *mj* 
5e00: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
5e10: 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73  name]]} { .    s
5e20: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
5e30: 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 66   $filename.    f
5e40: 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20  aultsim_save .  
5e50: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5e60: 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20 70  E_OK.}.do_test p
5e70: 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a 20 20  ager1.4.6.1 {.  
5e80: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
5e90: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
5ea0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
5eb0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
5ec0: 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 41 54 54   DELETE;.    ATT
5ed0: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
5ee0: 53 20 74 77 6f 3b 0a 20 20 20 20 43 52 45 41 54  S two;.    CREAT
5ef0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
5f00: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
5f10: 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20 62 29 3b  LE two.t2(a, b);
5f20: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5f30: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 74   t1 VALUES(1, 't
5f40: 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  1.1');.    INSER
5f50: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5f60: 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20 20 20  (1, 't2.1');.   
5f70: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
5f80: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
5f90: 27 74 31 2e 32 27 3b 0a 20 20 20 20 20 20 55 50  't1.2';.      UP
5fa0: 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20  DATE t2 SET b = 
5fb0: 27 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f 4d 4d  't2.2';.    COMM
5fc0: 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66 69 6c  IT;.  }.  tv fil
5fd0: 74 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c 6f 73  ter {}.  db clos
5fe0: 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73 69 6d  e.} {}..faultsim
5ff0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
6000: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
6010: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 32  est pager1.4.6.2
6020: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
6030: 20 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20   t1 }           
6040: 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74  {1 t1.1}.do_test
6050: 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e           pager1.
6060: 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65 78 69  4.6.3 { file exi
6070: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6080: 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63  me } {1}.do_exec
6090: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
60a0: 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41 43 48  4.6.4 {.  ATTACH
60b0: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74   'test.db2' AS t
60c0: 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  wo;.  SELECT * F
60d0: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e  ROM t2;.} {1 t2.
60e0: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
60f0: 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65 20 65  1.4.6.5 { file e
6100: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6110: 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61 75 6c  name } {0}..faul
6120: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
6130: 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65  _reopen.db close
6140: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
6150: 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20 3a 3a  4.6.8 {.  set ::
6160: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24 3a 3a  mj_filename1 $::
6170: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20 74 76  mj_filename.  tv
6180: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
6190: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
61a0: 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20  t.db2.  execsql 
61b0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
61c0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
61d0: 54 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27  TE;.    ATTACH '
61e0: 74 65 73 74 2e 64 62 33 27 20 41 53 20 74 68 72  test.db3' AS thr
61f0: 65 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ee;.    CREATE T
6200: 41 42 4c 45 20 74 68 72 65 65 2e 74 33 28 61 2c  ABLE three.t3(a,
6210: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
6220: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31  INTO t3 VALUES(1
6230: 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20 20 20 42  , 't3.1');.    B
6240: 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41  EGIN;.      UPDA
6250: 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27 74  TE t2 SET b = 't
6260: 32 2e 33 27 3b 0a 20 20 20 20 20 20 55 50 44 41  2.3';.      UPDA
6270: 54 45 20 74 33 20 53 45 54 20 62 20 3d 20 27 74  TE t3 SET b = 't
6280: 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  3.3';.    COMMIT
6290: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a  ;.  }.  expr {$:
62a0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 21 3d  :mj_filename1 !=
62b0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 7d   $::mj_filename}
62c0: 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73 69 6d 5f  .} {1}.faultsim_
62d0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
62e0: 65 6e 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a  en.tv filter {}.
62f0: 0a 23 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74  .# The file-syst
6300: 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 3a  em now contains:
6310: 0a 23 0a 23 20 20 20 2a 20 74 68 72 65 65 20 64  .#.#   * three d
6320: 61 74 61 62 61 73 65 73 0a 23 20 20 20 2a 20 74  atabases.#   * t
6330: 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  hree hot-journal
6340: 20 66 69 6c 65 73 0a 23 20 20 20 2a 20 74 77 6f   files.#   * two
6350: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6360: 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68 65 20 68  files..#.# The h
6370: 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61 73 73 6f  ot-journals asso
6380: 63 69 61 74 65 64 20 77 69 74 68 20 74 65 73 74  ciated with test
6390: 2e 64 62 32 20 61 6e 64 20 74 65 73 74 2e 64 62  .db2 and test.db
63a0: 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20 6d 61 73  3 point to.# mas
63b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d  ter journal $::m
63c0: 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54 68 65 20  j_filename. The 
63d0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
63e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
63f0: 0a 23 20 74 65 73 74 2e 64 62 20 70 6f 69 6e 74  .# test.db point
6400: 73 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s to master jour
6410: 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  nal $::mj_filena
6420: 6d 65 31 2e 20 53 6f 20 72 65 61 64 69 6e 67 20  me1. So reading 
6430: 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64 62 20 73  from.# test.db s
6440: 68 6f 75 6c 64 20 64 65 6c 65 74 65 20 24 3a 3a  hould delete $::
6450: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a  mj_filename1..#.
6460: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
6470: 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72 74 20 5b  .6.9 {.  lsort [
6480: 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d 0a 7d  glob test.db*].}
6490: 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74 20 20 20   [lsort [list   
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 74 65 73 74          \.  test
64d0: 2e 64 62 20 74 65 73 74 2e 64 62 32 20 74 65 73  .db test.db2 tes
64e0: 74 2e 64 62 33 20 20 20 20 20 20 20 20 20 20 20  t.db3           
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6500: 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 2d 6a     \.  test.db-j
6510: 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d  ournal test.db2-
6520: 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 33  journal test.db3
6530: 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20 5c 0a  -journal      \.
6540: 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a    [file tail $::
6550: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b 66 69  mj_filename] [fi
6560: 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69  le tail $::mj_fi
6570: 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23 20 54  lename1].]]..# T
6580: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
6590: 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  l $::mj_filename
65a0: 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  1 contains point
65b0: 65 72 73 20 74 6f 20 74 65 73 74 2e 64 62 20 61  ers to test.db a
65c0: 6e 64 20 0a 23 20 74 65 73 74 2e 64 62 32 2e 20  nd .# test.db2. 
65d0: 48 6f 77 65 76 65 72 20 74 68 65 20 68 6f 74 2d  However the hot-
65e0: 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61 74  journal associat
65f0: 65 64 20 77 69 74 68 20 74 65 73 74 2e 64 62 32  ed with test.db2
6600: 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20 61 20 64   points to.# a d
6610: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 2d  ifferent master-
6620: 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72 65 66 6f  journal. Therefo
6630: 72 65 2c 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  re, reading from
6640: 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79 20 73 68   test.db only sh
6650: 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f 75 67 68  ould.# be enough
6660: 20 74 6f 20 63 61 75 73 65 20 53 51 4c 69 74 65   to cause SQLite
6670: 20 74 6f 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a   to delete $::mj
6680: 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f  _filename1..#.do
6690: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
66a0: 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b 20 66 69  ger1.4.6.10 { fi
66b0: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
66c0: 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a  filename  } {1}.
66d0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
66e0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 31 20 7b 20  pager1.4.6.11 { 
66f0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6700: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 31  j_filename1 } {1
6710: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
6720: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20  t pager1.4.6.12 
6730: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6740: 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d 0a 64 6f  t1 } {1 t1.1}.do
6750: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
6760: 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69  ger1.4.6.13 { fi
6770: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
6780: 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a  filename  } {1}.
6790: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
67a0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b 20  pager1.4.6.14 { 
67b0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
67c0: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 30  j_filename1 } {0
67d0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
67e0: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32  st pager1.4.6.12
67f0: 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73   {.  ATTACH 'tes
6800: 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20  t.db2' AS two;. 
6810: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6820: 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f  2;.} {1 t2.1}.do
6830: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
6840: 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69  ger1.4.6.13 { fi
6850: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
6860: 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 31 7d 0a  filename }  {1}.
6870: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6880: 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b 0a  pager1.4.6.14 {.
6890: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
68a0: 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20  b3' AS three;.  
68b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
68c0: 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a 64 6f 5f  ;.} {1 t3.1}.do_
68d0: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
68e0: 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20 66 69 6c  er1.4.6.15 { fil
68f0: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
6900: 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30 7d 0a 0a  ilename }  {0}..
6910: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
6920: 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d  te..testvfs tv -
6930: 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65 63  default 1.tv sec
6940: 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76 20 73  torsize 512.tv s
6950: 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f  cript copy_on_jo
6960: 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20  urnal_delete.tv 
6970: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70  filter xDelete.p
6980: 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72  roc copy_on_jour
6990: 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68  nal_delete {meth
69a0: 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73  od filename args
69b0: 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e  } {.  if {[strin
69c0: 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c  g match *journal
69d0: 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75   $filename]} fau
69e0: 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 72 65  ltsim_save .  re
69f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
6a00: 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65  .faultsim_delete
6a10: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65  _and_reopen.do_e
6a20: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
6a30: 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20 50 52 41  r1.4.7.1 {.  PRA
6a40: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
6a50: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 43 52 45   = DELETE;.  CRE
6a60: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50  ATE TABLE t1(x P
6a70: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
6a80: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
6a90: 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20 20 49 4e  1 ON t1(y);.  IN
6aa0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6ab0: 55 45 53 28 27 49 27 2c 20 20 20 27 6f 6e 65 27  UES('I',   'one'
6ac0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
6ad0: 20 74 31 20 56 41 4c 55 45 53 28 27 49 49 27 2c   t1 VALUES('II',
6ae0: 20 20 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53    'four');.  INS
6af0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6b00: 45 53 28 27 49 49 49 27 2c 20 27 6e 69 6e 65 27  ES('III', 'nine'
6b10: 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  );.  BEGIN;.    
6b20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6b30: 41 4c 55 45 53 28 27 49 56 27 2c 20 27 73 69 78  ALUES('IV', 'six
6b40: 74 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  teen');.    INSE
6b50: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6b60: 53 28 27 56 27 20 2c 20 27 74 77 65 6e 74 79 66  S('V' , 'twentyf
6b70: 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b  ive');.  COMMIT;
6b80: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20 66  .} {delete}.tv f
6b90: 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63 6c 6f 73  ilter {}.db clos
6ba0: 65 0a 74 76 20 64 65 6c 65 74 65 20 0a 64 6f 5f  e.tv delete .do_
6bb0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e  test pager1.4.7.
6bc0: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
6bd0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
6be0: 6e 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20  n.  catch {file 
6bf0: 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e  attributes test.
6c00: 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d  db-journal -perm
6c10: 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d 2d  issions r-------
6c20: 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65  -}.  catch {file
6c30: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
6c40: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61  .db-journal -rea
6c50: 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61 74 63 68  donly 1}.  catch
6c60: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
6c70: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 75  ROM t1 }.} {1 {u
6c80: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
6c90: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 64 6f  tabase file}}.do
6ca0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37  _test pager1.4.7
6cb0: 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .3 {.  db close.
6cc0: 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74    catch {file at
6cd0: 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62  tributes test.db
6ce0: 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69 73  -journal -permis
6cf0: 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d  sions rw-rw-rw-}
6d00: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
6d10: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
6d20: 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64 6f  b-journal -reado
6d30: 6e 6c 79 20 30 7d 0a 20 20 66 69 6c 65 20 64 65  nly 0}.  file de
6d40: 6c 65 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  lete test.db-jou
6d50: 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65 78 69 73  rnal.  file exis
6d60: 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
6d70: 61 6c 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d  al.} {0}..#-----
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
6dd0: 77 69 6e 67 20 74 65 73 74 73 20 64 65 61 6c 20  wing tests deal 
6de0: 77 69 74 68 20 6d 75 6c 74 69 2d 66 69 6c 65 20  with multi-file 
6df0: 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20 70 61 67  commits..#.# pag
6e00: 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68 65 20 63  er1-5.1.*: The c
6e10: 61 73 65 20 77 68 65 72 65 20 61 20 6d 75 6c 74  ase where a mult
6e20: 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  i-file cannot be
6e30: 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 63 61 75   committed becau
6e40: 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  se.#            
6e50: 20 20 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65     another conne
6e60: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
6e70: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
6e80: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a 23 20 20  n one of the.#  
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
6ea0: 65 73 2e 20 41 66 74 65 72 20 74 68 65 20 53 48  es. After the SH
6eb0: 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 6d  ARED lock is rem
6ec0: 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d 4d 49 54  oved, the COMMIT
6ed0: 20 73 75 63 63 65 65 64 73 2e 0a 23 0a 23 20 70   succeeds..#.# p
6ee0: 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20 4d 75 6c  ager1-5.2.*: Mul
6ef0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20  ti-file commits 
6f00: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
6f10: 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61  e=memory..#.# pa
6f20: 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d 75 6c 74  ger1-5.3.*: Mult
6f30: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20 77  i-file commits w
6f40: 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
6f50: 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61 67  =memory..#.# pag
6f60: 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68 65 63 6b  er1-5.4.*: Check
6f70: 20 74 68 61 74 20 77 69 74 68 20 73 79 6e 63 68   that with synch
6f80: 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c 2c 20 74  ronous=normal, t
6f90: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
6fa0: 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20  l file.#        
6fb0: 20 20 20 20 20 20 20 6e 61 6d 65 20 69 73 20 61         name is a
6fc0: 64 64 65 64 20 74 6f 20 61 20 6a 6f 75 72 6e 61  dded to a journa
6fd0: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
6fe0: 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  ly after the las
6ff0: 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  t.#             
7000: 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64    journal record
7010: 2e 20 42 75 74 20 77 69 74 68 20 73 79 6e 63 68  . But with synch
7020: 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20 65 78 74  ronous=full, ext
7030: 72 61 20 75 6e 75 73 65 64 20 73 70 61 63 65 0a  ra unused space.
7040: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
7050: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 74  is allocated bet
7060: 77 65 65 6e 20 74 68 65 20 6c 61 73 74 20 6a 6f  ween the last jo
7070: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 61 6e 64  urnal record and
7080: 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20 20   the .#         
7090: 20 20 20 20 20 20 6d 61 73 74 65 72 2d 6a 6f 75        master-jou
70a0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 73  rnal file name s
70b0: 6f 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65  o that the maste
70c0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23  r-journal file.#
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
70e0: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 6c 69 65  ame does not lie
70f0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63   on the same sec
7100: 74 6f 72 20 61 73 20 74 68 65 20 6c 61 73 74 20  tor as the last 
7110: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20  journal file.#  
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 63               rec
7130: 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  ord..#.# pager1-
7140: 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61  5.5.*: Check tha
7150: 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  t in journal_mod
7160: 65 3d 50 45 52 53 49 53 54 20 6d 6f 64 65 2c 20  e=PERSIST mode, 
7170: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
7180: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
7190: 20 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a    truncated to z
71a0: 65 72 6f 20 62 79 74 65 73 20 77 68 65 6e 20 61  ero bytes when a
71b0: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
71c0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 20 20  saction is .#   
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d              comm
71e0: 69 74 74 65 64 20 28 69 6e 73 74 65 61 64 20 6f  itted (instead o
71f0: 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  f the first coup
7200: 6c 65 20 6f 66 20 62 79 74 65 73 20 62 65 69 6e  le of bytes bein
7210: 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a 23 0a 64  g zeroed)..#.#.d
7220: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7230: 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
7240: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
7250: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
7260: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
7270: 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20  db2' AS aux;.   
7280: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
7290: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
72a0: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28  TE TABLE aux.t2(
72b0: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
72c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
72d0: 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29 3b 0a 20  (17, 'Lenin');. 
72e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
72f0: 31 20 56 41 4c 55 45 53 28 32 32 2c 20 27 53 74  1 VALUES(22, 'St
7300: 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  alin');.    INSE
7310: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7320: 53 28 35 33 2c 20 27 4b 68 72 75 73 68 63 68 65  S(53, 'Khrushche
7330: 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  v');.  }.} {}.do
7340: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
7350: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
7360: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7370: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7380: 20 56 41 4c 55 45 53 28 36 34 2c 20 27 42 72 65   VALUES(64, 'Bre
7390: 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20 20 20 49  zhnev');.      I
73a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
73b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
73c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
73d0: 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65  2 test.db2.  exe
73e0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
73f0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
7400: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 64 62   FROM t2;.  } db
7410: 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  2.} {}.do_test p
7420: 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b 0a 20 20  ager1-5.1.3 {.  
7430: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
7440: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
7450: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65  s locked}}.do_te
7460: 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 34 20  st pager1-5.1.4 
7470: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
7480: 49 54 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c  IT db2.  execsql
7490: 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63 73 71   COMMIT.  execsq
74a0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
74b0: 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 37  M t2 } db2.} {17
74c0: 20 4c 65 6e 69 6e 20 32 32 20 53 74 61 6c 69 6e   Lenin 22 Stalin
74d0: 20 35 33 20 4b 68 72 75 73 68 63 68 65 76 20 36   53 Khrushchev 6
74e0: 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64 6f 5f 74  4 Brezhnev}.do_t
74f0: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 35  est pager1-5.1.5
7500: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d   {.  db2 close.}
7510: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67   {}..do_test pag
7520: 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20 20 65 78  er1-5.2.1 {.  ex
7530: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
7540: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7550: 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20 20 42 45  = memory;.    BE
7560: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
7570: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
7580: 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29  (84, 'Andropov')
7590: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
75a0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38 34  NTO t2 VALUES(84
75b0: 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a 20  , 'Andropov');. 
75c0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
75d0: 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f 74 65 73   {memory}.do_tes
75e0: 74 20 70 61 67 65 72 31 2d 35 2e 33 2e 31 20 7b  t pager1-5.3.1 {
75f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7600: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
7610: 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20 20 20 20  mode = off;.    
7620: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
7630: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7640: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
7650: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
7660: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
7670: 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27  (85, 'Gorbachev'
7680: 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  );.    COMMIT;. 
7690: 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64 6f 5f 74   }.} {off}..do_t
76a0: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 31  est pager1-5.4.1
76b0: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
76c0: 74 65 73 74 76 66 73 20 74 76 0a 20 20 73 71 6c  testvfs tv.  sql
76d0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20  ite3 db test.db 
76e0: 2d 76 66 73 20 74 76 0a 20 20 65 78 65 63 73 71  -vfs tv.  execsq
76f0: 6c 20 7b 20 41 54 54 41 43 48 20 27 74 65 73 74  l { ATTACH 'test
7700: 2e 64 62 32 27 20 41 53 20 61 75 78 20 7d 0a 0a  .db2' AS aux }..
7710: 20 20 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c    tv filter xDel
7720: 65 74 65 0a 20 20 74 76 20 73 63 72 69 70 74 20  ete.  tv script 
7730: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  max_journal_size
7740: 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65  .  tv sectorsize
7750: 20 35 31 32 0a 20 20 73 65 74 20 3a 3a 6d 61 78   512.  set ::max
7760: 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 70 72 6f  _journal 0.  pro
7770: 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69  c max_journal_si
7780: 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d  ze {method args}
7790: 20 7b 0a 20 20 20 20 73 65 74 20 73 7a 20 30 0a   {.    set sz 0.
77a0: 20 20 20 20 63 61 74 63 68 20 7b 20 73 65 74 20      catch { set 
77b0: 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  sz [file size te
77c0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d  st.db-journal] }
77d0: 0a 20 20 20 20 69 66 20 7b 24 73 7a 20 3e 20 24  .    if {$sz > $
77e0: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 7d 20 7b  ::max_journal} {
77f0: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 61 78  .      set ::max
7800: 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a 20 20 20  _journal $sz.   
7810: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
7820: 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 65 78  LITE_OK.  }.  ex
7830: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
7840: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7850: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50 52  = DELETE;.    PR
7860: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
7870: 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 42   = NORMAL;.    B
7880: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
7890: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
78a0: 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76  S(85, 'Gorbachev
78b0: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
78c0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
78d0: 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27 29  85, 'Gorbachev')
78e0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
78f0: 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f  }.  set ::max_jo
7900: 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72 20 32 36  urnal.} [expr 26
7910: 31 35 2b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  15+[string lengt
7920: 68 20 5b 70 77 64 5d 5d 5d 0a 64 6f 5f 74 65 73  h [pwd]]].do_tes
7930: 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 32 20 7b  t pager1-5.4.2 {
7940: 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75  .  set ::max_jou
7950: 72 6e 61 6c 20 30 0a 20 20 65 78 65 63 73 71 6c  rnal 0.  execsql
7960: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79   {.    PRAGMA sy
7970: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c  nchronous = full
7980: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
7990: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
79a0: 31 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e  1 WHERE b = 'Len
79b0: 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  in';.      DELET
79c0: 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  E FROM t2 WHERE 
79d0: 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20  b = 'Lenin';.   
79e0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 73   COMMIT;.  }.  s
79f0: 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  et ::max_journal
7a00: 0a 7d 20 5b 65 78 70 72 20 33 31 31 31 2b 5b 73  .} [expr 3111+[s
7a10: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 70 77  tring length [pw
7a20: 64 5d 5d 5d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  d]]].db close.tv
7a30: 20 64 65 6c 65 74 65 0a 0a 64 6f 5f 74 65 73 74   delete..do_test
7a40: 20 70 61 67 65 72 31 2d 35 2e 35 2e 31 20 7b 0a   pager1-5.5.1 {.
7a50: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
7a60: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
7a70: 20 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65   .    ATTACH 'te
7a80: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a  st.db2' AS aux;.
7a90: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7aa0: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
7ab0: 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  T;.    CREATE TA
7ac0: 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20  BLE t3(a, b);.  
7ad0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
7ae0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
7af0: 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
7b00: 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
7b10: 74 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74  t1;.    UPDATE t
7b20: 33 20 53 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d  3 SET b = random
7b30: 62 6c 6f 62 28 31 35 30 30 29 3b 0a 20 20 7d 0a  blob(1500);.  }.
7b40: 20 20 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a    expr [file siz
7b50: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
7b60: 6c 5d 20 3e 20 31 35 30 30 30 0a 7d 20 7b 31 7d  l] > 15000.} {1}
7b70: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7b80: 35 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  5.5.2 {.  execsq
7b90: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73  l {.    PRAGMA s
7ba0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c  ynchronous = ful
7bb0: 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  l;.    BEGIN;.  
7bc0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
7bd0: 74 31 20 57 48 45 52 45 20 62 20 3d 20 27 53 74  t1 WHERE b = 'St
7be0: 61 6c 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c  alin';.      DEL
7bf0: 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52  ETE FROM t2 WHER
7c00: 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a  E b = 'Stalin';.
7c10: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
7c20: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
7c30: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30  .db-journal.} {0
7c40: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
7c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23  --------------.#
7c90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
7ca0: 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22  ests work with "
7cb0: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
7cc0: 63 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74 65 73 74  count".#.do_test
7cd0: 20 70 61 67 65 72 31 2d 36 2e 31 20 7b 0a 20 20   pager1-6.1 {.  
7ce0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
7cf0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
7d00: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
7d10: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
7d20: 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41  none;.    PRAGMA
7d30: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
7d40: 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45  = 10;.    CREATE
7d50: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
7d60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7d70: 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t3(a, b);.    
7d80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
7d90: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
7da0: 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29  E TABLE t5(a, b)
7db0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7dc0: 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20  LE t6(a, b);.   
7dd0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
7de0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
7df0: 54 45 20 54 41 42 4c 45 20 74 38 28 61 2c 20 62  TE TABLE t8(a, b
7e00: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
7e10: 42 4c 45 20 74 39 28 61 2c 20 62 29 3b 0a 20 20  BLE t9(a, b);.  
7e20: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7e30: 31 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20  10(a, b);.  }.} 
7e40: 7b 31 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  {10}.do_catchsql
7e50: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 32  _test pager1-6.2
7e60: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
7e70: 45 20 74 31 31 28 61 2c 20 62 29 0a 7d 20 7b 31  E t11(a, b).} {1
7e80: 20 7b 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   {database or di
7e90: 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 64 6f 5f  sk is full}}.do_
7ea0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
7eb0: 65 72 31 2d 36 2e 34 20 7b 20 50 52 41 47 4d 41  er1-6.4 { PRAGMA
7ec0: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
7ed0: 20 20 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65       } {10}.do_e
7ee0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
7ef0: 72 31 2d 36 2e 35 20 7b 20 50 52 41 47 4d 41 20  r1-6.5 { PRAGMA 
7f00: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d  max_page_count =
7f10: 20 31 35 20 7d 20 7b 31 35 7d 0a 64 6f 5f 65 78   15 } {15}.do_ex
7f20: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
7f30: 31 2d 36 2e 36 20 7b 20 43 52 45 41 54 45 20 54  1-6.6 { CREATE T
7f40: 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29 20 20  ABLE t11(a, b)  
7f50: 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73     } {}.do_execs
7f60: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  ql_test pager1-6
7f70: 2e 37 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  .7 {.  BEGIN;.  
7f80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7f90: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
7fa0: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70      PRAGMA max_p
7fb0: 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 33 3b 0a  age_count = 13;.
7fc0: 7d 20 7b 31 33 7d 0a 64 6f 5f 65 78 65 63 73 71  } {13}.do_execsq
7fd0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
7fe0: 38 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  8 {.    INSERT I
7ff0: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 33  NTO t11 VALUES(3
8000: 2c 20 34 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  , 4);.    PRAGMA
8010: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8020: 3d 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a 64 6f 5f  = 10;.} {11}.do_
8030: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
8040: 65 72 31 2d 36 2e 39 20 7b 20 43 4f 4d 4d 49 54  er1-6.9 { COMMIT
8050: 20 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   } {}..do_execsq
8060: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
8070: 31 30 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f  10 { PRAGMA max_
8080: 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 20  page_count = 10 
8090: 7d 20 7b 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71  } {10}.do_execsq
80a0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
80b0: 31 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  11 { SELECT * FR
80c0: 4f 4d 20 74 31 31 20 7d 20 20 20 20 20 20 20 20  OM t11 }        
80d0: 20 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 65    {1 2 3 4}.do_e
80e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
80f0: 72 31 2d 36 2e 31 32 20 7b 20 50 52 41 47 4d 41  r1-6.12 { PRAGMA
8100: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8110: 7d 20 20 20 20 20 20 7b 31 31 7d 0a 0a 0a 23 2d  }      {11}...#-
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8130: 2d 2d 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 0a 23 20 54 68 65 20 66  --------.# The f
8170: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77  ollowing tests w
8180: 6f 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41  ork with "PRAGMA
8190: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52   journal_mode=TR
81a0: 55 4e 43 41 54 45 22 20 61 6e 64 0a 23 20 22 50  UNCATE" and.# "P
81b0: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
81c0: 64 65 3d 45 58 43 4c 55 53 49 56 45 22 2e 0a 23  de=EXCLUSIVE"..#
81d0: 0a 23 20 45 61 63 68 20 74 65 73 74 20 69 73 20  .# Each test is 
81e0: 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20 35  specified with 5
81f0: 20 76 61 72 69 61 62 6c 65 73 2e 20 41 73 20 66   variables. As f
8200: 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 24 74  ollows:.#.#   $t
8210: 6e 3a 20 20 54 65 73 74 20 4e 75 6d 62 65 72 2e  n:  Test Number.
8220: 20 55 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   Used as part of
8230: 20 74 68 65 20 5b 64 6f 5f 74 65 73 74 5d 20 74   the [do_test] t
8240: 65 73 74 20 6e 61 6d 65 73 2e 0a 23 20 20 20 24  est names..#   $
8250: 73 71 6c 3a 20 53 51 4c 20 74 6f 20 65 78 65 63  sql: SQL to exec
8260: 75 74 65 2e 0a 23 20 20 20 24 72 65 73 3a 20 45  ute..#   $res: E
8270: 78 70 65 63 74 65 64 20 72 65 73 75 6c 74 20 6f  xpected result o
8280: 66 20 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c  f executing $sql
8290: 2e 0a 23 20 20 20 24 6a 73 3a 20 20 54 68 65 20  ..#   $js:  The 
82a0: 65 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66  expected size of
82b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
82c0: 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74  e, in bytes, aft
82d0: 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20  er executing.#  
82e0: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73         the SQL s
82f0: 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20  cript. Or -1 if 
8300: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
8310: 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65  ot expected to e
8320: 78 69 73 74 2e 0a 23 20 20 20 24 77 73 3a 20 20  xist..#   $ws:  
8330: 54 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a  The expected siz
8340: 65 20 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c  e of the WAL fil
8350: 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74  e, in bytes, aft
8360: 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20  er executing.#  
8370: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73         the SQL s
8380: 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20  cript. Or -1 if 
8390: 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 65  the WAL is not e
83a0: 78 70 65 63 74 65 64 20 74 6f 20 65 78 69 73 74  xpected to exist
83b0: 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61  ..#.ifcapable wa
83c0: 6c 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  l {.  faultsim_d
83d0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
83e0: 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  .  foreach {tn s
83f0: 71 6c 20 72 65 73 20 6a 73 20 77 73 7d 20 5b 73  ql res js ws} [s
8400: 75 62 73 74 20 7b 0a 20 20 0a 20 20 20 20 31 20  ubst {.  .    1 
8410: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
8420: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
8430: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 74        PRAGMA aut
8440: 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a 20 20  o_vacuum=OFF;.  
8450: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
8460: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
8470: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
8480: 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20 20 20  _size=1024;.    
8490: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
84a0: 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b  _mode=EXCLUSIVE;
84b0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
84c0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43  urnal_mode=TRUNC
84d0: 41 54 45 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ATE;.      INSER
84e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
84f0: 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 20 7b 65  (1, 2);.    } {e
8500: 78 63 6c 75 73 69 76 65 20 74 72 75 6e 63 61 74  xclusive truncat
8510: 65 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 32  e} 0 -1.  .    2
8520: 20 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 20    {.      BEGIN 
8530: 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20 20 20 20  IMMEDIATE;.     
8540: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
8550: 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49   t1;.      COMMI
8560: 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d 20 30  T;.    } {1 2} 0
8570: 20 2d 31 0a 20 20 0a 20 20 20 20 33 20 20 7b 0a   -1.  .    3  {.
8580: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
8590: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
85a0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d  OM t1;.      COM
85b0: 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d  MIT;.    } {1 2}
85c0: 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 34 20 20   0 -1.  .    4  
85d0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
85e0: 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20 20 20  _mode = WAL }   
85f0: 20 77 61 6c 20 20 20 20 20 20 20 2d 31 20 2d 31   wal       -1 -1
8600: 0a 20 20 20 20 35 20 20 7b 20 49 4e 53 45 52 54  .    5  { INSERT
8610: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8620: 33 2c 20 34 29 20 7d 20 20 7b 7d 20 20 20 20 20  3, 4) }  {}     
8630: 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f     -1 [wal_file_
8640: 73 69 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 20  size 1 1024].   
8650: 20 36 20 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63   6  { PRAGMA loc
8660: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d  king_mode = NORM
8670: 41 4c 20 7d 20 65 78 63 6c 75 73 69 76 65 20 2d  AL } exclusive -
8680: 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  1 [wal_file_size
8690: 20 31 20 31 30 32 34 5d 0a 20 20 20 20 37 20 20   1 1024].    7  
86a0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
86b0: 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 20 7d   VALUES(5, 6); }
86c0: 20 7b 7d 20 20 20 20 20 20 20 20 2d 31 20 5b 77   {}        -1 [w
86d0: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31  al_file_size 2 1
86e0: 30 32 34 5d 0a 20 20 0a 20 20 20 20 38 20 20 7b  024].  .    8  {
86f0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
8700: 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45 20  mode = TRUNCATE 
8710: 7d 20 74 72 75 6e 63 61 74 65 20 20 20 20 20 20  } truncate      
8720: 20 20 20 20 30 20 2d 31 0a 20 20 20 20 39 20 20      0 -1.    9  
8730: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
8740: 20 56 41 4c 55 45 53 28 37 2c 20 38 29 20 7d 20   VALUES(7, 8) } 
8750: 20 20 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20     {}           
8760: 20 20 20 20 20 30 20 2d 31 0a 20 20 20 20 31 30       0 -1.    10
8770: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
8780: 20 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20   t1 }           
8790: 20 20 20 20 7b 31 20 32 20 33 20 34 20 35 20 36      {1 2 3 4 5 6
87a0: 20 37 20 38 7d 20 30 20 2d 31 0a 20 20 0a 20 20   7 8} 0 -1.  .  
87b0: 7d 5d 20 7b 0a 20 20 20 20 64 6f 5f 65 78 65 63  }] {.    do_exec
87c0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
87d0: 37 2e 31 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24  7.1.$tn.1 $sql $
87e0: 72 65 73 0a 20 20 20 20 63 61 74 63 68 20 7b 20  res.    catch { 
87f0: 73 65 74 20 4a 20 2d 31 20 3b 20 73 65 74 20 4a  set J -1 ; set J
8800: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
8810: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20  .db-journal] }. 
8820: 20 20 20 63 61 74 63 68 20 7b 20 73 65 74 20 57     catch { set W
8830: 20 2d 31 20 3b 20 73 65 74 20 57 20 5b 66 69 6c   -1 ; set W [fil
8840: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
8850: 61 6c 5d 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73  al] }.    do_tes
8860: 74 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e  t pager1-7.1.$tn
8870: 2e 32 20 7b 20 6c 69 73 74 20 24 4a 20 24 57 20  .2 { list $J $W 
8880: 7d 20 5b 6c 69 73 74 20 24 6a 73 20 24 77 73 5d  } [list $js $ws]
8890: 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  .  }.}..do_test 
88a0: 70 61 67 65 72 31 2d 37 2e 32 2e 31 20 7b 0a 20  pager1-7.2.1 {. 
88b0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
88c0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
88d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
88e0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
88f0: 3d 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  = EXCLUSIVE;.   
8900: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
8910: 28 61 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49  (a, b);.    BEGI
8920: 4e 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  N;.      PRAGMA 
8930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64  journal_mode = d
8940: 65 6c 65 74 65 3b 0a 20 20 20 20 20 20 50 52 41  elete;.      PRA
8950: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8960: 20 3d 20 74 72 75 6e 63 61 74 65 3b 0a 20 20 7d   = truncate;.  }
8970: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 64 65  .} {exclusive de
8980: 6c 65 74 65 20 74 72 75 6e 63 61 74 65 7d 0a 64  lete truncate}.d
8990: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e  o_test pager1-7.
89a0: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
89b0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
89c0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a   VALUES(1, 2) }.
89d0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
89e0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
89f0: 3d 20 70 65 72 73 69 73 74 20 7d 0a 7d 20 7b 74  = persist }.} {t
8a00: 72 75 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74  runcate}.do_test
8a10: 20 70 61 67 65 72 31 2d 37 2e 32 2e 33 20 7b 0a   pager1-7.2.3 {.
8a20: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d    execsql { COMM
8a30: 49 54 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  IT }.  execsql {
8a40: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
8a50: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69  nal_mode = persi
8a60: 73 74 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  st;.    PRAGMA j
8a70: 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69  ournal_size_limi
8a80: 74 3b 0a 20 20 7d 0a 7d 20 7b 70 65 72 73 69 73  t;.  }.} {persis
8a90: 74 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  t -1}..#--------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
8af0: 67 20 74 65 73 74 73 2c 20 70 61 67 65 72 31 2d  g tests, pager1-
8b00: 38 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 74  8.*, test that t
8b10: 68 65 20 73 70 65 63 69 61 6c 20 66 69 6c 65 6e  he special filen
8b20: 61 6d 65 73 20 0a 23 20 22 3a 6d 65 6d 6f 72 79  ames .# ":memory
8b30: 3a 22 20 61 6e 64 20 22 22 20 6f 70 65 6e 20 74  :" and "" open t
8b40: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
8b50: 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  es..#.foreach {t
8b60: 6e 20 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20  n filename} {.  
8b70: 31 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 32 20 22  1 :memory:.  2 "
8b80: 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  ".} {.  do_test 
8b90: 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 31 20 7b  pager1-8.$tn.1 {
8ba0: 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65  .    faultsim_de
8bb0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
8bc0: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
8bd0: 20 73 71 6c 69 74 65 33 20 64 62 20 24 66 69 6c   sqlite3 db $fil
8be0: 65 6e 61 6d 65 0a 20 20 20 20 65 78 65 63 73 71  ename.    execsq
8bf0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
8c00: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31   auto_vacuum = 1
8c10: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
8c20: 41 42 4c 45 20 78 31 28 78 29 3b 0a 20 20 20 20  ABLE x1(x);.    
8c30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
8c40: 20 56 41 4c 55 45 53 28 27 43 68 61 72 6c 65 73   VALUES('Charles
8c50: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
8c60: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
8c70: 27 4a 61 6d 65 73 27 29 3b 0a 20 20 20 20 20 20  'James');.      
8c80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
8c90: 41 4c 55 45 53 28 27 4d 61 72 79 27 29 3b 0a 20  ALUES('Mary');. 
8ca0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
8cb0: 4f 4d 20 78 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM x1;.    }.  }
8cc0: 20 7b 43 68 61 72 6c 65 73 20 4a 61 6d 65 73 20   {Charles James 
8cd0: 4d 61 72 79 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  Mary}..  do_test
8ce0: 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 32 20   pager1-8.$tn.2 
8cf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  {.    sqlite3 db
8d00: 32 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  2 $filename.    
8d10: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
8d20: 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20 64 62  T * FROM x1 } db
8d30: 32 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  2.  } {1 {no suc
8d40: 68 20 74 61 62 6c 65 3a 20 78 31 7d 7d 0a 0a 20  h table: x1}}.. 
8d50: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
8d60: 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 33 20   pager1-8.$tn.3 
8d70: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
8d80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
8d90: 31 20 56 41 4c 55 45 53 28 27 57 69 6c 6c 69 61  1 VALUES('Willia
8da0: 6d 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  m');.      INSER
8db0: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
8dc0: 28 27 41 6e 6e 65 27 29 3b 0a 20 20 20 20 52 4f  ('Anne');.    RO
8dd0: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20 7b 7d 0a 7d  LLBACK;.  } {}.}
8de0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
8df0: 2d 2d 2d 2d 2d 2d 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 0a 23 20 54  ------------.# T
8e30: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
8e40: 20 74 65 73 74 73 20 2d 20 70 61 67 65 72 31 2d   tests - pager1-
8e50: 39 2e 2a 20 2d 20 64 65 61 6c 20 77 69 74 68 20  9.* - deal with 
8e60: 69 6e 74 65 72 61 63 74 69 6f 6e 73 20 62 65 74  interactions bet
8e70: 77 65 65 6e 0a 23 20 74 68 65 20 70 61 67 65 72  ween.# the pager
8e80: 20 61 6e 64 20 74 68 65 20 62 61 63 6b 75 70 20   and the backup 
8e90: 41 50 49 2e 20 54 65 73 74 20 63 61 73 65 73 3a  API. Test cases:
8ea0: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e  .#.#   pager1-9.
8eb0: 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61  1.*: Test that a
8ec0: 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65   backup complete
8ed0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65  s successfully e
8ee0: 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20  ven if the.#    
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
8f00: 72 63 65 20 64 62 20 69 73 20 77 72 69 74 74 65  rce db is writte
8f10: 6e 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  n to during the 
8f20: 62 61 63 6b 75 70 20 6f 70 2e 0a 23 0a 23 20 20  backup op..#.#  
8f30: 20 70 61 67 65 72 31 2d 39 2e 32 2e 2a 3a 20 54   pager1-9.2.*: T
8f40: 65 73 74 20 74 68 61 74 20 61 20 62 61 63 6b 75  est that a backu
8f50: 70 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  p completes succ
8f60: 65 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66  essfully even if
8f70: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
8f80: 20 20 20 20 20 20 20 73 6f 75 72 63 65 20 64 62         source db
8f90: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 61   is written to a
8fa0: 6e 64 20 74 68 65 6e 20 72 6f 6c 6c 65 64 20 62  nd then rolled b
8fb0: 61 63 6b 20 64 75 72 69 6e 67 20 61 20 0a 23 20  ack during a .# 
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e  backup operation
8fe0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
8ff0: 72 31 2d 39 2e 30 2e 31 20 7b 0a 20 20 66 61 75  r1-9.0.1 {.  fau
9000: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
9010: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
9020: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
9030: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
9040: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
9050: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
9060: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45  BEGIN;.      CRE
9070: 41 54 45 20 54 41 42 4c 45 20 61 62 28 61 2c 20  ATE TABLE ab(a, 
9080: 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29  b, UNIQUE(a, b))
9090: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
90a0: 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 28 20 61  NTO ab VALUES( a
90b0: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
90c0: 73 74 72 69 6e 67 28 33 30 30 29 20 29 3b 0a 20  string(300) );. 
90d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
90e0: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
90f0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
9100: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
9110: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9120: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
9130: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
9140: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
9150: 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  b;.      INSERT 
9160: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
9170: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
9180: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
9190: 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   ab;.      INSER
91a0: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
91b0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
91c0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
91d0: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
91e0: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
91f0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
9200: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
9210: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
9220: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
9230: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
9240: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
9250: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
9260: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
9270: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
9280: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9290: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
92a0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
92b0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
92c0: 2d 39 2e 30 2e 32 20 7b 0a 20 20 73 71 6c 69 74  -9.0.2 {.  sqlit
92d0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
92e0: 20 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41    db2 eval { PRA
92f0: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
9300: 20 31 30 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f   10 }.  sqlite3_
9310: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
9320: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74  n db main.  list
9330: 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20   [B step 10000] 
9340: 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51  [B finish].} {SQ
9350: 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45  LITE_DONE SQLITE
9360: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  _OK}.do_test pag
9370: 65 72 31 2d 39 2e 30 2e 33 20 7b 0a 20 64 62 20  er1-9.0.3 {. db 
9380: 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73  one {SELECT md5s
9390: 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62  um(a, b) FROM ab
93a0: 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45  }.} [db2 one {SE
93b0: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
93c0: 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 0a 64 6f 5f  ) FROM ab}]..do_
93d0: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e  test pager1-9.1.
93e0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
93f0: 55 50 44 41 54 45 20 61 62 20 53 45 54 20 61 20  UPDATE ab SET a 
9400: 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29 20  = a_string(201) 
9410: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  }.  sqlite3_back
9420: 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62  up B db2 main db
9430: 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33   main.  B step 3
9440: 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  0.} {SQLITE_OK}.
9450: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9460: 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
9470: 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54   { UPDATE ab SET
9480: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30   b = a_string(30
9490: 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20 73  1) }.  list [B s
94a0: 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69  tep 10000] [B fi
94b0: 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f  nish].} {SQLITE_
94c0: 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a  DONE SQLITE_OK}.
94d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
94e0: 2e 31 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b  .1.3 {. db one {
94f0: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c  SELECT md5sum(a,
9500: 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b   b) FROM ab}.} [
9510: 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20  db2 one {SELECT 
9520: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9530: 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20 70  M ab}].do_test p
9540: 61 67 65 72 31 2d 39 2e 31 2e 34 20 7b 20 65 78  ager1-9.1.4 { ex
9550: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
9560: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 20  ount(*) FROM ab 
9570: 7d 20 7d 20 7b 31 32 38 7d 0a 0a 64 6f 5f 74 65  } } {128}..do_te
9580: 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 31 20  st pager1-9.2.1 
9590: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50  {.  execsql { UP
95a0: 44 41 54 45 20 61 62 20 53 45 54 20 61 20 3d 20  DATE ab SET a = 
95b0: 61 5f 73 74 72 69 6e 67 28 32 30 32 29 20 7d 0a  a_string(202) }.
95c0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
95d0: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
95e0: 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30 0a  ain.  B step 30.
95f0: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  } {SQLITE_OK}.do
9600: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32  _test pager1-9.2
9610: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
9620: 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
9630: 20 20 20 55 50 44 41 54 45 20 61 62 20 53 45 54     UPDATE ab SET
9640: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30   b = a_string(30
9650: 31 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  1);.    ROLLBACK
9660: 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20  ;.  }.  list [B 
9670: 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66  step 10000] [B f
9680: 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45  inish].} {SQLITE
9690: 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d  _DONE SQLITE_OK}
96a0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
96b0: 39 2e 32 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20  9.2.3 {. db one 
96c0: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
96d0: 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20  , b) FROM ab}.} 
96e0: 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54  [db2 one {SELECT
96f0: 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52   md5sum(a, b) FR
9700: 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20  OM ab}].do_test 
9710: 70 61 67 65 72 31 2d 39 2e 32 2e 34 20 7b 20 65  pager1-9.2.4 { e
9720: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
9730: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62  count(*) FROM ab
9740: 20 7d 20 7d 20 7b 31 32 38 7d 0a 64 62 20 63 6c   } } {128}.db cl
9750: 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64  ose.db2 close..d
9760: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9770: 33 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20  3.1 {.  testvfs 
9780: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
9790: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30  tv sectorsize 40
97a0: 39 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65  96.  faultsim_de
97b0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
97c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
97d0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
97e0: 31 30 32 34 20 7d 0a 20 20 66 6f 72 20 7b 73 65  1024 }.  for {se
97f0: 74 20 69 69 20 30 7d 20 7b 24 69 69 20 3c 20 34  t ii 0} {$ii < 4
9800: 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 20 65 78  } {incr ii} { ex
9810: 65 63 73 71 6c 20 22 43 52 45 41 54 45 20 54 41  ecsql "CREATE TA
9820: 42 4c 45 20 74 24 7b 69 69 7d 28 61 2c 20 62 29  BLE t${ii}(a, b)
9830: 22 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  " }.} {}.do_test
9840: 20 70 61 67 65 72 31 2d 39 2e 33 2e 32 20 7b 0a   pager1-9.3.2 {.
9850: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
9860: 73 74 2e 64 62 32 0a 0a 20 20 65 78 65 63 73 71  st.db2..  execsq
9870: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
9880: 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b  age_size = 4096;
9890: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
98a0: 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 20  hronous = OFF;. 
98b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
98c0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
98d0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
98e0: 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a 0a 20 20   b);.  } db2..  
98f0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42  sqlite3_backup B
9900: 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69   db2 main db mai
9910: 6e 0a 20 20 42 20 73 74 65 70 20 33 30 0a 20 20  n.  B step 30.  
9920: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
9930: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
9940: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
9950: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9960: 20 70 61 67 65 72 31 2d 39 2e 33 2e 33 20 7b 0a   pager1-9.3.3 {.
9970: 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 64 62    db2 close.  db
9980: 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65   close.  tv dele
9990: 74 65 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74  te.  file size t
99a0: 65 73 74 2e 64 62 32 0a 7d 20 5b 66 69 6c 65 20  est.db2.} [file 
99b0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 0a 64  size test.db]..d
99c0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
99d0: 34 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  4.1 {.  faultsim
99e0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
99f0: 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  en.  sqlite3 db2
9a00: 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63   test.db2.  exec
9a10: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
9a20: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39   page_size = 409
9a30: 36 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  6;.    CREATE TA
9a40: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
9a50: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9a60: 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32  2(a, b);.  } db2
9a70: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
9a80: 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20  p B db2 main db 
9a90: 6d 61 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73  main.  list [B s
9aa0: 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69  tep 10000] [B fi
9ab0: 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f  nish].} {SQLITE_
9ac0: 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a  DONE SQLITE_OK}.
9ad0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9ae0: 2e 34 2e 32 20 7b 0a 20 20 6c 69 73 74 20 5b 66  .4.2 {.  list [f
9af0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
9b00: 32 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  2] [file size te
9b10: 73 74 2e 64 62 5d 0a 7d 20 7b 30 20 30 7d 0a 64  st.db].} {0 0}.d
9b20: 62 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d  b2 close..#-----
9b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
9b80: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
9b90: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
9ba0: 64 20 62 79 20 78 53 65 63 74 6f 72 53 69 7a 65  d by xSectorSize
9bb0: 28 29 2c 20 74 68 65 0a 23 20 6d 69 6e 69 6d 75  (), the.# minimu
9bc0: 6d 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  m effective sect
9bd0: 6f 72 2d 73 69 7a 65 20 69 73 20 35 31 32 20 61  or-size is 512 a
9be0: 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 36  nd the maximum 6
9bf0: 35 35 33 36 20 62 79 74 65 73 2e 0a 23 0a 74 65  5536 bytes..#.te
9c00: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
9c10: 74 20 31 0a 66 6f 72 65 61 63 68 20 73 65 63 74  t 1.foreach sect
9c20: 6f 72 73 69 7a 65 20 7b 0a 20 20 20 20 33 32 20  orsize {.    32 
9c30: 20 20 36 34 20 20 20 31 32 38 20 20 20 32 35 36    64   128   256
9c40: 20 20 20 35 31 32 20 20 20 31 30 32 34 20 20 20     512   1024   
9c50: 32 30 34 38 20 0a 20 20 20 20 34 30 39 36 20 38  2048 .    4096 8
9c60: 31 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20  192 16384 32768 
9c70: 36 35 35 33 36 20 31 33 31 30 37 32 20 32 36 32  65536 131072 262
9c80: 31 34 34 0a 7d 20 7b 0a 20 20 74 76 20 73 65 63  144.} {.  tv sec
9c90: 74 6f 72 73 69 7a 65 20 24 73 65 63 74 6f 72 73  torsize $sectors
9ca0: 69 7a 65 0a 20 20 73 65 74 20 65 66 66 20 24 73  ize.  set eff $s
9cb0: 65 63 74 6f 72 73 69 7a 65 0a 20 20 69 66 20 7b  ectorsize.  if {
9cc0: 24 73 65 63 74 6f 72 73 69 7a 65 20 3c 20 35 31  $sectorsize < 51
9cd0: 32 7d 20 20 20 7b 20 73 65 74 20 65 66 66 20 35  2}   { set eff 5
9ce0: 31 32 20 7d 0a 20 20 69 66 20 7b 24 73 65 63 74  12 }.  if {$sect
9cf0: 6f 72 73 69 7a 65 20 3e 20 36 35 35 33 36 7d 20  orsize > 65536} 
9d00: 7b 20 73 65 74 20 65 66 66 20 36 35 35 33 36 20  { set eff 65536 
9d10: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
9d20: 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69  er1-10.$sectorsi
9d30: 7a 65 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74  ze.1 {.    fault
9d40: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
9d50: 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e  eopen.    db fun
9d60: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
9d70: 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ing.    execsql 
9d80: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  {.      PRAGMA j
9d90: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
9da0: 52 53 49 53 54 3b 0a 20 20 20 20 20 20 50 52 41  RSIST;.      PRA
9db0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
9dc0: 31 30 32 34 3b 0a 20 20 20 20 20 20 42 45 47 49  1024;.      BEGI
9dd0: 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  N;.        CREAT
9de0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
9df0: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
9e00: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
9e10: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
9e20: 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a  TABLE t3(a, b);.
9e30: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
9e40: 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73 69 7a    }.    file siz
9e50: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
9e60: 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24 73 65 63  l.  } [expr $sec
9e70: 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33 36 20  torsize > 65536 
9e80: 3f 20 36 35 35 33 36 20 3a 20 24 73 65 63 74 6f  ? 65536 : $secto
9e90: 72 73 69 7a 65 5d 0a 0a 20 20 64 6f 5f 74 65 73  rsize]..  do_tes
9ea0: 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63  t pager1-10.$sec
9eb0: 74 6f 72 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20  torsize.2 {.    
9ec0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
9ed0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
9ee0: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
9ef0: 33 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  300), a_string(3
9f00: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
9f10: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
9f20: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20  T * FROM t3;    
9f30: 20 20 20 20 2f 2a 20 20 32 20 2a 2f 0a 20 20 20      /*  2 */.   
9f40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9f50: 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  3 SELECT * FROM 
9f60: 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 34  t3;        /*  4
9f70: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
9f80: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
9f90: 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20  * FROM t3;      
9fa0: 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20    /*  8 */.     
9fb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
9fc0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
9fd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 31 36 20 2a  ;        /* 16 *
9fe0: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
9ff0: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20  NTO t3 SELECT * 
a000: 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20  FROM t3;        
a010: 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  /* 32 */.    }. 
a020: 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74   } {}..  do_test
a030: 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74   pager1-10.$sect
a040: 6f 72 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20 64  orsize.3 {.    d
a050: 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69  b close.    sqli
a060: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
a070: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
a080: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
a090: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
a0a0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 7d 0a 20    BEGIN;.    }. 
a0b0: 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c     recursive_sel
a0c0: 65 63 74 20 33 32 20 74 33 20 7b 64 62 20 65 76  ect 32 t3 {db ev
a0d0: 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  al "INSERT INTO 
a0e0: 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22  t2 VALUES(1, 2)"
a0f0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  }.    execsql {.
a100: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
a110: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
a120: 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t2;.    }.  } 
a130: 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  {1 2}..  do_test
a140: 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74   pager1-10.$sect
a150: 6f 72 73 69 7a 65 2e 34 20 7b 0a 20 20 20 20 65  orsize.4 {.    e
a160: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
a170: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
a180: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , b);.      CREA
a190: 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c 20 62  TE TABLE t7(a, b
a1a0: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
a1b0: 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29 3b 0a  TABLE t5(a, b);.
a1c0: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
a1d0: 20 74 36 3b 0a 20 20 20 20 20 20 44 52 4f 50 20   t6;.      DROP 
a1e0: 54 41 42 4c 45 20 74 37 3b 0a 20 20 20 20 7d 0a  TABLE t7;.    }.
a1f0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
a200: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
a210: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a220: 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 7d 0a  t6(a, b);.    }.
a230: 20 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65      recursive_se
a240: 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62 20 65  lect 32 t3 {db e
a250: 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  val "INSERT INTO
a260: 20 74 35 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t5 VALUES(1, 2)
a270: 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  "}.    execsql {
a280: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
a290: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
a2a0: 4f 4d 20 74 35 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t5;.    }.  }
a2b0: 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a 64 62 20 63   {1 2}.  .}.db c
a2c0: 6c 6f 73 65 0a 0a 74 76 20 73 65 63 74 6f 72 73  lose..tv sectors
a2d0: 69 7a 65 20 34 30 39 36 0a 64 6f 5f 74 65 73 74  ize 4096.do_test
a2e0: 20 70 61 67 65 72 31 2e 31 30 2e 78 2e 31 20 7b   pager1.10.x.1 {
a2f0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
a300: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
a310: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
a320: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
a330: 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41   = none;.    PRA
a340: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
a350: 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
a360: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
a370: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  }.  for {set i 0
a380: 7d 20 7b 24 69 3c 33 30 7d 20 7b 69 6e 63 72 20  } {$i<30} {incr 
a390: 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  i} {.    execsql
a3a0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
a3b0: 31 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f  1 VALUES(zeroblo
a3c0: 62 28 39 30 30 29 29 20 7d 0a 20 20 7d 0a 20 20  b(900)) }.  }.  
a3d0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
a3e0: 62 0a 7d 20 7b 33 32 37 36 38 7d 0a 64 6f 5f 74  b.} {32768}.do_t
a3f0: 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e  est pager1.10.x.
a400: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
a410: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a420: 20 74 32 28 78 29 3b 0a 20 20 20 20 44 52 4f 50   t2(x);.    DROP
a430: 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 7d 0a 20   TABLE t2;.  }. 
a440: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
a450: 64 62 0a 7d 20 7b 33 33 37 39 32 7d 0a 64 6f 5f  db.} {33792}.do_
a460: 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78  test pager1.10.x
a470: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
a480: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
a490: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
a4a0: 78 29 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73  x);.  }.  recurs
a4b0: 69 76 65 5f 73 65 6c 65 63 74 20 33 30 20 74 31  ive_select 30 t1
a4c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a4d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
a4e0: 28 78 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  (x);.    COMMIT;
a4f0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 62 20 63 6c  .  }.} {}..db cl
a500: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74  ose.tv delete..t
a510: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
a520: 6c 74 20 31 0a 66 61 75 6c 74 73 69 6d 5f 64 65  lt 1.faultsim_de
a530: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
a540: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
a550: 20 61 5f 73 74 72 69 6e 67 0a 64 6f 5f 65 78 65   a_string.do_exe
a560: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
a570: 2d 31 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  -11.1 {.  PRAGMA
a580: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
a590: 44 45 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41  DELETE;.  PRAGMA
a5a0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
a5b0: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43  ;.  BEGIN;.    C
a5c0: 52 45 41 54 45 20 54 41 42 4c 45 20 7a 7a 28 74  REATE TABLE zz(t
a5d0: 6f 70 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  op PRIMARY KEY);
a5e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a5f0: 20 7a 7a 20 56 41 4c 55 45 53 28 61 5f 73 74 72   zz VALUES(a_str
a600: 69 6e 67 28 32 32 32 29 29 3b 0a 20 20 20 20 49  ing(222));.    I
a610: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
a620: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
a630: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
a640: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
a650: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
a660: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
a670: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
a680: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
a690: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
a6a0: 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   zz;.    INSERT 
a6b0: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
a6c0: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
a6d0: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
a6e0: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
a6f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
a700: 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74  O zz SELECT a_st
a710: 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32  ring((SELECT 222
a720: 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d  +max(rowid) FROM
a730: 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20   zz)) FROM zz;. 
a740: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
a750: 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  z SELECT a_strin
a760: 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61  g((SELECT 222+ma
a770: 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a  x(rowid) FROM zz
a780: 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 43 4f  )) FROM zz;.  CO
a790: 4d 4d 49 54 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  MMIT;.  BEGIN;. 
a7a0: 20 20 20 55 50 44 41 54 45 20 7a 7a 20 53 45 54     UPDATE zz SET
a7b0: 20 74 6f 70 20 3d 20 61 5f 73 74 72 69 6e 67 28   top = a_string(
a7c0: 33 34 35 29 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d  345);.} {delete}
a7d0: 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75 74 20 7b  ..proc lockout {
a7e0: 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 20 72  method args} { r
a7f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
a800: 52 52 20 7d 0a 74 76 20 73 63 72 69 70 74 20 6c  RR }.tv script l
a810: 6f 63 6b 6f 75 74 0a 74 76 20 66 69 6c 74 65 72  ockout.tv filter
a820: 20 7b 78 57 72 69 74 65 20 78 54 72 75 6e 63 61   {xWrite xTrunca
a830: 74 65 20 78 53 79 6e 63 7d 0a 64 6f 5f 63 61 74  te xSync}.do_cat
a840: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
a850: 31 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d 49 54 20  1-11.2 { COMMIT 
a860: 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65  } {1 {disk I/O e
a870: 72 72 6f 72 7d 7d 0a 0a 74 76 20 73 63 72 69 70  rror}}..tv scrip
a880: 74 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  t {}.do_test pag
a890: 65 72 31 2d 31 31 2e 33 20 7b 0a 20 20 73 71 6c  er1-11.3 {.  sql
a8a0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
a8b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a8c0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
a8d0: 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45 3b  mode = TRUNCATE;
a8e0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
a8f0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
a900: 20 64 62 32 0a 7d 20 7b 74 72 75 6e 63 61 74 65   db2.} {truncate
a910: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   ok}.do_test pag
a920: 65 72 31 2d 31 31 2e 34 20 7b 0a 20 20 64 62 32  er1-11.4 {.  db2
a930: 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 65 78   close.  file ex
a940: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
a950: 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78  rnal.} {0}.do_ex
a960: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
a970: 31 2d 31 31 2e 35 20 7b 20 53 45 4c 45 43 54 20  1-11.5 { SELECT 
a980: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 7a  count(*) FROM zz
a990: 20 7d 20 7b 33 32 7d 0a 64 62 20 63 6c 6f 73 65   } {32}.db close
a9a0: 0a 74 76 20 64 65 6c 65 74 65 0a 20 20 0a 23 2d  .tv delete.  .#-
a9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9c0: 2d 2d 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 0a 23 20 54 65 73 74 20  --------.# Test 
aa00: 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  "PRAGMA page_siz
aa10: 65 22 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20  e".#.testvfs tv 
aa20: 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65  -default 1.tv se
aa30: 63 74 6f 72 73 69 7a 65 20 31 30 32 34 0a 66 6f  ctorsize 1024.fo
aa40: 72 65 61 63 68 20 70 61 67 65 73 69 7a 65 20 7b  reach pagesize {
aa50: 0a 20 20 20 20 35 31 32 20 20 20 31 30 32 34 20  .    512   1024 
aa60: 20 20 32 30 34 38 20 34 30 39 36 20 38 31 39 32    2048 4096 8192
aa70: 20 31 36 33 38 34 20 33 32 37 36 38 20 0a 7d 20   16384 32768 .} 
aa80: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
aa90: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a  ete_and_reopen..
aaa0: 20 20 23 20 54 68 65 20 73 65 63 74 6f 72 2d 73    # The sector-s
aab0: 69 7a 65 20 28 61 63 63 6f 72 64 69 6e 67 20 74  ize (according t
aac0: 6f 20 74 68 65 20 56 46 53 29 20 69 73 20 31 30  o the VFS) is 10
aad0: 32 34 20 62 79 74 65 73 2e 20 53 6f 20 69 66 20  24 bytes. So if 
aae0: 74 68 65 0a 20 20 23 20 70 61 67 65 2d 73 69 7a  the.  # page-siz
aaf0: 65 20 72 65 71 75 65 73 74 65 64 20 75 73 69 6e  e requested usin
ab00: 67 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73  g "PRAGMA page_s
ab10: 69 7a 65 22 20 69 73 20 67 72 65 61 74 65 72 20  ize" is greater 
ab20: 74 68 61 6e 20 74 68 65 0a 20 20 23 20 63 6f 6d  than the.  # com
ab30: 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20  pile time value 
ab40: 6f 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  of SQLITE_MAX_PA
ab50: 47 45 5f 53 49 5a 45 2c 20 74 68 65 6e 20 74 68  GE_SIZE, then th
ab60: 65 20 65 66 66 65 63 74 69 76 65 20 0a 20 20 23  e effective .  #
ab70: 20 70 61 67 65 2d 73 69 7a 65 20 72 65 6d 61 69   page-size remai
ab80: 6e 73 20 31 30 32 34 20 62 79 74 65 73 2e 0a 20  ns 1024 bytes.. 
ab90: 20 23 0a 20 20 73 65 74 20 65 66 66 20 24 70 61   #.  set eff $pa
aba0: 67 65 73 69 7a 65 0a 20 20 69 66 20 7b 24 65 66  gesize.  if {$ef
abb0: 66 20 3e 20 24 3a 3a 53 51 4c 49 54 45 5f 4d 41  f > $::SQLITE_MA
abc0: 58 5f 50 41 47 45 5f 53 49 5a 45 7d 20 7b 20 73  X_PAGE_SIZE} { s
abd0: 65 74 20 65 66 66 20 31 30 32 34 20 7d 0a 0a 20  et eff 1024 }.. 
abe0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
abf0: 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 31 20 7b  12.$pagesize.1 {
ac00: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
ac10: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65   test.db.    exe
ac20: 63 73 71 6c 20 22 0a 20 20 20 20 20 20 50 52 41  csql ".      PRA
ac30: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
ac40: 24 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 20  $pagesize;.     
ac50: 20 43 52 45 41 54 45 20 56 49 45 57 20 76 20 41   CREATE VIEW v A
ac60: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
ac70: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
ac80: 20 20 20 22 20 64 62 32 0a 20 20 20 20 66 69 6c     " db2.    fil
ac90: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20  e size test.db. 
aca0: 20 7d 20 24 65 66 66 0a 20 20 64 6f 5f 74 65 73   } $eff.  do_tes
acb0: 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67  t pager1-12.$pag
acc0: 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20 73 71  esize.2 {.    sq
acd0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
ace0: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  b.    execsql { 
acf0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
ad00: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20  unt(*) FROM v;. 
ad10: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
ad20: 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20  .page_size;.    
ad30: 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69 73 74 20  } db2.  } [list 
ad40: 31 20 24 65 66 66 5d 0a 20 20 64 6f 5f 74 65 73  1 $eff].  do_tes
ad50: 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67  t pager1-12.$pag
ad60: 65 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20 65 78  esize.3 {.    ex
ad70: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53  ecsql { .      S
ad80: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
ad90: 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50 52 41  ROM v;.      PRA
ada0: 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69  GMA main.page_si
adb0: 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 6c  ze;.    }.  } [l
adc0: 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20 64 62  ist 1 $eff].  db
add0: 32 20 63 6c 6f 73 65 0a 7d 0a 64 62 20 63 6c 6f  2 close.}.db clo
ade0: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d  se.tv delete..#-
adf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae00: 2d 2d 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 0a 23 20 54 65 73 74 20  --------.# Test 
ae40: 73 70 65 63 61 6c 20 22 50 52 41 47 4d 41 20 6a  specal "PRAGMA j
ae50: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53  ournal_mode=PERS
ae60: 49 53 54 22 20 74 65 73 74 20 63 61 73 65 73 2e  IST" test cases.
ae70: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 31  .#.# pager1-13.1
ae80: 2e 2a 3a 20 54 68 69 73 20 74 65 73 74 73 20 61  .*: This tests a
ae90: 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 65 6e   special case en
aea0: 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 70 65 72  countered in per
aeb0: 73 69 73 74 65 6e 74 20 0a 23 20 20 20 20 20 20  sistent .#      
aec0: 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
aed0: 6c 20 6d 6f 64 65 3a 20 49 66 20 74 68 65 20 6a  l mode: If the j
aee0: 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61 74 65  ournal associate
aef0: 64 20 77 69 74 68 20 61 20 74 72 61 6e 73 61 63  d with a transac
af00: 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 20 20 20  tion.#          
af10: 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
af20: 20 74 68 61 6e 20 74 68 65 20 6a 6f 75 72 6e 61   than the journa
af30: 6c 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 20  l file (because 
af40: 61 20 70 72 65 76 69 6f 75 73 20 0a 23 20 20 20  a previous .#   
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
af60: 6e 73 61 63 74 69 6f 6e 20 6c 65 66 74 20 61 20  nsaction left a 
af70: 76 65 72 79 20 6c 61 72 67 65 20 6e 6f 6e 2d 68  very large non-h
af80: 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
af90: 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  in the.#        
afa0: 20 20 20 20 20 20 20 20 66 69 6c 65 2d 73 79 73          file-sys
afb0: 74 65 6d 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  tem), then SQLit
afc0: 65 20 68 61 73 20 74 6f 20 62 65 20 63 61 72 65  e has to be care
afd0: 66 75 6c 20 74 68 61 74 20 74 68 65 72 65 20 69  ful that there i
afe0: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
aff0: 20 20 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c     not a journal
b000: 2d 68 65 61 64 65 72 20 6c 65 66 74 20 6f 76 65  -header left ove
b010: 72 20 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75  r from a previou
b020: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20  s transaction.# 
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
b040: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
b050: 77 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  wing the journal
b060: 20 63 6f 6e 74 65 6e 74 20 6a 75 73 74 20 77 72   content just wr
b070: 69 74 74 65 6e 2e 0a 23 20 20 20 20 20 20 20 20  itten..#        
b080: 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
b090: 20 69 73 2c 20 61 6e 64 20 74 68 65 20 70 72 6f   is, and the pro
b0a0: 63 65 73 73 20 63 72 61 73 68 65 73 20 73 6f 20  cess crashes so 
b0b0: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
b0c0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b0d0: 20 20 62 65 63 6f 6d 65 73 20 61 20 68 6f 74 2d    becomes a hot-
b0e0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 75 73 74  journal and must
b0f0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
b100: 62 79 20 61 6e 6f 74 68 65 72 0a 23 20 20 20 20  by another.#    
b110: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
b120: 65 73 73 2c 20 74 68 65 72 65 20 69 73 20 61 20  ess, there is a 
b130: 64 61 6e 67 65 72 20 74 68 61 74 20 74 68 65 20  danger that the 
b140: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 61  other process ma
b150: 79 20 72 6f 6c 6c 0a 23 20 20 20 20 20 20 20 20  y roll.#        
b160: 20 20 20 20 20 20 20 20 62 61 63 6b 20 74 68 65          back the
b170: 20 61 62 6f 72 74 65 64 20 74 72 61 6e 73 61 63   aborted transac
b180: 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 6e 74 69  tion, then conti
b190: 6e 75 65 20 63 6f 70 79 69 6e 67 20 64 61 74 61  nue copying data
b1a0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b1b0: 20 20 66 72 6f 6d 20 61 6e 20 6f 6c 64 65 72 20    from an older 
b1c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 72 6f 6d  transaction from
b1d0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
b1e0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 23  f the journal..#
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 53 65 65 20 74 68 65 20 73 79 6e 63 4a 6f 75 72  See the syncJour
b210: 6e 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  nal() function f
b220: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 23 0a 23 20  or details..#.# 
b230: 70 61 67 65 72 31 2d 31 33 2e 32 2e 2a 3a 20 53  pager1-13.2.*: S
b240: 61 6d 65 20 74 65 73 74 20 61 73 20 74 68 65 20  ame test as the 
b250: 70 72 65 76 69 6f 75 73 2e 20 54 68 69 73 20 74  previous. This t
b260: 69 6d 65 2c 20 74 68 72 6f 77 20 61 6e 20 69 6e  ime, throw an in
b270: 64 65 78 20 69 6e 74 6f 0a 23 20 20 20 20 20 20  dex into.#      
b280: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 6d 69            the mi
b290: 78 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 69 6e  x to make the in
b2a0: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 6d 6f  tegrity-check mo
b2b0: 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 61 74  re likely to cat
b2c0: 63 68 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ch.#            
b2d0: 20 20 20 20 65 72 72 6f 72 73 2e 0a 23 0a 74 65      errors..#.te
b2e0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
b2f0: 74 20 31 0a 74 76 20 73 63 72 69 70 74 20 78 53  t 1.tv script xS
b300: 79 6e 63 43 62 0a 74 76 20 66 69 6c 74 65 72 20  yncCb.tv filter 
b310: 78 53 79 6e 63 0a 70 72 6f 63 20 78 53 79 6e 63  xSync.proc xSync
b320: 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  Cb {method filen
b330: 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 73 65  ame args} {.  se
b340: 74 20 74 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  t t [file tail $
b350: 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 69 66 20 7b  filename].  if {
b360: 24 74 20 3d 3d 20 22 74 65 73 74 2e 64 62 22 7d  $t == "test.db"}
b370: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 0a 20   faultsim_save. 
b380: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b390: 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c  K.}.faultsim_del
b3a0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ete_and_reopen.d
b3b0: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
b3c0: 61 5f 73 74 72 69 6e 67 0a 0a 23 20 54 68 65 20  a_string..# The 
b3d0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
b3e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
b3f0: 68 69 73 20 74 65 73 74 20 63 61 73 65 20 63 72  his test case cr
b400: 65 61 74 65 73 20 61 20 72 65 61 6c 6c 79 20 62  eates a really b
b410: 69 67 0a 23 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  ig.# journal. Si
b420: 6e 63 65 20 74 68 65 20 63 61 63 68 65 2d 73 69  nce the cache-si
b430: 7a 65 20 69 73 20 6f 6e 6c 79 20 31 30 20 70 61  ze is only 10 pa
b440: 67 65 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ges, the journal
b450: 20 63 6f 6e 74 61 69 6e 73 20 0a 23 20 66 72 65   contains .# fre
b460: 71 75 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  quent journal he
b470: 61 64 65 72 73 2e 0a 23 0a 64 6f 5f 65 78 65 63  aders..#.do_exec
b480: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b490: 31 33 2e 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d  13.1.1 {.  PRAGM
b4a0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
b4b0: 32 34 3b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75  24;.  PRAGMA jou
b4c0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
b4d0: 49 53 54 3b 0a 20 20 50 52 41 47 4d 41 20 63 61  IST;.  PRAGMA ca
b4e0: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
b4f0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
b500: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
b510: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
b520: 59 2c 20 62 20 42 4c 4f 42 29 3b 0a 20 20 20 20  Y, b BLOB);.    
b530: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
b540: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74  ALUES(NULL, a_st
b550: 72 69 6e 67 28 34 30 30 29 29 3b 0a 20 20 20 20  ring(400));.    
b560: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
b570: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
b580: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
b590: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
b5a0: 20 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54   2 */.    INSERT
b5b0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
b5c0: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
b5d0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
b5e0: 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a        /*   4 */.
b5f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b600: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
b610: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
b620: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
b630: 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20 49 4e  /*   8 */.    IN
b640: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
b650: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
b660: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
b670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36            /*  16
b680: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
b690: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
b6a0: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
b6b0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
b6c0: 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20      /*  32 */.  
b6d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
b6e0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
b6f0: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
b700: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
b710: 20 20 36 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45    64 */.    INSE
b720: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
b730: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
b740: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
b750: 20 20 20 20 20 20 20 20 2f 2a 20 31 32 38 20 2a          /* 128 *
b760: 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 55 50  /.  COMMIT;.  UP
b770: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
b780: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d  a_string(400);.}
b790: 20 7b 70 65 72 73 69 73 74 7d 0a 0a 23 20 52 75   {persist}..# Ru
b7a0: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  n transactions o
b7b0: 66 20 69 6e 63 72 65 61 73 69 6e 67 20 73 69 7a  f increasing siz
b7c0: 65 73 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20  es. Eventually, 
b7d0: 6f 6e 65 20 28 6f 72 20 6d 6f 72 65 20 74 68 61  one (or more tha
b7e0: 6e 20 6f 6e 65 29 0a 23 20 6f 66 20 74 68 65 73  n one).# of thes
b7f0: 65 20 77 69 6c 6c 20 77 72 69 74 65 20 6a 75 73  e will write jus
b800: 74 20 65 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74  t enough content
b810: 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
b820: 20 6f 6c 64 20 68 65 61 64 65 72 73 20 63 72 65   old headers cre
b830: 61 74 65 64 20 0a 23 20 62 79 20 74 68 65 20 74  ated .# by the t
b840: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68  ransaction in th
b850: 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69  e block above li
b860: 65 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  es immediately a
b870: 66 74 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74  fter the content
b880: 0a 23 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79  .# journalled by
b890: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
b8a0: 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20  nsaction..#.for 
b8b0: 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55  {set nUp 1} {$nU
b8c0: 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d  p<64} {incr nUp}
b8d0: 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f   {.  do_execsql_
b8e0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31  test pager1-13.1
b8f0: 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20  .2.$nUp.1 { .   
b900: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
b910: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29   = a_string(399)
b920: 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70   WHERE a <= $nUp
b930: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  .  } {}.  do_exe
b940: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
b950: 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b  -13.1.2.$nUp.2 {
b960: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
b970: 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a  y_check } {ok} .
b980: 0a 20 20 23 20 54 72 79 20 74 6f 20 61 63 63 65  .  # Try to acce
b990: 73 73 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20  ss the snapshot 
b9a0: 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
b9b0: 65 6d 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65  em..  #.  sqlite
b9c0: 33 20 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62  3 db2 sv_test.db
b9d0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
b9e0: 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20  1-13.1.2.$nUp.3 
b9f0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
ba00: 53 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74  SELECT sum(lengt
ba10: 68 28 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20  h(b)) FROM t1 } 
ba20: 64 62 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31  db2.  } [expr {1
ba30: 32 38 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31  28*400 - ($nUp-1
ba40: 29 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  )}].  do_test pa
ba50: 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70  ger1-13.1.2.$nUp
ba60: 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .4 {.    execsql
ba70: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
ba80: 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a  ity_check } db2.
ba90: 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63    } {ok}.  db2 c
baa0: 6c 6f 73 65 0a 7d 0a 0a 23 20 53 61 6d 65 20 74  lose.}..# Same t
bab0: 65 73 74 20 61 73 20 61 62 6f 76 65 2e 20 42 75  est as above. Bu
bac0: 74 20 74 68 69 73 20 74 69 6d 65 20 77 69 74 68  t this time with
bad0: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74 68 65   an index on the
bae0: 20 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65   table..#.do_exe
baf0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
bb00: 2d 31 33 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41  -13.2.1 {.  CREA
bb10: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
bb20: 31 28 62 29 3b 0a 20 20 55 50 44 41 54 45 20 74  1(b);.  UPDATE t
bb30: 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  1 SET b = a_stri
bb40: 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f  ng(400);.} {}.fo
bb50: 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24  r {set nUp 1} {$
bb60: 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55  nUp<64} {incr nU
bb70: 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71  p} {.  do_execsq
bb80: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
bb90: 2e 32 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20  .2.2.$nUp.1 { . 
bba0: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
bbb0: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39   b = a_string(39
bbc0: 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e  9) WHERE a <= $n
bbd0: 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65  Up.  } {}.  do_e
bbe0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
bbf0: 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 32  r1-13.2.2.$nUp.2
bc00: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
bc10: 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d  ity_check } {ok}
bc20: 20 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20   .  sqlite3 db2 
bc30: 73 76 5f 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f  sv_test.db.  do_
bc40: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32  test pager1-13.2
bc50: 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20  .2.$nUp.3 {.    
bc60: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
bc70: 20 73 75 6d 28 6c 65 6e 67 74 68 28 62 29 29 20   sum(length(b)) 
bc80: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20  FROM t1 } db2.  
bc90: 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a 34 30 30  } [expr {128*400
bca0: 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20   - ($nUp-1)}].  
bcb0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
bcc0: 33 2e 32 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20  3.2.2.$nUp.4 {. 
bcd0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41     execsql { PRA
bce0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
bcf0: 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f  eck } db2.  } {o
bd00: 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d  k}.  db2 close.}
bd10: 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  ..db close.tv de
bd20: 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lete..#---------
bd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd70: 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c 20 22  .# Test specal "
bd80: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
bd90: 6f 64 65 3d 4f 46 46 22 20 74 65 73 74 20 63 61  ode=OFF" test ca
bda0: 73 65 73 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f  ses..#.faultsim_
bdb0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
bdc0: 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  n.do_execsql_tes
bdd0: 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 31 20  t pager1-14.1.1 
bde0: 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  {.  PRAGMA journ
bdf0: 61 6c 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20  al_mode = OFF;. 
be00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
be10: 28 61 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b  (a, b);.  BEGIN;
be20: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
be30: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
be40: 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45  ;.  COMMIT;.  SE
be50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
be60: 7d 20 7b 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63  } {off 1 2}.do_c
be70: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67  atchsql_test pag
be80: 65 72 31 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42  er1-14.1.2 {.  B
be90: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
bea0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
beb0: 33 2c 20 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43  3, 4);.  ROLLBAC
bec0: 4b 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65  K;.} {0 {}}.do_e
bed0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
bee0: 72 31 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45  r1-14.1.3 {.  SE
bef0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
bf00: 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 63  } {1 2 3 4}.do_c
bf10: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67  atchsql_test pag
bf20: 65 72 31 2d 31 34 2e 31 2e 34 20 7b 0a 20 20 42  er1-14.1.4 {.  B
bf30: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
bf40: 20 49 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20   INTO t1(rowid, 
bf50: 61 2c 20 62 29 20 53 45 4c 45 43 54 20 61 2b 33  a, b) SELECT a+3
bf60: 2c 20 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a  , b, b FROM t1;.
bf70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bf80: 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20  t1(rowid, a, b) 
bf90: 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62  SELECT a+3, b, b
bfa0: 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b   FROM t1;.} {1 {
bfb0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74  PRIMARY KEY must
bfc0: 20 62 65 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f   be unique}}.do_
bfd0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
bfe0: 65 72 31 2d 31 34 2e 31 2e 35 20 7b 0a 20 20 43  er1-14.1.5 {.  C
bff0: 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20  OMMIT;.  SELECT 
c000: 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20  * FROM t1;.} {1 
c010: 32 20 33 20 34 20 32 20 32 20 34 20 34 7d 0a 0a  2 3 4 2 2 4 4}..
c020: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
c030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
c070: 74 20 6f 70 65 6e 69 6e 67 20 61 6e 64 20 63 6c  t opening and cl
c080: 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65 72 20  osing the pager 
c090: 73 75 62 2d 73 79 73 74 65 6d 20 77 69 74 68 20  sub-system with 
c0a0: 64 69 66 66 65 72 65 6e 74 20 76 61 6c 75 65 73  different values
c0b0: 0a 23 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  .# for the sqlit
c0c0: 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69 6c 65 20  e3_vfs.szOsFile 
c0d0: 76 61 72 69 61 62 6c 65 2e 0a 23 0a 66 61 75 6c  variable..#.faul
c0e0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
c0f0: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
c100: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 35  l_test pager1-15
c110: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
c120: 42 4c 45 20 74 78 28 79 2c 20 7a 29 3b 0a 20 20  BLE tx(y, z);.  
c130: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78 20 56  INSERT INTO tx V
c140: 41 4c 55 45 53 28 27 41 79 75 74 74 68 61 79 61  ALUES('Ayutthaya
c150: 27 2c 20 27 42 65 69 6a 69 6e 67 27 29 3b 0a 20  ', 'Beijing');. 
c160: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78 20   INSERT INTO tx 
c170: 56 41 4c 55 45 53 28 27 4c 6f 6e 64 6f 6e 27 2c  VALUES('London',
c180: 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d 20 7b 7d 0a   'Tokyo');.} {}.
c190: 64 62 20 63 6c 6f 73 65 0a 66 6f 72 20 7b 73 65  db close.for {se
c1a0: 74 20 69 20 30 7d 20 7b 24 69 3c 35 31 33 7d 20  t i 0} {$i<513} 
c1b0: 7b 69 6e 63 72 20 69 20 33 7d 20 7b 0a 20 20 74  {incr i 3} {.  t
c1c0: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
c1d0: 6c 74 20 31 20 2d 73 7a 6f 73 66 69 6c 65 20 24  lt 1 -szosfile $
c1e0: 69 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  i.  sqlite3 db t
c1f0: 65 73 74 2e 64 62 0a 20 20 64 6f 5f 65 78 65 63  est.db.  do_exec
c200: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
c210: 31 35 2e 24 69 2e 31 20 7b 0a 20 20 20 20 53 45  15.$i.1 {.    SE
c220: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 78 3b 0a  LECT * FROM tx;.
c230: 20 20 7d 20 7b 41 79 75 74 74 68 61 79 61 20 42    } {Ayutthaya B
c240: 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f 6e 20 54 6f  eijing London To
c250: 6b 79 6f 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  kyo}.  db close.
c260: 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23    tv delete.}..#
c270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63  ---------.# Chec
c2c0: 6b 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  k that it is not
c2d0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
c2e0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
c2f0: 65 20 69 66 20 74 68 65 20 66 75 6c 6c 20 70 61  e if the full pa
c300: 74 68 0a 23 20 74 6f 20 74 68 65 20 61 73 73 6f  th.# to the asso
c310: 63 69 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  ciated journal f
c320: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6c 6f 6e 67  ile will be long
c330: 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 5f  er than sqlite3_
c340: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2e 0a  vfs.mxPathname..
c350: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
c360: 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70  fault 1.tv scrip
c370: 74 20 78 4f 70 65 6e 43 62 0a 74 76 20 66 69 6c  t xOpenCb.tv fil
c380: 74 65 72 20 78 4f 70 65 6e 0a 70 72 6f 63 20 78  ter xOpen.proc x
c390: 4f 70 65 6e 43 62 20 7b 6d 65 74 68 6f 64 20 66  OpenCb {method f
c3a0: 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20 73 65 74  ilename} {.  set
c3b0: 20 3a 3a 66 69 6c 65 5f 6c 65 6e 20 5b 73 74 72   ::file_len [str
c3c0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65  ing length $file
c3d0: 6e 61 6d 65 5d 0a 7d 0a 73 71 6c 69 74 65 33 20  name].}.sqlite3 
c3e0: 64 62 20 74 65 73 74 2e 64 62 0a 64 62 20 63 6c  db test.db.db cl
c3f0: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 66  ose.tv delete..f
c400: 6f 72 20 7b 73 65 74 20 69 69 20 5b 65 78 70 72  or {set ii [expr
c410: 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2d 35 5d 7d   $::file_len-5]}
c420: 20 7b 24 69 69 20 3c 20 5b 65 78 70 72 20 24 3a   {$ii < [expr $:
c430: 3a 66 69 6c 65 5f 6c 65 6e 2b 32 30 5d 7d 20 7b  :file_len+20]} {
c440: 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 74 65 73  incr ii} {.  tes
c450: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
c460: 20 31 20 2d 6d 78 70 61 74 68 6e 61 6d 65 20 24   1 -mxpathname $
c470: 69 69 0a 0a 20 20 23 20 54 68 65 20 6c 65 6e 67  ii..  # The leng
c480: 74 68 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 70  th of the full p
c490: 61 74 68 20 74 6f 20 66 69 6c 65 20 22 74 65 73  ath to file "tes
c4a0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 22 20 69 73  t.db-journal" is
c4b0: 20 28 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 29   ($::file_len+8)
c4c0: 2e 0a 20 20 23 20 49 66 20 74 68 65 20 63 6f 6e  ..  # If the con
c4d0: 66 69 67 75 72 65 64 20 73 71 6c 69 74 65 33 5f  figured sqlite3_
c4e0: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 76  vfs.mxPathname v
c4f0: 61 6c 75 65 20 67 72 65 61 74 65 72 20 74 68 61  alue greater tha
c500: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20  n or equal to.  
c510: 23 20 74 68 69 73 2c 20 74 68 65 6e 20 74 68 65  # this, then the
c520: 20 66 69 6c 65 20 63 61 6e 20 62 65 20 6f 70 65   file can be ope
c530: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
c540: 69 74 20 63 61 6e 6e 6f 74 2e 0a 20 20 23 0a 20  it cannot..  #. 
c550: 20 69 66 20 7b 24 69 69 20 3e 3d 20 5b 65 78 70   if {$ii >= [exp
c560: 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 5d  r $::file_len+8]
c570: 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20  } {.    set res 
c580: 7b 30 20 7b 7d 7d 0a 20 20 7d 20 65 6c 73 65 20  {0 {}}.  } else 
c590: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 31  {.    set res {1
c5a0: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
c5b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
c5c0: 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  .  }..  do_test 
c5d0: 70 61 67 65 72 31 2d 31 36 2e 31 2e 24 69 69 20  pager1-16.1.$ii 
c5e0: 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63  {.    list [catc
c5f0: 68 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74  h { sqlite3 db t
c600: 65 73 74 2e 64 62 20 7d 20 6d 73 67 5d 20 24 6d  est.db } msg] $m
c610: 73 67 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20 63  sg.  } $res..  c
c620: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
c630: 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23    tv delete.}..#
c640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
c690: 20 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65   "PRAGMA omit_re
c6a0: 61 64 6c 6f 63 6b 22 2e 20 0a 23 0a 23 20 20 20  adlock". .#.#   
c6b0: 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e  pager1-17.$tn.1.
c6c0: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20  *: Test that if 
c6d0: 61 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74  a second connect
c6e0: 69 6f 6e 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ion has an open 
c6f0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
c700: 20 20 20 20 20 20 20 20 72 65 61 64 2d 74 72 61          read-tra
c710: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 69 73 20  nsaction, it is 
c720: 6e 6f 74 20 75 73 75 61 6c 6c 79 20 70 6f 73 73  not usually poss
c730: 69 62 6c 65 20 74 6f 20 77 72 69 74 65 20 0a 23  ible to write .#
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61        the databa
c760: 73 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  se..#.#   pager1
c770: 2d 31 37 2e 24 74 6e 2e 32 2e 2a 3a 20 54 65 73  -17.$tn.2.*: Tes
c780: 74 20 74 68 61 74 20 69 66 20 74 68 65 20 73 65  t that if the se
c790: 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  cond connection 
c7a0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 0a  was opened with.
c7b0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
c7c0: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 49 54         the SQLIT
c7d0: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
c7e0: 66 6c 61 67 2c 20 61 6e 64 20 0a 23 20 20 20 20  flag, and .#    
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72    "PRAGMA omit_r
c810: 65 61 64 6c 6f 63 6b 20 3d 20 31 22 20 69 73 20  eadlock = 1" is 
c820: 65 78 65 63 75 74 65 64 20 62 65 66 6f 72 65 20  executed before 
c830: 61 74 74 61 63 68 69 6e 67 0a 23 20 20 20 20 20  attaching.#     
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
c860: 64 20 6f 70 65 6e 69 6e 67 20 61 20 72 65 61 64  d opening a read
c870: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
c880: 69 74 2c 20 69 74 20 69 73 0a 23 20 20 20 20 20  it, it is.#     
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 77 72 69   possible to wri
c8b0: 74 65 20 74 68 65 20 64 62 2e 0a 23 0a 23 20 20  te the db..#.#  
c8c0: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33   pager1-17.$tn.3
c8d0: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66  .*: Test that if
c8e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e   the second conn
c8f0: 65 63 74 69 6f 6e 20 77 61 73 20 2a 6e 6f 74 2a  ection was *not*
c900: 20 6f 70 65 6e 65 64 20 77 69 74 68 0a 23 20 20   opened with.#  
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c920: 20 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 4f      the SQLITE_O
c930: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61  PEN_READONLY fla
c940: 67 2c 20 65 78 65 63 75 74 69 6e 67 20 0a 23 20  g, executing .# 
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 20 20 20 20 22 50 52 41 47 4d 41 20 6f 6d 69       "PRAGMA omi
c970: 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 22 20  t_readlock = 1" 
c980: 68 61 73 20 6e 6f 20 65 66 66 65 63 74 2e 0a 23  has no effect..#
c990: 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f  .do_multiclient_
c9a0: 74 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74  test tn {.  do_t
c9b0: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
c9c0: 6e 2e 31 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31  n.1.1 {.    sql1
c9d0: 20 7b 20 0a 20 20 20 20 20 20 43 52 45 41 54 45   { .      CREATE
c9e0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
c9f0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
ca00: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
ca10: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  2);.    }.    sq
ca20: 6c 32 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e  l2 {.      BEGIN
ca30: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
ca40: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a   FROM t1;.    }.
ca50: 20 20 7d 20 7b 31 20 32 7d 0a 20 20 64 6f 5f 74    } {1 2}.  do_t
ca60: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
ca70: 6e 2e 31 2e 32 20 7b 0a 20 20 20 20 63 73 71 6c  n.1.2 {.    csql
ca80: 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  1 { INSERT INTO 
ca90: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20  t1 VALUES(3, 4) 
caa0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
cab0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
cac0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
cad0: 31 37 2e 24 74 6e 2e 31 2e 33 20 7b 0a 20 20 20  17.$tn.1.3 {.   
cae0: 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql2 { COMMIT }
caf0: 0a 20 20 20 20 73 71 6c 31 20 7b 20 49 4e 53 45  .    sql1 { INSE
cb00: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
cb10: 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 7d  S(3, 4) }.  } {}
cb20: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
cb30: 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 31 20 7b 0a  r1-17.$tn.2.1 {.
cb40: 20 20 20 20 63 6f 64 65 32 20 7b 0a 20 20 20 20      code2 {.    
cb50: 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 20 20    db2 close.    
cb60: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 3a 6d    sqlite3 db2 :m
cb70: 65 6d 6f 72 79 3a 20 2d 72 65 61 64 6f 6e 6c 79  emory: -readonly
cb80: 20 31 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   1.    }.    sql
cb90: 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d  2 { .      PRAGM
cba0: 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20  A omit_readlock 
cbb0: 3d 20 31 3b 0a 20 20 20 20 20 20 41 54 54 41 43  = 1;.      ATTAC
cbc0: 48 20 27 74 65 73 74 2e 64 62 27 20 41 53 20 74  H 'test.db' AS t
cbd0: 77 6f 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  wo;.      BEGIN;
cbe0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
cbf0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20  FROM t1;.    }. 
cc00: 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64   } {1 2 3 4}.  d
cc10: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37  o_test pager1-17
cc20: 2e 24 74 6e 2e 32 2e 32 20 7b 20 73 71 6c 31 20  .$tn.2.2 { sql1 
cc30: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20  "INSERT INTO t1 
cc40: 56 41 4c 55 45 53 28 35 2c 20 36 29 22 20 7d 20  VALUES(5, 6)" } 
cc50: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  {}.  do_test pag
cc60: 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 33 20 7b  er1-17.$tn.2.3 {
cc70: 20 73 71 6c 32 20 22 53 45 4c 45 43 54 20 2a 20   sql2 "SELECT * 
cc80: 46 52 4f 4d 20 74 31 22 20 7d 20 20 20 20 20 20  FROM t1" }      
cc90: 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a        {1 2 3 4}.
cca0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ccb0: 2d 31 37 2e 24 74 6e 2e 32 2e 34 20 7b 20 73 71  -17.$tn.2.4 { sq
ccc0: 6c 32 20 22 43 4f 4d 4d 49 54 20 3b 20 53 45 4c  l2 "COMMIT ; SEL
ccd0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 7d  ECT * FROM t1" }
cce0: 20 20 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d     {1 2 3 4 5 6}
ccf0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
cd00: 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 31 20 7b 0a  r1-17.$tn.3.1 {.
cd10: 20 20 20 20 63 6f 64 65 32 20 7b 0a 20 20 20 20      code2 {.    
cd20: 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 20 20    db2 close.    
cd30: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 3a 6d    sqlite3 db2 :m
cd40: 65 6d 6f 72 79 3a 0a 20 20 20 20 7d 0a 20 20 20  emory:.    }.   
cd50: 20 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 50   sql2 { .      P
cd60: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
cd70: 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 41  ock = 1;.      A
cd80: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 27 20  TTACH 'test.db' 
cd90: 41 53 20 74 77 6f 3b 0a 20 20 20 20 20 20 42 45  AS two;.      BE
cda0: 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  GIN;.      SELEC
cdb0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
cdc0: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
cdd0: 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  5 6}.  do_test p
cde0: 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 32  ager1-17.$tn.3.2
cdf0: 20 7b 0a 20 20 63 73 71 6c 31 20 7b 20 49 4e 53   {.  csql1 { INS
ce00: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
ce10: 45 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b  ES(3, 4) }.  } {
ce20: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
ce30: 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ocked}}.  do_tes
ce40: 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e  t pager1-17.$tn.
ce50: 33 2e 33 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49  3.3 { sql2 COMMI
ce60: 54 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  T } {}.}..#-----
ce70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20  ----.# Test the 
cec0: 70 61 67 65 72 73 20 72 65 73 70 6f 6e 73 65 20  pagers response 
ced0: 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  to the b-tree la
cee0: 79 65 72 20 72 65 71 75 65 73 74 69 6e 67 20 69  yer requesting i
cef0: 6c 6c 65 67 61 6c 20 70 61 67 65 20 0a 23 20 6e  llegal page .# n
cf00: 75 6d 62 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20  umbers:.#.#   + 
cf10: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65  The locking page
cf20: 2c 0a 23 20 20 20 2b 20 50 61 67 65 20 30 2c 0a  ,.#   + Page 0,.
cf30: 23 20 20 20 2b 20 41 20 70 61 67 65 20 77 69 74  #   + A page wit
cf40: 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  h a page number 
cf50: 67 72 65 61 74 65 72 20 74 68 61 6e 20 28 32 5e  greater than (2^
cf60: 33 31 2d 31 29 2e 0a 23 0a 64 6f 5f 74 65 73 74  31-1)..#.do_test
cf70: 20 70 61 67 65 72 31 2d 31 38 2e 31 20 7b 0a 20   pager1-18.1 {. 
cf80: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
cf90: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62  _and_reopen.  db
cfa0: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
cfb0: 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
cfc0: 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20  l { .    PRAGMA 
cfd0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
cfe0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
cff0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
d000: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
d010: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
d020: 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32  500), a_string(2
d030: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
d040: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
d050: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
d060: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
d070: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
d080: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
d090: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
d0a0: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
d0b0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
d0c0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
d0d0: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
d0e0: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
d0f0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
d100: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
d110: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
d120: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
d130: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
d140: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
d150: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
d160: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
d170: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
d180: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
d190: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
d1a0: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
d1b0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
d1c0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
d1d0: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
d1e0: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
d1f0: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  M t1;.  }.} {}.d
d200: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38  o_test pager1-18
d210: 2e 32 20 7b 0a 20 20 73 65 74 20 72 6f 6f 74 20  .2 {.  set root 
d220: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
d230: 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
d240: 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20  lite_master"].  
d250: 73 65 74 20 6c 6f 63 6b 69 6e 67 70 61 67 65 20  set lockingpage 
d260: 5b 65 78 70 72 20 28 30 78 31 30 30 30 30 2f 31  [expr (0x10000/1
d270: 30 32 34 29 20 2b 20 31 5d 0a 20 20 65 78 65 63  024) + 1].  exec
d280: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
d290: 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
d2a0: 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45   = 1;.    UPDATE
d2b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53   sqlite_master S
d2c0: 45 54 20 72 6f 6f 74 70 61 67 65 20 3d 20 24 6c  ET rootpage = $l
d2d0: 6f 63 6b 69 6e 67 70 61 67 65 3b 0a 20 20 7d 0a  ockingpage;.  }.
d2e0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
d2f0: 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c  st.db.  catchsql
d300: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
d310: 2a 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32  *) FROM t1 } db2
d320: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
d330: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
d340: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c  lformed}}.db2 cl
d350: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ose.do_test page
d360: 72 31 2d 31 38 2e 33 20 7b 0a 20 20 65 78 65 63  r1-18.3 {.  exec
d370: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
d380: 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20   TABLE t2(x);.  
d390: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
d3a0: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
d3b0: 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73  (5000));.  }.  s
d3c0: 65 74 20 70 67 6e 6f 20 5b 65 78 70 72 20 28 5b  et pgno [expr ([
d3d0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
d3e0: 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20 20  b] / 1024)-2].  
d3f0: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
d400: 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f  .db [expr ($pgno
d410: 2d 31 29 2a 31 30 32 34 5d 20 30 30 30 30 30 30  -1)*1024] 000000
d420: 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  00.  sqlite3 db2
d430: 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68   test.db.  catch
d440: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e  sql { SELECT len
d450: 67 74 68 28 78 29 20 46 52 4f 4d 20 74 32 20 7d  gth(x) FROM t2 }
d460: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
d470: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d480: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
d490: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
d4a0: 70 61 67 65 72 31 2d 31 38 2e 34 20 7b 0a 20 20  pager1-18.4 {.  
d4b0: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
d4c0: 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f  .db [expr ($pgno
d4d0: 2d 31 29 2a 31 30 32 34 5d 20 39 30 30 30 30 30  -1)*1024] 900000
d4e0: 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  00.  sqlite3 db2
d4f0: 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68   test.db.  catch
d500: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e  sql { SELECT len
d510: 67 74 68 28 78 29 20 46 52 4f 4d 20 74 32 20 7d  gth(x) FROM t2 }
d520: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
d530: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d540: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
d550: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
d560: 70 61 67 65 72 31 2d 31 38 2e 35 20 7b 0a 20 20  pager1-18.5 {.  
d570: 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20 20  sqlite3 db "".  
d580: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
d590: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
d5a0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
d5b0: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
d5c0: 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61      PRAGMA writa
d5d0: 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a  ble_schema = 1;.
d5e0: 20 20 20 20 55 50 44 41 54 45 20 73 71 6c 69 74      UPDATE sqlit
d5f0: 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f  e_master SET roo
d600: 74 70 61 67 65 3d 35 20 57 48 45 52 45 20 74 62  tpage=5 WHERE tb
d610: 6c 5f 6e 61 6d 65 20 3d 20 27 74 31 27 3b 0a 20  l_name = 't1';. 
d620: 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62     PRAGMA writab
d630: 6c 65 5f 73 63 68 65 6d 61 20 3d 20 30 3b 0a 20  le_schema = 0;. 
d640: 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74     ALTER TABLE t
d650: 31 20 52 45 4e 41 4d 45 20 54 4f 20 78 31 3b 0a  1 RENAME TO x1;.
d660: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b    }.  catchsql {
d670: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
d680: 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 }.} {1 {databa
d690: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
d6a0: 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 20   malformed}}.db 
d6b0: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70  close..do_test p
d6c0: 61 67 65 72 31 2d 31 38 2e 36 20 7b 0a 20 20 66  ager1-18.6 {.  f
d6d0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
d6e0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
d6f0: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
d700: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
d710: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
d720: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
d730: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d740: 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52  t1(x);.    INSER
d750: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
d760: 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b  (a_string(800));
d770: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d780: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
d790: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 7d 0a 0a  ing(800));.  }..
d7a0: 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f    set root [db o
d7b0: 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 70  ne "SELECT rootp
d7c0: 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  age FROM sqlite_
d7d0: 6d 61 73 74 65 72 22 5d 0a 20 20 64 62 20 63 6c  master"].  db cl
d7e0: 6f 73 65 0a 0a 20 20 68 65 78 69 6f 5f 77 72 69  ose..  hexio_wri
d7f0: 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72  te test.db [expr
d800: 20 28 24 72 6f 6f 74 2d 31 29 2a 31 30 32 34 20   ($root-1)*1024 
d810: 2b 20 38 5d 20 30 30 30 30 30 30 30 30 0a 20 20  + 8] 00000000.  
d820: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
d830: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  db.  catchsql { 
d840: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29  SELECT length(x)
d850: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20   FROM t1 }.} {1 
d860: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
d870: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
d880: 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  d}}..do_test pag
d890: 65 72 31 2d 31 39 2e 31 20 7b 0a 20 20 73 71 6c  er1-19.1 {.  sql
d8a0: 69 74 65 33 20 64 62 20 22 22 0a 20 20 64 62 20  ite3 db "".  db 
d8b0: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
d8c0: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
d8d0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
d8e0: 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
d8f0: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
d900: 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43  acuum = 1;.    C
d910: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
d920: 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61  a, ab, ac, ad, a
d930: 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61  e, af, ag, ah, a
d940: 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61  i, aj, ak, al, a
d950: 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, an,.         
d960: 20 20 20 20 20 20 20 20 20 20 20 62 61 2c 20 62             ba, b
d970: 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62  b, bc, bd, be, b
d980: 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62  f, bg, bh, bi, b
d990: 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62  j, bk, bl, bm, b
d9a0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d9b0: 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63         ca, cb, c
d9c0: 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63  c, cd, ce, cf, c
d9d0: 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63  g, ch, ci, cj, c
d9e0: 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20  k, cl, cm, cn,. 
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64     da, db, dc, d
da10: 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64  d, de, df, dg, d
da20: 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64  h, di, dj, dk, d
da30: 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20  l, dm, dn,.     
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
da50: 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65  a, eb, ec, ed, e
da60: 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65  e, ef, eg, eh, e
da70: 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65  i, ej, ek, el, e
da80: 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, en,.         
da90: 20 20 20 20 20 20 20 20 20 20 20 66 61 2c 20 66             fa, f
daa0: 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66  b, fc, fd, fe, f
dab0: 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66  f, fg, fh, fi, f
dac0: 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66  j, fk, fl, fm, f
dad0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dae0: 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67         ga, gb, g
daf0: 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67  c, gd, ge, gf, g
db00: 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67  g, gh, gi, gj, g
db10: 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20  k, gl, gm, gn,. 
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68     ha, hb, hc, h
db40: 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68  d, he, hf, hg, h
db50: 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68  h, hi, hj, hk, h
db60: 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20  l, hm, hn,.     
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
db80: 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69  a, ib, ic, id, i
db90: 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69  e, if, ig, ih, i
dba0: 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69  i, ij, ik, il, i
dbb0: 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20  m, ix,.         
dbc0: 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a             ja, j
dbd0: 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a  b, jc, jd, je, j
dbe0: 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a  f, jg, jh, ji, j
dbf0: 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a  j, jk, jl, jm, j
dc00: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dc10: 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b         ka, kb, k
dc20: 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b  c, kd, ke, kf, k
dc30: 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b  g, kh, ki, kj, k
dc40: 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20  k, kl, km, kn,. 
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c     la, lb, lc, l
dc70: 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c  d, le, lf, lg, l
dc80: 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c  h, li, lj, lk, l
dc90: 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20  l, lm, ln,.     
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
dcb0: 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d  a, mb, mc, md, m
dcc0: 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d  e, mf, mg, mh, m
dcd0: 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d  i, mj, mk, ml, m
dce0: 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20  m, mn.    );.   
dcf0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
dd00: 28 61 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c  (aa, ab, ac, ad,
dd10: 20 61 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c   ae, af, ag, ah,
dd20: 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c   ai, aj, ak, al,
dd30: 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20   am, an,.       
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61 2c               ba,
dd50: 20 62 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c   bb, bc, bd, be,
dd60: 20 62 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c   bf, bg, bh, bi,
dd70: 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c   bj, bk, bl, bm,
dd80: 20 62 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   bn,.           
dd90: 20 20 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c           ca, cb,
dda0: 20 63 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c   cc, cd, ce, cf,
ddb0: 20 63 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c   cg, ch, ci, cj,
ddc0: 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c   ck, cl, cm, cn,
ddd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dde0: 20 20 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c       da, db, dc,
ddf0: 20 64 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c   dd, de, df, dg,
de00: 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c   dh, di, dj, dk,
de10: 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20   dl, dm, dn,.   
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 65 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c   ea, eb, ec, ed,
de40: 20 65 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c   ee, ef, eg, eh,
de50: 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c   ei, ej, ek, el,
de60: 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20   em, en,.       
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 2c               fa,
de80: 20 66 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c   fb, fc, fd, fe,
de90: 20 66 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c   ff, fg, fh, fi,
dea0: 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c   fj, fk, fl, fm,
deb0: 20 66 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   fn,.           
dec0: 20 20 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c           ga, gb,
ded0: 20 67 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c   gc, gd, ge, gf,
dee0: 20 67 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c   gg, gh, gi, gj,
def0: 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c   gk, gl, gm, gn,
df00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df10: 20 20 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c       ha, hb, hc,
df20: 20 68 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c   hd, he, hf, hg,
df30: 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c   hh, hi, hj, hk,
df40: 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20   hl, hm, hn,.   
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 69 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c   ia, ib, ic, id,
df70: 20 69 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c   ie, if, ig, ih,
df80: 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c   ii, ij, ik, il,
df90: 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20   im, ix,.       
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c               ja,
dfb0: 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c   jb, jc, jd, je,
dfc0: 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c   jf, jg, jh, ji,
dfd0: 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c   jj, jk, jl, jm,
dfe0: 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   jn,.           
dff0: 20 20 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c           ka, kb,
e000: 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c   kc, kd, ke, kf,
e010: 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c   kg, kh, ki, kj,
e020: 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c   kk, kl, km, kn,
e030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e040: 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c       la, lb, lc,
e050: 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c   ld, le, lf, lg,
e060: 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c   lh, li, lj, lk,
e070: 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20   ll, lm, ln,.   
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c   ma, mb, mc, md,
e0a0: 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c   me, mf, mg, mh,
e0b0: 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c   mi, mj, mk, ml,
e0c0: 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20   mm, mn.    );. 
e0d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e0e0: 31 28 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f  1(aa) VALUES( a_
e0f0: 73 74 72 69 6e 67 28 31 30 30 30 30 30 29 20 29  string(100000) )
e100: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
e110: 4f 20 74 32 28 61 61 29 20 56 41 4c 55 45 53 28  O t2(aa) VALUES(
e120: 20 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30 30   a_string(100000
e130: 29 20 29 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b  ) );.    VACUUM;
e140: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  .  }.} {}..#----
e150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e190: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 61 20 63  -----.# Test a c
e1a0: 6f 75 70 6c 65 20 6f 66 20 73 70 65 63 69 61 6c  ouple of special
e1b0: 20 63 61 73 65 73 20 74 68 61 74 20 63 6f 6d 65   cases that come
e1c0: 20 75 70 20 77 68 69 6c 65 20 63 6f 6d 6d 69 74   up while commit
e1d0: 74 69 6e 67 20 0a 23 20 74 72 61 6e 73 61 63 74  ting .# transact
e1e0: 69 6f 6e 73 3a 0a 23 0a 23 20 20 20 70 61 67 65  ions:.#.#   page
e1f0: 72 31 2d 32 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69  r1-20.1.*: Commi
e200: 74 74 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  tting an in-memo
e210: 72 79 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ry database tran
e220: 73 61 63 74 69 6f 6e 20 77 68 65 6e 20 74 68 65  saction when the
e230: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
e240: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 68 61       database ha
e250: 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  s not been modif
e260: 69 65 64 20 61 74 20 61 6c 6c 2e 0a 23 0a 23 20  ied at all..#.# 
e270: 20 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 2a 3a    pager1-20.2.*:
e280: 20 41 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77   As above, but w
e290: 69 74 68 20 61 20 6e 6f 72 6d 61 6c 20 64 62 20  ith a normal db 
e2a0: 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63  in exclusive-loc
e2b0: 6b 69 6e 67 20 6d 6f 64 65 2e 0a 23 0a 23 20 20  king mode..#.#  
e2c0: 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 2a 3a 20   pager1-20.3.*: 
e2d0: 43 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  Committing a tra
e2e0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 57 41 4c 20  nsaction in WAL 
e2f0: 6d 6f 64 65 20 77 68 65 72 65 20 74 68 65 20 64  mode where the d
e300: 61 74 61 62 61 73 65 20 68 61 73 0a 23 20 20 20  atabase has.#   
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
e320: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 62 75  een modified, bu
e330: 74 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  t all dirty page
e340: 73 20 68 61 76 65 20 62 65 65 6e 20 66 6c 75 73  s have been flus
e350: 68 65 64 20 74 6f 20 0a 23 20 20 20 20 20 20 20  hed to .#       
e360: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 20             disk 
e370: 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 6d 69  before the commi
e380: 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  t..#.do_test pag
e390: 65 72 31 2d 32 30 2e 31 2e 31 20 7b 0a 20 20 63  er1-20.1.1 {.  c
e3a0: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
e3b0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65    sqlite3 db :me
e3c0: 6d 6f 72 79 3a 0a 20 20 65 78 65 63 73 71 6c 20  mory:.  execsql 
e3d0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
e3e0: 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65  LE one(two, thre
e3f0: 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  e);.    INSERT I
e400: 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27  NTO one VALUES('
e410: 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20  a', 'b');.  }.} 
e420: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
e430: 31 2d 32 30 2e 31 2e 32 20 7b 0a 20 20 65 78 65  1-20.1.2 {.  exe
e440: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
e450: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20   EXCLUSIVE;.    
e460: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
e470: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
e480: 2d 32 30 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c  -20.2.1 {.  faul
e490: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
e4a0: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
e4b0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f   {.    PRAGMA lo
e4c0: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63  cking_mode = exc
e4d0: 6c 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41 47  lusive;.    PRAG
e4e0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
e4f0: 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 43  = persist;.    C
e500: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28  REATE TABLE one(
e510: 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20  two, three);.   
e520: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65   INSERT INTO one
e530: 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
e540: 29 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73  );.  }.} {exclus
e550: 69 76 65 20 70 65 72 73 69 73 74 7d 0a 64 6f 5f  ive persist}.do_
e560: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 32  test pager1-20.2
e570: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
e580: 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55  .    BEGIN EXCLU
e590: 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  SIVE;.    COMMIT
e5a0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61  ;.  }.} {}..ifca
e5b0: 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f  pable wal {.  do
e5c0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e  _test pager1-20.
e5d0: 33 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73  3.1 {.    faults
e5e0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
e5f0: 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63  open.    db func
e600: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
e610: 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  ng.    execsql {
e620: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61  .      PRAGMA ca
e630: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
e640: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
e650: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a  nal_mode = wal;.
e660: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
e670: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
e680: 45 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 20  E t1(x);.       
e690: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
e6a0: 28 79 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  (y);.        INS
e6b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
e6c0: 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29  ES(a_string(800)
e6d0: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
e6e0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
e6f0: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
e700: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
e710: 2f 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 20 20  /*   2 */.      
e720: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
e730: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
e740: 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (800) FROM t1;  
e750: 20 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f         /*   4 */
e760: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
e770: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
e780: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
e790: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  M t1;         /*
e7a0: 20 20 20 38 20 2a 2f 0a 20 20 20 20 20 20 20 20     8 */.        
e7b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
e7c0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38  ELECT a_string(8
e7d0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
e7e0: 20 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20       /*  16 */. 
e7f0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
e800: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
e810: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
e820: 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20  t1;         /*  
e830: 33 32 20 2a 2f 0a 20 20 20 20 20 20 43 4f 4d 4d  32 */.      COMM
e840: 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77  IT;.    }.  } {w
e850: 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  al}.  do_test pa
e860: 67 65 72 31 2d 32 30 2e 33 2e 32 20 7b 0a 20 20  ger1-20.3.2 {.  
e870: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
e880: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
e890: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
e8a0: 4c 55 45 53 28 27 78 78 78 78 27 29 3b 0a 20 20  LUES('xxxx');.  
e8b0: 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76    }.    recursiv
e8c0: 65 5f 73 65 6c 65 63 74 20 33 32 20 74 31 0a 20  e_select 32 t1. 
e8d0: 20 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49     execsql COMMI
e8e0: 54 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d  T.  } {}.}..#---
e8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e930: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
e940: 61 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  at a WAL databas
e950: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  e may not be ope
e960: 6e 65 64 20 69 66 3a 0a 23 0a 23 20 20 20 70 61  ned if:.#.#   pa
e970: 67 65 72 31 2d 32 31 2e 31 2e 2a 3a 20 54 68 65  ger1-21.1.*: The
e980: 20 56 46 53 20 68 61 73 20 61 6e 20 69 56 65 72   VFS has an iVer
e990: 73 69 6f 6e 20 6c 65 73 73 20 74 68 61 6e 20 32  sion less than 2
e9a0: 2c 20 6f 72 0a 23 20 20 20 70 61 67 65 72 31 2d  , or.#   pager1-
e9b0: 32 31 2e 32 2e 2a 3a 20 54 68 65 20 56 46 53 20  21.2.*: The VFS 
e9c0: 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65  does not provide
e9d0: 20 78 53 68 6d 58 58 58 28 29 20 6d 65 74 68 6f   xShmXXX() metho
e9e0: 64 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  ds..#.ifcapable 
e9f0: 77 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  wal {.  do_test 
ea00: 70 61 67 65 72 31 2d 32 31 2e 30 20 7b 0a 20 20  pager1-21.0 {.  
ea10: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
ea20: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20  e_and_reopen.   
ea30: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
ea40: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
ea50: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
ea60: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b    CREATE TABLE k
ea70: 6f 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63  o(c DEFAULT 'abc
ea80: 27 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65  ', b DEFAULT 'de
ea90: 66 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  f');.      INSER
eaa0: 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c  T INTO ko DEFAUL
eab0: 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a  T VALUES;.    }.
eac0: 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74    } {wal}.  do_t
ead0: 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e 31 20  est pager1-21.1 
eae0: 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76  {.    testvfs tv
eaf0: 20 2d 6e 6f 73 68 6d 20 31 0a 20 20 20 20 73 71   -noshm 1.    sq
eb00: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
eb10: 62 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61  b -vfs tv.    ca
eb20: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
eb30: 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a  * FROM ko } db2.
eb40: 20 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74    } {1 {unable t
eb50: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
eb60: 66 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f  file}}.  db2 clo
eb70: 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 20  se.  tv delete. 
eb80: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
eb90: 32 31 2e 32 20 7b 0a 20 20 20 20 74 65 73 74 76  21.2 {.    testv
eba0: 66 73 20 74 76 20 2d 69 76 65 72 73 69 6f 6e 20  fs tv -iversion 
ebb0: 31 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  1.    sqlite3 db
ebc0: 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74  2 test.db -vfs t
ebd0: 76 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  v.    catchsql {
ebe0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b   SELECT * FROM k
ebf0: 6f 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b  o } db2.  } {1 {
ec00: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
ec10: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20  atabase file}}. 
ec20: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20   db2 close.  tv 
ec30: 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  delete.}..#-----
ec40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec80: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
ec90: 20 61 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63   a "PRAGMA wal_c
eca0: 68 65 63 6b 70 6f 69 6e 74 22 3a 0a 23 0a 23 20  heckpoint":.#.# 
ecb0: 20 20 70 61 67 65 72 31 2d 32 32 2e 31 2e 2a 3a    pager1-22.1.*:
ecc0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61   is a no-op on a
ecd0: 20 6e 6f 6e 2d 57 41 4c 20 64 62 2c 20 61 6e 64   non-WAL db, and
ece0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32 2e 32  .#   pager1-22.2
ecf0: 2e 2a 3a 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  .*: does not cau
ed00: 73 65 20 78 53 79 6e 63 20 63 61 6c 6c 73 20 77  se xSync calls w
ed10: 69 74 68 20 61 20 73 79 6e 63 68 72 6f 6e 6f 75  ith a synchronou
ed20: 73 3d 6f 66 66 20 64 62 2e 0a 23 0a 64 6f 5f 74  s=off db..#.do_t
ed30: 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e 31 2e  est pager1-22.1.
ed40: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
ed50: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
ed60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
ed70: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f   CREATE TABLE ko
ed80: 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27  (c DEFAULT 'abc'
ed90: 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66  , b DEFAULT 'def
eda0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
edb0: 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56  NTO ko DEFAULT V
edc0: 41 4c 55 45 53 3b 0a 20 20 7d 0a 20 20 65 78 65  ALUES;.  }.  exe
edd0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
ede0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 7d  l_checkpoint }.}
edf0: 20 7b 30 20 2d 31 20 2d 31 7d 0a 64 6f 5f 74 65   {0 -1 -1}.do_te
ee00: 73 74 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 31  st pager1-22.2.1
ee10: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
ee20: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20  -default 1.  tv 
ee30: 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74  filter xSync.  t
ee40: 76 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62  v script xSyncCb
ee50: 0a 20 20 70 72 6f 63 20 78 53 79 6e 63 43 62 20  .  proc xSyncCb 
ee60: 7b 61 72 67 73 7d 20 7b 69 6e 63 72 20 3a 3a 73  {args} {incr ::s
ee70: 79 6e 63 63 6f 75 6e 74 7d 0a 20 20 73 65 74 20  ynccount}.  set 
ee80: 3a 3a 73 79 6e 63 63 6f 75 6e 74 20 30 0a 20 20  ::synccount 0.  
ee90: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
eea0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
eeb0: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
eec0: 6f 6e 6f 75 73 20 3d 20 6f 66 66 3b 0a 20 20 20  onous = off;.   
eed0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
eee0: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
eef0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44  INSERT INTO ko D
ef00: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20  EFAULT VALUES;. 
ef10: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
ef20: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
ef30: 6f 69 6e 74 20 7d 0a 20 20 73 65 74 20 73 79 6e  oint }.  set syn
ef40: 63 63 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 64 62 20  ccount.} {0}.db 
ef50: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
ef60: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
efb0: 73 74 73 20 66 6f 72 20 63 68 61 6e 67 69 6e 67  sts for changing
efc0: 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 23   journal mode..#
efd0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 31  .#   pager1-23.1
efe0: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 77 68  .*: Test that wh
eff0: 65 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d  en changing from
f000: 20 50 45 52 53 49 53 54 20 74 6f 20 44 45 4c 45   PERSIST to DELE
f010: 54 45 20 6d 6f 64 65 2c 0a 23 20 20 20 20 20 20  TE mode,.#      
f020: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
f030: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f040: 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 20 20 70  deleted..#.#   p
f050: 61 67 65 72 31 2d 32 33 2e 32 2e 2a 3a 20 53 61  ager1-23.2.*: Sa
f060: 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65  me test as above
f070: 2c 20 62 75 74 20 77 68 69 6c 65 20 61 20 73 68  , but while a sh
f080: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ared lock is hel
f090: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
f0a0: 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
f0b0: 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20  base file..#.#  
f0c0: 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 2a 3a 20   pager1-23.3.*: 
f0d0: 53 61 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f  Same test as abo
f0e0: 76 65 2c 20 62 75 74 20 77 68 69 6c 65 20 61 20  ve, but while a 
f0f0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 69 73  reserved lock is
f100: 20 68 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20   held.#         
f110: 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20           on the 
f120: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23  database file..#
f130: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 34  .#   pager1-23.4
f140: 2e 2a 3a 20 41 6e 64 2c 20 66 6f 72 20 66 75 6e  .*: And, for fun
f150: 2c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  , while holding 
f160: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
f170: 6b 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  k..#.#   pager1-
f180: 32 33 2e 35 2e 2a 3a 20 54 72 79 20 74 6f 20 73  23.5.*: Try to s
f190: 65 74 20 76 61 72 69 6f 75 73 20 64 69 66 66 65  et various diffe
f1a0: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  rent journal mod
f1b0: 65 73 20 77 69 74 68 20 61 6e 0a 23 20 20 20 20  es with an.#    
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
f1d0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
f1e0: 20 28 6f 6e 6c 79 20 4d 45 4d 4f 52 59 20 61 6e   (only MEMORY an
f1f0: 64 20 4f 46 46 20 73 68 6f 75 6c 64 20 77 6f 72  d OFF should wor
f200: 6b 29 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  k)..#.#   pager1
f210: 2d 32 33 2e 36 2e 2a 3a 20 54 72 79 20 74 6f 20  -23.6.*: Try to 
f220: 73 65 74 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  set locking_mode
f230: 3d 6e 6f 72 6d 61 6c 20 6f 6e 20 61 6e 20 69 6e  =normal on an in
f240: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
f250: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
f260: 20 20 20 20 28 64 6f 65 73 6e 27 74 20 77 6f 72      (doesn't wor
f270: 6b 20 2d 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  k - in-memory da
f280: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 75  tabases always u
f290: 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  se.#            
f2a0: 20 20 20 20 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f        locking_mo
f2b0: 64 65 3d 65 78 63 6c 75 73 69 76 65 29 2e 0a 23  de=exclusive)..#
f2c0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f2d0: 32 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  23.1.1 {.  fault
f2e0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
f2f0: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
f300: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
f310: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
f320: 49 53 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20  IST;.    CREATE 
f330: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
f340: 20 20 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74    }.  file exist
f350: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f360: 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  l.} {1}.do_test 
f370: 70 61 67 65 72 31 2d 32 33 2e 31 2e 32 20 7b 0a  pager1-23.1.2 {.
f380: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
f390: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f3a0: 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 66 69 6c  = DELETE }.  fil
f3b0: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
f3c0: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a  -journal.} {0}..
f3d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f3e0: 33 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.2.1 {.  execsq
f3f0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
f400: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
f410: 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52  RSIST;.    INSER
f420: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
f430: 28 27 43 61 6e 62 65 72 72 61 27 2c 20 27 41 43  ('Canberra', 'AC
f440: 54 27 29 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76  T');.  }.  db ev
f450: 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  al { SELECT * FR
f460: 4f 4d 20 74 31 20 7d 20 7b 0a 20 20 20 20 64 62  OM t1 } {.    db
f470: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a   eval { PRAGMA j
f480: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
f490: 4c 45 54 45 20 7d 0a 20 20 7d 0a 20 20 65 78 65  LETE }.  }.  exe
f4a0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
f4b0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b  urnal_mode }.} {
f4c0: 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20  delete}.do_test 
f4d0: 70 61 67 65 72 31 2d 32 33 2e 32 2e 32 20 7b 0a  pager1-23.2.2 {.
f4e0: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
f4f0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
f500: 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  {0}..do_test pag
f510: 65 72 31 2d 32 33 2e 33 2e 31 20 7b 0a 20 20 65  er1-23.3.1 {.  e
f520: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
f530: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f540: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
f550: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
f560: 41 4c 55 45 53 28 27 44 61 72 77 69 6e 27 2c 20  ALUES('Darwin', 
f570: 27 4e 54 27 29 3b 0a 20 20 20 20 42 45 47 49 4e  'NT');.    BEGIN
f580: 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20 7d 0a   IMMEDIATE;.  }.
f590: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
f5a0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f5b0: 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 65 78 65  = DELETE }.  exe
f5c0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
f5d0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b  urnal_mode }.} {
f5e0: 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20  delete}.do_test 
f5f0: 70 61 67 65 72 31 2d 32 33 2e 33 2e 32 20 7b 0a  pager1-23.3.2 {.
f600: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
f610: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
f620: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {0}.do_test page
f630: 72 31 2d 32 33 2e 33 2e 33 20 7b 0a 20 20 65 78  r1-23.3.3 {.  ex
f640: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  ecsql COMMIT.} {
f650: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
f660: 31 2d 32 33 2e 34 2e 31 20 7b 0a 20 20 65 78 65  1-23.4.1 {.  exe
f670: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
f680: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f690: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e   PERSIST;.    IN
f6a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
f6b0: 55 45 53 28 27 41 64 65 6c 61 69 64 65 27 2c 20  UES('Adelaide', 
f6c0: 27 53 41 27 29 3b 0a 20 20 20 20 42 45 47 49 4e  'SA');.    BEGIN
f6d0: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a   EXCLUSIVE;.  }.
f6e0: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
f6f0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f700: 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 65 78 65  = DELETE }.  exe
f710: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
f720: 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b  urnal_mode }.} {
f730: 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20  delete}.do_test 
f740: 70 61 67 65 72 31 2d 32 33 2e 34 2e 32 20 7b 0a  pager1-23.4.2 {.
f750: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
f760: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
f770: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {0}.do_test page
f780: 72 31 2d 32 33 2e 34 2e 33 20 7b 0a 20 20 65 78  r1-23.4.3 {.  ex
f790: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  ecsql COMMIT.} {
f7a0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
f7b0: 31 2d 32 33 2e 35 2e 31 20 7b 0a 20 20 66 61 75  1-23.5.1 {.  fau
f7c0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
f7d0: 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65  _reopen.  sqlite
f7e0: 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 7d 20  3 db :memory:.} 
f7f0: 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6d  {}.foreach {tn m
f800: 6f 64 65 20 70 6f 73 73 69 62 6c 65 7d 20 7b 0a  ode possible} {.
f810: 20 20 32 20 20 6f 66 66 20 20 20 20 20 20 31 0a    2  off      1.
f820: 20 20 33 20 20 6d 65 6d 6f 72 79 20 20 20 31 0a    3  memory   1.
f830: 20 20 34 20 20 70 65 72 73 69 73 74 20 20 30 0a    4  persist  0.
f840: 20 20 35 20 20 64 65 6c 65 74 65 20 20 20 30 0a    5  delete   0.
f850: 20 20 36 20 20 77 61 6c 20 20 20 20 20 20 30 0a    6  wal      0.
f860: 20 20 37 20 20 74 72 75 6e 63 61 74 65 20 30 0a    7  truncate 0.
f870: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } {.  do_test pa
f880: 67 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 31 20  ger1-23.5.$tn.1 
f890: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50  {.    execsql "P
f8a0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f8b0: 64 65 20 3d 20 6f 66 66 22 0a 20 20 20 20 65 78  de = off".    ex
f8c0: 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f  ecsql "PRAGMA jo
f8d0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f  urnal_mode = $mo
f8e0: 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73  de".  } [if $pos
f8f0: 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64  sible {list $mod
f900: 65 7d 20 7b 6c 69 73 74 20 6f 66 66 7d 5d 0a 20  e} {list off}]. 
f910: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
f920: 32 33 2e 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  23.5.$tn.2 {.   
f930: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
f940: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f950: 6d 65 6d 6f 72 79 22 0a 20 20 20 20 65 78 65 63  memory".    exec
f960: 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  sql "PRAGMA jour
f970: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65  nal_mode = $mode
f980: 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73 73 69  ".  } [if $possi
f990: 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d  ble {list $mode}
f9a0: 20 7b 6c 69 73 74 20 6d 65 6d 6f 72 79 7d 5d 0a   {list memory}].
f9b0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
f9c0: 2d 32 33 2e 36 2e 31 20 7b 0a 20 20 65 78 65 63  -23.6.1 {.  exec
f9d0: 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b  sql {PRAGMA lock
f9e0: 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61  ing_mode = norma
f9f0: 6c 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d  l}.} {exclusive}
fa00: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
fa10: 32 33 2e 36 2e 32 20 7b 0a 20 20 65 78 65 63 73  23.6.2 {.  execs
fa20: 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69  ql {PRAGMA locki
fa30: 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73  ng_mode = exclus
fa40: 69 76 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  ive}.} {exclusiv
fa50: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
fa60: 31 2d 32 33 2e 36 2e 33 20 7b 0a 20 20 65 78 65  1-23.6.3 {.  exe
fa70: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63  csql {PRAGMA loc
fa80: 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78  king_mode}.} {ex
fa90: 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74  clusive}.do_test
faa0: 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 34 20 7b   pager1-23.6.4 {
fab0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47  .  execsql {PRAG
fac0: 4d 41 20 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f  MA main.locking_
fad0: 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  mode}.} {exclusi
fae0: 76 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ve}..#----------
faf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
fb30: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
fb40: 2d 32 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c  -24.1.1 {.  faul
fb50: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
fb60: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
fb70: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
fb80: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
fb90: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
fba0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50  size = 10;.    P
fbb0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
fbc0: 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 43 52  m = FULL;.    CR
fbd0: 45 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 2c  EATE TABLE x1(x,
fbe0: 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b   y, z, PRIMARY K
fbf0: 45 59 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20 43  EY(y, z));.    C
fc00: 52 45 41 54 45 20 54 41 42 4c 45 20 78 32 28 78  REATE TABLE x2(x
fc10: 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20  , y, z, PRIMARY 
fc20: 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20  KEY(y, z));.    
fc30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 56  INSERT INTO x2 V
fc40: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 34  ALUES(a_string(4
fc50: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30  00), a_string(50
fc60: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
fc70: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
fc80: 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f  NTO x2 SELECT a_
fc90: 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73  string(600), a_s
fca0: 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74  tring(400), a_st
fcb0: 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20 78  ring(500) FROM x
fcc0: 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  2;.    INSERT IN
fcd0: 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73  TO x2 SELECT a_s
fce0: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
fcf0: 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72  ring(600), a_str
fd00: 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 78 32  ing(400) FROM x2
fd10: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fd20: 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74  O x2 SELECT a_st
fd30: 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72  ring(400), a_str
fd40: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
fd50: 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 78 32 3b  ng(600) FROM x2;
fd60: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
fd70: 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   x2 SELECT a_str
fd80: 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69  ing(600), a_stri
fd90: 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(400), a_strin
fda0: 67 28 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a  g(500) FROM x2;.
fdb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
fdc0: 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  x2 SELECT a_stri
fdd0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
fde0: 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(600), a_string
fdf0: 28 34 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20  (400) FROM x2;. 
fe00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
fe10: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
fe20: 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(400), a_string
fe30: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
fe40: 36 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  600) FROM x2;.  
fe50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
fe60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
fe70: 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  2;.  }.} {}.do_t
fe80: 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e  est pager1-24.1.
fe90: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
fea0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
feb0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 20   DELETE FROM x1 
fec0: 57 48 45 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a  WHERE rowid<32;.
fed0: 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f    }.  recursive_
fee0: 73 65 6c 65 63 74 20 36 34 20 78 32 0a 7d 20 7b  select 64 x2.} {
fef0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
ff00: 2d 32 34 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63  -24.1.3 {.  exec
ff10: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 55 50 44  sql { .      UPD
ff20: 41 54 45 20 78 31 20 53 45 54 20 7a 20 3d 20 61  ATE x1 SET z = a
ff30: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 57 48 45  _string(300) WHE
ff40: 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20 20 20  RE rowid>40;.   
ff50: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41   COMMIT;.    PRA
ff60: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
ff70: 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  eck;.    SELECT 
ff80: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31  count(*) FROM x1
ff90: 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a  ;.  }.} {ok 33}.
ffa0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
ffb0: 32 34 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  24.1.4 {.  execs
ffc0: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
ffd0: 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53  FROM x1;.    INS
ffe0: 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
fff0: 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
10000 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44    BEGIN;.      D
10010 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48  ELETE FROM x1 WH
10020 45 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20  ERE rowid<32;.  
10030 20 20 20 20 55 50 44 41 54 45 20 78 31 20 53 45      UPDATE x1 SE
10040 54 20 7a 20 3d 20 61 5f 73 74 72 69 6e 67 28 32  T z = a_string(2
10050 39 39 29 20 57 48 45 52 45 20 72 6f 77 69 64 3e  99) WHERE rowid>
10060 34 30 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73  40;.  }.  recurs
10070 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32  ive_select 64 x2
10080 20 7b 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54   {db eval COMMIT
10090 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
100a0 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
100b0 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45  ty_check;.    SE
100c0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
100d0 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b  OM x1;.  }.} {ok
100e0 20 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61   33}..do_test pa
100f0 67 65 72 31 2d 32 34 2e 31 2e 35 20 7b 0a 20 20  ger1-24.1.5 {.  
10100 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
10110 4c 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20  LETE FROM x1;.  
10120 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
10130 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
10140 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69  2;.  }.  recursi
10150 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32 20  ve_select 64 x2 
10160 7b 20 64 62 20 65 76 61 6c 20 7b 43 52 45 41 54  { db eval {CREAT
10170 45 20 54 41 42 4c 45 20 78 33 28 78 2c 20 79 2c  E TABLE x3(x, y,
10180 20 7a 29 7d 20 7d 0a 20 20 65 78 65 63 73 71 6c   z)} }.  execsql
10190 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
101a0 20 78 33 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d   x3 }.} {}..#---
101b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101f0 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74  ------.#.do_test
10200 20 70 61 67 65 72 31 2d 32 35 2d 31 20 7b 0a 20   pager1-25-1 {. 
10210 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
10220 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
10230 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
10240 4e 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49  N;.      SAVEPOI
10250 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20 20 20  NT abc;.        
10260 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
10270 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 52 4f 4c  a, b);.      ROL
10280 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20  LBACK TO abc;.  
10290 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
102a0 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 62 72  db close.} {}.br
102b0 65 61 6b 70 6f 69 6e 74 0a 64 6f 5f 74 65 73 74  eakpoint.do_test
102c0 20 70 61 67 65 72 31 2d 32 35 2d 32 20 7b 0a 20   pager1-25-2 {. 
102d0 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
102e0 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
102f0 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45  ecsql {.    SAVE
10300 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20  POINT abc;.     
10310 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
10320 28 61 2c 20 62 29 3b 0a 20 20 20 20 52 4f 4c 4c  (a, b);.    ROLL
10330 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20  BACK TO abc;.   
10340 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64   COMMIT;.  }.  d
10350 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d  b close.} {}..#-
10360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103a0 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 65 63 74 6f  --------.# Secto
103b0 72 2d 73 69 7a 65 20 74 65 73 74 73 2e 0a 23 0a  r-size tests..#.
103c0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
103d0 36 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20  6.1 {.  testvfs 
103e0 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
103f0 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30  tv sectorsize 40
10400 39 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65  96.  faultsim_de
10410 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
10420 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
10430 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
10440 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
10450 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35  MA page_size = 5
10460 31 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  12;.    CREATE T
10470 41 42 4c 45 20 74 62 6c 28 61 20 50 52 49 4d 41  ABLE tbl(a PRIMA
10480 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45  RY KEY, b UNIQUE
10490 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
104a0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
104b0 74 62 6c 20 56 41 4c 55 45 53 28 61 5f 73 74 72  tbl VALUES(a_str
104c0 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
104d0 67 28 36 30 30 29 29 3b 0a 20 20 20 20 20 20 49  g(600));.      I
104e0 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
104f0 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
10500 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
10510 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
10520 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
10530 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
10540 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
10550 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
10560 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10570 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
10580 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
10590 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
105a0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
105b0 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61  NTO tbl SELECT a
105c0 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
105d0 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
105e0 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  tbl;.      INSER
105f0 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
10600 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
10610 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
10620 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
10630 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
10640 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
10650 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10660 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
10670 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
10680 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10690 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
106a0 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
106b0 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
106c0 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  {}.do_execsql_te
106d0 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b  st pager1-26.1 {
106e0 0a 20 20 55 50 44 41 54 45 20 74 62 6c 20 53 45  .  UPDATE tbl SE
106f0 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 35  T b = a_string(5
10700 35 30 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f  50);.} {}.db clo
10710 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d  se.tv delete..#-
10720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10760 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65  --------.#.do_te
10770 73 74 20 70 61 67 65 72 31 2e 32 37 2e 31 20 7b  st pager1.27.1 {
10780 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
10790 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
107a0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
107b0 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65  fcounts db.  exe
107c0 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
107d0 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
107e0 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
107f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67   }.  sqlite3_pag
10800 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a  er_refcounts db.
10810 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
10820 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
10830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10870 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 74  -.# Test that at
10880 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e  tempting to open
10890 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
108a0 74 69 6f 6e 20 77 69 74 68 20 0a 23 20 6c 6f 63  tion with .# loc
108b0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
108c0 69 76 65 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20  ive in WAL mode 
108d0 66 61 69 6c 73 20 69 66 20 74 68 65 72 65 20 61  fails if there a
108e0 72 65 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 73  re other clients
108f0 20 6f 6e 20 0a 23 20 74 68 65 20 73 61 6d 65 20   on .# the same 
10900 64 61 74 61 62 61 73 65 2e 0a 23 0a 63 61 74 63  database..#.catc
10910 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 69  h { db close }.i
10920 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20  fcapable wal {. 
10930 20 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f   do_multiclient_
10940 74 65 73 74 20 74 6e 20 7b 0a 20 20 20 20 64 6f  test tn {.    do
10950 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10960 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 73 71  $tn.1 {.      sq
10970 6c 31 20 7b 20 0a 20 20 20 20 20 20 20 20 50 52  l1 { .        PR
10980 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
10990 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 20  e = WAL;.       
109a0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
109b0 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20  (a, b);.        
109c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
109d0 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
109e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b  .      }.    } {
109f0 77 61 6c 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  wal}.    do_test
10a00 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32   pager1-28.$tn.2
10a10 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
10a20 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
10a30 61 20 62 7d 0a 0a 20 20 20 20 64 6f 5f 74 65 73  a b}..    do_tes
10a40 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10a50 33 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d  3 { sql1 { PRAGM
10a60 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  A locking_mode=e
10a70 78 63 6c 75 73 69 76 65 20 7d 20 7d 20 7b 65 78  xclusive } } {ex
10a80 63 6c 75 73 69 76 65 7d 0a 20 20 20 20 64 6f 5f  clusive}.    do_
10a90 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10aa0 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 63 73  tn.4 { .      cs
10ab0 71 6c 31 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53  ql1 { BEGIN; INS
10ac0 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
10ad0 45 53 28 27 63 27 2c 20 27 64 27 29 3b 20 7d 0a  ES('c', 'd'); }.
10ae0 20 20 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61      } {1 {databa
10af0 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
10b00 20 20 20 63 6f 64 65 32 20 7b 20 64 62 32 20 63     code2 { db2 c
10b10 6c 6f 73 65 20 3b 20 73 71 6c 69 74 65 33 20 64  lose ; sqlite3 d
10b20 62 32 20 74 65 73 74 2e 64 62 20 7d 0a 20 20 20  b2 test.db }.   
10b30 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10b40 32 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20  28.$tn.4 { .    
10b50 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20    sql1 { INSERT 
10b60 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
10b70 63 27 2c 20 27 64 27 29 3b 20 43 4f 4d 4d 49 54  c', 'd'); COMMIT
10b80 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 7d 0a   }.    } {}.  }.
10b90 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
10ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
10be0 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65 6e 20 63  Normally, when c
10bf0 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 6a 6f 75  hanging from jou
10c00 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
10c10 54 20 74 6f 20 44 45 4c 45 54 45 20 74 68 65 20  T to DELETE the 
10c20 70 61 67 65 72 0a 23 20 61 74 74 65 6d 70 74 73  pager.# attempts
10c30 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
10c40 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 48 6f 77  ournal file. How
10c50 65 76 65 72 2c 20 69 66 20 69 74 20 63 61 6e 6e  ever, if it cann
10c60 6f 74 20 6f 62 74 61 69 6e 20 61 0a 23 20 52 45  ot obtain a.# RE
10c70 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
10c80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10c90 2c 20 74 68 69 73 20 73 74 65 70 20 69 73 20 73  , this step is s
10ca0 6b 69 70 70 65 64 2e 0a 23 0a 64 6f 5f 6d 75 6c  kipped..#.do_mul
10cb0 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e  ticlient_test tn
10cc0 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
10cd0 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a 20  er1-28.$tn.1 {. 
10ce0 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20     sql1 { .     
10cf0 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
10d00 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
10d10 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
10d20 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
10d30 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10d40 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  1 VALUES('a', 'b
10d50 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70  ');.    }.  } {p
10d60 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73  ersist}.  do_tes
10d70 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10d80 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  2 { file exists 
10d90 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
10da0 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } 1.  do_test pa
10db0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20  ger1-28.$tn.3 { 
10dc0 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f  sql1 { PRAGMA jo
10dd0 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
10de0 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20  ETE } } delete. 
10df0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10e00 32 38 2e 24 74 6e 2e 34 20 7b 20 66 69 6c 65 20  28.$tn.4 { file 
10e10 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
10e20 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f  ournal } 0..  do
10e30 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10e40 24 74 6e 2e 35 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.5 {.    sql1
10e50 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
10e60 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
10e70 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 49  PERSIST;.      I
10e80 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
10e90 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a  LUES('c', 'd');.
10ea0 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69      }.  } {persi
10eb0 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  st}.  do_test pa
10ec0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 36 20 7b 20  ger1-28.$tn.6 { 
10ed0 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
10ee0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a  .db-journal } 1.
10ef0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10f00 2d 32 38 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20  -28.$tn.7 {.    
10f10 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e  sql2 { BEGIN; IN
10f20 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
10f30 55 45 53 28 27 65 27 2c 20 27 66 27 29 3b 20 7d  UES('e', 'f'); }
10f40 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
10f50 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10f60 38 20 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  8  { file exists
10f70 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
10f80 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70   } 1.  do_test p
10f90 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 39 20 20  ager1-28.$tn.9  
10fa0 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20  { sql1 { PRAGMA 
10fb0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
10fc0 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65  ELETE } } delete
10fd0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10fe0 31 2d 32 38 2e 24 74 6e 2e 31 30 20 7b 20 66 69  1-28.$tn.10 { fi
10ff0 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
11000 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20  b-journal } 1.. 
11010 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11020 32 38 2e 24 74 6e 2e 31 31 20 7b 20 73 71 6c 32  28.$tn.11 { sql2
11030 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64   COMMIT } {}.  d
11040 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11050 2e 24 74 6e 2e 31 32 20 7b 20 66 69 6c 65 20 65  .$tn.12 { file e
11060 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
11070 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f  urnal } 0..  do_
11080 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24  test pager1-28-$
11090 74 6e 2e 31 33 20 7b 0a 20 20 20 20 63 6f 64 65  tn.13 {.    code
110a0 31 20 7b 20 73 65 74 20 63 68 61 6e 6e 65 6c 20  1 { set channel 
110b0 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65  [db incrblob -re
110c0 61 64 6f 6e 6c 79 20 74 31 20 61 20 32 5d 20 7d  adonly t1 a 2] }
110d0 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20  .    sql1 {.    
110e0 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
110f0 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
11100 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
11110 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 67 27  TO t1 VALUES('g'
11120 2c 20 27 68 27 29 3b 0a 20 20 20 20 7d 0a 20 20  , 'h');.    }.  
11130 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f  } {persist}.  do
11140 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11150 24 74 6e 2e 31 34 20 7b 20 66 69 6c 65 20 65 78  $tn.14 { file ex
11160 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
11170 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65  rnal } 1.  do_te
11180 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11190 2e 31 35 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b  .15 {.    sql2 {
111a0 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49   BEGIN; INSERT I
111b0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65  NTO t1 VALUES('e
111c0 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b  ', 'f'); }.  } {
111d0 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
111e0 72 31 2d 32 38 2e 24 74 6e 2e 31 36 20 7b 20 73  r1-28.$tn.16 { s
111f0 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  ql1 { PRAGMA jou
11200 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
11210 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20  TE } } delete.  
11220 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11230 38 2e 24 74 6e 2e 31 37 20 7b 20 66 69 6c 65 20  8.$tn.17 { file 
11240 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
11250 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f  ournal } 1..  do
11260 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11270 24 74 6e 2e 31 37 20 7b 20 63 73 71 6c 32 20 7b  $tn.17 { csql2 {
11280 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 31 20 7b   COMMIT } } {1 {
11290 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
112a0 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ed}}.  do_test p
112b0 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 38 20  ager1-28-$tn.18 
112c0 7b 20 63 6f 64 65 31 20 7b 20 72 65 61 64 20 24  { code1 { read $
112d0 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 63 0a 20 20  channel } } c.  
112e0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
112f0 38 2d 24 74 6e 2e 31 39 20 7b 20 63 6f 64 65 31  8-$tn.19 { code1
11300 20 7b 20 63 6c 6f 73 65 20 24 63 68 61 6e 6e 65   { close $channe
11310 6c 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  l } } {}.  do_te
11320 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11330 2e 32 30 20 7b 20 73 71 6c 32 20 7b 20 43 4f 4d  .20 { sql2 { COM
11340 4d 49 54 20 7d 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f  MIT } } {}.}..do
11350 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 39 2e  _test pager1-29.
11360 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
11370 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
11380 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11390 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
113a0 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52  e = 1024;.    PR
113b0 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
113c0 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 50 52 41   = full;.    PRA
113d0 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
113e0 3d 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20  =exclusive;.    
113f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
11400 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
11410 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
11420 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 66 69  (1, 2);.  }.  fi
11430 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
11440 7d 20 5b 65 78 70 72 20 31 30 32 34 2a 33 5d 0a  } [expr 1024*3].
11450 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11460 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.2 {.  execsql 
11470 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
11480 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20  e_size = 4096;. 
11490 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 20     VACUUM;.  }. 
114a0 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
114b0 64 62 0a 7d 20 5b 65 78 70 72 20 34 30 39 36 2a  db.} [expr 4096*
114c0 33 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  3]..#-----------
114d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
11510 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61 6e   Test that if an
11520 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
11530 66 69 6c 65 20 28 73 69 7a 65 20 30 20 62 79 74  file (size 0 byt
11540 65 73 29 20 69 73 20 6f 70 65 6e 65 64 20 69 6e  es) is opened in
11550 20 0a 23 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f   .# exclusive-lo
11560 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 6e 79 20  cking mode, any 
11570 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
11580 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
11590 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 23 20 77   file-system.# w
115a0 69 74 68 6f 75 74 20 62 65 69 6e 67 20 72 6f 6c  ithout being rol
115b0 6c 65 64 20 62 61 63 6b 2e 20 41 6e 64 20 74 68  led back. And th
115c0 61 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  at the RESERVED 
115d0 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20 77 68  lock obtained wh
115e0 69 6c 65 0a 23 20 64 6f 69 6e 67 20 74 68 69 73  ile.# doing this
115f0 20 69 73 20 6e 6f 74 20 72 65 6c 65 61 73 65 64   is not released
11600 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
11610 72 31 2d 33 30 2e 31 20 7b 0a 20 20 64 62 20 63  r1-30.1 {.  db c
11620 6c 6f 73 65 0a 20 20 66 69 6c 65 20 64 65 6c 65  lose.  file dele
11630 74 65 20 74 65 73 74 2e 64 62 0a 20 20 66 69 6c  te test.db.  fil
11640 65 20 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  e delete test.db
11650 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 65 74 20 66  -journal.  set f
11660 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d  d [open test.db-
11670 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20 20 73 65 65  journal w].  see
11680 6b 20 24 66 64 20 5b 65 78 70 72 20 35 31 32 2b  k $fd [expr 512+
11690 31 30 33 32 2a 32 5d 0a 20 20 70 75 74 73 20 2d  1032*2].  puts -
116a0 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 78 0a  nonewline $fd x.
116b0 20 20 63 6c 6f 73 65 20 24 66 64 0a 0a 20 20 73    close $fd..  s
116c0 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
116d0 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
116e0 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
116f0 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b  _mode=EXCLUSIVE;
11700 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
11710 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  t(*) FROM sqlite
11720 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 50 52 41  _master;.    PRA
11730 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b  GMA lock_status;
11740 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  .  }.} {exclusiv
11750 65 20 30 20 6d 61 69 6e 20 72 65 73 65 72 76 65  e 0 main reserve
11760 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a  d temp closed}..
11770 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
11780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
117c0 74 20 74 68 61 74 20 69 66 20 74 68 65 20 22 70  t that if the "p
117d0 61 67 65 2d 73 69 7a 65 22 20 66 69 65 6c 64 20  age-size" field 
117e0 69 6e 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  in a journal-hea
117f0 64 65 72 20 69 73 20 30 2c 20 74 68 65 20 6a 6f  der is 0, the jo
11800 75 72 6e 61 6c 0a 23 20 66 69 6c 65 20 63 61 6e  urnal.# file can
11810 20 73 74 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64   still be rolled
11820 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 72   back. This is r
11830 65 71 75 69 72 65 64 20 66 6f 72 20 62 61 63 6b  equired for back
11840 77 61 72 64 20 63 6f 6d 70 61 74 69 62 69 6c 69  ward compatibili
11850 74 79 20 2d 0a 23 20 76 65 72 73 69 6f 6e 73 20  ty -.# versions 
11860 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
11870 74 6f 20 33 2e 35 2e 38 20 61 6c 77 61 79 73 20  to 3.5.8 always 
11880 73 65 74 20 74 68 69 73 20 66 69 65 6c 64 20 74  set this field t
11890 6f 20 7a 65 72 6f 2e 0a 23 0a 64 6f 5f 74 65 73  o zero..#.do_tes
118a0 74 20 70 61 67 65 72 31 2d 33 31 2e 31 20 7b 0a  t pager1-31.1 {.
118b0 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
118c0 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
118d0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
118e0 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
118f0 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   10;.    PRAGMA 
11900 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
11910 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
11920 4c 45 20 74 31 28 78 2c 20 79 2c 20 55 4e 49 51  LE t1(x, y, UNIQ
11930 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 49  UE(x, y));.    I
11940 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11950 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
11960 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11970 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20 49 4e  b(1500));.    IN
11980 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
11990 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
119a0 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
119b0 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
119c0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
119d0 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
119e0 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
119f0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
11a00 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
11a10 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
11a20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
11a30 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
11a40 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
11a50 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
11a60 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
11a70 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
11a80 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
11a90 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11aa0 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
11ab0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
11ac0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
11ad0 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
11ae0 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
11af0 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
11b00 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
11b10 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
11b20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11b30 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
11b40 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
11b50 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
11b60 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
11b70 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
11b80 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
11b90 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
11ba0 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
11bb0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
11bc0 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
11bd0 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
11be0 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
11bf0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11c00 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
11c10 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
11c20 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
11c30 4d 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b  M t1;.    BEGIN;
11c40 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31  .      UPDATE t1
11c50 20 53 45 54 20 79 20 3d 20 72 61 6e 64 6f 6d 62   SET y = randomb
11c60 6c 6f 62 28 31 34 39 39 29 3b 0a 20 20 7d 0a 20  lob(1499);.  }. 
11c70 20 66 69 6c 65 20 63 6f 70 79 20 74 65 73 74 2e   file copy test.
11c80 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20 66 69  db test.db2.  fi
11c90 6c 65 20 63 6f 70 79 20 74 65 73 74 2e 64 62 2d  le copy test.db-
11ca0 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32  journal test.db2
11cb0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 0a 20 20 68 65  -journal.  .  he
11cc0 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
11cd0 62 32 2d 6a 6f 75 72 6e 61 6c 20 32 34 20 30 30  b2-journal 24 00
11ce0 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  000000.  sqlite3
11cf0 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20   db2 test.db2.  
11d00 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
11d10 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
11d20 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 0a 0a   } db2.} {ok}...
11d30 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.