/ Hex Artifact Content
Login

Artifact d8672fd0af5f4f9b99b06283d00f01547809bebe:


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 31 7d 0a 64 6f 5f 65 78 65 63 73 71  } {11}.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 7d 0a 64 6f 5f 63 61 74 63 68  } {1 2}.do_catch
bf10: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
bf20: 31 34 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e  14.1.4 {.  BEGIN
bf30: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
bf40: 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62  O t1(rowid, a, b
bf50: 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c  ) SELECT a+3, b,
bf60: 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   b FROM t1;.    
bf70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72  INSERT INTO t1(r
bf80: 6f 77 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45  owid, a, b) SELE
bf90: 43 54 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f  CT a+3, b, b FRO
bfa0: 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d  M t1;.} {1 {PRIM
bfb0: 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20  ARY KEY must be 
bfc0: 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65 63  unique}}.do_exec
bfd0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
bfe0: 31 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49  14.1.5 {.  COMMI
bff0: 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  T;.  SELECT * FR
c000: 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20 32 20  OM t1;.} {1 2 2 
c010: 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  2}..#-----------
c020: 2d 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 0a 23  --------------.#
c060: 20 54 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e   Test opening an
c070: 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61  d closing the pa
c080: 67 65 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77  ger sub-system w
c090: 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 76 61  ith different va
c0a0: 6c 75 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73  lues.# for the s
c0b0: 71 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46  qlite3_vfs.szOsF
c0c0: 69 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a  ile variable..#.
c0d0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
c0e0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78  and_reopen.do_ex
c0f0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
c100: 31 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54  1-15.0 {.  CREAT
c110: 45 20 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29  E TABLE tx(y, z)
c120: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
c130: 74 78 20 56 41 4c 55 45 53 28 27 41 79 75 74 74  tx VALUES('Ayutt
c140: 68 61 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27  haya', 'Beijing'
c150: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
c160: 20 74 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64   tx VALUES('Lond
c170: 6f 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d  on', 'Tokyo');.}
c180: 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72   {}.db close.for
c190: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35   {set i 0} {$i<5
c1a0: 31 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b  13} {incr i 3} {
c1b0: 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
c1c0: 65 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69  efault 1 -szosfi
c1d0: 6c 65 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20  le $i.  sqlite3 
c1e0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f  db test.db.  do_
c1f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c200: 65 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20  er1-15.$i.1 {.  
c210: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
c220: 74 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61  tx;.  } {Ayuttha
c230: 79 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f  ya Beijing Londo
c240: 6e 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c  n Tokyo}.  db cl
c250: 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a  ose.  tv delete.
c260: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
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 0a 23 20  -------------.# 
c2b0: 43 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73  Check that it is
c2c0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
c2d0: 20 6f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   open a database
c2e0: 20 66 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c   file if the ful
c2f0: 6c 20 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20  l path.# to the 
c300: 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e  associated journ
c310: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
c320: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69  longer than sqli
c330: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
c340: 6d 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  me..#.testvfs tv
c350: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
c360: 63 72 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76  cript xOpenCb.tv
c370: 20 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72   filter xOpen.pr
c380: 6f 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68  oc xOpenCb {meth
c390: 6f 64 20 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20  od filename} {. 
c3a0: 20 73 65 74 20 3a 3a 66 69 6c 65 5f 6c 65 6e 20   set ::file_len 
c3b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
c3c0: 66 69 6c 65 6e 61 6d 65 5d 0a 7d 0a 73 71 6c 69  filename].}.sqli
c3d0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64  te3 db test.db.d
c3e0: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
c3f0: 65 0a 0a 66 6f 72 20 7b 73 65 74 20 69 69 20 5b  e..for {set ii [
c400: 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e  expr $::file_len
c410: 2d 35 5d 7d 20 7b 24 69 69 20 3c 20 5b 65 78 70  -5]} {$ii < [exp
c420: 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 32 30  r $::file_len+20
c430: 5d 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20  ]} {incr ii} {. 
c440: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
c450: 61 75 6c 74 20 31 20 2d 6d 78 70 61 74 68 6e 61  ault 1 -mxpathna
c460: 6d 65 20 24 69 69 0a 0a 20 20 23 20 54 68 65 20  me $ii..  # The 
c470: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75  length of the fu
c480: 6c 6c 20 70 61 74 68 20 74 6f 20 66 69 6c 65 20  ll path to file 
c490: 22 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c  "test.db-journal
c4a0: 22 20 69 73 20 28 24 3a 3a 66 69 6c 65 5f 6c 65  " is ($::file_le
c4b0: 6e 2b 38 29 2e 0a 20 20 23 20 49 66 20 74 68 65  n+8)..  # If the
c4c0: 20 63 6f 6e 66 69 67 75 72 65 64 20 73 71 6c 69   configured sqli
c4d0: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
c4e0: 6d 65 20 76 61 6c 75 65 20 67 72 65 61 74 65 72  me value greater
c4f0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
c500: 6f 0a 20 20 23 20 74 68 69 73 2c 20 74 68 65 6e  o.  # this, then
c510: 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
c520: 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77 69   opened. Otherwi
c530: 73 65 2c 20 69 74 20 63 61 6e 6e 6f 74 2e 0a 20  se, it cannot.. 
c540: 20 23 0a 20 20 69 66 20 7b 24 69 69 20 3e 3d 20   #.  if {$ii >= 
c550: 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65  [expr $::file_le
c560: 6e 2b 38 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20  n+8]} {.    set 
c570: 72 65 73 20 7b 30 20 7b 7d 7d 0a 20 20 7d 20 65  res {0 {}}.  } e
c580: 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 72 65  lse {.    set re
c590: 73 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  s {1 {unable to 
c5a0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
c5b0: 6c 65 7d 7d 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74  le}}.  }..  do_t
c5c0: 65 73 74 20 70 61 67 65 72 31 2d 31 36 2e 31 2e  est pager1-16.1.
c5d0: 24 69 69 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b  $ii {.    list [
c5e0: 63 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33 20  catch { sqlite3 
c5f0: 64 62 20 74 65 73 74 2e 64 62 20 7d 20 6d 73 67  db test.db } msg
c600: 5d 20 24 6d 73 67 0a 20 20 7d 20 24 72 65 73 0a  ] $msg.  } $res.
c610: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
c620: 73 65 7d 0a 20 20 74 76 20 64 65 6c 65 74 65 0a  se}.  tv delete.
c630: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
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 0a 23 20  -------------.# 
c680: 54 65 73 74 20 22 50 52 41 47 4d 41 20 6f 6d 69  Test "PRAGMA omi
c690: 74 5f 72 65 61 64 6c 6f 63 6b 22 2e 20 0a 23 0a  t_readlock". .#.
c6a0: 23 20 20 20 70 61 67 65 72 31 2d 31 37 2e 24 74  #   pager1-17.$t
c6b0: 6e 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  n.1.*: Test that
c6c0: 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 6f 6e   if a second con
c6d0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 20 6f  nection has an o
c6e0: 70 65 6e 20 0a 23 20 20 20 20 20 20 20 20 20 20  pen .#          
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
c700: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74  -transaction, it
c710: 20 69 73 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20   is not usually 
c720: 70 6f 73 73 69 62 6c 65 20 74 6f 20 77 72 69 74  possible to writ
c730: 65 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  e .#            
c740: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64 61            the da
c750: 74 61 62 61 73 65 2e 0a 23 0a 23 20 20 20 70 61  tabase..#.#   pa
c760: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 2a 3a  ger1-17.$tn.2.*:
c770: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
c780: 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74  e second connect
c790: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77  ion was opened w
c7a0: 69 74 68 0a 23 20 20 20 20 20 20 20 20 20 20 20  ith.#           
c7b0: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 53             the S
c7c0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
c7d0: 4e 4c 59 20 66 6c 61 67 2c 20 61 6e 64 20 0a 23  NLY flag, and .#
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 6f 6d        "PRAGMA om
c800: 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 22  it_readlock = 1"
c810: 20 69 73 20 65 78 65 63 75 74 65 64 20 62 65 66   is executed bef
c820: 6f 72 65 20 61 74 74 61 63 68 69 6e 67 0a 23 20  ore attaching.# 
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
c850: 65 20 61 6e 64 20 6f 70 65 6e 69 6e 67 20 61 20  e and opening a 
c860: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
c870: 20 6f 6e 20 69 74 2c 20 69 74 20 69 73 0a 23 20   on it, it is.# 
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 20 20 70 6f 73 73 69 62 6c 65 20 74 6f       possible to
c8a0: 20 77 72 69 74 65 20 74 68 65 20 64 62 2e 0a 23   write the db..#
c8b0: 0a 23 20 20 20 70 61 67 65 72 31 2d 31 37 2e 24  .#   pager1-17.$
c8c0: 74 6e 2e 33 2e 2a 3a 20 54 65 73 74 20 74 68 61  tn.3.*: Test tha
c8d0: 74 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t if the second 
c8e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 2a  connection was *
c8f0: 6e 6f 74 2a 20 6f 70 65 6e 65 64 20 77 69 74 68  not* opened with
c900: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
c910: 20 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 49          the SQLI
c920: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
c930: 20 66 6c 61 67 2c 20 65 78 65 63 75 74 69 6e 67   flag, executing
c940: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
c950: 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41           "PRAGMA
c960: 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d   omit_readlock =
c970: 20 31 22 20 68 61 73 20 6e 6f 20 65 66 66 65 63   1" has no effec
c980: 74 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69  t..#.do_multicli
c990: 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20  ent_test tn {.  
c9a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
c9b0: 37 2e 24 74 6e 2e 31 2e 31 20 7b 0a 20 20 20 20  7.$tn.1.1 {.    
c9c0: 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 43 52  sql1 { .      CR
c9d0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
c9e0: 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
c9f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
ca00: 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20  (1, 2);.    }.  
ca10: 20 20 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 42    sql2 {.      B
ca20: 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45  EGIN;.      SELE
ca30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
ca40: 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20    }.  } {1 2}.  
ca50: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
ca60: 37 2e 24 74 6e 2e 31 2e 32 20 7b 0a 20 20 20 20  7.$tn.1.2 {.    
ca70: 63 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49  csql1 { INSERT I
ca80: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
ca90: 20 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61   4) }.  } {1 {da
caa0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
cab0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }}.  do_test pag
cac0: 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 33 20 7b  er1-17.$tn.1.3 {
cad0: 0a 20 20 20 20 73 71 6c 32 20 7b 20 43 4f 4d 4d  .    sql2 { COMM
cae0: 49 54 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 20  IT }.    sql1 { 
caf0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
cb00: 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20 20  ALUES(3, 4) }.  
cb10: 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  } {}..  do_test 
cb20: 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e  pager1-17.$tn.2.
cb30: 31 20 7b 0a 20 20 20 20 63 6f 64 65 32 20 7b 0a  1 {.    code2 {.
cb40: 20 20 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a        db2 close.
cb50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
cb60: 32 20 3a 6d 65 6d 6f 72 79 3a 20 2d 72 65 61 64  2 :memory: -read
cb70: 6f 6e 6c 79 20 31 0a 20 20 20 20 7d 0a 20 20 20  only 1.    }.   
cb80: 20 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 50   sql2 { .      P
cb90: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
cba0: 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 41  ock = 1;.      A
cbb0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 27 20  TTACH 'test.db' 
cbc0: 41 53 20 74 77 6f 3b 0a 20 20 20 20 20 20 42 45  AS two;.      BE
cbd0: 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  GIN;.      SELEC
cbe0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
cbf0: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d   }.  } {1 2 3 4}
cc00: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
cc10: 31 2d 31 37 2e 24 74 6e 2e 32 2e 32 20 7b 20 73  1-17.$tn.2.2 { s
cc20: 71 6c 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ql1 "INSERT INTO
cc30: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29   t1 VALUES(5, 6)
cc40: 22 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  " } {}.  do_test
cc50: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32   pager1-17.$tn.2
cc60: 2e 33 20 7b 20 73 71 6c 32 20 22 53 45 4c 45 43  .3 { sql2 "SELEC
cc70: 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 7d 20 20  T * FROM t1" }  
cc80: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33            {1 2 3
cc90: 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   4}.  do_test pa
cca0: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 34 20  ger1-17.$tn.2.4 
ccb0: 7b 20 73 71 6c 32 20 22 43 4f 4d 4d 49 54 20 3b  { sql2 "COMMIT ;
ccc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
ccd0: 31 22 20 7d 20 20 20 7b 31 20 32 20 33 20 34 20  1" }   {1 2 3 4 
cce0: 35 20 36 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  5 6}..  do_test 
ccf0: 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e  pager1-17.$tn.3.
cd00: 31 20 7b 0a 20 20 20 20 63 6f 64 65 32 20 7b 0a  1 {.    code2 {.
cd10: 20 20 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a        db2 close.
cd20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
cd30: 32 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 20 20 7d  2 :memory:.    }
cd40: 0a 20 20 20 20 73 71 6c 32 20 7b 20 0a 20 20 20  .    sql2 { .   
cd50: 20 20 20 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72     PRAGMA omit_r
cd60: 65 61 64 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  eadlock = 1;.   
cd70: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
cd80: 64 62 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20  db' AS two;.    
cd90: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
cda0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
cdb0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20  .    }.  } {1 2 
cdc0: 33 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65  3 4 5 6}.  do_te
cdd0: 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e  st pager1-17.$tn
cde0: 2e 33 2e 32 20 7b 0a 20 20 63 73 71 6c 31 20 7b  .3.2 {.  csql1 {
cdf0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ce00: 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20  VALUES(3, 4) }. 
ce10: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
ce20: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
ce30: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
ce40: 24 74 6e 2e 33 2e 33 20 7b 20 73 71 6c 32 20 43  $tn.3.3 { sql2 C
ce50: 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d  OMMIT } {}.}..#-
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20  --------.# Test 
ceb0: 74 68 65 20 70 61 67 65 72 73 20 72 65 73 70 6f  the pagers respo
cec0: 6e 73 65 20 74 6f 20 74 68 65 20 62 2d 74 72 65  nse to the b-tre
ced0: 65 20 6c 61 79 65 72 20 72 65 71 75 65 73 74 69  e layer requesti
cee0: 6e 67 20 69 6c 6c 65 67 61 6c 20 70 61 67 65 20  ng illegal page 
cef0: 0a 23 20 6e 75 6d 62 65 72 73 3a 0a 23 0a 23 20  .# numbers:.#.# 
cf00: 20 20 2b 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20    + The locking 
cf10: 70 61 67 65 2c 0a 23 20 20 20 2b 20 50 61 67 65  page,.#   + Page
cf20: 20 30 2c 0a 23 20 20 20 2b 20 41 20 70 61 67 65   0,.#   + A page
cf30: 20 77 69 74 68 20 61 20 70 61 67 65 20 6e 75 6d   with a page num
cf40: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
cf50: 20 28 32 5e 33 31 2d 31 29 2e 0a 23 0a 64 6f 5f   (2^31-1)..#.do_
cf60: 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 31  test pager1-18.1
cf70: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
cf80: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
cf90: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
cfa0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
cfb0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
cfc0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
cfd0: 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
cfe0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
cff0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d000: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
d010: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
d020: 6e 67 28 32 30 30 29 29 3b 0a 20 20 20 20 49 4e  ng(200));.    IN
d030: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d040: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d050: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d060: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d070: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d080: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d090: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d0a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d0b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d0c0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d0d0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d0e0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d0f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d100: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d110: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d120: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d130: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d140: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d150: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d160: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d170: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d180: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d190: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d1a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d1b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d1c0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d1d0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d1e0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
d1f0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
d200: 31 2d 31 38 2e 32 20 7b 0a 20 20 73 65 74 20 72  1-18.2 {.  set r
d210: 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c  oot [db one "SEL
d220: 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
d230: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
d240: 5d 0a 20 20 73 65 74 20 6c 6f 63 6b 69 6e 67 70  ].  set lockingp
d250: 61 67 65 20 5b 65 78 70 72 20 28 30 78 31 30 30  age [expr (0x100
d260: 30 30 2f 31 30 32 34 29 20 2b 20 31 5d 0a 20 20  00/1024) + 1].  
d270: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
d280: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
d290: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50  hema = 1;.    UP
d2a0: 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  DATE sqlite_mast
d2b0: 65 72 20 53 45 54 20 72 6f 6f 74 70 61 67 65 20  er SET rootpage 
d2c0: 3d 20 24 6c 6f 63 6b 69 6e 67 70 61 67 65 3b 0a  = $lockingpage;.
d2d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
d2e0: 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  2 test.db.  catc
d2f0: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  hsql { SELECT co
d300: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d  unt(*) FROM t1 }
d310: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
d320: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d330: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
d340: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
d350: 70 61 67 65 72 31 2d 31 38 2e 33 20 7b 0a 20 20  pager1-18.3 {.  
d360: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
d370: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29  EATE TABLE t2(x)
d380: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d390: 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73 74  O t2 VALUES(a_st
d3a0: 72 69 6e 67 28 35 30 30 30 29 29 3b 0a 20 20 7d  ring(5000));.  }
d3b0: 0a 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78 70  .  set pgno [exp
d3c0: 72 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  r ([file size te
d3d0: 73 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d 32  st.db] / 1024)-2
d3e0: 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ].  hexio_write 
d3f0: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
d400: 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30  pgno-1)*1024] 00
d410: 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  000000.  sqlite3
d420: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63   db2 test.db.  c
d430: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
d440: 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20   length(x) FROM 
d450: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t2 } db2.} {1 {d
d460: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d470: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d480: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
d490: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 34 20  est pager1-18.4 
d4a0: 7b 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  {.  hexio_write 
d4b0: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
d4c0: 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 39 30  pgno-1)*1024] 90
d4d0: 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  000000.  sqlite3
d4e0: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63   db2 test.db.  c
d4f0: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
d500: 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20   length(x) FROM 
d510: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t2 } db2.} {1 {d
d520: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d530: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d540: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
d550: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 35 20  est pager1-18.5 
d560: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22  {.  sqlite3 db "
d570: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
d580: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
d590: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
d5a0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
d5b0: 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  b);.    PRAGMA w
d5c0: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
d5d0: 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73   1;.    UPDATE s
d5e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54  qlite_master SET
d5f0: 20 72 6f 6f 74 70 61 67 65 3d 35 20 57 48 45 52   rootpage=5 WHER
d600: 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74 31  E tbl_name = 't1
d610: 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72  ';.    PRAGMA wr
d620: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
d630: 30 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42  0;.    ALTER TAB
d640: 4c 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20  LE t1 RENAME TO 
d650: 78 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73  x1;.  }.  catchs
d660: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
d670: 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31 20 7b 64 61  OM x1 }.} {1 {da
d680: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
d690: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
d6a0: 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65  .db close..do_te
d6b0: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 36 20 7b  st pager1-18.6 {
d6c0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
d6d0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
d6e0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
d6f0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
d700: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
d710: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
d720: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
d730: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49  BLE t1(x);.    I
d740: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
d750: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30  LUES(a_string(80
d760: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
d770: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
d780: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
d790: 20 7d 0a 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b   }..  set root [
d7a0: 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72  db one "SELECT r
d7b0: 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c  ootpage FROM sql
d7c0: 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 64  ite_master"].  d
d7d0: 62 20 63 6c 6f 73 65 0a 0a 20 20 68 65 78 69 6f  b close..  hexio
d7e0: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b  _write test.db [
d7f0: 65 78 70 72 20 28 24 72 6f 6f 74 2d 31 29 2a 31  expr ($root-1)*1
d800: 30 32 34 20 2b 20 38 5d 20 30 30 30 30 30 30 30  024 + 8] 0000000
d810: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  0.  sqlite3 db t
d820: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
d830: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
d840: 68 28 78 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  h(x) FROM t1 }.}
d850: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
d860: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
d870: 6f 72 6d 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74  ormed}}..do_test
d880: 20 70 61 67 65 72 31 2d 31 39 2e 31 20 7b 0a 20   pager1-19.1 {. 
d890: 20 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20   sqlite3 db "". 
d8a0: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
d8b0: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
d8c0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
d8d0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31  A page_size = 51
d8e0: 32 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75  2;.    PRAGMA au
d8f0: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20  to_vacuum = 1;. 
d900: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d910: 74 31 28 61 61 2c 20 61 62 2c 20 61 63 2c 20 61  t1(aa, ab, ac, a
d920: 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c 20 61  d, ae, af, ag, a
d930: 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61  h, ai, aj, ak, a
d940: 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20  l, am, an,.     
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
d960: 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c 20 62  a, bb, bc, bd, b
d970: 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c 20 62  e, bf, bg, bh, b
d980: 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62  i, bj, bk, bl, b
d990: 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, bn,.         
d9a0: 20 20 20 20 20 20 20 20 20 20 20 63 61 2c 20 63             ca, c
d9b0: 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c 20 63  b, cc, cd, ce, c
d9c0: 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c 20 63  f, cg, ch, ci, c
d9d0: 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63  j, ck, cl, cm, c
d9e0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d9f0: 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c 20 64         da, db, d
da00: 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c 20 64  c, dd, de, df, d
da10: 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64  g, dh, di, dj, d
da20: 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20  k, dl, dm, dn,. 
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c 20 65     ea, eb, ec, e
da50: 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c 20 65  d, ee, ef, eg, e
da60: 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65  h, ei, ej, ek, e
da70: 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20  l, em, en,.     
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
da90: 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c 20 66  a, fb, fc, fd, f
daa0: 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c 20 66  e, ff, fg, fh, f
dab0: 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66  i, fj, fk, fl, f
dac0: 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, fn,.         
dad0: 20 20 20 20 20 20 20 20 20 20 20 67 61 2c 20 67             ga, g
dae0: 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c 20 67  b, gc, gd, ge, g
daf0: 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c 20 67  f, gg, gh, gi, g
db00: 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67  j, gk, gl, gm, g
db10: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
db20: 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c 20 68         ha, hb, h
db30: 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c 20 68  c, hd, he, hf, h
db40: 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68  g, hh, hi, hj, h
db50: 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20  k, hl, hm, hn,. 
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c 20 69     ia, ib, ic, i
db80: 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c 20 69  d, ie, if, ig, i
db90: 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69  h, ii, ij, ik, i
dba0: 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20  l, im, ix,.     
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
dbc0: 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a  a, jb, jc, jd, j
dbd0: 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a  e, jf, jg, jh, j
dbe0: 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a  i, jj, jk, jl, j
dbf0: 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, jn,.         
dc00: 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c 20 6b             ka, k
dc10: 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b  b, kc, kd, ke, k
dc20: 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b  f, kg, kh, ki, k
dc30: 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b  j, kk, kl, km, k
dc40: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dc50: 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c         la, lb, l
dc60: 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c  c, ld, le, lf, l
dc70: 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c  g, lh, li, lj, l
dc80: 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20  k, ll, lm, ln,. 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d     ma, mb, mc, m
dcb0: 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d  d, me, mf, mg, m
dcc0: 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d  h, mi, mj, mk, m
dcd0: 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b  l, mm, mn.    );
dce0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
dcf0: 45 20 74 32 28 61 61 2c 20 61 62 2c 20 61 63 2c  E t2(aa, ab, ac,
dd00: 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c   ad, ae, af, ag,
dd10: 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c   ah, ai, aj, ak,
dd20: 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20   al, am, an,.   
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c   ba, bb, bc, bd,
dd50: 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c   be, bf, bg, bh,
dd60: 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c   bi, bj, bk, bl,
dd70: 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20   bm, bn,.       
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 2c               ca,
dd90: 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c   cb, cc, cd, ce,
dda0: 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c   cf, cg, ch, ci,
ddb0: 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c   cj, ck, cl, cm,
ddc0: 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   cn,.           
ddd0: 20 20 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c           da, db,
dde0: 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c   dc, dd, de, df,
ddf0: 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c   dg, dh, di, dj,
de00: 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c   dk, dl, dm, dn,
de10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de20: 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c       ea, eb, ec,
de30: 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c   ed, ee, ef, eg,
de40: 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c   eh, ei, ej, ek,
de50: 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20   el, em, en,.   
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c   fa, fb, fc, fd,
de80: 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c   fe, ff, fg, fh,
de90: 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c   fi, fj, fk, fl,
dea0: 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20   fm, fn,.       
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 61 2c               ga,
dec0: 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c   gb, gc, gd, ge,
ded0: 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c   gf, gg, gh, gi,
dee0: 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c   gj, gk, gl, gm,
def0: 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   gn,.           
df00: 20 20 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c           ha, hb,
df10: 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c   hc, hd, he, hf,
df20: 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c   hg, hh, hi, hj,
df30: 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c   hk, hl, hm, hn,
df40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df50: 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c       ia, ib, ic,
df60: 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c   id, ie, if, ig,
df70: 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c   ih, ii, ij, ik,
df80: 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20   il, im, ix,.   
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c   ja, jb, jc, jd,
dfb0: 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c   je, jf, jg, jh,
dfc0: 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c   ji, jj, jk, jl,
dfd0: 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20   jm, jn,.       
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c               ka,
dff0: 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c   kb, kc, kd, ke,
e000: 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c   kf, kg, kh, ki,
e010: 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c   kj, kk, kl, km,
e020: 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   kn,.           
e030: 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c           la, lb,
e040: 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c   lc, ld, le, lf,
e050: 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c   lg, lh, li, lj,
e060: 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c   lk, ll, lm, ln,
e070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e080: 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c       ma, mb, mc,
e090: 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c   md, me, mf, mg,
e0a0: 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c   mh, mi, mj, mk,
e0b0: 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20   ml, mm, mn.    
e0c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
e0d0: 54 4f 20 74 31 28 61 61 29 20 56 41 4c 55 45 53  TO t1(aa) VALUES
e0e0: 28 20 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30  ( a_string(10000
e0f0: 30 29 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  0) );.    INSERT
e100: 20 49 4e 54 4f 20 74 32 28 61 61 29 20 56 41 4c   INTO t2(aa) VAL
e110: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30  UES( a_string(10
e120: 30 30 30 30 29 20 29 3b 0a 20 20 20 20 56 41 43  0000) );.    VAC
e130: 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23  UUM;.  }.} {}..#
e140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 65 73 74  ---------.# Test
e190: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 73 70 65   a couple of spe
e1a0: 63 69 61 6c 20 63 61 73 65 73 20 74 68 61 74 20  cial cases that 
e1b0: 63 6f 6d 65 20 75 70 20 77 68 69 6c 65 20 63 6f  come up while co
e1c0: 6d 6d 69 74 74 69 6e 67 20 0a 23 20 74 72 61 6e  mmitting .# tran
e1d0: 73 61 63 74 69 6f 6e 73 3a 0a 23 0a 23 20 20 20  sactions:.#.#   
e1e0: 70 61 67 65 72 31 2d 32 30 2e 31 2e 2a 3a 20 43  pager1-20.1.*: C
e1f0: 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 20 69 6e 2d  ommitting an in-
e200: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
e210: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68 65 6e  transaction when
e220: 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20 20   the .#         
e230: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
e240: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  e has not been m
e250: 6f 64 69 66 69 65 64 20 61 74 20 61 6c 6c 2e 0a  odified at all..
e260: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e  #.#   pager1-20.
e270: 32 2e 2a 3a 20 41 73 20 61 62 6f 76 65 2c 20 62  2.*: As above, b
e280: 75 74 20 77 69 74 68 20 61 20 6e 6f 72 6d 61 6c  ut with a normal
e290: 20 64 62 20 69 6e 20 65 78 63 6c 75 73 69 76 65   db in exclusive
e2a0: 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 23  -locking mode..#
e2b0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e 33  .#   pager1-20.3
e2c0: 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61  .*: Committing a
e2d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
e2e0: 57 41 4c 20 6d 6f 64 65 20 77 68 65 72 65 20 74  WAL mode where t
e2f0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 0a  he database has.
e300: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
e310: 20 20 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64     been modified
e320: 2c 20 62 75 74 20 61 6c 6c 20 64 69 72 74 79 20  , but all dirty 
e330: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
e340: 66 6c 75 73 68 65 64 20 74 6f 20 0a 23 20 20 20  flushed to .#   
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
e360: 69 73 6b 20 62 65 66 6f 72 65 20 74 68 65 20 63  isk before the c
e370: 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74 65 73 74  ommit..#.do_test
e380: 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 31 20 7b   pager1-20.1.1 {
e390: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
e3a0: 73 65 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62  se}.  sqlite3 db
e3b0: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78 65 63   :memory:.  exec
e3c0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
e3d0: 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20   TABLE one(two, 
e3e0: 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53 45  three);.    INSE
e3f0: 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55  RT INTO one VALU
e400: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
e410: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
e420: 61 67 65 72 31 2d 32 30 2e 31 2e 32 20 7b 0a 20  ager1-20.1.2 {. 
e430: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
e440: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a  EGIN EXCLUSIVE;.
e450: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
e460: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
e470: 67 65 72 31 2d 32 30 2e 32 2e 31 20 7b 0a 20 20  ger1-20.2.1 {.  
e480: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
e490: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
e4a0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
e4b0: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
e4c0: 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20   exclusive;.    
e4d0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
e4e0: 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20  ode = persist;. 
e4f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e500: 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29 3b  one(two, three);
e510: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
e520: 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27 2c   one VALUES('a',
e530: 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 65 78   'b');.  }.} {ex
e540: 63 6c 75 73 69 76 65 20 70 65 72 73 69 73 74 7d  clusive persist}
e550: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
e560: 32 30 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  20.2.2 {.  execs
e570: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45  ql {.    BEGIN E
e580: 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f  XCLUSIVE;.    CO
e590: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  MMIT;.  }.} {}..
e5a0: 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a  ifcapable wal {.
e5b0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
e5c0: 2d 32 30 2e 33 2e 31 20 7b 0a 20 20 20 20 66 61  -20.3.1 {.    fa
e5d0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
e5e0: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20  d_reopen.    db 
e5f0: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
e600: 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73  string.    execs
e610: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
e620: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
e630: 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  0;.      PRAGMA 
e640: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77  journal_mode = w
e650: 61 6c 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  al;.      BEGIN;
e660: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
e670: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
e680: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
e690: 45 20 74 32 28 79 29 3b 0a 20 20 20 20 20 20 20  E t2(y);.       
e6a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
e6b0: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
e6c0: 38 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20 49  800));.        I
e6d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
e6e0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
e6f0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
e700: 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a 20 20      /*   2 */.  
e710: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
e720: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
e730: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
e740: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20  1;         /*   
e750: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53  4 */.        INS
e760: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
e770: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
e780: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
e790: 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20    /*   8 */.    
e7a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e7b0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
e7c0: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(800) FROM t1;
e7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36 20           /*  16 
e7e0: 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  */.        INSER
e7f0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
e800: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
e810: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
e820: 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 20 20  /*  32 */.      
e830: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20  COMMIT;.    }.  
e840: 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73  } {wal}.  do_tes
e850: 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 32 20  t pager1-20.3.2 
e860: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
e870: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
e880: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e890: 32 20 56 41 4c 55 45 53 28 27 78 78 78 78 27 29  2 VALUES('xxxx')
e8a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75  ;.    }.    recu
e8b0: 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20  rsive_select 32 
e8c0: 74 31 0a 20 20 20 20 65 78 65 63 73 71 6c 20 43  t1.    execsql C
e8d0: 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a  OMMIT.  } {}.}..
e8e0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
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 0a 23 20 54 65 73  ----------.# Tes
e930: 74 20 74 68 61 74 20 61 20 57 41 4c 20 64 61 74  t that a WAL dat
e940: 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65  abase may not be
e950: 20 6f 70 65 6e 65 64 20 69 66 3a 0a 23 0a 23 20   opened if:.#.# 
e960: 20 20 70 61 67 65 72 31 2d 32 31 2e 31 2e 2a 3a    pager1-21.1.*:
e970: 20 54 68 65 20 56 46 53 20 68 61 73 20 61 6e 20   The VFS has an 
e980: 69 56 65 72 73 69 6f 6e 20 6c 65 73 73 20 74 68  iVersion less th
e990: 61 6e 20 32 2c 20 6f 72 0a 23 20 20 20 70 61 67  an 2, or.#   pag
e9a0: 65 72 31 2d 32 31 2e 32 2e 2a 3a 20 54 68 65 20  er1-21.2.*: The 
e9b0: 56 46 53 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  VFS does not pro
e9c0: 76 69 64 65 20 78 53 68 6d 58 58 58 28 29 20 6d  vide xShmXXX() m
e9d0: 65 74 68 6f 64 73 2e 0a 23 0a 69 66 63 61 70 61  ethods..#.ifcapa
e9e0: 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 74  ble wal {.  do_t
e9f0: 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e 30 20  est pager1-21.0 
ea00: 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64  {.    faultsim_d
ea10: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
ea20: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
ea30: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
ea40: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
ea50: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
ea60: 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54 20  LE ko(c DEFAULT 
ea70: 27 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c 54  'abc', b DEFAULT
ea80: 20 27 64 65 66 27 29 3b 0a 20 20 20 20 20 20 49   'def');.      I
ea90: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45  NSERT INTO ko DE
eaa0: 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20  FAULT VALUES;.  
eab0: 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20    }.  } {wal}.  
eac0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
ead0: 31 2e 31 20 7b 0a 20 20 20 20 74 65 73 74 76 66  1.1 {.    testvf
eae0: 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31 0a 20 20  s tv -noshm 1.  
eaf0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
eb00: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20  st.db -vfs tv.  
eb10: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
eb20: 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20  ECT * FROM ko } 
eb30: 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75 6e 61 62  db2.  } {1 {unab
eb40: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
eb50: 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 64 62 32  ase file}}.  db2
eb60: 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65   close.  tv dele
eb70: 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  te.  do_test pag
eb80: 65 72 31 2d 32 31 2e 32 20 7b 0a 20 20 20 20 74  er1-21.2 {.    t
eb90: 65 73 74 76 66 73 20 74 76 20 2d 69 76 65 72 73  estvfs tv -ivers
eba0: 69 6f 6e 20 31 0a 20 20 20 20 73 71 6c 69 74 65  ion 1.    sqlite
ebb0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76  3 db2 test.db -v
ebc0: 66 73 20 74 76 0a 20 20 20 20 63 61 74 63 68 73  fs tv.    catchs
ebd0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
ebe0: 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20 20 7d 20  OM ko } db2.  } 
ebf0: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70  {1 {unable to op
ec00: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
ec10: 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20  }}.  db2 close. 
ec20: 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d   tv delete.}..#-
ec30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20  --------.# Test 
ec80: 74 68 61 74 20 61 20 22 50 52 41 47 4d 41 20 77  that a "PRAGMA w
ec90: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 3a 0a  al_checkpoint":.
eca0: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32 2e  #.#   pager1-22.
ecb0: 31 2e 2a 3a 20 69 73 20 61 20 6e 6f 2d 6f 70 20  1.*: is a no-op 
ecc0: 6f 6e 20 61 20 6e 6f 6e 2d 57 41 4c 20 64 62 2c  on a non-WAL db,
ecd0: 20 61 6e 64 0a 23 20 20 20 70 61 67 65 72 31 2d   and.#   pager1-
ece0: 32 32 2e 32 2e 2a 3a 20 64 6f 65 73 20 6e 6f 74  22.2.*: does not
ecf0: 20 63 61 75 73 65 20 78 53 79 6e 63 20 63 61 6c   cause xSync cal
ed00: 6c 73 20 77 69 74 68 20 61 20 73 79 6e 63 68 72  ls with a synchr
ed10: 6f 6e 6f 75 73 3d 6f 66 66 20 64 62 2e 0a 23 0a  onous=off db..#.
ed20: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
ed30: 32 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  2.1.1 {.  faults
ed40: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
ed50: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
ed60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
ed70: 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54 20 27  E ko(c DEFAULT '
ed80: 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c 54 20  abc', b DEFAULT 
ed90: 27 64 65 66 27 29 3b 0a 20 20 20 20 49 4e 53 45  'def');.    INSE
eda0: 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55  RT INTO ko DEFAU
edb0: 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 7d 0a 20  LT VALUES;.  }. 
edc0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
edd0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
ede0: 20 7d 0a 7d 20 7b 30 20 2d 31 20 2d 31 7d 0a 64   }.} {0 -1 -1}.d
edf0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 32  o_test pager1-22
ee00: 2e 32 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73  .2.1 {.  testvfs
ee10: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20   tv -default 1. 
ee20: 20 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e 63   tv filter xSync
ee30: 0a 20 20 74 76 20 73 63 72 69 70 74 20 78 53 79  .  tv script xSy
ee40: 6e 63 43 62 0a 20 20 70 72 6f 63 20 78 53 79 6e  ncCb.  proc xSyn
ee50: 63 43 62 20 7b 61 72 67 73 7d 20 7b 69 6e 63 72  cCb {args} {incr
ee60: 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 7d 0a 20 20   ::synccount}.  
ee70: 73 65 74 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 20  set ::synccount 
ee80: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  0.  sqlite3 db t
ee90: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
eea0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79   {.    PRAGMA sy
eeb0: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6f 66 66 3b  nchronous = off;
eec0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
eed0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
eee0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
eef0: 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45  ko DEFAULT VALUE
ef00: 53 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  S;.  }.  execsql
ef10: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
ef20: 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 73 65 74  eckpoint }.  set
ef30: 20 73 79 6e 63 63 6f 75 6e 74 0a 7d 20 7b 30 7d   synccount.} {0}
ef40: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
ef50: 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete..#----------
ef60: 2d 2d 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 0a  ---------------.
efa0: 23 20 54 65 73 74 73 20 66 6f 72 20 63 68 61 6e  # Tests for chan
efb0: 67 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  ging journal mod
efc0: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
efd0: 32 33 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61  23.1.*: Test tha
efe0: 74 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20  t when changing 
eff0: 66 72 6f 6d 20 50 45 52 53 49 53 54 20 74 6f 20  from PERSIST to 
f000: 44 45 4c 45 54 45 20 6d 6f 64 65 2c 0a 23 20 20  DELETE mode,.#  
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f020: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f030: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23   is deleted..#.#
f040: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 2a     pager1-23.2.*
f050: 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 61  : Same test as a
f060: 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c 65 20  bove, but while 
f070: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  a shared lock is
f080: 20 68 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20   held.#         
f090: 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20           on the 
f0a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23  database file..#
f0b0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 33  .#   pager1-23.3
f0c0: 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73  .*: Same test as
f0d0: 20 61 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c   above, but whil
f0e0: 65 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  e a reserved loc
f0f0: 6b 20 69 73 20 68 65 6c 64 0a 23 20 20 20 20 20  k is held.#     
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20               on 
f110: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f120: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
f130: 32 33 2e 34 2e 2a 3a 20 41 6e 64 2c 20 66 6f 72  23.4.*: And, for
f140: 20 66 75 6e 2c 20 77 68 69 6c 65 20 68 6f 6c 64   fun, while hold
f150: 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ing an exclusive
f160: 20 6c 6f 63 6b 2e 0a 23 0a 23 20 20 20 70 61 67   lock..#.#   pag
f170: 65 72 31 2d 32 33 2e 35 2e 2a 3a 20 54 72 79 20  er1-23.5.*: Try 
f180: 74 6f 20 73 65 74 20 76 61 72 69 6f 75 73 20 64  to set various d
f190: 69 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c  ifferent journal
f1a0: 20 6d 6f 64 65 73 20 77 69 74 68 20 61 6e 0a 23   modes with an.#
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61    in-memory data
f1d0: 62 61 73 65 20 28 6f 6e 6c 79 20 4d 45 4d 4f 52  base (only MEMOR
f1e0: 59 20 61 6e 64 20 4f 46 46 20 73 68 6f 75 6c 64  Y and OFF should
f1f0: 20 77 6f 72 6b 29 2e 0a 23 0a 23 20 20 20 70 61   work)..#.#   pa
f200: 67 65 72 31 2d 32 33 2e 36 2e 2a 3a 20 54 72 79  ger1-23.6.*: Try
f210: 20 74 6f 20 73 65 74 20 6c 6f 63 6b 69 6e 67 5f   to set locking_
f220: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 6f 6e 20 61  mode=normal on a
f230: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
f240: 62 61 73 65 0a 23 20 20 20 20 20 20 20 20 20 20  base.#          
f250: 20 20 20 20 20 20 20 20 28 64 6f 65 73 6e 27 74          (doesn't
f260: 20 77 6f 72 6b 20 2d 20 69 6e 2d 6d 65 6d 6f 72   work - in-memor
f270: 79 20 64 61 74 61 62 61 73 65 73 20 61 6c 77 61  y databases alwa
f280: 79 73 20 75 73 65 0a 23 20 20 20 20 20 20 20 20  ys use.#        
f290: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 69 6e            lockin
f2a0: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
f2b0: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  )..#.do_test pag
f2c0: 65 72 31 2d 32 33 2e 31 2e 31 20 7b 0a 20 20 66  er1-23.1.1 {.  f
f2d0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
f2e0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
f2f0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
f300: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f310: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45  PERSIST;.    CRE
f320: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
f330: 62 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 65  b);.  }.  file e
f340: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
f350: 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  urnal.} {1}.do_t
f360: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  est pager1-23.1.
f370: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
f380: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f390: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f3a0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
f3b0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
f3c0: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  0}..do_test page
f3d0: 72 31 2d 32 33 2e 32 2e 31 20 7b 0a 20 20 65 78  r1-23.2.1 {.  ex
f3e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
f3f0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f400: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49  = PERSIST;.    I
f410: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
f420: 4c 55 45 53 28 27 43 61 6e 62 65 72 72 61 27 2c  LUES('Canberra',
f430: 20 27 41 43 54 27 29 3b 0a 20 20 7d 0a 20 20 64   'ACT');.  }.  d
f440: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
f450: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 0a 20 20  * FROM t1 } {.  
f460: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
f470: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f480: 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 7d 0a 20  = DELETE }.  }. 
f490: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f4a0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f4b0: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f4c0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e  est pager1-23.2.
f4d0: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f4e0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f4f0: 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74  l.} {0}..do_test
f500: 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 31 20 7b   pager1-23.3.1 {
f510: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f520: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f530: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
f540: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f550: 74 31 20 56 41 4c 55 45 53 28 27 44 61 72 77 69  t1 VALUES('Darwi
f560: 6e 27 2c 20 27 4e 54 27 29 3b 0a 20 20 20 20 42  n', 'NT');.    B
f570: 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a  EGIN IMMEDIATE;.
f580: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
f590: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f5a0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f5b0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f5c0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f5d0: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f5e0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e  est pager1-23.3.
f5f0: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f600: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f610: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  l.} {0}.do_test 
f620: 70 61 67 65 72 31 2d 32 33 2e 33 2e 33 20 7b 0a  pager1-23.3.3 {.
f630: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
f640: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  .} {}..do_test p
f650: 61 67 65 72 31 2d 32 33 2e 34 2e 31 20 7b 0a 20  ager1-23.4.1 {. 
f660: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
f670: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f680: 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
f690: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
f6a0: 20 56 41 4c 55 45 53 28 27 41 64 65 6c 61 69 64   VALUES('Adelaid
f6b0: 65 27 2c 20 27 53 41 27 29 3b 0a 20 20 20 20 42  e', 'SA');.    B
f6c0: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a  EGIN EXCLUSIVE;.
f6d0: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
f6e0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f6f0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f700: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f710: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f720: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f730: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e  est pager1-23.4.
f740: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f750: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f760: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  l.} {0}.do_test 
f770: 70 61 67 65 72 31 2d 32 33 2e 34 2e 33 20 7b 0a  pager1-23.4.3 {.
f780: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
f790: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  .} {}..do_test p
f7a0: 61 67 65 72 31 2d 32 33 2e 35 2e 31 20 7b 0a 20  ager1-23.5.1 {. 
f7b0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
f7c0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71  _and_reopen.  sq
f7d0: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
f7e0: 3a 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b  :.} {}.foreach {
f7f0: 74 6e 20 6d 6f 64 65 20 70 6f 73 73 69 62 6c 65  tn mode possible
f800: 7d 20 7b 0a 20 20 32 20 20 6f 66 66 20 20 20 20  } {.  2  off    
f810: 20 20 31 0a 20 20 33 20 20 6d 65 6d 6f 72 79 20    1.  3  memory 
f820: 20 20 31 0a 20 20 34 20 20 70 65 72 73 69 73 74    1.  4  persist
f830: 20 20 30 0a 20 20 35 20 20 64 65 6c 65 74 65 20    0.  5  delete 
f840: 20 20 30 0a 20 20 36 20 20 77 61 6c 20 20 20 20    0.  6  wal    
f850: 20 20 30 0a 20 20 37 20 20 74 72 75 6e 63 61 74    0.  7  truncat
f860: 65 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  e 0.} {.  do_tes
f870: 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74  t pager1-23.5.$t
f880: 6e 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.1 {.    execsq
f890: 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  l "PRAGMA journa
f8a0: 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 22 0a 20 20  l_mode = off".  
f8b0: 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
f8c0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f8d0: 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20   $mode".  } [if 
f8e0: 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20  $possible {list 
f8f0: 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6f 66 66  $mode} {list off
f900: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }].  do_test pag
f910: 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 32 20 7b  er1-23.5.$tn.2 {
f920: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52  .    execsql "PR
f930: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f940: 65 20 3d 20 6d 65 6d 6f 72 79 22 0a 20 20 20 20  e = memory".    
f950: 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20  execsql "PRAGMA 
f960: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24  journal_mode = $
f970: 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70  mode".  } [if $p
f980: 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d  ossible {list $m
f990: 6f 64 65 7d 20 7b 6c 69 73 74 20 6d 65 6d 6f 72  ode} {list memor
f9a0: 79 7d 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61  y}].}.do_test pa
f9b0: 67 65 72 31 2d 32 33 2e 36 2e 31 20 7b 0a 20 20  ger1-23.6.1 {.  
f9c0: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
f9d0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e  locking_mode = n
f9e0: 6f 72 6d 61 6c 7d 0a 7d 20 7b 65 78 63 6c 75 73  ormal}.} {exclus
f9f0: 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ive}.do_test pag
fa00: 65 72 31 2d 32 33 2e 36 2e 32 20 7b 0a 20 20 65  er1-23.6.2 {.  e
fa10: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c  xecsql {PRAGMA l
fa20: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78  ocking_mode = ex
fa30: 63 6c 75 73 69 76 65 7d 0a 7d 20 7b 65 78 63 6c  clusive}.} {excl
fa40: 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70  usive}.do_test p
fa50: 61 67 65 72 31 2d 32 33 2e 36 2e 33 20 7b 0a 20  ager1-23.6.3 {. 
fa60: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
fa70: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d   locking_mode}.}
fa80: 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f   {exclusive}.do_
fa90: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
faa0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
fab0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6c 6f 63 6b  PRAGMA main.lock
fac0: 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63  ing_mode}.} {exc
fad0: 6c 75 73 69 76 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  lusive}..#------
fae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ---.#.do_test pa
fb30: 67 65 72 31 2d 32 34 2e 31 2e 31 20 7b 0a 20 20  ger1-24.1.1 {.  
fb40: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
fb50: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
fb60: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
fb70: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
fb80: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
fb90: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
fba0: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
fbb0: 61 63 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20  acuum = FULL;.  
fbc0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
fbd0: 31 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41  1(x, y, z, PRIMA
fbe0: 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20  RY KEY(y, z));. 
fbf0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
fc00: 78 32 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d  x2(x, y, z, PRIM
fc10: 41 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a  ARY KEY(y, z));.
fc20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
fc30: 78 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  x2 VALUES(a_stri
fc40: 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(400), a_strin
fc50: 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(500), a_string
fc60: 28 36 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (600));.    INSE
fc70: 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43  RT INTO x2 SELEC
fc80: 54 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c  T a_string(600),
fc90: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20   a_string(400), 
fca0: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46 52  a_string(500) FR
fcb0: 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52  OM x2;.    INSER
fcc0: 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54  T INTO x2 SELECT
fcd0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
fce0: 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61  a_string(600), a
fcf0: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
fd00: 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x2;.    INSERT
fd10: 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20   INTO x2 SELECT 
fd20: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61  a_string(400), a
fd30: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
fd40: 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
fd50: 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x2;.    INSERT 
fd60: 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61  INTO x2 SELECT a
fd70: 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f  _string(600), a_
fd80: 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73  string(400), a_s
fd90: 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20  tring(500) FROM 
fda0: 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x2;.    INSERT I
fdb0: 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f  NTO x2 SELECT a_
fdc0: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
fdd0: 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74  tring(600), a_st
fde0: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 78  ring(400) FROM x
fdf0: 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  2;.    INSERT IN
fe00: 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73  TO x2 SELECT a_s
fe10: 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74  tring(400), a_st
fe20: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
fe30: 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 78 32  ing(600) FROM x2
fe40: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fe50: 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O x1 SELECT * FR
fe60: 4f 4d 20 78 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM x2;.  }.} {}.
fe70: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
fe80: 34 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  4.1.2 {.  execsq
fe90: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
fea0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
feb0: 20 78 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c   x1 WHERE rowid<
fec0: 33 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73  32;.  }.  recurs
fed0: 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32  ive_select 64 x2
fee0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
fef0: 67 65 72 31 2d 32 34 2e 31 2e 33 20 7b 0a 20 20  ger1-24.1.3 {.  
ff00: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
ff10: 20 55 50 44 41 54 45 20 78 31 20 53 45 54 20 7a   UPDATE x1 SET z
ff20: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29   = a_string(300)
ff30: 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b   WHERE rowid>40;
ff40: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20  .    COMMIT;.   
ff50: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
ff60: 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c  y_check;.    SEL
ff70: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
ff80: 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20  M x1;.  }.} {ok 
ff90: 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  33}..do_test pag
ffa0: 65 72 31 2d 32 34 2e 31 2e 34 20 7b 0a 20 20 65  er1-24.1.4 {.  e
ffb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
ffc0: 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20  ETE FROM x1;.   
ffd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
ffe0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32  SELECT * FROM x2
fff0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
10000 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78     DELETE FROM x
10010 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c 33 32  1 WHERE rowid<32
10020 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78  ;.      UPDATE x
10030 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69  1 SET z = a_stri
10040 6e 67 28 32 39 39 29 20 57 48 45 52 45 20 72 6f  ng(299) WHERE ro
10050 77 69 64 3e 34 30 3b 0a 20 20 7d 0a 20 20 72 65  wid>40;.  }.  re
10060 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36  cursive_select 6
10070 34 20 78 32 20 7b 64 62 20 65 76 61 6c 20 43 4f  4 x2 {db eval CO
10080 4d 4d 49 54 7d 0a 20 20 65 78 65 63 73 71 6c 20  MMIT}.  execsql 
10090 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  {.    PRAGMA int
100a0 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
100b0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
100c0 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d  ) FROM x1;.  }.}
100d0 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73   {ok 33}..do_tes
100e0 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 35 20  t pager1-24.1.5 
100f0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
10100 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31    DELETE FROM x1
10110 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10120 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O x1 SELECT * FR
10130 4f 4d 20 78 32 3b 0a 20 20 7d 0a 20 20 72 65 63  OM x2;.  }.  rec
10140 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34  ursive_select 64
10150 20 78 32 20 7b 20 64 62 20 65 76 61 6c 20 7b 43   x2 { db eval {C
10160 52 45 41 54 45 20 54 41 42 4c 45 20 78 33 28 78  REATE TABLE x3(x
10170 2c 20 79 2c 20 7a 29 7d 20 7d 0a 20 20 65 78 65  , y, z)} }.  exe
10180 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
10190 46 52 4f 4d 20 78 33 20 7d 0a 7d 20 7b 7d 0a 0a  FROM x3 }.} {}..
101a0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
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 0a 23 0a 64 6f 5f  ----------.#.do_
101f0 74 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 31  test pager1-25-1
10200 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
10210 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
10220 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
10230 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56  BEGIN;.      SAV
10240 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20  EPOINT abc;.    
10250 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
10260 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
10270 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63   ROLLBACK TO abc
10280 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
10290 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b  }.  db close.} {
102a0 7d 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 64 6f 5f  }.breakpoint.do_
102b0 74 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 32  test pager1-25-2
102c0 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
102d0 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
102e0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
102f0 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20  SAVEPOINT abc;. 
10300 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
10310 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
10320 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b  ROLLBACK TO abc;
10330 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
10340 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d  .  db close.} {}
10350 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
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 0a 23 20 53  ------------.# S
103a0 65 63 74 6f 72 2d 73 69 7a 65 20 74 65 73 74 73  ector-size tests
103b0 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
103c0 72 31 2d 32 36 2e 31 20 7b 0a 20 20 74 65 73 74  r1-26.1 {.  test
103d0 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
103e0 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  1.  tv sectorsiz
103f0 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69  e 4096.  faultsi
10400 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
10410 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
10420 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
10430 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
10440 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
10450 20 3d 20 35 31 32 3b 0a 20 20 20 20 43 52 45 41   = 512;.    CREA
10460 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 20 50  TE TABLE tbl(a P
10470 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e  RIMARY KEY, b UN
10480 49 51 55 45 29 3b 0a 20 20 20 20 42 45 47 49 4e  IQUE);.    BEGIN
10490 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
104a0 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 61  NTO tbl VALUES(a
104b0 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
104c0 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20  tring(600));.   
104d0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
104e0 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
104f0 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
10500 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
10510 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
10520 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
10530 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
10540 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
10550 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
10560 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
10570 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
10580 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10590 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45   tbl;.      INSE
105a0 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
105b0 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
105c0 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
105d0 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49  ROM tbl;.      I
105e0 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
105f0 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
10600 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
10610 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
10620 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
10630 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
10640 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
10650 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
10660 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10670 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
10680 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
10690 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
106a0 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
106b0 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71  }.} {}.do_execsq
106c0 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 36  l_test pager1-26
106d0 2e 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74 62  .1 {.  UPDATE tb
106e0 6c 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  l SET b = a_stri
106f0 6e 67 28 35 35 30 29 3b 0a 7d 20 7b 7d 0a 64 62  ng(550);.} {}.db
10700 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
10710 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
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 0a 23 0a 64  ------------.#.d
10760 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 32 37  o_test pager1.27
10770 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
10780 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
10790 6e 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  n.  sqlite3_page
107a0 72 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20  r_refcounts db. 
107b0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
107c0 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
107d0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
107e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
107f0 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
10800 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20 43 4f   db.  execsql CO
10810 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  MMIT.} {}..#----
10820 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
10870 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  t attempting to 
10880 6f 70 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61  open a write-tra
10890 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 20 0a 23  nsaction with .#
108a0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
108b0 63 6c 75 73 69 76 65 20 69 6e 20 57 41 4c 20 6d  clusive in WAL m
108c0 6f 64 65 20 66 61 69 6c 73 20 69 66 20 74 68 65  ode fails if the
108d0 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6c 69  re are other cli
108e0 65 6e 74 73 20 6f 6e 20 0a 23 20 74 68 65 20 73  ents on .# the s
108f0 61 6d 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a  ame database..#.
10900 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
10910 20 7d 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c   }.ifcapable wal
10920 20 7b 0a 20 20 64 6f 5f 6d 75 6c 74 69 63 6c 69   {.  do_multicli
10930 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20  ent_test tn {.  
10940 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10950 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  -28.$tn.1 {.    
10960 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20    sql1 { .      
10970 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
10980 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
10990 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
109a0 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
109b0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
109c0 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t1 VALUES('a', '
109d0 62 27 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b');.      }.   
109e0 20 7d 20 7b 77 61 6c 7d 0a 20 20 20 20 64 6f 5f   } {wal}.    do_
109f0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10a00 74 6e 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45  tn.2 { sql2 { SE
10a10 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
10a20 20 7d 20 7b 61 20 62 7d 0a 0a 20 20 20 20 64 6f   } {a b}..    do
10a30 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10a40 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20 50  $tn.3 { sql1 { P
10a50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
10a60 64 65 3d 65 78 63 6c 75 73 69 76 65 20 7d 20 7d  de=exclusive } }
10a70 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 20 20 20   {exclusive}.   
10a80 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10a90 32 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20  28.$tn.4 { .    
10aa0 20 20 63 73 71 6c 31 20 7b 20 42 45 47 49 4e 3b    csql1 { BEGIN;
10ab0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
10ac0 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29  VALUES('c', 'd')
10ad0 3b 20 7d 0a 20 20 20 20 7d 20 7b 31 20 7b 64 61  ; }.    } {1 {da
10ae0 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
10af0 7d 7d 0a 20 20 20 20 63 6f 64 65 32 20 7b 20 64  }}.    code2 { d
10b00 62 32 20 63 6c 6f 73 65 20 3b 20 73 71 6c 69 74  b2 close ; sqlit
10b10 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 7d  e3 db2 test.db }
10b20 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
10b30 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 0a  er1-28.$tn.4 { .
10b40 20 20 20 20 20 20 73 71 6c 31 20 7b 20 49 4e 53        sql1 { INS
10b50 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
10b60 45 53 28 27 63 27 2c 20 27 64 27 29 3b 20 43 4f  ES('c', 'd'); CO
10b70 4d 4d 49 54 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a  MMIT }.    } {}.
10b80 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d    }.}..#--------
10b90 2d 2d 2d 2d 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 0a 23 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68  -.# Normally, wh
10be0 65 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d  en changing from
10bf0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
10c00 52 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20  RSIST to DELETE 
10c10 74 68 65 20 70 61 67 65 72 0a 23 20 61 74 74 65  the pager.# atte
10c20 6d 70 74 73 20 74 6f 20 64 65 6c 65 74 65 20 74  mpts to delete t
10c30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
10c40 20 48 6f 77 65 76 65 72 2c 20 69 66 20 69 74 20   However, if it 
10c50 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 20 61 0a  cannot obtain a.
10c60 23 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  # RESERVED lock 
10c70 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
10c80 66 69 6c 65 2c 20 74 68 69 73 20 73 74 65 70 20  file, this step 
10c90 69 73 20 73 6b 69 70 70 65 64 2e 0a 23 0a 64 6f  is skipped..#.do
10ca0 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73  _multiclient_tes
10cb0 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74  t tn {.  do_test
10cc0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
10cd0 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20   {.    sql1 { . 
10ce0 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
10cf0 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
10d00 53 54 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  ST;.      CREATE
10d10 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
10d20 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10d30 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27  TO t1 VALUES('a'
10d40 2c 20 27 62 27 29 3b 0a 20 20 20 20 7d 0a 20 20  , 'b');.    }.  
10d50 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f  } {persist}.  do
10d60 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10d70 24 74 6e 2e 32 20 7b 20 66 69 6c 65 20 65 78 69  $tn.2 { file exi
10d80 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
10d90 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  nal } 1.  do_tes
10da0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10db0 33 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d  3 { sql1 { PRAGM
10dc0 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
10dd0 20 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65   DELETE } } dele
10de0 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  te.  do_test pag
10df0 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 66  er1-28.$tn.4 { f
10e00 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
10e10 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a  db-journal } 0..
10e20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10e30 2d 32 38 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20  -28.$tn.5 {.    
10e40 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52  sql1 { .      PR
10e50 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
10e60 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
10e70 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10e80 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64  1 VALUES('c', 'd
10e90 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70  ');.    }.  } {p
10ea0 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73  ersist}.  do_tes
10eb0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10ec0 36 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  6 { file exists 
10ed0 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
10ee0 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } 1.  do_test pa
10ef0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 37 20 7b 0a  ger1-28.$tn.7 {.
10f00 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
10f10 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  ; INSERT INTO t1
10f20 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27   VALUES('e', 'f'
10f30 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  ); }.  } {}.  do
10f40 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10f50 24 74 6e 2e 38 20 20 7b 20 66 69 6c 65 20 65 78  $tn.8  { file ex
10f60 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
10f70 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65  rnal } 1.  do_te
10f80 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
10f90 2e 39 20 20 7b 20 73 71 6c 31 20 7b 20 50 52 41  .9  { sql1 { PRA
10fa0 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
10fb0 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20 64 65   = DELETE } } de
10fc0 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70  lete.  do_test p
10fd0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 30 20  ager1-28.$tn.10 
10fe0 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
10ff0 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
11000 31 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  1..  do_test pag
11010 65 72 31 2d 32 38 2e 24 74 6e 2e 31 31 20 7b 20  er1-28.$tn.11 { 
11020 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d  sql2 COMMIT } {}
11030 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11040 31 2d 32 38 2e 24 74 6e 2e 31 32 20 7b 20 66 69  1-28.$tn.12 { fi
11050 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
11060 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20  b-journal } 0.. 
11070 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11080 32 38 2d 24 74 6e 2e 31 33 20 7b 0a 20 20 20 20  28-$tn.13 {.    
11090 63 6f 64 65 31 20 7b 20 73 65 74 20 63 68 61 6e  code1 { set chan
110a0 6e 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62  nel [db incrblob
110b0 20 2d 72 65 61 64 6f 6e 6c 79 20 74 31 20 61 20   -readonly t1 a 
110c0 32 5d 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 0a  2] }.    sql1 {.
110d0 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
110e0 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
110f0 49 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  IST;.      INSER
11100 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
11110 28 27 67 27 2c 20 27 68 27 29 3b 0a 20 20 20 20  ('g', 'h');.    
11120 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a  }.  } {persist}.
11130 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11140 2d 32 38 2e 24 74 6e 2e 31 34 20 7b 20 66 69 6c  -28.$tn.14 { fil
11150 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
11160 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64  -journal } 1.  d
11170 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11180 2e 24 74 6e 2e 31 35 20 7b 0a 20 20 20 20 73 71  .$tn.15 {.    sq
11190 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45  l2 { BEGIN; INSE
111a0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
111b0 53 28 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20  S('e', 'f'); }. 
111c0 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
111d0 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 36  pager1-28.$tn.16
111e0 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41   { sql1 { PRAGMA
111f0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
11200 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74  DELETE } } delet
11210 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  e.  do_test page
11220 72 31 2d 32 38 2e 24 74 6e 2e 31 37 20 7b 20 66  r1-28.$tn.17 { f
11230 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
11240 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a  db-journal } 1..
11250 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11260 2d 32 38 2e 24 74 6e 2e 31 37 20 7b 20 63 73 71  -28.$tn.17 { csq
11270 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20  l2 { COMMIT } } 
11280 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
11290 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
112a0 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e  st pager1-28-$tn
112b0 2e 31 38 20 7b 20 63 6f 64 65 31 20 7b 20 72 65  .18 { code1 { re
112c0 61 64 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20  ad $channel } } 
112d0 63 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  c.  do_test page
112e0 72 31 2d 32 38 2d 24 74 6e 2e 31 39 20 7b 20 63  r1-28-$tn.19 { c
112f0 6f 64 65 31 20 7b 20 63 6c 6f 73 65 20 24 63 68  ode1 { close $ch
11300 61 6e 6e 65 6c 20 7d 20 7d 20 7b 7d 0a 20 20 64  annel } } {}.  d
11310 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11320 2e 24 74 6e 2e 32 30 20 7b 20 73 71 6c 32 20 7b  .$tn.20 { sql2 {
11330 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 7d   COMMIT } } {}.}
11340 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
11350 2d 32 39 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  -29.1 {.  faults
11360 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
11370 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
11380 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
11390 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
113a0 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
113b0 63 75 75 6d 20 3d 20 66 75 6c 6c 3b 0a 20 20 20  cuum = full;.   
113c0 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
113d0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 3b 0a  mode=exclusive;.
113e0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
113f0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
11400 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11410 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a  LUES(1, 2);.  }.
11420 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
11430 2e 64 62 0a 7d 20 5b 65 78 70 72 20 31 30 32 34  .db.} [expr 1024
11440 2a 33 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  *3].do_test page
11450 72 31 2d 32 39 2e 32 20 7b 0a 20 20 65 78 65 63  r1-29.2 {.  exec
11460 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
11470 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39   page_size = 409
11480 36 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20  6;.    VACUUM;. 
11490 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
114a0 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 34  est.db.} [expr 4
114b0 30 39 36 2a 33 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  096*3]..#-------
114c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  --.# Test that i
11510 66 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62  f an empty datab
11520 61 73 65 20 66 69 6c 65 20 28 73 69 7a 65 20 30  ase file (size 0
11530 20 62 79 74 65 73 29 20 69 73 20 6f 70 65 6e 65   bytes) is opene
11540 64 20 69 6e 20 0a 23 20 65 78 63 6c 75 73 69 76  d in .# exclusiv
11550 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
11560 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11570 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   is deleted from
11580 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
11590 0a 23 20 77 69 74 68 6f 75 74 20 62 65 69 6e 67  .# without being
115a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 41 6e   rolled back. An
115b0 64 20 74 68 61 74 20 74 68 65 20 52 45 53 45 52  d that the RESER
115c0 56 45 44 20 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  VED lock obtaine
115d0 64 20 77 68 69 6c 65 0a 23 20 64 6f 69 6e 67 20  d while.# doing 
115e0 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 6c 65  this is not rele
115f0 61 73 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ased..#.do_test 
11600 70 61 67 65 72 31 2d 33 30 2e 31 20 7b 0a 20 20  pager1-30.1 {.  
11610 64 62 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20  db close.  file 
11620 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20  delete test.db. 
11630 20 66 69 6c 65 20 64 65 6c 65 74 65 20 74 65 73   file delete tes
11640 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73  t.db-journal.  s
11650 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74  et fd [open test
11660 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20  .db-journal w]. 
11670 20 73 65 65 6b 20 24 66 64 20 5b 65 78 70 72 20   seek $fd [expr 
11680 35 31 32 2b 31 30 33 32 2a 32 5d 0a 20 20 70 75  512+1032*2].  pu
11690 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66  ts -nonewline $f
116a0 64 20 78 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  d x.  close $fd.
116b0 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
116c0 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
116d0 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  {.    PRAGMA loc
116e0 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
116f0 49 56 45 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  IVE;.    SELECT 
11700 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
11710 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20  lite_master;.   
11720 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
11730 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c  tus;.  }.} {excl
11740 75 73 69 76 65 20 30 20 6d 61 69 6e 20 72 65 73  usive 0 main res
11750 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73 65  erved temp close
11760 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  d}..#-----------
11770 2d 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 0a 23  --------------.#
117b0 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
117c0 65 20 22 70 61 67 65 2d 73 69 7a 65 22 20 66 69  e "page-size" fi
117d0 65 6c 64 20 69 6e 20 61 20 6a 6f 75 72 6e 61 6c  eld in a journal
117e0 2d 68 65 61 64 65 72 20 69 73 20 30 2c 20 74 68  -header is 0, th
117f0 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 66 69 6c 65  e journal.# file
11800 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 72 6f   can still be ro
11810 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
11820 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
11830 62 61 63 6b 77 61 72 64 20 63 6f 6d 70 61 74 69  backward compati
11840 62 69 6c 69 74 79 20 2d 0a 23 20 76 65 72 73 69  bility -.# versi
11850 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
11860 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 61 6c 77  ior to 3.5.8 alw
11870 61 79 73 20 73 65 74 20 74 68 69 73 20 66 69 65  ays set this fie
11880 6c 64 20 74 6f 20 7a 65 72 6f 2e 0a 23 0a 64 6f  ld to zero..#.do
11890 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 31 2e  _test pager1-31.
118a0 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
118b0 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
118c0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
118d0 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
118e0 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41  ze = 10;.    PRA
118f0 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
11900 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
11910 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 2c 20   TABLE t1(x, y, 
11920 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
11930 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11940 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
11950 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11960 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20  mblob(1500));.  
11970 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11980 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
11990 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
119a0 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
119b0 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
119c0 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
119d0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
119e0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
119f0 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
11a00 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
11a10 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
11a20 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
11a30 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
11a40 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11a50 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
11a60 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
11a70 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
11a80 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
11a90 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
11aa0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
11ab0 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
11ac0 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
11ad0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
11ae0 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
11af0 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
11b00 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
11b10 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11b20 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
11b30 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
11b40 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
11b50 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
11b60 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
11b70 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
11b80 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
11b90 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
11ba0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11bb0 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
11bc0 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
11bd0 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
11be0 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
11bf0 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
11c00 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
11c10 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
11c20 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45   FROM t1;.    BE
11c30 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
11c40 45 20 74 31 20 53 45 54 20 79 20 3d 20 72 61 6e  E t1 SET y = ran
11c50 64 6f 6d 62 6c 6f 62 28 31 34 39 39 29 3b 0a 20  domblob(1499);. 
11c60 20 7d 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 74   }.  file copy t
11c70 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a  est.db test.db2.
11c80 20 20 66 69 6c 65 20 63 6f 70 79 20 74 65 73 74    file copy test
11c90 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74  .db-journal test
11ca0 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 0a 20 20 0a  .db2-journal.  .
11cb0 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
11cc0 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 32  st.db2-journal 2
11cd0 34 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c  4 00000000.  sql
11ce0 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
11cf0 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  2.  execsql { PR
11d00 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
11d10 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b  heck } db2.} {ok
11d20 7d 0a 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  }....finish_test
11d30 0a                                               .