/ Hex Artifact Content
Login

Artifact 4be3dacf48b767929112626be1b358a7f84e0eae:


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 73 65 74  le-system..#.set
4330: 20 70 77 64 20 5b 67 65 74 5f 70 77 64 5d 0a 74   pwd [get_pwd].t
4340: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
4350: 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 20 63  lt 1.tv script c
4360: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
4370: 0a 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  .set ::mj_filena
4380: 6d 65 5f 6c 65 6e 67 74 68 20 30 0a 70 72 6f 63  me_length 0.proc
4390: 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65   copy_on_mj_dele
43a0: 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  te {method filen
43b0: 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66  ame args} {.  if
43c0: 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
43d0: 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20  *mj* [file tail 
43e0: 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a  $filename]]} { .
43f0: 20 20 20 20 23 0a 20 20 20 20 23 20 4e 4f 54 45      #.    # NOTE
4400: 3a 20 49 73 20 74 68 65 20 66 69 6c 65 20 6e 61  : Is the file na
4410: 6d 65 20 72 65 6c 61 74 69 76 65 3f 20 20 49 66  me relative?  If
4420: 20 73 6f 2c 20 61 64 64 20 74 68 65 20 6c 65 6e   so, add the len
4430: 67 74 68 20 6f 66 20 74 68 65 20 63 75 72 72 65  gth of the curre
4440: 6e 74 0a 20 20 20 20 23 20 20 20 20 20 20 20 64  nt.    #       d
4450: 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 23 0a  irectory..    #.
4460: 20 20 20 20 69 66 20 7b 5b 69 73 5f 72 65 6c 61      if {[is_rela
4470: 74 69 76 65 5f 66 69 6c 65 20 24 66 69 6c 65 6e  tive_file $filen
4480: 61 6d 65 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65  ame]} {.      se
4490: 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f  t ::mj_filename_
44a0: 6c 65 6e 67 74 68 20 5c 0a 20 20 20 20 20 20 20  length \.       
44b0: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
44c0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65  length $filename
44d0: 5d 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  ] + [string leng
44e0: 74 68 20 24 3a 3a 70 77 64 5d 7d 5d 0a 20 20 20  th $::pwd]}].   
44f0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
4500: 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  set ::mj_filenam
4510: 65 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67  e_length [string
4520: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d   length $filenam
4530: 65 5d 0a 20 20 20 20 7d 0a 20 20 20 20 66 61 75  e].    }.    fau
4540: 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d 0a  ltsim_save .  }.
4550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4560: 4f 4b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  OK.}..foreach {t
4570: 6e 31 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b 20  n1 tcl} {.  1 { 
4580: 73 65 74 20 70 72 65 66 69 78 20 22 74 65 73 74  set prefix "test
4590: 2e 64 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20 20  .db" }.  2 { .  
45a0: 20 20 23 20 54 68 69 73 20 74 65 73 74 20 64 65    # This test de
45b0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e 64  pends on the und
45c0: 65 72 6c 79 69 6e 67 20 56 46 53 20 62 65 69 6e  erlying VFS bein
45d0: 67 20 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 70  g able to open p
45e0: 61 74 68 73 0a 20 20 20 20 23 20 35 31 32 20 62  aths.    # 512 b
45f0: 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
4600: 54 68 65 20 69 64 65 61 20 69 73 20 74 6f 20 63  The idea is to c
4610: 72 65 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75 72  reate a hot-jour
4620: 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 0a 20 20  nal file that.  
4630: 20 20 23 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d    # contains a m
4640: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
4650: 69 6e 74 65 72 20 73 6f 20 6c 61 72 67 65 20 74  inter so large t
4660: 68 61 74 20 69 74 20 63 6f 75 6c 64 20 63 6f 6e  hat it could con
4670: 74 61 69 6e 0a 20 20 20 20 23 20 61 20 76 61 6c  tain.    # a val
4680: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 20 28  id page record (
4690: 69 66 20 74 68 65 20 66 69 6c 65 20 70 61 67 65  if the file page
46a0: 2d 73 69 7a 65 20 69 73 20 35 31 32 20 62 79 74  -size is 512 byt
46b0: 65 73 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20 20  es). So as to.  
46c0: 20 20 23 20 6d 61 6b 65 20 73 75 72 65 20 53 51    # make sure SQ
46d0: 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 67 65 74  Lite doesn't get
46e0: 20 63 6f 6e 66 75 73 65 64 20 62 79 20 74 68 69   confused by thi
46f0: 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74  s..    #.    set
4700: 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20   nPadding [expr 
4710: 35 31 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65  511 - $::mj_file
4720: 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20 20  name_length].   
4730: 20 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f   if {$tcl_platfo
4740: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 77  rm(platform)=="w
4750: 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20 20  indows"} {.     
4760: 20 23 20 54 42 44 20 6e 65 65 64 20 74 6f 20 66   # TBD need to f
4770: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 74 6f  igure out how to
4780: 20 64 6f 20 74 68 69 73 20 63 6f 72 72 65 63 74   do this correct
4790: 6c 79 20 66 6f 72 20 57 69 6e 64 6f 77 73 21 21  ly for Windows!!
47a0: 21 0a 20 20 20 20 20 20 73 65 74 20 6e 50 61 64  !.      set nPad
47b0: 64 69 6e 67 20 5b 65 78 70 72 20 32 35 35 20 2d  ding [expr 255 -
47c0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f   $::mj_filename_
47d0: 6c 65 6e 67 74 68 5d 0a 20 20 20 20 7d 0a 0a 20  length].    }.. 
47e0: 20 20 20 23 20 57 65 20 63 61 6e 6e 6f 74 20 6a     # We cannot j
47f0: 75 73 74 20 63 72 65 61 74 65 20 61 20 72 65 61  ust create a rea
4800: 6c 6c 79 20 6c 6f 6e 67 20 64 61 74 61 62 61 73  lly long databas
4810: 65 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f  e file name to o
4820: 70 65 6e 2c 20 61 73 0a 20 20 20 20 23 20 4c 69  pen, as.    # Li
4830: 6e 75 78 20 6c 69 6d 69 74 73 20 61 20 73 69 6e  nux limits a sin
4840: 67 6c 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  gle component of
4850: 20 61 20 70 61 74 68 20 74 6f 20 32 35 35 20 62   a path to 255 b
4860: 79 74 65 73 20 62 79 20 64 65 66 61 75 6c 74 0a  ytes by default.
4870: 20 20 20 20 23 20 28 61 6e 64 20 70 72 65 73 75      # (and presu
4880: 6d 61 62 6c 79 20 6f 74 68 65 72 20 73 79 73 74  mably other syst
4890: 65 6d 73 20 68 61 76 65 20 6c 69 6d 69 74 73 20  ems have limits 
48a0: 74 6f 6f 29 2e 20 53 6f 20 63 72 65 61 74 65 20  too). So create 
48b0: 61 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20  a directory.    
48c0: 23 20 68 69 65 72 61 72 63 68 79 20 74 6f 20 77  # hierarchy to w
48d0: 6f 72 6b 20 69 6e 2e 0a 20 20 20 20 23 0a 20 20  ork in..    #.  
48e0: 20 20 73 65 74 20 64 69 72 6e 61 6d 65 20 22 64    set dirname "d
48f0: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
4900: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 2f 22  78901234567890/"
4910: 0a 20 20 20 20 73 65 74 20 6e 44 69 72 20 5b 65  .    set nDir [e
4920: 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20 2f 20  xpr $nPadding / 
4930: 33 32 5d 0a 20 20 20 20 69 66 20 7b 20 24 6e 44  32].    if { $nD
4940: 69 72 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  ir } {.      set
4950: 20 70 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61   p [string repea
4960: 74 20 24 64 69 72 6e 61 6d 65 20 24 6e 44 69 72  t $dirname $nDir
4970: 5d 0a 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64  ].      file mkd
4980: 69 72 20 24 70 0a 20 20 20 20 20 20 63 64 20 24  ir $p.      cd $
4990: 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74  p.    }..    set
49a0: 20 70 61 64 64 69 6e 67 20 5b 73 74 72 69 6e 67   padding [string
49b0: 20 72 65 70 65 61 74 20 78 20 5b 65 78 70 72 20   repeat x [expr 
49c0: 24 6e 50 61 64 64 69 6e 67 20 25 33 32 5d 5d 0a  $nPadding %32]].
49d0: 20 20 20 20 73 65 74 20 70 72 65 66 69 78 20 22      set prefix "
49e0: 74 65 73 74 2e 64 62 24 7b 70 61 64 64 69 6e 67  test.db${padding
49f0: 7d 22 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 76 61  }".  }.} {.  eva
4a00: 6c 20 24 74 63 6c 0a 20 20 66 6f 72 65 61 63 68  l $tcl.  foreach
4a10: 20 7b 74 6e 32 20 73 71 6c 7d 20 7b 0a 20 20 20   {tn2 sql} {.   
4a20: 20 6f 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47   o { .      PRAG
4a30: 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e  MA main.synchron
4a40: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  ous=OFF;.      P
4a50: 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72  RAGMA aux.synchr
4a60: 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20  onous=OFF;.     
4a70: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
4a80: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
4a90: 20 20 20 7d 0a 20 20 20 20 6f 35 31 32 20 7b 20     }.    o512 { 
4aa0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
4ab0: 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  in.synchronous=O
4ac0: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
4ad0: 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73   aux.synchronous
4ae0: 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47  =OFF;.      PRAG
4af0: 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a  MA main.page_siz
4b00: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50  e = 512;.      P
4b10: 52 41 47 4d 41 20 61 75 78 2e 70 61 67 65 5f 73  RAGMA aux.page_s
4b20: 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20  ize = 512;.     
4b30: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
4b40: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
4b50: 20 20 20 7d 0a 20 20 20 20 6e 20 7b 20 0a 20 20     }.    n { .  
4b60: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
4b70: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
4b80: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
4b90: 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73   aux.synchronous
4ba0: 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50  =NORMAL;.      P
4bb0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4bc0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4bd0: 20 7d 0a 20 20 20 20 66 20 7b 20 0a 20 20 20 20   }.    f { .    
4be0: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
4bf0: 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a  nchronous=FULL;.
4c00: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
4c10: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c  .synchronous=FUL
4c20: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
4c30: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
4c40: 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  ELETE;.    }.  }
4c50: 20 7b 0a 0a 20 20 20 20 73 65 74 20 74 6e 20 22   {..    set tn "
4c60: 24 7b 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a 20  ${tn1}.${tn2}". 
4c70: 20 0a 20 20 20 20 23 20 53 65 74 20 75 70 20 61   .    # Set up a
4c80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 68   connection to h
4c90: 61 76 65 20 74 77 6f 20 64 61 74 61 62 61 73 65  ave two database
4ca0: 73 2c 20 74 65 73 74 2e 64 62 20 28 6d 61 69 6e  s, test.db (main
4cb0: 29 20 61 6e 64 20 0a 20 20 20 20 23 20 74 65 73  ) and .    # tes
4cc0: 74 2e 64 62 32 20 28 61 75 78 29 2e 20 54 68 65  t.db2 (aux). The
4cd0: 6e 20 72 75 6e 20 61 20 6d 75 6c 74 69 2d 66 69  n run a multi-fi
4ce0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  le transaction o
4cf0: 6e 20 74 68 65 6d 2e 20 54 68 65 0a 20 20 20 20  n them. The.    
4d00: 23 20 56 46 53 20 77 69 6c 6c 20 73 6e 61 70 73  # VFS will snaps
4d10: 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hot the file-sys
4d20: 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20  tem just before 
4d30: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
4d40: 61 6c 0a 20 20 20 20 23 20 66 69 6c 65 20 69 73  al.    # file is
4d50: 20 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d   deleted to comm
4d60: 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
4d70: 6f 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20 74 76  on..    #.    tv
4d80: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
4d90: 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
4da0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a 20  r1-4.4.$tn.1 {. 
4db0: 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65       faultsim_de
4dc0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20  lete_and_reopen 
4dd0: 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65 78  $prefix.      ex
4de0: 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  ecsql ".        
4df0: 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69 78  ATTACH '${prefix
4e00: 7d 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20  }2' AS aux;.    
4e10: 20 20 20 20 24 73 71 6c 0a 20 20 20 20 20 20 20      $sql.       
4e20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 28   CREATE TABLE a(
4e30: 78 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  x);.        CREA
4e40: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 62 28 78  TE TABLE aux.b(x
4e50: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
4e60: 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28  T INTO a VALUES(
4e70: 27 64 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a 20  'double-you');. 
4e80: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4e90: 54 4f 20 61 20 56 41 4c 55 45 53 28 27 77 68 79  TO a VALUES('why
4ea0: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
4eb0: 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53  RT INTO a VALUES
4ec0: 28 27 7a 65 64 27 29 3b 0a 20 20 20 20 20 20 20  ('zed');.       
4ed0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56   INSERT INTO b V
4ee0: 41 4c 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20 20  ALUES('won');.  
4ef0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4f00: 4f 20 62 20 56 41 4c 55 45 53 28 27 74 6f 6f 27  O b VALUES('too'
4f10: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
4f20: 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28  T INTO b VALUES(
4f30: 27 66 72 65 65 27 29 3b 0a 20 20 20 20 20 20 22  'free');.      "
4f40: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
4f50: 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  .        BEGIN;.
4f60: 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54            INSERT
4f70: 20 49 4e 54 4f 20 61 20 53 45 4c 45 43 54 20 2a   INTO a SELECT *
4f80: 20 46 52 4f 4d 20 62 20 57 48 45 52 45 20 72 6f   FROM b WHERE ro
4f90: 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20  wid<=3;.        
4fa0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
4fb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 20  SELECT * FROM a 
4fc0: 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a  WHERE rowid<=3;.
4fd0: 20 20 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a          COMMIT;.
4fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d        }.    } {}
4ff0: 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 7b  .    tv filter {
5000: 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 43 68 65  }.    .    # Che
5010: 63 6b 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ck that the tran
5020: 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
5030: 69 74 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  itted successful
5040: 6c 79 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f  ly..    #.    do
5050: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5060: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 32 20 7b  ger1-4.4.$tn.2 {
5070: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
5080: 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f  FROM a.    } {do
5090: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
50a0: 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20   won too free}. 
50b0: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
50c0: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
50d0: 6e 2e 33 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.3 {.      SELE
50e0: 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20  CT * FROM b.    
50f0: 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20  } {won too free 
5100: 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a  double-you why z
5110: 65 64 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52  ed}.    .    # R
5120: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5130: 73 79 73 74 65 6d 20 61 6e 64 20 72 65 6f 70 65  system and reope
5140: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e  n the databases.
5150: 20 43 68 65 63 6b 20 74 68 61 74 20 69 74 20 6e   Check that it n
5160: 6f 77 0a 20 20 20 20 23 20 61 70 70 65 61 72 73  ow.    # appears
5170: 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
5180: 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f  ction was not co
5190: 6d 6d 69 74 74 65 64 20 28 62 65 63 61 75 73 65  mmitted (because
51a0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
51b0: 0a 20 20 20 20 23 20 77 61 73 20 72 65 73 74 6f  .    # was resto
51c0: 72 65 64 20 74 6f 20 74 68 65 20 73 74 61 74 65  red to the state
51d0: 20 77 68 65 72 65 20 69 74 20 68 61 64 20 6e 6f   where it had no
51e0: 74 20 62 65 65 6e 29 2e 0a 20 20 20 20 23 0a 20  t been)..    #. 
51f0: 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72     do_test pager
5200: 31 2d 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20 20  1-4.4.$tn.4 {.  
5210: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
5220: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20  tore_and_reopen 
5230: 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65 78  $prefix.      ex
5240: 65 63 73 71 6c 20 22 41 54 54 41 43 48 20 27 24  ecsql "ATTACH '$
5250: 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75  {prefix}2' AS au
5260: 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20  x".    } {}.    
5270: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5280: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35  pager1-4.4.$tn.5
5290: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
52a0: 61 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77  a} {double-you w
52b0: 68 79 20 7a 65 64 7d 0a 20 20 20 20 64 6f 5f 65  hy zed}.    do_e
52c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
52d0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45  r1-4.4.$tn.6 {SE
52e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b  LECT * FROM b} {
52f0: 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20  won too free}.  
5300: 20 20 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65    .    # Restore
5310: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5320: 20 61 67 61 69 6e 2e 20 54 68 69 73 20 74 69 6d   again. This tim
5330: 65 2c 20 62 65 66 6f 72 65 20 72 65 6f 70 65 6e  e, before reopen
5340: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
5350: 73 2c 0a 20 20 20 20 23 20 64 65 6c 65 74 65 20  s,.    # delete 
5360: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
5370: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65  al file from the
5380: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 49 74   file-system. It
5390: 20 6e 6f 77 20 61 70 70 65 61 72 73 20 74 68 61   now appears tha
53a0: 74 0a 20 20 20 20 23 20 74 68 65 20 74 72 61 6e  t.    # the tran
53b0: 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
53c0: 69 74 74 65 64 20 28 6e 6f 20 6d 61 73 74 65 72  itted (no master
53d0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 3d 3d  -journal file ==
53e0: 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20   no rollback).. 
53f0: 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74     #.    do_test
5400: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5410: 37 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73  7 {.      faults
5420: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5430: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
5440: 20 20 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67      foreach f [g
5450: 6c 6f 62 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a  lob ${prefix}-mj
5460: 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65  *] { forcedelete
5470: 20 24 66 20 7d 0a 20 20 20 20 20 20 65 78 65 63   $f }.      exec
5480: 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70  sql "ATTACH '${p
5490: 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22  refix}2' AS aux"
54a0: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
54b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
54c0: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b  ger1-4.4.$tn.8 {
54d0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
54e0: 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f  FROM a.    } {do
54f0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
5500: 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20   won too free}. 
5510: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
5520: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5530: 6e 2e 39 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.9 {.      SELE
5540: 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20  CT * FROM b.    
5550: 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20  } {won too free 
5560: 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a  double-you why z
5570: 65 64 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70  ed}.  }..  cd $p
5580: 77 64 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  wd.}.db close.tv
5590: 20 64 65 6c 65 74 65 0a 66 6f 72 63 65 64 65 6c   delete.forcedel
55a0: 65 74 65 20 24 64 69 72 6e 61 6d 65 0a 0a 0a 23  ete $dirname...#
55b0: 20 53 65 74 20 75 70 20 61 20 56 46 53 20 74 6f   Set up a VFS to
55c0: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
55d0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
55e0: 6a 75 73 74 20 62 65 66 6f 72 65 20 64 65 6c 65  just before dele
55f0: 74 69 6e 67 20 61 0a 23 20 6a 6f 75 72 6e 61 6c  ting a.# journal
5600: 20 66 69 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20   file to commit 
5610: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  a transaction. T
5620: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  he transaction m
5630: 6f 64 69 66 69 65 73 20 65 78 61 63 74 6c 79 0a  odifies exactly.
5640: 23 20 74 77 6f 20 64 61 74 61 62 61 73 65 20 70  # two database p
5650: 61 67 65 73 20 28 61 6e 64 20 70 61 67 65 20 31  ages (and page 1
5660: 20 2d 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f   - the change co
5670: 75 6e 74 65 72 29 2e 0a 23 0a 74 65 73 74 76 66  unter)..#.testvf
5680: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
5690: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 35 31  tv sectorsize 51
56a0: 32 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70 79  2.tv script copy
56b0: 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65  _on_journal_dele
56c0: 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78 44 65  te.tv filter xDe
56d0: 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f  lete.proc copy_o
56e0: 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65  n_journal_delete
56f0: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
5700: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
5710: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a  [string match *j
5720: 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e 61 6d 65  ournal $filename
5730: 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  ]} faultsim_save
5740: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
5750: 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f  E_OK.}.faultsim_
5760: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
5770: 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  n.do_execsql_tes
5780: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 31 20 7b  t pager1.4.5.1 {
5790: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
57a0: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
57b0: 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73  .  PRAGMA page_s
57c0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 43 52  ize = 1024;.  CR
57d0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
57e0: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   b);.  CREATE TA
57f0: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
5800: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5810: 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27 29  ALUES('I', 'II')
5820: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
5830: 74 32 20 56 41 4c 55 45 53 28 27 49 49 49 27 2c  t2 VALUES('III',
5840: 20 27 49 56 27 29 3b 0a 20 20 42 45 47 49 4e 3b   'IV');.  BEGIN;
5850: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5860: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
5870: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5880: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34  O t2 VALUES(3, 4
5890: 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b  );.  COMMIT;.} {
58a0: 64 65 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65  delete}.tv filte
58b0: 72 20 7b 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68  r {}..# Check th
58c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
58d0: 73 20 63 6f 6d 6d 69 74 74 65 64 3a 0a 23 0a 64  s committed:.#.d
58e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
58f0: 61 67 65 72 31 2e 34 2e 35 2e 32 20 7b 0a 20 20  ager1.4.5.2 {.  
5900: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5910: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5920: 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20  M t2;.} {I II 1 
5930: 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 23  2 III IV 3 4}..#
5940: 20 4e 6f 77 20 74 72 79 20 66 6f 75 72 20 74 65   Now try four te
5950: 73 74 73 3a 0a 23 0a 23 20 20 70 61 67 65 72 31  sts:.#.#  pager1
5960: 2d 34 2e 35 2e 33 3a 20 52 65 73 74 6f 72 65 20  -4.5.3: Restore 
5970: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
5980: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
5990: 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
59a0: 6e 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  n .#            
59b0: 20 20 20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61      is rolled ba
59c0: 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  ck..#.#  pager1-
59d0: 34 2e 35 2e 34 3a 20 52 65 73 74 6f 72 65 20 74  4.5.4: Restore t
59e0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
59f0: 43 6f 72 72 75 70 74 20 74 68 65 20 66 69 72 73  Corrupt the firs
5a00: 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 0a  t record in the.
5a10: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
5a20: 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20   journal. Check 
5a30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5a40: 69 73 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61  is not rolled ba
5a50: 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  ck..#.#  pager1-
5a60: 34 2e 35 2e 35 3a 20 52 65 73 74 6f 72 65 20 74  4.5.5: Restore t
5a70: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
5a80: 43 6f 72 72 75 70 74 20 74 68 65 20 73 65 63 6f  Corrupt the seco
5a90: 6e 64 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  nd record in the
5aa0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5ab0: 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b    journal. Check
5ac0: 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
5ad0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74 72  record in the tr
5ae0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20  ansaction is .# 
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
5b00: 6c 61 79 65 64 20 62 61 63 6b 2c 20 62 75 74 20  layed back, but 
5b10: 6e 6f 74 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a  not the second..
5b20: 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e  #.#  pager1-4.5.
5b30: 36 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20 66  6: Restore the f
5b40: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 72 79 20  ile-system. Try 
5b50: 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
5b60: 62 61 73 65 20 77 69 74 68 20 61 0a 23 20 20 20  base with a.#   
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
5b80: 64 6f 6e 6c 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  donly connection
5b90: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61  . This should fa
5ba0: 69 6c 2c 20 61 73 20 61 20 72 65 61 64 2d 6f 6e  il, as a read-on
5bb0: 6c 79 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ly.#            
5bc0: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63      connection c
5bd0: 61 6e 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  annot roll back 
5be0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
5bf0: 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 72 65  e..#.faultsim_re
5c00: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5c10: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
5c20: 20 70 61 67 65 72 31 2e 34 2e 35 2e 33 20 7b 0a   pager1.4.5.3 {.
5c30: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5c40: 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  t1;.  SELECT * F
5c50: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20  ROM t2;.} {I II 
5c60: 49 49 49 20 49 56 7d 0a 66 61 75 6c 74 73 69 6d  III IV}.faultsim
5c70: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5c80: 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20  pen.hexio_write 
5c90: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
5ca0: 5b 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34  [expr 512+4+1024
5cb0: 20 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37   - 202] 01234567
5cc0: 38 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63  89ABCDEF.do_exec
5cd0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5ce0: 34 2e 35 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  4.5.4 {.  SELECT
5cf0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
5d00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
5d10: 7d 20 7b 49 20 49 49 20 31 20 32 20 49 49 49 20  } {I II 1 2 III 
5d20: 49 56 20 33 20 34 7d 0a 66 61 75 6c 74 73 69 6d  IV 3 4}.faultsim
5d30: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5d40: 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20  pen.hexio_write 
5d50: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
5d60: 5b 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34  [expr 512+4+1024
5d70: 2b 34 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d  +4+4+1024 - 202]
5d80: 20 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45   0123456789ABCDE
5d90: 46 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  F.do_execsql_tes
5da0: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 35 20 7b  t pager1.4.5.5 {
5db0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5dc0: 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20   t1;.  SELECT * 
5dd0: 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49  FROM t2;.} {I II
5de0: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 66 61   III IV 3 4}..fa
5df0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5e00: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f  nd_reopen.db clo
5e10: 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  se.sqlite3 db te
5e20: 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20  st.db -readonly 
5e30: 31 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  1.do_catchsql_te
5e40: 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 36 20  st pager1.4.5.6 
5e50: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
5e60: 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a  M t1;.  SELECT *
5e70: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b   FROM t2;.} {1 {
5e80: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d  disk I/O error}}
5e90: 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20 53 6e 61  .db close..# Sna
5ea0: 70 73 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73  pshot the file-s
5eb0: 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72  ystem just befor
5ec0: 65 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  e multi-file com
5ed0: 6d 69 74 2e 20 53 61 76 65 20 74 68 65 20 6e 61  mit. Save the na
5ee0: 6d 65 0a 23 20 6f 66 20 74 68 65 20 6d 61 73 74  me.# of the mast
5ef0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5f00: 69 6e 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  in $::mj_filenam
5f10: 65 2e 0a 23 0a 74 76 20 73 63 72 69 70 74 20 63  e..#.tv script c
5f20: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
5f30: 0a 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65  .tv filter xDele
5f40: 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f  te.proc copy_on_
5f50: 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f  mj_delete {metho
5f60: 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d  d filename args}
5f70: 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67   {.  if {[string
5f80: 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c   match *mj* [fil
5f90: 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65  e tail $filename
5fa0: 5d 5d 7d 20 7b 20 0a 20 20 20 20 73 65 74 20 3a  ]]} { .    set :
5fb0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 24 66 69  :mj_filename $fi
5fc0: 6c 65 6e 61 6d 65 0a 20 20 20 20 66 61 75 6c 74  lename.    fault
5fd0: 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d 0a 20 20  sim_save .  }.  
5fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5ff0: 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .}.do_test pager
6000: 31 2e 34 2e 36 2e 31 20 7b 0a 20 20 66 61 75 6c  1.4.6.1 {.  faul
6010: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
6020: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
6030: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
6040: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
6050: 45 54 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20  ETE;.    ATTACH 
6060: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74 77  'test.db2' AS tw
6070: 6f 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  o;.    CREATE TA
6080: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
6090: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
60a0: 77 6f 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  wo.t2(a, b);.   
60b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
60c0: 56 41 4c 55 45 53 28 31 2c 20 27 74 31 2e 31 27  VALUES(1, 't1.1'
60d0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
60e0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
60f0: 27 74 32 2e 31 27 29 3b 0a 20 20 20 20 42 45 47  't2.1');.    BEG
6100: 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  IN;.      UPDATE
6110: 20 74 31 20 53 45 54 20 62 20 3d 20 27 74 31 2e   t1 SET b = 't1.
6120: 32 27 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  2';.      UPDATE
6130: 20 74 32 20 53 45 54 20 62 20 3d 20 27 74 32 2e   t2 SET b = 't2.
6140: 32 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  2';.    COMMIT;.
6150: 20 20 7d 0a 20 20 74 76 20 66 69 6c 74 65 72 20    }.  tv filter 
6160: 7b 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20  {}.  db close.} 
6170: 7b 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  {}..faultsim_res
6180: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
6190: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
61a0: 70 61 67 65 72 31 2e 34 2e 36 2e 32 20 7b 20 53  pager1.4.6.2 { S
61b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
61c0: 7d 20 20 20 20 20 20 20 20 20 20 20 7b 31 20 74  }           {1 t
61d0: 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20  1.1}.do_test    
61e0: 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e       pager1.4.6.
61f0: 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  3 { file exists 
6200: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d  $::mj_filename }
6210: 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {1}.do_execsql_
6220: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6230: 34 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65  4 {.  ATTACH 'te
6240: 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a  st.db2' AS two;.
6250: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6260: 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64  t2;.} {1 t2.1}.d
6270: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
6280: 36 2e 35 20 7b 20 66 69 6c 65 20 65 78 69 73 74  6.5 { file exist
6290: 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  s $::mj_filename
62a0: 20 7d 20 7b 30 7d 0a 0a 66 61 75 6c 74 73 69 6d   } {0}..faultsim
62b0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
62c0: 70 65 6e 0a 64 62 20 63 6c 6f 73 65 0a 64 6f 5f  pen.db close.do_
62d0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
62e0: 38 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 6a 5f 66  8 {.  set ::mj_f
62f0: 69 6c 65 6e 61 6d 65 31 20 24 3a 3a 6d 6a 5f 66  ilename1 $::mj_f
6300: 69 6c 65 6e 61 6d 65 0a 20 20 74 76 20 66 69 6c  ilename.  tv fil
6310: 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20 73 71  ter xDelete.  sq
6320: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
6330: 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  2.  execsql {.  
6340: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
6350: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
6360: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
6370: 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a  .db3' AS three;.
6380: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6390: 20 74 68 72 65 65 2e 74 33 28 61 2c 20 62 29 3b   three.t3(a, b);
63a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
63b0: 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20 27 74   t3 VALUES(1, 't
63c0: 33 2e 31 27 29 3b 0a 20 20 20 20 42 45 47 49 4e  3.1');.    BEGIN
63d0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
63e0: 32 20 53 45 54 20 62 20 3d 20 27 74 32 2e 33 27  2 SET b = 't2.3'
63f0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
6400: 33 20 53 45 54 20 62 20 3d 20 27 74 33 2e 33 27  3 SET b = 't3.3'
6410: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
6420: 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 6a 5f  }.  expr {$::mj_
6430: 66 69 6c 65 6e 61 6d 65 31 20 21 3d 20 24 3a 3a  filename1 != $::
6440: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 7d 0a 7d 20 7b  mj_filename}.} {
6450: 31 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  1}.faultsim_rest
6460: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 74  ore_and_reopen.t
6470: 76 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 54  v filter {}..# T
6480: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6e  he file-system n
6490: 6f 77 20 63 6f 6e 74 61 69 6e 73 3a 0a 23 0a 23  ow contains:.#.#
64a0: 20 20 20 2a 20 74 68 72 65 65 20 64 61 74 61 62     * three datab
64b0: 61 73 65 73 0a 23 20 20 20 2a 20 74 68 72 65 65  ases.#   * three
64c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
64d0: 65 73 0a 23 20 20 20 2a 20 74 77 6f 20 6d 61 73  es.#   * two mas
64e0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
64f0: 73 2e 0a 23 0a 23 20 54 68 65 20 68 6f 74 2d 6a  s..#.# The hot-j
6500: 6f 75 72 6e 61 6c 73 20 61 73 73 6f 63 69 61 74  ournals associat
6510: 65 64 20 77 69 74 68 20 74 65 73 74 2e 64 62 32  ed with test.db2
6520: 20 61 6e 64 20 74 65 73 74 2e 64 62 33 20 70 6f   and test.db3 po
6530: 69 6e 74 20 74 6f 0a 23 20 6d 61 73 74 65 72 20  int to.# master 
6540: 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69  journal $::mj_fi
6550: 6c 65 6e 61 6d 65 2e 20 54 68 65 20 68 6f 74 2d  lename. The hot-
6560: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 73  journal file ass
6570: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 23 20 74  ociated with.# t
6580: 65 73 74 2e 64 62 20 70 6f 69 6e 74 73 20 74 6f  est.db points to
6590: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
65a0: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e  $::mj_filename1.
65b0: 20 53 6f 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   So reading from
65c0: 0a 23 20 74 65 73 74 2e 64 62 20 73 68 6f 75 6c  .# test.db shoul
65d0: 64 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66  d delete $::mj_f
65e0: 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74  ilename1..#.do_t
65f0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 39  est pager1.4.6.9
6600: 20 7b 0a 20 20 6c 73 6f 72 74 20 5b 67 6c 6f 62   {.  lsort [glob
6610: 20 74 65 73 74 2e 64 62 2a 5d 0a 7d 20 5b 6c 73   test.db*].} [ls
6620: 6f 72 74 20 5b 6c 69 73 74 20 20 20 20 20 20 20  ort [list       
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 20      \.  test.db 
6660: 74 65 73 74 2e 64 62 32 20 74 65 73 74 2e 64 62  test.db2 test.db
6670: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
6690: 0a 20 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  .  test.db-journ
66a0: 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72  al test.db2-jour
66b0: 6e 61 6c 20 74 65 73 74 2e 64 62 33 2d 6a 6f 75  nal test.db3-jou
66c0: 72 6e 61 6c 20 20 20 20 20 20 5c 0a 20 20 5b 66  rnal      \.  [f
66d0: 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66  ile tail $::mj_f
66e0: 69 6c 65 6e 61 6d 65 5d 20 5b 66 69 6c 65 20 74  ilename] [file t
66f0: 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  ail $::mj_filena
6700: 6d 65 31 5d 0a 5d 5d 0a 0a 23 20 54 68 65 20 6d  me1].]]..# The m
6710: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 24 3a  aster-journal $:
6720: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 63 6f  :mj_filename1 co
6730: 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
6740: 74 6f 20 74 65 73 74 2e 64 62 20 61 6e 64 20 0a  to test.db and .
6750: 23 20 74 65 73 74 2e 64 62 32 2e 20 48 6f 77 65  # test.db2. Howe
6760: 76 65 72 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ver the hot-jour
6770: 6e 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77  nal associated w
6780: 69 74 68 20 74 65 73 74 2e 64 62 32 20 70 6f 69  ith test.db2 poi
6790: 6e 74 73 20 74 6f 0a 23 20 61 20 64 69 66 66 65  nts to.# a diffe
67a0: 72 65 6e 74 20 6d 61 73 74 65 72 2d 6a 6f 75 72  rent master-jour
67b0: 6e 61 6c 2e 20 54 68 65 72 65 66 6f 72 65 2c 20  nal. Therefore, 
67c0: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 65 73  reading from tes
67d0: 74 2e 64 62 20 6f 6e 6c 79 20 73 68 6f 75 6c 64  t.db only should
67e0: 0a 23 20 62 65 20 65 6e 6f 75 67 68 20 74 6f 20  .# be enough to 
67f0: 63 61 75 73 65 20 53 51 4c 69 74 65 20 74 6f 20  cause SQLite to 
6800: 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c  delete $::mj_fil
6810: 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73  ename1..#.do_tes
6820: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
6830: 2e 34 2e 36 2e 31 30 20 7b 20 66 69 6c 65 20 65  .4.6.10 { file e
6840: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6850: 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74  name  } {1}.do_t
6860: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
6870: 72 31 2e 34 2e 36 2e 31 31 20 7b 20 66 69 6c 65  r1.4.6.11 { file
6880: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
6890: 6c 65 6e 61 6d 65 31 20 7d 20 7b 31 7d 0a 64 6f  lename1 } {1}.do
68a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
68b0: 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b 20 53 45  ger1.4.6.12 { SE
68c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
68d0: 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73   {1 t1.1}.do_tes
68e0: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
68f0: 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 65  .4.6.13 { file e
6900: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6910: 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74  name  } {1}.do_t
6920: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
6930: 72 31 2e 34 2e 36 2e 31 34 20 7b 20 66 69 6c 65  r1.4.6.14 { file
6940: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
6950: 6c 65 6e 61 6d 65 31 20 7d 20 7b 30 7d 0a 0a 64  lename1 } {0}..d
6960: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
6970: 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b 0a 20  ager1.4.6.12 {. 
6980: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
6990: 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 53 45 4c  2' AS two;.  SEL
69a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
69b0: 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65 73   {1 t2.1}.do_tes
69c0: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
69d0: 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 65  .4.6.13 { file e
69e0: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
69f0: 6e 61 6d 65 20 7d 20 20 7b 31 7d 0a 64 6f 5f 65  name }  {1}.do_e
6a00: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
6a10: 72 31 2e 34 2e 36 2e 31 34 20 7b 0a 20 20 41 54  r1.4.6.14 {.  AT
6a20: 54 41 43 48 20 27 74 65 73 74 2e 64 62 33 27 20  TACH 'test.db3' 
6a30: 41 53 20 74 68 72 65 65 3b 0a 20 20 53 45 4c 45  AS three;.  SELE
6a40: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d 20  CT * FROM t3;.} 
6a50: 7b 31 20 74 33 2e 31 7d 0a 64 6f 5f 74 65 73 74  {1 t3.1}.do_test
6a60: 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e           pager1.
6a70: 34 2e 36 2e 31 35 20 7b 20 66 69 6c 65 20 65 78  4.6.15 { file ex
6a80: 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  ists $::mj_filen
6a90: 61 6d 65 20 7d 20 20 7b 30 7d 0a 0a 64 62 20 63  ame }  {0}..db c
6aa0: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
6ab0: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
6ac0: 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73  ult 1.tv sectors
6ad0: 69 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69 70  ize 512.tv scrip
6ae0: 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61  t copy_on_journa
6af0: 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74  l_delete.tv filt
6b00: 65 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20  er xDelete.proc 
6b10: 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f  copy_on_journal_
6b20: 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66  delete {method f
6b30: 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a  ilename args} {.
6b40: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
6b50: 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69  tch *journal $fi
6b60: 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69  lename]} faultsi
6b70: 6d 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e  m_save .  return
6b80: 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75   SQLITE_OK.}.fau
6b90: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
6ba0: 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73  _reopen.do_execs
6bb0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
6bc0: 2e 37 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20  .7.1 {.  PRAGMA 
6bd0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
6be0: 45 4c 45 54 45 3b 0a 20 20 43 52 45 41 54 45 20  ELETE;.  CREATE 
6bf0: 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41  TABLE t1(x PRIMA
6c00: 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 43 52  RY KEY, y);.  CR
6c10: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
6c20: 20 74 31 28 79 29 3b 0a 20 20 49 4e 53 45 52 54   t1(y);.  INSERT
6c30: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6c40: 27 49 27 2c 20 20 20 27 6f 6e 65 27 29 3b 0a 20  'I',   'one');. 
6c50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6c60: 56 41 4c 55 45 53 28 27 49 49 27 2c 20 20 27 66  VALUES('II',  'f
6c70: 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  our');.  INSERT 
6c80: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
6c90: 49 49 49 27 2c 20 27 6e 69 6e 65 27 29 3b 0a 20  III', 'nine');. 
6ca0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
6cb0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6cc0: 53 28 27 49 56 27 2c 20 27 73 69 78 74 65 65 6e  S('IV', 'sixteen
6cd0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
6ce0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 56  NTO t1 VALUES('V
6cf0: 27 20 2c 20 27 74 77 65 6e 74 79 66 69 76 65 27  ' , 'twentyfive'
6d00: 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b  );.  COMMIT;.} {
6d10: 64 65 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65  delete}.tv filte
6d20: 72 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  r {}.db close.tv
6d30: 20 64 65 6c 65 74 65 20 0a 64 6f 5f 74 65 73 74   delete .do_test
6d40: 20 70 61 67 65 72 31 2e 34 2e 37 2e 32 20 7b 0a   pager1.4.7.2 {.
6d50: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
6d60: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
6d70: 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72  catch {file attr
6d80: 69 62 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a  ibutes test.db-j
6d90: 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69 73 73 69  ournal -permissi
6da0: 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20  ons r--------}. 
6db0: 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74   catch {file att
6dc0: 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62 2d  ributes test.db-
6dd0: 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c  journal -readonl
6de0: 79 20 31 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  y 1}.  catchsql 
6df0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6e00: 74 31 20 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c  t1 }.} {1 {unabl
6e10: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
6e20: 73 65 20 66 69 6c 65 7d 7d 0a 64 6f 5f 74 65 73  se file}}.do_tes
6e30: 74 20 70 61 67 65 72 31 2e 34 2e 37 2e 33 20 7b  t pager1.4.7.3 {
6e40: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61  .  db close.  ca
6e50: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
6e60: 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  utes test.db-jou
6e70: 72 6e 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e  rnal -permission
6e80: 73 20 72 77 2d 72 77 2d 72 77 2d 7d 0a 20 20 63  s rw-rw-rw-}.  c
6e90: 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69  atch {file attri
6ea0: 62 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f  butes test.db-jo
6eb0: 75 72 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20  urnal -readonly 
6ec0: 30 7d 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65  0}.  delete_file
6ed0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
6ee0: 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74  .  file exists t
6ef0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d  est.db-journal.}
6f00: 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {0}..#---------
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
6f60: 20 74 65 73 74 73 20 64 65 61 6c 20 77 69 74 68   tests deal with
6f70: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
6f80: 69 74 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  its..#.# pager1-
6f90: 35 2e 31 2e 2a 3a 20 54 68 65 20 63 61 73 65 20  5.1.*: The case 
6fa0: 77 68 65 72 65 20 61 20 6d 75 6c 74 69 2d 66 69  where a multi-fi
6fb0: 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6d  le cannot be com
6fc0: 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 0a 23  mitted because.#
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
6fe0: 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
6ff0: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 53  n is holding a S
7000: 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 6f 6e  HARED lock on on
7010: 65 20 6f 66 20 74 68 65 0a 23 20 20 20 20 20 20  e of the.#      
7020: 20 20 20 20 20 20 20 20 20 66 69 6c 65 73 2e 20           files. 
7030: 41 66 74 65 72 20 74 68 65 20 53 48 41 52 45 44  After the SHARED
7040: 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
7050: 2c 20 74 68 65 20 43 4f 4d 4d 49 54 20 73 75 63  , the COMMIT suc
7060: 63 65 65 64 73 2e 0a 23 0a 23 20 70 61 67 65 72  ceeds..#.# pager
7070: 31 2d 35 2e 32 2e 2a 3a 20 4d 75 6c 74 69 2d 66  1-5.2.*: Multi-f
7080: 69 6c 65 20 63 6f 6d 6d 69 74 73 20 77 69 74 68  ile commits with
7090: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6d 65   journal_mode=me
70a0: 6d 6f 72 79 2e 0a 23 0a 23 20 70 61 67 65 72 31  mory..#.# pager1
70b0: 2d 35 2e 33 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69  -5.3.*: Multi-fi
70c0: 6c 65 20 63 6f 6d 6d 69 74 73 20 77 69 74 68 20  le commits with 
70d0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d  journal_mode=mem
70e0: 6f 72 79 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  ory..#.# pager1-
70f0: 35 2e 34 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61  5.4.*: Check tha
7100: 74 20 77 69 74 68 20 73 79 6e 63 68 72 6f 6e 6f  t with synchrono
7110: 75 73 3d 6e 6f 72 6d 61 6c 2c 20 74 68 65 20 6d  us=normal, the m
7120: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
7130: 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  le.#            
7140: 20 20 20 6e 61 6d 65 20 69 73 20 61 64 64 65 64     name is added
7150: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
7160: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  le immediately a
7170: 66 74 65 72 20 74 68 65 20 6c 61 73 74 0a 23 20  fter the last.# 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
7190: 75 72 6e 61 6c 20 72 65 63 6f 72 64 2e 20 42 75  urnal record. Bu
71a0: 74 20 77 69 74 68 20 73 79 6e 63 68 72 6f 6e 6f  t with synchrono
71b0: 75 73 3d 66 75 6c 6c 2c 20 65 78 74 72 61 20 75  us=full, extra u
71c0: 6e 75 73 65 64 20 73 70 61 63 65 0a 23 20 20 20  nused space.#   
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61              is a
71e0: 6c 6c 6f 63 61 74 65 64 20 62 65 74 77 65 65 6e  llocated between
71f0: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
7200: 6c 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  l record and the
7210: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
7220: 20 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c    master-journal
7230: 20 66 69 6c 65 20 6e 61 6d 65 20 73 6f 20 74 68   file name so th
7240: 61 74 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  at the master-jo
7250: 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20 20  urnal file.#    
7260: 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 20             name 
7270: 64 6f 65 73 20 6e 6f 74 20 6c 69 65 20 6f 6e 20  does not lie on 
7280: 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 20  the same sector 
7290: 61 73 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72  as the last jour
72a0: 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20  nal file.#      
72b0: 20 20 20 20 20 20 20 20 20 72 65 63 6f 72 64 2e           record.
72c0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 35 2e  .#.# pager1-5.5.
72d0: 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20 69 6e  *: Check that in
72e0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
72f0: 52 53 49 53 54 20 6d 6f 64 65 2c 20 61 20 6a 6f  RSIST mode, a jo
7300: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 23 20  urnal file is.# 
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
7320: 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
7330: 62 79 74 65 73 20 77 68 65 6e 20 61 20 6d 75 6c  bytes when a mul
7340: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
7350: 69 6f 6e 20 69 73 20 0a 23 20 20 20 20 20 20 20  ion is .#       
7360: 20 20 20 20 20 20 20 20 63 6f 6d 6d 69 74 74 65          committe
7370: 64 20 28 69 6e 73 74 65 61 64 20 6f 66 20 74 68  d (instead of th
7380: 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f  e first couple o
7390: 66 20 62 79 74 65 73 20 62 65 69 6e 67 20 7a 65  f bytes being ze
73a0: 72 6f 65 64 29 2e 0a 23 0a 23 0a 64 6f 5f 74 65  roed)..#.#.do_te
73b0: 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 31 20  st pager1-5.1.1 
73c0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
73d0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
73e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 41   execsql {.    A
73f0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
7400: 20 41 53 20 61 75 78 3b 0a 20 20 20 20 43 52 45   AS aux;.    CRE
7410: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
7420: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
7430: 41 42 4c 45 20 61 75 78 2e 74 32 28 61 2c 20 62  ABLE aux.t2(a, b
7440: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
7450: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 37 2c  TO t1 VALUES(17,
7460: 20 27 4c 65 6e 69 6e 27 29 3b 0a 20 20 20 20 49   'Lenin');.    I
7470: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7480: 4c 55 45 53 28 32 32 2c 20 27 53 74 61 6c 69 6e  LUES(22, 'Stalin
7490: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
74a0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 33  NTO t1 VALUES(53
74b0: 2c 20 27 4b 68 72 75 73 68 63 68 65 76 27 29 3b  , 'Khrushchev');
74c0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
74d0: 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 32 20 7b  t pager1-5.1.2 {
74e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
74f0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
7500: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
7510: 55 45 53 28 36 34 2c 20 27 42 72 65 7a 68 6e 65  UES(64, 'Brezhne
7520: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
7530: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
7540: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
7550: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
7560: 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c  st.db2.  execsql
7570: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
7580: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
7590: 4d 20 74 32 3b 0a 20 20 7d 20 64 62 32 0a 7d 20  M t2;.  } db2.} 
75a0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
75b0: 31 2d 35 2e 31 2e 33 20 7b 0a 20 20 63 61 74 63  1-5.1.3 {.  catc
75c0: 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31  hsql COMMIT.} {1
75d0: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
75e0: 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 70  cked}}.do_test p
75f0: 61 67 65 72 31 2d 35 2e 31 2e 34 20 7b 0a 20 20  ager1-5.1.4 {.  
7600: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 20 64  execsql COMMIT d
7610: 62 32 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d  b2.  execsql COM
7620: 4d 49 54 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  MIT.  execsql { 
7630: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
7640: 20 7d 20 64 62 32 0a 7d 20 7b 31 37 20 4c 65 6e   } db2.} {17 Len
7650: 69 6e 20 32 32 20 53 74 61 6c 69 6e 20 35 33 20  in 22 Stalin 53 
7660: 4b 68 72 75 73 68 63 68 65 76 20 36 34 20 42 72  Khrushchev 64 Br
7670: 65 7a 68 6e 65 76 7d 0a 64 6f 5f 74 65 73 74 20  ezhnev}.do_test 
7680: 70 61 67 65 72 31 2d 35 2e 31 2e 35 20 7b 0a 20  pager1-5.1.5 {. 
7690: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a   db2 close.} {}.
76a0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
76b0: 35 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  5.2.1 {.  execsq
76c0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
76d0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65  ournal_mode = me
76e0: 6d 6f 72 79 3b 0a 20 20 20 20 42 45 47 49 4e 3b  mory;.    BEGIN;
76f0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
7700: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38 34 2c  TO t1 VALUES(84,
7710: 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a 20 20   'Andropov');.  
7720: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7730: 74 32 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41  t2 VALUES(84, 'A
7740: 6e 64 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 43  ndropov');.    C
7750: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6d 65  OMMIT;.  }.} {me
7760: 6d 6f 72 79 7d 0a 64 6f 5f 74 65 73 74 20 70 61  mory}.do_test pa
7770: 67 65 72 31 2d 35 2e 33 2e 31 20 7b 0a 20 20 65  ger1-5.3.1 {.  e
7780: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
7790: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
77a0: 20 3d 20 6f 66 66 3b 0a 20 20 20 20 42 45 47 49   = off;.    BEGI
77b0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
77c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38  INTO t1 VALUES(8
77d0: 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27 29 3b  5, 'Gorbachev');
77e0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
77f0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38 35 2c  TO t2 VALUES(85,
7800: 20 27 47 6f 72 62 61 63 68 65 76 27 29 3b 0a 20   'Gorbachev');. 
7810: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
7820: 20 7b 6f 66 66 7d 0a 0a 64 6f 5f 74 65 73 74 20   {off}..do_test 
7830: 70 61 67 65 72 31 2d 35 2e 34 2e 31 20 7b 0a 20  pager1-5.4.1 {. 
7840: 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 65 73 74   db close.  test
7850: 76 66 73 20 74 76 0a 20 20 73 71 6c 69 74 65 33  vfs tv.  sqlite3
7860: 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73   db test.db -vfs
7870: 20 74 76 0a 20 20 65 78 65 63 73 71 6c 20 7b 20   tv.  execsql { 
7880: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32  ATTACH 'test.db2
7890: 27 20 41 53 20 61 75 78 20 7d 0a 0a 20 20 74 76  ' AS aux }..  tv
78a0: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
78b0: 20 20 74 76 20 73 63 72 69 70 74 20 6d 61 78 5f    tv script max_
78c0: 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 0a 20 20 74  journal_size.  t
78d0: 76 20 73 65 63 74 6f 72 73 69 7a 65 20 35 31 32  v sectorsize 512
78e0: 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75  .  set ::max_jou
78f0: 72 6e 61 6c 20 30 0a 20 20 70 72 6f 63 20 6d 61  rnal 0.  proc ma
7900: 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 20 7b  x_journal_size {
7910: 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20  method args} {. 
7920: 20 20 20 73 65 74 20 73 7a 20 30 0a 20 20 20 20     set sz 0.    
7930: 63 61 74 63 68 20 7b 20 73 65 74 20 73 7a 20 5b  catch { set sz [
7940: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
7950: 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20 20 20  b-journal] }.   
7960: 20 69 66 20 7b 24 73 7a 20 3e 20 24 3a 3a 6d 61   if {$sz > $::ma
7970: 78 5f 6a 6f 75 72 6e 61 6c 7d 20 7b 0a 20 20 20  x_journal} {.   
7980: 20 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75     set ::max_jou
7990: 72 6e 61 6c 20 24 73 7a 0a 20 20 20 20 7d 0a 20  rnal $sz.    }. 
79a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
79b0: 5f 4f 4b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  _OK.  }.  execsq
79c0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
79d0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
79e0: 4c 45 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41  LETE;.    PRAGMA
79f0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e   synchronous = N
7a00: 4f 52 4d 41 4c 3b 0a 20 20 20 20 42 45 47 49 4e  ORMAL;.    BEGIN
7a10: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
7a20: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38 35  NTO t1 VALUES(85
7a30: 2c 20 27 47 6f 72 62 61 63 68 65 76 27 29 3b 0a  , 'Gorbachev');.
7a40: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
7a50: 4f 20 74 32 20 56 41 4c 55 45 53 28 38 35 2c 20  O t2 VALUES(85, 
7a60: 27 47 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20  'Gorbachev');.  
7a70: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20    COMMIT;.  }.. 
7a80: 20 23 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74   # The size of t
7a90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7aa0: 69 73 20 6e 6f 77 3a 0a 20 20 23 20 0a 20 20 23  is now:.  # .  #
7ab0: 20 20 20 31 29 20 35 31 32 20 62 79 74 65 20 68     1) 512 byte h
7ac0: 65 61 64 65 72 20 2b 0a 20 20 23 20 20 20 32 29  eader +.  #   2)
7ad0: 20 32 20 2a 20 28 31 30 32 34 2b 38 29 20 62 79   2 * (1024+8) by
7ae0: 74 65 20 72 65 63 6f 72 64 73 20 2b 0a 20 20 23  te records +.  #
7af0: 20 20 20 33 29 20 32 30 2b 4e 20 62 79 74 65 73     3) 20+N bytes
7b00: 20 6f 66 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   of master-journ
7b10: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 77 68 65 72  al pointer, wher
7b20: 65 20 4e 20 69 73 20 74 68 65 20 73 69 7a 65 20  e N is the size 
7b30: 6f 66 20 0a 20 20 23 20 20 20 20 20 20 74 68 65  of .  #      the
7b40: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7b50: 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 61 73 20  name encoded as 
7b60: 75 74 66 2d 38 20 77 69 74 68 20 6e 6f 20 6e 75  utf-8 with no nu
7b70: 6c 20 74 65 72 6d 2e 0a 20 20 23 0a 20 20 73 65  l term..  #.  se
7b80: 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b 65 78  t mj_pointer [ex
7b90: 70 72 20 7b 0a 20 20 20 20 32 30 20 2b 20 5b 73  pr {.    20 + [s
7ba0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 22 74 65  tring length "te
7bb0: 73 74 2e 64 62 2d 6d 6a 58 58 58 58 58 58 39 58  st.db-mjXXXXXX9X
7bc0: 58 22 5d 0a 20 20 7d 5d 0a 20 20 23 0a 20 20 23  X"].  }].  #.  #
7bd0: 20 20 20 4e 4f 54 45 3a 20 46 6f 72 20 69 74 65     NOTE: For ite
7be0: 6d 20 33 20 61 62 6f 76 65 2c 20 69 66 20 74 68  m 3 above, if th
7bf0: 65 20 63 75 72 72 65 6e 74 20 53 51 4c 69 74 65  e current SQLite
7c00: 20 56 46 53 20 6c 61 63 6b 73 20 74 68 65 20 63   VFS lacks the c
7c10: 6f 6e 63 65 70 74 20 6f 66 20 61 0a 20 20 23 20  oncept of a.  # 
7c20: 20 20 20 20 20 20 20 20 63 75 72 72 65 6e 74 20          current 
7c30: 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 20 6c  directory, the l
7c40: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 63 75 72  ength of the cur
7c50: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6e  rent directory n
7c60: 61 6d 65 20 70 6c 75 73 20 31 0a 20 20 23 20 20  ame plus 1.  #  
7c70: 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65 72         character
7c80: 20 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f   for the directo
7c90: 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ry separator cha
7ca0: 72 61 63 74 65 72 20 61 72 65 20 4e 4f 54 20 63  racter are NOT c
7cb0: 6f 75 6e 74 65 64 20 61 73 0a 20 20 23 20 20 20  ounted as.  #   
7cc0: 20 20 20 20 20 20 70 61 72 74 20 6f 66 20 74 68        part of th
7cd0: 65 20 74 6f 74 61 6c 20 73 69 7a 65 3b 20 6f 74  e total size; ot
7ce0: 68 65 72 77 69 73 65 2c 20 74 68 65 79 20 61 72  herwise, they ar
7cf0: 65 2e 0a 20 20 23 0a 20 20 69 66 63 61 70 61 62  e..  #.  ifcapab
7d00: 6c 65 20 63 75 72 64 69 72 20 7b 0a 20 20 20 20  le curdir {.    
7d10: 73 65 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b  set mj_pointer [
7d20: 65 78 70 72 20 7b 24 6d 6a 5f 70 6f 69 6e 74 65  expr {$mj_pointe
7d30: 72 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  r + [string leng
7d40: 74 68 20 5b 67 65 74 5f 70 77 64 5d 5d 20 2b 20  th [get_pwd]] + 
7d50: 31 7d 5d 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b  1}].  }.  expr {
7d60: 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 3d 3d  $::max_journal==
7d70: 28 35 31 32 2b 32 2a 28 31 30 32 34 2b 38 29 2b  (512+2*(1024+8)+
7d80: 24 6d 6a 5f 70 6f 69 6e 74 65 72 29 7d 0a 7d 20  $mj_pointer)}.} 
7d90: 31 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  1.do_test pager1
7da0: 2d 35 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20 3a  -5.4.2 {.  set :
7db0: 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20  :max_journal 0. 
7dc0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
7dd0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
7de0: 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45  s = full;.    BE
7df0: 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  GIN;.      DELET
7e00: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
7e10: 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20  b = 'Lenin';.   
7e20: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
7e30: 32 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e  2 WHERE b = 'Len
7e40: 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  in';.    COMMIT;
7e50: 0a 20 20 7d 0a 0a 20 20 23 20 49 6e 20 73 79 6e  .  }..  # In syn
7e60: 63 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c 20 6d 6f  chronous=full mo
7e70: 64 65 2c 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  de, the master-j
7e80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
7e90: 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 0a 20 20  s not written.  
7ea0: 23 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72  # directly after
7eb0: 20 74 68 65 20 6c 61 73 74 20 72 65 63 6f 72 64   the last record
7ec0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
7ed0: 66 69 6c 65 2e 20 49 6e 73 74 65 61 64 2c 20 69  file. Instead, i
7ee0: 74 20 69 73 0a 20 20 23 20 77 72 69 74 74 65 6e  t is.  # written
7ef0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 74 68 65   starting at the
7f00: 20 6e 65 78 74 20 28 69 6e 20 74 68 69 73 20 63   next (in this c
7f10: 61 73 65 20 35 31 32 20 62 79 74 65 29 20 73 65  ase 512 byte) se
7f20: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 2e 0a 20  ctor boundary.. 
7f30: 20 23 0a 20 20 73 65 74 20 6d 6a 5f 70 6f 69 6e   #.  set mj_poin
7f40: 74 65 72 20 5b 65 78 70 72 20 7b 0a 20 20 20 20  ter [expr {.    
7f50: 32 30 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e  20 + [string len
7f60: 67 74 68 20 22 74 65 73 74 2e 64 62 2d 6d 6a 58  gth "test.db-mjX
7f70: 58 58 58 58 58 39 58 58 22 5d 0a 20 20 7d 5d 0a  XXXXX9XX"].  }].
7f80: 20 20 23 0a 20 20 23 20 20 20 4e 4f 54 45 3a 20    #.  #   NOTE: 
7f90: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  If the current S
7fa0: 51 4c 69 74 65 20 56 46 53 20 6c 61 63 6b 73 20  QLite VFS lacks 
7fb0: 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 61  the concept of a
7fc0: 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f   current directo
7fd0: 72 79 2c 0a 20 20 23 20 20 20 20 20 20 20 20 20  ry,.  #         
7fe0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
7ff0: 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74  e current direct
8000: 6f 72 79 20 6e 61 6d 65 20 70 6c 75 73 20 31 20  ory name plus 1 
8010: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 74 68  character for th
8020: 65 0a 20 20 23 20 20 20 20 20 20 20 20 20 64 69  e.  #         di
8030: 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f  rectory separato
8040: 72 20 63 68 61 72 61 63 74 65 72 20 61 72 65 20  r character are 
8050: 4e 4f 54 20 63 6f 75 6e 74 65 64 20 61 73 20 70  NOT counted as p
8060: 61 72 74 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  art of the total
8070: 0a 20 20 23 20 20 20 20 20 20 20 20 20 73 69 7a  .  #         siz
8080: 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68  e; otherwise, th
8090: 65 79 20 61 72 65 2e 0a 20 20 23 0a 20 20 69 66  ey are..  #.  if
80a0: 63 61 70 61 62 6c 65 20 63 75 72 64 69 72 20 7b  capable curdir {
80b0: 0a 20 20 20 20 73 65 74 20 6d 6a 5f 70 6f 69 6e  .    set mj_poin
80c0: 74 65 72 20 5b 65 78 70 72 20 7b 24 6d 6a 5f 70  ter [expr {$mj_p
80d0: 6f 69 6e 74 65 72 20 2b 20 5b 73 74 72 69 6e 67  ointer + [string
80e0: 20 6c 65 6e 67 74 68 20 5b 67 65 74 5f 70 77 64   length [get_pwd
80f0: 5d 5d 20 2b 20 31 7d 5d 0a 20 20 7d 0a 20 20 65  ]] + 1}].  }.  e
8100: 78 70 72 20 7b 24 3a 3a 6d 61 78 5f 6a 6f 75 72  xpr {$::max_jour
8110: 6e 61 6c 3d 3d 28 28 28 35 31 32 2b 32 2a 28 31  nal==(((512+2*(1
8120: 30 32 34 2b 38 29 2b 35 31 31 29 2f 35 31 32 29  024+8)+511)/512)
8130: 2a 35 31 32 20 2b 20 24 6d 6a 5f 70 6f 69 6e 74  *512 + $mj_point
8140: 65 72 29 7d 0a 7d 20 31 0a 64 62 20 63 6c 6f 73  er)}.} 1.db clos
8150: 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 64 6f 5f  e.tv delete..do_
8160: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 35 2e  test pager1-5.5.
8170: 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  1 {.  sqlite3 db
8180: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
8190: 71 6c 20 7b 20 0a 20 20 20 20 41 54 54 41 43 48  ql { .    ATTACH
81a0: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
81b0: 75 78 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  ux;.    PRAGMA j
81c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
81d0: 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45 41 54  RSIST;.    CREAT
81e0: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29  E TABLE t3(a, b)
81f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
8200: 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64  O t3 SELECT rand
8210: 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
8220: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
8230: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 55 50 44 41  ROM t1;.    UPDA
8240: 54 45 20 74 33 20 53 45 54 20 62 20 3d 20 72 61  TE t3 SET b = ra
8250: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 3b 0a  ndomblob(1500);.
8260: 20 20 7d 0a 20 20 65 78 70 72 20 5b 66 69 6c 65    }.  expr [file
8270: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
8280: 75 72 6e 61 6c 5d 20 3e 20 31 35 30 30 30 0a 7d  urnal] > 15000.}
8290: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   {1}.do_test pag
82a0: 65 72 31 2d 35 2e 35 2e 32 20 7b 0a 20 20 65 78  er1-5.5.2 {.  ex
82b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
82c0: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
82d0: 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e   full;.    BEGIN
82e0: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
82f0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d  ROM t1 WHERE b =
8300: 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 20   'Stalin';.     
8310: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20   DELETE FROM t2 
8320: 57 48 45 52 45 20 62 20 3d 20 27 53 74 61 6c 69  WHERE b = 'Stali
8330: 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  n';.    COMMIT;.
8340: 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20    }.  file size 
8350: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
8360: 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  } {0}...#-------
8370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83b0: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
83c0: 6e 67 20 74 65 73 74 73 20 77 6f 72 6b 20 77 69  ng tests work wi
83d0: 74 68 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70  th "PRAGMA max_p
83e0: 61 67 65 5f 63 6f 75 6e 74 22 0a 23 0a 64 6f 5f  age_count".#.do_
83f0: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 20  test pager1-6.1 
8400: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
8410: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
8420: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
8430: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
8440: 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52  m = none;.    PR
8450: 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f  AGMA max_page_co
8460: 75 6e 74 20 3d 20 31 30 3b 0a 20 20 20 20 43 52  unt = 10;.    CR
8470: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
8480: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
8490: 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a  TABLE t3(a, b);.
84a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
84b0: 20 74 34 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t4(a, b);.    C
84c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61  REATE TABLE t5(a
84d0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
84e0: 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b   TABLE t6(a, b);
84f0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8500: 45 20 74 37 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t7(a, b);.    
8510: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 38 28  CREATE TABLE t8(
8520: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
8530: 45 20 54 41 42 4c 45 20 74 39 28 61 2c 20 62 29  E TABLE t9(a, b)
8540: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8550: 4c 45 20 74 31 30 28 61 2c 20 62 29 3b 0a 20 20  LE t10(a, b);.  
8560: 7d 0a 7d 20 7b 31 30 7d 0a 64 6f 5f 63 61 74 63  }.} {10}.do_catc
8570: 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  hsql_test pager1
8580: 2d 36 2e 32 20 7b 0a 20 20 43 52 45 41 54 45 20  -6.2 {.  CREATE 
8590: 54 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29 0a  TABLE t11(a, b).
85a0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 6f  } {1 {database o
85b0: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d  r disk is full}}
85c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
85d0: 20 70 61 67 65 72 31 2d 36 2e 34 20 7b 20 50 52   pager1-6.4 { PR
85e0: 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f  AGMA max_page_co
85f0: 75 6e 74 20 20 20 20 20 20 7d 20 7b 31 30 7d 0a  unt      } {10}.
8600: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8610: 70 61 67 65 72 31 2d 36 2e 35 20 7b 20 50 52 41  pager1-6.5 { PRA
8620: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
8630: 6e 74 20 3d 20 31 35 20 7d 20 7b 31 35 7d 0a 64  nt = 15 } {15}.d
8640: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
8650: 61 67 65 72 31 2d 36 2e 36 20 7b 20 43 52 45 41  ager1-6.6 { CREA
8660: 54 45 20 54 41 42 4c 45 20 74 31 31 28 61 2c 20  TE TABLE t11(a, 
8670: 62 29 20 20 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65  b)     } {}.do_e
8680: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
8690: 72 31 2d 36 2e 37 20 7b 0a 20 20 42 45 47 49 4e  r1-6.7 {.  BEGIN
86a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
86b0: 4f 20 74 31 31 20 56 41 4c 55 45 53 28 31 2c 20  O t11 VALUES(1, 
86c0: 32 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d  2);.    PRAGMA m
86d0: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20  ax_page_count = 
86e0: 31 33 3b 0a 7d 20 7b 31 33 7d 0a 64 6f 5f 65 78  13;.} {13}.do_ex
86f0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
8700: 31 2d 36 2e 38 20 7b 0a 20 20 20 20 49 4e 53 45  1-6.8 {.    INSE
8710: 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55  RT INTO t11 VALU
8720: 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 50 52  ES(3, 4);.    PR
8730: 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f  AGMA max_page_co
8740: 75 6e 74 20 3d 20 31 30 3b 0a 7d 20 7b 31 31 7d  unt = 10;.} {11}
8750: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8760: 20 70 61 67 65 72 31 2d 36 2e 39 20 7b 20 43 4f   pager1-6.9 { CO
8770: 4d 4d 49 54 20 7d 20 7b 7d 0a 0a 64 6f 5f 65 78  MMIT } {}..do_ex
8780: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
8790: 31 2d 36 2e 31 30 20 7b 20 50 52 41 47 4d 41 20  1-6.10 { PRAGMA 
87a0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d  max_page_count =
87b0: 20 31 30 20 7d 20 7b 31 31 7d 0a 64 6f 5f 65 78   10 } {11}.do_ex
87c0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
87d0: 31 2d 36 2e 31 31 20 7b 20 53 45 4c 45 43 54 20  1-6.11 { SELECT 
87e0: 2a 20 46 52 4f 4d 20 74 31 31 20 7d 20 20 20 20  * FROM t11 }    
87f0: 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a        {1 2 3 4}.
8800: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8810: 70 61 67 65 72 31 2d 36 2e 31 32 20 7b 20 50 52  pager1-6.12 { PR
8820: 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f  AGMA max_page_co
8830: 75 6e 74 20 7d 20 20 20 20 20 20 7b 31 31 7d 0a  unt }      {11}.
8840: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
8890: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
88a0: 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52  ts work with "PR
88b0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
88c0: 65 3d 54 52 55 4e 43 41 54 45 22 20 61 6e 64 0a  e=TRUNCATE" and.
88d0: 23 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e  # "PRAGMA lockin
88e0: 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
88f0: 22 2e 0a 23 0a 23 20 45 61 63 68 20 74 65 73 74  "..#.# Each test
8900: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 77 69   is specified wi
8910: 74 68 20 35 20 76 61 72 69 61 62 6c 65 73 2e 20  th 5 variables. 
8920: 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20  As follows:.#.# 
8930: 20 20 24 74 6e 3a 20 20 54 65 73 74 20 4e 75 6d    $tn:  Test Num
8940: 62 65 72 2e 20 55 73 65 64 20 61 73 20 70 61 72  ber. Used as par
8950: 74 20 6f 66 20 74 68 65 20 5b 64 6f 5f 74 65 73  t of the [do_tes
8960: 74 5d 20 74 65 73 74 20 6e 61 6d 65 73 2e 0a 23  t] test names..#
8970: 20 20 20 24 73 71 6c 3a 20 53 51 4c 20 74 6f 20     $sql: SQL to 
8980: 65 78 65 63 75 74 65 2e 0a 23 20 20 20 24 72 65  execute..#   $re
8990: 73 3a 20 45 78 70 65 63 74 65 64 20 72 65 73 75  s: Expected resu
89a0: 6c 74 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20  lt of executing 
89b0: 24 73 71 6c 2e 0a 23 20 20 20 24 6a 73 3a 20 20  $sql..#   $js:  
89c0: 54 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a  The expected siz
89d0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
89e0: 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c   file, in bytes,
89f0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67   after executing
8a00: 0a 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53  .#         the S
8a10: 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31  QL script. Or -1
8a20: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
8a30: 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20  is not expected 
8a40: 74 6f 20 65 78 69 73 74 2e 0a 23 20 20 20 24 77  to exist..#   $w
8a50: 73 3a 20 20 54 68 65 20 65 78 70 65 63 74 65 64  s:  The expected
8a60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 41 4c   size of the WAL
8a70: 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c   file, in bytes,
8a80: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67   after executing
8a90: 0a 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53  .#         the S
8aa0: 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31  QL script. Or -1
8ab0: 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
8ac0: 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65  ot expected to e
8ad0: 78 69 73 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c  xist..#.ifcapabl
8ae0: 65 20 77 61 6c 20 7b 0a 20 20 66 61 75 6c 74 73  e wal {.  faults
8af0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
8b00: 6f 70 65 6e 0a 20 20 66 6f 72 65 61 63 68 20 7b  open.  foreach {
8b10: 74 6e 20 73 71 6c 20 72 65 73 20 6a 73 20 77 73  tn sql res js ws
8b20: 7d 20 5b 73 75 62 73 74 20 7b 0a 20 20 0a 20 20  } [subst {.  .  
8b30: 20 20 31 20 20 7b 0a 20 20 20 20 20 20 43 52 45    1  {.      CRE
8b40: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
8b50: 62 29 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  b);.      PRAGMA
8b60: 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46   auto_vacuum=OFF
8b70: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 73  ;.      PRAGMA s
8b80: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
8b90: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
8ba0: 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a  page_size=1024;.
8bb0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63        PRAGMA loc
8bc0: 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
8bd0: 49 56 45 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  IVE;.      PRAGM
8be0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54  A journal_mode=T
8bf0: 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 49  RUNCATE;.      I
8c00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
8c10: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
8c20: 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 74 72 75  } {exclusive tru
8c30: 6e 63 61 74 65 7d 20 30 20 2d 31 0a 20 20 0a 20  ncate} 0 -1.  . 
8c40: 20 20 20 32 20 20 7b 0a 20 20 20 20 20 20 42 45     2  {.      BE
8c50: 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20  GIN IMMEDIATE;. 
8c60: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
8c70: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43  FROM t1;.      C
8c80: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20  OMMIT;.    } {1 
8c90: 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 33  2} 0 -1.  .    3
8ca0: 20 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b    {.      BEGIN;
8cb0: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
8cc0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  * FROM t1;.     
8cd0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b   COMMIT;.    } {
8ce0: 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20  1 2} 0 -1.  .   
8cf0: 20 34 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75   4  { PRAGMA jou
8d00: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20  rnal_mode = WAL 
8d10: 7d 20 20 20 20 77 61 6c 20 20 20 20 20 20 20 2d  }    wal       -
8d20: 31 20 2d 31 0a 20 20 20 20 35 20 20 7b 20 49 4e  1 -1.    5  { IN
8d30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
8d40: 55 45 53 28 33 2c 20 34 29 20 7d 20 20 7b 7d 20  UES(3, 4) }  {} 
8d50: 20 20 20 20 20 20 20 2d 31 20 5b 77 61 6c 5f 66         -1 [wal_f
8d60: 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d  ile_size 1 1024]
8d70: 0a 20 20 20 20 36 20 20 7b 20 50 52 41 47 4d 41  .    6  { PRAGMA
8d80: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20   locking_mode = 
8d90: 4e 4f 52 4d 41 4c 20 7d 20 65 78 63 6c 75 73 69  NORMAL } exclusi
8da0: 76 65 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f  ve -1 [wal_file_
8db0: 73 69 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 20  size 1 1024].   
8dc0: 20 37 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54   7  { INSERT INT
8dd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36  O t1 VALUES(5, 6
8de0: 29 3b 20 7d 20 7b 7d 20 20 20 20 20 20 20 20 2d  ); } {}        -
8df0: 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  1 [wal_file_size
8e00: 20 32 20 31 30 32 34 5d 0a 20 20 0a 20 20 20 20   2 1024].  .    
8e10: 38 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  8  { PRAGMA jour
8e20: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43  nal_mode = TRUNC
8e30: 41 54 45 20 7d 20 74 72 75 6e 63 61 74 65 20 20  ATE } truncate  
8e40: 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20 20          0 -1.   
8e50: 20 39 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54   9  { INSERT INT
8e60: 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38  O t1 VALUES(7, 8
8e70: 29 20 7d 20 20 20 20 7b 7d 20 20 20 20 20 20 20  ) }    {}       
8e80: 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20           0 -1.  
8e90: 20 20 31 30 20 7b 20 53 45 4c 45 43 54 20 2a 20    10 { SELECT * 
8ea0: 46 52 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20  FROM t1 }       
8eb0: 20 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34          {1 2 3 4
8ec0: 20 35 20 36 20 37 20 38 7d 20 30 20 2d 31 0a 20   5 6 7 8} 0 -1. 
8ed0: 20 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 64 6f 5f   .  }] {.    do_
8ee0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
8ef0: 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20 24 73  er1-7.1.$tn.1 $s
8f00: 71 6c 20 24 72 65 73 0a 20 20 20 20 63 61 74 63  ql $res.    catc
8f10: 68 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b 20 73  h { set J -1 ; s
8f20: 65 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a 65 20  et J [file size 
8f30: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d  test.db-journal]
8f40: 20 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73   }.    catch { s
8f50: 65 74 20 57 20 2d 31 20 3b 20 73 65 74 20 57 20  et W -1 ; set W 
8f60: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
8f70: 64 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20 64 6f  db-wal] }.    do
8f80: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 31  _test pager1-7.1
8f90: 2e 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20 24 4a  .$tn.2 { list $J
8fa0: 20 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a 73 20   $W } [list $js 
8fb0: 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74  $ws].  }.}..do_t
8fc0: 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 31  est pager1-7.2.1
8fd0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
8fe0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
8ff0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
9000: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
9010: 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 3b  ode = EXCLUSIVE;
9020: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9030: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
9040: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 52 41  BEGIN;.      PRA
9050: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
9060: 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 20   = delete;.     
9070: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
9080: 6d 6f 64 65 20 3d 20 74 72 75 6e 63 61 74 65 3b  mode = truncate;
9090: 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  .  }.} {exclusiv
90a0: 65 20 64 65 6c 65 74 65 20 74 72 75 6e 63 61 74  e delete truncat
90b0: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
90c0: 31 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63  1-7.2.2 {.  exec
90d0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
90e0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
90f0: 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ) }.  execsql { 
9100: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
9110: 6f 64 65 20 3d 20 70 65 72 73 69 73 74 20 7d 0a  ode = persist }.
9120: 7d 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64 6f 5f  } {truncate}.do_
9130: 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e  test pager1-7.2.
9140: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
9150: 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65 63 73  COMMIT }.  execs
9160: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
9170: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70  journal_mode = p
9180: 65 72 73 69 73 74 3b 0a 20 20 20 20 50 52 41 47  ersist;.    PRAG
9190: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  MA journal_size_
91a0: 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b 70 65  limit;.  }.} {pe
91b0: 72 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d  rsist -1}..#----
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9200: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
9210: 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 70 61 67  owing tests, pag
9220: 65 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20 74 68  er1-8.*, test th
9230: 61 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 66  at the special f
9240: 69 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a 6d 65  ilenames .# ":me
9250: 6d 6f 72 79 3a 22 20 61 6e 64 20 22 22 20 6f 70  mory:" and "" op
9260: 65 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  en temporary dat
9270: 61 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65 61 63  abases..#.foreac
9280: 68 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65 7d 20  h {tn filename} 
9290: 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a 0a 20  {.  1 :memory:. 
92a0: 20 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74   2 "".} {.  do_t
92b0: 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e  est pager1-8.$tn
92c0: 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  .1 {.    faultsi
92d0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
92e0: 70 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f 73 65  pen.    db close
92f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
9300: 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 65 78  $filename.    ex
9310: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
9320: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
9330: 20 3d 20 31 3b 0a 20 20 20 20 20 20 43 52 45 41   = 1;.      CREA
9340: 54 45 20 54 41 42 4c 45 20 78 31 28 78 29 3b 0a  TE TABLE x1(x);.
9350: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9360: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 43 68 61  O x1 VALUES('Cha
9370: 72 6c 65 73 27 29 3b 0a 20 20 20 20 20 20 49 4e  rles');.      IN
9380: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
9390: 55 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a 20 20  UES('James');.  
93a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
93b0: 78 31 20 56 41 4c 55 45 53 28 27 4d 61 72 79 27  x1 VALUES('Mary'
93c0: 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  );.      SELECT 
93d0: 2a 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 7d  * FROM x1;.    }
93e0: 0a 20 20 7d 20 7b 43 68 61 72 6c 65 73 20 4a 61  .  } {Charles Ja
93f0: 6d 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64 6f 5f  mes Mary}..  do_
9400: 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74  test pager1-8.$t
9410: 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  n.2 {.    sqlite
9420: 33 20 64 62 32 20 24 66 69 6c 65 6e 61 6d 65 0a  3 db2 $filename.
9430: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53      catchsql { S
9440: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20  ELECT * FROM x1 
9450: 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 6e 6f  } db2.  } {1 {no
9460: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 78 31 7d   such table: x1}
9470: 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  }..  do_execsql_
9480: 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74  test pager1-8.$t
9490: 6e 2e 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  n.3 {.    BEGIN;
94a0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
94b0: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 57 69  TO x1 VALUES('Wi
94c0: 6c 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20 20 49  lliam');.      I
94d0: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41  NSERT INTO x1 VA
94e0: 4c 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a 20 20  LUES('Anne');.  
94f0: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20    ROLLBACK;.  } 
9500: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
9510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9550: 0a 23 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  .# The next bloc
9560: 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 70 61 67  k of tests - pag
9570: 65 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c 20 77  er1-9.* - deal w
9580: 69 74 68 20 69 6e 74 65 72 61 63 74 69 6f 6e 73  ith interactions
9590: 20 62 65 74 77 65 65 6e 0a 23 20 74 68 65 20 70   between.# the p
95a0: 61 67 65 72 20 61 6e 64 20 74 68 65 20 62 61 63  ager and the bac
95b0: 6b 75 70 20 41 50 49 2e 20 54 65 73 74 20 63 61  kup API. Test ca
95c0: 73 65 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72  ses:.#.#   pager
95d0: 31 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68  1-9.1.*: Test th
95e0: 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70  at a backup comp
95f0: 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c  letes successful
9600: 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23  ly even if the.#
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 73 6f 75 72 63 65 20 64 62 20 69 73 20 77 72   source db is wr
9630: 69 74 74 65 6e 20 74 6f 20 64 75 72 69 6e 67 20  itten to during 
9640: 74 68 65 20 62 61 63 6b 75 70 20 6f 70 2e 0a 23  the backup op..#
9650: 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e 32 2e  .#   pager1-9.2.
9660: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61 20 62  *: Test that a b
9670: 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65 73 20  ackup completes 
9680: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65 76 65  successfully eve
9690: 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20  n if the.#      
96a0: 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63             sourc
96b0: 65 20 64 62 20 69 73 20 77 72 69 74 74 65 6e 20  e db is written 
96c0: 74 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f 6c 6c  to and then roll
96d0: 65 64 20 62 61 63 6b 20 64 75 72 69 6e 67 20 61  ed back during a
96e0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
96f0: 20 20 20 20 62 61 63 6b 75 70 20 6f 70 65 72 61      backup opera
9700: 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  tion..#.do_test 
9710: 70 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b 0a 20  pager1-9.0.1 {. 
9720: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
9730: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62  _and_reopen.  db
9740: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
9750: 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
9760: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
9770: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
9780: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
9790: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
97a0: 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c  (a, b, UNIQUE(a,
97b0: 20 62 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45   b));.      INSE
97c0: 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45  RT INTO ab VALUE
97d0: 53 28 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  S( a_string(200)
97e0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
97f0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
9800: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
9810: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
9820: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
9830: 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   ab;.      INSER
9840: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
9850: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
9860: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
9870: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
9880: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
9890: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
98a0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
98b0: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
98c0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
98d0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
98e0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
98f0: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
9900: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
9910: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
9920: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9930: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
9940: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
9950: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
9960: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
9970: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
9980: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9990: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
99a0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
99b0: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
99c0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
99d0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
99e0: 67 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20 20 73  ger1-9.0.2 {.  s
99f0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
9a00: 64 62 32 0a 20 20 64 62 32 20 65 76 61 6c 20 7b  db2.  db2 eval {
9a10: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
9a20: 7a 65 20 3d 20 31 30 20 7d 0a 20 20 73 71 6c 69  ze = 10 }.  sqli
9a30: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
9a40: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
9a50: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
9a60: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
9a70: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
9a80: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9a90: 20 70 61 67 65 72 31 2d 39 2e 30 2e 33 20 7b 0a   pager1-9.0.3 {.
9aa0: 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20   db one {SELECT 
9ab0: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9ac0: 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65  M ab}.} [db2 one
9ad0: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
9ae0: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a  a, b) FROM ab}].
9af0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9b00: 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  9.1.1 {.  execsq
9b10: 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45  l { UPDATE ab SE
9b20: 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32  T a = a_string(2
9b30: 30 31 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  01) }.  sqlite3_
9b40: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
9b50: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74  n db main.  B st
9b60: 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f  ep 30.} {SQLITE_
9b70: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9b80: 72 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65 78 65  r1-9.1.2 {.  exe
9b90: 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62  csql { UPDATE ab
9ba0: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
9bb0: 67 28 33 30 31 29 20 7d 0a 20 20 6c 69 73 74 20  g(301) }.  list 
9bc0: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
9bd0: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
9be0: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
9bf0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9c00: 72 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62 20 6f  r1-9.1.3 {. db o
9c10: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
9c20: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
9c30: 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c  .} [db2 one {SEL
9c40: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
9c50: 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65   FROM ab}].do_te
9c60: 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 34 20  st pager1-9.1.4 
9c70: 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45  { execsql { SELE
9c80: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
9c90: 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 0a 64   ab } } {128}..d
9ca0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9cb0: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
9cc0: 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20  { UPDATE ab SET 
9cd0: 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 32  a = a_string(202
9ce0: 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  ) }.  sqlite3_ba
9cf0: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
9d00: 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70  db main.  B step
9d10: 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   30.} {SQLITE_OK
9d20: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
9d30: 2d 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  -9.2.2 {.  execs
9d40: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
9d50: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 61 62  .      UPDATE ab
9d60: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
9d70: 67 28 33 30 31 29 3b 0a 20 20 20 20 52 4f 4c 4c  g(301);.    ROLL
9d80: 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69 73 74  BACK;.  }.  list
9d90: 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20   [B step 10000] 
9da0: 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51  [B finish].} {SQ
9db0: 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45  LITE_DONE SQLITE
9dc0: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  _OK}.do_test pag
9dd0: 65 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64 62 20  er1-9.2.3 {. db 
9de0: 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73  one {SELECT md5s
9df0: 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62  um(a, b) FROM ab
9e00: 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45  }.} [db2 one {SE
9e10: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
9e20: 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74  ) FROM ab}].do_t
9e30: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 34  est pager1-9.2.4
9e40: 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c   { execsql { SEL
9e50: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
9e60: 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 64  M ab } } {128}.d
9e70: 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73  b close.db2 clos
9e80: 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e..do_test pager
9e90: 31 2d 39 2e 33 2e 31 20 7b 0a 20 20 74 65 73 74  1-9.3.1 {.  test
9ea0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
9eb0: 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  1.  tv sectorsiz
9ec0: 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69  e 4096.  faultsi
9ed0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
9ee0: 70 65 6e 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b  pen..  execsql {
9ef0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
9f00: 65 20 3d 20 31 30 32 34 20 7d 0a 20 20 66 6f 72  e = 1024 }.  for
9f10: 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69   {set ii 0} {$ii
9f20: 20 3c 20 34 7d 20 7b 69 6e 63 72 20 69 69 7d 20   < 4} {incr ii} 
9f30: 7b 20 65 78 65 63 73 71 6c 20 22 43 52 45 41 54  { execsql "CREAT
9f40: 45 20 54 41 42 4c 45 20 74 24 7b 69 69 7d 28 61  E TABLE t${ii}(a
9f50: 2c 20 62 29 22 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  , b)" }.} {}.do_
9f60: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e  test pager1-9.3.
9f70: 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  2 {.  sqlite3 db
9f80: 32 20 74 65 73 74 2e 64 62 32 0a 0a 20 20 65 78  2 test.db2..  ex
9f90: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
9fa0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34  MA page_size = 4
9fb0: 30 39 36 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  096;.    PRAGMA 
9fc0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46  synchronous = OF
9fd0: 46 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  F;.    CREATE TA
9fe0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
9ff0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a000: 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32  2(a, b);.  } db2
a010: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ..  sqlite3_back
a020: 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62  up B db2 main db
a030: 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33   main.  B step 3
a040: 30 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70  0.  list [B step
a050: 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73   10000] [B finis
a060: 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e  h].} {SQLITE_DON
a070: 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f  E SQLITE_OK}.do_
a080: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e  test pager1-9.3.
a090: 33 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  3 {.  db2 close.
a0a0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20    db close.  tv 
a0b0: 64 65 6c 65 74 65 0a 20 20 66 69 6c 65 20 73 69  delete.  file si
a0c0: 7a 65 20 74 65 73 74 2e 64 62 32 0a 7d 20 5b 66  ze test.db2.} [f
a0d0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
a0e0: 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  ]..do_test pager
a0f0: 31 2d 39 2e 34 2e 31 20 7b 0a 20 20 66 61 75 6c  1-9.4.1 {.  faul
a100: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
a110: 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33  reopen.  sqlite3
a120: 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20   db2 test.db2.  
a130: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
a140: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
a150: 20 34 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54   4096;.    CREAT
a160: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
a170: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
a180: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d  LE t2(a, b);.  }
a190: 20 64 62 32 0a 20 20 73 71 6c 69 74 65 33 5f 62   db2.  sqlite3_b
a1a0: 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e  ackup B db2 main
a1b0: 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74 20   db main.  list 
a1c0: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
a1d0: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
a1e0: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
a1f0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
a200: 72 31 2d 39 2e 34 2e 32 20 7b 0a 20 20 6c 69 73  r1-9.4.2 {.  lis
a210: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
a220: 74 2e 64 62 32 5d 20 5b 66 69 6c 65 20 73 69 7a  t.db2] [file siz
a230: 65 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 30 20  e test.db].} {0 
a240: 30 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23 2d  0}.db2 close..#-
a250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a290: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
a2a0: 74 68 61 74 20 72 65 67 61 72 64 6c 65 73 73 20  that regardless 
a2b0: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  of the value ret
a2c0: 75 72 6e 65 64 20 62 79 20 78 53 65 63 74 6f 72  urned by xSector
a2d0: 53 69 7a 65 28 29 2c 20 74 68 65 0a 23 20 6d 69  Size(), the.# mi
a2e0: 6e 69 6d 75 6d 20 65 66 66 65 63 74 69 76 65 20  nimum effective 
a2f0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 35  sector-size is 5
a300: 31 32 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  12 and the maxim
a310: 75 6d 20 36 35 35 33 36 20 62 79 74 65 73 2e 0a  um 65536 bytes..
a320: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
a330: 66 61 75 6c 74 20 31 0a 66 6f 72 65 61 63 68 20  fault 1.foreach 
a340: 73 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20 20  sectorsize {.   
a350: 20 33 32 20 20 20 36 34 20 20 20 31 32 38 20 20   32   64   128  
a360: 20 32 35 36 20 20 20 35 31 32 20 20 20 31 30 32   256   512   102
a370: 34 20 20 20 32 30 34 38 20 0a 20 20 20 20 34 30  4   2048 .    40
a380: 39 36 20 38 31 39 32 20 31 36 33 38 34 20 33 32  96 8192 16384 32
a390: 37 36 38 20 36 35 35 33 36 20 31 33 31 30 37 32  768 65536 131072
a3a0: 20 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74 76   262144.} {.  tv
a3b0: 20 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63   sectorsize $sec
a3c0: 74 6f 72 73 69 7a 65 0a 20 20 74 76 20 64 65 76  torsize.  tv dev
a3d0: 63 68 61 72 20 7b 7d 0a 20 20 73 65 74 20 65 66  char {}.  set ef
a3e0: 66 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20  f $sectorsize.  
a3f0: 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20  if {$sectorsize 
a400: 3c 20 35 31 32 7d 20 20 20 7b 20 73 65 74 20 65  < 512}   { set e
a410: 66 66 20 35 31 32 20 7d 0a 20 20 69 66 20 7b 24  ff 512 }.  if {$
a420: 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35  sectorsize > 655
a430: 33 36 7d 20 7b 20 73 65 74 20 65 66 66 20 36 35  36} { set eff 65
a440: 35 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  536 }..  do_test
a450: 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74   pager1-10.$sect
a460: 6f 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 66  orsize.1 {.    f
a470: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
a480: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62  nd_reopen.    db
a490: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
a4a0: 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63  _string.    exec
a4b0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
a4c0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
a4d0: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20  = PERSIST;.     
a4e0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
a4f0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20  e = 1024;.      
a500: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43  BEGIN;.        C
a510: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
a520: 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52  , b);.        CR
a530: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
a540: 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45   b);.        CRE
a550: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
a560: 62 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  b);.      COMMIT
a570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65  ;.    }.    file
a580: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
a590: 75 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72 20  urnal.  } [expr 
a5a0: 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35  $sectorsize > 65
a5b0: 35 33 36 20 3f 20 36 35 35 33 36 20 3a 20 24 73  536 ? 65536 : $s
a5c0: 65 63 74 6f 72 73 69 7a 65 5d 0a 0a 20 20 64 6f  ectorsize]..  do
a5d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e  _test pager1-10.
a5e0: 24 73 65 63 74 6f 72 73 69 7a 65 2e 32 20 7b 0a  $sectorsize.2 {.
a5f0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
a600: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
a610: 20 74 33 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t3 VALUES(a_str
a620: 69 6e 67 28 33 30 30 29 2c 20 61 5f 73 74 72 69  ing(300), a_stri
a630: 6e 67 28 33 30 30 29 29 3b 0a 20 20 20 20 20 20  ng(300));.      
a640: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
a650: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
a660: 20 20 20 20 20 20 20 20 2f 2a 20 20 32 20 2a 2f          /*  2 */
a670: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
a680: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46  TO t3 SELECT * F
a690: 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f  ROM t3;        /
a6a0: 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  4 */.      IN
a6b0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
a6c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20  ECT * FROM t3;  
a6d0: 20 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20        /*  8 */. 
a6e0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
a6f0: 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t3 SELECT * FRO
a700: 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20  M t3;        /* 
a710: 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  16 */.      INSE
a720: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
a730: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20  T * FROM t3;    
a740: 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20      /* 32 */.   
a750: 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f   }.  } {}..  do_
a760: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
a770: 73 65 63 74 6f 72 73 69 7a 65 2e 33 20 7b 0a 20  sectorsize.3 {. 
a780: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
a790: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
a7a0: 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  db.    execsql {
a7b0: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63   .      PRAGMA c
a7c0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
a7d0: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
a7e0: 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65   }.    recursive
a7f0: 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64  _select 32 t3 {d
a800: 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49  b eval "INSERT I
a810: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
a820: 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71   2)"}.    execsq
a830: 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  l {.      COMMIT
a840: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
a850: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a   FROM t2;.    }.
a860: 20 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f    } {1 2}..  do_
a870: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
a880: 73 65 63 74 6f 72 73 69 7a 65 2e 34 20 7b 0a 20  sectorsize.4 {. 
a890: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
a8a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a8b0: 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t6(a, b);.      
a8c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28  CREATE TABLE t7(
a8d0: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  a, b);.      CRE
a8e0: 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20  ATE TABLE t5(a, 
a8f0: 62 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54  b);.      DROP T
a900: 41 42 4c 45 20 74 36 3b 0a 20 20 20 20 20 20 44  ABLE t6;.      D
a910: 52 4f 50 20 54 41 42 4c 45 20 74 37 3b 0a 20 20  ROP TABLE t7;.  
a920: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
a930: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
a940: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
a950: 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20  BLE t6(a, b);.  
a960: 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76    }.    recursiv
a970: 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b  e_select 32 t3 {
a980: 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20  db eval "INSERT 
a990: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31  INTO t5 VALUES(1
a9a0: 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73  , 2)"}.    execs
a9b0: 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49  ql {.      COMMI
a9c0: 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  T;.      SELECT 
a9d0: 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d  * FROM t5;.    }
a9e0: 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a  .  } {1 2}.  .}.
a9f0: 64 62 20 63 6c 6f 73 65 0a 0a 74 76 20 73 65 63  db close..tv sec
aa00: 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 64 6f 5f  torsize 4096.do_
aa10: 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78  test pager1.10.x
aa20: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
aa30: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
aa40: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
aa50: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
aa60: 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20  cuum = none;.   
aa70: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
aa80: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
aa90: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
aaa0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74  ;.  }.  for {set
aab0: 20 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20 7b 69   i 0} {$i<30} {i
aac0: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65  ncr i} {.    exe
aad0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
aae0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 7a 65 72  TO t1 VALUES(zer
aaf0: 6f 62 6c 6f 62 28 39 30 30 29 29 20 7d 0a 20 20  oblob(900)) }.  
ab00: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
ab10: 73 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d 0a  st.db.} {32768}.
ab20: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31  do_test pager1.1
ab30: 30 2e 78 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  0.x.2 {.  execsq
ab40: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
ab50: 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20  ABLE t2(x);.    
ab60: 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20  DROP TABLE t2;. 
ab70: 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
ab80: 65 73 74 2e 64 62 0a 7d 20 7b 33 33 37 39 32 7d  est.db.} {33792}
ab90: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
aba0: 31 30 2e 78 2e 33 20 7b 0a 20 20 65 78 65 63 73  10.x.3 {.  execs
abb0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
abc0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
abd0: 20 74 32 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65   t2(x);.  }.  re
abe0: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33  cursive_select 3
abf0: 30 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20 7b  0 t1.  execsql {
ac00: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
ac10: 45 20 74 33 28 78 29 3b 0a 20 20 20 20 43 4f 4d  E t3(x);.    COM
ac20: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  MIT;.  }.} {}..d
ac30: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
ac40: 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64  e..testvfs tv -d
ac50: 65 66 61 75 6c 74 20 31 0a 66 61 75 6c 74 73 69  efault 1.faultsi
ac60: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
ac70: 70 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74  pen.db func a_st
ac80: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 64 6f  ring a_string.do
ac90: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
aca0: 67 65 72 31 2d 31 31 2e 31 20 7b 0a 20 20 50 52  ger1-11.1 {.  PR
acb0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
acc0: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 50 52  e = DELETE;.  PR
acd0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
ace0: 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  = 10;.  BEGIN;. 
acf0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
ad00: 7a 7a 28 74 6f 70 20 50 52 49 4d 41 52 59 20 4b  zz(top PRIMARY K
ad10: 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  EY);.    INSERT 
ad20: 49 4e 54 4f 20 7a 7a 20 56 41 4c 55 45 53 28 61  INTO zz VALUES(a
ad30: 5f 73 74 72 69 6e 67 28 32 32 32 29 29 3b 0a 20  _string(222));. 
ad40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
ad50: 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  z SELECT a_strin
ad60: 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61  g((SELECT 222+ma
ad70: 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a  x(rowid) FROM zz
ad80: 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20  )) FROM zz;.    
ad90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53  INSERT INTO zz S
ada0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28  ELECT a_string((
adb0: 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72  SELECT 222+max(r
adc0: 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20  owid) FROM zz)) 
add0: 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53  FROM zz;.    INS
ade0: 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45  ERT INTO zz SELE
adf0: 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c  CT a_string((SEL
ae00: 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69  ECT 222+max(rowi
ae10: 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f  d) FROM zz)) FRO
ae20: 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54  M zz;.    INSERT
ae30: 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20   INTO zz SELECT 
ae40: 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54  a_string((SELECT
ae50: 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20   222+max(rowid) 
ae60: 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a  FROM zz)) FROM z
ae70: 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  z;.    INSERT IN
ae80: 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73  TO zz SELECT a_s
ae90: 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32  tring((SELECT 22
aea0: 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f  2+max(rowid) FRO
aeb0: 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a  M zz)) FROM zz;.
aec0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 42 45 47 49    COMMIT;.  BEGI
aed0: 4e 3b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 7a  N;.    UPDATE zz
aee0: 20 53 45 54 20 74 6f 70 20 3d 20 61 5f 73 74 72   SET top = a_str
aef0: 69 6e 67 28 33 34 35 29 3b 0a 7d 20 7b 64 65 6c  ing(345);.} {del
af00: 65 74 65 7d 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f  ete}..proc locko
af10: 75 74 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d  ut {method args}
af20: 20 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   { return SQLITE
af30: 5f 49 4f 45 52 52 20 7d 0a 74 76 20 73 63 72 69  _IOERR }.tv scri
af40: 70 74 20 6c 6f 63 6b 6f 75 74 0a 74 76 20 66 69  pt lockout.tv fi
af50: 6c 74 65 72 20 7b 78 57 72 69 74 65 20 78 54 72  lter {xWrite xTr
af60: 75 6e 63 61 74 65 20 78 53 79 6e 63 7d 0a 64 6f  uncate xSync}.do
af70: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
af80: 61 67 65 72 31 2d 31 31 2e 32 20 7b 20 43 4f 4d  ager1-11.2 { COM
af90: 4d 49 54 20 7d 20 7b 31 20 7b 64 69 73 6b 20 49  MIT } {1 {disk I
afa0: 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a 74 76 20 73  /O error}}..tv s
afb0: 63 72 69 70 74 20 7b 7d 0a 64 6f 5f 74 65 73 74  cript {}.do_test
afc0: 20 70 61 67 65 72 31 2d 31 31 2e 33 20 7b 0a 20   pager1-11.3 {. 
afd0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
afe0: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
aff0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
b000: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43  nal_mode = TRUNC
b010: 41 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ATE;.    PRAGMA 
b020: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
b030: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 74 72 75 6e  .  } db2.} {trun
b040: 63 61 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74  cate ok}.do_test
b050: 20 70 61 67 65 72 31 2d 31 31 2e 34 20 7b 0a 20   pager1-11.4 {. 
b060: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c   db2 close.  fil
b070: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
b080: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
b090: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
b0a0: 61 67 65 72 31 2d 31 31 2e 35 20 7b 20 53 45 4c  ager1-11.5 { SEL
b0b0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
b0c0: 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62 20 63  M zz } {32}.db c
b0d0: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 20  lose.tv delete. 
b0e0: 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   .#-------------
b0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
b130: 65 73 74 20 22 50 52 41 47 4d 41 20 70 61 67 65  est "PRAGMA page
b140: 5f 73 69 7a 65 22 0a 23 0a 74 65 73 74 76 66 73  _size".#.testvfs
b150: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74   tv -default 1.t
b160: 76 20 73 65 63 74 6f 72 73 69 7a 65 20 31 30 32  v sectorsize 102
b170: 34 0a 66 6f 72 65 61 63 68 20 70 61 67 65 73 69  4.foreach pagesi
b180: 7a 65 20 7b 0a 20 20 20 20 35 31 32 20 20 20 31  ze {.    512   1
b190: 30 32 34 20 20 20 32 30 34 38 20 34 30 39 36 20  024   2048 4096 
b1a0: 38 31 39 32 20 31 36 33 38 34 20 33 32 37 36 38  8192 16384 32768
b1b0: 20 0a 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d   .} {.  faultsim
b1c0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
b1d0: 65 6e 0a 0a 20 20 23 20 54 68 65 20 73 65 63 74  en..  # The sect
b1e0: 6f 72 2d 73 69 7a 65 20 28 61 63 63 6f 72 64 69  or-size (accordi
b1f0: 6e 67 20 74 6f 20 74 68 65 20 56 46 53 29 20 69  ng to the VFS) i
b200: 73 20 31 30 32 34 20 62 79 74 65 73 2e 20 53 6f  s 1024 bytes. So
b210: 20 69 66 20 74 68 65 0a 20 20 23 20 70 61 67 65   if the.  # page
b220: 2d 73 69 7a 65 20 72 65 71 75 65 73 74 65 64 20  -size requested 
b230: 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 70 61  using "PRAGMA pa
b240: 67 65 5f 73 69 7a 65 22 20 69 73 20 67 72 65 61  ge_size" is grea
b250: 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 23  ter than the.  #
b260: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
b270: 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 4d 41  lue of SQLITE_MA
b280: 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 74 68 65  X_PAGE_SIZE, the
b290: 6e 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  n the effective 
b2a0: 0a 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72  .  # page-size r
b2b0: 65 6d 61 69 6e 73 20 31 30 32 34 20 62 79 74 65  emains 1024 byte
b2c0: 73 2e 0a 20 20 23 0a 20 20 73 65 74 20 65 66 66  s..  #.  set eff
b2d0: 20 24 70 61 67 65 73 69 7a 65 0a 20 20 69 66 20   $pagesize.  if 
b2e0: 7b 24 65 66 66 20 3e 20 24 3a 3a 53 51 4c 49 54  {$eff > $::SQLIT
b2f0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 7d  E_MAX_PAGE_SIZE}
b300: 20 7b 20 73 65 74 20 65 66 66 20 31 30 32 34 20   { set eff 1024 
b310: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
b320: 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65  er1-12.$pagesize
b330: 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .1 {.    sqlite3
b340: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20   db2 test.db.   
b350: 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20   execsql ".     
b360: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
b370: 65 20 3d 20 24 70 61 67 65 73 69 7a 65 3b 0a 20  e = $pagesize;. 
b380: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
b390: 20 76 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46   v AS SELECT * F
b3a0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
b3b0: 72 3b 0a 20 20 20 20 22 20 64 62 32 0a 20 20 20  r;.    " db2.   
b3c0: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
b3d0: 64 62 0a 20 20 7d 20 24 65 66 66 0a 20 20 64 6f  db.  } $eff.  do
b3e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e  _test pager1-12.
b3f0: 24 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20  $pagesize.2 {.  
b400: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
b410: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
b420: 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43  l { .      SELEC
b430: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
b440: 76 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  v;.      PRAGMA 
b450: 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a  main.page_size;.
b460: 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c      } db2.  } [l
b470: 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20 64 6f  ist 1 $eff].  do
b480: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e  _test pager1-12.
b490: 24 70 61 67 65 73 69 7a 65 2e 33 20 7b 0a 20 20  $pagesize.3 {.  
b4a0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
b4b0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
b4c0: 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20  *) FROM v;.     
b4d0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67   PRAGMA main.pag
b4e0: 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  e_size;.    }.  
b4f0: 7d 20 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a  } [list 1 $eff].
b500: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 64 62    db2 close.}.db
b510: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
b520: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
b530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
b570: 65 73 74 20 73 70 65 63 61 6c 20 22 50 52 41 47  est specal "PRAG
b580: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
b590: 50 45 52 53 49 53 54 22 20 74 65 73 74 20 63 61  PERSIST" test ca
b5a0: 73 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  ses..#.# pager1-
b5b0: 31 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73  13.1.*: This tes
b5c0: 74 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  ts a special cas
b5d0: 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  e encountered in
b5e0: 20 70 65 72 73 69 73 74 65 6e 74 20 0a 23 20 20   persistent .#  
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
b600: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 49 66 20 74  urnal mode: If t
b610: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63  he journal assoc
b620: 69 61 74 65 64 20 77 69 74 68 20 61 20 74 72 61  iated with a tra
b630: 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20  nsaction.#      
b640: 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
b650: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6a 6f  ller than the jo
b660: 75 72 6e 61 6c 20 66 69 6c 65 20 28 62 65 63 61  urnal file (beca
b670: 75 73 65 20 61 20 70 72 65 76 69 6f 75 73 20 0a  use a previous .
b680: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
b690: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65 66   transaction lef
b6a0: 74 20 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e  t a very large n
b6b0: 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66  on-hot journal f
b6c0: 69 6c 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20  ile in the.#    
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
b6e0: 2d 73 79 73 74 65 6d 29 2c 20 74 68 65 6e 20 53  -system), then S
b6f0: 51 4c 69 74 65 20 68 61 73 20 74 6f 20 62 65 20  QLite has to be 
b700: 63 61 72 65 66 75 6c 20 74 68 61 74 20 74 68 65  careful that the
b710: 72 65 20 69 73 0a 23 20 20 20 20 20 20 20 20 20  re is.#         
b720: 20 20 20 20 20 20 20 6e 6f 74 20 61 20 6a 6f 75         not a jou
b730: 72 6e 61 6c 2d 68 65 61 64 65 72 20 6c 65 66 74  rnal-header left
b740: 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 65   over from a pre
b750: 76 69 6f 75 73 20 74 72 61 6e 73 61 63 74 69 6f  vious transactio
b760: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
b770: 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66     immediately f
b780: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6a 6f 75  ollowing the jou
b790: 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6a 75 73  rnal content jus
b7a0: 74 20 77 72 69 74 74 65 6e 2e 0a 23 20 20 20 20  t written..#    
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 74              If t
b7c0: 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 65  here is, and the
b7d0: 20 70 72 6f 63 65 73 73 20 63 72 61 73 68 65 73   process crashes
b7e0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a 6f 75   so that the jou
b7f0: 72 6e 61 6c 0a 23 20 20 20 20 20 20 20 20 20 20  rnal.#          
b800: 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20 61 20        becomes a 
b810: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
b820: 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
b830: 61 63 6b 20 62 79 20 61 6e 6f 74 68 65 72 0a 23  ack by another.#
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 70 72 6f 63 65 73 73 2c 20 74 68 65 72 65 20 69  process, there i
b860: 73 20 61 20 64 61 6e 67 65 72 20 74 68 61 74 20  s a danger that 
b870: 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  the other proces
b880: 73 20 6d 61 79 20 72 6f 6c 6c 0a 23 20 20 20 20  s may roll.#    
b890: 20 20 20 20 20 20 20 20 20 20 20 20 62 61 63 6b              back
b8a0: 20 74 68 65 20 61 62 6f 72 74 65 64 20 74 72 61   the aborted tra
b8b0: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63  nsaction, then c
b8c0: 6f 6e 74 69 6e 75 65 20 63 6f 70 79 69 6e 67 20  ontinue copying 
b8d0: 64 61 74 61 0a 23 20 20 20 20 20 20 20 20 20 20  data.#          
b8e0: 20 20 20 20 20 20 66 72 6f 6d 20 61 6e 20 6f 6c        from an ol
b8f0: 64 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  der transaction 
b900: 66 72 6f 6d 20 74 68 65 20 72 65 6d 61 69 6e 64  from the remaind
b910: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
b920: 6c 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  l..#            
b930: 20 20 20 20 53 65 65 20 74 68 65 20 73 79 6e 63      See the sync
b940: 4a 6f 75 72 6e 61 6c 28 29 20 66 75 6e 63 74 69  Journal() functi
b950: 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  on for details..
b960: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  #.# pager1-13.2.
b970: 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20  *: Same test as 
b980: 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 54 68  the previous. Th
b990: 69 73 20 74 69 6d 65 2c 20 74 68 72 6f 77 20 61  is time, throw a
b9a0: 6e 20 69 6e 64 65 78 20 69 6e 74 6f 0a 23 20 20  n index into.#  
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
b9c0: 65 20 6d 69 78 20 74 6f 20 6d 61 6b 65 20 74 68  e mix to make th
b9d0: 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
b9e0: 6b 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f  k more likely to
b9f0: 20 63 61 74 63 68 0a 23 20 20 20 20 20 20 20 20   catch.#        
ba00: 20 20 20 20 20 20 20 20 65 72 72 6f 72 73 2e 0a          errors..
ba10: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
ba20: 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70  fault 1.tv scrip
ba30: 74 20 78 53 79 6e 63 43 62 0a 74 76 20 66 69 6c  t xSyncCb.tv fil
ba40: 74 65 72 20 78 53 79 6e 63 0a 70 72 6f 63 20 78  ter xSync.proc x
ba50: 53 79 6e 63 43 62 20 7b 6d 65 74 68 6f 64 20 66  SyncCb {method f
ba60: 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a  ilename args} {.
ba70: 20 20 73 65 74 20 74 20 5b 66 69 6c 65 20 74 61    set t [file ta
ba80: 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20  il $filename].  
ba90: 69 66 20 7b 24 74 20 3d 3d 20 22 74 65 73 74 2e  if {$t == "test.
baa0: 64 62 22 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61  db"} faultsim_sa
bab0: 76 65 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ve.  return SQLI
bac0: 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d  TE_OK.}.faultsim
bad0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
bae0: 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72  en.db func a_str
baf0: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 23 20  ing a_string..# 
bb00: 54 68 65 20 55 50 44 41 54 45 20 73 74 61 74 65  The UPDATE state
bb10: 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  ment at the end 
bb20: 6f 66 20 74 68 69 73 20 74 65 73 74 20 63 61 73  of this test cas
bb30: 65 20 63 72 65 61 74 65 73 20 61 20 72 65 61 6c  e creates a real
bb40: 6c 79 20 62 69 67 0a 23 20 6a 6f 75 72 6e 61 6c  ly big.# journal
bb50: 2e 20 53 69 6e 63 65 20 74 68 65 20 63 61 63 68  . Since the cach
bb60: 65 2d 73 69 7a 65 20 69 73 20 6f 6e 6c 79 20 31  e-size is only 1
bb70: 30 20 70 61 67 65 73 2c 20 74 68 65 20 6a 6f 75  0 pages, the jou
bb80: 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 0a 23  rnal contains .#
bb90: 20 66 72 65 71 75 65 6e 74 20 6a 6f 75 72 6e 61   frequent journa
bba0: 6c 20 68 65 61 64 65 72 73 2e 0a 23 0a 64 6f 5f  l headers..#.do_
bbb0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
bbc0: 65 72 31 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 50  er1-13.1.1 {.  P
bbd0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
bbe0: 3d 20 31 30 32 34 3b 0a 20 20 50 52 41 47 4d 41  = 1024;.  PRAGMA
bbf0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
bc00: 50 45 52 53 49 53 54 3b 0a 20 20 50 52 41 47 4d  PERSIST;.  PRAGM
bc10: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
bc20: 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  0;.  BEGIN;.    
bc30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
bc40: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
bc50: 59 20 4b 45 59 2c 20 62 20 42 4c 4f 42 29 3b 0a  Y KEY, b BLOB);.
bc60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bc70: 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  t1 VALUES(NULL, 
bc80: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 29 3b 0a  a_string(400));.
bc90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bca0: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
bcb0: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
bcc0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
bcd0: 2f 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 49 4e  /*   2 */.    IN
bce0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
bcf0: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
bd00: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
bd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34            /*   4
bd20: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
bd30: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
bd40: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
bd50: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
bd60: 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20      /*   8 */.  
bd70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
bd80: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
bd90: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
bda0: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
bdb0: 20 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45    16 */.    INSE
bdc0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
bdd0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
bde0: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
bdf0: 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a          /*  32 *
be00: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
be10: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
be20: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
be30: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
be40: 20 20 2f 2a 20 20 36 34 20 2a 2f 0a 20 20 20 20    /*  64 */.    
be50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
be60: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
be70: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
be80: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31  1;          /* 1
be90: 32 38 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a  28 */.  COMMIT;.
bea0: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
beb0: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30  b = a_string(400
bec0: 29 3b 0a 7d 20 7b 70 65 72 73 69 73 74 7d 0a 0a  );.} {persist}..
bed0: 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  if {$::tcl_platf
bee0: 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22  orm(platform)!="
bef0: 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 52 75  windows"} {.# Ru
bf00: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  n transactions o
bf10: 66 20 69 6e 63 72 65 61 73 69 6e 67 20 73 69 7a  f increasing siz
bf20: 65 73 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20  es. Eventually, 
bf30: 6f 6e 65 20 28 6f 72 20 6d 6f 72 65 20 74 68 61  one (or more tha
bf40: 6e 20 6f 6e 65 29 0a 23 20 6f 66 20 74 68 65 73  n one).# of thes
bf50: 65 20 77 69 6c 6c 20 77 72 69 74 65 20 6a 75 73  e will write jus
bf60: 74 20 65 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74  t enough content
bf70: 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
bf80: 20 6f 6c 64 20 68 65 61 64 65 72 73 20 63 72 65   old headers cre
bf90: 61 74 65 64 20 0a 23 20 62 79 20 74 68 65 20 74  ated .# by the t
bfa0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68  ransaction in th
bfb0: 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69  e block above li
bfc0: 65 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  es immediately a
bfd0: 66 74 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74  fter the content
bfe0: 0a 23 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79  .# journalled by
bff0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
c000: 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20  nsaction..#.for 
c010: 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55  {set nUp 1} {$nU
c020: 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d  p<64} {incr nUp}
c030: 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f   {.  do_execsql_
c040: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31  test pager1-13.1
c050: 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20  .2.$nUp.1 { .   
c060: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
c070: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29   = a_string(399)
c080: 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70   WHERE a <= $nUp
c090: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  .  } {}.  do_exe
c0a0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c0b0: 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b  -13.1.2.$nUp.2 {
c0c0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
c0d0: 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a  y_check } {ok} .
c0e0: 0a 20 20 23 20 54 72 79 20 74 6f 20 61 63 63 65  .  # Try to acce
c0f0: 73 73 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20  ss the snapshot 
c100: 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
c110: 65 6d 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65  em..  #.  sqlite
c120: 33 20 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62  3 db2 sv_test.db
c130: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
c140: 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20  1-13.1.2.$nUp.3 
c150: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
c160: 53 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74  SELECT sum(lengt
c170: 68 28 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20  h(b)) FROM t1 } 
c180: 64 62 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31  db2.  } [expr {1
c190: 32 38 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31  28*400 - ($nUp-1
c1a0: 29 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  )}].  do_test pa
c1b0: 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70  ger1-13.1.2.$nUp
c1c0: 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .4 {.    execsql
c1d0: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
c1e0: 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a  ity_check } db2.
c1f0: 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63    } {ok}.  db2 c
c200: 6c 6f 73 65 0a 7d 0a 7d 0a 0a 69 66 20 7b 24 3a  lose.}.}..if {$:
c210: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c  :tcl_platform(pl
c220: 61 74 66 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77  atform)!="window
c230: 73 22 7d 20 7b 0a 23 20 53 61 6d 65 20 74 65 73  s"} {.# Same tes
c240: 74 20 61 73 20 61 62 6f 76 65 2e 20 42 75 74 20  t as above. But 
c250: 74 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 61  this time with a
c260: 6e 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74  n index on the t
c270: 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  able..#.do_execs
c280: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c290: 33 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  3.2.1 {.  CREATE
c2a0: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
c2b0: 62 29 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20  b);.  UPDATE t1 
c2c0: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
c2d0: 28 34 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20  (400);.} {}.for 
c2e0: 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55  {set nUp 1} {$nU
c2f0: 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d  p<64} {incr nUp}
c300: 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f   {.  do_execsql_
c310: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32  test pager1-13.2
c320: 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20  .2.$nUp.1 { .   
c330: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
c340: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29   = a_string(399)
c350: 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70   WHERE a <= $nUp
c360: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  .  } {}.  do_exe
c370: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c380: 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20 7b  -13.2.2.$nUp.2 {
c390: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
c3a0: 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a  y_check } {ok} .
c3b0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 73 76    sqlite3 db2 sv
c3c0: 5f 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65  _test.db.  do_te
c3d0: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32  st pager1-13.2.2
c3e0: 2e 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78  .$nUp.3 {.    ex
c3f0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73  ecsql { SELECT s
c400: 75 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52  um(length(b)) FR
c410: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20  OM t1 } db2.  } 
c420: 5b 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d  [expr {128*400 -
c430: 20 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f   ($nUp-1)}].  do
c440: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
c450: 32 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20  2.2.$nUp.4 {.   
c460: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
c470: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
c480: 6b 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d  k } db2.  } {ok}
c490: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d  .  db2 close.}.}
c4a0: 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  ..db close.tv de
c4b0: 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lete..#---------
c4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c500: 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c 20 22  .# Test specal "
c510: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
c520: 6f 64 65 3d 4f 46 46 22 20 74 65 73 74 20 63 61  ode=OFF" test ca
c530: 73 65 73 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f  ses..#.faultsim_
c540: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
c550: 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  n.do_execsql_tes
c560: 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 31 20  t pager1-14.1.1 
c570: 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  {.  PRAGMA journ
c580: 61 6c 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20  al_mode = OFF;. 
c590: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
c5a0: 28 61 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b  (a, b);.  BEGIN;
c5b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
c5c0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
c5d0: 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45  ;.  COMMIT;.  SE
c5e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
c5f0: 7d 20 7b 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63  } {off 1 2}.do_c
c600: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67  atchsql_test pag
c610: 65 72 31 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42  er1-14.1.2 {.  B
c620: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
c630: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
c640: 33 2c 20 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43  3, 4);.  ROLLBAC
c650: 4b 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65  K;.} {0 {}}.do_e
c660: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
c670: 72 31 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45  r1-14.1.3 {.  SE
c680: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
c690: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68  } {1 2}.do_catch
c6a0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
c6b0: 31 34 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e  14.1.4 {.  BEGIN
c6c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c6d0: 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62  O t1(rowid, a, b
c6e0: 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c  ) SELECT a+3, b,
c6f0: 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   b FROM t1;.    
c700: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72  INSERT INTO t1(r
c710: 6f 77 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45  owid, a, b) SELE
c720: 43 54 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f  CT a+3, b, b FRO
c730: 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d  M t1;.} {1 {PRIM
c740: 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20  ARY KEY must be 
c750: 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65 63  unique}}.do_exec
c760: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
c770: 31 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49  14.1.5 {.  COMMI
c780: 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  T;.  SELECT * FR
c790: 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20 32 20  OM t1;.} {1 2 2 
c7a0: 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  2}..#-----------
c7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
c7f0: 20 54 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e   Test opening an
c800: 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61  d closing the pa
c810: 67 65 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77  ger sub-system w
c820: 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 76 61  ith different va
c830: 6c 75 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73  lues.# for the s
c840: 71 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46  qlite3_vfs.szOsF
c850: 69 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a  ile variable..#.
c860: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
c870: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78  and_reopen.do_ex
c880: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
c890: 31 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54  1-15.0 {.  CREAT
c8a0: 45 20 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29  E TABLE tx(y, z)
c8b0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
c8c0: 74 78 20 56 41 4c 55 45 53 28 27 41 79 75 74 74  tx VALUES('Ayutt
c8d0: 68 61 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27  haya', 'Beijing'
c8e0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
c8f0: 20 74 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64   tx VALUES('Lond
c900: 6f 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d  on', 'Tokyo');.}
c910: 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72   {}.db close.for
c920: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35   {set i 0} {$i<5
c930: 31 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b  13} {incr i 3} {
c940: 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
c950: 65 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69  efault 1 -szosfi
c960: 6c 65 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20  le $i.  sqlite3 
c970: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f  db test.db.  do_
c980: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c990: 65 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20  er1-15.$i.1 {.  
c9a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
c9b0: 74 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61  tx;.  } {Ayuttha
c9c0: 79 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f  ya Beijing Londo
c9d0: 6e 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c  n Tokyo}.  db cl
c9e0: 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a  ose.  tv delete.
c9f0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
ca00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
ca40: 43 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73  Check that it is
ca50: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
ca60: 20 6f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   open a database
ca70: 20 66 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c   file if the ful
ca80: 6c 20 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20  l path.# to the 
ca90: 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e  associated journ
caa0: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
cab0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69  longer than sqli
cac0: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
cad0: 6d 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  me..#.testvfs tv
cae0: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
caf0: 63 72 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76  cript xOpenCb.tv
cb00: 20 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72   filter xOpen.pr
cb10: 6f 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68  oc xOpenCb {meth
cb20: 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73  od filename args
cb30: 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c 65  } {.  set ::file
cb40: 5f 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e  _len [string len
cb50: 67 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 7d  gth $filename].}
cb60: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
cb70: 2e 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  .db.db close.tv 
cb80: 64 65 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65 74  delete..for {set
cb90: 20 69 69 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c   ii [expr $::fil
cba0: 65 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20 3c  e_len-5]} {$ii <
cbb0: 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c   [expr $::file_l
cbc0: 65 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69 69  en+20]} {incr ii
cbd0: 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76  } {.  testvfs tv
cbe0: 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 6d 78 70   -default 1 -mxp
cbf0: 61 74 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20 23  athname $ii..  #
cc00: 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   The length of t
cc10: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20  he full path to 
cc20: 66 69 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a 6f  file "test.db-jo
cc30: 75 72 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66 69  urnal" is ($::fi
cc40: 6c 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20 49  le_len+8)..  # I
cc50: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  f the configured
cc60: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
cc70: 61 74 68 6e 61 6d 65 20 76 61 6c 75 65 20 67 72  athname value gr
cc80: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
cc90: 75 61 6c 20 74 6f 0a 20 20 23 20 74 68 69 73 2c  ual to.  # this,
cca0: 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 63   then the file c
ccb0: 61 6e 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f 74  an be opened. Ot
ccc0: 68 65 72 77 69 73 65 2c 20 69 74 20 63 61 6e 6e  herwise, it cann
ccd0: 6f 74 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 69  ot..  #.  if {$i
cce0: 69 20 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66 69  i >= [expr $::fi
ccf0: 6c 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20 20  le_len+8]} {.   
cd00: 20 73 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d 0a   set res {0 {}}.
cd10: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73    } else {.    s
cd20: 65 74 20 72 65 73 20 7b 31 20 7b 75 6e 61 62 6c  et res {1 {unabl
cd30: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
cd40: 73 65 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a 20  se file}}.  }.. 
cd50: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
cd60: 31 36 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20 6c  16.1.$ii {.    l
cd70: 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c  ist [catch { sql
cd80: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20  ite3 db test.db 
cd90: 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20  } msg] $msg.  } 
cda0: 24 72 65 73 0a 0a 20 20 63 61 74 63 68 20 7b 64  $res..  catch {d
cdb0: 62 20 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64 65  b close}.  tv de
cdc0: 6c 65 74 65 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  lete.}...#------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce10: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 70  ---.# Test the p
ce20: 61 67 65 72 73 20 72 65 73 70 6f 6e 73 65 20 74  agers response t
ce30: 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  o the b-tree lay
ce40: 65 72 20 72 65 71 75 65 73 74 69 6e 67 20 69 6c  er requesting il
ce50: 6c 65 67 61 6c 20 70 61 67 65 20 0a 23 20 6e 75  legal page .# nu
ce60: 6d 62 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54  mbers:.#.#   + T
ce70: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c  he locking page,
ce80: 0a 23 20 20 20 2b 20 50 61 67 65 20 30 2c 0a 23  .#   + Page 0,.#
ce90: 20 20 20 2b 20 41 20 70 61 67 65 20 77 69 74 68     + A page with
cea0: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67   a page number g
ceb0: 72 65 61 74 65 72 20 74 68 61 6e 20 28 32 5e 33  reater than (2^3
cec0: 31 2d 31 29 2e 0a 23 0a 23 20 54 68 65 73 65 20  1-1)..#.# These 
ced0: 74 65 73 74 73 20 77 69 6c 6c 20 6e 6f 74 20 77  tests will not w
cee0: 6f 72 6b 20 69 66 20 53 51 4c 49 54 45 5f 44 49  ork if SQLITE_DI
cef0: 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
cf00: 41 44 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49  AD is defined. I
cf10: 6e 0a 23 20 74 68 61 74 20 63 61 73 65 20 49 4f  n.# that case IO
cf20: 20 65 72 72 6f 72 73 20 61 72 65 20 73 6f 6d 65   errors are some
cf30: 74 69 6d 65 73 20 72 65 70 6f 72 74 65 64 20 69  times reported i
cf40: 6e 73 74 65 61 64 20 6f 66 20 53 51 4c 49 54 45  nstead of SQLITE
cf50: 5f 43 4f 52 52 55 50 54 2e 0a 23 0a 69 66 63 61  _CORRUPT..#.ifca
cf60: 70 61 62 6c 65 20 21 64 69 72 65 63 74 5f 72 65  pable !direct_re
cf70: 61 64 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67  ad {.do_test pag
cf80: 65 72 31 2d 31 38 2e 31 20 7b 0a 20 20 66 61 75  er1-18.1 {.  fau
cf90: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
cfa0: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
cfb0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
cfc0: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ing.  execsql { 
cfd0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
cfe0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
cff0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
d000: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  1(a, b);.    INS
d010: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
d020: 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ES(a_string(500)
d030: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 29  , a_string(200))
d040: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d050: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
d060: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
d070: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
d080: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d090: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
d0a0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
d0b0: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
d0c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d0d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
d0e0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
d0f0: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
d100: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d110: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
d120: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
d130: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
d140: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d150: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
d160: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
d170: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
d180: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d190: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
d1a0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
d1b0: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
d1c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d1d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
d1e0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
d1f0: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
d200: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
d210: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 32 20 7b  st pager1-18.2 {
d220: 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20  .  set root [db 
d230: 6f 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74  one "SELECT root
d240: 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  page FROM sqlite
d250: 5f 6d 61 73 74 65 72 22 5d 0a 20 20 73 65 74 20  _master"].  set 
d260: 6c 6f 63 6b 69 6e 67 70 61 67 65 20 5b 65 78 70  lockingpage [exp
d270: 72 20 28 30 78 31 30 30 30 30 2f 31 30 32 34 29  r (0x10000/1024)
d280: 20 2b 20 31 5d 0a 20 20 65 78 65 63 73 71 6c 20   + 1].  execsql 
d290: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72 69  {.    PRAGMA wri
d2a0: 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31  table_schema = 1
d2b0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73 71 6c  ;.    UPDATE sql
d2c0: 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72  ite_master SET r
d2d0: 6f 6f 74 70 61 67 65 20 3d 20 24 6c 6f 63 6b 69  ootpage = $locki
d2e0: 6e 67 70 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71  ngpage;.  }.  sq
d2f0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
d300: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  b.  catchsql { S
d310: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
d320: 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b  ROM t1 } db2.} {
d330: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
d340: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
d350: 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  med}}.db2 close.
d360: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d370: 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.3 {.  execsql 
d380: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
d390: 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 49 4e  LE t2(x);.    IN
d3a0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
d3b0: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30  UES(a_string(500
d3c0: 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 70  0));.  }.  set p
d3d0: 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66 69 6c 65  gno [expr ([file
d3e0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 2f   size test.db] /
d3f0: 20 31 30 32 34 29 2d 32 5d 0a 20 20 68 65 78 69   1024)-2].  hexi
d400: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
d410: 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a  [expr ($pgno-1)*
d420: 31 30 32 34 5d 20 30 30 30 30 30 30 30 30 0a 20  1024] 00000000. 
d430: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
d440: 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20  t.db.  catchsql 
d450: 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28  { SELECT length(
d460: 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32  x) FROM t2 } db2
d470: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
d480: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
d490: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c  lformed}}.db2 cl
d4a0: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ose.do_test page
d4b0: 72 31 2d 31 38 2e 34 20 7b 0a 20 20 68 65 78 69  r1-18.4 {.  hexi
d4c0: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
d4d0: 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a  [expr ($pgno-1)*
d4e0: 31 30 32 34 5d 20 39 30 30 30 30 30 30 30 0a 20  1024] 90000000. 
d4f0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
d500: 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20  t.db.  catchsql 
d510: 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28  { SELECT length(
d520: 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32  x) FROM t2 } db2
d530: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
d540: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
d550: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c  lformed}}.db2 cl
d560: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ose.do_test page
d570: 72 31 2d 31 38 2e 35 20 7b 0a 20 20 73 71 6c 69  r1-18.5 {.  sqli
d580: 74 65 33 20 64 62 20 22 22 0a 20 20 65 78 65 63  te3 db "".  exec
d590: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
d5a0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
d5b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
d5c0: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t2(a, b);.    
d5d0: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
d5e0: 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  schema = 1;.    
d5f0: 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61  UPDATE sqlite_ma
d600: 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70 61 67  ster SET rootpag
d610: 65 3d 35 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  e=5 WHERE tbl_na
d620: 6d 65 20 3d 20 27 74 31 27 3b 0a 20 20 20 20 50  me = 't1';.    P
d630: 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
d640: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 41  chema = 0;.    A
d650: 4c 54 45 52 20 54 41 42 4c 45 20 74 31 20 52 45  LTER TABLE t1 RE
d660: 4e 41 4d 45 20 54 4f 20 78 31 3b 0a 20 20 7d 0a  NAME TO x1;.  }.
d670: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
d680: 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 0a  ECT * FROM x1 }.
d690: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64  } {1 {database d
d6a0: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
d6b0: 66 6f 72 6d 65 64 7d 7d 0a 64 62 20 63 6c 6f 73  formed}}.db clos
d6c0: 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e..do_test pager
d6d0: 31 2d 31 38 2e 36 20 7b 0a 20 20 66 61 75 6c 74  1-18.6 {.  fault
d6e0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
d6f0: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
d700: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
d710: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
d720: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
d730: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43  ze = 1024;.    C
d740: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
d750: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
d760: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73  TO t1 VALUES(a_s
d770: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
d780: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
d790: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
d7a0: 38 30 30 29 29 3b 0a 20 20 7d 0a 0a 20 20 73 65  800));.  }..  se
d7b0: 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 22  t root [db one "
d7c0: 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
d7d0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
d7e0: 65 72 22 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  er"].  db close.
d7f0: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
d800: 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24 72  est.db [expr ($r
d810: 6f 6f 74 2d 31 29 2a 31 30 32 34 20 2b 20 38 5d  oot-1)*1024 + 8]
d820: 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69   00000000.  sqli
d830: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
d840: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
d850: 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f  CT length(x) FRO
d860: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74  M t1 }.} {1 {dat
d870: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
d880: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
d890: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
d8a0: 31 2d 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74  1-19.1 {.  sqlit
d8b0: 65 33 20 64 62 20 22 22 0a 20 20 64 62 20 66 75  e3 db "".  db fu
d8c0: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
d8d0: 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
d8e0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
d8f0: 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20  _size = 512;.   
d900: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
d910: 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52 45  uum = 1;.    CRE
d920: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 61 2c  ATE TABLE t1(aa,
d930: 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c   ab, ac, ad, ae,
d940: 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c   af, ag, ah, ai,
d950: 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c   aj, ak, al, am,
d960: 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   an,.           
d970: 20 20 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c           ba, bb,
d980: 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c   bc, bd, be, bf,
d990: 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c   bg, bh, bi, bj,
d9a0: 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c   bk, bl, bm, bn,
d9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d9c0: 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c       ca, cb, cc,
d9d0: 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c   cd, ce, cf, cg,
d9e0: 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c   ch, ci, cj, ck,
d9f0: 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20   cl, cm, cn,.   
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c   da, db, dc, dd,
da20: 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c   de, df, dg, dh,
da30: 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c   di, dj, dk, dl,
da40: 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20   dm, dn,.       
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 61 2c               ea,
da60: 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c   eb, ec, ed, ee,
da70: 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c   ef, eg, eh, ei,
da80: 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c   ej, ek, el, em,
da90: 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   en,.           
daa0: 20 20 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c           fa, fb,
dab0: 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c   fc, fd, fe, ff,
dac0: 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c   fg, fh, fi, fj,
dad0: 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c   fk, fl, fm, fn,
dae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
daf0: 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c       ga, gb, gc,
db00: 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c   gd, ge, gf, gg,
db10: 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c   gh, gi, gj, gk,
db20: 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20   gl, gm, gn,.   
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c   ha, hb, hc, hd,
db50: 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c   he, hf, hg, hh,
db60: 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c   hi, hj, hk, hl,
db70: 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20   hm, hn,.       
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 61 2c               ia,
db90: 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c   ib, ic, id, ie,
dba0: 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c   if, ig, ih, ii,
dbb0: 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c   ij, ik, il, im,
dbc0: 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20   ix,.           
dbd0: 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c           ja, jb,
dbe0: 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c   jc, jd, je, jf,
dbf0: 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c   jg, jh, ji, jj,
dc00: 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c   jk, jl, jm, jn,
dc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dc20: 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c       ka, kb, kc,
dc30: 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c   kd, ke, kf, kg,
dc40: 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c   kh, ki, kj, kk,
dc50: 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20   kl, km, kn,.   
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c   la, lb, lc, ld,
dc80: 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c   le, lf, lg, lh,
dc90: 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c   li, lj, lk, ll,
dca0: 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20   lm, ln,.       
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c               ma,
dcc0: 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c   mb, mc, md, me,
dcd0: 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c   mf, mg, mh, mi,
dce0: 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c   mj, mk, ml, mm,
dcf0: 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 43   mn.    );.    C
dd00: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
dd10: 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61  a, ab, ac, ad, a
dd20: 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61  e, af, ag, ah, a
dd30: 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61  i, aj, ak, al, a
dd40: 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, an,.         
dd50: 20 20 20 20 20 20 20 20 20 20 20 62 61 2c 20 62             ba, b
dd60: 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62  b, bc, bd, be, b
dd70: 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62  f, bg, bh, bi, b
dd80: 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62  j, bk, bl, bm, b
dd90: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dda0: 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63         ca, cb, c
ddb0: 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63  c, cd, ce, cf, c
ddc0: 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63  g, ch, ci, cj, c
ddd0: 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20  k, cl, cm, cn,. 
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64     da, db, dc, d
de00: 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64  d, de, df, dg, d
de10: 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64  h, di, dj, dk, d
de20: 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20  l, dm, dn,.     
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
de40: 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65  a, eb, ec, ed, e
de50: 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65  e, ef, eg, eh, e
de60: 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65  i, ej, ek, el, e
de70: 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, en,.         
de80: 20 20 20 20 20 20 20 20 20 20 20 66 61 2c 20 66             fa, f
de90: 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66  b, fc, fd, fe, f
dea0: 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66  f, fg, fh, fi, f
deb0: 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66  j, fk, fl, fm, f
dec0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
ded0: 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67         ga, gb, g
dee0: 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67  c, gd, ge, gf, g
def0: 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67  g, gh, gi, gj, g
df00: 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20  k, gl, gm, gn,. 
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df20: 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68     ha, hb, hc, h
df30: 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68  d, he, hf, hg, h
df40: 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68  h, hi, hj, hk, h
df50: 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20  l, hm, hn,.     
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
df70: 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69  a, ib, ic, id, i
df80: 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69  e, if, ig, ih, i
df90: 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69  i, ij, ik, il, i
dfa0: 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20  m, ix,.         
dfb0: 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a             ja, j
dfc0: 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a  b, jc, jd, je, j
dfd0: 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a  f, jg, jh, ji, j
dfe0: 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a  j, jk, jl, jm, j
dff0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e000: 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b         ka, kb, k
e010: 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b  c, kd, ke, kf, k
e020: 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b  g, kh, ki, kj, k
e030: 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20  k, kl, km, kn,. 
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c     la, lb, lc, l
e060: 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c  d, le, lf, lg, l
e070: 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c  h, li, lj, lk, l
e080: 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20  l, lm, ln,.     
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
e0a0: 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d  a, mb, mc, md, m
e0b0: 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d  e, mf, mg, mh, m
e0c0: 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d  i, mj, mk, ml, m
e0d0: 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20  m, mn.    );.   
e0e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
e0f0: 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f 73 74  aa) VALUES( a_st
e100: 72 69 6e 67 28 31 30 30 30 30 30 29 20 29 3b 0a  ring(100000) );.
e110: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e120: 74 32 28 61 61 29 20 56 41 4c 55 45 53 28 20 61  t2(aa) VALUES( a
e130: 5f 73 74 72 69 6e 67 28 31 30 30 30 30 30 29 20  _string(100000) 
e140: 29 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20  );.    VACUUM;. 
e150: 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   }.} {}..#------
e160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e1a0: 2d 2d 2d 0a 23 20 54 65 73 74 20 61 20 63 6f 75  ---.# Test a cou
e1b0: 70 6c 65 20 6f 66 20 73 70 65 63 69 61 6c 20 63  ple of special c
e1c0: 61 73 65 73 20 74 68 61 74 20 63 6f 6d 65 20 75  ases that come u
e1d0: 70 20 77 68 69 6c 65 20 63 6f 6d 6d 69 74 74 69  p while committi
e1e0: 6e 67 20 0a 23 20 74 72 61 6e 73 61 63 74 69 6f  ng .# transactio
e1f0: 6e 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31  ns:.#.#   pager1
e200: 2d 32 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69 74 74  -20.1.*: Committ
e210: 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
e220: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
e230: 63 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 0a  ction when the .
e240: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
e250: 20 20 20 64 61 74 61 62 61 73 65 20 68 61 73 20     database has 
e260: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
e270: 64 20 61 74 20 61 6c 6c 2e 0a 23 0a 23 20 20 20  d at all..#.#   
e280: 70 61 67 65 72 31 2d 32 30 2e 32 2e 2a 3a 20 41  pager1-20.2.*: A
e290: 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77 69 74  s above, but wit
e2a0: 68 20 61 20 6e 6f 72 6d 61 6c 20 64 62 20 69 6e  h a normal db in
e2b0: 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
e2c0: 6e 67 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20 70  ng mode..#.#   p
e2d0: 61 67 65 72 31 2d 32 30 2e 33 2e 2a 3a 20 43 6f  ager1-20.3.*: Co
e2e0: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
e2f0: 61 63 74 69 6f 6e 20 69 6e 20 57 41 4c 20 6d 6f  action in WAL mo
e300: 64 65 20 77 68 65 72 65 20 74 68 65 20 64 61 74  de where the dat
e310: 61 62 61 73 65 20 68 61 73 0a 23 20 20 20 20 20  abase has.#     
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65               bee
e330: 6e 20 6d 6f 64 69 66 69 65 64 2c 20 62 75 74 20  n modified, but 
e340: 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
e350: 68 61 76 65 20 62 65 65 6e 20 66 6c 75 73 68 65  have been flushe
e360: 64 20 74 6f 20 0a 23 20 20 20 20 20 20 20 20 20  d to .#         
e370: 20 20 20 20 20 20 20 20 20 64 69 73 6b 20 62 65           disk be
e380: 66 6f 72 65 20 74 68 65 20 63 6f 6d 6d 69 74 2e  fore the commit.
e390: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
e3a0: 31 2d 32 30 2e 31 2e 31 20 7b 0a 20 20 63 61 74  1-20.1.1 {.  cat
e3b0: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20  ch {db close}.  
e3c0: 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f  sqlite3 db :memo
e3d0: 72 79 3a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ry:.  execsql {.
e3e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e3f0: 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29   one(two, three)
e400: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
e410: 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27  O one VALUES('a'
e420: 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  , 'b');.  }.} {}
e430: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
e440: 32 30 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  20.1.2 {.  execs
e450: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45  ql {.    BEGIN E
e460: 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f  XCLUSIVE;.    CO
e470: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  MMIT;.  }.} {}..
e480: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
e490: 30 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  0.2.1 {.  faults
e4a0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
e4b0: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
e4c0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
e4d0: 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75  ing_mode = exclu
e4e0: 73 69 76 65 3b 0a 20 20 20 20 50 52 41 47 4d 41  sive;.    PRAGMA
e4f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
e500: 70 65 72 73 69 73 74 3b 0a 20 20 20 20 43 52 45  persist;.    CRE
e510: 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77  ATE TABLE one(tw
e520: 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49  o, three);.    I
e530: 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56  NSERT INTO one V
e540: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
e550: 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  .  }.} {exclusiv
e560: 65 20 70 65 72 73 69 73 74 7d 0a 64 6f 5f 74 65  e persist}.do_te
e570: 73 74 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 32  st pager1-20.2.2
e580: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
e590: 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49     BEGIN EXCLUSI
e5a0: 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  VE;.    COMMIT;.
e5b0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61    }.} {}..ifcapa
e5c0: 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 74  ble wal {.  do_t
e5d0: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e  est pager1-20.3.
e5e0: 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d  1 {.    faultsim
e5f0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
e600: 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20 61  en.    db func a
e610: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
e620: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
e630: 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
e640: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
e650: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
e660: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20  l_mode = wal;.  
e670: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
e680: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e690: 74 31 28 78 29 3b 0a 20 20 20 20 20 20 20 20 43  t1(x);.        C
e6a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 79  REATE TABLE t2(y
e6b0: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
e6c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
e6d0: 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b  (a_string(800));
e6e0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
e6f0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
e700: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
e710: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  M t1;         /*
e720: 20 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20     2 */.        
e730: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
e740: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38  ELECT a_string(8
e750: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
e760: 20 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20       /*   4 */. 
e770: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
e780: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
e790: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
e7a0: 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20  t1;         /*  
e7b0: 20 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e   8 */.        IN
e7c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
e7d0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
e7e0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
e7f0: 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20 20     /*  16 */.   
e800: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
e810: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
e820: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
e830: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32  ;         /*  32
e840: 20 2a 2f 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54   */.      COMMIT
e850: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c  ;.    }.  } {wal
e860: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
e870: 72 31 2d 32 30 2e 33 2e 32 20 7b 0a 20 20 20 20  r1-20.3.2 {.    
e880: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
e890: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
e8a0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
e8b0: 45 53 28 27 78 78 78 78 27 29 3b 0a 20 20 20 20  ES('xxxx');.    
e8c0: 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65 5f  }.    recursive_
e8d0: 73 65 6c 65 63 74 20 33 32 20 74 31 0a 20 20 20  select 32 t1.   
e8e0: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
e8f0: 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d    } {}.}..#-----
e900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e940: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
e950: 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 20   a WAL database 
e960: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 65  may not be opene
e970: 64 20 69 66 3a 0a 23 0a 23 20 20 20 70 61 67 65  d if:.#.#   page
e980: 72 31 2d 32 31 2e 31 2e 2a 3a 20 54 68 65 20 56  r1-21.1.*: The V
e990: 46 53 20 68 61 73 20 61 6e 20 69 56 65 72 73 69  FS has an iVersi
e9a0: 6f 6e 20 6c 65 73 73 20 74 68 61 6e 20 32 2c 20  on less than 2, 
e9b0: 6f 72 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31  or.#   pager1-21
e9c0: 2e 32 2e 2a 3a 20 54 68 65 20 56 46 53 20 64 6f  .2.*: The VFS do
e9d0: 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 78  es not provide x
e9e0: 53 68 6d 58 58 58 28 29 20 6d 65 74 68 6f 64 73  ShmXXX() methods
e9f0: 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61  ..#.ifcapable wa
ea00: 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  l {.  do_test pa
ea10: 67 65 72 31 2d 32 31 2e 30 20 7b 0a 20 20 20 20  ger1-21.0 {.    
ea20: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
ea30: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 65  and_reopen.    e
ea40: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
ea50: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
ea60: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20  de = WAL;.      
ea70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28  CREATE TABLE ko(
ea80: 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c  c DEFAULT 'abc',
ea90: 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66 27   b DEFAULT 'def'
eaa0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
eab0: 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20  INTO ko DEFAULT 
eac0: 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20 20  VALUES;.    }.  
ead0: 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73  } {wal}.  do_tes
eae0: 74 20 70 61 67 65 72 31 2d 32 31 2e 31 20 7b 0a  t pager1-21.1 {.
eaf0: 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d      testvfs tv -
eb00: 6e 6f 73 68 6d 20 31 0a 20 20 20 20 73 71 6c 69  noshm 1.    sqli
eb10: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20  te3 db2 test.db 
eb20: 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61 74 63  -vfs tv.    catc
eb30: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  hsql { SELECT * 
eb40: 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20 20  FROM ko } db2.  
eb50: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  } {1 {unable to 
eb60: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
eb70: 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65  le}}.  db2 close
eb80: 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 20 20 64  .  tv delete.  d
eb90: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 31  o_test pager1-21
eba0: 2e 32 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73  .2 {.    testvfs
ebb0: 20 74 76 20 2d 69 76 65 72 73 69 6f 6e 20 31 0a   tv -iversion 1.
ebc0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20      sqlite3 db2 
ebd0: 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a  test.db -vfs tv.
ebe0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53      catchsql { S
ebf0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20  ELECT * FROM ko 
ec00: 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75 6e  } db2.  } {1 {un
ec10: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
ec20: 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 64  abase file}}.  d
ec30: 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65  b2 close.  tv de
ec40: 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lete.}..#-------
ec50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec90: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61  --.# Test that a
eca0: 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65   "PRAGMA wal_che
ecb0: 63 6b 70 6f 69 6e 74 22 3a 0a 23 0a 23 20 20 20  ckpoint":.#.#   
ecc0: 70 61 67 65 72 31 2d 32 32 2e 31 2e 2a 3a 20 69  pager1-22.1.*: i
ecd0: 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61 20 6e  s a no-op on a n
ece0: 6f 6e 2d 57 41 4c 20 64 62 2c 20 61 6e 64 0a 23  on-WAL db, and.#
ecf0: 20 20 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 2a     pager1-22.2.*
ed00: 3a 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  : does not cause
ed10: 20 78 53 79 6e 63 20 63 61 6c 6c 73 20 77 69 74   xSync calls wit
ed20: 68 20 61 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  h a synchronous=
ed30: 6f 66 66 20 64 62 2e 0a 23 0a 69 66 63 61 70 61  off db..#.ifcapa
ed40: 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 74  ble wal {.  do_t
ed50: 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e 31 2e  est pager1-22.1.
ed60: 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d  1 {.    faultsim
ed70: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
ed80: 65 6e 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  en.    execsql {
ed90: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
eda0: 42 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54  BLE ko(c DEFAULT
edb0: 20 27 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c   'abc', b DEFAUL
edc0: 54 20 27 64 65 66 27 29 3b 0a 20 20 20 20 20 20  T 'def');.      
edd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44  INSERT INTO ko D
ede0: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20  EFAULT VALUES;. 
edf0: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
ee00: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
ee10: 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b  eckpoint }.  } {
ee20: 30 20 2d 31 20 2d 31 7d 0a 20 20 64 6f 5f 74 65  0 -1 -1}.  do_te
ee30: 73 74 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 31  st pager1-22.2.1
ee40: 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74   {.    testvfs t
ee50: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20  v -default 1.   
ee60: 20 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e 63   tv filter xSync
ee70: 0a 20 20 20 20 74 76 20 73 63 72 69 70 74 20 78  .    tv script x
ee80: 53 79 6e 63 43 62 0a 20 20 20 20 70 72 6f 63 20  SyncCb.    proc 
ee90: 78 53 79 6e 63 43 62 20 7b 61 72 67 73 7d 20 7b  xSyncCb {args} {
eea0: 69 6e 63 72 20 3a 3a 73 79 6e 63 63 6f 75 6e 74  incr ::synccount
eeb0: 7d 0a 20 20 20 20 73 65 74 20 3a 3a 73 79 6e 63  }.    set ::sync
eec0: 63 6f 75 6e 74 20 30 0a 20 20 20 20 73 71 6c 69  count 0.    sqli
eed0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
eee0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
eef0: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
ef00: 6f 6e 6f 75 73 20 3d 20 6f 66 66 3b 0a 20 20 20  onous = off;.   
ef10: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
ef20: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
ef30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ef40: 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45  ko DEFAULT VALUE
ef50: 53 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65  S;.    }.    exe
ef60: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
ef70: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
ef80: 20 20 20 73 65 74 20 73 79 6e 63 63 6f 75 6e 74     set synccount
ef90: 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 62 20 63 6c  .  } {0}.  db cl
efa0: 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a  ose.  tv delete.
efb0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
efc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
f000: 54 65 73 74 73 20 66 6f 72 20 63 68 61 6e 67 69  Tests for changi
f010: 6e 67 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ng journal mode.
f020: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33  .#.#   pager1-23
f030: 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .1.*: Test that 
f040: 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20 66 72  when changing fr
f050: 6f 6d 20 50 45 52 53 49 53 54 20 74 6f 20 44 45  om PERSIST to DE
f060: 4c 45 54 45 20 6d 6f 64 65 2c 0a 23 20 20 20 20  LETE mode,.#    
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
f080: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
f090: 73 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 20  s deleted..#.#  
f0a0: 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 2a 3a 20   pager1-23.2.*: 
f0b0: 53 61 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f  Same test as abo
f0c0: 76 65 2c 20 62 75 74 20 77 68 69 6c 65 20 61 20  ve, but while a 
f0d0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 68  shared lock is h
f0e0: 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20 20 20  eld.#           
f0f0: 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61         on the da
f100: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23  tabase file..#.#
f110: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 2a     pager1-23.3.*
f120: 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 61  : Same test as a
f130: 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c 65 20  bove, but while 
f140: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
f150: 69 73 20 68 65 6c 64 0a 23 20 20 20 20 20 20 20  is held.#       
f160: 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68             on th
f170: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
f180: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33  .#.#   pager1-23
f190: 2e 34 2e 2a 3a 20 41 6e 64 2c 20 66 6f 72 20 66  .4.*: And, for f
f1a0: 75 6e 2c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  un, while holdin
f1b0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
f1c0: 6f 63 6b 2e 0a 23 0a 23 20 20 20 70 61 67 65 72  ock..#.#   pager
f1d0: 31 2d 32 33 2e 35 2e 2a 3a 20 54 72 79 20 74 6f  1-23.5.*: Try to
f1e0: 20 73 65 74 20 76 61 72 69 6f 75 73 20 64 69 66   set various dif
f1f0: 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  ferent journal m
f200: 6f 64 65 73 20 77 69 74 68 20 61 6e 0a 23 20 20  odes with an.#  
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
f230: 73 65 20 28 6f 6e 6c 79 20 4d 45 4d 4f 52 59 20  se (only MEMORY 
f240: 61 6e 64 20 4f 46 46 20 73 68 6f 75 6c 64 20 77  and OFF should w
f250: 6f 72 6b 29 2e 0a 23 0a 23 20 20 20 70 61 67 65  ork)..#.#   page
f260: 72 31 2d 32 33 2e 36 2e 2a 3a 20 54 72 79 20 74  r1-23.6.*: Try t
f270: 6f 20 73 65 74 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  o set locking_mo
f280: 64 65 3d 6e 6f 72 6d 61 6c 20 6f 6e 20 61 6e 20  de=normal on an 
f290: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
f2a0: 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  se.#            
f2b0: 20 20 20 20 20 20 28 64 6f 65 73 6e 27 74 20 77        (doesn't w
f2c0: 6f 72 6b 20 2d 20 69 6e 2d 6d 65 6d 6f 72 79 20  ork - in-memory 
f2d0: 64 61 74 61 62 61 73 65 73 20 61 6c 77 61 79 73  databases always
f2e0: 20 75 73 65 0a 23 20 20 20 20 20 20 20 20 20 20   use.#          
f2f0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 69 6e 67 5f          locking_
f300: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 29 2e  mode=exclusive).
f310: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
f320: 31 2d 32 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75  1-23.1.1 {.  fau
f330: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
f340: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
f350: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
f360: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
f370: 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45 41 54  RSIST;.    CREAT
f380: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
f390: 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 65 78 69  ;.  }.  file exi
f3a0: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
f3b0: 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  nal.} {1}.do_tes
f3c0: 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 32 20  t pager1-23.1.2 
f3d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
f3e0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f3f0: 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 66  e = DELETE }.  f
f400: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
f410: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
f420: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
f430: 2d 32 33 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63  -23.2.1 {.  exec
f440: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
f450: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f460: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53  PERSIST;.    INS
f470: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
f480: 45 53 28 27 43 61 6e 62 65 72 72 61 27 2c 20 27  ES('Canberra', '
f490: 41 43 54 27 29 3b 0a 20 20 7d 0a 20 20 64 62 20  ACT');.  }.  db 
f4a0: 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
f4b0: 46 52 4f 4d 20 74 31 20 7d 20 7b 0a 20 20 20 20  FROM t1 } {.    
f4c0: 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  db eval { PRAGMA
f4d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f4e0: 44 45 4c 45 54 45 20 7d 0a 20 20 7d 0a 20 20 65  DELETE }.  }.  e
f4f0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
f500: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d  journal_mode }.}
f510: 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73   {delete}.do_tes
f520: 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 32 20  t pager1-23.2.2 
f530: 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20  {.  file exists 
f540: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
f550: 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  } {0}..do_test p
f560: 61 67 65 72 31 2d 32 33 2e 33 2e 31 20 7b 0a 20  ager1-23.3.1 {. 
f570: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
f580: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f590: 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
f5a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
f5b0: 20 56 41 4c 55 45 53 28 27 44 61 72 77 69 6e 27   VALUES('Darwin'
f5c0: 2c 20 27 4e 54 27 29 3b 0a 20 20 20 20 42 45 47  , 'NT');.    BEG
f5d0: 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20  IN IMMEDIATE;.  
f5e0: 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52  }.  db eval { PR
f5f0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f600: 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 65  e = DELETE }.  e
f610: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
f620: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d  journal_mode }.}
f630: 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73   {delete}.do_tes
f640: 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 32 20  t pager1-23.3.2 
f650: 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20  {.  file exists 
f660: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
f670: 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61  } {0}.do_test pa
f680: 67 65 72 31 2d 32 33 2e 33 2e 33 20 7b 0a 20 20  ger1-23.3.3 {.  
f690: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  execsql COMMIT.}
f6a0: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67   {}..do_test pag
f6b0: 65 72 31 2d 32 33 2e 34 2e 31 20 7b 0a 20 20 65  er1-23.4.1 {.  e
f6c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
f6d0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f6e0: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
f6f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
f700: 41 4c 55 45 53 28 27 41 64 65 6c 61 69 64 65 27  ALUES('Adelaide'
f710: 2c 20 27 53 41 27 29 3b 0a 20 20 20 20 42 45 47  , 'SA');.    BEG
f720: 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  IN EXCLUSIVE;.  
f730: 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52  }.  db eval { PR
f740: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f750: 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 65  e = DELETE }.  e
f760: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
f770: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d  journal_mode }.}
f780: 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73   {delete}.do_tes
f790: 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 32 20  t pager1-23.4.2 
f7a0: 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20  {.  file exists 
f7b0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
f7c0: 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61  } {0}.do_test pa
f7d0: 67 65 72 31 2d 32 33 2e 34 2e 33 20 7b 0a 20 20  ger1-23.4.3 {.  
f7e0: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  execsql COMMIT.}
f7f0: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67   {}..do_test pag
f800: 65 72 31 2d 32 33 2e 35 2e 31 20 7b 0a 20 20 66  er1-23.5.1 {.  f
f810: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
f820: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69  nd_reopen.  sqli
f830: 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a  te3 db :memory:.
f840: 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  } {}.foreach {tn
f850: 20 6d 6f 64 65 20 70 6f 73 73 69 62 6c 65 7d 20   mode possible} 
f860: 7b 0a 20 20 32 20 20 6f 66 66 20 20 20 20 20 20  {.  2  off      
f870: 31 0a 20 20 33 20 20 6d 65 6d 6f 72 79 20 20 20  1.  3  memory   
f880: 31 0a 20 20 34 20 20 70 65 72 73 69 73 74 20 20  1.  4  persist  
f890: 30 0a 20 20 35 20 20 64 65 6c 65 74 65 20 20 20  0.  5  delete   
f8a0: 30 0a 20 20 36 20 20 77 61 6c 20 20 20 20 20 20  0.  6  wal      
f8b0: 30 0a 20 20 37 20 20 74 72 75 6e 63 61 74 65 20  0.  7  truncate 
f8c0: 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  0.} {.  do_test 
f8d0: 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e  pager1-23.5.$tn.
f8e0: 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  1 {.    execsql 
f8f0: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
f900: 6d 6f 64 65 20 3d 20 6f 66 66 22 0a 20 20 20 20  mode = off".    
f910: 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20  execsql "PRAGMA 
f920: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24  journal_mode = $
f930: 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70  mode".  } [if $p
f940: 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d  ossible {list $m
f950: 6f 64 65 7d 20 7b 6c 69 73 74 20 6f 66 66 7d 5d  ode} {list off}]
f960: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
f970: 31 2d 32 33 2e 35 2e 24 74 6e 2e 32 20 7b 0a 20  1-23.5.$tn.2 {. 
f980: 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47     execsql "PRAG
f990: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f9a0: 3d 20 6d 65 6d 6f 72 79 22 0a 20 20 20 20 65 78  = memory".    ex
f9b0: 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f  ecsql "PRAGMA jo
f9c0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f  urnal_mode = $mo
f9d0: 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73  de".  } [if $pos
f9e0: 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64  sible {list $mod
f9f0: 65 7d 20 7b 6c 69 73 74 20 6d 65 6d 6f 72 79 7d  e} {list memory}
fa00: 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ].}.do_test page
fa10: 72 31 2d 32 33 2e 36 2e 31 20 7b 0a 20 20 65 78  r1-23.6.1 {.  ex
fa20: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f  ecsql {PRAGMA lo
fa30: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72  cking_mode = nor
fa40: 6d 61 6c 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  mal}.} {exclusiv
fa50: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
fa60: 31 2d 32 33 2e 36 2e 32 20 7b 0a 20 20 65 78 65  1-23.6.2 {.  exe
fa70: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63  csql {PRAGMA loc
fa80: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c  king_mode = excl
fa90: 75 73 69 76 65 7d 0a 7d 20 7b 65 78 63 6c 75 73  usive}.} {exclus
faa0: 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ive}.do_test pag
fab0: 65 72 31 2d 32 33 2e 36 2e 33 20 7b 0a 20 20 65  er1-23.6.3 {.  e
fac0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c  xecsql {PRAGMA l
fad0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b  ocking_mode}.} {
fae0: 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65  exclusive}.do_te
faf0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 34  st pager1-23.6.4
fb00: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52   {.  execsql {PR
fb10: 41 47 4d 41 20 6d 61 69 6e 2e 6c 6f 63 6b 69 6e  AGMA main.lockin
fb20: 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75  g_mode}.} {exclu
fb30: 73 69 76 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  sive}..#--------
fb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb80: 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  -.#.do_test page
fb90: 72 31 2d 32 34 2e 31 2e 31 20 7b 0a 20 20 66 61  r1-24.1.1 {.  fa
fba0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
fbb0: 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
fbc0: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
fbd0: 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
fbe0: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
fbf0: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
fc00: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
fc10: 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20  uum = FULL;.    
fc20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31 28  CREATE TABLE x1(
fc30: 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59  x, y, z, PRIMARY
fc40: 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20 20 20   KEY(y, z));.   
fc50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 32   CREATE TABLE x2
fc60: 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52  (x, y, z, PRIMAR
fc70: 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20 20  Y KEY(y, z));.  
fc80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
fc90: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
fca0: 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
fcb0: 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  500), a_string(6
fcc0: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
fcd0: 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20   INTO x2 SELECT 
fce0: 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61  a_string(600), a
fcf0: 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f  _string(400), a_
fd00: 73 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d  string(500) FROM
fd10: 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x2;.    INSERT 
fd20: 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61  INTO x2 SELECT a
fd30: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
fd40: 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73  string(600), a_s
fd50: 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20  tring(400) FROM 
fd60: 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x2;.    INSERT I
fd70: 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f  NTO x2 SELECT a_
fd80: 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73  string(400), a_s
fd90: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
fda0: 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 78  ring(600) FROM x
fdb0: 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  2;.    INSERT IN
fdc0: 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73  TO x2 SELECT a_s
fdd0: 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74  tring(600), a_st
fde0: 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72  ring(400), a_str
fdf0: 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20 78 32  ing(500) FROM x2
fe00: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fe10: 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74  O x2 SELECT a_st
fe20: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
fe30: 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69  ing(600), a_stri
fe40: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 78 32 3b  ng(400) FROM x2;
fe50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
fe60: 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   x2 SELECT a_str
fe70: 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69  ing(400), a_stri
fe80: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
fe90: 67 28 36 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a  g(600) FROM x2;.
fea0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
feb0: 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  x1 SELECT * FROM
fec0: 20 78 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   x2;.  }.} {}.do
fed0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e  _test pager1-24.
fee0: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
fef0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
ff00: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78     DELETE FROM x
ff10: 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c 33 32  1 WHERE rowid<32
ff20: 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76  ;.  }.  recursiv
ff30: 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32 0a 7d  e_select 64 x2.}
ff40: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65   {}.do_test page
ff50: 72 31 2d 32 34 2e 31 2e 33 20 7b 0a 20 20 65 78  r1-24.1.3 {.  ex
ff60: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 55  ecsql { .      U
ff70: 50 44 41 54 45 20 78 31 20 53 45 54 20 7a 20 3d  PDATE x1 SET z =
ff80: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 57   a_string(300) W
ff90: 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20  HERE rowid>40;. 
ffa0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50     COMMIT;.    P
ffb0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
ffc0: 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43  check;.    SELEC
ffd0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
ffe0: 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33  x1;.  }.} {ok 33
fff0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
10000 31 2d 32 34 2e 31 2e 34 20 7b 0a 20 20 65 78 65  1-24.1.4 {.  exe
10010 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
10020 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49  E FROM x1;.    I
10030 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45  NSERT INTO x1 SE
10040 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a  LECT * FROM x2;.
10050 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
10060 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 20   DELETE FROM x1 
10070 57 48 45 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a  WHERE rowid<32;.
10080 20 20 20 20 20 20 55 50 44 41 54 45 20 78 31 20        UPDATE x1 
10090 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69 6e 67  SET z = a_string
100a0 28 32 39 39 29 20 57 48 45 52 45 20 72 6f 77 69  (299) WHERE rowi
100b0 64 3e 34 30 3b 0a 20 20 7d 0a 20 20 72 65 63 75  d>40;.  }.  recu
100c0 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20  rsive_select 64 
100d0 78 32 20 7b 64 62 20 65 76 61 6c 20 43 4f 4d 4d  x2 {db eval COMM
100e0 49 54 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  IT}.  execsql {.
100f0 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
10100 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20  rity_check;.    
10110 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
10120 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM x1;.  }.} {
10130 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20  ok 33}..do_test 
10140 70 61 67 65 72 31 2d 32 34 2e 31 2e 35 20 7b 0a  pager1-24.1.5 {.
10150 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
10160 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a  DELETE FROM x1;.
10170 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10180 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  x1 SELECT * FROM
10190 20 78 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72   x2;.  }.  recur
101a0 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78  sive_select 64 x
101b0 32 20 7b 20 64 62 20 65 76 61 6c 20 7b 43 52 45  2 { db eval {CRE
101c0 41 54 45 20 54 41 42 4c 45 20 78 33 28 78 2c 20  ATE TABLE x3(x, 
101d0 79 2c 20 7a 29 7d 20 7d 0a 20 20 65 78 65 63 73  y, z)} }.  execs
101e0 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
101f0 4f 4d 20 78 33 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d  OM x3 }.} {}..#-
10200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10240 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65  --------.#.do_te
10250 73 74 20 70 61 67 65 72 31 2d 32 35 2d 31 20 7b  st pager1-25-1 {
10260 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
10270 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
10280 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
10290 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56 45 50  GIN;.      SAVEP
102a0 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20  OINT abc;.      
102b0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
102c0 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 52  1(a, b);.      R
102d0 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a  OLLBACK TO abc;.
102e0 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
102f0 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a    db close.} {}.
10300 62 72 65 61 6b 70 6f 69 6e 74 0a 64 6f 5f 74 65  breakpoint.do_te
10310 73 74 20 70 61 67 65 72 31 2d 32 35 2d 32 20 7b  st pager1-25-2 {
10320 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
10330 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
10340 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41  execsql {.    SA
10350 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20  VEPOINT abc;.   
10360 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10370 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 52 4f  t1(a, b);.    RO
10380 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20  LLBACK TO abc;. 
10390 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
103a0 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a   db close.} {}..
103b0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
103c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 65 63  ----------.# Sec
10400 74 6f 72 2d 73 69 7a 65 20 74 65 73 74 73 2e 0a  tor-size tests..
10410 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
10420 2d 32 36 2e 31 20 7b 0a 20 20 74 65 73 74 76 66  -26.1 {.  testvf
10430 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
10440 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20    tv sectorsize 
10450 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f  4096.  faultsim_
10460 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
10470 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
10480 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
10490 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
104a0 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
104b0 20 35 31 32 3b 0a 20 20 20 20 43 52 45 41 54 45   512;.    CREATE
104c0 20 54 41 42 4c 45 20 74 62 6c 28 61 20 50 52 49   TABLE tbl(a PRI
104d0 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51  MARY KEY, b UNIQ
104e0 55 45 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  UE);.    BEGIN;.
104f0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
10500 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 61 5f 73  O tbl VALUES(a_s
10510 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
10520 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20 20 20  ing(600));.     
10530 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
10540 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10550 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
10560 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
10570 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10580 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72  tbl SELECT a_str
10590 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
105a0 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b  g(600) FROM tbl;
105b0 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
105c0 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f  TO tbl SELECT a_
105d0 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
105e0 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74  ring(600) FROM t
105f0 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bl;.      INSERT
10600 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
10610 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
10620 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
10630 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
10640 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
10650 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
10660 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10670 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
10680 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
10690 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
106a0 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
106b0 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  0) FROM tbl;.   
106c0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
106d0 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
106e0 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
106f0 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
10700 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
10710 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
10720 74 65 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31  test pager1-26.1
10730 20 7b 0a 20 20 55 50 44 41 54 45 20 74 62 6c 20   {.  UPDATE tbl 
10740 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
10750 28 35 35 30 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63  (550);.} {}.db c
10760 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
10770 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
10780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
107c0 74 65 73 74 20 70 61 67 65 72 31 2e 32 37 2e 31  test pager1.27.1
107d0 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
107e0 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
107f0 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f    sqlite3_pager_
10800 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65  refcounts db.  e
10810 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
10820 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  IN;.      CREATE
10830 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
10840 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 70  .  }.  sqlite3_p
10850 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 64  ager_refcounts d
10860 62 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  b.  execsql COMM
10870 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  IT.} {}..#------
10880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108c0 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
108d0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70  attempting to op
108e0 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  en a write-trans
108f0 61 63 74 69 6f 6e 20 77 69 74 68 20 0a 23 20 6c  action with .# l
10900 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
10910 75 73 69 76 65 20 69 6e 20 57 41 4c 20 6d 6f 64  usive in WAL mod
10920 65 20 66 61 69 6c 73 20 69 66 20 74 68 65 72 65  e fails if there
10930 20 61 72 65 20 6f 74 68 65 72 20 63 6c 69 65 6e   are other clien
10940 74 73 20 6f 6e 20 0a 23 20 74 68 65 20 73 61 6d  ts on .# the sam
10950 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 63 61  e database..#.ca
10960 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
10970 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b  .ifcapable wal {
10980 0a 20 20 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e  .  do_multiclien
10990 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 20 20  t_test tn {.    
109a0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
109b0 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20  8.$tn.1 {.      
109c0 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 20 20  sql1 { .        
109d0 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
109e0 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20  ode = WAL;.     
109f0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10a00 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
10a10 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
10a20 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
10a30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10a40 20 7b 77 61 6c 7d 0a 20 20 20 20 64 6f 5f 74 65   {wal}.    do_te
10a50 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
10a60 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  .2 { sql2 { SELE
10a70 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
10a80 20 7b 61 20 62 7d 0a 0a 20 20 20 20 64 6f 5f 74   {a b}..    do_t
10a90 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
10aa0 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20 50 52 41  n.3 { sql1 { PRA
10ab0 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
10ac0 3d 65 78 63 6c 75 73 69 76 65 20 7d 20 7d 20 7b  =exclusive } } {
10ad0 65 78 63 6c 75 73 69 76 65 7d 0a 20 20 20 20 64  exclusive}.    d
10ae0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
10af0 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20  .$tn.4 { .      
10b00 63 73 71 6c 31 20 7b 20 42 45 47 49 4e 3b 20 49  csql1 { BEGIN; I
10b10 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
10b20 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 20  LUES('c', 'd'); 
10b30 7d 0a 20 20 20 20 7d 20 7b 31 20 7b 64 61 74 61  }.    } {1 {data
10b40 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
10b50 0a 20 20 20 20 63 6f 64 65 32 20 7b 20 64 62 32  .    code2 { db2
10b60 20 63 6c 6f 73 65 20 3b 20 73 71 6c 69 74 65 33   close ; sqlite3
10b70 20 64 62 32 20 74 65 73 74 2e 64 62 20 7d 0a 20   db2 test.db }. 
10b80 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72     do_test pager
10b90 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20  1-28.$tn.4 { .  
10ba0 20 20 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52      sql1 { INSER
10bb0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
10bc0 28 27 63 27 2c 20 27 64 27 29 3b 20 43 4f 4d 4d  ('c', 'd'); COMM
10bd0 49 54 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20  IT }.    } {}.  
10be0 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
10bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10c30 23 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65 6e  # Normally, when
10c40 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 6a   changing from j
10c50 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53  ournal_mode=PERS
10c60 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 74 68  IST to DELETE th
10c70 65 20 70 61 67 65 72 0a 23 20 61 74 74 65 6d 70  e pager.# attemp
10c80 74 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ts to delete the
10c90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 48   journal file. H
10ca0 6f 77 65 76 65 72 2c 20 69 66 20 69 74 20 63 61  owever, if it ca
10cb0 6e 6e 6f 74 20 6f 62 74 61 69 6e 20 61 0a 23 20  nnot obtain a.# 
10cc0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
10cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10ce0 6c 65 2c 20 74 68 69 73 20 73 74 65 70 20 69 73  le, this step is
10cf0 20 73 6b 69 70 70 65 64 2e 0a 23 0a 64 6f 5f 6d   skipped..#.do_m
10d00 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20  ulticlient_test 
10d10 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  tn {.  do_test p
10d20 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20 7b  ager1-28.$tn.1 {
10d30 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20  .    sql1 { .   
10d40 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
10d50 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
10d60 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
10d70 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
10d80 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10d90 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20   t1 VALUES('a', 
10da0 27 62 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  'b');.    }.  } 
10db0 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74  {persist}.  do_t
10dc0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
10dd0 6e 2e 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74  n.2 { file exist
10de0 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
10df0 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20  l } 1.  do_test 
10e00 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20  pager1-28.$tn.3 
10e10 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20  { sql1 { PRAGMA 
10e20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
10e30 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65  ELETE } } delete
10e40 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10e50 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 66 69 6c  1-28.$tn.4 { fil
10e60 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
10e70 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20  -journal } 0..  
10e80 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10e90 38 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 73 71  8.$tn.5 {.    sq
10ea0 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  l1 { .      PRAG
10eb0 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
10ec0 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20  = PERSIST;.     
10ed0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
10ee0 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29  VALUES('c', 'd')
10ef0 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72  ;.    }.  } {per
10f00 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20  sist}.  do_test 
10f10 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 36 20  pager1-28.$tn.6 
10f20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
10f30 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
10f40 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  1.  do_test page
10f50 72 31 2d 32 38 2e 24 74 6e 2e 37 20 7b 0a 20 20  r1-28.$tn.7 {.  
10f60 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20    sql2 { BEGIN; 
10f70 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
10f80 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29 3b  ALUES('e', 'f');
10f90 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
10fa0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
10fb0 6e 2e 38 20 20 7b 20 66 69 6c 65 20 65 78 69 73  n.8  { file exis
10fc0 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
10fd0 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74  al } 1.  do_test
10fe0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 39   pager1-28.$tn.9
10ff0 20 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d    { sql1 { PRAGM
11000 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
11010 20 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65   DELETE } } dele
11020 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  te.  do_test pag
11030 65 72 31 2d 32 38 2e 24 74 6e 2e 31 30 20 7b 20  er1-28.$tn.10 { 
11040 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
11050 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a  .db-journal } 1.
11060 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11070 31 2d 32 38 2e 24 74 6e 2e 31 31 20 7b 20 73 71  1-28.$tn.11 { sq
11080 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20  l2 COMMIT } {}. 
11090 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
110a0 32 38 2e 24 74 6e 2e 31 32 20 7b 20 66 69 6c 65  28.$tn.12 { file
110b0 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
110c0 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64  journal } 0..  d
110d0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
110e0 2d 24 74 6e 2e 31 33 20 7b 0a 20 20 20 20 63 6f  -$tn.13 {.    co
110f0 64 65 31 20 7b 20 73 65 74 20 63 68 61 6e 6e 65  de1 { set channe
11100 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d  l [db incrblob -
11110 72 65 61 64 6f 6e 6c 79 20 74 31 20 61 20 32 5d  readonly t1 a 2]
11120 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   }.    sql1 {.  
11130 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
11140 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
11150 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  T;.      INSERT 
11160 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
11170 67 27 2c 20 27 68 27 29 3b 0a 20 20 20 20 7d 0a  g', 'h');.    }.
11180 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20    } {persist}.  
11190 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
111a0 38 2e 24 74 6e 2e 31 34 20 7b 20 66 69 6c 65 20  8.$tn.14 { file 
111b0 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
111c0 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f  ournal } 1.  do_
111d0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
111e0 74 6e 2e 31 35 20 7b 0a 20 20 20 20 73 71 6c 32  tn.15 {.    sql2
111f0 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54   { BEGIN; INSERT
11200 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
11210 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d  'e', 'f'); }.  }
11220 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
11230 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 36 20 7b  ger1-28.$tn.16 {
11240 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a   sql1 { PRAGMA j
11250 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
11260 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a  LETE } } delete.
11270 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11280 2d 32 38 2e 24 74 6e 2e 31 37 20 7b 20 66 69 6c  -28.$tn.17 { fil
11290 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
112a0 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20  -journal } 1..  
112b0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
112c0 38 2e 24 74 6e 2e 31 37 20 7b 20 63 73 71 6c 32  8.$tn.17 { csql2
112d0 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 31   { COMMIT } } {1
112e0 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
112f0 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  cked}}.  do_test
11300 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31   pager1-28-$tn.1
11310 38 20 7b 20 63 6f 64 65 31 20 7b 20 72 65 61 64  8 { code1 { read
11320 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 63 0a   $channel } } c.
11330 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11340 2d 32 38 2d 24 74 6e 2e 31 39 20 7b 20 63 6f 64  -28-$tn.19 { cod
11350 65 31 20 7b 20 63 6c 6f 73 65 20 24 63 68 61 6e  e1 { close $chan
11360 6e 65 6c 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f  nel } } {}.  do_
11370 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11380 74 6e 2e 32 30 20 7b 20 73 71 6c 32 20 7b 20 43  tn.20 { sql2 { C
11390 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 7d 0a 0a  OMMIT } } {}.}..
113a0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
113b0 39 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  9.1 {.  faultsim
113c0 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
113d0 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
113e0 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
113f0 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
11400 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
11410 75 6d 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 50  um = full;.    P
11420 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
11430 64 65 3d 65 78 63 6c 75 73 69 76 65 3b 0a 20 20  de=exclusive;.  
11440 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
11450 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  1(a, b);.    INS
11460 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
11470 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20  ES(1, 2);.  }.  
11480 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
11490 62 0a 7d 20 5b 65 78 70 72 20 31 30 32 34 2a 33  b.} [expr 1024*3
114a0 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ].do_test pager1
114b0 2d 32 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -29.2 {.  execsq
114c0 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
114d0 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b  age_size = 4096;
114e0 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d  .    VACUUM;.  }
114f0 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
11500 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 34 30 39  t.db.} [expr 409
11510 36 2a 33 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  6*3]..#---------
11520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11560 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 66 20  .# Test that if 
11570 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  an empty databas
11580 65 20 66 69 6c 65 20 28 73 69 7a 65 20 30 20 62  e file (size 0 b
11590 79 74 65 73 29 20 69 73 20 6f 70 65 6e 65 64 20  ytes) is opened 
115a0 69 6e 20 0a 23 20 65 78 63 6c 75 73 69 76 65 2d  in .# exclusive-
115b0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 6e  locking mode, an
115c0 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  y journal file i
115d0 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  s deleted from t
115e0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 23  he file-system.#
115f0 20 77 69 74 68 6f 75 74 20 62 65 69 6e 67 20 72   without being r
11600 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 41 6e 64 20  olled back. And 
11610 74 68 61 74 20 74 68 65 20 52 45 53 45 52 56 45  that the RESERVE
11620 44 20 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20  D lock obtained 
11630 77 68 69 6c 65 0a 23 20 64 6f 69 6e 67 20 74 68  while.# doing th
11640 69 73 20 69 73 20 6e 6f 74 20 72 65 6c 65 61 73  is is not releas
11650 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ed..#.do_test pa
11660 67 65 72 31 2d 33 30 2e 31 20 7b 0a 20 20 64 62  ger1-30.1 {.  db
11670 20 63 6c 6f 73 65 0a 20 20 64 65 6c 65 74 65 5f   close.  delete_
11680 66 69 6c 65 20 74 65 73 74 2e 64 62 0a 20 20 64  file test.db.  d
11690 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73 74 2e  elete_file test.
116a0 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 65 74  db-journal.  set
116b0 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64   fd [open test.d
116c0 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20 20 73  b-journal w].  s
116d0 65 65 6b 20 24 66 64 20 5b 65 78 70 72 20 35 31  eek $fd [expr 51
116e0 32 2b 31 30 33 32 2a 32 5d 0a 20 20 70 75 74 73  2+1032*2].  puts
116f0 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20   -nonewline $fd 
11700 78 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 0a 20  x.  close $fd.. 
11710 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
11720 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
11730 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
11740 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
11750 45 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  E;.    SELECT co
11760 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69  unt(*) FROM sqli
11770 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 50  te_master;.    P
11780 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75  RAGMA lock_statu
11790 73 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73  s;.  }.} {exclus
117a0 69 76 65 20 30 20 6d 61 69 6e 20 72 65 73 65 72  ive 0 main reser
117b0 76 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d  ved temp closed}
117c0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
117d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
11810 65 73 74 20 74 68 61 74 20 69 66 20 74 68 65 20  est that if the 
11820 22 70 61 67 65 2d 73 69 7a 65 22 20 66 69 65 6c  "page-size" fiel
11830 64 20 69 6e 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  d in a journal-h
11840 65 61 64 65 72 20 69 73 20 30 2c 20 74 68 65 20  eader is 0, the 
11850 6a 6f 75 72 6e 61 6c 0a 23 20 66 69 6c 65 20 63  journal.# file c
11860 61 6e 20 73 74 69 6c 6c 20 62 65 20 72 6f 6c 6c  an still be roll
11870 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
11880 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 62 61   required for ba
11890 63 6b 77 61 72 64 20 63 6f 6d 70 61 74 69 62 69  ckward compatibi
118a0 6c 69 74 79 20 2d 0a 23 20 76 65 72 73 69 6f 6e  lity -.# version
118b0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
118c0 72 20 74 6f 20 33 2e 35 2e 38 20 61 6c 77 61 79  r to 3.5.8 alway
118d0 73 20 73 65 74 20 74 68 69 73 20 66 69 65 6c 64  s set this field
118e0 20 74 6f 20 7a 65 72 6f 2e 0a 23 0a 69 66 20 7b   to zero..#.if {
118f0 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c  $tcl_platform(pl
11900 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d  atform)=="unix"}
11910 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72   {.do_test pager
11920 31 2d 33 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  1-31.1 {.  fault
11930 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
11940 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
11950 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  {.    PRAGMA cac
11960 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
11970 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
11980 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43  ze = 1024;.    C
11990 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
119a0 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
119b0 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
119c0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
119d0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
119e0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
119f0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11a00 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
11a10 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
11a20 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
11a30 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
11a40 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11a50 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
11a60 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
11a70 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
11a80 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11a90 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
11aa0 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11ab0 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
11ac0 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
11ad0 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
11ae0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
11af0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11b00 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
11b10 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
11b20 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
11b30 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11b40 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
11b50 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11b60 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
11b70 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
11b80 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
11b90 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
11ba0 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
11bb0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11bc0 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
11bd0 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
11be0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11bf0 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
11c00 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11c10 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
11c20 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
11c30 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
11c40 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
11c50 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
11c60 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
11c70 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11c80 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
11c90 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
11ca0 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
11cb0 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
11cc0 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20  UPDATE t1 SET y 
11cd0 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 34 39  = randomblob(149
11ce0 39 29 3b 0a 20 20 7d 0a 20 20 63 6f 70 79 5f 66  9);.  }.  copy_f
11cf0 69 6c 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  ile test.db test
11d00 2e 64 62 32 0a 20 20 63 6f 70 79 5f 66 69 6c 65  .db2.  copy_file
11d10 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
11d20 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61   test.db2-journa
11d30 6c 0a 20 20 0a 20 20 68 65 78 69 6f 5f 77 72 69  l.  .  hexio_wri
11d40 74 65 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72  te test.db2-jour
11d50 6e 61 6c 20 32 34 20 30 30 30 30 30 30 30 30 0a  nal 24 00000000.
11d60 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
11d70 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c  st.db2.  execsql
11d80 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
11d90 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a  ity_check } db2.
11da0 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  } {ok}.}..#-----
11db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11df0 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
11e00 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
11e10 20 63 61 6e 20 62 65 20 22 70 72 65 2d 68 69 6e   can be "pre-hin
11e20 74 65 64 22 20 74 6f 20 61 20 63 65 72 74 61 69  ted" to a certai
11e30 6e 20 73 69 7a 65 20 61 6e 64 20 74 68 61 74 0a  n size and that.
11e40 23 20 73 75 62 73 65 71 75 65 6e 74 20 73 70 69  # subsequent spi
11e50 6c 6c 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67  lling of the pag
11e60 65 72 20 63 61 63 68 65 20 64 6f 65 73 20 6e 6f  er cache does no
11e70 74 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  t result in the 
11e80 64 61 74 61 62 61 73 65 0a 23 20 66 69 6c 65 20  database.# file 
11e90 62 65 69 6e 67 20 73 68 72 75 6e 6b 2e 0a 23 0a  being shrunk..#.
11ea0 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d  catch {db close}
11eb0 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
11ec0 74 2e 64 62 0a 0a 64 6f 5f 74 65 73 74 20 70 61  t.db..do_test pa
11ed0 67 65 72 31 2d 33 32 2e 31 20 7b 0a 20 20 73 71  ger1-32.1 {.  sq
11ee0 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
11ef0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11f00 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
11f10 28 78 2c 20 79 29 3b 0a 20 20 7d 0a 20 20 64 62  (x, y);.  }.  db
11f20 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
11f30 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
11f40 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
11f50 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
11f60 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
11f70 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30  randomblob(10000
11f80 29 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 5f 63  ));.  }.  file_c
11f90 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
11fa0 5f 74 65 73 74 20 64 62 20 6d 61 69 6e 20 31 30  _test db main 10
11fb0 32 34 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  24.  file_contro
11fc0 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20  l_sizehint_test 
11fd0 64 62 20 6d 61 69 6e 20 32 30 39 37 31 35 32 30  db main 20971520
11fe0 3b 20 23 20 32 30 4d 42 0a 20 20 65 78 65 63 73  ; # 20MB.  execs
11ff0 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
12000 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
12010 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12020 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61   t1 VALUES(1, ra
12030 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29  ndomblob(10000))
12040 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12050 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72  O t1 VALUES(2, r
12060 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29  andomblob(10000)
12070 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
12080 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 32  TO t1 SELECT x+2
12090 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
120a0 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20  00) from t1;.   
120b0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
120c0 53 45 4c 45 43 54 20 78 2b 34 2c 20 72 61 6e 64  SELECT x+4, rand
120d0 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72  omblob(10000) fr
120e0 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  om t1;.    INSER
120f0 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
12100 20 78 2b 38 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62   x+8, randomblob
12110 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b  (10000) from t1;
12120 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12130 20 74 31 20 53 45 4c 45 43 54 20 78 2b 31 36 2c   t1 SELECT x+16,
12140 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
12150 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20  0) from t1;.    
12160 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
12170 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d  FROM t1;.    COM
12180 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c  MIT;.  }.  db cl
12190 6f 73 65 0a 20 20 66 69 6c 65 20 73 69 7a 65 20  ose.  file size 
121a0 74 65 73 74 2e 64 62 0a 7d 20 7b 32 30 39 37 31  test.db.} {20971
121b0 35 32 30 7d 0a 0a 23 20 43 6c 65 61 6e 75 70 20  520}..# Cleanup 
121c0 32 30 4d 42 20 66 69 6c 65 20 6c 65 66 74 20 62  20MB file left b
121d0 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  y the previous t
121e0 65 73 74 2e 0a 66 6f 72 63 65 64 65 6c 65 74 65  est..forcedelete
121f0 20 74 65 73 74 2e 64 62 0a 0a 66 69 6e 69 73 68   test.db..finish
12200 5f 74 65 73 74 0a                                _test.