/ Hex Artifact Content
Login

Artifact 6e43e79d6ac1fc31b494ff3a0b56445b7eda5d2b:


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 20 20 20 20 20 20 20 20 20 20  ock".#          
0670: 20 20 20 20 28 54 68 65 20 6f 6d 69 74 5f 72 65      (The omit_re
0680: 61 64 6c 6f 63 6b 20 70 72 61 67 6d 61 20 68 61  adlock pragma ha
0690: 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 61  s been removed a
06a0: 6e 64 20 73 6f 20 68 61 76 65 0a 23 20 20 20 20  nd so have.#    
06b0: 20 20 20 20 20 20 20 20 20 20 74 68 65 73 65 20            these 
06c0: 74 65 73 74 73 2e 29 0a 23 0a 23 20 70 61 67 65  tests.).#.# page
06d0: 72 31 2d 31 38 2e 2a 3a 20 54 65 73 74 20 74 68  r1-18.*: Test th
06e0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  at the pager lay
06f0: 65 72 20 72 65 73 70 6f 6e 64 73 20 63 6f 72 72  er responds corr
0700: 65 63 74 6c 79 20 69 66 20 74 68 65 20 62 2d 74  ectly if the b-t
0710: 72 65 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ree.#           
0720: 20 20 20 72 65 71 75 65 73 74 73 20 61 6e 20 69     requests an i
0730: 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
0740: 65 72 20 28 64 75 65 20 74 6f 20 64 62 20 63 6f  er (due to db co
0750: 72 72 75 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72  rruption)..#..pr
0760: 6f 63 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  oc recursive_sel
0770: 65 63 74 20 7b 69 64 20 74 61 62 6c 65 20 7b 73  ect {id table {s
0780: 63 72 69 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73  cript {}}} {.  s
0790: 65 74 20 63 6e 74 20 30 0a 20 20 64 62 20 65 76  et cnt 0.  db ev
07a0: 61 6c 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64  al "SELECT rowid
07b0: 2c 20 2a 20 46 52 4f 4d 20 24 74 61 62 6c 65 20  , * FROM $table 
07c0: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 28 24  WHERE rowid = ($
07d0: 69 64 2d 31 29 22 20 7b 0a 20 20 20 20 72 65 63  id-1)" {.    rec
07e0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 24 72  ursive_select $r
07f0: 6f 77 69 64 20 24 74 61 62 6c 65 20 24 73 63 72  owid $table $scr
0800: 69 70 74 0a 20 20 20 20 69 6e 63 72 20 63 6e 74  ipt.    incr cnt
0810: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d  .  }.  if {$cnt=
0820: 3d 30 7d 20 7b 20 65 76 61 6c 20 24 73 63 72 69  =0} { eval $scri
0830: 70 74 20 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74  pt }.}..set a_st
0840: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70  ring_counter 1.p
0850: 72 6f 63 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d  roc a_string {n}
0860: 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74   {.  global a_st
0870: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69  ring_counter.  i
0880: 6e 63 72 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75  ncr a_string_cou
0890: 6e 74 65 72 0a 20 20 73 74 72 69 6e 67 20 72 61  nter.  string ra
08a0: 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70 65  nge [string repe
08b0: 61 74 20 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63  at "${a_string_c
08c0: 6f 75 6e 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20  ounter}." $n] 1 
08d0: 24 6e 0a 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73  $n.}.db func a_s
08e0: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a  tring a_string..
08f0: 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
0900: 65 73 74 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72  est tn {..  # Cr
0910: 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  eate and populat
0920: 65 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  e a database tab
0930: 6c 65 20 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74  le using connect
0940: 69 6f 6e 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20  ion [db]. Check 
0950: 0a 20 20 23 20 74 68 61 74 20 63 6f 6e 6e 65 63  .  # that connec
0960: 74 69 6f 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20  tions [db2] and 
0970: 5b 64 62 33 5d 20 63 61 6e 20 73 65 65 20 74 68  [db3] can see th
0980: 65 20 73 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e  e schema and con
0990: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
09a0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
09b0: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   {.    sql1 {.  
09c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
09d0: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
09e0: 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  Y, b);.      CRE
09f0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
0a00: 74 31 28 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  t1(b);.      INS
0a10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0a20: 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e  ES(1, 'one'); IN
0a30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0a40: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
0a50: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
0a60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a70: 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  .2 { sql2 { SELE
0a80: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a90: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20   {1 one 2 two}. 
0aa0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
0ab0: 24 74 6e 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53  $tn.3 { sql3 { S
0ac0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0ad0: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
0ae0: 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 74 72  }..  # Open a tr
0af0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 64  ansaction and ad
0b00: 64 20 61 20 72 6f 77 20 75 73 69 6e 67 20 5b 64  d a row using [d
0b10: 62 5d 2e 20 54 68 69 73 20 70 75 74 73 20 5b 64  b]. This puts [d
0b20: 62 5d 20 69 6e 0a 20 20 23 20 52 45 53 45 52 56  b] in.  # RESERV
0b30: 45 44 20 73 74 61 74 65 2e 20 43 68 65 63 6b 20  ED state. Check 
0b40: 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  that connections
0b50: 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d   [db2] and [db3]
0b60: 20 63 61 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72   can still.  # r
0b70: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
0b80: 20 63 6f 6e 74 65 6e 74 20 61 73 20 69 74 20 77   content as it w
0b90: 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  as before the tr
0ba0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20  ansaction was.  
0bb0: 23 20 6f 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73  # opened. [db] s
0bc0: 68 6f 75 6c 64 20 73 65 65 20 74 68 65 20 69 6e  hould see the in
0bd0: 73 65 72 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a  serted row..  #.
0be0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0bf0: 2d 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c  -$tn.4 {.    sql
0c00: 31 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  1 {.      BEGIN;
0c10: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
0c20: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
0c30: 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20  , 'three');.    
0c40: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0c50: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 35 20  st pager1-$tn.5 
0c60: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0c70: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c80: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0c90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0ca0: 2e 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  .7 { sql1 { SELE
0cb0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0cc0: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20   {1 one 2 two 3 
0cd0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d  three}..  # [db]
0ce0: 20 73 74 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70   still has an op
0cf0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
0d00: 74 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61 74  tion. Check that
0d10: 20 74 68 69 73 20 70 72 65 76 65 6e 74 73 0a 20   this prevents. 
0d20: 20 23 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   # other connect
0d30: 69 6f 6e 73 20 28 73 70 65 63 69 66 69 63 61 6c  ions (specifical
0d40: 6c 79 20 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77  ly [db2]) from w
0d50: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
0d60: 74 61 62 61 73 65 2e 0a 20 20 23 0a 20 20 23 20  tabase..  #.  # 
0d70: 45 76 65 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70  Even if [db2] op
0d80: 65 6e 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ens a transactio
0d90: 6e 20 66 69 72 73 74 2c 20 69 74 20 6d 61 79 20  n first, it may 
0da0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
0db0: 0a 20 20 23 20 64 61 74 61 62 61 73 65 2e 20 41  .  # database. A
0dc0: 66 74 65 72 20 74 68 65 20 61 74 74 65 6d 70 74  fter the attempt
0dd0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64 62   to write the db
0de0: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
0df0: 63 74 69 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32  ction, .  # [db2
0e00: 5d 20 69 73 20 6c 65 66 74 20 77 69 74 68 20 61  ] is left with a
0e10: 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
0e20: 6f 6e 2c 20 62 75 74 20 6e 6f 74 20 61 20 72 65  on, but not a re
0e30: 61 64 2d 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74  ad-lock on.  # t
0e40: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
0e50: 2e 20 53 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74  . So it does not
0e60: 20 70 72 65 76 65 6e 74 20 5b 64 62 5d 20 66 72   prevent [db] fr
0e70: 6f 6d 20 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20  om committing.. 
0e80: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
0e90: 65 72 31 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20  er1-$tn.8 { .   
0ea0: 20 63 73 71 6c 32 20 7b 20 55 50 44 41 54 45 20   csql2 { UPDATE 
0eb0: 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31  t1 SET a = a + 1
0ec0: 30 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61  0 }.  } {1 {data
0ed0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
0ee0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
0ef0: 31 2d 24 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63  1-$tn.9 { .    c
0f00: 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 42 45  sql2 { .      BE
0f10: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
0f20: 45 20 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b  E t1 SET a = a +
0f30: 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   10;.    }.  } {
0f40: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
0f50: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
0f60: 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74  e [db] commit it
0f70: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  s transactions. 
0f80: 43 68 65 63 6b 20 74 68 65 20 6f 74 68 65 72 20  Check the other 
0f90: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a  connections can.
0fa0: 20 20 23 20 6e 6f 77 20 73 65 65 20 74 68 65 20    # now see the 
0fb0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 63 6f 6e  new database con
0fc0: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
0fd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
0fe0: 30 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49  0 { sql1 { COMMI
0ff0: 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  T } } {}.  do_te
1000: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 31  st pager1-$tn.11
1010: 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54   { sql1 { SELECT
1020: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1030: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1040: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1050: 61 67 65 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73  ager1-$tn.12 { s
1060: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
1070: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1080: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1090: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10a0: 31 2d 24 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20  1-$tn.13 { sql3 
10b0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
10c0: 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20  t1 } } {1 one 2 
10d0: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20  two 3 three}..  
10e0: 23 20 43 68 65 63 6b 20 74 68 61 74 2c 20 61 73  # Check that, as
10f0: 20 6e 6f 74 65 64 20 61 62 6f 76 65 2c 20 5b 64   noted above, [d
1100: 62 32 5d 20 72 65 61 6c 6c 79 20 64 69 64 20 6b  b2] really did k
1110: 65 65 70 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  eep an open tran
1120: 73 61 63 74 69 6f 6e 0a 20 20 23 20 61 66 74 65  saction.  # afte
1130: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
1140: 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62   write the datab
1150: 61 73 65 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a  ase failed..  #.
1160: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1170: 2d 24 74 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63  -$tn.14 { .    c
1180: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a  sql2 { BEGIN } .
1190: 20 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73    } {1 {cannot s
11a0: 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
11b0: 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  on within a tran
11c0: 73 61 63 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74  saction}}.  do_t
11d0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
11e0: 35 20 7b 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42  5 { sql2 { ROLLB
11f0: 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20  ACK } } {}..  # 
1200: 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20  Have [db2] open 
1210: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
1220: 64 20 74 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f  d take a read-lo
1230: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1240: 73 65 2e 0a 20 20 23 20 43 68 65 63 6b 20 74 68  se..  # Check th
1250: 61 74 20 74 68 69 73 20 70 72 65 76 65 6e 74 73  at this prevents
1260: 20 5b 64 62 5d 20 66 72 6f 6d 20 77 72 69 74 69   [db] from writi
1270: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1280: 73 65 20 28 6f 75 74 73 69 64 65 0a 20 20 23 20  se (outside.  # 
1290: 6f 66 20 61 6e 79 20 74 72 61 6e 73 61 63 74 69  of any transacti
12a0: 6f 6e 29 2e 20 41 66 74 65 72 20 74 68 69 73 20  on). After this 
12b0: 66 61 69 6c 73 2c 20 63 68 65 63 6b 20 74 68 61  fails, check tha
12c0: 74 20 5b 64 62 33 5d 20 63 61 6e 20 72 65 61 64  t [db3] can read
12d0: 0a 20 20 23 20 74 68 65 20 64 62 20 28 73 68 6f  .  # the db (sho
12e0: 77 69 6e 67 20 74 68 61 74 20 5b 64 62 5d 20 64  wing that [db] d
12f0: 69 64 20 6e 6f 74 20 74 61 6b 65 20 61 20 50 45  id not take a PE
1300: 4e 44 49 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29  NDING lock etc.)
1310: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
1320: 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a  ager1-$tn.15 { .
1330: 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
1340: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1350: 74 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65  t1; }.  } {1 one
1360: 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a   2 two 3 three}.
1370: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1380: 2d 24 74 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63  -$tn.16 { .    c
1390: 73 71 6c 31 20 7b 20 55 50 44 41 54 45 20 74 31  sql1 { UPDATE t1
13a0: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20   SET a = a + 10 
13b0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
13c0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
13d0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
13e0: 24 74 6e 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20  $tn.17 { sql3 { 
13f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1400: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
1410: 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20  o 3 three}..  # 
1420: 54 68 69 73 20 74 69 6d 65 2c 20 68 61 76 65 20  This time, have 
1430: 5b 64 62 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e  [db] open a tran
1440: 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 77  saction before w
1450: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1460: 61 73 65 2e 0a 20 20 23 20 54 68 69 73 20 77 6f  ase..  # This wo
1470: 72 6b 73 20 2d 20 5b 64 62 5d 20 67 65 74 73 20  rks - [db] gets 
1480: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1490: 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 63  which does not c
14a0: 6f 6e 66 6c 69 63 74 20 77 69 74 68 0a 20 20 23  onflict with.  #
14b0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
14c0: 20 5b 64 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e   [db2] is holdin
14d0: 67 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  g..  #.  do_test
14e0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b   pager1-$tn.18 {
14f0: 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20   .    sql1 { .  
1500: 20 20 20 20 42 45 47 49 4e 3b 20 20 0a 20 20 20      BEGIN;  .   
1510: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
1520: 20 61 20 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20   a = a + 10; .  
1530: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
1540: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d  test pager1-$tn-
1550: 31 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b  19 { .    sql1 {
1560: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
1570: 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e  tus } .  } {main
1580: 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63   reserved temp c
1590: 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74  losed}.  do_test
15a0: 20 70 61 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b   pager1-$tn-20 {
15b0: 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 50 52 41   .    sql2 { PRA
15c0: 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20  GMA lock_status 
15d0: 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61  } .  } {main sha
15e0: 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d  red temp closed}
15f0: 0a 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74  ..  # Check that
1600: 20 61 6c 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   all connections
1610: 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20   can still read 
1620: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 4f 6e  the database. On
1630: 6c 79 20 5b 64 62 5d 20 73 65 65 73 0a 20 20 23  ly [db] sees.  #
1640: 20 74 68 65 20 75 70 64 61 74 65 64 20 63 6f 6e   the updated con
1650: 74 65 6e 74 20 28 61 73 20 74 68 65 20 74 72 61  tent (as the tra
1660: 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1670: 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1680: 79 65 74 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  yet)..  #.  do_t
1690: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
16a0: 31 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  1 { sql1 { SELEC
16b0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
16c0: 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31  {11 one 12 two 1
16d0: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
16e0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 32  st pager1-$tn.22
16f0: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1700: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1710: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1720: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1730: 61 67 65 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73  ager1-$tn.23 { s
1740: 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql3 { SELECT * F
1750: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1760: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1770: 0a 0a 20 20 23 20 42 65 63 61 75 73 65 20 5b 64  ..  # Because [d
1780: 62 32 5d 20 73 74 69 6c 6c 20 68 61 73 20 74 68  b2] still has th
1790: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b  e SHARED lock, [
17a0: 64 62 5d 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  db] is unable to
17b0: 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 23 20   commit the.  # 
17c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
17d0: 69 74 20 74 72 69 65 73 2c 20 61 6e 20 65 72 72  it tries, an err
17e0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  or is returned a
17f0: 6e 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  nd the connectio
1800: 6e 20 0a 20 20 23 20 75 70 67 72 61 64 65 73 20  n .  # upgrades 
1810: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
1820: 6b 2e 0a 20 20 23 0a 20 20 23 20 4f 6e 63 65 20  k..  #.  # Once 
1830: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 5b 64  this happens, [d
1840: 62 5d 20 63 61 6e 20 72 65 61 64 20 74 68 65 20  b] can read the 
1850: 64 61 74 61 62 61 73 65 20 61 6e 64 20 73 65 65  database and see
1860: 20 74 68 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74   the new content
1870: 2c 0a 20 20 23 20 5b 64 62 32 5d 20 28 73 74 69  ,.  # [db2] (sti
1880: 6c 6c 20 68 6f 6c 64 69 6e 67 20 53 48 41 52 45  ll holding SHARE
1890: 44 29 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61  D) can still rea
18a0: 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e  d the old conten
18b0: 74 2c 20 62 75 74 20 5b 64 62 33 5d 0a 20 20 23  t, but [db3].  #
18c0: 20 28 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e   (not holding an
18d0: 79 20 6c 6f 63 6b 29 20 69 73 20 70 72 65 76 65  y lock) is preve
18e0: 6e 74 65 64 20 62 79 20 5b 64 62 5d 27 73 20 50  nted by [db]'s P
18f0: 45 4e 44 49 4e 47 20 66 72 6f 6d 20 72 65 61 64  ENDING from read
1900: 69 6e 67 0a 20 20 23 20 74 68 65 20 64 61 74 61  ing.  # the data
1910: 62 61 73 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  base..  #.  do_t
1920: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1930: 34 20 7b 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d  4 { csql1 { COMM
1940: 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  IT } } {1 {datab
1950: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
1960: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1970: 2d 24 74 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73  -$tn-25 { .    s
1980: 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63  ql1 { PRAGMA loc
1990: 6b 5f 73 74 61 74 75 73 20 7d 20 0a 20 20 7d 20  k_status } .  } 
19a0: 7b 6d 61 69 6e 20 70 65 6e 64 69 6e 67 20 74 65  {main pending te
19b0: 6d 70 20 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f  mp closed}.  do_
19c0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
19d0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  26 { sql1 { SELE
19e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
19f0: 7d 20 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f  } {11 one 12 two
1a00: 20 31 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   13 three}.  do_
1a10: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1a20: 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  27 { sql2 { SELE
1a30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
1a40: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
1a50: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1a60: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1a70: 7b 20 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54  { csql3 { SELECT
1a80: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1a90: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1aa0: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
1ab0: 65 20 5b 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69  e [db2] commit i
1ac0: 74 73 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ts read transact
1ad0: 69 6f 6e 2c 20 72 65 6c 65 61 73 69 6e 67 20 74  ion, releasing t
1ae0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69  he SHARED lock i
1af0: 74 0a 20 20 23 20 69 73 20 68 6f 6c 64 69 6e 67  t.  # is holding
1b00: 2e 20 4e 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b  . Now, neither [
1b10: 64 62 32 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d  db2] nor [db3] m
1b20: 61 79 20 72 65 61 64 20 74 68 65 20 64 61 74 61  ay read the data
1b30: 62 61 73 65 20 28 61 73 20 5b 64 62 5d 0a 20 20  base (as [db].  
1b40: 23 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  # is still holdi
1b50: 6e 67 20 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20  ng a PENDING).. 
1b60: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
1b70: 65 72 31 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c  er1-$tn.29 { sql
1b80: 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b  2 { COMMIT } } {
1b90: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1ba0: 72 31 2d 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c  r1-$tn.30 { csql
1bb0: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
1bc0: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1bd0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1be0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1bf0: 72 31 2d 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c  r1-$tn.31 { csql
1c00: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
1c10: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1c20: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1c30: 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 69 73 20 6e  }..  # [db] is n
1c40: 6f 77 20 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69  ow able to commi
1c50: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1c60: 6e 2e 20 4f 6e 63 65 20 74 68 65 20 74 72 61 6e  n. Once the tran
1c70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 20 20 23 20  saction is .  # 
1c80: 63 6f 6d 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74  committed, all t
1c90: 68 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  hree connections
1ca0: 20 63 61 6e 20 72 65 61 64 20 74 68 65 20 6e 65   can read the ne
1cb0: 77 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20  w content..  #. 
1cc0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1cd0: 24 74 6e 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20  $tn.25 { sql1 { 
1ce0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
1cf0: 3d 20 61 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20  = a+10 } } {}.  
1d00: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1d10: 74 6e 2e 32 36 20 7b 20 73 71 6c 31 20 7b 20 43  tn.26 { sql1 { C
1d20: 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64  OMMIT } } {}.  d
1d30: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1d40: 6e 2e 32 37 20 7b 20 73 71 6c 31 20 7b 20 53 45  n.27 { sql1 { SE
1d50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1d60: 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77   } {21 one 22 tw
1d70: 6f 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f  o 23 three}.  do
1d80: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1d90: 2e 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c  .27 { sql2 { SEL
1da0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
1db0: 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f  } {21 one 22 two
1dc0: 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   23 three}.  do_
1dd0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1de0: 32 38 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  28 { sql3 { SELE
1df0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
1e00: 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20   {21 one 22 two 
1e10: 32 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 49  23 three}..  # I
1e20: 6e 73 74 61 6c 6c 20 61 20 62 75 73 79 2d 68 61  nstall a busy-ha
1e30: 6e 64 6c 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63  ndler for connec
1e40: 74 69 6f 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20  tion [db]..  #. 
1e50: 20 73 65 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69   set ::nbusy [li
1e60: 73 74 5d 0a 20 20 70 72 6f 63 20 62 75 73 79 20  st].  proc busy 
1e70: 7b 6e 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  {n} {.    lappen
1e80: 64 20 3a 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20  d ::nbusy $n.   
1e90: 20 69 66 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c   if {$n>5} { sql
1ea0: 32 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72  2 COMMIT }.    r
1eb0: 65 74 75 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62  eturn 0.  }.  db
1ec0: 20 62 75 73 79 20 62 75 73 79 0a 0a 20 20 64 6f   busy busy..  do
1ed0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1ee0: 2e 32 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20  .29 { .    sql1 
1ef0: 7b 20 42 45 47 49 4e 20 3b 20 49 4e 53 45 52 54  { BEGIN ; INSERT
1f00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1f10: 27 78 27 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d  'x', 'y') } .  }
1f20: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
1f30: 67 65 72 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20  ger1-$tn.30 { . 
1f40: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 20     sql2 { BEGIN 
1f50: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1f60: 74 31 20 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e  t1 } .  } {21 on
1f70: 65 20 32 32 20 74 77 6f 20 32 33 20 74 68 72 65  e 22 two 23 thre
1f80: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  e}.  do_test pag
1f90: 65 72 31 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c  er1-$tn.31 { sql
1fa0: 31 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20  1 COMMIT } {}.  
1fb0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1fc0: 74 6e 2e 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62  tn.32 { set ::nb
1fd0: 75 73 79 20 7d 20 7b 30 20 31 20 32 20 33 20 34  usy } {0 1 2 3 4
1fe0: 20 35 20 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   5 6}.}..#------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 0a 23 20 53 61 76 65 70 6f 69 6e 74 20  ---.# Savepoint 
2040: 72 65 6c 61 74 65 64 20 74 65 73 74 20 63 61 73  related test cas
2050: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 33  es..#.# pager1-3
2060: 2e 31 2e 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20  .1.2.*: Force a 
2070: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
2080: 63 6b 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ck to cause the 
2090: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20  database file.# 
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 74 6f 20 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67  to grow..#.# pag
20c0: 65 72 31 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65  er1-3.1.3.*: Use
20d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
20e0: 65 64 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ed in synchronou
20f0: 73 3d 6f 66 66 20 6d 6f 64 65 20 61 73 20 70 61  s=off mode as pa
2100: 72 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  rt.#            
2110: 20 20 20 20 20 6f 66 20 61 20 73 61 76 65 70 6f       of a savepo
2120: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20  int rollback..# 
2130: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
2140: 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  3.1.1 {.  faults
2150: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
2160: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
2170: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2180: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
2190: 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  EY, b);.    CREA
21a0: 54 45 20 54 41 42 4c 45 20 63 6f 75 6e 74 65 72  TE TABLE counter
21b0: 28 0a 20 20 20 20 20 20 69 20 43 48 45 43 4b 20  (.      i CHECK 
21c0: 28 69 3c 35 29 2c 20 0a 20 20 20 20 20 20 75 20  (i<5), .      u 
21d0: 43 48 45 43 4b 20 28 75 3c 31 30 29 0a 20 20 20  CHECK (u<10).   
21e0: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
21f0: 4e 54 4f 20 63 6f 75 6e 74 65 72 20 56 41 4c 55  NTO counter VALU
2200: 45 53 28 30 2c 20 30 29 3b 0a 20 20 20 20 43 52  ES(0, 0);.    CR
2210: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31  EATE TRIGGER tr1
2220: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
2230: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
2240: 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72 20 53  UPDATE counter S
2250: 45 54 20 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20  ET i = i+1;.    
2260: 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20  END;.    CREATE 
2270: 54 52 49 47 47 45 52 20 74 72 32 20 41 46 54 45  TRIGGER tr2 AFTE
2280: 52 20 55 50 44 41 54 45 20 4f 4e 20 74 31 20 42  R UPDATE ON t1 B
2290: 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54  EGIN.      UPDAT
22a0: 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20 75 20  E counter SET u 
22b0: 3d 20 75 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a  = u+1;.    END;.
22c0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
22d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f  SELECT * FROM co
22e0: 75 6e 74 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a  unter }.} {0 0}.
22f0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2300: 20 70 61 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a   pager1-3.1.2 {.
2310: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
2320: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49  ize = 10;.  BEGI
2330: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
2340: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
2350: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2360: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2370: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
2380: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2390: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
23a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
23b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
23c0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
23d0: 46 52 4f 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20  FROM counter;.} 
23e0: 7b 33 20 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71  {3 0}.do_catchsq
23f0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2400: 31 2e 33 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  1.3 {.    INSERT
2410: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2420: 61 2b 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  a+3, randomblob(
2430: 31 35 30 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20  1500) FROM t1.} 
2440: 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66  {1 {constraint f
2450: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73  ailed}}.do_execs
2460: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2470: 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .4 { SELECT * FR
2480: 4f 4d 20 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20  OM counter } {3 
2490: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
24a0: 73 74 20 70 61 67 65 72 31 2d 33 2e 35 20 7b 20  st pager1-3.5 { 
24b0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
24c0: 20 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78   } {1 2 3}.do_ex
24d0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
24e0: 31 2d 33 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d  1-3.6 { COMMIT }
24f0: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e   {}..foreach {tn
2500: 20 73 71 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20   sql tcl} {.  7 
2510: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2520: 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b  onous = NORMAL ;
2530: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
2540: 72 65 20 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74  re = 0 } {.    t
2550: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
2560: 6c 74 20 31 0a 20 20 20 20 74 76 20 64 65 76 63  lt 1.    tv devc
2570: 68 61 72 20 73 61 66 65 5f 61 70 70 65 6e 64 0a  har safe_append.
2580: 20 20 7d 0a 20 20 38 20 20 7b 20 50 52 41 47 4d    }.  8  { PRAGM
2590: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
25a0: 4e 4f 52 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20  NORMAL ; PRAGMA 
25b0: 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d  temp_store = 2 }
25c0: 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74   {.    testvfs t
25d0: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20  v -default 1.   
25e0: 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71 75   tv devchar sequ
25f0: 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20  ential.  }.  9  
2600: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2610: 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20  nous = FULL } { 
2620: 7d 0a 20 20 31 30 20 7b 20 50 52 41 47 4d 41 20  }.  10 { PRAGMA 
2630: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f  synchronous = NO
2640: 52 4d 41 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20  RMAL } { }.  11 
2650: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2660: 6e 6f 75 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d  nous = OFF } { }
2670: 0a 20 20 31 32 20 7b 20 50 52 41 47 4d 41 20 73  .  12 { PRAGMA s
2680: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c  ynchronous = FUL
2690: 4c 20 3b 20 50 52 41 47 4d 41 20 66 75 6c 6c 66  L ; PRAGMA fullf
26a0: 73 79 6e 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20  sync = 1 } { }. 
26b0: 20 31 33 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   13 { PRAGMA syn
26c0: 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20  chronous = FULL 
26d0: 7d 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20  } {.    testvfs 
26e0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
26f0: 20 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71    tv devchar seq
2700: 75 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34  uential.  }.  14
2710: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
2720: 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49  g_mode = EXCLUSI
2730: 56 45 20 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20  VE } {.  }.} {. 
2740: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
2750: 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76  3.$tn.1 {.    ev
2760: 61 6c 20 24 74 63 6c 0a 20 20 20 20 66 61 75 6c  al $tcl.    faul
2770: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
2780: 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75  reopen.    db fu
2790: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
27a0: 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c  ring.    execsql
27b0: 20 24 73 71 6c 0a 20 20 20 20 65 78 65 63 73 71   $sql.    execsq
27c0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
27d0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32   auto_vacuum = 2
27e0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63  ;.      PRAGMA c
27f0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
2800: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
2810: 4c 45 20 7a 28 78 20 49 4e 54 45 47 45 52 20 50  LE z(x INTEGER P
2820: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
2830: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
2840: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2850: 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20   z VALUES(NULL, 
2860: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
2870: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2880: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
2890: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
28a0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
28b0: 20 20 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45    2.        INSE
28c0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
28d0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
28e0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
28f0: 20 2d 2d 20 20 20 34 0a 20 20 20 20 20 20 20 20   --   4.        
2900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2910: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2920: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2930: 20 20 20 20 20 2d 2d 20 20 20 38 0a 20 20 20 20       --   8.    
2940: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2950: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2960: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2970: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a  M z;     --  16.
2980: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2990: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
29a0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
29b0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
29c0: 20 33 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45   32.        INSE
29d0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
29e0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
29f0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
2a00: 20 2d 2d 20 20 36 34 0a 20 20 20 20 20 20 20 20   --  64.        
2a10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2a20: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2a30: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2a40: 20 20 20 20 20 2d 2d 20 31 32 38 0a 20 20 20 20       -- 128.    
2a50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2a60: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2a70: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2a80: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a  M z;     -- 256.
2a90: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
2aa0: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
2ab0: 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61  { PRAGMA auto_va
2ac0: 63 75 75 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20  cuum }.  } {2}. 
2ad0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2ae0: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20   pager1-3.$tn.2 
2af0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
2b00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
2b10: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
2b20: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
2b30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2b40: 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61  z VALUES(NULL, a
2b50: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
2b60: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
2b70: 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41  ne;.        UPDA
2b80: 54 45 20 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c  TE z SET y = NUL
2b90: 4c 20 57 48 45 52 45 20 78 3e 32 35 36 3b 0a 20  L WHERE x>256;. 
2ba0: 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e         PRAGMA in
2bb0: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
2bc0: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
2bd0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a   count(*) FROM z
2be0: 20 57 48 45 52 45 20 78 20 3c 20 31 30 30 3b 0a   WHERE x < 100;.
2bf0: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
2c00: 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49  O one;.    COMMI
2c10: 54 3b 0a 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64  T;.  } {99}..  d
2c20: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
2c30: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a  ager1-3.$tn.3 {.
2c40: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2c50: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
2c60: 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20 7a          UPDATE z
2c70: 20 53 45 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20   SET y = y||x;. 
2c80: 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
2c90: 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   one;.    COMMIT
2ca0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
2cb0: 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20  nt(*) FROM z;.  
2cc0: 7d 20 7b 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78  } {258}..  do_ex
2cd0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
2ce0: 31 2d 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20  1-3.$tn.4 {.    
2cf0: 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20  SAVEPOINT one;. 
2d00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2d10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2d20: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
2d30: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  .  } {}.  do_exe
2d40: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
2d50: 2d 33 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53  -3.$tn.5 {.    S
2d60: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2d70: 52 4f 4d 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41  ROM z;.    RELEA
2d80: 53 45 20 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47  SE one;.    PRAG
2d90: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2da0: 63 6b 3b 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d  ck;.  } {258 ok}
2db0: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
2dc0: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e  est pager1-3.$tn
2dd0: 2e 36 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49  .6 {.    SAVEPOI
2de0: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45  NT one;.    RELE
2df0: 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a  ASE one;.  } {}.
2e00: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61  .  db close.  ca
2e10: 74 63 68 20 7b 20 74 76 20 64 65 6c 65 74 65 20  tch { tv delete 
2e20: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2e70: 23 20 48 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  # Hot journal ro
2e80: 6c 6c 62 61 63 6b 20 72 65 6c 61 74 65 64 20 74  llback related t
2e90: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70  est cases..#.# p
2ea0: 61 67 65 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73  ager1.4.1.*: Tes
2eb0: 74 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  t that the pager
2ec0: 20 6d 6f 64 75 6c 65 20 64 65 6c 65 74 65 73 20   module deletes 
2ed0: 76 65 72 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c  very small inval
2ee0: 69 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  id.#            
2ef0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73     journal files
2f00: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 32  ..#.# pager1.4.2
2f10: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66  .*: Test that if
2f20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2f30: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 74 20 74  nal pointer at t
2f40: 68 65 20 65 6e 64 20 6f 66 20 61 0a 23 20 20 20  he end of a.#   
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 74 2d              hot-
2f60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 70 70  journal file app
2f70: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
2f80: 70 74 20 28 63 68 65 63 6b 73 75 6d 20 64 6f 65  pt (checksum doe
2f90: 73 20 6e 6f 74 0a 23 20 20 20 20 20 20 20 20 20  s not.#         
2fa0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 29 20 74        compute) t
2fb0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f  he associated jo
2fc0: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
2fd0: 62 61 63 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20  back (and no.#  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 41 63               xAc
2ff0: 63 65 73 73 28 29 20 63 61 6c 6c 20 74 6f 20 63  cess() call to c
3000: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 70 72 65  heck for the pre
3010: 73 65 6e 63 65 20 6f 66 20 61 6e 79 20 6d 61 73  sence of any mas
3020: 74 65 72 20 0a 23 20 20 20 20 20 20 20 20 20 20  ter .#          
3030: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
3040: 65 20 69 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20  e is made)..#.# 
3050: 70 61 67 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65  pager1.4.3.*: Te
3060: 73 74 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  st that the cont
3070: 65 6e 74 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  ents of a hot-jo
3080: 75 72 6e 61 6c 20 61 72 65 20 69 67 6e 6f 72 65  urnal are ignore
3090: 64 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20  d if the.#      
30a0: 20 20 20 20 20 20 20 20 20 70 61 67 65 2d 73 69           page-si
30b0: 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a  ze or sector-siz
30c0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
30d0: 20 68 65 61 64 65 72 20 61 70 70 65 61 72 20 74   header appear t
30e0: 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  o.#             
30f0: 20 20 62 65 20 69 6e 76 61 6c 69 64 20 28 74 6f    be invalid (to
3100: 6f 20 6c 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61  o large, too sma
3110: 6c 6c 20 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65  ll or not a powe
3120: 72 20 6f 66 20 32 29 2e 0a 23 0a 23 20 70 61 67  r of 2)..#.# pag
3130: 65 72 31 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20  er1.4.4.*: Test 
3140: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3150: 62 61 63 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  back of journal 
3160: 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 73 74  file with a mast
3170: 65 72 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  er.#            
3180: 20 20 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74     journal point
3190: 65 72 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  er generated in 
31a0: 76 61 72 69 6f 75 73 20 22 50 52 41 47 4d 41 20  various "PRAGMA 
31b0: 73 79 6e 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20  synchronous".#  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64               mod
31d0: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34  es..#.# pager1.4
31e0: 2e 35 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .5.*: Test that 
31f0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3200: 62 61 63 6b 20 73 74 6f 70 73 20 69 66 20 69 74  back stops if it
3210: 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 0a 23 20   encounters a.# 
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
3230: 75 72 6e 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72  urnal-record for
3240: 20 77 68 69 63 68 20 74 68 65 20 63 68 65 63 6b   which the check
3250: 73 75 6d 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70  sum fails..#.# p
3260: 61 67 65 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73  ager1.4.6.*: Tes
3270: 74 20 74 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c  t that when roll
3280: 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
3290: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74  ournal that cont
32a0: 61 69 6e 73 20 61 0a 23 20 20 20 20 20 20 20 20  ains a.#        
32b0: 20 20 20 20 20 20 20 6d 61 73 74 65 72 20 6a 6f         master jo
32c0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74  urnal pointer, t
32d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
32e0: 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65  l file is delete
32f0: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
3300: 20 20 61 66 74 65 72 20 61 6c 6c 20 74 68 65 20    after all the 
3310: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61  hot-journals tha
3320: 74 20 72 65 66 65 72 20 74 6f 20 69 74 20 61 72  t refer to it ar
3330: 65 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70  e deleted..#.# p
3340: 61 67 65 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73  ager1.4.7.*: Tes
3350: 74 20 74 68 61 74 20 69 66 20 61 20 68 6f 74 2d  t that if a hot-
3360: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
3370: 73 74 73 20 62 75 74 20 61 20 63 6c 69 65 6e 74  sts but a client
3380: 20 63 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20   can.#          
3390: 20 20 20 20 20 6f 70 65 6e 20 69 74 20 66 6f 72       open it for
33a0: 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74   reading only, t
33b0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
33c0: 6f 74 20 62 65 20 61 63 63 65 73 73 65 64 20 61  ot be accessed a
33d0: 6e 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  nd.#            
33e0: 20 20 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50     SQLITE_CANTOP
33f0: 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EN is returned..
3400: 23 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  # .do_test pager
3410: 31 2e 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c  1.4.1.1 {.  faul
3420: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
3430: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
3440: 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54   { .    CREATE T
3450: 41 42 4c 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20  ABLE x(y, z);.  
3460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20    INSERT INTO x 
3470: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
3480: 7d 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  }.  set fd [open
3490: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34a0: 20 77 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65   w].  puts -none
34b0: 77 6c 69 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f  wline $fd "hello
34c0: 77 6f 72 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24  world".  close $
34d0: 66 64 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73  fd.  file exists
34e0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34f0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {1}.do_test p
3500: 61 67 65 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78  ager1.4.1.2 { ex
3510: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
3520: 20 46 52 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32   FROM x } } {1 2
3530: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
3540: 2e 34 2e 31 2e 33 20 7b 20 66 69 6c 65 20 65 78  .4.1.3 { file ex
3550: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
3560: 72 6e 61 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65  rnal } {0}..# Se
3570: 74 20 75 70 20 61 20 5b 74 65 73 74 76 66 73 5d  t up a [testvfs]
3580: 20 74 6f 20 73 6e 61 70 73 68 6f 74 20 74 68 65   to snapshot the
3590: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73   file-system jus
35a0: 74 20 62 65 66 6f 72 65 20 53 51 4c 69 74 65 0a  t before SQLite.
35b0: 23 20 64 65 6c 65 74 65 73 20 74 68 65 20 6d 61  # deletes the ma
35c0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20  ster-journal to 
35d0: 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66  commit a multi-f
35e0: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ile transaction.
35f0: 0a 23 0a 23 20 49 6e 20 73 75 62 73 65 71 75 65  .#.# In subseque
3600: 6e 74 20 74 65 73 74 20 63 61 73 65 73 2c 20 69  nt test cases, i
3610: 6e 76 6f 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69  nvoking [faultsi
3620: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3630: 6f 70 65 6e 5d 20 73 65 74 73 0a 23 20 75 70 20  open] sets.# up 
3640: 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
3650: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64  to contain two d
3660: 61 74 61 62 61 73 65 73 2c 20 74 77 6f 20 68 6f  atabases, two ho
3670: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t-journal files 
3680: 61 6e 64 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a  and.# a master-j
3690: 6f 75 72 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73  ournal..#.do_tes
36a0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b  t pager1.4.2.1 {
36b0: 0a 20 20 74 65 73 74 76 66 73 20 74 73 74 76 66  .  testvfs tstvf
36c0: 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74  s -default 1.  t
36d0: 73 74 76 66 73 20 66 69 6c 74 65 72 20 78 44 65  stvfs filter xDe
36e0: 6c 65 74 65 0a 20 20 74 73 74 76 66 73 20 73 63  lete.  tstvfs sc
36f0: 72 69 70 74 20 78 44 65 6c 65 74 65 43 61 6c 6c  ript xDeleteCall
3700: 62 61 63 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c  back.  proc xDel
3710: 65 74 65 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74  eteCallback {met
3720: 68 6f 64 20 66 69 6c 65 20 61 72 67 73 7d 20 7b  hod file args} {
3730: 0a 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b 66  .    set file [f
3740: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a  ile tail $file].
3750: 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67      if { [string
3760: 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c   match *mj* $fil
3770: 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f  e] } { faultsim_
3780: 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75  save }.  }.  fau
3790: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
37a0: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
37b0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
37c0: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
37d0: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
37e0: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
37f0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
3800: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
3810: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
3820: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3830: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e  .    PRAGMA aux.
3840: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3850: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3860: 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62  E t1(a UNIQUE, b
3870: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52   UNIQUE);.    CR
3880: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
3890: 32 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  2(a UNIQUE, b UN
38a0: 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52  IQUE);.    INSER
38b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
38c0: 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20  (a_string(200), 
38d0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a  a_string(300));.
38e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
38f0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3900: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3910: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3920: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3930: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3940: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3950: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3960: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3970: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
3980: 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   t1;.    BEGIN;.
3990: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
39a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
39b0: 72 69 6e 67 28 32 30 31 29 2c 20 61 5f 73 74 72  ring(201), a_str
39c0: 69 6e 67 28 33 30 31 29 20 46 52 4f 4d 20 74 31  ing(301) FROM t1
39d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
39e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
39f0: 73 74 72 69 6e 67 28 32 30 32 29 2c 20 61 5f 73  string(202), a_s
3a00: 74 72 69 6e 67 28 33 30 32 29 20 46 52 4f 4d 20  tring(302) FROM 
3a10: 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t1;.      INSERT
3a20: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3a30: 61 5f 73 74 72 69 6e 67 28 32 30 33 29 2c 20 61  a_string(203), a
3a40: 5f 73 74 72 69 6e 67 28 33 30 33 29 20 46 52 4f  _string(303) FRO
3a50: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
3a60: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
3a70: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 34 29 2c  T a_string(204),
3a80: 20 61 5f 73 74 72 69 6e 67 28 33 30 34 29 20 46   a_string(304) F
3a90: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 45  ROM t1;.      RE
3aa0: 50 4c 41 43 45 20 49 4e 54 4f 20 74 32 20 53 45  PLACE INTO t2 SE
3ab0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
3ac0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
3ad0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73 74    db close.  tst
3ae0: 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a  vfs delete.} {}.
3af0: 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74  .if {$::tcl_plat
3b00: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d  form(platform)!=
3b10: 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 64 6f 5f  "windows"} {.do_
3b20: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3b30: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
3b40: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3b50: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3b60: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3b70: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3b80: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3b90: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3ba0: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
3bb0: 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75  r1.4.2.3 {.  fau
3bc0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
3bd0: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
3be0: 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e  ch f [glob test.
3bf0: 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64  db-mj*] { forced
3c00: 65 6c 65 74 65 20 24 66 20 7d 0a 20 20 65 78 65  elete $f }.  exe
3c10: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3c20: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3c30: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3c40: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3c50: 20 20 7d 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f    }.} {64 ok}.do
3c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32  _test pager1.4.2
3c70: 2e 34 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .4 {.  faultsim_
3c80: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
3c90: 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  en.  hexio_write
3ca0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3cb0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
3cc0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
3cd0: 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20  l]-20] 123456.  
3ce0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3cf0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
3d00: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
3d10: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
3d20: 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a  k;.  }.} {4 ok}.
3d30: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
3d40: 2e 32 2e 35 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.5 {.  faultsi
3d50: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3d60: 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69  open.  hexio_wri
3d70: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
3d80: 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  al [expr [file s
3d90: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
3da0: 6e 61 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a  nal]-20] 123456.
3db0: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
3dc0: 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b  b test.db-mj*] {
3dd0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 66 20   forcedelete $f 
3de0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3df0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3e00: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3e10: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3e20: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3e30: 6f 6b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  ok}.}..do_test p
3e40: 61 67 65 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20  ager1.4.3.1 {.  
3e50: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3e60: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3e70: 66 73 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a  fs filter xSync.
3e80: 20 20 74 73 74 76 66 73 20 73 63 72 69 70 74 20    tstvfs script 
3e90: 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20  xSyncCallback.  
3ea0: 70 72 6f 63 20 78 53 79 6e 63 43 61 6c 6c 62 61  proc xSyncCallba
3eb0: 63 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20  ck {method file 
3ec0: 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20  args} {.    set 
3ed0: 66 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  file [file tail 
3ee0: 24 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20  $file].    if { 
3ef0: 30 3d 3d 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  0==[string match
3f00: 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d   *journal $file]
3f10: 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61   } { faultsim_sa
3f20: 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74  ve }.  }.  fault
3f30: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
3f40: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3f50: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
3f60: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
3f70: 54 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  TE;.    CREATE T
3f80: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
3f90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3fa0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
3fb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3fc0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
3fd0: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
3fe0: 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a    tstvfs delete.
3ff0: 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  } {}..foreach {t
4000: 6e 20 6f 66 73 74 20 76 61 6c 75 65 20 72 65 73  n ofst value res
4010: 75 6c 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ult} {.         
4020: 20 32 20 20 20 32 30 20 20 20 20 33 31 20 20 20   2   20    31   
4030: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
4040: 20 20 20 20 20 20 20 20 33 20 20 20 32 30 20 20          3   20  
4050: 20 20 33 32 20 20 20 20 20 20 20 7b 31 20 32 20    32       {1 2 
4060: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 34  3 4}.          4
4070: 20 20 20 32 30 20 20 20 20 33 33 20 20 20 20 20     20    33     
4080: 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20    {1 2 3 4}.    
4090: 20 20 20 20 20 20 35 20 20 20 32 30 20 20 20 20        5   20    
40a0: 36 35 35 33 36 20 20 20 20 7b 31 20 32 20 33 20  65536    {1 2 3 
40b0: 34 7d 0a 20 20 20 20 20 20 20 20 20 20 36 20 20  4}.          6  
40c0: 20 32 30 20 20 20 20 31 33 31 30 37 32 20 20 20   20    131072   
40d0: 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 20 20 20  {1 2 3 4}..     
40e0: 20 20 20 20 20 37 20 20 20 32 34 20 20 20 20 35       7   24    5
40f0: 31 31 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  11      {1 2 3 4
4100: 7d 0a 20 20 20 20 20 20 20 20 20 20 38 20 20 20  }.          8   
4110: 32 34 20 20 20 20 35 31 33 20 20 20 20 20 20 7b  24    513      {
4120: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4130: 20 20 20 39 20 20 20 32 34 20 20 20 20 31 33 31     9   24    131
4140: 30 37 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  072   {1 2 3 4}.
4150: 0a 20 20 20 20 20 20 20 20 20 31 30 20 20 20 33  .         10   3
4160: 32 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31  2    65536    {1
4170: 20 32 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   2}.} {.  do_tes
4180: 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e  t pager1.4.3.$tn
4190: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
41a0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
41b0: 65 6e 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69  en.    hexio_wri
41c0: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
41d0: 61 6c 20 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74  al $ofst [format
41e0: 20 25 2e 38 78 20 24 76 61 6c 75 65 5d 0a 20 20   %.8x $value].  
41f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
4200: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
4210: 20 7d 20 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20   } $result.}.db 
4220: 63 6c 6f 73 65 0a 0a 23 20 53 65 74 20 75 70 20  close..# Set up 
4230: 61 20 56 46 53 20 74 68 61 74 20 73 6e 61 70 73  a VFS that snaps
4240: 68 6f 74 73 20 74 68 65 20 66 69 6c 65 2d 73 79  hots the file-sy
4250: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
4260: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
4270: 6c 0a 23 20 66 69 6c 65 20 69 73 20 64 65 6c 65  l.# file is dele
4280: 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20  ted to commit a 
4290: 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
42a0: 61 63 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63  action. Specific
42b0: 61 6c 6c 79 2c 20 74 68 65 0a 23 20 66 69 6c 65  ally, the.# file
42c0: 2d 73 79 73 74 65 6d 20 69 73 20 73 61 76 65 64  -system is saved
42d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
42e0: 20 78 44 65 6c 65 74 65 28 29 20 63 61 6c 6c 20   xDelete() call 
42f0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 0a 23  to remove the .#
4300: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4310: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69  file from the fi
4320: 6c 65 2d 73 79 73 74 65 6d 2e 0a 23 0a 74 65 73  le-system..#.tes
4330: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
4340: 20 31 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70   1.tv script cop
4350: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73  y_on_mj_delete.s
4360: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
4370: 5f 6c 65 6e 67 74 68 20 30 0a 70 72 6f 63 20 63  _length 0.proc c
4380: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
4390: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
43a0: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
43b0: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d  [string match *m
43c0: 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  j* [file tail $f
43d0: 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20  ilename]]} { .  
43e0: 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e    set ::mj_filen
43f0: 61 6d 65 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69  ame_length [stri
4400: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e  ng length $filen
4410: 61 6d 65 5d 0a 20 20 20 20 66 61 75 6c 74 73 69  ame].    faultsi
4420: 6d 5f 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65  m_save .  }.  re
4430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
4440: 0a 0a 73 65 74 20 70 77 64 20 5b 67 65 74 5f 70  ..set pwd [get_p
4450: 77 64 5d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 31  wd].foreach {tn1
4460: 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b 20 73 65   tcl} {.  1 { se
4470: 74 20 70 72 65 66 69 78 20 22 74 65 73 74 2e 64  t prefix "test.d
4480: 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20 20 20 20  b" }.  2 { .    
4490: 23 20 54 68 69 73 20 74 65 73 74 20 64 65 70 65  # This test depe
44a0: 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e 64 65 72  nds on the under
44b0: 6c 79 69 6e 67 20 56 46 53 20 62 65 69 6e 67 20  lying VFS being 
44c0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 70 61 74  able to open pat
44d0: 68 73 0a 20 20 20 20 23 20 35 31 32 20 62 79 74  hs.    # 512 byt
44e0: 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
44f0: 65 20 69 64 65 61 20 69 73 20 74 6f 20 63 72 65  e idea is to cre
4500: 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ate a hot-journa
4510: 6c 20 66 69 6c 65 20 74 68 61 74 0a 20 20 20 20  l file that.    
4520: 23 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  # contains a mas
4530: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
4540: 74 65 72 20 73 6f 20 6c 61 72 67 65 20 74 68 61  ter so large tha
4550: 74 20 69 74 20 63 6f 75 6c 64 20 63 6f 6e 74 61  t it could conta
4560: 69 6e 0a 20 20 20 20 23 20 61 20 76 61 6c 69 64  in.    # a valid
4570: 20 70 61 67 65 20 72 65 63 6f 72 64 20 28 69 66   page record (if
4580: 20 74 68 65 20 66 69 6c 65 20 70 61 67 65 2d 73   the file page-s
4590: 69 7a 65 20 69 73 20 35 31 32 20 62 79 74 65 73  ize is 512 bytes
45a0: 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20 20 20 20  ). So as to.    
45b0: 23 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  # make sure SQLi
45c0: 74 65 20 64 6f 65 73 6e 27 74 20 67 65 74 20 63  te doesn't get c
45d0: 6f 6e 66 75 73 65 64 20 62 79 20 74 68 69 73 2e  onfused by this.
45e0: 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20 6e  .    #.    set n
45f0: 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20 35 31  Padding [expr 51
4600: 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  1 - $::mj_filena
4610: 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20 20 20 69  me_length].    i
4620: 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  f {$tcl_platform
4630: 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 77 69 6e  (platform)=="win
4640: 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20 20 20 23  dows"} {.      #
4650: 20 54 42 44 20 6e 65 65 64 20 74 6f 20 66 69 67   TBD need to fig
4660: 75 72 65 20 6f 75 74 20 68 6f 77 20 74 6f 20 64  ure out how to d
4670: 6f 20 74 68 69 73 20 63 6f 72 72 65 63 74 6c 79  o this correctly
4680: 20 66 6f 72 20 57 69 6e 64 6f 77 73 21 21 21 0a   for Windows!!!.
4690: 20 20 20 20 20 20 73 65 74 20 6e 50 61 64 64 69        set nPaddi
46a0: 6e 67 20 5b 65 78 70 72 20 32 35 35 20 2d 20 24  ng [expr 255 - $
46b0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65  ::mj_filename_le
46c0: 6e 67 74 68 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  ngth].    }..   
46d0: 20 23 20 57 65 20 63 61 6e 6e 6f 74 20 6a 75 73   # We cannot jus
46e0: 74 20 63 72 65 61 74 65 20 61 20 72 65 61 6c 6c  t create a reall
46f0: 79 20 6c 6f 6e 67 20 64 61 74 61 62 61 73 65 20  y long database 
4700: 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f 70 65  file name to ope
4710: 6e 2c 20 61 73 0a 20 20 20 20 23 20 4c 69 6e 75  n, as.    # Linu
4720: 78 20 6c 69 6d 69 74 73 20 61 20 73 69 6e 67 6c  x limits a singl
4730: 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 61  e component of a
4740: 20 70 61 74 68 20 74 6f 20 32 35 35 20 62 79 74   path to 255 byt
4750: 65 73 20 62 79 20 64 65 66 61 75 6c 74 0a 20 20  es by default.  
4760: 20 20 23 20 28 61 6e 64 20 70 72 65 73 75 6d 61    # (and presuma
4770: 62 6c 79 20 6f 74 68 65 72 20 73 79 73 74 65 6d  bly other system
4780: 73 20 68 61 76 65 20 6c 69 6d 69 74 73 20 74 6f  s have limits to
4790: 6f 29 2e 20 53 6f 20 63 72 65 61 74 65 20 61 20  o). So create a 
47a0: 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 23 20  directory.    # 
47b0: 68 69 65 72 61 72 63 68 79 20 74 6f 20 77 6f 72  hierarchy to wor
47c0: 6b 20 69 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20  k in..    #.    
47d0: 73 65 74 20 64 69 72 6e 61 6d 65 20 22 64 31 32  set dirname "d12
47e0: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
47f0: 39 30 31 32 33 34 35 36 37 38 39 30 2f 22 0a 20  901234567890/". 
4800: 20 20 20 73 65 74 20 6e 44 69 72 20 5b 65 78 70     set nDir [exp
4810: 72 20 24 6e 50 61 64 64 69 6e 67 20 2f 20 33 32  r $nPadding / 32
4820: 5d 0a 20 20 20 20 69 66 20 7b 20 24 6e 44 69 72  ].    if { $nDir
4830: 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 70   } {.      set p
4840: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
4850: 24 64 69 72 6e 61 6d 65 20 24 6e 44 69 72 5d 0a  $dirname $nDir].
4860: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
4870: 20 24 70 0a 20 20 20 20 20 20 63 64 20 24 70 0a   $p.      cd $p.
4880: 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 70      }..    set p
4890: 61 64 64 69 6e 67 20 5b 73 74 72 69 6e 67 20 72  adding [string r
48a0: 65 70 65 61 74 20 78 20 5b 65 78 70 72 20 24 6e  epeat x [expr $n
48b0: 50 61 64 64 69 6e 67 20 25 33 32 5d 5d 0a 20 20  Padding %32]].  
48c0: 20 20 73 65 74 20 70 72 65 66 69 78 20 22 74 65    set prefix "te
48d0: 73 74 2e 64 62 24 7b 70 61 64 64 69 6e 67 7d 22  st.db${padding}"
48e0: 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 76 61 6c 20  .  }.} {.  eval 
48f0: 24 74 63 6c 0a 20 20 66 6f 72 65 61 63 68 20 7b  $tcl.  foreach {
4900: 74 6e 32 20 73 71 6c 7d 20 7b 0a 20 20 20 20 6f  tn2 sql} {.    o
4910: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
4920: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
4930: 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  s=OFF;.      PRA
4940: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
4950: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  ous=OFF;.      P
4960: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4970: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4980: 20 7d 0a 20 20 20 20 6f 35 31 32 20 7b 20 0a 20   }.    o512 { . 
4990: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
49a0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46  .synchronous=OFF
49b0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
49c0: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  ux.synchronous=O
49d0: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
49e0: 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 20   main.page_size 
49f0: 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50 52 41  = 512;.      PRA
4a00: 47 4d 41 20 61 75 78 2e 70 61 67 65 5f 73 69 7a  GMA aux.page_siz
4a10: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50  e = 512;.      P
4a20: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4a30: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4a40: 20 7d 0a 20 20 20 20 6e 20 7b 20 0a 20 20 20 20   }.    n { .    
4a50: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
4a60: 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
4a70: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
4a80: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  ux.synchronous=N
4a90: 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41  ORMAL;.      PRA
4aa0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
4ab0: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d   = DELETE;.    }
4ac0: 0a 20 20 20 20 66 20 7b 20 0a 20 20 20 20 20 20  .    f { .      
4ad0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63  PRAGMA main.sync
4ae0: 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20  hronous=FULL;.  
4af0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
4b00: 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b  ynchronous=FULL;
4b10: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
4b20: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
4b30: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  ETE;.    }.  } {
4b40: 0a 0a 20 20 20 20 73 65 74 20 74 6e 20 22 24 7b  ..    set tn "${
4b50: 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a 20 20 0a  tn1}.${tn2}".  .
4b60: 20 20 20 20 23 20 53 65 74 20 75 70 20 61 20 63      # Set up a c
4b70: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 68 61 76  onnection to hav
4b80: 65 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c  e two databases,
4b90: 20 74 65 73 74 2e 64 62 20 28 6d 61 69 6e 29 20   test.db (main) 
4ba0: 61 6e 64 20 0a 20 20 20 20 23 20 74 65 73 74 2e  and .    # test.
4bb0: 64 62 32 20 28 61 75 78 29 2e 20 54 68 65 6e 20  db2 (aux). Then 
4bc0: 72 75 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  run a multi-file
4bd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
4be0: 74 68 65 6d 2e 20 54 68 65 0a 20 20 20 20 23 20  them. The.    # 
4bf0: 56 46 53 20 77 69 6c 6c 20 73 6e 61 70 73 68 6f  VFS will snapsho
4c00: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
4c10: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  m just before th
4c20: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
4c30: 0a 20 20 20 20 23 20 66 69 6c 65 20 69 73 20 64  .    # file is d
4c40: 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74  eleted to commit
4c50: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4c60: 2e 0a 20 20 20 20 23 0a 20 20 20 20 74 76 20 66  ..    #.    tv f
4c70: 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20  ilter xDelete.  
4c80: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
4c90: 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  -4.4.$tn.1 {.   
4ca0: 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65     faultsim_dele
4cb0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70  te_and_reopen $p
4cc0: 72 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63  refix.      exec
4cd0: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 41 54  sql ".        AT
4ce0: 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32  TACH '${prefix}2
4cf0: 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20  ' AS aux;.      
4d00: 20 20 24 73 71 6c 0a 20 20 20 20 20 20 20 20 43    $sql.        C
4d10: 52 45 41 54 45 20 54 41 42 4c 45 20 61 28 78 29  REATE TABLE a(x)
4d20: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
4d30: 20 54 41 42 4c 45 20 61 75 78 2e 62 28 78 29 3b   TABLE aux.b(x);
4d40: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4d50: 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 64  INTO a VALUES('d
4d60: 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a 20 20 20  ouble-you');.   
4d70: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4d80: 20 61 20 56 41 4c 55 45 53 28 27 77 68 79 27 29   a VALUES('why')
4d90: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
4da0: 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27   INTO a VALUES('
4db0: 7a 65 64 27 29 3b 0a 20 20 20 20 20 20 20 20 49  zed');.        I
4dc0: 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c  NSERT INTO b VAL
4dd0: 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20 20 20 20  UES('won');.    
4de0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4df0: 62 20 56 41 4c 55 45 53 28 27 74 6f 6f 27 29 3b  b VALUES('too');
4e00: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4e10: 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 66  INTO b VALUES('f
4e20: 72 65 65 27 29 3b 0a 20 20 20 20 20 20 22 0a 20  ree');.      ". 
4e30: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20       execsql {. 
4e40: 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20         BEGIN;.  
4e50: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4e60: 4e 54 4f 20 61 20 53 45 4c 45 43 54 20 2a 20 46  NTO a SELECT * F
4e70: 52 4f 4d 20 62 20 57 48 45 52 45 20 72 6f 77 69  ROM b WHERE rowi
4e80: 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 20 20  d<=3;.          
4e90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 53 45  INSERT INTO b SE
4ea0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 20 57 48  LECT * FROM a WH
4eb0: 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20  ERE rowid<=3;.  
4ec0: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
4ed0: 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20      }.    } {}. 
4ee0: 20 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a     tv filter {}.
4ef0: 20 20 20 20 0a 20 20 20 20 23 20 43 68 65 63 6b      .    # Check
4f00: 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
4f10: 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
4f20: 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ted successfully
4f30: 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 65  ..    #.    do_e
4f40: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
4f50: 72 31 2d 34 2e 34 2e 24 74 6e 2e 32 20 7b 0a 20  r1-4.4.$tn.2 {. 
4f60: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
4f70: 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62  OM a.    } {doub
4f80: 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77  le-you why zed w
4f90: 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20  on too free}.   
4fa0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
4fb0: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
4fc0: 33 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  3 {.      SELECT
4fd0: 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20   * FROM b.    } 
4fe0: 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f  {won too free do
4ff0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
5000: 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52 65 73  }.    .    # Res
5010: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
5020: 73 74 65 6d 20 61 6e 64 20 72 65 6f 70 65 6e 20  stem and reopen 
5030: 74 68 65 20 64 61 74 61 62 61 73 65 73 2e 20 43  the databases. C
5040: 68 65 63 6b 20 74 68 61 74 20 69 74 20 6e 6f 77  heck that it now
5050: 0a 20 20 20 20 23 20 61 70 70 65 61 72 73 20 74  .    # appears t
5060: 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
5070: 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d  ion was not comm
5080: 69 74 74 65 64 20 28 62 65 63 61 75 73 65 20 74  itted (because t
5090: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 20  he file-system. 
50a0: 20 20 20 23 20 77 61 73 20 72 65 73 74 6f 72 65     # was restore
50b0: 64 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 77  d to the state w
50c0: 68 65 72 65 20 69 74 20 68 61 64 20 6e 6f 74 20  here it had not 
50d0: 62 65 65 6e 29 2e 0a 20 20 20 20 23 0a 20 20 20  been)..    #.   
50e0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
50f0: 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20  4.4.$tn.4 {.    
5100: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
5110: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70  re_and_reopen $p
5120: 72 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63  refix.      exec
5130: 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70  sql "ATTACH '${p
5140: 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22  refix}2' AS aux"
5150: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
5160: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5170: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35 20 7b  ger1-4.4.$tn.5 {
5180: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 7d  SELECT * FROM a}
5190: 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79   {double-you why
51a0: 20 7a 65 64 7d 0a 20 20 20 20 64 6f 5f 65 78 65   zed}.    do_exe
51b0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
51c0: 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45 4c 45  -4.4.$tn.6 {SELE
51d0: 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b 77 6f  CT * FROM b} {wo
51e0: 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20  n too free}.    
51f0: 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74  .    # Restore t
5200: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61  he file-system a
5210: 67 61 69 6e 2e 20 54 68 69 73 20 74 69 6d 65 2c  gain. This time,
5220: 20 62 65 66 6f 72 65 20 72 65 6f 70 65 6e 69 6e   before reopenin
5230: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2c  g the databases,
5240: 0a 20 20 20 20 23 20 64 65 6c 65 74 65 20 74 68  .    # delete th
5250: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
5260: 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66   file from the f
5270: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 49 74 20 6e  ile-system. It n
5280: 6f 77 20 61 70 70 65 61 72 73 20 74 68 61 74 0a  ow appears that.
5290: 20 20 20 20 23 20 74 68 65 20 74 72 61 6e 73 61      # the transa
52a0: 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
52b0: 74 65 64 20 28 6e 6f 20 6d 61 73 74 65 72 2d 6a  ted (no master-j
52c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 3d 3d 20 6e  ournal file == n
52d0: 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 20  o rollback)..   
52e0: 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70   #.    do_test p
52f0: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 37 20  ager1-4.4.$tn.7 
5300: 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d  {.      faultsim
5310: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5320: 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20  pen $prefix.    
5330: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
5340: 62 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a 2a 5d  b ${prefix}-mj*]
5350: 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24   { forcedelete $
5360: 66 20 7d 0a 20 20 20 20 20 20 65 78 65 63 73 71  f }.      execsq
5370: 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70 72 65  l "ATTACH '${pre
5380: 66 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a 20  fix}2' AS aux". 
5390: 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f 65     } {}.    do_e
53a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
53b0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b 0a 20  r1-4.4.$tn.8 {. 
53c0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
53d0: 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62  OM a.    } {doub
53e0: 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77  le-you why zed w
53f0: 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20  on too free}.   
5400: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
5410: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5420: 39 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  9 {.      SELECT
5430: 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20   * FROM b.    } 
5440: 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f  {won too free do
5450: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
5460: 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70 77 64  }.  }..  cd $pwd
5470: 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  .}.db close.tv d
5480: 65 6c 65 74 65 0a 66 6f 72 63 65 64 65 6c 65 74  elete.forcedelet
5490: 65 20 24 64 69 72 6e 61 6d 65 0a 0a 0a 23 20 53  e $dirname...# S
54a0: 65 74 20 75 70 20 61 20 56 46 53 20 74 6f 20 6d  et up a VFS to m
54b0: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
54c0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75  e file-system ju
54d0: 73 74 20 62 65 66 6f 72 65 20 64 65 6c 65 74 69  st before deleti
54e0: 6e 67 20 61 0a 23 20 6a 6f 75 72 6e 61 6c 20 66  ng a.# journal f
54f0: 69 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20  ile to commit a 
5500: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
5510: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 6f 64   transaction mod
5520: 69 66 69 65 73 20 65 78 61 63 74 6c 79 0a 23 20  ifies exactly.# 
5530: 74 77 6f 20 64 61 74 61 62 61 73 65 20 70 61 67  two database pag
5540: 65 73 20 28 61 6e 64 20 70 61 67 65 20 31 20 2d  es (and page 1 -
5550: 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
5560: 74 65 72 29 2e 0a 23 0a 74 65 73 74 76 66 73 20  ter)..#.testvfs 
5570: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76  tv -default 1.tv
5580: 20 73 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a   sectorsize 512.
5590: 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f  tv script copy_o
55a0: 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65  n_journal_delete
55b0: 0a 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65  .tv filter xDele
55c0: 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f  te.proc copy_on_
55d0: 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b  journal_delete {
55e0: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
55f0: 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73  args} {.  if {[s
5600: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75  tring match *jou
5610: 72 6e 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d  rnal $filename]}
5620: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a   faultsim_save .
5630: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5640: 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65  OK.}.faultsim_de
5650: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
5660: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5670: 70 61 67 65 72 31 2e 34 2e 35 2e 31 20 7b 0a 20  pager1.4.5.1 {. 
5680: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
5690: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
56a0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
56b0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 43 52 45 41  e = 1024;.  CREA
56c0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
56d0: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
56e0: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 49 4e  E t2(a, b);.  IN
56f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5700: 55 45 53 28 27 49 27 2c 20 27 49 49 27 29 3b 0a  UES('I', 'II');.
5710: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
5720: 20 56 41 4c 55 45 53 28 27 49 49 49 27 2c 20 27   VALUES('III', '
5730: 49 56 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  IV');.  BEGIN;. 
5740: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5750: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
5760: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5770: 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t2 VALUES(3, 4);
5780: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65  .  COMMIT;.} {de
5790: 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65 72 20  lete}.tv filter 
57a0: 7b 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68 65 20  {}..# Check the 
57b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
57c0: 63 6f 6d 6d 69 74 74 65 64 3a 0a 23 0a 64 6f 5f  committed:.#.do_
57d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
57e0: 65 72 31 2e 34 2e 35 2e 32 20 7b 0a 20 20 53 45  er1.4.5.2 {.  SE
57f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
5800: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5810: 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 20  t2;.} {I II 1 2 
5820: 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 23 20 4e  III IV 3 4}..# N
5830: 6f 77 20 74 72 79 20 66 6f 75 72 20 74 65 73 74  ow try four test
5840: 73 3a 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34  s:.#.#  pager1-4
5850: 2e 35 2e 33 3a 20 52 65 73 74 6f 72 65 20 74 68  .5.3: Restore th
5860: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43  e file-system. C
5870: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 77 68  heck that the wh
5880: 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ole transaction 
5890: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
58a0: 20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b    is rolled back
58b0: 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e  ..#.#  pager1-4.
58c0: 35 2e 34 3a 20 52 65 73 74 6f 72 65 20 74 68 65  5.4: Restore the
58d0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f   file-system. Co
58e0: 72 72 75 70 74 20 74 68 65 20 66 69 72 73 74 20  rrupt the first 
58f0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 0a 23 20  record in the.# 
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
5910: 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74 68  ournal. Check th
5920: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
5930: 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b   not rolled back
5940: 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e  ..#.#  pager1-4.
5950: 35 2e 35 3a 20 52 65 73 74 6f 72 65 20 74 68 65  5.5: Restore the
5960: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f   file-system. Co
5970: 72 72 75 70 74 20 74 68 65 20 73 65 63 6f 6e 64  rrupt the second
5980: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 0a 23   record in the.#
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74  journal. Check t
59b0: 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 65  hat the first re
59c0: 63 6f 72 64 20 69 6e 20 74 68 65 20 74 72 61 6e  cord in the tran
59d0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 20 20  saction is .#   
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 61               pla
59f0: 79 65 64 20 62 61 63 6b 2c 20 62 75 74 20 6e 6f  yed back, but no
5a00: 74 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 23 0a  t the second..#.
5a10: 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e 36 3a  #  pager1-4.5.6:
5a20: 20 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c   Restore the fil
5a30: 65 2d 73 79 73 74 65 6d 2e 20 54 72 79 20 74 6f  e-system. Try to
5a40: 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
5a50: 73 65 20 77 69 74 68 20 61 0a 23 20 20 20 20 20  se with a.#     
5a60: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 6f             reado
5a70: 6e 6c 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  nly connection. 
5a80: 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c  This should fail
5a90: 2c 20 61 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  , as a read-only
5aa0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5ab0: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e    connection can
5ac0: 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68  not roll back th
5ad0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5ae0: 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .#.faultsim_rest
5af0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ore_and_reopen.d
5b00: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5b10: 61 67 65 72 31 2e 34 2e 35 2e 33 20 7b 0a 20 20  ager1.4.5.3 {.  
5b20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5b30: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5b40: 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49 49  M t2;.} {I II II
5b50: 49 20 49 56 7d 0a 66 61 75 6c 74 73 69 6d 5f 72  I IV}.faultsim_r
5b60: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
5b70: 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65  n.hexio_write te
5b80: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
5b90: 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34 20 2d  xpr 512+4+1024 -
5ba0: 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39   202] 0123456789
5bb0: 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71  ABCDEF.do_execsq
5bc0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5bd0: 35 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.4 {.  SELECT *
5be0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5bf0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5c00: 7b 49 20 49 49 20 31 20 32 20 49 49 49 20 49 56  {I II 1 2 III IV
5c10: 20 33 20 34 7d 0a 66 61 75 6c 74 73 69 6d 5f 72   3 4}.faultsim_r
5c20: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
5c30: 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65  n.hexio_write te
5c40: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
5c50: 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34 2b 34  xpr 512+4+1024+4
5c60: 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30  +4+1024 - 202] 0
5c70: 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0a  123456789ABCDEF.
5c80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5c90: 70 61 67 65 72 31 2e 34 2e 35 2e 35 20 7b 0a 20  pager1.4.5.5 {. 
5ca0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5cb0: 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  1;.  SELECT * FR
5cc0: 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49  OM t2;.} {I II I
5cd0: 49 49 20 49 56 20 33 20 34 7d 0a 0a 66 61 75 6c  II IV 3 4}..faul
5ce0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5cf0: 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65  _reopen.db close
5d00: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
5d10: 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a  .db -readonly 1.
5d20: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
5d30: 20 70 61 67 65 72 31 2e 34 2e 35 2e 36 20 7b 0a   pager1.4.5.6 {.
5d40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5d50: 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  t1;.  SELECT * F
5d60: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b 64 69  ROM t2;.} {1 {di
5d70: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 64  sk I/O error}}.d
5d80: 62 20 63 6c 6f 73 65 0a 0a 23 20 53 6e 61 70 73  b close..# Snaps
5d90: 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hot the file-sys
5da0: 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20  tem just before 
5db0: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
5dc0: 74 2e 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65  t. Save the name
5dd0: 0a 23 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  .# of the master
5de0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
5df0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e   $::mj_filename.
5e00: 0a 23 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70  .#.tv script cop
5e10: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 74  y_on_mj_delete.t
5e20: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
5e30: 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a  .proc copy_on_mj
5e40: 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20  _delete {method 
5e50: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
5e60: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  .  if {[string m
5e70: 61 74 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20  atch *mj* [file 
5e80: 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d  tail $filename]]
5e90: 7d 20 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d  } { .    set ::m
5ea0: 6a 5f 66 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65  j_filename $file
5eb0: 6e 61 6d 65 0a 20 20 20 20 66 61 75 6c 74 73 69  name.    faultsi
5ec0: 6d 5f 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65  m_save .  }.  re
5ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
5ee0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
5ef0: 34 2e 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  4.6.1 {.  faults
5f00: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
5f10: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
5f20: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
5f30: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
5f40: 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74  E;.    ATTACH 't
5f50: 65 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b  est.db2' AS two;
5f60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5f70: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
5f80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f  CREATE TABLE two
5f90: 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49  .t2(a, b);.    I
5fa0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
5fb0: 4c 55 45 53 28 31 2c 20 27 74 31 2e 31 27 29 3b  LUES(1, 't1.1');
5fc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5fd0: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 27 74   t2 VALUES(1, 't
5fe0: 32 2e 31 27 29 3b 0a 20 20 20 20 42 45 47 49 4e  2.1');.    BEGIN
5ff0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
6000: 31 20 53 45 54 20 62 20 3d 20 27 74 31 2e 32 27  1 SET b = 't1.2'
6010: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
6020: 32 20 53 45 54 20 62 20 3d 20 27 74 32 2e 32 27  2 SET b = 't2.2'
6030: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
6040: 7d 0a 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d  }.  tv filter {}
6050: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d  .  db close.} {}
6060: 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f  ..faultsim_resto
6070: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  re_and_reopen.do
6080: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
6090: 67 65 72 31 2e 34 2e 36 2e 32 20 7b 20 53 45 4c  ger1.4.6.2 { SEL
60a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
60b0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 74 31 2e            {1 t1.
60c0: 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20  1}.do_test      
60d0: 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 33 20     pager1.4.6.3 
60e0: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
60f0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b  :mj_filename } {
6100: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
6110: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 34 20  st pager1.4.6.4 
6120: 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74  {.  ATTACH 'test
6130: 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20  .db2' AS two;.  
6140: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
6150: 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f  ;.} {1 t2.1}.do_
6160: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6170: 35 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  5 { file exists 
6180: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d  $::mj_filename }
6190: 20 7b 30 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72   {0}..faultsim_r
61a0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
61b0: 6e 0a 64 62 20 63 6c 6f 73 65 0a 64 6f 5f 74 65  n.db close.do_te
61c0: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 38 20  st pager1.4.6.8 
61d0: 7b 0a 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c  {.  set ::mj_fil
61e0: 65 6e 61 6d 65 31 20 24 3a 3a 6d 6a 5f 66 69 6c  ename1 $::mj_fil
61f0: 65 6e 61 6d 65 0a 20 20 74 76 20 66 69 6c 74 65  ename.  tv filte
6200: 72 20 78 44 65 6c 65 74 65 0a 20 20 73 71 6c 69  r xDelete.  sqli
6210: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 32 0a  te3 db test.db2.
6220: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6230: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
6240: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
6250: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
6260: 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20  b3' AS three;.  
6270: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
6280: 68 72 65 65 2e 74 33 28 61 2c 20 62 29 3b 0a 20  hree.t3(a, b);. 
6290: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
62a0: 33 20 56 41 4c 55 45 53 28 31 2c 20 27 74 33 2e  3 VALUES(1, 't3.
62b0: 31 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  1');.    BEGIN;.
62c0: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 32 20        UPDATE t2 
62d0: 53 45 54 20 62 20 3d 20 27 74 32 2e 33 27 3b 0a  SET b = 't2.3';.
62e0: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 33 20        UPDATE t3 
62f0: 53 45 54 20 62 20 3d 20 27 74 33 2e 33 27 3b 0a  SET b = 't3.3';.
6300: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
6310: 20 20 65 78 70 72 20 7b 24 3a 3a 6d 6a 5f 66 69    expr {$::mj_fi
6320: 6c 65 6e 61 6d 65 31 20 21 3d 20 24 3a 3a 6d 6a  lename1 != $::mj
6330: 5f 66 69 6c 65 6e 61 6d 65 7d 0a 7d 20 7b 31 7d  _filename}.} {1}
6340: 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72  .faultsim_restor
6350: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 74 76 20  e_and_reopen.tv 
6360: 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 54 68 65  filter {}..# The
6370: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6e 6f 77   file-system now
6380: 20 63 6f 6e 74 61 69 6e 73 3a 0a 23 0a 23 20 20   contains:.#.#  
6390: 20 2a 20 74 68 72 65 65 20 64 61 74 61 62 61 73   * three databas
63a0: 65 73 0a 23 20 20 20 2a 20 74 68 72 65 65 20 68  es.#   * three h
63b0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ot-journal files
63c0: 0a 23 20 20 20 2a 20 74 77 6f 20 6d 61 73 74 65  .#   * two maste
63d0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r-journal files.
63e0: 0a 23 0a 23 20 54 68 65 20 68 6f 74 2d 6a 6f 75  .#.# The hot-jou
63f0: 72 6e 61 6c 73 20 61 73 73 6f 63 69 61 74 65 64  rnals associated
6400: 20 77 69 74 68 20 74 65 73 74 2e 64 62 32 20 61   with test.db2 a
6410: 6e 64 20 74 65 73 74 2e 64 62 33 20 70 6f 69 6e  nd test.db3 poin
6420: 74 20 74 6f 0a 23 20 6d 61 73 74 65 72 20 6a 6f  t to.# master jo
6430: 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65  urnal $::mj_file
6440: 6e 61 6d 65 2e 20 54 68 65 20 68 6f 74 2d 6a 6f  name. The hot-jo
6450: 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f 63  urnal file assoc
6460: 69 61 74 65 64 20 77 69 74 68 0a 23 20 74 65 73  iated with.# tes
6470: 74 2e 64 62 20 70 6f 69 6e 74 73 20 74 6f 20 6d  t.db points to m
6480: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a  aster journal $:
6490: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 20 53  :mj_filename1. S
64a0: 6f 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 0a 23  o reading from.#
64b0: 20 74 65 73 74 2e 64 62 20 73 68 6f 75 6c 64 20   test.db should 
64c0: 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c  delete $::mj_fil
64d0: 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73  ename1..#.do_tes
64e0: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 39 20 7b  t pager1.4.6.9 {
64f0: 0a 20 20 6c 73 6f 72 74 20 5b 67 6c 6f 62 20 74  .  lsort [glob t
6500: 65 73 74 2e 64 62 2a 5d 0a 7d 20 5b 6c 73 6f 72  est.db*].} [lsor
6510: 74 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20  t [list         
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6540: 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 20 74 65    \.  test.db te
6550: 73 74 2e 64 62 32 20 74 65 73 74 2e 64 62 33 20  st.db2 test.db3 
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
6580: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
6590: 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61   test.db2-journa
65a0: 6c 20 74 65 73 74 2e 64 62 33 2d 6a 6f 75 72 6e  l test.db3-journ
65b0: 61 6c 20 20 20 20 20 20 5c 0a 20 20 5b 66 69 6c  al      \.  [fil
65c0: 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c  e tail $::mj_fil
65d0: 65 6e 61 6d 65 5d 20 5b 66 69 6c 65 20 74 61 69  ename] [file tai
65e0: 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  l $::mj_filename
65f0: 31 5d 0a 5d 5d 0a 0a 23 20 54 68 65 20 6d 61 73  1].]]..# The mas
6600: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d  ter-journal $::m
6610: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 63 6f 6e 74  j_filename1 cont
6620: 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
6630: 20 74 65 73 74 2e 64 62 20 61 6e 64 20 0a 23 20   test.db and .# 
6640: 74 65 73 74 2e 64 62 32 2e 20 48 6f 77 65 76 65  test.db2. Howeve
6650: 72 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  r the hot-journa
6660: 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  l associated wit
6670: 68 20 74 65 73 74 2e 64 62 32 20 70 6f 69 6e 74  h test.db2 point
6680: 73 20 74 6f 0a 23 20 61 20 64 69 66 66 65 72 65  s to.# a differe
6690: 6e 74 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  nt master-journa
66a0: 6c 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 72 65  l. Therefore, re
66b0: 61 64 69 6e 67 20 66 72 6f 6d 20 74 65 73 74 2e  ading from test.
66c0: 64 62 20 6f 6e 6c 79 20 73 68 6f 75 6c 64 0a 23  db only should.#
66d0: 20 62 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 61   be enough to ca
66e0: 75 73 65 20 53 51 4c 69 74 65 20 74 6f 20 64 65  use SQLite to de
66f0: 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  lete $::mj_filen
6700: 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ame1..#.do_test 
6710: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
6720: 2e 36 2e 31 30 20 7b 20 66 69 6c 65 20 65 78 69  .6.10 { file exi
6730: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6740: 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  me  } {1}.do_tes
6750: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
6760: 2e 34 2e 36 2e 31 31 20 7b 20 66 69 6c 65 20 65  .4.6.11 { file e
6770: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6780: 6e 61 6d 65 31 20 7d 20 7b 31 7d 0a 64 6f 5f 65  name1 } {1}.do_e
6790: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
67a0: 72 31 2e 34 2e 36 2e 31 32 20 7b 20 53 45 4c 45  r1.4.6.12 { SELE
67b0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b  CT * FROM t1 } {
67c0: 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20  1 t1.1}.do_test 
67d0: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
67e0: 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69  .6.13 { file exi
67f0: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6800: 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  me  } {1}.do_tes
6810: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
6820: 2e 34 2e 36 2e 31 34 20 7b 20 66 69 6c 65 20 65  .4.6.14 { file e
6830: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6840: 6e 61 6d 65 31 20 7d 20 7b 30 7d 0a 0a 64 6f 5f  name1 } {0}..do_
6850: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
6860: 65 72 31 2e 34 2e 36 2e 31 32 20 7b 0a 20 20 41  er1.4.6.12 {.  A
6870: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
6880: 20 41 53 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43   AS two;.  SELEC
6890: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
68a0: 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20  1 t2.1}.do_test 
68b0: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
68c0: 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69  .6.13 { file exi
68d0: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
68e0: 6d 65 20 7d 20 20 7b 31 7d 0a 64 6f 5f 65 78 65  me }  {1}.do_exe
68f0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
6900: 2e 34 2e 36 2e 31 34 20 7b 0a 20 20 41 54 54 41  .4.6.14 {.  ATTA
6910: 43 48 20 27 74 65 73 74 2e 64 62 33 27 20 41 53  CH 'test.db3' AS
6920: 20 74 68 72 65 65 3b 0a 20 20 53 45 4c 45 43 54   three;.  SELECT
6930: 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 31   * FROM t3;.} {1
6940: 20 74 33 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20   t3.1}.do_test  
6950: 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e         pager1.4.
6960: 36 2e 31 35 20 7b 20 66 69 6c 65 20 65 78 69 73  6.15 { file exis
6970: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  ts $::mj_filenam
6980: 65 20 7d 20 20 7b 30 7d 0a 0a 64 62 20 63 6c 6f  e }  {0}..db clo
6990: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74 65  se.tv delete..te
69a0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
69b0: 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a  t 1.tv sectorsiz
69c0: 65 20 35 31 32 0a 74 76 20 73 63 72 69 70 74 20  e 512.tv script 
69d0: 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f  copy_on_journal_
69e0: 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72  delete.tv filter
69f0: 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f   xDelete.proc co
6a00: 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65  py_on_journal_de
6a10: 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c  lete {method fil
6a20: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
6a30: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
6a40: 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65  h *journal $file
6a50: 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f  name]} faultsim_
6a60: 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53  save .  return S
6a70: 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74  QLITE_OK.}.fault
6a80: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
6a90: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
6aa0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37  _test pager1.4.7
6ab0: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f  .1 {.  PRAGMA jo
6ac0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
6ad0: 45 54 45 3b 0a 20 20 43 52 45 41 54 45 20 54 41  ETE;.  CREATE TA
6ae0: 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59  BLE t1(x PRIMARY
6af0: 20 4b 45 59 2c 20 79 29 3b 0a 20 20 43 52 45 41   KEY, y);.  CREA
6b00: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
6b10: 31 28 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  1(y);.  INSERT I
6b20: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49  NTO t1 VALUES('I
6b30: 27 2c 20 20 20 27 6f 6e 65 27 29 3b 0a 20 20 49  ',   'one');.  I
6b40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6b50: 4c 55 45 53 28 27 49 49 27 2c 20 20 27 66 6f 75  LUES('II',  'fou
6b60: 72 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  r');.  INSERT IN
6b70: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 49  TO t1 VALUES('II
6b80: 49 27 2c 20 27 6e 69 6e 65 27 29 3b 0a 20 20 42  I', 'nine');.  B
6b90: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
6ba0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6bb0: 27 49 56 27 2c 20 27 73 69 78 74 65 65 6e 27 29  'IV', 'sixteen')
6bc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6bd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 56 27 20  O t1 VALUES('V' 
6be0: 2c 20 27 74 77 65 6e 74 79 66 69 76 65 27 29 3b  , 'twentyfive');
6bf0: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65  .  COMMIT;.} {de
6c00: 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65 72 20  lete}.tv filter 
6c10: 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  {}.db close.tv d
6c20: 65 6c 65 74 65 20 0a 64 6f 5f 74 65 73 74 20 70  elete .do_test p
6c30: 61 67 65 72 31 2e 34 2e 37 2e 32 20 7b 0a 20 20  ager1.4.7.2 {.  
6c40: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
6c50: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 63 61  _and_reopen.  ca
6c60: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
6c70: 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  utes test.db-jou
6c80: 72 6e 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e  rnal -permission
6c90: 73 20 72 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63  s r--------}.  c
6ca0: 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69  atch {file attri
6cb0: 62 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f  butes test.db-jo
6cc0: 75 72 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20  urnal -readonly 
6cd0: 31 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  1}.  catchsql { 
6ce0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
6cf0: 20 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20   }.} {1 {unable 
6d00: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
6d10: 20 66 69 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20   file}}.do_test 
6d20: 70 61 67 65 72 31 2e 34 2e 37 2e 33 20 7b 0a 20  pager1.4.7.3 {. 
6d30: 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63   db close.  catc
6d40: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
6d50: 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  es test.db-journ
6d60: 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20  al -permissions 
6d70: 72 77 2d 72 77 2d 72 77 2d 7d 0a 20 20 63 61 74  rw-rw-rw-}.  cat
6d80: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6d90: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
6da0: 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 30 7d  nal -readonly 0}
6db0: 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74  .  delete_file t
6dc0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20  est.db-journal. 
6dd0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
6de0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
6df0: 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  0}.do_test pager
6e00: 31 2e 34 2e 38 2e 31 20 7b 0a 20 20 63 61 74 63  1.4.8.1 {.  catc
6e10: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
6e20: 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72 6d  es test.db -perm
6e30: 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d 2d  issions r-------
6e40: 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65  -}.  catch {file
6e50: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
6e60: 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20 31 7d  .db -readonly 1}
6e70: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
6e80: 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c 20  st.db.  db eval 
6e90: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6ea0: 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 64  t1 }.  sqlite3_d
6eb0: 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 6d 61  b_readonly db ma
6ec0: 69 6e 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  in.} {1}.do_test
6ed0: 20 70 61 67 65 72 31 2e 34 2e 38 2e 32 20 7b 0a   pager1.4.8.2 {.
6ee0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61    sqlite3_db_rea
6ef0: 64 6f 6e 6c 79 20 64 62 20 78 79 7a 0a 7d 20 7b  donly db xyz.} {
6f00: 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  -1}.do_test page
6f10: 72 31 2e 34 2e 38 2e 33 20 7b 0a 20 20 64 62 20  r1.4.8.3 {.  db 
6f20: 63 6c 6f 73 65 0a 20 20 63 61 74 63 68 20 7b 66  close.  catch {f
6f30: 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74  ile attributes t
6f40: 65 73 74 2e 64 62 20 2d 70 65 72 6d 69 73 73 69  est.db -permissi
6f50: 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d 0a 20  ons rw-rw-rw-}. 
6f60: 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74   catch {file att
6f70: 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62 20  ributes test.db 
6f80: 2d 72 65 61 64 6f 6e 6c 79 20 30 7d 0a 20 20 73  -readonly 0}.  s
6f90: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
6fa0: 62 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45  b.  db eval { SE
6fb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
6fc0: 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  .  sqlite3_db_re
6fd0: 61 64 6f 6e 6c 79 20 64 62 20 6d 61 69 6e 0a 7d  adonly db main.}
6fe0: 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {0}..#---------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7030: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
7040: 20 74 65 73 74 73 20 64 65 61 6c 20 77 69 74 68   tests deal with
7050: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
7060: 69 74 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  its..#.# pager1-
7070: 35 2e 31 2e 2a 3a 20 54 68 65 20 63 61 73 65 20  5.1.*: The case 
7080: 77 68 65 72 65 20 61 20 6d 75 6c 74 69 2d 66 69  where a multi-fi
7090: 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6d  le cannot be com
70a0: 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 0a 23  mitted because.#
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
70c0: 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
70d0: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 53  n is holding a S
70e0: 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 6f 6e  HARED lock on on
70f0: 65 20 6f 66 20 74 68 65 0a 23 20 20 20 20 20 20  e of the.#      
7100: 20 20 20 20 20 20 20 20 20 66 69 6c 65 73 2e 20           files. 
7110: 41 66 74 65 72 20 74 68 65 20 53 48 41 52 45 44  After the SHARED
7120: 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
7130: 2c 20 74 68 65 20 43 4f 4d 4d 49 54 20 73 75 63  , the COMMIT suc
7140: 63 65 65 64 73 2e 0a 23 0a 23 20 70 61 67 65 72  ceeds..#.# pager
7150: 31 2d 35 2e 32 2e 2a 3a 20 4d 75 6c 74 69 2d 66  1-5.2.*: Multi-f
7160: 69 6c 65 20 63 6f 6d 6d 69 74 73 20 77 69 74 68  ile commits with
7170: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6d 65   journal_mode=me
7180: 6d 6f 72 79 2e 0a 23 0a 23 20 70 61 67 65 72 31  mory..#.# pager1
7190: 2d 35 2e 33 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69  -5.3.*: Multi-fi
71a0: 6c 65 20 63 6f 6d 6d 69 74 73 20 77 69 74 68 20  le commits with 
71b0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d  journal_mode=mem
71c0: 6f 72 79 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  ory..#.# pager1-
71d0: 35 2e 34 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61  5.4.*: Check tha
71e0: 74 20 77 69 74 68 20 73 79 6e 63 68 72 6f 6e 6f  t with synchrono
71f0: 75 73 3d 6e 6f 72 6d 61 6c 2c 20 74 68 65 20 6d  us=normal, the m
7200: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
7210: 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  le.#            
7220: 20 20 20 6e 61 6d 65 20 69 73 20 61 64 64 65 64     name is added
7230: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
7240: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  le immediately a
7250: 66 74 65 72 20 74 68 65 20 6c 61 73 74 0a 23 20  fter the last.# 
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
7270: 75 72 6e 61 6c 20 72 65 63 6f 72 64 2e 20 42 75  urnal record. Bu
7280: 74 20 77 69 74 68 20 73 79 6e 63 68 72 6f 6e 6f  t with synchrono
7290: 75 73 3d 66 75 6c 6c 2c 20 65 78 74 72 61 20 75  us=full, extra u
72a0: 6e 75 73 65 64 20 73 70 61 63 65 0a 23 20 20 20  nused space.#   
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61              is a
72c0: 6c 6c 6f 63 61 74 65 64 20 62 65 74 77 65 65 6e  llocated between
72d0: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
72e0: 6c 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  l record and the
72f0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
7300: 20 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c    master-journal
7310: 20 66 69 6c 65 20 6e 61 6d 65 20 73 6f 20 74 68   file name so th
7320: 61 74 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  at the master-jo
7330: 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20 20  urnal file.#    
7340: 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 20             name 
7350: 64 6f 65 73 20 6e 6f 74 20 6c 69 65 20 6f 6e 20  does not lie on 
7360: 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 20  the same sector 
7370: 61 73 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72  as the last jour
7380: 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20  nal file.#      
7390: 20 20 20 20 20 20 20 20 20 72 65 63 6f 72 64 2e           record.
73a0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 35 2e  .#.# pager1-5.5.
73b0: 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20 69 6e  *: Check that in
73c0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
73d0: 52 53 49 53 54 20 6d 6f 64 65 2c 20 61 20 6a 6f  RSIST mode, a jo
73e0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 23 20  urnal file is.# 
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
7400: 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
7410: 62 79 74 65 73 20 77 68 65 6e 20 61 20 6d 75 6c  bytes when a mul
7420: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
7430: 69 6f 6e 20 69 73 20 0a 23 20 20 20 20 20 20 20  ion is .#       
7440: 20 20 20 20 20 20 20 20 63 6f 6d 6d 69 74 74 65          committe
7450: 64 20 28 69 6e 73 74 65 61 64 20 6f 66 20 74 68  d (instead of th
7460: 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f  e first couple o
7470: 66 20 62 79 74 65 73 20 62 65 69 6e 67 20 7a 65  f bytes being ze
7480: 72 6f 65 64 29 2e 0a 23 0a 23 0a 64 6f 5f 74 65  roed)..#.#.do_te
7490: 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 31 20  st pager1-5.1.1 
74a0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
74b0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
74c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 41   execsql {.    A
74d0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
74e0: 20 41 53 20 61 75 78 3b 0a 20 20 20 20 43 52 45   AS aux;.    CRE
74f0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
7500: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
7510: 41 42 4c 45 20 61 75 78 2e 74 32 28 61 2c 20 62  ABLE aux.t2(a, b
7520: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
7530: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 37 2c  TO t1 VALUES(17,
7540: 20 27 4c 65 6e 69 6e 27 29 3b 0a 20 20 20 20 49   'Lenin');.    I
7550: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7560: 4c 55 45 53 28 32 32 2c 20 27 53 74 61 6c 69 6e  LUES(22, 'Stalin
7570: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
7580: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 33  NTO t1 VALUES(53
7590: 2c 20 27 4b 68 72 75 73 68 63 68 65 76 27 29 3b  , 'Khrushchev');
75a0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
75b0: 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 32 20 7b  t pager1-5.1.2 {
75c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
75d0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
75e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
75f0: 55 45 53 28 36 34 2c 20 27 42 72 65 7a 68 6e 65  UES(64, 'Brezhne
7600: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
7610: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
7620: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
7630: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
7640: 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c  st.db2.  execsql
7650: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
7660: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
7670: 4d 20 74 32 3b 0a 20 20 7d 20 64 62 32 0a 7d 20  M t2;.  } db2.} 
7680: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
7690: 31 2d 35 2e 31 2e 33 20 7b 0a 20 20 63 61 74 63  1-5.1.3 {.  catc
76a0: 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31  hsql COMMIT.} {1
76b0: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
76c0: 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 70  cked}}.do_test p
76d0: 61 67 65 72 31 2d 35 2e 31 2e 34 20 7b 0a 20 20  ager1-5.1.4 {.  
76e0: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 20 64  execsql COMMIT d
76f0: 62 32 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d  b2.  execsql COM
7700: 4d 49 54 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  MIT.  execsql { 
7710: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
7720: 20 7d 20 64 62 32 0a 7d 20 7b 31 37 20 4c 65 6e   } db2.} {17 Len
7730: 69 6e 20 32 32 20 53 74 61 6c 69 6e 20 35 33 20  in 22 Stalin 53 
7740: 4b 68 72 75 73 68 63 68 65 76 20 36 34 20 42 72  Khrushchev 64 Br
7750: 65 7a 68 6e 65 76 7d 0a 64 6f 5f 74 65 73 74 20  ezhnev}.do_test 
7760: 70 61 67 65 72 31 2d 35 2e 31 2e 35 20 7b 0a 20  pager1-5.1.5 {. 
7770: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a   db2 close.} {}.
7780: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7790: 35 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  5.2.1 {.  execsq
77a0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
77b0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65  ournal_mode = me
77c0: 6d 6f 72 79 3b 0a 20 20 20 20 42 45 47 49 4e 3b  mory;.    BEGIN;
77d0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
77e0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38 34 2c  TO t1 VALUES(84,
77f0: 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a 20 20   'Andropov');.  
7800: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7810: 74 32 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41  t2 VALUES(84, 'A
7820: 6e 64 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 43  ndropov');.    C
7830: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6d 65  OMMIT;.  }.} {me
7840: 6d 6f 72 79 7d 0a 64 6f 5f 74 65 73 74 20 70 61  mory}.do_test pa
7850: 67 65 72 31 2d 35 2e 33 2e 31 20 7b 0a 20 20 65  ger1-5.3.1 {.  e
7860: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
7870: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
7880: 20 3d 20 6f 66 66 3b 0a 20 20 20 20 42 45 47 49   = off;.    BEGI
7890: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
78a0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38  INTO t1 VALUES(8
78b0: 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27 29 3b  5, 'Gorbachev');
78c0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
78d0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38 35 2c  TO t2 VALUES(85,
78e0: 20 27 47 6f 72 62 61 63 68 65 76 27 29 3b 0a 20   'Gorbachev');. 
78f0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
7900: 20 7b 6f 66 66 7d 0a 0a 64 6f 5f 74 65 73 74 20   {off}..do_test 
7910: 70 61 67 65 72 31 2d 35 2e 34 2e 31 20 7b 0a 20  pager1-5.4.1 {. 
7920: 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 65 73 74   db close.  test
7930: 76 66 73 20 74 76 0a 20 20 73 71 6c 69 74 65 33  vfs tv.  sqlite3
7940: 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73   db test.db -vfs
7950: 20 74 76 0a 20 20 65 78 65 63 73 71 6c 20 7b 20   tv.  execsql { 
7960: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32  ATTACH 'test.db2
7970: 27 20 41 53 20 61 75 78 20 7d 0a 0a 20 20 74 76  ' AS aux }..  tv
7980: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
7990: 20 20 74 76 20 73 63 72 69 70 74 20 6d 61 78 5f    tv script max_
79a0: 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 0a 20 20 74  journal_size.  t
79b0: 76 20 73 65 63 74 6f 72 73 69 7a 65 20 35 31 32  v sectorsize 512
79c0: 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75  .  set ::max_jou
79d0: 72 6e 61 6c 20 30 0a 20 20 70 72 6f 63 20 6d 61  rnal 0.  proc ma
79e0: 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 20 7b  x_journal_size {
79f0: 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20  method args} {. 
7a00: 20 20 20 73 65 74 20 73 7a 20 30 0a 20 20 20 20     set sz 0.    
7a10: 63 61 74 63 68 20 7b 20 73 65 74 20 73 7a 20 5b  catch { set sz [
7a20: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
7a30: 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20 20 20  b-journal] }.   
7a40: 20 69 66 20 7b 24 73 7a 20 3e 20 24 3a 3a 6d 61   if {$sz > $::ma
7a50: 78 5f 6a 6f 75 72 6e 61 6c 7d 20 7b 0a 20 20 20  x_journal} {.   
7a60: 20 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75     set ::max_jou
7a70: 72 6e 61 6c 20 24 73 7a 0a 20 20 20 20 7d 0a 20  rnal $sz.    }. 
7a80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7a90: 5f 4f 4b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  _OK.  }.  execsq
7aa0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
7ab0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
7ac0: 4c 45 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41  LETE;.    PRAGMA
7ad0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e   synchronous = N
7ae0: 4f 52 4d 41 4c 3b 0a 20 20 20 20 42 45 47 49 4e  ORMAL;.    BEGIN
7af0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
7b00: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38 35  NTO t1 VALUES(85
7b10: 2c 20 27 47 6f 72 62 61 63 68 65 76 27 29 3b 0a  , 'Gorbachev');.
7b20: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
7b30: 4f 20 74 32 20 56 41 4c 55 45 53 28 38 35 2c 20  O t2 VALUES(85, 
7b40: 27 47 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20  'Gorbachev');.  
7b50: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20    COMMIT;.  }.. 
7b60: 20 23 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74   # The size of t
7b70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7b80: 69 73 20 6e 6f 77 3a 0a 20 20 23 20 0a 20 20 23  is now:.  # .  #
7b90: 20 20 20 31 29 20 35 31 32 20 62 79 74 65 20 68     1) 512 byte h
7ba0: 65 61 64 65 72 20 2b 0a 20 20 23 20 20 20 32 29  eader +.  #   2)
7bb0: 20 32 20 2a 20 28 31 30 32 34 2b 38 29 20 62 79   2 * (1024+8) by
7bc0: 74 65 20 72 65 63 6f 72 64 73 20 2b 0a 20 20 23  te records +.  #
7bd0: 20 20 20 33 29 20 32 30 2b 4e 20 62 79 74 65 73     3) 20+N bytes
7be0: 20 6f 66 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   of master-journ
7bf0: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 77 68 65 72  al pointer, wher
7c00: 65 20 4e 20 69 73 20 74 68 65 20 73 69 7a 65 20  e N is the size 
7c10: 6f 66 20 0a 20 20 23 20 20 20 20 20 20 74 68 65  of .  #      the
7c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7c30: 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 61 73 20  name encoded as 
7c40: 75 74 66 2d 38 20 77 69 74 68 20 6e 6f 20 6e 75  utf-8 with no nu
7c50: 6c 20 74 65 72 6d 2e 0a 20 20 23 0a 20 20 73 65  l term..  #.  se
7c60: 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b 65 78  t mj_pointer [ex
7c70: 70 72 20 7b 0a 20 20 20 20 32 30 20 2b 20 5b 73  pr {.    20 + [s
7c80: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67 65  tring length [ge
7c90: 74 5f 70 77 64 5d 5d 20 2b 20 5b 73 74 72 69 6e  t_pwd]] + [strin
7ca0: 67 20 6c 65 6e 67 74 68 20 22 2f 74 65 73 74 2e  g length "/test.
7cb0: 64 62 2d 6d 6a 58 58 58 58 58 58 39 58 58 22 5d  db-mjXXXXXX9XX"]
7cc0: 0a 20 20 7d 5d 0a 20 20 65 78 70 72 20 7b 24 3a  .  }].  expr {$:
7cd0: 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 35  :max_journal==(5
7ce0: 31 32 2b 32 2a 28 31 30 32 34 2b 38 29 2b 24 6d  12+2*(1024+8)+$m
7cf0: 6a 5f 70 6f 69 6e 74 65 72 29 7d 0a 7d 20 31 0a  j_pointer)}.} 1.
7d00: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
7d10: 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a 6d  .4.2 {.  set ::m
7d20: 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 65  ax_journal 0.  e
7d30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
7d40: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
7d50: 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49  = full;.    BEGI
7d60: 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  N;.      DELETE 
7d70: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20  FROM t1 WHERE b 
7d80: 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 20  = 'Lenin';.     
7d90: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20   DELETE FROM t2 
7da0: 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e  WHERE b = 'Lenin
7db0: 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  ';.    COMMIT;. 
7dc0: 20 7d 0a 0a 20 20 23 20 49 6e 20 73 79 6e 63 68   }..  # In synch
7dd0: 72 6f 6e 6f 75 73 3d 66 75 6c 6c 20 6d 6f 64 65  ronous=full mode
7de0: 2c 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  , the master-jou
7df0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  rnal pointer is 
7e00: 6e 6f 74 20 77 72 69 74 74 65 6e 0a 20 20 23 20  not written.  # 
7e10: 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74  directly after t
7e20: 68 65 20 6c 61 73 74 20 72 65 63 6f 72 64 20 69  he last record i
7e30: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7e40: 6c 65 2e 20 49 6e 73 74 65 61 64 2c 20 69 74 20  le. Instead, it 
7e50: 69 73 0a 20 20 23 20 77 72 69 74 74 65 6e 20 73  is.  # written s
7e60: 74 61 72 74 69 6e 67 20 61 74 20 74 68 65 20 6e  tarting at the n
7e70: 65 78 74 20 28 69 6e 20 74 68 69 73 20 63 61 73  ext (in this cas
7e80: 65 20 35 31 32 20 62 79 74 65 29 20 73 65 63 74  e 512 byte) sect
7e90: 6f 72 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20 23  or boundary..  #
7ea0: 0a 20 20 73 65 74 20 6d 6a 5f 70 6f 69 6e 74 65  .  set mj_pointe
7eb0: 72 20 5b 65 78 70 72 20 7b 0a 20 20 20 20 32 30  r [expr {.    20
7ec0: 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   + [string lengt
7ed0: 68 20 5b 67 65 74 5f 70 77 64 5d 5d 20 2b 20 5b  h [get_pwd]] + [
7ee0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 22 2f  string length "/
7ef0: 74 65 73 74 2e 64 62 2d 6d 6a 58 58 58 58 58 58  test.db-mjXXXXXX
7f00: 39 58 58 22 5d 0a 20 20 7d 5d 0a 20 20 65 78 70  9XX"].  }].  exp
7f10: 72 20 7b 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61  r {$::max_journa
7f20: 6c 3d 3d 28 28 28 35 31 32 2b 32 2a 28 31 30 32  l==(((512+2*(102
7f30: 34 2b 38 29 2b 35 31 31 29 2f 35 31 32 29 2a 35  4+8)+511)/512)*5
7f40: 31 32 20 2b 20 24 6d 6a 5f 70 6f 69 6e 74 65 72  12 + $mj_pointer
7f50: 29 7d 0a 7d 20 31 0a 64 62 20 63 6c 6f 73 65 0a  )}.} 1.db close.
7f60: 74 76 20 64 65 6c 65 74 65 0a 0a 64 6f 5f 74 65  tv delete..do_te
7f70: 73 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 31 20  st pager1-5.5.1 
7f80: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  {.  sqlite3 db t
7f90: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
7fa0: 20 7b 20 0a 20 20 20 20 41 54 54 41 43 48 20 27   { .    ATTACH '
7fb0: 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78  test.db2' AS aux
7fc0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
7fd0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
7fe0: 49 53 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20  IST;.    CREATE 
7ff0: 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a  TABLE t3(a, b);.
8000: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8010: 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t3 SELECT random
8020: 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
8030: 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
8040: 4d 20 74 31 3b 0a 20 20 20 20 55 50 44 41 54 45  M t1;.    UPDATE
8050: 20 74 33 20 53 45 54 20 62 20 3d 20 72 61 6e 64   t3 SET b = rand
8060: 6f 6d 62 6c 6f 62 28 31 35 30 30 29 3b 0a 20 20  omblob(1500);.  
8070: 7d 0a 20 20 65 78 70 72 20 5b 66 69 6c 65 20 73  }.  expr [file s
8080: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
8090: 6e 61 6c 5d 20 3e 20 31 35 30 30 30 0a 7d 20 7b  nal] > 15000.} {
80a0: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
80b0: 31 2d 35 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63  1-5.5.2 {.  exec
80c0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
80d0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66   synchronous = f
80e0: 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ull;.    BEGIN;.
80f0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
8100: 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27  M t1 WHERE b = '
8110: 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 20 20 44  Stalin';.      D
8120: 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48  ELETE FROM t2 WH
8130: 45 52 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27  ERE b = 'Stalin'
8140: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
8150: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
8160: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
8170: 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {0}...#---------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81c0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
81d0: 20 74 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68   tests work with
81e0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
81f0: 65 5f 63 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74 65  e_count".#.do_te
8200: 73 74 20 70 61 67 65 72 31 2d 36 2e 31 20 7b 0a  st pager1-6.1 {.
8210: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
8220: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
8230: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
8240: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
8250: 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47  = none;.    PRAG
8260: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
8270: 74 20 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41  t = 10;.    CREA
8280: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
8290: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
82a0: 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20  BLE t3(a, b);.  
82b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
82c0: 34 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  4(a, b);.    CRE
82d0: 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20  ATE TABLE t5(a, 
82e0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
82f0: 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20  ABLE t6(a, b);. 
8300: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
8310: 74 37 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t7(a, b);.    CR
8320: 45 41 54 45 20 54 41 42 4c 45 20 74 38 28 61 2c  EATE TABLE t8(a,
8330: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
8340: 54 41 42 4c 45 20 74 39 28 61 2c 20 62 29 3b 0a  TABLE t9(a, b);.
8350: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8360: 20 74 31 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a   t10(a, b);.  }.
8370: 7d 20 7b 31 30 7d 0a 64 6f 5f 63 61 74 63 68 73  } {10}.do_catchs
8380: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  ql_test pager1-6
8390: 2e 32 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .2 {.  CREATE TA
83a0: 42 4c 45 20 74 31 31 28 61 2c 20 62 29 0a 7d 20  BLE t11(a, b).} 
83b0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 6f 72 20  {1 {database or 
83c0: 64 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 64  disk is full}}.d
83d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
83e0: 61 67 65 72 31 2d 36 2e 34 20 7b 20 50 52 41 47  ager1-6.4 { PRAG
83f0: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
8400: 74 20 20 20 20 20 20 7d 20 7b 31 30 7d 0a 64 6f  t      } {10}.do
8410: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
8420: 67 65 72 31 2d 36 2e 35 20 7b 20 50 52 41 47 4d  ger1-6.5 { PRAGM
8430: 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  A max_page_count
8440: 20 3d 20 31 35 20 7d 20 7b 31 35 7d 0a 64 6f 5f   = 15 } {15}.do_
8450: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
8460: 65 72 31 2d 36 2e 36 20 7b 20 43 52 45 41 54 45  er1-6.6 { CREATE
8470: 20 54 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29   TABLE t11(a, b)
8480: 20 20 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65       } {}.do_exe
8490: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
84a0: 2d 36 2e 37 20 7b 0a 20 20 42 45 47 49 4e 3b 0a  -6.7 {.  BEGIN;.
84b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
84c0: 74 31 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29  t11 VALUES(1, 2)
84d0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78  ;.    PRAGMA max
84e0: 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 33  _page_count = 13
84f0: 3b 0a 7d 20 7b 31 33 7d 0a 64 6f 5f 65 78 65 63  ;.} {13}.do_exec
8500: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
8510: 36 2e 38 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  6.8 {.    INSERT
8520: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53   INTO t11 VALUES
8530: 28 33 2c 20 34 29 3b 0a 20 20 20 20 50 52 41 47  (3, 4);.    PRAG
8540: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
8550: 74 20 3d 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a 64  t = 10;.} {11}.d
8560: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
8570: 61 67 65 72 31 2d 36 2e 39 20 7b 20 43 4f 4d 4d  ager1-6.9 { COMM
8580: 49 54 20 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63  IT } {}..do_exec
8590: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
85a0: 36 2e 31 30 20 7b 20 50 52 41 47 4d 41 20 6d 61  6.10 { PRAGMA ma
85b0: 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31  x_page_count = 1
85c0: 30 20 7d 20 7b 31 31 7d 0a 64 6f 5f 65 78 65 63  0 } {11}.do_exec
85d0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
85e0: 36 2e 31 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  6.11 { SELECT * 
85f0: 46 52 4f 4d 20 74 31 31 20 7d 20 20 20 20 20 20  FROM t11 }      
8600: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f      {1 2 3 4}.do
8610: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
8620: 67 65 72 31 2d 36 2e 31 32 20 7b 20 50 52 41 47  ger1-6.12 { PRAG
8630: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
8640: 74 20 7d 20 20 20 20 20 20 7b 31 31 7d 0a 0a 0a  t }      {11}...
8650: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
8660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
86a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
86b0: 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52 41 47   work with "PRAG
86c0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
86d0: 54 52 55 4e 43 41 54 45 22 20 61 6e 64 0a 23 20  TRUNCATE" and.# 
86e0: 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  "PRAGMA locking_
86f0: 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 22 2e  mode=EXCLUSIVE".
8700: 0a 23 0a 23 20 45 61 63 68 20 74 65 73 74 20 69  .#.# Each test i
8710: 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68  s specified with
8720: 20 35 20 76 61 72 69 61 62 6c 65 73 2e 20 41 73   5 variables. As
8730: 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20   follows:.#.#   
8740: 24 74 6e 3a 20 20 54 65 73 74 20 4e 75 6d 62 65  $tn:  Test Numbe
8750: 72 2e 20 55 73 65 64 20 61 73 20 70 61 72 74 20  r. Used as part 
8760: 6f 66 20 74 68 65 20 5b 64 6f 5f 74 65 73 74 5d  of the [do_test]
8770: 20 74 65 73 74 20 6e 61 6d 65 73 2e 0a 23 20 20   test names..#  
8780: 20 24 73 71 6c 3a 20 53 51 4c 20 74 6f 20 65 78   $sql: SQL to ex
8790: 65 63 75 74 65 2e 0a 23 20 20 20 24 72 65 73 3a  ecute..#   $res:
87a0: 20 45 78 70 65 63 74 65 64 20 72 65 73 75 6c 74   Expected result
87b0: 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20 24 73   of executing $s
87c0: 71 6c 2e 0a 23 20 20 20 24 6a 73 3a 20 20 54 68  ql..#   $js:  Th
87d0: 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65 20  e expected size 
87e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
87f0: 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61  ile, in bytes, a
8800: 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23  fter executing.#
8810: 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51 4c           the SQL
8820: 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69   script. Or -1 i
8830: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  f the journal is
8840: 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f   not expected to
8850: 20 65 78 69 73 74 2e 0a 23 20 20 20 24 77 73 3a   exist..#   $ws:
8860: 20 20 54 68 65 20 65 78 70 65 63 74 65 64 20 73    The expected s
8870: 69 7a 65 20 6f 66 20 74 68 65 20 57 41 4c 20 66  ize of the WAL f
8880: 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61  ile, in bytes, a
8890: 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23  fter executing.#
88a0: 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51 4c           the SQL
88b0: 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69   script. Or -1 i
88c0: 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74  f the WAL is not
88d0: 20 65 78 70 65 63 74 65 64 20 74 6f 20 65 78 69   expected to exi
88e0: 73 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  st..#.ifcapable 
88f0: 77 61 6c 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  wal {.  faultsim
8900: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
8910: 65 6e 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e  en.  foreach {tn
8920: 20 73 71 6c 20 72 65 73 20 6a 73 20 77 73 7d 20   sql res js ws} 
8930: 5b 73 75 62 73 74 20 7b 0a 20 20 0a 20 20 20 20  [subst {.  .    
8940: 31 20 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  1  {.      CREAT
8950: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
8960: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
8970: 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a  uto_vacuum=OFF;.
8980: 20 20 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e        PRAGMA syn
8990: 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b  chronous=NORMAL;
89a0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61  .      PRAGMA pa
89b0: 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20  ge_size=1024;.  
89c0: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
89d0: 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
89e0: 45 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  E;.      PRAGMA 
89f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55  journal_mode=TRU
8a00: 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 49 4e 53  NCATE;.      INS
8a10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8a20: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 20  ES(1, 2);.    } 
8a30: 7b 65 78 63 6c 75 73 69 76 65 20 74 72 75 6e 63  {exclusive trunc
8a40: 61 74 65 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20  ate} 0 -1.  .   
8a50: 20 32 20 20 7b 0a 20 20 20 20 20 20 42 45 47 49   2  {.      BEGI
8a60: 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20 20  N IMMEDIATE;.   
8a70: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
8a80: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d  OM t1;.      COM
8a90: 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d  MIT;.    } {1 2}
8aa0: 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 33 20 20   0 -1.  .    3  
8ab0: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
8ac0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
8ad0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43  FROM t1;.      C
8ae0: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20  OMMIT;.    } {1 
8af0: 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 34  2} 0 -1.  .    4
8b00: 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e    { PRAGMA journ
8b10: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20  al_mode = WAL } 
8b20: 20 20 20 77 61 6c 20 20 20 20 20 20 20 2d 31 20     wal       -1 
8b30: 2d 31 0a 20 20 20 20 35 20 20 7b 20 49 4e 53 45  -1.    5  { INSE
8b40: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
8b50: 53 28 33 2c 20 34 29 20 7d 20 20 7b 7d 20 20 20  S(3, 4) }  {}   
8b60: 20 20 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c       -1 [wal_fil
8b70: 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a 20  e_size 1 1024]. 
8b80: 20 20 20 36 20 20 7b 20 50 52 41 47 4d 41 20 6c     6  { PRAGMA l
8b90: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 4e 4f  ocking_mode = NO
8ba0: 52 4d 41 4c 20 7d 20 65 78 63 6c 75 73 69 76 65  RMAL } exclusive
8bb0: 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69   -1 [wal_file_si
8bc0: 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 20 20 37  ze 1 1024].    7
8bd0: 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20    { INSERT INTO 
8be0: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
8bf0: 20 7d 20 7b 7d 20 20 20 20 20 20 20 20 2d 31 20   } {}        -1 
8c00: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 32  [wal_file_size 2
8c10: 20 31 30 32 34 5d 0a 20 20 0a 20 20 20 20 38 20   1024].  .    8 
8c20: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
8c30: 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54  l_mode = TRUNCAT
8c40: 45 20 7d 20 74 72 75 6e 63 61 74 65 20 20 20 20  E } truncate    
8c50: 20 20 20 20 20 20 30 20 2d 31 0a 20 20 20 20 39        0 -1.    9
8c60: 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20    { INSERT INTO 
8c70: 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38 29 20  t1 VALUES(7, 8) 
8c80: 7d 20 20 20 20 7b 7d 20 20 20 20 20 20 20 20 20  }    {}         
8c90: 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20 20 20         0 -1.    
8ca0: 31 30 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  10 { SELECT * FR
8cb0: 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20 20  OM t1 }         
8cc0: 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 20 35        {1 2 3 4 5
8cd0: 20 36 20 37 20 38 7d 20 30 20 2d 31 0a 20 20 0a   6 7 8} 0 -1.  .
8ce0: 20 20 7d 5d 20 7b 0a 20 20 20 20 64 6f 5f 65 78    }] {.    do_ex
8cf0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
8d00: 31 2d 37 2e 31 2e 24 74 6e 2e 31 20 24 73 71 6c  1-7.1.$tn.1 $sql
8d10: 20 24 72 65 73 0a 20 20 20 20 63 61 74 63 68 20   $res.    catch 
8d20: 7b 20 73 65 74 20 4a 20 2d 31 20 3b 20 73 65 74  { set J -1 ; set
8d30: 20 4a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65   J [file size te
8d40: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d  st.db-journal] }
8d50: 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73 65 74  .    catch { set
8d60: 20 57 20 2d 31 20 3b 20 73 65 74 20 57 20 5b 66   W -1 ; set W [f
8d70: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
8d80: 2d 77 61 6c 5d 20 7d 0a 20 20 20 20 64 6f 5f 74  -wal] }.    do_t
8d90: 65 73 74 20 70 61 67 65 72 31 2d 37 2e 31 2e 24  est pager1-7.1.$
8da0: 74 6e 2e 32 20 7b 20 6c 69 73 74 20 24 4a 20 24  tn.2 { list $J $
8db0: 57 20 7d 20 5b 6c 69 73 74 20 24 6a 73 20 24 77  W } [list $js $w
8dc0: 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73  s].  }.}..do_tes
8dd0: 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 31 20 7b  t pager1-7.2.1 {
8de0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
8df0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
8e00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
8e10: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
8e20: 65 20 3d 20 45 58 43 4c 55 53 49 56 45 3b 0a 20  e = EXCLUSIVE;. 
8e30: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
8e40: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 42 45  t1(a, b);.    BE
8e50: 47 49 4e 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  GIN;.      PRAGM
8e60: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
8e70: 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 20 20 50   delete;.      P
8e80: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8e90: 64 65 20 3d 20 74 72 75 6e 63 61 74 65 3b 0a 20  de = truncate;. 
8ea0: 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20   }.} {exclusive 
8eb0: 64 65 6c 65 74 65 20 74 72 75 6e 63 61 74 65 7d  delete truncate}
8ec0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
8ed0: 37 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  7.2.2 {.  execsq
8ee0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
8ef0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20  t1 VALUES(1, 2) 
8f00: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  }.  execsql { PR
8f10: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
8f20: 65 20 3d 20 70 65 72 73 69 73 74 20 7d 0a 7d 20  e = persist }.} 
8f30: 7b 74 72 75 6e 63 61 74 65 7d 0a 64 6f 5f 74 65  {truncate}.do_te
8f40: 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 33 20  st pager1-7.2.3 
8f50: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f  {.  execsql { CO
8f60: 4d 4d 49 54 20 7d 0a 20 20 65 78 65 63 73 71 6c  MMIT }.  execsql
8f70: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
8f80: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72  urnal_mode = per
8f90: 73 69 73 74 3b 0a 20 20 20 20 50 52 41 47 4d 41  sist;.    PRAGMA
8fa0: 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69   journal_size_li
8fb0: 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b 70 65 72 73  mit;.  }.} {pers
8fc0: 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ist -1}..#------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9010: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
9020: 69 6e 67 20 74 65 73 74 73 2c 20 70 61 67 65 72  ing tests, pager
9030: 31 2d 38 2e 2a 2c 20 74 65 73 74 20 74 68 61 74  1-8.*, test that
9040: 20 74 68 65 20 73 70 65 63 69 61 6c 20 66 69 6c   the special fil
9050: 65 6e 61 6d 65 73 20 0a 23 20 22 3a 6d 65 6d 6f  enames .# ":memo
9060: 72 79 3a 22 20 61 6e 64 20 22 22 20 6f 70 65 6e  ry:" and "" open
9070: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
9080: 61 73 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20  ases..#.foreach 
9090: 7b 74 6e 20 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a  {tn filename} {.
90a0: 20 20 31 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 32    1 :memory:.  2
90b0: 20 22 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   "".} {.  do_tes
90c0: 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 31  t pager1-8.$tn.1
90d0: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
90e0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
90f0: 6e 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20  n.    db close. 
9100: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 24 66     sqlite3 db $f
9110: 69 6c 65 6e 61 6d 65 0a 20 20 20 20 65 78 65 63  ilename.    exec
9120: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
9130: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
9140: 20 31 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45   1;.      CREATE
9150: 20 54 41 42 4c 45 20 78 31 28 78 29 3b 0a 20 20   TABLE x1(x);.  
9160: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9170: 78 31 20 56 41 4c 55 45 53 28 27 43 68 61 72 6c  x1 VALUES('Charl
9180: 65 73 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  es');.      INSE
9190: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
91a0: 53 28 27 4a 61 6d 65 73 27 29 3b 0a 20 20 20 20  S('James');.    
91b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
91c0: 20 56 41 4c 55 45 53 28 27 4d 61 72 79 27 29 3b   VALUES('Mary');
91d0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
91e0: 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 7d 0a 20  FROM x1;.    }. 
91f0: 20 7d 20 7b 43 68 61 72 6c 65 73 20 4a 61 6d 65   } {Charles Jame
9200: 73 20 4d 61 72 79 7d 0a 0a 20 20 64 6f 5f 74 65  s Mary}..  do_te
9210: 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e  st pager1-8.$tn.
9220: 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  2 {.    sqlite3 
9230: 64 62 32 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20  db2 $filename.  
9240: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
9250: 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20  ECT * FROM x1 } 
9260: 64 62 32 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73  db2.  } {1 {no s
9270: 75 63 68 20 74 61 62 6c 65 3a 20 78 31 7d 7d 0a  uch table: x1}}.
9280: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
9290: 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e  st pager1-8.$tn.
92a0: 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  3 {.    BEGIN;. 
92b0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
92c0: 20 78 31 20 56 41 4c 55 45 53 28 27 57 69 6c 6c   x1 VALUES('Will
92d0: 69 61 6d 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  iam');.      INS
92e0: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
92f0: 45 53 28 27 41 6e 6e 65 27 29 3b 0a 20 20 20 20  ES('Anne');.    
9300: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20 7b 7d  ROLLBACK;.  } {}
9310: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
9320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
9360: 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
9370: 6f 66 20 74 65 73 74 73 20 2d 20 70 61 67 65 72  of tests - pager
9380: 31 2d 39 2e 2a 20 2d 20 64 65 61 6c 20 77 69 74  1-9.* - deal wit
9390: 68 20 69 6e 74 65 72 61 63 74 69 6f 6e 73 20 62  h interactions b
93a0: 65 74 77 65 65 6e 0a 23 20 74 68 65 20 70 61 67  etween.# the pag
93b0: 65 72 20 61 6e 64 20 74 68 65 20 62 61 63 6b 75  er and the backu
93c0: 70 20 41 50 49 2e 20 54 65 73 74 20 63 61 73 65  p API. Test case
93d0: 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  s:.#.#   pager1-
93e0: 39 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  9.1.*: Test that
93f0: 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65   a backup comple
9400: 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  tes successfully
9410: 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20   even if the.#  
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9430: 6f 75 72 63 65 20 64 62 20 69 73 20 77 72 69 74  ource db is writ
9440: 74 65 6e 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ten to during th
9450: 65 20 62 61 63 6b 75 70 20 6f 70 2e 0a 23 0a 23  e backup op..#.#
9460: 20 20 20 70 61 67 65 72 31 2d 39 2e 32 2e 2a 3a     pager1-9.2.*:
9470: 20 54 65 73 74 20 74 68 61 74 20 61 20 62 61 63   Test that a bac
9480: 6b 75 70 20 63 6f 6d 70 6c 65 74 65 73 20 73 75  kup completes su
9490: 63 63 65 73 73 66 75 6c 6c 79 20 65 76 65 6e 20  ccessfully even 
94a0: 69 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  if the.#        
94b0: 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65 20           source 
94c0: 64 62 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  db is written to
94d0: 20 61 6e 64 20 74 68 65 6e 20 72 6f 6c 6c 65 64   and then rolled
94e0: 20 62 61 63 6b 20 64 75 72 69 6e 67 20 61 20 0a   back during a .
94f0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
9500: 20 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69    backup operati
9510: 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  on..#.do_test pa
9520: 67 65 72 31 2d 39 2e 30 2e 31 20 7b 0a 20 20 66  ger1-9.0.1 {.  f
9530: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
9540: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
9550: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
9560: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
9570: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  {.    PRAGMA cac
9580: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
9590: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43    BEGIN;.      C
95a0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 28 61  REATE TABLE ab(a
95b0: 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62  , b, UNIQUE(a, b
95c0: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
95d0: 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 28   INTO ab VALUES(
95e0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
95f0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 29 3b  a_string(300) );
9600: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9610: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
9620: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
9630: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
9640: 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  b;.      INSERT 
9650: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
9660: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
9670: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
9680: 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   ab;.      INSER
9690: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
96a0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
96b0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
96c0: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
96d0: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
96e0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
96f0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
9700: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
9710: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
9720: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
9730: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
9740: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
9750: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
9760: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
9770: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9780: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
9790: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
97a0: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
97b0: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
97c0: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
97d0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
97e0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65   {}.do_test page
97f0: 72 31 2d 39 2e 30 2e 32 20 7b 0a 20 20 73 71 6c  r1-9.0.2 {.  sql
9800: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
9810: 32 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 20 50  2.  db2 eval { P
9820: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
9830: 20 3d 20 31 30 20 7d 0a 20 20 73 71 6c 69 74 65   = 10 }.  sqlite
9840: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d  3_backup B db2 m
9850: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69  ain db main.  li
9860: 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30  st [B step 10000
9870: 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b  ] [B finish].} {
9880: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49  SQLITE_DONE SQLI
9890: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70  TE_OK}.do_test p
98a0: 61 67 65 72 31 2d 39 2e 30 2e 33 20 7b 0a 20 64  ager1-9.0.3 {. d
98b0: 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64  b one {SELECT md
98c0: 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20  5sum(a, b) FROM 
98d0: 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b  ab}.} [db2 one {
98e0: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c  SELECT md5sum(a,
98f0: 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 0a 64   b) FROM ab}]..d
9900: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9910: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
9920: 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20  { UPDATE ab SET 
9930: 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 31  a = a_string(201
9940: 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  ) }.  sqlite3_ba
9950: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
9960: 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70  db main.  B step
9970: 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   30.} {SQLITE_OK
9980: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
9990: 2d 39 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  -9.1.2 {.  execs
99a0: 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 53  ql { UPDATE ab S
99b0: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
99c0: 33 30 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b 42  301) }.  list [B
99d0: 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20   step 10000] [B 
99e0: 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54  finish].} {SQLIT
99f0: 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b  E_DONE SQLITE_OK
9a00: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
9a10: 2d 39 2e 31 2e 33 20 7b 0a 20 64 62 20 6f 6e 65  -9.1.3 {. db one
9a20: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
9a30: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d  a, b) FROM ab}.}
9a40: 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43   [db2 one {SELEC
9a50: 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46  T md5sum(a, b) F
9a60: 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74  ROM ab}].do_test
9a70: 20 70 61 67 65 72 31 2d 39 2e 31 2e 34 20 7b 20   pager1-9.1.4 { 
9a80: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
9a90: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61   count(*) FROM a
9aa0: 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 0a 64 6f 5f  b } } {128}..do_
9ab0: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e  test pager1-9.2.
9ac0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
9ad0: 55 50 44 41 54 45 20 61 62 20 53 45 54 20 61 20  UPDATE ab SET a 
9ae0: 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29 20  = a_string(202) 
9af0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  }.  sqlite3_back
9b00: 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62  up B db2 main db
9b10: 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33   main.  B step 3
9b20: 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  0.} {SQLITE_OK}.
9b30: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9b40: 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.2 {.  execsql
9b50: 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20   { .    BEGIN;. 
9b60: 20 20 20 20 20 55 50 44 41 54 45 20 61 62 20 53       UPDATE ab S
9b70: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
9b80: 33 30 31 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  301);.    ROLLBA
9b90: 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b  CK;.  }.  list [
9ba0: 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42  B step 10000] [B
9bb0: 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49   finish].} {SQLI
9bc0: 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f  TE_DONE SQLITE_O
9bd0: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
9be0: 31 2d 39 2e 32 2e 33 20 7b 0a 20 64 62 20 6f 6e  1-9.2.3 {. db on
9bf0: 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  e {SELECT md5sum
9c00: 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a  (a, b) FROM ab}.
9c10: 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45  } [db2 one {SELE
9c20: 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20  CT md5sum(a, b) 
9c30: 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73  FROM ab}].do_tes
9c40: 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 34 20 7b  t pager1-9.2.4 {
9c50: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
9c60: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9c70: 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 64 62 20  ab } } {128}.db 
9c80: 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a  close.db2 close.
9c90: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9ca0: 39 2e 33 2e 31 20 7b 0a 20 20 74 65 73 74 76 66  9.3.1 {.  testvf
9cb0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
9cc0: 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20    tv sectorsize 
9cd0: 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f  4096.  faultsim_
9ce0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
9cf0: 6e 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50  n..  execsql { P
9d00: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
9d10: 3d 20 31 30 32 34 20 7d 0a 20 20 66 6f 72 20 7b  = 1024 }.  for {
9d20: 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69 20 3c  set ii 0} {$ii <
9d30: 20 34 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 20   4} {incr ii} { 
9d40: 65 78 65 63 73 71 6c 20 22 43 52 45 41 54 45 20  execsql "CREATE 
9d50: 54 41 42 4c 45 20 74 24 7b 69 69 7d 28 61 2c 20  TABLE t${ii}(a, 
9d60: 62 29 22 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  b)" }.} {}.do_te
9d70: 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e 32 20  st pager1-9.3.2 
9d80: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
9d90: 74 65 73 74 2e 64 62 32 0a 0a 20 20 65 78 65 63  test.db2..  exec
9da0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
9db0: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39   page_size = 409
9dc0: 36 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79  6;.    PRAGMA sy
9dd0: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b  nchronous = OFF;
9de0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9df0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
9e00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
9e10: 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a 0a  a, b);.  } db2..
9e20: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
9e30: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
9e40: 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30 0a  ain.  B step 30.
9e50: 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31    list [B step 1
9e60: 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d  0000] [B finish]
9e70: 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .} {SQLITE_DONE 
9e80: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
9e90: 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e 33 20  st pager1-9.3.3 
9ea0: 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20  {.  db2 close.  
9eb0: 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65  db close.  tv de
9ec0: 6c 65 74 65 0a 20 20 66 69 6c 65 20 73 69 7a 65  lete.  file size
9ed0: 20 74 65 73 74 2e 64 62 32 0a 7d 20 5b 66 69 6c   test.db2.} [fil
9ee0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a  e size test.db].
9ef0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9f00: 39 2e 34 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  9.4.1 {.  faults
9f10: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
9f20: 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64  open.  sqlite3 d
9f30: 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78  b2 test.db2.  ex
9f40: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
9f50: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34  MA page_size = 4
9f60: 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54 45 20  096;.    CREATE 
9f70: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
9f80: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9f90: 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64   t2(a, b);.  } d
9fa0: 62 32 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  b2.  sqlite3_bac
9fb0: 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64  kup B db2 main d
9fc0: 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74 20 5b 42  b main.  list [B
9fd0: 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20   step 10000] [B 
9fe0: 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54  finish].} {SQLIT
9ff0: 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b  E_DONE SQLITE_OK
a000: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
a010: 2d 39 2e 34 2e 32 20 7b 0a 20 20 6c 69 73 74 20  -9.4.2 {.  list 
a020: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
a030: 64 62 32 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  db2] [file size 
a040: 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 30 20 30 7d  test.db].} {0 0}
a050: 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d  .db2 close..#---
a060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0a0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
a0b0: 61 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  at regardless of
a0c0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
a0d0: 6e 65 64 20 62 79 20 78 53 65 63 74 6f 72 53 69  ned by xSectorSi
a0e0: 7a 65 28 29 2c 20 74 68 65 0a 23 20 6d 69 6e 69  ze(), the.# mini
a0f0: 6d 75 6d 20 65 66 66 65 63 74 69 76 65 20 73 65  mum effective se
a100: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 35 31 32  ctor-size is 512
a110: 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
a120: 20 36 35 35 33 36 20 62 79 74 65 73 2e 0a 23 0a   65536 bytes..#.
a130: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
a140: 75 6c 74 20 31 0a 66 6f 72 65 61 63 68 20 73 65  ult 1.foreach se
a150: 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20 20 20 33  ctorsize {.    3
a160: 32 20 20 20 36 34 20 20 20 31 32 38 20 20 20 32  2   64   128   2
a170: 35 36 20 20 20 35 31 32 20 20 20 31 30 32 34 20  56   512   1024 
a180: 20 20 32 30 34 38 20 0a 20 20 20 20 34 30 39 36    2048 .    4096
a190: 20 38 31 39 32 20 31 36 33 38 34 20 33 32 37 36   8192 16384 3276
a1a0: 38 20 36 35 35 33 36 20 31 33 31 30 37 32 20 32  8 65536 131072 2
a1b0: 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74 76 20 73  62144.} {.  tv s
a1c0: 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63 74 6f  ectorsize $secto
a1d0: 72 73 69 7a 65 0a 20 20 74 76 20 64 65 76 63 68  rsize.  tv devch
a1e0: 61 72 20 7b 7d 0a 20 20 73 65 74 20 65 66 66 20  ar {}.  set eff 
a1f0: 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 69 66  $sectorsize.  if
a200: 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3c 20   {$sectorsize < 
a210: 35 31 32 7d 20 20 20 7b 20 73 65 74 20 65 66 66  512}   { set eff
a220: 20 35 31 32 20 7d 0a 20 20 69 66 20 7b 24 73 65   512 }.  if {$se
a230: 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33 36  ctorsize > 65536
a240: 7d 20 7b 20 73 65 74 20 65 66 66 20 36 35 35 33  } { set eff 6553
a250: 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70  6 }..  do_test p
a260: 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72  ager1-10.$sector
a270: 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 66 61 75  size.1 {.    fau
a280: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
a290: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66  _reopen.    db f
a2a0: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
a2b0: 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71  tring.    execsq
a2c0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
a2d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
a2e0: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 50  PERSIST;.      P
a2f0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
a300: 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20 42 45  = 1024;.      BE
a310: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45  GIN;.        CRE
a320: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
a330: 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  b);.        CREA
a340: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
a350: 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  );.        CREAT
a360: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29  E TABLE t3(a, b)
a370: 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ;.      COMMIT;.
a380: 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73      }.    file s
a390: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
a3a0: 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24 73  nal.  } [expr $s
a3b0: 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33  ectorsize > 6553
a3c0: 36 20 3f 20 36 35 35 33 36 20 3a 20 24 73 65 63  6 ? 65536 : $sec
a3d0: 74 6f 72 73 69 7a 65 5d 0a 0a 20 20 64 6f 5f 74  torsize]..  do_t
a3e0: 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73  est pager1-10.$s
a3f0: 65 63 74 6f 72 73 69 7a 65 2e 32 20 7b 0a 20 20  ectorsize.2 {.  
a400: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
a410: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a420: 33 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  3 VALUES(a_strin
a430: 67 28 33 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(300), a_string
a440: 28 33 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e  (300));.      IN
a450: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
a460: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20  ECT * FROM t3;  
a470: 20 20 20 20 20 20 2f 2a 20 20 32 20 2a 2f 0a 20        /*  2 */. 
a480: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
a490: 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t3 SELECT * FRO
a4a0: 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20  M t3;        /* 
a4b0: 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   4 */.      INSE
a4c0: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
a4d0: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20  T * FROM t3;    
a4e0: 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20      /*  8 */.   
a4f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a500: 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  3 SELECT * FROM 
a510: 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 31 36  t3;        /* 16
a520: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
a530: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
a540: 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20  * FROM t3;      
a550: 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 7d    /* 32 */.    }
a560: 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65  .  } {}..  do_te
a570: 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65  st pager1-10.$se
a580: 63 74 6f 72 73 69 7a 65 2e 33 20 7b 0a 20 20 20  ctorsize.3 {.   
a590: 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71   db close.    sq
a5a0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
a5b0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
a5c0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
a5d0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
a5e0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 7d      BEGIN;.    }
a5f0: 0a 20 20 20 20 72 65 63 75 72 73 69 76 65 5f 73  .    recursive_s
a600: 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62 20  elect 32 t3 {db 
a610: 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  eval "INSERT INT
a620: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32  O t2 VALUES(1, 2
a630: 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  )"}.    execsql 
a640: 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  {.      COMMIT;.
a650: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
a660: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20  ROM t2;.    }.  
a670: 7d 20 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f 74 65  } {1 2}..  do_te
a680: 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65  st pager1-10.$se
a690: 63 74 6f 72 73 69 7a 65 2e 34 20 7b 0a 20 20 20  ctorsize.4 {.   
a6a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
a6b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36   CREATE TABLE t6
a6c0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52  (a, b);.      CR
a6d0: 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c  EATE TABLE t7(a,
a6e0: 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54   b);.      CREAT
a6f0: 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29  E TABLE t5(a, b)
a700: 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42  ;.      DROP TAB
a710: 4c 45 20 74 36 3b 0a 20 20 20 20 20 20 44 52 4f  LE t6;.      DRO
a720: 50 20 54 41 42 4c 45 20 74 37 3b 0a 20 20 20 20  P TABLE t7;.    
a730: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  }.    execsql {.
a740: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
a750: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a760: 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t6(a, b);.    
a770: 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65 5f  }.    recursive_
a780: 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62  select 32 t3 {db
a790: 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e   eval "INSERT IN
a7a0: 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c 20  TO t5 VALUES(1, 
a7b0: 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  2)"}.    execsql
a7c0: 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b   {.      COMMIT;
a7d0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
a7e0: 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d 0a 20  FROM t5;.    }. 
a7f0: 20 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a 64 62   } {1 2}.  .}.db
a800: 20 63 6c 6f 73 65 0a 0a 74 76 20 73 65 63 74 6f   close..tv secto
a810: 72 73 69 7a 65 20 34 30 39 36 0a 64 6f 5f 74 65  rsize 4096.do_te
a820: 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e 31  st pager1.10.x.1
a830: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
a840: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
a850: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a860: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
a870: 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50  um = none;.    P
a880: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
a890: 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41  = 1024;.    CREA
a8a0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
a8b0: 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69    }.  for {set i
a8c0: 20 30 7d 20 7b 24 69 3c 33 30 7d 20 7b 69 6e 63   0} {$i<30} {inc
a8d0: 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  r i} {.    execs
a8e0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
a8f0: 20 74 31 20 56 41 4c 55 45 53 28 7a 65 72 6f 62   t1 VALUES(zerob
a900: 6c 6f 62 28 39 30 30 29 29 20 7d 0a 20 20 7d 0a  lob(900)) }.  }.
a910: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
a920: 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d 0a 64 6f  .db.} {32768}.do
a930: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e  _test pager1.10.
a940: 78 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  x.2 {.  execsql 
a950: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
a960: 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 44 52  LE t2(x);.    DR
a970: 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 7d  OP TABLE t2;.  }
a980: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
a990: 74 2e 64 62 0a 7d 20 7b 33 33 37 39 32 7d 0a 64  t.db.} {33792}.d
a9a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30  o_test pager1.10
a9b0: 2e 78 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .x.3 {.  execsql
a9c0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
a9d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a9e0: 32 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65 63 75  2(x);.  }.  recu
a9f0: 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 30 20  rsive_select 30 
aa00: 74 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  t1.  execsql {. 
aa10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
aa20: 74 33 28 78 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  t3(x);.    COMMI
aa30: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 62 20  T;.  }.} {}..db 
aa40: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
aa50: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
aa60: 61 75 6c 74 20 31 0a 66 61 75 6c 74 73 69 6d 5f  ault 1.faultsim_
aa70: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
aa80: 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  n.db func a_stri
aa90: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 64 6f 5f 65  ng a_string.do_e
aaa0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
aab0: 72 31 2d 31 31 2e 31 20 7b 0a 20 20 50 52 41 47  r1-11.1 {.  PRAG
aac0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
aad0: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 50 52 41 47  = DELETE;.  PRAG
aae0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
aaf0: 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  10;.  BEGIN;.   
ab00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a 7a   CREATE TABLE zz
ab10: 28 74 6f 70 20 50 52 49 4d 41 52 59 20 4b 45 59  (top PRIMARY KEY
ab20: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
ab30: 54 4f 20 7a 7a 20 56 41 4c 55 45 53 28 61 5f 73  TO zz VALUES(a_s
ab40: 74 72 69 6e 67 28 32 32 32 29 29 3b 0a 20 20 20  tring(222));.   
ab50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20   INSERT INTO zz 
ab60: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
ab70: 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28  (SELECT 222+max(
ab80: 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29  rowid) FROM zz))
ab90: 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e   FROM zz;.    IN
aba0: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c  SERT INTO zz SEL
abb0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45  ECT a_string((SE
abc0: 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77  LECT 222+max(row
abd0: 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52  id) FROM zz)) FR
abe0: 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52  OM zz;.    INSER
abf0: 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54  T INTO zz SELECT
ac00: 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43   a_string((SELEC
ac10: 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29  T 222+max(rowid)
ac20: 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20   FROM zz)) FROM 
ac30: 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  zz;.    INSERT I
ac40: 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f  NTO zz SELECT a_
ac50: 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32  string((SELECT 2
ac60: 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52  22+max(rowid) FR
ac70: 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b  OM zz)) FROM zz;
ac80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ac90: 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72   zz SELECT a_str
aca0: 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b  ing((SELECT 222+
acb0: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
acc0: 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20  zz)) FROM zz;.  
acd0: 43 4f 4d 4d 49 54 3b 0a 20 20 42 45 47 49 4e 3b  COMMIT;.  BEGIN;
ace0: 0a 20 20 20 20 55 50 44 41 54 45 20 7a 7a 20 53  .    UPDATE zz S
acf0: 45 54 20 74 6f 70 20 3d 20 61 5f 73 74 72 69 6e  ET top = a_strin
ad00: 67 28 33 34 35 29 3b 0a 7d 20 7b 64 65 6c 65 74  g(345);.} {delet
ad10: 65 7d 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75 74  e}..proc lockout
ad20: 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b   {method args} {
ad30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
ad40: 4f 45 52 52 20 7d 0a 74 76 20 73 63 72 69 70 74  OERR }.tv script
ad50: 20 6c 6f 63 6b 6f 75 74 0a 74 76 20 66 69 6c 74   lockout.tv filt
ad60: 65 72 20 7b 78 57 72 69 74 65 20 78 54 72 75 6e  er {xWrite xTrun
ad70: 63 61 74 65 20 78 53 79 6e 63 7d 0a 64 6f 5f 63  cate xSync}.do_c
ad80: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67  atchsql_test pag
ad90: 65 72 31 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d 49  er1-11.2 { COMMI
ada0: 54 20 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f  T } {1 {disk I/O
adb0: 20 65 72 72 6f 72 7d 7d 0a 0a 74 76 20 73 63 72   error}}..tv scr
adc0: 69 70 74 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  ipt {}.do_test p
add0: 61 67 65 72 31 2d 31 31 2e 33 20 7b 0a 20 20 73  ager1-11.3 {.  s
ade0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
adf0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
ae00: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
ae10: 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54  l_mode = TRUNCAT
ae20: 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  E;.    PRAGMA in
ae30: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
ae40: 20 7d 20 64 62 32 0a 7d 20 7b 74 72 75 6e 63 61   } db2.} {trunca
ae50: 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70  te ok}.do_test p
ae60: 61 67 65 72 31 2d 31 31 2e 34 20 7b 0a 20 20 64  ager1-11.4 {.  d
ae70: 62 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20  b2 close.  file 
ae80: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
ae90: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f  ournal.} {0}.do_
aea0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
aeb0: 65 72 31 2d 31 31 2e 35 20 7b 20 53 45 4c 45 43  er1-11.5 { SELEC
aec0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
aed0: 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62 20 63 6c 6f  zz } {32}.db clo
aee0: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 20 20 0a  se.tv delete.  .
aef0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
af00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
af40: 74 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73  t "PRAGMA page_s
af50: 69 7a 65 22 0a 23 0a 74 65 73 74 76 66 73 20 74  ize".#.testvfs t
af60: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20  v -default 1.tv 
af70: 73 65 63 74 6f 72 73 69 7a 65 20 31 30 32 34 0a  sectorsize 1024.
af80: 66 6f 72 65 61 63 68 20 70 61 67 65 73 69 7a 65  foreach pagesize
af90: 20 7b 0a 20 20 20 20 35 31 32 20 20 20 31 30 32   {.    512   102
afa0: 34 20 20 20 32 30 34 38 20 34 30 39 36 20 38 31  4   2048 4096 81
afb0: 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20 0a  92 16384 32768 .
afc0: 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  } {.  faultsim_d
afd0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
afe0: 0a 0a 20 20 23 20 54 68 65 20 73 65 63 74 6f 72  ..  # The sector
aff0: 2d 73 69 7a 65 20 28 61 63 63 6f 72 64 69 6e 67  -size (according
b000: 20 74 6f 20 74 68 65 20 56 46 53 29 20 69 73 20   to the VFS) is 
b010: 31 30 32 34 20 62 79 74 65 73 2e 20 53 6f 20 69  1024 bytes. So i
b020: 66 20 74 68 65 0a 20 20 23 20 70 61 67 65 2d 73  f the.  # page-s
b030: 69 7a 65 20 72 65 71 75 65 73 74 65 64 20 75 73  ize requested us
b040: 69 6e 67 20 22 50 52 41 47 4d 41 20 70 61 67 65  ing "PRAGMA page
b050: 5f 73 69 7a 65 22 20 69 73 20 67 72 65 61 74 65  _size" is greate
b060: 72 20 74 68 61 6e 20 74 68 65 0a 20 20 23 20 63  r than the.  # c
b070: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
b080: 65 20 6f 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e of SQLITE_MAX_
b090: 50 41 47 45 5f 53 49 5a 45 2c 20 74 68 65 6e 20  PAGE_SIZE, then 
b0a0: 74 68 65 20 65 66 66 65 63 74 69 76 65 20 0a 20  the effective . 
b0b0: 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72 65 6d   # page-size rem
b0c0: 61 69 6e 73 20 31 30 32 34 20 62 79 74 65 73 2e  ains 1024 bytes.
b0d0: 0a 20 20 23 0a 20 20 73 65 74 20 65 66 66 20 24  .  #.  set eff $
b0e0: 70 61 67 65 73 69 7a 65 0a 20 20 69 66 20 7b 24  pagesize.  if {$
b0f0: 65 66 66 20 3e 20 24 3a 3a 53 51 4c 49 54 45 5f  eff > $::SQLITE_
b100: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 7d 20 7b  MAX_PAGE_SIZE} {
b110: 20 73 65 74 20 65 66 66 20 31 30 32 34 20 7d 0a   set eff 1024 }.
b120: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
b130: 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 31  1-12.$pagesize.1
b140: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
b150: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  b2 test.db.    e
b160: 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 50  xecsql ".      P
b170: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
b180: 3d 20 24 70 61 67 65 73 69 7a 65 3b 0a 20 20 20  = $pagesize;.   
b190: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76     CREATE VIEW v
b1a0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
b1b0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
b1c0: 0a 20 20 20 20 22 20 64 62 32 0a 20 20 20 20 66  .    " db2.    f
b1d0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
b1e0: 0a 20 20 7d 20 24 65 66 66 0a 20 20 64 6f 5f 74  .  } $eff.  do_t
b1f0: 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70  est pager1-12.$p
b200: 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20  agesize.2 {.    
b210: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
b220: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
b230: 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  { .      SELECT 
b240: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b  count(*) FROM v;
b250: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
b260: 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20  in.page_size;.  
b270: 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69 73    } db2.  } [lis
b280: 74 20 31 20 24 65 66 66 5d 0a 20 20 64 6f 5f 74  t 1 $eff].  do_t
b290: 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70  est pager1-12.$p
b2a0: 61 67 65 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20  agesize.3 {.    
b2b0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
b2c0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
b2d0: 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50   FROM v;.      P
b2e0: 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f  RAGMA main.page_
b2f0: 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  size;.    }.  } 
b300: 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20  [list 1 $eff].  
b310: 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 64 62 20 63  db2 close.}.db c
b320: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
b330: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
b340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
b380: 74 20 73 70 65 63 61 6c 20 22 50 52 41 47 4d 41  t specal "PRAGMA
b390: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
b3a0: 52 53 49 53 54 22 20 74 65 73 74 20 63 61 73 65  RSIST" test case
b3b0: 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33  s..#.# pager1-13
b3c0: 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73 74 73  .1.*: This tests
b3d0: 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20   a special case 
b3e0: 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 70  encountered in p
b3f0: 65 72 73 69 73 74 65 6e 74 20 0a 23 20 20 20 20  ersistent .#    
b400: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
b410: 6e 61 6c 20 6d 6f 64 65 3a 20 49 66 20 74 68 65  nal mode: If the
b420: 20 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61   journal associa
b430: 74 65 64 20 77 69 74 68 20 61 20 74 72 61 6e 73  ted with a trans
b440: 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 20  action.#        
b450: 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
b460: 65 72 20 74 68 61 6e 20 74 68 65 20 6a 6f 75 72  er than the jour
b470: 6e 61 6c 20 66 69 6c 65 20 28 62 65 63 61 75 73  nal file (becaus
b480: 65 20 61 20 70 72 65 76 69 6f 75 73 20 0a 23 20  e a previous .# 
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
b4a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65 66 74 20  ransaction left 
b4b0: 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e 6f 6e  a very large non
b4c0: 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  -hot journal fil
b4d0: 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20  e in the.#      
b4e0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 2d 73            file-s
b4f0: 79 73 74 65 6d 29 2c 20 74 68 65 6e 20 53 51 4c  ystem), then SQL
b500: 69 74 65 20 68 61 73 20 74 6f 20 62 65 20 63 61  ite has to be ca
b510: 72 65 66 75 6c 20 74 68 61 74 20 74 68 65 72 65  reful that there
b520: 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20   is.#           
b530: 20 20 20 20 20 6e 6f 74 20 61 20 6a 6f 75 72 6e       not a journ
b540: 61 6c 2d 68 65 61 64 65 72 20 6c 65 66 74 20 6f  al-header left o
b550: 76 65 72 20 66 72 6f 6d 20 61 20 70 72 65 76 69  ver from a previ
b560: 6f 75 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ous transaction.
b570: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
b580: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
b590: 6c 6f 77 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lowing the journ
b5a0: 61 6c 20 63 6f 6e 74 65 6e 74 20 6a 75 73 74 20  al content just 
b5b0: 77 72 69 74 74 65 6e 2e 0a 23 20 20 20 20 20 20  written..#      
b5c0: 20 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65            If the
b5d0: 72 65 20 69 73 2c 20 61 6e 64 20 74 68 65 20 70  re is, and the p
b5e0: 72 6f 63 65 73 73 20 63 72 61 73 68 65 73 20 73  rocess crashes s
b5f0: 6f 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  o that the journ
b600: 61 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  al.#            
b610: 20 20 20 20 62 65 63 6f 6d 65 73 20 61 20 68 6f      becomes a ho
b620: 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 75  t-journal and mu
b630: 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
b640: 6b 20 62 79 20 61 6e 6f 74 68 65 72 0a 23 20 20  k by another.#  
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
b660: 6f 63 65 73 73 2c 20 74 68 65 72 65 20 69 73 20  ocess, there is 
b670: 61 20 64 61 6e 67 65 72 20 74 68 61 74 20 74 68  a danger that th
b680: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
b690: 6d 61 79 20 72 6f 6c 6c 0a 23 20 20 20 20 20 20  may roll.#      
b6a0: 20 20 20 20 20 20 20 20 20 20 62 61 63 6b 20 74            back t
b6b0: 68 65 20 61 62 6f 72 74 65 64 20 74 72 61 6e 73  he aborted trans
b6c0: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 6e  action, then con
b6d0: 74 69 6e 75 65 20 63 6f 70 79 69 6e 67 20 64 61  tinue copying da
b6e0: 74 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ta.#            
b6f0: 20 20 20 20 66 72 6f 6d 20 61 6e 20 6f 6c 64 65      from an olde
b700: 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 72  r transaction fr
b710: 6f 6d 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  om the remainder
b720: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
b730: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b740: 20 20 53 65 65 20 74 68 65 20 73 79 6e 63 4a 6f    See the syncJo
b750: 75 72 6e 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e  urnal() function
b760: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 23 0a   for details..#.
b770: 23 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 2a 3a  # pager1-13.2.*:
b780: 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 74 68   Same test as th
b790: 65 20 70 72 65 76 69 6f 75 73 2e 20 54 68 69 73  e previous. This
b7a0: 20 74 69 6d 65 2c 20 74 68 72 6f 77 20 61 6e 20   time, throw an 
b7b0: 69 6e 64 65 78 20 69 6e 74 6f 0a 23 20 20 20 20  index into.#    
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
b7d0: 6d 69 78 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  mix to make the 
b7e0: 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
b7f0: 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63  more likely to c
b800: 61 74 63 68 0a 23 20 20 20 20 20 20 20 20 20 20  atch.#          
b810: 20 20 20 20 20 20 65 72 72 6f 72 73 2e 0a 23 0a        errors..#.
b820: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
b830: 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 20  ult 1.tv script 
b840: 78 53 79 6e 63 43 62 0a 74 76 20 66 69 6c 74 65  xSyncCb.tv filte
b850: 72 20 78 53 79 6e 63 0a 70 72 6f 63 20 78 53 79  r xSync.proc xSy
b860: 6e 63 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c  ncCb {method fil
b870: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
b880: 73 65 74 20 74 20 5b 66 69 6c 65 20 74 61 69 6c  set t [file tail
b890: 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 69 66   $filename].  if
b8a0: 20 7b 24 74 20 3d 3d 20 22 74 65 73 74 2e 64 62   {$t == "test.db
b8b0: 22 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  "} faultsim_save
b8c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b8d0: 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64  _OK.}.faultsim_d
b8e0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
b8f0: 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e  .db func a_strin
b900: 67 20 61 5f 73 74 72 69 6e 67 0a 0a 23 20 54 68  g a_string..# Th
b910: 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  e UPDATE stateme
b920: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
b930: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 20   this test case 
b940: 63 72 65 61 74 65 73 20 61 20 72 65 61 6c 6c 79  creates a really
b950: 20 62 69 67 0a 23 20 6a 6f 75 72 6e 61 6c 2e 20   big.# journal. 
b960: 53 69 6e 63 65 20 74 68 65 20 63 61 63 68 65 2d  Since the cache-
b970: 73 69 7a 65 20 69 73 20 6f 6e 6c 79 20 31 30 20  size is only 10 
b980: 70 61 67 65 73 2c 20 74 68 65 20 6a 6f 75 72 6e  pages, the journ
b990: 61 6c 20 63 6f 6e 74 61 69 6e 73 20 0a 23 20 66  al contains .# f
b9a0: 72 65 71 75 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  requent journal 
b9b0: 68 65 61 64 65 72 73 2e 0a 23 0a 64 6f 5f 65 78  headers..#.do_ex
b9c0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
b9d0: 31 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 50 52 41  1-13.1.1 {.  PRA
b9e0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
b9f0: 31 30 32 34 3b 0a 20 20 50 52 41 47 4d 41 20 6a  1024;.  PRAGMA j
ba00: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
ba10: 52 53 49 53 54 3b 0a 20 20 50 52 41 47 4d 41 20  RSIST;.  PRAGMA 
ba20: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
ba30: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52  .  BEGIN;.    CR
ba40: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
ba50: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
ba60: 4b 45 59 2c 20 62 20 42 4c 4f 42 29 3b 0a 20 20  KEY, b BLOB);.  
ba70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ba80: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
ba90: 73 74 72 69 6e 67 28 34 30 30 29 29 3b 0a 20 20  string(400));.  
baa0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
bab0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
bac0: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
bad0: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
bae0: 20 20 20 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45     2 */.    INSE
baf0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
bb00: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
bb10: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
bb20: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a          /*   4 *
bb30: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
bb40: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
bb50: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
bb60: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
bb70: 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20    /*   8 */.    
bb80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
bb90: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
bba0: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
bbb0: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
bbc0: 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  16 */.    INSERT
bbd0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
bbe0: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
bbf0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
bc00: 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a        /*  32 */.
bc10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bc20: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
bc30: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
bc40: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
bc50: 2f 2a 20 20 36 34 20 2a 2f 0a 20 20 20 20 49 4e  /*  64 */.    IN
bc60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
bc70: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
bc80: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
bc90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 32 38            /* 128
bca0: 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20   */.  COMMIT;.  
bcb0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
bcc0: 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 3b  = a_string(400);
bcd0: 0a 7d 20 7b 70 65 72 73 69 73 74 7d 0a 0a 69 66  .} {persist}..if
bce0: 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
bcf0: 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69  m(platform)!="wi
bd00: 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 52 75 6e 20  ndows"} {.# Run 
bd10: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66 20  transactions of 
bd20: 69 6e 63 72 65 61 73 69 6e 67 20 73 69 7a 65 73  increasing sizes
bd30: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
bd40: 65 20 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20  e (or more than 
bd50: 6f 6e 65 29 0a 23 20 6f 66 20 74 68 65 73 65 20  one).# of these 
bd60: 77 69 6c 6c 20 77 72 69 74 65 20 6a 75 73 74 20  will write just 
bd70: 65 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20 74  enough content t
bd80: 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f  hat one of the o
bd90: 6c 64 20 68 65 61 64 65 72 73 20 63 72 65 61 74  ld headers creat
bda0: 65 64 20 0a 23 20 62 79 20 74 68 65 20 74 72 61  ed .# by the tra
bdb0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
bdc0: 62 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65 73  block above lies
bdd0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
bde0: 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 23  er the content.#
bdf0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20 74   journalled by t
be00: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
be10: 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b 73  action..#.for {s
be20: 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c  et nUp 1} {$nUp<
be30: 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b  64} {incr nUp} {
be40: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
be50: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32  st pager1-13.1.2
be60: 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55  .$nUp.1 { .    U
be70: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d  PDATE t1 SET b =
be80: 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57   a_string(399) W
be90: 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20  HERE a <= $nUp. 
bea0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73   } {}.  do_execs
beb0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
bec0: 33 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50  3.1.2.$nUp.2 { P
bed0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
bee0: 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a 20  check } {ok} .. 
bef0: 20 23 20 54 72 79 20 74 6f 20 61 63 63 65 73 73   # Try to access
bf00: 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66   the snapshot of
bf10: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
bf20: 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33 20  ..  #.  sqlite3 
bf30: 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20  db2 sv_test.db. 
bf40: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
bf50: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a  13.1.2.$nUp.3 {.
bf60: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
bf70: 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28  LECT sum(length(
bf80: 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  b)) FROM t1 } db
bf90: 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38  2.  } [expr {128
bfa0: 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d  *400 - ($nUp-1)}
bfb0: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
bfc0: 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 34  r1-13.1.2.$nUp.4
bfd0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
bfe0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
bff0: 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20  y_check } db2.  
c000: 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f  } {ok}.  db2 clo
c010: 73 65 0a 7d 0a 7d 0a 0a 69 66 20 7b 24 3a 3a 74  se.}.}..if {$::t
c020: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74  cl_platform(plat
c030: 66 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22  form)!="windows"
c040: 7d 20 7b 0a 23 20 53 61 6d 65 20 74 65 73 74 20  } {.# Same test 
c050: 61 73 20 61 62 6f 76 65 2e 20 42 75 74 20 74 68  as above. But th
c060: 69 73 20 74 69 6d 65 20 77 69 74 68 20 61 6e 20  is time with an 
c070: 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62  index on the tab
c080: 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  le..#.do_execsql
c090: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
c0a0: 32 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 49  2.1 {.  CREATE I
c0b0: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29  NDEX i1 ON t1(b)
c0c0: 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45  ;.  UPDATE t1 SE
c0d0: 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34  T b = a_string(4
c0e0: 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b 73  00);.} {}.for {s
c0f0: 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c  et nUp 1} {$nUp<
c100: 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b  64} {incr nUp} {
c110: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
c120: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32  st pager1-13.2.2
c130: 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55  .$nUp.1 { .    U
c140: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d  PDATE t1 SET b =
c150: 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57   a_string(399) W
c160: 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20  HERE a <= $nUp. 
c170: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73   } {}.  do_execs
c180: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c190: 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50  3.2.2.$nUp.2 { P
c1a0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
c1b0: 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20 20  check } {ok} .  
c1c0: 73 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74  sqlite3 db2 sv_t
c1d0: 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74  est.db.  do_test
c1e0: 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24   pager1-13.2.2.$
c1f0: 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  nUp.3 {.    exec
c200: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d  sql { SELECT sum
c210: 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d  (length(b)) FROM
c220: 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65   t1 } db2.  } [e
c230: 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28  xpr {128*400 - (
c240: 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74  $nUp-1)}].  do_t
c250: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
c260: 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65  2.$nUp.4 {.    e
c270: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
c280: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
c290: 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20  } db2.  } {ok}. 
c2a0: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a   db2 close.}.}..
c2b0: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
c2c0: 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  te..#-----------
c2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
c310: 20 54 65 73 74 20 73 70 65 63 61 6c 20 22 50 52   Test specal "PR
c320: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
c330: 65 3d 4f 46 46 22 20 74 65 73 74 20 63 61 73 65  e=OFF" test case
c340: 73 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65  s..#.faultsim_de
c350: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
c360: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
c370: 70 61 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b 0a  pager1-14.1.1 {.
c380: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
c390: 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20 43  _mode = OFF;.  C
c3a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
c3b0: 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  , b);.  BEGIN;. 
c3c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
c3d0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
c3e0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45    COMMIT;.  SELE
c3f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  CT * FROM t1;.} 
c400: 7b 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61 74  {off 1 2}.do_cat
c410: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
c420: 31 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45 47  1-14.1.2 {.  BEG
c430: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
c440: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
c450: 20 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b 3b   4);.  ROLLBACK;
c460: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78 65  .} {0 {}}.do_exe
c470: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c480: 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45  -14.1.3 {.  SELE
c490: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  CT * FROM t1;.} 
c4a0: 7b 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73 71  {1 2}.do_catchsq
c4b0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34  l_test pager1-14
c4c0: 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b 0a  .1.4 {.  BEGIN;.
c4d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
c4e0: 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20  t1(rowid, a, b) 
c4f0: 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62  SELECT a+3, b, b
c500: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
c510: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77  SERT INTO t1(row
c520: 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54  id, a, b) SELECT
c530: 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20   a+3, b, b FROM 
c540: 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d 41 52  t1;.} {1 {PRIMAR
c550: 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20 75 6e  Y KEY must be un
c560: 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  ique}}.do_execsq
c570: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34  l_test pager1-14
c580: 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49 54 3b  .1.5 {.  COMMIT;
c590: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
c5a0: 20 74 31 3b 0a 7d 20 7b 31 20 32 20 32 20 32 7d   t1;.} {1 2 2 2}
c5b0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
c5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
c600: 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e 64 20  est opening and 
c610: 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65  closing the page
c620: 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77 69 74  r sub-system wit
c630: 68 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c 75  h different valu
c640: 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73 71 6c  es.# for the sql
c650: 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69 6c  ite3_vfs.szOsFil
c660: 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a 66 61  e variable..#.fa
c670: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
c680: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63  d_reopen.do_exec
c690: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
c6a0: 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  15.0 {.  CREATE 
c6b0: 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29 3b 0a  TABLE tx(y, z);.
c6c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78    INSERT INTO tx
c6d0: 20 56 41 4c 55 45 53 28 27 41 79 75 74 74 68 61   VALUES('Ayuttha
c6e0: 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27 29 3b  ya', 'Beijing');
c6f0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
c700: 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64 6f 6e  x VALUES('London
c710: 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d 20 7b  ', 'Tokyo');.} {
c720: 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 20 7b  }.db close.for {
c730: 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35 31 33  set i 0} {$i<513
c740: 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b 0a 20  } {incr i 3} {. 
c750: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
c760: 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69 6c 65  ault 1 -szosfile
c770: 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20 64 62   $i.  sqlite3 db
c780: 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 65 78   test.db.  do_ex
c790: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
c7a0: 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20 20 20  1-15.$i.1 {.    
c7b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 78  SELECT * FROM tx
c7c0: 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61 79 61  ;.  } {Ayutthaya
c7d0: 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f 6e 20   Beijing London 
c7e0: 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c 6f 73  Tokyo}.  db clos
c7f0: 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a  e.  tv delete.}.
c800: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68  -----------.# Ch
c850: 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 6e  eck that it is n
c860: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  ot possible to o
c870: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
c880: 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c 6c 20  ile if the full 
c890: 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20 61 73  path.# to the as
c8a0: 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e 61 6c  sociated journal
c8b0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6c 6f   file will be lo
c8c0: 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65  nger than sqlite
c8d0: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
c8e0: 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d  ..#.testvfs tv -
c8f0: 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72  default 1.tv scr
c900: 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76 20 66  ipt xOpenCb.tv f
c910: 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72 6f 63  ilter xOpen.proc
c920: 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68 6f 64   xOpenCb {method
c930: 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20   filename args} 
c940: 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c 65 5f 6c  {.  set ::file_l
c950: 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  en [string lengt
c960: 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 7d 0a 73  h $filename].}.s
c970: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
c980: 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  b.db close.tv de
c990: 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65 74 20 69  lete..for {set i
c9a0: 69 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f  i [expr $::file_
c9b0: 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20 3c 20 5b  len-5]} {$ii < [
c9c0: 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e  expr $::file_len
c9d0: 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69 69 7d 20  +20]} {incr ii} 
c9e0: 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d  {.  testvfs tv -
c9f0: 64 65 66 61 75 6c 74 20 31 20 2d 6d 78 70 61 74  default 1 -mxpat
ca00: 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20 23 20 54  hname $ii..  # T
ca10: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
ca20: 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 66 69   full path to fi
ca30: 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a 6f 75 72  le "test.db-jour
ca40: 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66 69 6c 65  nal" is ($::file
ca50: 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20 49 66 20  _len+8)..  # If 
ca60: 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 73  the configured s
ca70: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
ca80: 68 6e 61 6d 65 20 76 61 6c 75 65 20 67 72 65 61  hname value grea
ca90: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
caa0: 6c 20 74 6f 0a 20 20 23 20 74 68 69 73 2c 20 74  l to.  # this, t
cab0: 68 65 6e 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hen the file can
cac0: 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65   be opened. Othe
cad0: 72 77 69 73 65 2c 20 69 74 20 63 61 6e 6e 6f 74  rwise, it cannot
cae0: 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 69 69 20  ..  #.  if {$ii 
caf0: 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65  >= [expr $::file
cb00: 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20 20 20 73  _len+8]} {.    s
cb10: 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d 0a 20 20  et res {0 {}}.  
cb20: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74  } else {.    set
cb30: 20 72 65 73 20 7b 31 20 7b 75 6e 61 62 6c 65 20   res {1 {unable 
cb40: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
cb50: 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a 20 20 64   file}}.  }..  d
cb60: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 36  o_test pager1-16
cb70: 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20 6c 69 73  .1.$ii {.    lis
cb80: 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69 74  t [catch { sqlit
cb90: 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d 20  e3 db test.db } 
cba0: 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 24 72  msg] $msg.  } $r
cbb0: 65 73 0a 0a 20 20 63 61 74 63 68 20 7b 64 62 20  es..  catch {db 
cbc0: 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64 65 6c 65  close}.  tv dele
cbd0: 74 65 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  te.}...#--------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc20: 2d 0a 23 20 54 65 73 74 20 74 68 65 20 70 61 67  -.# Test the pag
cc30: 65 72 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 20  ers response to 
cc40: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
cc50: 20 72 65 71 75 65 73 74 69 6e 67 20 69 6c 6c 65   requesting ille
cc60: 67 61 6c 20 70 61 67 65 20 0a 23 20 6e 75 6d 62  gal page .# numb
cc70: 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54 68 65  ers:.#.#   + The
cc80: 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c 0a 23   locking page,.#
cc90: 20 20 20 2b 20 50 61 67 65 20 30 2c 0a 23 20 20     + Page 0,.#  
cca0: 20 2b 20 41 20 70 61 67 65 20 77 69 74 68 20 61   + A page with a
ccb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
ccc0: 61 74 65 72 20 74 68 61 6e 20 28 32 5e 33 31 2d  ater than (2^31-
ccd0: 31 29 2e 0a 23 0a 23 20 54 68 65 73 65 20 74 65  1)..#.# These te
cce0: 73 74 73 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  sts will not wor
ccf0: 6b 20 69 66 20 53 51 4c 49 54 45 5f 44 49 52 45  k if SQLITE_DIRE
cd00: 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
cd10: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49 6e 0a   is defined. In.
cd20: 23 20 74 68 61 74 20 63 61 73 65 20 49 4f 20 65  # that case IO e
cd30: 72 72 6f 72 73 20 61 72 65 20 73 6f 6d 65 74 69  rrors are someti
cd40: 6d 65 73 20 72 65 70 6f 72 74 65 64 20 69 6e 73  mes reported ins
cd50: 74 65 61 64 20 6f 66 20 53 51 4c 49 54 45 5f 43  tead of SQLITE_C
cd60: 4f 52 52 55 50 54 2e 0a 23 0a 69 66 63 61 70 61  ORRUPT..#.ifcapa
cd70: 62 6c 65 20 21 64 69 72 65 63 74 5f 72 65 61 64  ble !direct_read
cd80: 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72   {.do_test pager
cd90: 31 2d 31 38 2e 31 20 7b 0a 20 20 66 61 75 6c 74  1-18.1 {.  fault
cda0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
cdb0: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
cdc0: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
cdd0: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  g.  execsql { . 
cde0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
cdf0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
ce00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
ce10: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
ce20: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
ce30: 28 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20  (a_string(500), 
ce40: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 29 3b 0a  a_string(200));.
ce50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ce60: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
ce70: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
ce80: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
ce90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cea0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
ceb0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
cec0: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
ced0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cee0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
cef0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
cf00: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
cf10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cf20: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
cf30: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
cf40: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
cf50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cf60: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
cf70: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
cf80: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
cf90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cfa0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
cfb0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
cfc0: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
cfd0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cfe0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
cff0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d000: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d010: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
d020: 20 70 61 67 65 72 31 2d 31 38 2e 32 20 7b 0a 20   pager1-18.2 {. 
d030: 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e   set root [db on
d040: 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61  e "SELECT rootpa
d050: 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ge FROM sqlite_m
d060: 61 73 74 65 72 22 5d 0a 20 20 73 65 74 20 6c 6f  aster"].  set lo
d070: 63 6b 69 6e 67 70 61 67 65 20 5b 65 78 70 72 20  ckingpage [expr 
d080: 28 30 78 31 30 30 30 30 2f 31 30 32 34 29 20 2b  (0x10000/1024) +
d090: 20 31 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   1].  execsql {.
d0a0: 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61      PRAGMA writa
d0b0: 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a  ble_schema = 1;.
d0c0: 20 20 20 20 55 50 44 41 54 45 20 73 71 6c 69 74      UPDATE sqlit
d0d0: 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f  e_master SET roo
d0e0: 74 70 61 67 65 20 3d 20 24 6c 6f 63 6b 69 6e 67  tpage = $locking
d0f0: 70 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  page;.  }.  sqli
d100: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
d110: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
d120: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
d130: 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20  M t1 } db2.} {1 
d140: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
d150: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
d160: 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f  d}}.db2 close.do
d170: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e  _test pager1-18.
d180: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
d190: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
d1a0: 20 74 32 28 78 29 3b 0a 20 20 20 20 49 4e 53 45   t2(x);.    INSE
d1b0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
d1c0: 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30 30 29  S(a_string(5000)
d1d0: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 70 67 6e  );.  }.  set pgn
d1e0: 6f 20 5b 65 78 70 72 20 28 5b 66 69 6c 65 20 73  o [expr ([file s
d1f0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 2f 20 31  ize test.db] / 1
d200: 30 32 34 29 2d 32 5d 0a 20 20 68 65 78 69 6f 5f  024)-2].  hexio_
d210: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65  write test.db [e
d220: 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30  xpr ($pgno-1)*10
d230: 32 34 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73  24] 00000000.  s
d240: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
d250: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  db.  catchsql { 
d260: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29  SELECT length(x)
d270: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
d280: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
d290: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
d2a0: 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73  ormed}}.db2 clos
d2b0: 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  e.do_test pager1
d2c0: 2d 31 38 2e 34 20 7b 0a 20 20 68 65 78 69 6f 5f  -18.4 {.  hexio_
d2d0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65  write test.db [e
d2e0: 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30  xpr ($pgno-1)*10
d2f0: 32 34 5d 20 39 30 30 30 30 30 30 30 0a 20 20 73  24] 90000000.  s
d300: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
d310: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  db.  catchsql { 
d320: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29  SELECT length(x)
d330: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
d340: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
d350: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
d360: 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73  ormed}}.db2 clos
d370: 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  e.do_test pager1
d380: 2d 31 38 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65  -18.5 {.  sqlite
d390: 33 20 64 62 20 22 22 0a 20 20 65 78 65 63 73 71  3 db "".  execsq
d3a0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
d3b0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
d3c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d3d0: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52  t2(a, b);.    PR
d3e0: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
d3f0: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50  hema = 1;.    UP
d400: 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  DATE sqlite_mast
d410: 65 72 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d  er SET rootpage=
d420: 35 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  5 WHERE tbl_name
d430: 20 3d 20 27 74 31 27 3b 0a 20 20 20 20 50 52 41   = 't1';.    PRA
d440: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
d450: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 41 4c 54  ema = 0;.    ALT
d460: 45 52 20 54 41 42 4c 45 20 74 31 20 52 45 4e 41  ER TABLE t1 RENA
d470: 4d 45 20 54 4f 20 78 31 3b 0a 20 20 7d 0a 20 20  ME TO x1;.  }.  
d480: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
d490: 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 0a 7d 20  T * FROM x1 }.} 
d4a0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
d4b0: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
d4c0: 72 6d 65 64 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a  rmed}}.db close.
d4d0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
d4e0: 31 38 2e 36 20 7b 0a 20 20 66 61 75 6c 74 73 69  18.6 {.  faultsi
d4f0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
d500: 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
d510: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
d520: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
d530: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
d540: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
d550: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
d560: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d570: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
d580: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 49  ing(800));.    I
d590: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
d5a0: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30  LUES(a_string(80
d5b0: 30 29 29 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20  0));.  }..  set 
d5c0: 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45  root [db one "SE
d5d0: 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52  LECT rootpage FR
d5e0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
d5f0: 22 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 0a 20  "].  db close.. 
d600: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
d610: 74 2e 64 62 20 5b 65 78 70 72 20 28 24 72 6f 6f  t.db [expr ($roo
d620: 74 2d 31 29 2a 31 30 32 34 20 2b 20 38 5d 20 30  t-1)*1024 + 8] 0
d630: 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65  0000000.  sqlite
d640: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63  3 db test.db.  c
d650: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
d660: 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20   length(x) FROM 
d670: 74 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62  t1 }.} {1 {datab
d680: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d690: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 7d 0a  s malformed}}.}.
d6a0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
d6b0: 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  19.1 {.  sqlite3
d6c0: 20 64 62 20 22 22 0a 20 20 64 62 20 66 75 6e 63   db "".  db func
d6d0: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
d6e0: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
d6f0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
d700: 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 50  ize = 512;.    P
d710: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
d720: 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52 45 41 54  m = 1;.    CREAT
d730: 45 20 54 41 42 4c 45 20 74 31 28 61 61 2c 20 61  E TABLE t1(aa, a
d740: 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c 20 61  b, ac, ad, ae, a
d750: 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c 20 61  f, ag, ah, ai, a
d760: 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61  j, ak, al, am, a
d770: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d780: 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c 20 62         ba, bb, b
d790: 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c 20 62  c, bd, be, bf, b
d7a0: 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62  g, bh, bi, bj, b
d7b0: 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20  k, bl, bm, bn,. 
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c 20 63     ca, cb, cc, c
d7e0: 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c 20 63  d, ce, cf, cg, c
d7f0: 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63  h, ci, cj, ck, c
d800: 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20  l, cm, cn,.     
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
d820: 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c 20 64  a, db, dc, dd, d
d830: 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c 20 64  e, df, dg, dh, d
d840: 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64  i, dj, dk, dl, d
d850: 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, dn,.         
d860: 20 20 20 20 20 20 20 20 20 20 20 65 61 2c 20 65             ea, e
d870: 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c 20 65  b, ec, ed, ee, e
d880: 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c 20 65  f, eg, eh, ei, e
d890: 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65  j, ek, el, em, e
d8a0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d8b0: 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c 20 66         fa, fb, f
d8c0: 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c 20 66  c, fd, fe, ff, f
d8d0: 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66  g, fh, fi, fj, f
d8e0: 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20  k, fl, fm, fn,. 
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c 20 67     ga, gb, gc, g
d910: 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c 20 67  d, ge, gf, gg, g
d920: 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67  h, gi, gj, gk, g
d930: 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20  l, gm, gn,.     
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
d950: 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c 20 68  a, hb, hc, hd, h
d960: 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c 20 68  e, hf, hg, hh, h
d970: 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68  i, hj, hk, hl, h
d980: 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, hn,.         
d990: 20 20 20 20 20 20 20 20 20 20 20 69 61 2c 20 69             ia, i
d9a0: 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c 20 69  b, ic, id, ie, i
d9b0: 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c 20 69  f, ig, ih, ii, i
d9c0: 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69  j, ik, il, im, i
d9d0: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
d9e0: 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a         ja, jb, j
d9f0: 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a  c, jd, je, jf, j
da00: 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a  g, jh, ji, jj, j
da10: 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20  k, jl, jm, jn,. 
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b     ka, kb, kc, k
da40: 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b  d, ke, kf, kg, k
da50: 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b  h, ki, kj, kk, k
da60: 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20  l, km, kn,.     
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
da80: 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c  a, lb, lc, ld, l
da90: 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c  e, lf, lg, lh, l
daa0: 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c  i, lj, lk, ll, l
dab0: 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, ln,.         
dac0: 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c 20 6d             ma, m
dad0: 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d  b, mc, md, me, m
dae0: 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d  f, mg, mh, mi, m
daf0: 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d  j, mk, ml, mm, m
db00: 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  n.    );.    CRE
db10: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 61 2c  ATE TABLE t2(aa,
db20: 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c   ab, ac, ad, ae,
db30: 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c   af, ag, ah, ai,
db40: 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c   aj, ak, al, am,
db50: 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   an,.           
db60: 20 20 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c           ba, bb,
db70: 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c   bc, bd, be, bf,
db80: 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c   bg, bh, bi, bj,
db90: 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c   bk, bl, bm, bn,
dba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dbb0: 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c       ca, cb, cc,
dbc0: 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c   cd, ce, cf, cg,
dbd0: 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c   ch, ci, cj, ck,
dbe0: 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20   cl, cm, cn,.   
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c   da, db, dc, dd,
dc10: 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c   de, df, dg, dh,
dc20: 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c   di, dj, dk, dl,
dc30: 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20   dm, dn,.       
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 61 2c               ea,
dc50: 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c   eb, ec, ed, ee,
dc60: 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c   ef, eg, eh, ei,
dc70: 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c   ej, ek, el, em,
dc80: 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   en,.           
dc90: 20 20 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c           fa, fb,
dca0: 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c   fc, fd, fe, ff,
dcb0: 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c   fg, fh, fi, fj,
dcc0: 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c   fk, fl, fm, fn,
dcd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dce0: 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c       ga, gb, gc,
dcf0: 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c   gd, ge, gf, gg,
dd00: 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c   gh, gi, gj, gk,
dd10: 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20   gl, gm, gn,.   
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c   ha, hb, hc, hd,
dd40: 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c   he, hf, hg, hh,
dd50: 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c   hi, hj, hk, hl,
dd60: 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20   hm, hn,.       
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 61 2c               ia,
dd80: 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c   ib, ic, id, ie,
dd90: 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c   if, ig, ih, ii,
dda0: 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c   ij, ik, il, im,
ddb0: 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20   ix,.           
ddc0: 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c           ja, jb,
ddd0: 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c   jc, jd, je, jf,
dde0: 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c   jg, jh, ji, jj,
ddf0: 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c   jk, jl, jm, jn,
de00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de10: 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c       ka, kb, kc,
de20: 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c   kd, ke, kf, kg,
de30: 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c   kh, ki, kj, kk,
de40: 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20   kl, km, kn,.   
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c   la, lb, lc, ld,
de70: 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c   le, lf, lg, lh,
de80: 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c   li, lj, lk, ll,
de90: 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20   lm, ln,.       
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c               ma,
deb0: 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c   mb, mc, md, me,
dec0: 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c   mf, mg, mh, mi,
ded0: 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c   mj, mk, ml, mm,
dee0: 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 49   mn.    );.    I
def0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 61  NSERT INTO t1(aa
df00: 29 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69  ) VALUES( a_stri
df10: 6e 67 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20  ng(100000) );.  
df20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
df30: 28 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f 73  (aa) VALUES( a_s
df40: 74 72 69 6e 67 28 31 30 30 30 30 30 29 20 29 3b  tring(100000) );
df50: 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d  .    VACUUM;.  }
df60: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
df70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfb0: 2d 0a 23 20 54 65 73 74 20 61 20 63 6f 75 70 6c  -.# Test a coupl
dfc0: 65 20 6f 66 20 73 70 65 63 69 61 6c 20 63 61 73  e of special cas
dfd0: 65 73 20 74 68 61 74 20 63 6f 6d 65 20 75 70 20  es that come up 
dfe0: 77 68 69 6c 65 20 63 6f 6d 6d 69 74 74 69 6e 67  while committing
dff0: 20 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   .# transactions
e000: 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  :.#.#   pager1-2
e010: 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e  0.1.*: Committin
e020: 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  g an in-memory d
e030: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
e040: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 0a 23 20  ion when the .# 
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f   database has no
e070: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
e080: 61 74 20 61 6c 6c 2e 0a 23 0a 23 20 20 20 70 61  at all..#.#   pa
e090: 67 65 72 31 2d 32 30 2e 32 2e 2a 3a 20 41 73 20  ger1-20.2.*: As 
e0a0: 61 62 6f 76 65 2c 20 62 75 74 20 77 69 74 68 20  above, but with 
e0b0: 61 20 6e 6f 72 6d 61 6c 20 64 62 20 69 6e 20 65  a normal db in e
e0c0: 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
e0d0: 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61 67   mode..#.#   pag
e0e0: 65 72 31 2d 32 30 2e 33 2e 2a 3a 20 43 6f 6d 6d  er1-20.3.*: Comm
e0f0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
e100: 74 69 6f 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  tion in WAL mode
e110: 20 77 68 65 72 65 20 74 68 65 20 64 61 74 61 62   where the datab
e120: 61 73 65 20 68 61 73 0a 23 20 20 20 20 20 20 20  ase has.#       
e130: 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20             been 
e140: 6d 6f 64 69 66 69 65 64 2c 20 62 75 74 20 61 6c  modified, but al
e150: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
e160: 76 65 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20  ve been flushed 
e170: 74 6f 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  to .#           
e180: 20 20 20 20 20 20 20 64 69 73 6b 20 62 65 66 6f         disk befo
e190: 72 65 20 74 68 65 20 63 6f 6d 6d 69 74 2e 0a 23  re the commit..#
e1a0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
e1b0: 32 30 2e 31 2e 31 20 7b 0a 20 20 63 61 74 63 68  20.1.1 {.  catch
e1c0: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 73 71   {db close}.  sq
e1d0: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
e1e0: 3a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  :.  execsql {.  
e1f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f    CREATE TABLE o
e200: 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a  ne(two, three);.
e210: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e220: 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27 2c 20  one VALUES('a', 
e230: 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  'b');.  }.} {}.d
e240: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30  o_test pager1-20
e250: 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
e260: 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43   {.    BEGIN EXC
e270: 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d  LUSIVE;.    COMM
e280: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  IT;.  }.} {}..do
e290: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e  _test pager1-20.
e2a0: 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  2.1 {.  faultsim
e2b0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
e2c0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
e2d0: 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e     PRAGMA lockin
e2e0: 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69  g_mode = exclusi
e2f0: 76 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  ve;.    PRAGMA j
e300: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65  ournal_mode = pe
e310: 72 73 69 73 74 3b 0a 20 20 20 20 43 52 45 41 54  rsist;.    CREAT
e320: 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c  E TABLE one(two,
e330: 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53   three);.    INS
e340: 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c  ERT INTO one VAL
e350: 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
e360: 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20   }.} {exclusive 
e370: 70 65 72 73 69 73 74 7d 0a 64 6f 5f 74 65 73 74  persist}.do_test
e380: 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 32 20 7b   pager1-20.2.2 {
e390: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
e3a0: 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45   BEGIN EXCLUSIVE
e3b0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
e3c0: 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c  }.} {}..ifcapabl
e3d0: 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73  e wal {.  do_tes
e3e0: 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 31 20  t pager1-20.3.1 
e3f0: 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64  {.    faultsim_d
e400: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
e410: 0a 20 20 20 20 64 62 20 66 75 6e 63 20 61 5f 73  .    db func a_s
e420: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
e430: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
e440: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
e450: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 20  size = 10;.     
e460: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
e470: 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20  mode = wal;.    
e480: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
e490: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
e4a0: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45  (x);.        CRE
e4b0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 79 29 3b  ATE TABLE t2(y);
e4c0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
e4d0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
e4e0: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
e4f0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
e500: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
e510: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
e520: 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20  t1;         /*  
e530: 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e   2 */.        IN
e540: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
e550: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
e560: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
e570: 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20     /*   4 */.   
e580: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
e590: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
e5a0: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
e5b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38  ;         /*   8
e5c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45   */.        INSE
e5d0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
e5e0: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  T a_string(800) 
e5f0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
e600: 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20 20 20 20   /*  16 */.     
e610: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e620: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
e630: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
e640: 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a          /*  32 *
e650: 2f 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  /.      COMMIT;.
e660: 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a      }.  } {wal}.
e670: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
e680: 2d 32 30 2e 33 2e 32 20 7b 0a 20 20 20 20 65 78  -20.3.2 {.    ex
e690: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45  ecsql {.      BE
e6a0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
e6b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
e6c0: 28 27 78 78 78 78 27 29 3b 0a 20 20 20 20 7d 0a  ('xxxx');.    }.
e6d0: 20 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65      recursive_se
e6e0: 6c 65 63 74 20 33 32 20 74 31 0a 20 20 20 20 65  lect 32 t1.    e
e6f0: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20  xecsql COMMIT.  
e700: 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  } {}.}..#-------
e710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e750: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61  --.# Test that a
e760: 20 57 41 4c 20 64 61 74 61 62 61 73 65 20 6d 61   WAL database ma
e770: 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 20  y not be opened 
e780: 69 66 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31  if:.#.#   pager1
e790: 2d 32 31 2e 31 2e 2a 3a 20 54 68 65 20 56 46 53  -21.1.*: The VFS
e7a0: 20 68 61 73 20 61 6e 20 69 56 65 72 73 69 6f 6e   has an iVersion
e7b0: 20 6c 65 73 73 20 74 68 61 6e 20 32 2c 20 6f 72   less than 2, or
e7c0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e 32  .#   pager1-21.2
e7d0: 2e 2a 3a 20 54 68 65 20 56 46 53 20 64 6f 65 73  .*: The VFS does
e7e0: 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 78 53 68   not provide xSh
e7f0: 6d 58 58 58 28 29 20 6d 65 74 68 6f 64 73 2e 0a  mXXX() methods..
e800: 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20  #.ifcapable wal 
e810: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  {.  do_test page
e820: 72 31 2d 32 31 2e 30 20 7b 0a 20 20 20 20 66 61  r1-21.0 {.    fa
e830: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
e840: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 65 78 65  d_reopen.    exe
e850: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
e860: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
e870: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52   = WAL;.      CR
e880: 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20  EATE TABLE ko(c 
e890: 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62  DEFAULT 'abc', b
e8a0: 20 44 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b   DEFAULT 'def');
e8b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
e8c0: 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41  TO ko DEFAULT VA
e8d0: 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  LUES;.    }.  } 
e8e0: 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20  {wal}.  do_test 
e8f0: 70 61 67 65 72 31 2d 32 31 2e 31 20 7b 0a 20 20  pager1-21.1 {.  
e900: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 6e 6f    testvfs tv -no
e910: 73 68 6d 20 31 0a 20 20 20 20 73 71 6c 69 74 65  shm 1.    sqlite
e920: 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76  3 db2 test.db -v
e930: 66 73 20 74 76 0a 20 20 20 20 63 61 74 63 68 73  fs tv.    catchs
e940: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
e950: 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20 20 7d 20  OM ko } db2.  } 
e960: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70  {1 {unable to op
e970: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
e980: 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20  }}.  db2 close. 
e990: 20 74 76 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f   tv delete.  do_
e9a0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e 32  test pager1-21.2
e9b0: 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74   {.    testvfs t
e9c0: 76 20 2d 69 76 65 72 73 69 6f 6e 20 31 0a 20 20  v -iversion 1.  
e9d0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
e9e0: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20  st.db -vfs tv.  
e9f0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
ea00: 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20  ECT * FROM ko } 
ea10: 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75 6e 61 62  db2.  } {1 {unab
ea20: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
ea30: 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 64 62 32  ase file}}.  db2
ea40: 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65   close.  tv dele
ea50: 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  te.}..#---------
ea60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eaa0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20 22  .# Test that a "
eab0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
eac0: 70 6f 69 6e 74 22 3a 0a 23 0a 23 20 20 20 70 61  point":.#.#   pa
ead0: 67 65 72 31 2d 32 32 2e 31 2e 2a 3a 20 69 73 20  ger1-22.1.*: is 
eae0: 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61 20 6e 6f 6e  a no-op on a non
eaf0: 2d 57 41 4c 20 64 62 2c 20 61 6e 64 0a 23 20 20  -WAL db, and.#  
eb00: 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 2a 3a 20   pager1-22.2.*: 
eb10: 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 78  does not cause x
eb20: 53 79 6e 63 20 63 61 6c 6c 73 20 77 69 74 68 20  Sync calls with 
eb30: 61 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f 66  a synchronous=of
eb40: 66 20 64 62 2e 0a 23 0a 69 66 63 61 70 61 62 6c  f db..#.ifcapabl
eb50: 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73  e wal {.  do_tes
eb60: 74 20 70 61 67 65 72 31 2d 32 32 2e 31 2e 31 20  t pager1-22.1.1 
eb70: 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64  {.    faultsim_d
eb80: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
eb90: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
eba0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
ebb0: 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54 20 27  E ko(c DEFAULT '
ebc0: 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c 54 20  abc', b DEFAULT 
ebd0: 27 64 65 66 27 29 3b 0a 20 20 20 20 20 20 49 4e  'def');.      IN
ebe0: 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46  SERT INTO ko DEF
ebf0: 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20  AULT VALUES;.   
ec00: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
ec10: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
ec20: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20  kpoint }.  } {0 
ec30: 2d 31 20 2d 31 7d 0a 20 20 64 6f 5f 74 65 73 74  -1 -1}.  do_test
ec40: 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 31 20 7b   pager1-22.2.1 {
ec50: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
ec60: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74  -default 1.    t
ec70: 76 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20  v filter xSync. 
ec80: 20 20 20 74 76 20 73 63 72 69 70 74 20 78 53 79     tv script xSy
ec90: 6e 63 43 62 0a 20 20 20 20 70 72 6f 63 20 78 53  ncCb.    proc xS
eca0: 79 6e 63 43 62 20 7b 61 72 67 73 7d 20 7b 69 6e  yncCb {args} {in
ecb0: 63 72 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 7d 0a  cr ::synccount}.
ecc0: 20 20 20 20 73 65 74 20 3a 3a 73 79 6e 63 63 6f      set ::syncco
ecd0: 75 6e 74 20 30 0a 20 20 20 20 73 71 6c 69 74 65  unt 0.    sqlite
ece0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
ecf0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
ed00: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
ed10: 6f 75 73 20 3d 20 6f 66 66 3b 0a 20 20 20 20 20  ous = off;.     
ed20: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
ed30: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
ed40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f    INSERT INTO ko
ed50: 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b   DEFAULT VALUES;
ed60: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
ed70: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
ed80: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 20  checkpoint }.   
ed90: 20 73 65 74 20 73 79 6e 63 63 6f 75 6e 74 0a 20   set synccount. 
eda0: 20 7d 20 7b 30 7d 0a 20 20 64 62 20 63 6c 6f 73   } {0}.  db clos
edb0: 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a  e.  tv delete.}.
edc0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
edd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ede0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
ee10: 73 74 73 20 66 6f 72 20 63 68 61 6e 67 69 6e 67  sts for changing
ee20: 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 23   journal mode..#
ee30: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 31  .#   pager1-23.1
ee40: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 77 68  .*: Test that wh
ee50: 65 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d  en changing from
ee60: 20 50 45 52 53 49 53 54 20 74 6f 20 44 45 4c 45   PERSIST to DELE
ee70: 54 45 20 6d 6f 64 65 2c 0a 23 20 20 20 20 20 20  TE mode,.#      
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
ee90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
eea0: 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 20 20 70  deleted..#.#   p
eeb0: 61 67 65 72 31 2d 32 33 2e 32 2e 2a 3a 20 53 61  ager1-23.2.*: Sa
eec0: 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65  me test as above
eed0: 2c 20 62 75 74 20 77 68 69 6c 65 20 61 20 73 68  , but while a sh
eee0: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ared lock is hel
eef0: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
ef00: 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
ef10: 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20  base file..#.#  
ef20: 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 2a 3a 20   pager1-23.3.*: 
ef30: 53 61 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f  Same test as abo
ef40: 76 65 2c 20 62 75 74 20 77 68 69 6c 65 20 61 20  ve, but while a 
ef50: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 69 73  reserved lock is
ef60: 20 68 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20   held.#         
ef70: 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20           on the 
ef80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23  database file..#
ef90: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 34  .#   pager1-23.4
efa0: 2e 2a 3a 20 41 6e 64 2c 20 66 6f 72 20 66 75 6e  .*: And, for fun
efb0: 2c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  , while holding 
efc0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
efd0: 6b 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  k..#.#   pager1-
efe0: 32 33 2e 35 2e 2a 3a 20 54 72 79 20 74 6f 20 73  23.5.*: Try to s
eff0: 65 74 20 76 61 72 69 6f 75 73 20 64 69 66 66 65  et various diffe
f000: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  rent journal mod
f010: 65 73 20 77 69 74 68 20 61 6e 0a 23 20 20 20 20  es with an.#    
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
f030: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
f040: 20 28 6f 6e 6c 79 20 4d 45 4d 4f 52 59 20 61 6e   (only MEMORY an
f050: 64 20 4f 46 46 20 73 68 6f 75 6c 64 20 77 6f 72  d OFF should wor
f060: 6b 29 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  k)..#.#   pager1
f070: 2d 32 33 2e 36 2e 2a 3a 20 54 72 79 20 74 6f 20  -23.6.*: Try to 
f080: 73 65 74 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  set locking_mode
f090: 3d 6e 6f 72 6d 61 6c 20 6f 6e 20 61 6e 20 69 6e  =normal on an in
f0a0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
f0b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
f0c0: 20 20 20 20 28 64 6f 65 73 6e 27 74 20 77 6f 72      (doesn't wor
f0d0: 6b 20 2d 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  k - in-memory da
f0e0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 75  tabases always u
f0f0: 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  se.#            
f100: 20 20 20 20 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f        locking_mo
f110: 64 65 3d 65 78 63 6c 75 73 69 76 65 29 2e 0a 23  de=exclusive)..#
f120: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f130: 32 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  23.1.1 {.  fault
f140: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
f150: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
f160: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
f170: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
f180: 49 53 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20  IST;.    CREATE 
f190: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
f1a0: 20 20 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74    }.  file exist
f1b0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f1c0: 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  l.} {1}.do_test 
f1d0: 70 61 67 65 72 31 2d 32 33 2e 31 2e 32 20 7b 0a  pager1-23.1.2 {.
f1e0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
f1f0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f200: 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 66 69 6c  = DELETE }.  fil
f210: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
f220: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a  -journal.} {0}..
f230: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f240: 33 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.2.1 {.  execsq
f250: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
f260: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
f270: 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52  RSIST;.    INSER
f280: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
f290: 28 27 43 61 6e 62 65 72 72 61 27 2c 20 27 41 43  ('Canberra', 'AC
f2a0: 54 27 29 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76  T');.  }.  db ev
f2b0: 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  al { SELECT * FR
f2c0: 4f 4d 20 74 31 20 7d 20 7b 0a 20 20 20 20 64 62  OM t1 } {.    db
f2d0: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a   eval { PRAGMA j
f2e0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
f2f0: 4c 45 54 45 20 7d 0a 20 20 7d 0a 20 20 65 78 65  LETE }.  }.  exe
f300: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
f310: 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b  urnal_mode }.} {
f320: 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20  delete}.do_test 
f330: 70 61 67 65 72 31 2d 32 33 2e 32 2e 32 20 7b 0a  pager1-23.2.2 {.
f340: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
f350: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
f360: 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  {0}..do_test pag
f370: 65 72 31 2d 32 33 2e 33 2e 31 20 7b 0a 20 20 65  er1-23.3.1 {.  e
f380: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
f390: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f3a0: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
f3b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
f3c0: 41 4c 55 45 53 28 27 44 61 72 77 69 6e 27 2c 20  ALUES('Darwin', 
f3d0: 27 4e 54 27 29 3b 0a 20 20 20 20 42 45 47 49 4e  'NT');.    BEGIN
f3e0: 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20 7d 0a   IMMEDIATE;.  }.
f3f0: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
f400: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f410: 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 65 78 65  = DELETE }.  exe
f420: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
f430: 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b  urnal_mode }.} {
f440: 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20  delete}.do_test 
f450: 70 61 67 65 72 31 2d 32 33 2e 33 2e 32 20 7b 0a  pager1-23.3.2 {.
f460: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
f470: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
f480: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {0}.do_test page
f490: 72 31 2d 32 33 2e 33 2e 33 20 7b 0a 20 20 65 78  r1-23.3.3 {.  ex
f4a0: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  ecsql COMMIT.} {
f4b0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
f4c0: 31 2d 32 33 2e 34 2e 31 20 7b 0a 20 20 65 78 65  1-23.4.1 {.  exe
f4d0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
f4e0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f4f0: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e   PERSIST;.    IN
f500: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
f510: 55 45 53 28 27 41 64 65 6c 61 69 64 65 27 2c 20  UES('Adelaide', 
f520: 27 53 41 27 29 3b 0a 20 20 20 20 42 45 47 49 4e  'SA');.    BEGIN
f530: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a   EXCLUSIVE;.  }.
f540: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
f550: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f560: 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 65 78 65  = DELETE }.  exe
f570: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
f580: 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b  urnal_mode }.} {
f590: 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20  delete}.do_test 
f5a0: 70 61 67 65 72 31 2d 32 33 2e 34 2e 32 20 7b 0a  pager1-23.4.2 {.
f5b0: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
f5c0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
f5d0: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {0}.do_test page
f5e0: 72 31 2d 32 33 2e 34 2e 33 20 7b 0a 20 20 65 78  r1-23.4.3 {.  ex
f5f0: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  ecsql COMMIT.} {
f600: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
f610: 31 2d 32 33 2e 35 2e 31 20 7b 0a 20 20 66 61 75  1-23.5.1 {.  fau
f620: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
f630: 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65  _reopen.  sqlite
f640: 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 7d 20  3 db :memory:.} 
f650: 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6d  {}.foreach {tn m
f660: 6f 64 65 20 70 6f 73 73 69 62 6c 65 7d 20 7b 0a  ode possible} {.
f670: 20 20 32 20 20 6f 66 66 20 20 20 20 20 20 31 0a    2  off      1.
f680: 20 20 33 20 20 6d 65 6d 6f 72 79 20 20 20 31 0a    3  memory   1.
f690: 20 20 34 20 20 70 65 72 73 69 73 74 20 20 30 0a    4  persist  0.
f6a0: 20 20 35 20 20 64 65 6c 65 74 65 20 20 20 30 0a    5  delete   0.
f6b0: 20 20 36 20 20 77 61 6c 20 20 20 20 20 20 30 0a    6  wal      0.
f6c0: 20 20 37 20 20 74 72 75 6e 63 61 74 65 20 30 0a    7  truncate 0.
f6d0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } {.  do_test pa
f6e0: 67 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 31 20  ger1-23.5.$tn.1 
f6f0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50  {.    execsql "P
f700: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f710: 64 65 20 3d 20 6f 66 66 22 0a 20 20 20 20 65 78  de = off".    ex
f720: 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f  ecsql "PRAGMA jo
f730: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f  urnal_mode = $mo
f740: 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73  de".  } [if $pos
f750: 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64  sible {list $mod
f760: 65 7d 20 7b 6c 69 73 74 20 6f 66 66 7d 5d 0a 20  e} {list off}]. 
f770: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
f780: 32 33 2e 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  23.5.$tn.2 {.   
f790: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
f7a0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f7b0: 6d 65 6d 6f 72 79 22 0a 20 20 20 20 65 78 65 63  memory".    exec
f7c0: 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  sql "PRAGMA jour
f7d0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65  nal_mode = $mode
f7e0: 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73 73 69  ".  } [if $possi
f7f0: 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d  ble {list $mode}
f800: 20 7b 6c 69 73 74 20 6d 65 6d 6f 72 79 7d 5d 0a   {list memory}].
f810: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
f820: 2d 32 33 2e 36 2e 31 20 7b 0a 20 20 65 78 65 63  -23.6.1 {.  exec
f830: 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b  sql {PRAGMA lock
f840: 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61  ing_mode = norma
f850: 6c 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d  l}.} {exclusive}
f860: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f870: 32 33 2e 36 2e 32 20 7b 0a 20 20 65 78 65 63 73  23.6.2 {.  execs
f880: 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69  ql {PRAGMA locki
f890: 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73  ng_mode = exclus
f8a0: 69 76 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  ive}.} {exclusiv
f8b0: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
f8c0: 31 2d 32 33 2e 36 2e 33 20 7b 0a 20 20 65 78 65  1-23.6.3 {.  exe
f8d0: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63  csql {PRAGMA loc
f8e0: 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78  king_mode}.} {ex
f8f0: 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74  clusive}.do_test
f900: 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 34 20 7b   pager1-23.6.4 {
f910: 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47  .  execsql {PRAG
f920: 4d 41 20 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f  MA main.locking_
f930: 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  mode}.} {exclusi
f940: 76 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ve}..#----------
f950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
f990: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
f9a0: 2d 32 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c  -24.1.1 {.  faul
f9b0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
f9c0: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
f9d0: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
f9e0: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
f9f0: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
fa00: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50  size = 10;.    P
fa10: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
fa20: 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 43 52  m = FULL;.    CR
fa30: 45 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 2c  EATE TABLE x1(x,
fa40: 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b   y, z, PRIMARY K
fa50: 45 59 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20 43  EY(y, z));.    C
fa60: 52 45 41 54 45 20 54 41 42 4c 45 20 78 32 28 78  REATE TABLE x2(x
fa70: 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20  , y, z, PRIMARY 
fa80: 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20  KEY(y, z));.    
fa90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 56  INSERT INTO x2 V
faa0: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 34  ALUES(a_string(4
fab0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30  00), a_string(50
fac0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
fad0: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
fae0: 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f  NTO x2 SELECT a_
faf0: 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73  string(600), a_s
fb00: 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74  tring(400), a_st
fb10: 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20 78  ring(500) FROM x
fb20: 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  2;.    INSERT IN
fb30: 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73  TO x2 SELECT a_s
fb40: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
fb50: 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72  ring(600), a_str
fb60: 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 78 32  ing(400) FROM x2
fb70: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fb80: 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74  O x2 SELECT a_st
fb90: 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72  ring(400), a_str
fba0: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
fbb0: 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 78 32 3b  ng(600) FROM x2;
fbc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
fbd0: 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   x2 SELECT a_str
fbe0: 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69  ing(600), a_stri
fbf0: 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(400), a_strin
fc00: 67 28 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a  g(500) FROM x2;.
fc10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
fc20: 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  x2 SELECT a_stri
fc30: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
fc40: 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(600), a_string
fc50: 28 34 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20  (400) FROM x2;. 
fc60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
fc70: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
fc80: 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(400), a_string
fc90: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
fca0: 36 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  600) FROM x2;.  
fcb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
fcc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
fcd0: 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  2;.  }.} {}.do_t
fce0: 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e  est pager1-24.1.
fcf0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
fd00: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
fd10: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 20   DELETE FROM x1 
fd20: 57 48 45 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a  WHERE rowid<32;.
fd30: 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f    }.  recursive_
fd40: 73 65 6c 65 63 74 20 36 34 20 78 32 0a 7d 20 7b  select 64 x2.} {
fd50: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
fd60: 2d 32 34 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63  -24.1.3 {.  exec
fd70: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 55 50 44  sql { .      UPD
fd80: 41 54 45 20 78 31 20 53 45 54 20 7a 20 3d 20 61  ATE x1 SET z = a
fd90: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 57 48 45  _string(300) WHE
fda0: 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20 20 20  RE rowid>40;.   
fdb0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41   COMMIT;.    PRA
fdc0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
fdd0: 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  eck;.    SELECT 
fde0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31  count(*) FROM x1
fdf0: 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a  ;.  }.} {ok 33}.
fe00: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
fe10: 32 34 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  24.1.4 {.  execs
fe20: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
fe30: 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53  FROM x1;.    INS
fe40: 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
fe50: 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
fe60: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44    BEGIN;.      D
fe70: 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48  ELETE FROM x1 WH
fe80: 45 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20  ERE rowid<32;.  
fe90: 20 20 20 20 55 50 44 41 54 45 20 78 31 20 53 45      UPDATE x1 SE
fea0: 54 20 7a 20 3d 20 61 5f 73 74 72 69 6e 67 28 32  T z = a_string(2
feb0: 39 39 29 20 57 48 45 52 45 20 72 6f 77 69 64 3e  99) WHERE rowid>
fec0: 34 30 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73  40;.  }.  recurs
fed0: 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32  ive_select 64 x2
fee0: 20 7b 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54   {db eval COMMIT
fef0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
ff00: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
ff10: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45  ty_check;.    SE
ff20: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
ff30: 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b  OM x1;.  }.} {ok
ff40: 20 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61   33}..do_test pa
ff50: 67 65 72 31 2d 32 34 2e 31 2e 35 20 7b 0a 20 20  ger1-24.1.5 {.  
ff60: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
ff70: 4c 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20  LETE FROM x1;.  
ff80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
ff90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
ffa0: 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69  2;.  }.  recursi
ffb0: 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32 20  ve_select 64 x2 
ffc0: 7b 20 64 62 20 65 76 61 6c 20 7b 43 52 45 41 54  { db eval {CREAT
ffd0: 45 20 54 41 42 4c 45 20 78 33 28 78 2c 20 79 2c  E TABLE x3(x, y,
ffe0: 20 7a 29 7d 20 7d 0a 20 20 65 78 65 63 73 71 6c   z)} }.  execsql
fff0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
10000 20 78 33 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d   x3 }.} {}..#---
10010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10050 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74  ------.#.do_test
10060 20 70 61 67 65 72 31 2d 32 35 2d 31 20 7b 0a 20   pager1-25-1 {. 
10070 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
10080 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
10090 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
100a0 4e 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49  N;.      SAVEPOI
100b0 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20 20 20  NT abc;.        
100c0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
100d0 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 52 4f 4c  a, b);.      ROL
100e0 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20  LBACK TO abc;.  
100f0 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
10100 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 62 72  db close.} {}.br
10110 65 61 6b 70 6f 69 6e 74 0a 64 6f 5f 74 65 73 74  eakpoint.do_test
10120 20 70 61 67 65 72 31 2d 32 35 2d 32 20 7b 0a 20   pager1-25-2 {. 
10130 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
10140 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
10150 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45  ecsql {.    SAVE
10160 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20  POINT abc;.     
10170 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
10180 28 61 2c 20 62 29 3b 0a 20 20 20 20 52 4f 4c 4c  (a, b);.    ROLL
10190 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20  BACK TO abc;.   
101a0 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64   COMMIT;.  }.  d
101b0 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d  b close.} {}..#-
101c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10200 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 65 63 74 6f  --------.# Secto
10210 72 2d 73 69 7a 65 20 74 65 73 74 73 2e 0a 23 0a  r-size tests..#.
10220 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10230 36 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20  6.1 {.  testvfs 
10240 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
10250 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30  tv sectorsize 40
10260 39 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65  96.  faultsim_de
10270 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
10280 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
10290 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
102a0 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
102b0 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35  MA page_size = 5
102c0 31 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  12;.    CREATE T
102d0 41 42 4c 45 20 74 62 6c 28 61 20 50 52 49 4d 41  ABLE tbl(a PRIMA
102e0 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45  RY KEY, b UNIQUE
102f0 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
10300 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10310 74 62 6c 20 56 41 4c 55 45 53 28 61 5f 73 74 72  tbl VALUES(a_str
10320 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
10330 67 28 36 30 30 29 29 3b 0a 20 20 20 20 20 20 49  g(600));.      I
10340 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
10350 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
10360 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
10370 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
10380 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
10390 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
103a0 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
103b0 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
103c0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
103d0 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
103e0 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
103f0 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
10400 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
10410 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61  NTO tbl SELECT a
10420 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
10430 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
10440 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  tbl;.      INSER
10450 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
10460 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
10470 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
10480 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
10490 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
104a0 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
104b0 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
104c0 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
104d0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
104e0 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
104f0 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
10500 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
10510 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
10520 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  {}.do_execsql_te
10530 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b  st pager1-26.1 {
10540 0a 20 20 55 50 44 41 54 45 20 74 62 6c 20 53 45  .  UPDATE tbl SE
10550 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 35  T b = a_string(5
10560 35 30 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f  50);.} {}.db clo
10570 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d  se.tv delete..#-
10580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105c0 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65  --------.#.do_te
105d0 73 74 20 70 61 67 65 72 31 2e 32 37 2e 31 20 7b  st pager1.27.1 {
105e0 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
105f0 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
10600 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
10610 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65  fcounts db.  exe
10620 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
10630 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
10640 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
10650 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67   }.  sqlite3_pag
10660 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a  er_refcounts db.
10670 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
10680 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
10690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106d0 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 74  -.# Test that at
106e0 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e  tempting to open
106f0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
10700 74 69 6f 6e 20 77 69 74 68 20 0a 23 20 6c 6f 63  tion with .# loc
10710 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
10720 69 76 65 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20  ive in WAL mode 
10730 66 61 69 6c 73 20 69 66 20 74 68 65 72 65 20 61  fails if there a
10740 72 65 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 73  re other clients
10750 20 6f 6e 20 0a 23 20 74 68 65 20 73 61 6d 65 20   on .# the same 
10760 64 61 74 61 62 61 73 65 2e 0a 23 0a 63 61 74 63  database..#.catc
10770 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 69  h { db close }.i
10780 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20  fcapable wal {. 
10790 20 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f   do_multiclient_
107a0 74 65 73 74 20 74 6e 20 7b 0a 20 20 20 20 64 6f  test tn {.    do
107b0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
107c0 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 73 71  $tn.1 {.      sq
107d0 6c 31 20 7b 20 0a 20 20 20 20 20 20 20 20 50 52  l1 { .        PR
107e0 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
107f0 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 20  e = WAL;.       
10800 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
10810 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20  (a, b);.        
10820 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
10830 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
10840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b  .      }.    } {
10850 77 61 6c 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  wal}.    do_test
10860 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32   pager1-28.$tn.2
10870 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
10880 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
10890 61 20 62 7d 0a 0a 20 20 20 20 64 6f 5f 74 65 73  a b}..    do_tes
108a0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
108b0 33 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d  3 { sql1 { PRAGM
108c0 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  A locking_mode=e
108d0 78 63 6c 75 73 69 76 65 20 7d 20 7d 20 7b 65 78  xclusive } } {ex
108e0 63 6c 75 73 69 76 65 7d 0a 20 20 20 20 64 6f 5f  clusive}.    do_
108f0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10900 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 63 73  tn.4 { .      cs
10910 71 6c 31 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53  ql1 { BEGIN; INS
10920 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
10930 45 53 28 27 63 27 2c 20 27 64 27 29 3b 20 7d 0a  ES('c', 'd'); }.
10940 20 20 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61      } {1 {databa
10950 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
10960 20 20 20 63 6f 64 65 32 20 7b 20 64 62 32 20 63     code2 { db2 c
10970 6c 6f 73 65 20 3b 20 73 71 6c 69 74 65 33 20 64  lose ; sqlite3 d
10980 62 32 20 74 65 73 74 2e 64 62 20 7d 0a 20 20 20  b2 test.db }.   
10990 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
109a0 32 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20  28.$tn.4 { .    
109b0 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20    sql1 { INSERT 
109c0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
109d0 63 27 2c 20 27 64 27 29 3b 20 43 4f 4d 4d 49 54  c', 'd'); COMMIT
109e0 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 7d 0a   }.    } {}.  }.
109f0 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
10a40 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65 6e 20 63  Normally, when c
10a50 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 6a 6f 75  hanging from jou
10a60 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
10a70 54 20 74 6f 20 44 45 4c 45 54 45 20 74 68 65 20  T to DELETE the 
10a80 70 61 67 65 72 0a 23 20 61 74 74 65 6d 70 74 73  pager.# attempts
10a90 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
10aa0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 48 6f 77  ournal file. How
10ab0 65 76 65 72 2c 20 69 66 20 69 74 20 63 61 6e 6e  ever, if it cann
10ac0 6f 74 20 6f 62 74 61 69 6e 20 61 0a 23 20 52 45  ot obtain a.# RE
10ad0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
10ae0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10af0 2c 20 74 68 69 73 20 73 74 65 70 20 69 73 20 73  , this step is s
10b00 6b 69 70 70 65 64 2e 0a 23 0a 64 6f 5f 6d 75 6c  kipped..#.do_mul
10b10 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e  ticlient_test tn
10b20 20 7b 0a 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 31 20 7b 0a 20  er1-28.$tn.1 {. 
10b40 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20     sql1 { .     
10b50 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
10b60 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
10b70 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
10b80 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
10b90 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10ba0 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  1 VALUES('a', 'b
10bb0 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70  ');.    }.  } {p
10bc0 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73  ersist}.  do_tes
10bd0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10be0 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  2 { file exists 
10bf0 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
10c00 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } 1.  do_test pa
10c10 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20  ger1-28.$tn.3 { 
10c20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f  sql1 { PRAGMA jo
10c30 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
10c40 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20  ETE } } delete. 
10c50 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10c60 32 38 2e 24 74 6e 2e 34 20 7b 20 66 69 6c 65 20  28.$tn.4 { file 
10c70 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
10c80 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f  ournal } 0..  do
10c90 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10ca0 24 74 6e 2e 35 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.5 {.    sql1
10cb0 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
10cc0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
10cd0 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 49  PERSIST;.      I
10ce0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
10cf0 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a  LUES('c', 'd');.
10d00 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69      }.  } {persi
10d10 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  st}.  do_test pa
10d20 67 65 72 31 2d 32 38 2e 24 74 6e 2e 36 20 7b 20  ger1-28.$tn.6 { 
10d30 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
10d40 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a  .db-journal } 1.
10d50 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10d60 2d 32 38 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20  -28.$tn.7 {.    
10d70 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e  sql2 { BEGIN; IN
10d80 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
10d90 55 45 53 28 27 65 27 2c 20 27 66 27 29 3b 20 7d  UES('e', 'f'); }
10da0 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
10db0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10dc0 38 20 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  8  { file exists
10dd0 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
10de0 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70   } 1.  do_test p
10df0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 39 20 20  ager1-28.$tn.9  
10e00 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20  { sql1 { PRAGMA 
10e10 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
10e20 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65  ELETE } } delete
10e30 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10e40 31 2d 32 38 2e 24 74 6e 2e 31 30 20 7b 20 66 69  1-28.$tn.10 { fi
10e50 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
10e60 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20  b-journal } 1.. 
10e70 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10e80 32 38 2e 24 74 6e 2e 31 31 20 7b 20 73 71 6c 32  28.$tn.11 { sql2
10e90 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64   COMMIT } {}.  d
10ea0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
10eb0 2e 24 74 6e 2e 31 32 20 7b 20 66 69 6c 65 20 65  .$tn.12 { file e
10ec0 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
10ed0 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f  urnal } 0..  do_
10ee0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24  test pager1-28-$
10ef0 74 6e 2e 31 33 20 7b 0a 20 20 20 20 63 6f 64 65  tn.13 {.    code
10f00 31 20 7b 20 73 65 74 20 63 68 61 6e 6e 65 6c 20  1 { set channel 
10f10 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65  [db incrblob -re
10f20 61 64 6f 6e 6c 79 20 74 31 20 61 20 32 5d 20 7d  adonly t1 a 2] }
10f30 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20  .    sql1 {.    
10f40 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
10f50 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
10f60 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10f70 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 67 27  TO t1 VALUES('g'
10f80 2c 20 27 68 27 29 3b 0a 20 20 20 20 7d 0a 20 20  , 'h');.    }.  
10f90 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f  } {persist}.  do
10fa0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10fb0 24 74 6e 2e 31 34 20 7b 20 66 69 6c 65 20 65 78  $tn.14 { file ex
10fc0 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
10fd0 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65  rnal } 1.  do_te
10fe0 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
10ff0 2e 31 35 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b  .15 {.    sql2 {
11000 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49   BEGIN; INSERT I
11010 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65  NTO t1 VALUES('e
11020 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b  ', 'f'); }.  } {
11030 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
11040 72 31 2d 32 38 2e 24 74 6e 2e 31 36 20 7b 20 73  r1-28.$tn.16 { s
11050 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  ql1 { PRAGMA jou
11060 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
11070 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20  TE } } delete.  
11080 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11090 38 2e 24 74 6e 2e 31 37 20 7b 20 66 69 6c 65 20  8.$tn.17 { file 
110a0 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
110b0 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f  ournal } 1..  do
110c0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
110d0 24 74 6e 2e 31 37 20 7b 20 63 73 71 6c 32 20 7b  $tn.17 { csql2 {
110e0 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 31 20 7b   COMMIT } } {1 {
110f0 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
11100 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ed}}.  do_test p
11110 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 38 20  ager1-28-$tn.18 
11120 7b 20 63 6f 64 65 31 20 7b 20 72 65 61 64 20 24  { code1 { read $
11130 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 63 0a 20 20  channel } } c.  
11140 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11150 38 2d 24 74 6e 2e 31 39 20 7b 20 63 6f 64 65 31  8-$tn.19 { code1
11160 20 7b 20 63 6c 6f 73 65 20 24 63 68 61 6e 6e 65   { close $channe
11170 6c 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  l } } {}.  do_te
11180 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11190 2e 32 30 20 7b 20 73 71 6c 32 20 7b 20 43 4f 4d  .20 { sql2 { COM
111a0 4d 49 54 20 7d 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f  MIT } } {}.}..do
111b0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 39 2e  _test pager1-29.
111c0 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
111d0 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
111e0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
111f0 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
11200 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52  e = 1024;.    PR
11210 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
11220 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 50 52 41   = full;.    PRA
11230 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
11240 3d 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20  =exclusive;.    
11250 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
11260 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
11270 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
11280 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 66 69  (1, 2);.  }.  fi
11290 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
112a0 7d 20 5b 65 78 70 72 20 31 30 32 34 2a 33 5d 0a  } [expr 1024*3].
112b0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
112c0 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.2 {.  execsql 
112d0 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
112e0 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20  e_size = 4096;. 
112f0 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 20     VACUUM;.  }. 
11300 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
11310 64 62 0a 7d 20 5b 65 78 70 72 20 34 30 39 36 2a  db.} [expr 4096*
11320 33 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  3]..#-----------
11330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
11370 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61 6e   Test that if an
11380 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
11390 66 69 6c 65 20 28 73 69 7a 65 20 30 20 62 79 74  file (size 0 byt
113a0 65 73 29 20 69 73 20 6f 70 65 6e 65 64 20 69 6e  es) is opened in
113b0 20 0a 23 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f   .# exclusive-lo
113c0 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 6e 79 20  cking mode, any 
113d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
113e0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
113f0 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 23 20 77   file-system.# w
11400 69 74 68 6f 75 74 20 62 65 69 6e 67 20 72 6f 6c  ithout being rol
11410 6c 65 64 20 62 61 63 6b 2e 20 41 6e 64 20 74 68  led back. And th
11420 61 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  at the RESERVED 
11430 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20 77 68  lock obtained wh
11440 69 6c 65 0a 23 20 64 6f 69 6e 67 20 74 68 69 73  ile.# doing this
11450 20 69 73 20 6e 6f 74 20 72 65 6c 65 61 73 65 64   is not released
11460 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
11470 72 31 2d 33 30 2e 31 20 7b 0a 20 20 64 62 20 63  r1-30.1 {.  db c
11480 6c 6f 73 65 0a 20 20 64 65 6c 65 74 65 5f 66 69  lose.  delete_fi
11490 6c 65 20 74 65 73 74 2e 64 62 0a 20 20 64 65 6c  le test.db.  del
114a0 65 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62  ete_file test.db
114b0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 65 74 20 66  -journal.  set f
114c0 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d  d [open test.db-
114d0 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20 20 73 65 65  journal w].  see
114e0 6b 20 24 66 64 20 5b 65 78 70 72 20 35 31 32 2b  k $fd [expr 512+
114f0 31 30 33 32 2a 32 5d 0a 20 20 70 75 74 73 20 2d  1032*2].  puts -
11500 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 78 0a  nonewline $fd x.
11510 20 20 63 6c 6f 73 65 20 24 66 64 0a 0a 20 20 73    close $fd..  s
11520 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
11530 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
11540 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
11550 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b  _mode=EXCLUSIVE;
11560 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
11570 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  t(*) FROM sqlite
11580 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 50 52 41  _master;.    PRA
11590 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b  GMA lock_status;
115a0 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  .  }.} {exclusiv
115b0 65 20 30 20 6d 61 69 6e 20 72 65 73 65 72 76 65  e 0 main reserve
115c0 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a  d temp closed}..
115d0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
115e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
11620 74 20 74 68 61 74 20 69 66 20 74 68 65 20 22 70  t that if the "p
11630 61 67 65 2d 73 69 7a 65 22 20 66 69 65 6c 64 20  age-size" field 
11640 69 6e 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  in a journal-hea
11650 64 65 72 20 69 73 20 30 2c 20 74 68 65 20 6a 6f  der is 0, the jo
11660 75 72 6e 61 6c 0a 23 20 66 69 6c 65 20 63 61 6e  urnal.# file can
11670 20 73 74 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64   still be rolled
11680 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 72   back. This is r
11690 65 71 75 69 72 65 64 20 66 6f 72 20 62 61 63 6b  equired for back
116a0 77 61 72 64 20 63 6f 6d 70 61 74 69 62 69 6c 69  ward compatibili
116b0 74 79 20 2d 0a 23 20 76 65 72 73 69 6f 6e 73 20  ty -.# versions 
116c0 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
116d0 74 6f 20 33 2e 35 2e 38 20 61 6c 77 61 79 73 20  to 3.5.8 always 
116e0 73 65 74 20 74 68 69 73 20 66 69 65 6c 64 20 74  set this field t
116f0 6f 20 7a 65 72 6f 2e 0a 23 0a 69 66 20 7b 24 74  o zero..#.if {$t
11700 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74  cl_platform(plat
11710 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d 20 7b  form)=="unix"} {
11720 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
11730 33 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  31.1 {.  faultsi
11740 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
11750 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
11760 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
11770 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
11780 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
11790 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
117a0 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20  ATE TABLE t1(x, 
117b0 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
117c0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
117d0 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
117e0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
117f0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b  ndomblob(1500));
11800 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11810 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
11820 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
11830 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
11840 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
11850 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
11860 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11870 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
11880 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
11890 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
118a0 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
118b0 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
118c0 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
118d0 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
118e0 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
118f0 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
11900 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
11910 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
11920 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11930 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
11940 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
11950 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
11960 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11970 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
11980 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11990 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
119a0 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
119b0 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
119c0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
119d0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
119e0 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
119f0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
11a00 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
11a10 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11a20 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
11a30 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11a40 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
11a50 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
11a60 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
11a70 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
11a80 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
11a90 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11aa0 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
11ab0 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
11ac0 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
11ad0 44 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20  DATE t1 SET y = 
11ae0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 34 39 39 29  randomblob(1499)
11af0 3b 0a 20 20 7d 0a 20 20 63 6f 70 79 5f 66 69 6c  ;.  }.  copy_fil
11b00 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
11b10 62 32 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74  b2.  copy_file t
11b20 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74  est.db-journal t
11b30 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 0a  est.db2-journal.
11b40 20 20 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65    .  hexio_write
11b50 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61   test.db2-journa
11b60 6c 20 32 34 20 30 30 30 30 30 30 30 30 0a 20 20  l 24 00000000.  
11b70 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
11b80 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b  .db2.  execsql {
11b90 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
11ba0 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20  y_check } db2.} 
11bb0 7b 6f 6b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  {ok}.}..#-------
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c00 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61  --.# Test that a
11c10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
11c20 61 6e 20 62 65 20 22 70 72 65 2d 68 69 6e 74 65  an be "pre-hinte
11c30 64 22 20 74 6f 20 61 20 63 65 72 74 61 69 6e 20  d" to a certain 
11c40 73 69 7a 65 20 61 6e 64 20 74 68 61 74 0a 23 20  size and that.# 
11c50 73 75 62 73 65 71 75 65 6e 74 20 73 70 69 6c 6c  subsequent spill
11c60 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 72  ing of the pager
11c70 20 63 61 63 68 65 20 64 6f 65 73 20 6e 6f 74 20   cache does not 
11c80 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 64 61  result in the da
11c90 74 61 62 61 73 65 0a 23 20 66 69 6c 65 20 62 65  tabase.# file be
11ca0 69 6e 67 20 73 68 72 75 6e 6b 2e 0a 23 0a 63 61  ing shrunk..#.ca
11cb0 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 66  tch {db close}.f
11cc0 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
11cd0 64 62 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  db..do_test page
11ce0 72 31 2d 33 32 2e 31 20 7b 0a 20 20 73 71 6c 69  r1-32.1 {.  sqli
11cf0 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
11d00 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
11d10 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
11d20 2c 20 79 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63  , y);.  }.  db c
11d30 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64  lose.  sqlite3 d
11d40 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
11d50 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
11d60 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11d70 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61   t1 VALUES(1, ra
11d80 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29  ndomblob(10000))
11d90 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 5f 63 6f 6e  ;.  }.  file_con
11da0 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74  trol_chunksize_t
11db0 65 73 74 20 64 62 20 6d 61 69 6e 20 31 30 32 34  est db main 1024
11dc0 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  .  file_control_
11dd0 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 64 62  sizehint_test db
11de0 20 6d 61 69 6e 20 32 30 39 37 31 35 32 30 3b 20   main 20971520; 
11df0 23 20 32 30 4d 42 0a 20 20 65 78 65 63 73 71 6c  # 20MB.  execsql
11e00 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
11e10 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
11e20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11e30 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64  1 VALUES(1, rand
11e40 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a  omblob(10000));.
11e50 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11e60 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e  t1 VALUES(2, ran
11e70 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b  domblob(10000));
11e80 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11e90 20 74 31 20 53 45 4c 45 43 54 20 78 2b 32 2c 20   t1 SELECT x+2, 
11ea0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30  randomblob(10000
11eb0 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49  ) from t1;.    I
11ec0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
11ed0 4c 45 43 54 20 78 2b 34 2c 20 72 61 6e 64 6f 6d  LECT x+4, random
11ee0 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d  blob(10000) from
11ef0 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
11f00 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78  INTO t1 SELECT x
11f10 2b 38 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  +8, randomblob(1
11f20 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20  0000) from t1;. 
11f30 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11f40 31 20 53 45 4c 45 43 54 20 78 2b 31 36 2c 20 72  1 SELECT x+16, r
11f50 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29  andomblob(10000)
11f60 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 53 45   from t1;.    SE
11f70 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
11f80 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49  OM t1;.    COMMI
11f90 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73  T;.  }.  db clos
11fa0 65 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  e.  file size te
11fb0 73 74 2e 64 62 0a 7d 20 7b 32 30 39 37 31 35 32  st.db.} {2097152
11fc0 30 7d 0a 0a 23 20 43 6c 65 61 6e 75 70 20 32 30  0}..# Cleanup 20
11fd0 4d 42 20 66 69 6c 65 20 6c 65 66 74 20 62 79 20  MB file left by 
11fe0 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 73  the previous tes
11ff0 74 2e 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  t..forcedelete t
12000 65 73 74 2e 64 62 0a 0a 66 69 6e 69 73 68 5f 74  est.db..finish_t
12010 65 73 74 0a                                      est.