/ Hex Artifact Content
Login

Artifact f1f261a4dc5a40b385dfcef946c2e772180d12a9:


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 33 30 5d 20 31 32 33 34 35 36 0a 20 20  l]-30] 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 33 30 5d 20 31 32 33 34 35 36 0a  nal]-30] 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 69 66 20 7b 21 5b 66 6f 72 63  OK.}..if {![forc
4570: 65 64 5f 70 72 6f 78 79 5f 6c 6f 63 6b 69 6e 67  ed_proxy_locking
4580: 5d 7d 20 7b 0a 20 20 23 20 70 72 6f 78 79 20 6c  ]} {.  # proxy l
4590: 6f 63 6b 69 6e 67 20 75 73 65 73 20 63 61 6e 27  ocking uses can'
45a0: 74 20 64 65 61 6c 20 77 69 74 68 20 61 75 74 6f  t deal with auto
45b0: 20 70 72 6f 78 79 20 66 69 6c 65 20 70 61 74 68   proxy file path
45c0: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 4d 41  s longer than MA
45d0: 58 50 41 54 48 4c 45 4e 0a 66 6f 72 65 61 63 68  XPATHLEN.foreach
45e0: 20 7b 74 6e 31 20 74 63 6c 7d 20 7b 0a 20 20 31   {tn1 tcl} {.  1
45f0: 20 7b 20 73 65 74 20 70 72 65 66 69 78 20 22 74   { set prefix "t
4600: 65 73 74 2e 64 62 22 20 7d 0a 20 20 32 20 7b 20  est.db" }.  2 { 
4610: 0a 20 20 20 20 23 20 54 68 69 73 20 74 65 73 74  .    # This test
4620: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
4630: 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20 62  underlying VFS b
4640: 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 6f 70 65  eing able to ope
4650: 6e 20 70 61 74 68 73 0a 20 20 20 20 23 20 35 31  n paths.    # 51
4660: 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  2 bytes in lengt
4670: 68 2e 20 54 68 65 20 69 64 65 61 20 69 73 20 74  h. The idea is t
4680: 6f 20 63 72 65 61 74 65 20 61 20 68 6f 74 2d 6a  o create a hot-j
4690: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
46a0: 0a 20 20 20 20 23 20 63 6f 6e 74 61 69 6e 73 20  .    # contains 
46b0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
46c0: 20 70 6f 69 6e 74 65 72 20 73 6f 20 6c 61 72 67   pointer so larg
46d0: 65 20 74 68 61 74 20 69 74 20 63 6f 75 6c 64 20  e that it could 
46e0: 63 6f 6e 74 61 69 6e 0a 20 20 20 20 23 20 61 20  contain.    # a 
46f0: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
4700: 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 20 70  d (if the file p
4710: 61 67 65 2d 73 69 7a 65 20 69 73 20 35 31 32 20  age-size is 512 
4720: 62 79 74 65 73 29 2e 20 53 6f 20 61 73 20 74 6f  bytes). So as to
4730: 0a 20 20 20 20 23 20 6d 61 6b 65 20 73 75 72 65  .    # make sure
4740: 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20   SQLite doesn't 
4750: 67 65 74 20 63 6f 6e 66 75 73 65 64 20 62 79 20  get confused by 
4760: 74 68 69 73 2e 0a 20 20 20 20 23 0a 20 20 20 20  this..    #.    
4770: 73 65 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78  set nPadding [ex
4780: 70 72 20 35 31 31 20 2d 20 24 3a 3a 6d 6a 5f 66  pr 511 - $::mj_f
4790: 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a  ilename_length].
47a0: 20 20 20 20 69 66 20 7b 24 74 63 6c 5f 70 6c 61      if {$tcl_pla
47b0: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d  tform(platform)=
47c0: 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20  ="windows"} {.  
47d0: 20 20 20 20 23 20 54 42 44 20 6e 65 65 64 20 74      # TBD need t
47e0: 6f 20 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77  o figure out how
47f0: 20 74 6f 20 64 6f 20 74 68 69 73 20 63 6f 72 72   to do this corr
4800: 65 63 74 6c 79 20 66 6f 72 20 57 69 6e 64 6f 77  ectly for Window
4810: 73 21 21 21 0a 20 20 20 20 20 20 73 65 74 20 6e  s!!!.      set n
4820: 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20 32 35  Padding [expr 25
4830: 35 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  5 - $::mj_filena
4840: 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20 20 20 7d  me_length].    }
4850: 0a 0a 20 20 20 20 23 20 57 65 20 63 61 6e 6e 6f  ..    # We canno
4860: 74 20 6a 75 73 74 20 63 72 65 61 74 65 20 61 20  t just create a 
4870: 72 65 61 6c 6c 79 20 6c 6f 6e 67 20 64 61 74 61  really long data
4880: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 74  base file name t
4890: 6f 20 6f 70 65 6e 2c 20 61 73 0a 20 20 20 20 23  o open, as.    #
48a0: 20 4c 69 6e 75 78 20 6c 69 6d 69 74 73 20 61 20   Linux limits a 
48b0: 73 69 6e 67 6c 65 20 63 6f 6d 70 6f 6e 65 6e 74  single component
48c0: 20 6f 66 20 61 20 70 61 74 68 20 74 6f 20 32 35   of a path to 25
48d0: 35 20 62 79 74 65 73 20 62 79 20 64 65 66 61 75  5 bytes by defau
48e0: 6c 74 0a 20 20 20 20 23 20 28 61 6e 64 20 70 72  lt.    # (and pr
48f0: 65 73 75 6d 61 62 6c 79 20 6f 74 68 65 72 20 73  esumably other s
4900: 79 73 74 65 6d 73 20 68 61 76 65 20 6c 69 6d 69  ystems have limi
4910: 74 73 20 74 6f 6f 29 2e 20 53 6f 20 63 72 65 61  ts too). So crea
4920: 74 65 20 61 20 64 69 72 65 63 74 6f 72 79 0a 20  te a directory. 
4930: 20 20 20 23 20 68 69 65 72 61 72 63 68 79 20 74     # hierarchy t
4940: 6f 20 77 6f 72 6b 20 69 6e 2e 0a 20 20 20 20 23  o work in..    #
4950: 0a 20 20 20 20 73 65 74 20 64 69 72 6e 61 6d 65  .    set dirname
4960: 20 22 64 31 32 33 34 35 36 37 38 39 30 31 32 33   "d1234567890123
4970: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
4980: 30 2f 22 0a 20 20 20 20 73 65 74 20 6e 44 69 72  0/".    set nDir
4990: 20 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67   [expr $nPadding
49a0: 20 2f 20 33 32 5d 0a 20 20 20 20 69 66 20 7b 20   / 32].    if { 
49b0: 24 6e 44 69 72 20 7d 20 7b 0a 20 20 20 20 20 20  $nDir } {.      
49c0: 73 65 74 20 70 20 5b 73 74 72 69 6e 67 20 72 65  set p [string re
49d0: 70 65 61 74 20 24 64 69 72 6e 61 6d 65 20 24 6e  peat $dirname $n
49e0: 44 69 72 5d 0a 20 20 20 20 20 20 66 69 6c 65 20  Dir].      file 
49f0: 6d 6b 64 69 72 20 24 70 0a 20 20 20 20 20 20 63  mkdir $p.      c
4a00: 64 20 24 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20  d $p.    }..    
4a10: 73 65 74 20 70 61 64 64 69 6e 67 20 5b 73 74 72  set padding [str
4a20: 69 6e 67 20 72 65 70 65 61 74 20 78 20 5b 65 78  ing repeat x [ex
4a30: 70 72 20 24 6e 50 61 64 64 69 6e 67 20 25 33 32  pr $nPadding %32
4a40: 5d 5d 0a 20 20 20 20 73 65 74 20 70 72 65 66 69  ]].    set prefi
4a50: 78 20 22 74 65 73 74 2e 64 62 24 7b 70 61 64 64  x "test.db${padd
4a60: 69 6e 67 7d 22 0a 20 20 7d 0a 7d 20 7b 0a 20 20  ing}".  }.} {.  
4a70: 65 76 61 6c 20 24 74 63 6c 0a 20 20 66 6f 72 65  eval $tcl.  fore
4a80: 61 63 68 20 7b 74 6e 32 20 73 71 6c 7d 20 7b 0a  ach {tn2 sql} {.
4a90: 20 20 20 20 6f 20 7b 20 0a 20 20 20 20 20 20 50      o { .      P
4aa0: 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68  RAGMA main.synch
4ab0: 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20  ronous=OFF;.    
4ac0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e    PRAGMA aux.syn
4ad0: 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20  chronous=OFF;.  
4ae0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
4af0: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
4b00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 35 31 32  ;.    }.    o512
4b10: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
4b20: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
4b30: 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  s=OFF;.      PRA
4b40: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
4b50: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  ous=OFF;.      P
4b60: 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f  RAGMA main.page_
4b70: 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20  size = 512;.    
4b80: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 70 61 67    PRAGMA aux.pag
4b90: 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  e_size = 512;.  
4ba0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
4bb0: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
4bc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 7b 20  ;.    }.    n { 
4bd0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
4be0: 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  in.synchronous=N
4bf0: 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41  ORMAL;.      PRA
4c00: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
4c10: 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  ous=NORMAL;.    
4c20: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
4c30: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
4c40: 20 20 20 20 7d 0a 20 20 20 20 66 20 7b 20 0a 20      }.    f { . 
4c50: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
4c60: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c  .synchronous=FUL
4c70: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
4c80: 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  aux.synchronous=
4c90: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41 47  FULL;.      PRAG
4ca0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
4cb0: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a  = DELETE;.    }.
4cc0: 20 20 7d 20 7b 0a 0a 20 20 20 20 73 65 74 20 74    } {..    set t
4cd0: 6e 20 22 24 7b 74 6e 31 7d 2e 24 7b 74 6e 32 7d  n "${tn1}.${tn2}
4ce0: 22 0a 20 20 0a 20 20 20 20 23 20 53 65 74 20 75  ".  .    # Set u
4cf0: 70 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  p a connection t
4d00: 6f 20 68 61 76 65 20 74 77 6f 20 64 61 74 61 62  o have two datab
4d10: 61 73 65 73 2c 20 74 65 73 74 2e 64 62 20 28 6d  ases, test.db (m
4d20: 61 69 6e 29 20 61 6e 64 20 0a 20 20 20 20 23 20  ain) and .    # 
4d30: 74 65 73 74 2e 64 62 32 20 28 61 75 78 29 2e 20  test.db2 (aux). 
4d40: 54 68 65 6e 20 72 75 6e 20 61 20 6d 75 6c 74 69  Then run a multi
4d50: 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  -file transactio
4d60: 6e 20 6f 6e 20 74 68 65 6d 2e 20 54 68 65 0a 20  n on them. The. 
4d70: 20 20 20 23 20 56 46 53 20 77 69 6c 6c 20 73 6e     # VFS will sn
4d80: 61 70 73 68 6f 74 20 74 68 65 20 66 69 6c 65 2d  apshot the file-
4d90: 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f  system just befo
4da0: 72 65 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  re the master-jo
4db0: 75 72 6e 61 6c 0a 20 20 20 20 23 20 66 69 6c 65  urnal.    # file
4dc0: 20 69 73 20 64 65 6c 65 74 65 64 20 74 6f 20 63   is deleted to c
4dd0: 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
4de0: 63 74 69 6f 6e 2e 0a 20 20 20 20 23 0a 20 20 20  ction..    #.   
4df0: 20 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65   tv filter xDele
4e00: 74 65 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70  te.    do_test p
4e10: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 31 20  ager1-4.4.$tn.1 
4e20: 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d  {.      faultsim
4e30: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
4e40: 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20 20  en $prefix.     
4e50: 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20   execsql ".     
4e60: 20 20 20 41 54 54 41 43 48 20 27 24 7b 70 72 65     ATTACH '${pre
4e70: 66 69 78 7d 32 27 20 41 53 20 61 75 78 3b 0a 20  fix}2' AS aux;. 
4e80: 20 20 20 20 20 20 20 24 73 71 6c 0a 20 20 20 20         $sql.    
4e90: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
4ea0: 20 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20 43   a(x);.        C
4eb0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e  REATE TABLE aux.
4ec0: 62 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  b(x);.        IN
4ed0: 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55  SERT INTO a VALU
4ee0: 45 53 28 27 64 6f 75 62 6c 65 2d 79 6f 75 27 29  ES('double-you')
4ef0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
4f00: 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27   INTO a VALUES('
4f10: 77 68 79 27 29 3b 0a 20 20 20 20 20 20 20 20 49  why');.        I
4f20: 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c  NSERT INTO a VAL
4f30: 55 45 53 28 27 7a 65 64 27 29 3b 0a 20 20 20 20  UES('zed');.    
4f40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4f50: 62 20 56 41 4c 55 45 53 28 27 77 6f 6e 27 29 3b  b VALUES('won');
4f60: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4f70: 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 74  INTO b VALUES('t
4f80: 6f 6f 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  oo');.        IN
4f90: 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55  SERT INTO b VALU
4fa0: 45 53 28 27 66 72 65 65 27 29 3b 0a 20 20 20 20  ES('free');.    
4fb0: 20 20 22 0a 20 20 20 20 20 20 65 78 65 63 73 71    ".      execsq
4fc0: 6c 20 7b 0a 20 20 20 20 20 20 20 20 42 45 47 49  l {.        BEGI
4fd0: 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53  N;.          INS
4fe0: 45 52 54 20 49 4e 54 4f 20 61 20 53 45 4c 45 43  ERT INTO a SELEC
4ff0: 54 20 2a 20 46 52 4f 4d 20 62 20 57 48 45 52 45  T * FROM b WHERE
5000: 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20   rowid<=3;.     
5010: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5020: 20 62 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   b SELECT * FROM
5030: 20 61 20 57 48 45 52 45 20 72 6f 77 69 64 3c 3d   a WHERE rowid<=
5040: 33 3b 0a 20 20 20 20 20 20 20 20 43 4f 4d 4d 49  3;.        COMMI
5050: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
5060: 20 7b 7d 0a 20 20 20 20 74 76 20 66 69 6c 74 65   {}.    tv filte
5070: 72 20 7b 7d 0a 20 20 20 20 0a 20 20 20 20 23 20  r {}.    .    # 
5080: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 74  Check that the t
5090: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
50a0: 6f 6d 6d 69 74 74 65 64 20 73 75 63 63 65 73 73  ommitted success
50b0: 66 75 6c 6c 79 2e 0a 20 20 20 20 23 0a 20 20 20  fully..    #.   
50c0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
50d0: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
50e0: 32 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  2 {.      SELECT
50f0: 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20   * FROM a.    } 
5100: 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20  {double-you why 
5110: 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65  zed won too free
5120: 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c  }.    do_execsql
5130: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
5140: 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 20 20 53  .$tn.3 {.      S
5150: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20  ELECT * FROM b. 
5160: 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72     } {won too fr
5170: 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68  ee double-you wh
5180: 79 20 7a 65 64 7d 0a 20 20 20 20 0a 20 20 20 20  y zed}.    .    
5190: 23 20 52 65 73 74 6f 72 65 20 74 68 65 20 66 69  # Restore the fi
51a0: 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64 20 72 65  le-system and re
51b0: 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  open the databas
51c0: 65 73 2e 20 43 68 65 63 6b 20 74 68 61 74 20 69  es. Check that i
51d0: 74 20 6e 6f 77 0a 20 20 20 20 23 20 61 70 70 65  t now.    # appe
51e0: 61 72 73 20 74 68 61 74 20 74 68 65 20 74 72 61  ars that the tra
51f0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
5200: 20 63 6f 6d 6d 69 74 74 65 64 20 28 62 65 63 61   committed (beca
5210: 75 73 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  use the file-sys
5220: 74 65 6d 0a 20 20 20 20 23 20 77 61 73 20 72 65  tem.    # was re
5230: 73 74 6f 72 65 64 20 74 6f 20 74 68 65 20 73 74  stored to the st
5240: 61 74 65 20 77 68 65 72 65 20 69 74 20 68 61 64  ate where it had
5250: 20 6e 6f 74 20 62 65 65 6e 29 2e 0a 20 20 20 20   not been)..    
5260: 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  #.    do_test pa
5270: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 34 20 7b  ger1-4.4.$tn.4 {
5280: 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f  .      faultsim_
5290: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
52a0: 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20 20  en $prefix.     
52b0: 20 65 78 65 63 73 71 6c 20 22 41 54 54 41 43 48   execsql "ATTACH
52c0: 20 27 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53   '${prefix}2' AS
52d0: 20 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20   aux".    } {}. 
52e0: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
52f0: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5300: 6e 2e 35 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  n.5 {SELECT * FR
5310: 4f 4d 20 61 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f  OM a} {double-yo
5320: 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 64  u why zed}.    d
5330: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5340: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 36 20  ager1-4.4.$tn.6 
5350: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62  {SELECT * FROM b
5360: 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d  } {won too free}
5370: 0a 20 20 20 20 0a 20 20 20 20 23 20 52 65 73 74  .    .    # Rest
5380: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
5390: 74 65 6d 20 61 67 61 69 6e 2e 20 54 68 69 73 20  tem again. This 
53a0: 74 69 6d 65 2c 20 62 65 66 6f 72 65 20 72 65 6f  time, before reo
53b0: 70 65 6e 69 6e 67 20 74 68 65 20 64 61 74 61 62  pening the datab
53c0: 61 73 65 73 2c 0a 20 20 20 20 23 20 64 65 6c 65  ases,.    # dele
53d0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  te the master-jo
53e0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
53f0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
5400: 20 49 74 20 6e 6f 77 20 61 70 70 65 61 72 73 20   It now appears 
5410: 74 68 61 74 0a 20 20 20 20 23 20 74 68 65 20 74  that.    # the t
5420: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
5430: 6f 6d 6d 69 74 74 65 64 20 28 6e 6f 20 6d 61 73  ommitted (no mas
5440: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
5450: 20 3d 3d 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 29   == no rollback)
5460: 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74  ..    #.    do_t
5470: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
5480: 74 6e 2e 37 20 7b 0a 20 20 20 20 20 20 66 61 75  tn.7 {.      fau
5490: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
54a0: 64 5f 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78  d_reopen $prefix
54b0: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66  .      foreach f
54c0: 20 5b 67 6c 6f 62 20 24 7b 70 72 65 66 69 78 7d   [glob ${prefix}
54d0: 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c  -mj*] { forcedel
54e0: 65 74 65 20 24 66 20 7d 0a 20 20 20 20 20 20 65  ete $f }.      e
54f0: 78 65 63 73 71 6c 20 22 41 54 54 41 43 48 20 27  xecsql "ATTACH '
5500: 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61  ${prefix}2' AS a
5510: 75 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20  ux".    } {}.   
5520: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
5530: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5540: 38 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  8 {.      SELECT
5550: 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20   * FROM a.    } 
5560: 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20  {double-you why 
5570: 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65  zed won too free
5580: 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c  }.    do_execsql
5590: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
55a0: 2e 24 74 6e 2e 39 20 7b 0a 20 20 20 20 20 20 53  .$tn.9 {.      S
55b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20  ELECT * FROM b. 
55c0: 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72     } {won too fr
55d0: 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68  ee double-you wh
55e0: 79 20 7a 65 64 7d 0a 20 20 7d 0a 0a 20 20 63 64  y zed}.  }..  cd
55f0: 20 24 70 77 64 0a 7d 0a 64 62 20 63 6c 6f 73 65   $pwd.}.db close
5600: 0a 74 76 20 64 65 6c 65 74 65 0a 66 6f 72 63 65  .tv delete.force
5610: 64 65 6c 65 74 65 20 24 64 69 72 6e 61 6d 65 0a  delete $dirname.
5620: 7d 0a 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56  }...# Set up a V
5630: 46 53 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  FS to make a cop
5640: 79 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  y of the file-sy
5650: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
5660: 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20 6a 6f   deleting a.# jo
5670: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 63 6f  urnal file to co
5680: 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
5690: 6f 6e 2e 20 54 68 65 20 74 72 61 6e 73 61 63 74  on. The transact
56a0: 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65 78 61  ion modifies exa
56b0: 63 74 6c 79 0a 23 20 74 77 6f 20 64 61 74 61 62  ctly.# two datab
56c0: 61 73 65 20 70 61 67 65 73 20 28 61 6e 64 20 70  ase pages (and p
56d0: 61 67 65 20 31 20 2d 20 74 68 65 20 63 68 61 6e  age 1 - the chan
56e0: 67 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23 0a 74  ge counter)..#.t
56f0: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
5700: 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69  lt 1.tv sectorsi
5710: 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69 70 74  ze 512.tv script
5720: 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c   copy_on_journal
5730: 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65  _delete.tv filte
5740: 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63  r xDelete.proc c
5750: 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64  opy_on_journal_d
5760: 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69  elete {method fi
5770: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
5780: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
5790: 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c  ch *journal $fil
57a0: 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d  ename]} faultsim
57b0: 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20  _save .  return 
57c0: 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c  SQLITE_OK.}.faul
57d0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
57e0: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
57f0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5800: 35 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a  5.1 {.  PRAGMA j
5810: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
5820: 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 70  LETE;.  PRAGMA p
5830: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
5840: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
5850: 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41  t1(a, b);.  CREA
5860: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
5870: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
5880: 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c 20   t1 VALUES('I', 
5890: 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  'II');.  INSERT 
58a0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
58b0: 49 49 49 27 2c 20 27 49 56 27 29 3b 0a 20 20 42  III', 'IV');.  B
58c0: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
58d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
58e0: 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 2);.    INSER
58f0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5900: 28 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d 49 54  (3, 4);.  COMMIT
5910: 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20  ;.} {delete}.tv 
5920: 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65  filter {}..# Che
5930: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
5940: 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
5950: 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  :.#.do_execsql_t
5960: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32  est pager1.4.5.2
5970: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
5980: 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20  OM t1;.  SELECT 
5990: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20  * FROM t2;.} {I 
59a0: 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33 20  II 1 2 III IV 3 
59b0: 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f  4}..# Now try fo
59c0: 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70  ur tests:.#.#  p
59d0: 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73  ager1-4.5.3: Res
59e0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
59f0: 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74  stem. Check that
5a00: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
5a10: 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20  action .#       
5a20: 20 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c           is roll
5a30: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
5a40: 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74  ger1-4.5.4: Rest
5a50: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
5a60: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
5a70: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
5a80: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
5a90: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43        journal. C
5aa0: 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  heck the transac
5ab0: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c  tion is not roll
5ac0: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
5ad0: 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74  ger1-4.5.5: Rest
5ae0: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
5af0: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
5b00: 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69   second record i
5b10: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  n the.#         
5b20: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20         journal. 
5b30: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66  Check that the f
5b40: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74  irst record in t
5b50: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
5b60: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s .#            
5b70: 20 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c      played back,
5b80: 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63   but not the sec
5b90: 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31  ond..#.#  pager1
5ba0: 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20  -4.5.6: Restore 
5bb0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
5bc0: 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65   Try to open the
5bd0: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61   database with a
5be0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5bf0: 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65    readonly conne
5c00: 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75  ction. This shou
5c10: 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65  ld fail, as a re
5c20: 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20  ad-only.#       
5c30: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
5c40: 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20  ion cannot roll 
5c50: 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
5c60: 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73  e file..#.faults
5c70: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5c80: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
5c90: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5ca0: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .3 {.  SELECT * 
5cb0: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
5cc0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
5cd0: 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75  I II III IV}.fau
5ce0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
5cf0: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
5d00: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
5d10: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
5d20: 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32  +1024 - 202] 012
5d30: 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f  3456789ABCDEF.do
5d40: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5d50: 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53  ger1.4.5.4 {.  S
5d60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
5d70: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5d80: 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32   t2;.} {I II 1 2
5d90: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75   III IV 3 4}.fau
5da0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
5db0: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
5dc0: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
5dd0: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
5de0: 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d  +1024+4+4+1024 -
5df0: 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39   202] 0123456789
5e00: 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71  ABCDEF.do_execsq
5e10: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5e20: 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.5 {.  SELECT *
5e30: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5e40: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5e50: 7b 49 20 49 49 20 49 49 49 20 49 56 20 33 20 34  {I II III IV 3 4
5e60: 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  }..faultsim_rest
5e70: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ore_and_reopen.d
5e80: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20  b close.sqlite3 
5e90: 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64  db test.db -read
5ea0: 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73  only 1.do_catchs
5eb0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5ec0: 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.6 {.  SELECT 
5ed0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
5ee0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
5ef0: 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72   {1 {disk I/O er
5f00: 72 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a  ror}}.db close..
5f10: 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20 66  # Snapshot the f
5f20: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20  ile-system just 
5f30: 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69 6c  before multi-fil
5f40: 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20 74  e commit. Save t
5f50: 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68 65  he name.# of the
5f60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5f70: 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66 69  file in $::mj_fi
5f80: 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63 72  lename..#.tv scr
5f90: 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64  ipt copy_on_mj_d
5fa0: 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20  elete.tv filter 
5fb0: 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70  xDelete.proc cop
5fc0: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b  y_on_mj_delete {
5fd0: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
5fe0: 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73  args} {.  if {[s
5ff0: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a  tring match *mj*
6000: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
6010: 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20  ename]]} { .    
6020: 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  set ::mj_filenam
6030: 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  e $filename.    
6040: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20  faultsim_save . 
6050: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
6060: 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20  TE_OK.}.do_test 
6070: 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a 20  pager1.4.6.1 {. 
6080: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
6090: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
60a0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
60b0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
60c0: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 41 54  = DELETE;.    AT
60d0: 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20  TACH 'test.db2' 
60e0: 41 53 20 74 77 6f 3b 0a 20 20 20 20 43 52 45 41  AS two;.    CREA
60f0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
6100: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
6110: 42 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20 62 29  BLE two.t2(a, b)
6120: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6130: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27  O t1 VALUES(1, '
6140: 74 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45  t1.1');.    INSE
6150: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
6160: 53 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20 20  S(1, 't2.1');.  
6170: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55    BEGIN;.      U
6180: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d  PDATE t1 SET b =
6190: 20 27 74 31 2e 32 27 3b 0a 20 20 20 20 20 20 55   't1.2';.      U
61a0: 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d  PDATE t2 SET b =
61b0: 20 27 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f 4d   't2.2';.    COM
61c0: 4d 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66 69  MIT;.  }.  tv fi
61d0: 6c 74 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c 6f  lter {}.  db clo
61e0: 73 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73 69  se.} {}..faultsi
61f0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6200: 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  open.do_execsql_
6210: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6220: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
6230: 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20 20 20  M t1 }          
6240: 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73   {1 t1.1}.do_tes
6250: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
6260: 2e 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65 78  .4.6.3 { file ex
6270: 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  ists $::mj_filen
6280: 61 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65  ame } {1}.do_exe
6290: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
62a0: 2e 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41 43  .4.6.4 {.  ATTAC
62b0: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
62c0: 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  two;.  SELECT * 
62d0: 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32  FROM t2;.} {1 t2
62e0: 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  .1}.do_test page
62f0: 72 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65 20  r1.4.6.5 { file 
6300: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
6310: 65 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61 75  ename } {0}..fau
6320: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
6330: 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73  d_reopen.db clos
6340: 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  e.do_test pager1
6350: 2e 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20 3a  .4.6.8 {.  set :
6360: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24 3a  :mj_filename1 $:
6370: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20 74  :mj_filename.  t
6380: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
6390: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
63a0: 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c  st.db2.  execsql
63b0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
63c0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
63d0: 45 54 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20  ETE;.    ATTACH 
63e0: 27 74 65 73 74 2e 64 62 33 27 20 41 53 20 74 68  'test.db3' AS th
63f0: 72 65 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ree;.    CREATE 
6400: 54 41 42 4c 45 20 74 68 72 65 65 2e 74 33 28 61  TABLE three.t3(a
6410: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
6420: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
6430: 31 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20 20 20  1, 't3.1');.    
6440: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
6450: 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27  ATE t2 SET b = '
6460: 74 32 2e 33 27 3b 0a 20 20 20 20 20 20 55 50 44  t2.3';.      UPD
6470: 41 54 45 20 74 33 20 53 45 54 20 62 20 3d 20 27  ATE t3 SET b = '
6480: 74 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d 4d 49  t3.3';.    COMMI
6490: 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 24  T;.  }.  expr {$
64a0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 21  ::mj_filename1 !
64b0: 3d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  = $::mj_filename
64c0: 7d 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73 69 6d  }.} {1}.faultsim
64d0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
64e0: 70 65 6e 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d  pen.tv filter {}
64f0: 0a 0a 23 20 54 68 65 20 66 69 6c 65 2d 73 79 73  ..# The file-sys
6500: 74 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  tem now contains
6510: 3a 0a 23 0a 23 20 20 20 2a 20 74 68 72 65 65 20  :.#.#   * three 
6520: 64 61 74 61 62 61 73 65 73 0a 23 20 20 20 2a 20  databases.#   * 
6530: 74 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  three hot-journa
6540: 6c 20 66 69 6c 65 73 0a 23 20 20 20 2a 20 74 77  l files.#   * tw
6550: 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  o master-journal
6560: 20 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68 65 20   files..#.# The 
6570: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61 73 73  hot-journals ass
6580: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 65 73  ociated with tes
6590: 74 2e 64 62 32 20 61 6e 64 20 74 65 73 74 2e 64  t.db2 and test.d
65a0: 62 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20 6d 61  b3 point to.# ma
65b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a  ster journal $::
65c0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54 68 65  mj_filename. The
65d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
65e0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
65f0: 68 0a 23 20 74 65 73 74 2e 64 62 20 70 6f 69 6e  h.# test.db poin
6600: 74 73 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ts to master jou
6610: 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  rnal $::mj_filen
6620: 61 6d 65 31 2e 20 53 6f 20 72 65 61 64 69 6e 67  ame1. So reading
6630: 20 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64 62 20   from.# test.db 
6640: 73 68 6f 75 6c 64 20 64 65 6c 65 74 65 20 24 3a  should delete $:
6650: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23  :mj_filename1..#
6660: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
6670: 34 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72 74 20  4.6.9 {.  lsort 
6680: 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d 0a  [glob test.db*].
6690: 7d 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74 20 20  } [lsort [list  
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66c0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 65 73           \.  tes
66d0: 74 2e 64 62 20 74 65 73 74 2e 64 62 32 20 74 65  t.db test.db2 te
66e0: 73 74 2e 64 62 33 20 20 20 20 20 20 20 20 20 20  st.db3          
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6700: 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 2d      \.  test.db-
6710: 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32  journal test.db2
6720: 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62  -journal test.db
6730: 33 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20 5c  3-journal      \
6740: 0a 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a  .  [file tail $:
6750: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b 66  :mj_filename] [f
6760: 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66  ile tail $::mj_f
6770: 69 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23 20  ilename1].]]..# 
6780: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
6790: 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  al $::mj_filenam
67a0: 65 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  e1 contains poin
67b0: 74 65 72 73 20 74 6f 20 74 65 73 74 2e 64 62 20  ters to test.db 
67c0: 61 6e 64 20 0a 23 20 74 65 73 74 2e 64 62 32 2e  and .# test.db2.
67d0: 20 48 6f 77 65 76 65 72 20 74 68 65 20 68 6f 74   However the hot
67e0: 2d 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61  -journal associa
67f0: 74 65 64 20 77 69 74 68 20 74 65 73 74 2e 64 62  ted with test.db
6800: 32 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20 61 20  2 points to.# a 
6810: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
6820: 2d 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72 65 66  -journal. Theref
6830: 6f 72 65 2c 20 72 65 61 64 69 6e 67 20 66 72 6f  ore, reading fro
6840: 6d 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79 20 73  m test.db only s
6850: 68 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f 75 67  hould.# be enoug
6860: 68 20 74 6f 20 63 61 75 73 65 20 53 51 4c 69 74  h to cause SQLit
6870: 65 20 74 6f 20 64 65 6c 65 74 65 20 24 3a 3a 6d  e to delete $::m
6880: 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64  j_filename1..#.d
6890: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
68a0: 61 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b 20 66  ager1.4.6.10 { f
68b0: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
68c0: 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d  _filename  } {1}
68d0: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
68e0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 31 20 7b   pager1.4.6.11 {
68f0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
6900: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b  mj_filename1 } {
6910: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
6920: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32  st pager1.4.6.12
6930: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
6940: 20 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d 0a 64   t1 } {1 t1.1}.d
6950: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
6960: 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66  ager1.4.6.13 { f
6970: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
6980: 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d  _filename  } {1}
6990: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
69a0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b   pager1.4.6.14 {
69b0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
69c0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b  mj_filename1 } {
69d0: 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  0}..do_execsql_t
69e0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31  est pager1.4.6.1
69f0: 32 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65  2 {.  ATTACH 'te
6a00: 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a  st.db2' AS two;.
6a10: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6a20: 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64  t2;.} {1 t2.1}.d
6a30: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
6a40: 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66  ager1.4.6.13 { f
6a50: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
6a60: 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 31 7d  _filename }  {1}
6a70: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6a80: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b   pager1.4.6.14 {
6a90: 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e  .  ATTACH 'test.
6aa0: 64 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a 20  db3' AS three;. 
6ab0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6ac0: 33 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a 64 6f  3;.} {1 t3.1}.do
6ad0: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
6ae0: 67 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20 66 69  ger1.4.6.15 { fi
6af0: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
6b00: 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30 7d 0a  filename }  {0}.
6b10: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
6b20: 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20  ete..testvfs tv 
6b30: 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65  -default 1.tv se
6b40: 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76 20  ctorsize 512.tv 
6b50: 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a  script copy_on_j
6b60: 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74 76  ournal_delete.tv
6b70: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
6b80: 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75  proc copy_on_jou
6b90: 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65 74  rnal_delete {met
6ba0: 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67  hod filename arg
6bb0: 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69  s} {.  if {[stri
6bc0: 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61  ng match *journa
6bd0: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66 61  l $filename]} fa
6be0: 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 72  ultsim_save .  r
6bf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
6c00: 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74  }.faultsim_delet
6c10: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f  e_and_reopen.do_
6c20: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
6c30: 65 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20 50 52  er1.4.7.1 {.  PR
6c40: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
6c50: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 43 52  e = DELETE;.  CR
6c60: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20  EATE TABLE t1(x 
6c70: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
6c80: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
6c90: 69 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20 20 49  i1 ON t1(y);.  I
6ca0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6cb0: 4c 55 45 53 28 27 49 27 2c 20 20 20 27 6f 6e 65  LUES('I',   'one
6cc0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
6cd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 49 27  O t1 VALUES('II'
6ce0: 2c 20 20 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e  ,  'four');.  IN
6cf0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6d00: 55 45 53 28 27 49 49 49 27 2c 20 27 6e 69 6e 65  UES('III', 'nine
6d10: 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  ');.  BEGIN;.   
6d20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6d30: 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27 73 69  VALUES('IV', 'si
6d40: 78 74 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e 53  xteen');.    INS
6d50: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6d60: 45 53 28 27 56 27 20 2c 20 27 74 77 65 6e 74 79  ES('V' , 'twenty
6d70: 66 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d 49 54  five');.  COMMIT
6d80: 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20  ;.} {delete}.tv 
6d90: 66 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63 6c 6f  filter {}.db clo
6da0: 73 65 0a 74 76 20 64 65 6c 65 74 65 20 0a 64 6f  se.tv delete .do
6db0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37  _test pager1.4.7
6dc0: 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .2 {.  faultsim_
6dd0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
6de0: 65 6e 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65  en.  catch {file
6df0: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
6e00: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72  .db-journal -per
6e10: 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d  missions r------
6e20: 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c  --}.  catch {fil
6e30: 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73  e attributes tes
6e40: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65  t.db-journal -re
6e50: 61 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61 74 63  adonly 1}.  catc
6e60: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  hsql { SELECT * 
6e70: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b  FROM t1 }.} {1 {
6e80: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
6e90: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 64  atabase file}}.d
6ea0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
6eb0: 37 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  7.3 {.  db close
6ec0: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
6ed0: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
6ee0: 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69  b-journal -permi
6ef0: 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d  ssions rw-rw-rw-
6f00: 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20  }.  catch {file 
6f10: 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e  attributes test.
6f20: 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64  db-journal -read
6f30: 6f 6e 6c 79 20 30 7d 0a 20 20 64 65 6c 65 74 65  only 0}.  delete
6f40: 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f  _file test.db-jo
6f50: 75 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65 78 69  urnal.  file exi
6f60: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
6f70: 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73  nal.} {0}.do_tes
6f80: 74 20 70 61 67 65 72 31 2e 34 2e 38 2e 31 20 7b  t pager1.4.8.1 {
6f90: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
6fa0: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
6fb0: 62 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72  b -permissions r
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63  --------}.  catc
6fd0: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
6fe0: 65 73 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64  es test.db -read
6ff0: 6f 6e 6c 79 20 31 7d 0a 20 20 73 71 6c 69 74 65  only 1}.  sqlite
7000: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
7010: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
7020: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71  * FROM t1 }.  sq
7030: 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
7040: 79 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 31 7d 0a  y db main.} {1}.
7050: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
7060: 2e 38 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33  .8.2 {.  sqlite3
7070: 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20  _db_readonly db 
7080: 78 79 7a 0a 7d 20 7b 2d 31 7d 0a 64 6f 5f 74 65  xyz.} {-1}.do_te
7090: 73 74 20 70 61 67 65 72 31 2e 34 2e 38 2e 33 20  st pager1.4.8.3 
70a0: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63  {.  db close.  c
70b0: 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69  atch {file attri
70c0: 62 75 74 65 73 20 74 65 73 74 2e 64 62 20 2d 72  butes test.db -r
70d0: 65 61 64 6f 6e 6c 79 20 30 7d 0a 20 20 63 61 74  eadonly 0}.  cat
70e0: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
70f0: 74 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72  tes test.db -per
7100: 6d 69 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72  missions rw-rw-r
7110: 77 2d 7d 20 6d 73 67 0a 20 20 73 71 6c 69 74 65  w-} msg.  sqlite
7120: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
7130: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
7140: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71  * FROM t1 }.  sq
7150: 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
7160: 79 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 30 7d 0a  y db main.} {0}.
7170: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
7180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
71c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
71d0: 73 20 64 65 61 6c 20 77 69 74 68 20 6d 75 6c 74  s deal with mult
71e0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
71f0: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 31 2e 2a  #.# pager1-5.1.*
7200: 3a 20 54 68 65 20 63 61 73 65 20 77 68 65 72 65  : The case where
7210: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 61   a multi-file ca
7220: 6e 6e 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74 65  nnot be committe
7230: 64 20 62 65 63 61 75 73 65 0a 23 20 20 20 20 20  d because.#     
7240: 20 20 20 20 20 20 20 20 20 20 61 6e 6f 74 68 65            anothe
7250: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  r connection is 
7260: 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44  holding a SHARED
7270: 20 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20   lock on one of 
7280: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
7290: 20 20 20 20 66 69 6c 65 73 2e 20 41 66 74 65 72      files. After
72a0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
72b0: 20 69 73 20 72 65 6d 6f 76 65 64 2c 20 74 68 65   is removed, the
72c0: 20 43 4f 4d 4d 49 54 20 73 75 63 63 65 65 64 73   COMMIT succeeds
72d0: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 32  ..#.# pager1-5.2
72e0: 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63  .*: Multi-file c
72f0: 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72  ommits with jour
7300: 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e  nal_mode=memory.
7310: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 33 2e  .#.# pager1-5.3.
7320: 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  *: Multi-file co
7330: 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e  mmits with journ
7340: 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a  al_mode=memory..
7350: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 34 2e 2a  #.# pager1-5.4.*
7360: 3a 20 43 68 65 63 6b 20 74 68 61 74 20 77 69 74  : Check that wit
7370: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f  h synchronous=no
7380: 72 6d 61 6c 2c 20 74 68 65 20 6d 61 73 74 65 72  rmal, the master
7390: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20  -journal file.# 
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
73b0: 6d 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 61  me is added to a
73c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
73d0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
73e0: 74 68 65 20 6c 61 73 74 0a 23 20 20 20 20 20 20  the last.#      
73f0: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
7400: 20 72 65 63 6f 72 64 2e 20 42 75 74 20 77 69 74   record. But wit
7410: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75  h synchronous=fu
7420: 6c 6c 2c 20 65 78 74 72 61 20 75 6e 75 73 65 64  ll, extra unused
7430: 20 73 70 61 63 65 0a 23 20 20 20 20 20 20 20 20   space.#        
7440: 20 20 20 20 20 20 20 69 73 20 61 6c 6c 6f 63 61         is alloca
7450: 74 65 64 20 62 65 74 77 65 65 6e 20 74 68 65 20  ted between the 
7460: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
7470: 6f 72 64 20 61 6e 64 20 74 68 65 20 0a 23 20 20  ord and the .#  
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73               mas
7490: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
74a0: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 74 68   name so that th
74b0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
74c0: 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20   file.#         
74d0: 20 20 20 20 20 20 6e 61 6d 65 20 64 6f 65 73 20        name does 
74e0: 6e 6f 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 73  not lie on the s
74f0: 61 6d 65 20 73 65 63 74 6f 72 20 61 73 20 74 68  ame sector as th
7500: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 66  e last journal f
7510: 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ile.#           
7520: 20 20 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23 20      record..#.# 
7530: 70 61 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43 68  pager1-5.5.*: Ch
7540: 65 63 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75 72  eck that in jour
7550: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
7560: 20 6d 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61 6c   mode, a journal
7570: 20 66 69 6c 65 20 69 73 0a 23 20 20 20 20 20 20   file is.#      
7580: 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61 74           truncat
7590: 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
75a0: 20 77 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66 69   when a multi-fi
75b0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  le transaction i
75c0: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s .#            
75d0: 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e     committed (in
75e0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 66 69 72  stead of the fir
75f0: 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
7600: 65 73 20 62 65 69 6e 67 20 7a 65 72 6f 65 64 29  es being zeroed)
7610: 2e 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ..#.#.do_test pa
7620: 67 65 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20 66  ger1-5.1.1 {.  f
7630: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
7640: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
7650: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48  sql {.    ATTACH
7660: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
7670: 75 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ux;.    CREATE T
7680: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
7690: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
76a0: 61 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20  aux.t2(a, b);.  
76b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
76c0: 20 56 41 4c 55 45 53 28 31 37 2c 20 27 4c 65 6e   VALUES(17, 'Len
76d0: 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  in');.    INSERT
76e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
76f0: 32 32 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a 20  22, 'Stalin');. 
7700: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7710: 31 20 56 41 4c 55 45 53 28 35 33 2c 20 27 4b 68  1 VALUES(53, 'Kh
7720: 72 75 73 68 63 68 65 76 27 29 3b 0a 20 20 7d 0a  rushchev');.  }.
7730: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
7740: 65 72 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65 78  er1-5.1.2 {.  ex
7750: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
7760: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
7770: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36  INTO t1 VALUES(6
7780: 34 2c 20 27 42 72 65 7a 68 6e 65 76 27 29 3b 0a  4, 'Brezhnev');.
7790: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
77a0: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O t2 SELECT * FR
77b0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  OM t1;.  }.  sql
77c0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
77d0: 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  2.  execsql {.  
77e0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
77f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
7800: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f  .  } db2.} {}.do
7810: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
7820: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
7830: 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61 74  COMMIT.} {1 {dat
7840: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
7850: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
7860: 2d 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  -5.1.4 {.  execs
7870: 71 6c 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20 20  ql COMMIT db2.  
7880: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20  execsql COMMIT. 
7890: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
78a0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  T * FROM t2 } db
78b0: 32 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32 32  2.} {17 Lenin 22
78c0: 20 53 74 61 6c 69 6e 20 35 33 20 4b 68 72 75 73   Stalin 53 Khrus
78d0: 68 63 68 65 76 20 36 34 20 42 72 65 7a 68 6e 65  hchev 64 Brezhne
78e0: 76 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  v}.do_test pager
78f0: 31 2d 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32 20  1-5.1.5 {.  db2 
7900: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  close.} {}..do_t
7910: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 32 2e 31  est pager1-5.2.1
7920: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
7930: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
7940: 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 3b  l_mode = memory;
7950: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7960: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7970: 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64   VALUES(84, 'And
7980: 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 20 20 49  ropov');.      I
7990: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
79a0: 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70  LUES(84, 'Androp
79b0: 6f 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  ov');.    COMMIT
79c0: 3b 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d  ;.  }.} {memory}
79d0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
79e0: 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  5.3.1 {.  execsq
79f0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
7a00: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66  ournal_mode = of
7a10: 66 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  f;.    BEGIN;.  
7a20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7a30: 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47  t1 VALUES(85, 'G
7a40: 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20  orbachev');.    
7a50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
7a60: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
7a70: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f  bachev');.    CO
7a80: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66  MMIT;.  }.} {off
7a90: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
7aa0: 31 2d 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20 63  1-5.4.1 {.  db c
7ab0: 6c 6f 73 65 0a 20 20 74 65 73 74 76 66 73 20 74  lose.  testvfs t
7ac0: 76 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  v.  sqlite3 db t
7ad0: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20  est.db -vfs tv. 
7ae0: 20 65 78 65 63 73 71 6c 20 7b 20 41 54 54 41 43   execsql { ATTAC
7af0: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
7b00: 61 75 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c 74  aux }..  tv filt
7b10: 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 76 20  er xDelete.  tv 
7b20: 73 63 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72 6e  script max_journ
7b30: 61 6c 5f 73 69 7a 65 0a 20 20 74 76 20 73 65 63  al_size.  tv sec
7b40: 74 6f 72 73 69 7a 65 20 35 31 32 0a 20 20 73 65  torsize 512.  se
7b50: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20  t ::max_journal 
7b60: 30 0a 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f 75  0.  proc max_jou
7b70: 72 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68 6f  rnal_size {metho
7b80: 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65  d args} {.    se
7b90: 74 20 73 7a 20 30 0a 20 20 20 20 63 61 74 63 68  t sz 0.    catch
7ba0: 20 7b 20 73 65 74 20 73 7a 20 5b 66 69 6c 65 20   { set sz [file 
7bb0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
7bc0: 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20 7b  rnal] }.    if {
7bd0: 24 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75  $sz > $::max_jou
7be0: 72 6e 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73 65  rnal} {.      se
7bf0: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20  t ::max_journal 
7c00: 24 73 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  $sz.    }.    re
7c10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  turn SQLITE_OK. 
7c20: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
7c30: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
7c40: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
7c50: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
7c60: 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c  hronous = NORMAL
7c70: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
7c80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7c90: 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f  1 VALUES(85, 'Go
7ca0: 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20  rbachev');.     
7cb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
7cc0: 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62  VALUES(85, 'Gorb
7cd0: 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d  achev');.    COM
7ce0: 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 23 20 54 68  MIT;.  }..  # Th
7cf0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
7d00: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
7d10: 77 3a 0a 20 20 23 20 0a 20 20 23 20 20 20 31 29  w:.  # .  #   1)
7d20: 20 35 31 32 20 62 79 74 65 20 68 65 61 64 65 72   512 byte header
7d30: 20 2b 0a 20 20 23 20 20 20 32 29 20 32 20 2a 20   +.  #   2) 2 * 
7d40: 28 31 30 32 34 2b 38 29 20 62 79 74 65 20 72 65  (1024+8) byte re
7d50: 63 6f 72 64 73 20 2b 0a 20 20 23 20 20 20 33 29  cords +.  #   3)
7d60: 20 32 30 2b 4e 20 62 79 74 65 73 20 6f 66 20 6d   20+N bytes of m
7d70: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
7d80: 69 6e 74 65 72 2c 20 77 68 65 72 65 20 4e 20 69  inter, where N i
7d90: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 0a 20  s the size of . 
7da0: 20 23 20 20 20 20 20 20 74 68 65 20 6d 61 73 74   #      the mast
7db0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
7dc0: 65 6e 63 6f 64 65 64 20 61 73 20 75 74 66 2d 38  encoded as utf-8
7dd0: 20 77 69 74 68 20 6e 6f 20 6e 75 6c 20 74 65 72   with no nul ter
7de0: 6d 2e 0a 20 20 23 0a 20 20 73 65 74 20 6d 6a 5f  m..  #.  set mj_
7df0: 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b 0a  pointer [expr {.
7e00: 20 20 20 20 32 30 20 2b 20 5b 73 74 72 69 6e 67      20 + [string
7e10: 20 6c 65 6e 67 74 68 20 22 74 65 73 74 2e 64 62   length "test.db
7e20: 2d 6d 6a 58 58 58 58 58 58 39 58 58 22 5d 0a 20  -mjXXXXXX9XX"]. 
7e30: 20 7d 5d 0a 20 20 23 0a 20 20 23 20 20 20 4e 4f   }].  #.  #   NO
7e40: 54 45 3a 20 46 6f 72 20 69 74 65 6d 20 33 20 61  TE: For item 3 a
7e50: 62 6f 76 65 2c 20 69 66 20 74 68 65 20 63 75 72  bove, if the cur
7e60: 72 65 6e 74 20 53 51 4c 69 74 65 20 56 46 53 20  rent SQLite VFS 
7e70: 6c 61 63 6b 73 20 74 68 65 20 63 6f 6e 63 65 70  lacks the concep
7e80: 74 20 6f 66 20 61 0a 20 20 23 20 20 20 20 20 20  t of a.  #      
7e90: 20 20 20 63 75 72 72 65 6e 74 20 64 69 72 65 63     current direc
7ea0: 74 6f 72 79 2c 20 74 68 65 20 6c 65 6e 67 74 68  tory, the length
7eb0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
7ec0: 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 70  directory name p
7ed0: 6c 75 73 20 31 0a 20 20 23 20 20 20 20 20 20 20  lus 1.  #       
7ee0: 20 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20    character for 
7ef0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 65  the directory se
7f00: 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
7f10: 72 20 61 72 65 20 4e 4f 54 20 63 6f 75 6e 74 65  r are NOT counte
7f20: 64 20 61 73 0a 20 20 23 20 20 20 20 20 20 20 20  d as.  #        
7f30: 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 6f 74   part of the tot
7f40: 61 6c 20 73 69 7a 65 3b 20 6f 74 68 65 72 77 69  al size; otherwi
7f50: 73 65 2c 20 74 68 65 79 20 61 72 65 2e 0a 20 20  se, they are..  
7f60: 23 0a 20 20 69 66 63 61 70 61 62 6c 65 20 63 75  #.  ifcapable cu
7f70: 72 64 69 72 20 7b 0a 20 20 20 20 73 65 74 20 6d  rdir {.    set m
7f80: 6a 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20  j_pointer [expr 
7f90: 7b 24 6d 6a 5f 70 6f 69 6e 74 65 72 20 2b 20 5b  {$mj_pointer + [
7fa0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67  string length [g
7fb0: 65 74 5f 70 77 64 5d 5d 20 2b 20 31 7d 5d 0a 20  et_pwd]] + 1}]. 
7fc0: 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 61   }.  expr {$::ma
7fd0: 78 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 35 31 32 2b  x_journal==(512+
7fe0: 32 2a 28 31 30 32 34 2b 38 29 2b 24 6d 6a 5f 70  2*(1024+8)+$mj_p
7ff0: 6f 69 6e 74 65 72 29 7d 0a 7d 20 31 0a 64 6f 5f  ointer)}.} 1.do_
8000: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e  test pager1-5.4.
8010: 32 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f  2 {.  set ::max_
8020: 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 65 78 65 63  journal 0.  exec
8030: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
8040: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66   synchronous = f
8050: 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ull;.    BEGIN;.
8060: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
8070: 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27  M t1 WHERE b = '
8080: 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 20 20 44 45  Lenin';.      DE
8090: 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45  LETE FROM t2 WHE
80a0: 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a  RE b = 'Lenin';.
80b0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
80c0: 0a 20 20 23 20 49 6e 20 73 79 6e 63 68 72 6f 6e  .  # In synchron
80d0: 6f 75 73 3d 66 75 6c 6c 20 6d 6f 64 65 2c 20 74  ous=full mode, t
80e0: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
80f0: 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74  l pointer is not
8100: 20 77 72 69 74 74 65 6e 0a 20 20 23 20 64 69 72   written.  # dir
8110: 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20  ectly after the 
8120: 6c 61 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74  last record in t
8130: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
8140: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 69 73 0a   Instead, it is.
8150: 20 20 23 20 77 72 69 74 74 65 6e 20 73 74 61 72    # written star
8160: 74 69 6e 67 20 61 74 20 74 68 65 20 6e 65 78 74  ting at the next
8170: 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 35   (in this case 5
8180: 31 32 20 62 79 74 65 29 20 73 65 63 74 6f 72 20  12 byte) sector 
8190: 62 6f 75 6e 64 61 72 79 2e 0a 20 20 23 0a 20 20  boundary..  #.  
81a0: 73 65 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b  set mj_pointer [
81b0: 65 78 70 72 20 7b 0a 20 20 20 20 32 30 20 2b 20  expr {.    20 + 
81c0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 22  [string length "
81d0: 74 65 73 74 2e 64 62 2d 6d 6a 58 58 58 58 58 58  test.db-mjXXXXXX
81e0: 39 58 58 22 5d 0a 20 20 7d 5d 0a 20 20 23 0a 20  9XX"].  }].  #. 
81f0: 20 23 20 20 20 4e 4f 54 45 3a 20 49 66 20 74 68   #   NOTE: If th
8200: 65 20 63 75 72 72 65 6e 74 20 53 51 4c 69 74 65  e current SQLite
8210: 20 56 46 53 20 6c 61 63 6b 73 20 74 68 65 20 63   VFS lacks the c
8220: 6f 6e 63 65 70 74 20 6f 66 20 61 20 63 75 72 72  oncept of a curr
8230: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2c 0a 20  ent directory,. 
8240: 20 23 20 20 20 20 20 20 20 20 20 74 68 65 20 6c   #         the l
8250: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 63 75 72  ength of the cur
8260: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6e  rent directory n
8270: 61 6d 65 20 70 6c 75 73 20 31 20 63 68 61 72 61  ame plus 1 chara
8280: 63 74 65 72 20 66 6f 72 20 74 68 65 0a 20 20 23  cter for the.  #
8290: 20 20 20 20 20 20 20 20 20 64 69 72 65 63 74 6f           directo
82a0: 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ry separator cha
82b0: 72 61 63 74 65 72 20 61 72 65 20 4e 4f 54 20 63  racter are NOT c
82c0: 6f 75 6e 74 65 64 20 61 73 20 70 61 72 74 20 6f  ounted as part o
82d0: 66 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 23 20  f the total.  # 
82e0: 20 20 20 20 20 20 20 20 73 69 7a 65 3b 20 6f 74          size; ot
82f0: 68 65 72 77 69 73 65 2c 20 74 68 65 79 20 61 72  herwise, they ar
8300: 65 2e 0a 20 20 23 0a 20 20 69 66 63 61 70 61 62  e..  #.  ifcapab
8310: 6c 65 20 63 75 72 64 69 72 20 7b 0a 20 20 20 20  le curdir {.    
8320: 73 65 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b  set mj_pointer [
8330: 65 78 70 72 20 7b 24 6d 6a 5f 70 6f 69 6e 74 65  expr {$mj_pointe
8340: 72 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  r + [string leng
8350: 74 68 20 5b 67 65 74 5f 70 77 64 5d 5d 20 2b 20  th [get_pwd]] + 
8360: 31 7d 5d 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b  1}].  }.  expr {
8370: 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 3d 3d  $::max_journal==
8380: 28 28 28 35 31 32 2b 32 2a 28 31 30 32 34 2b 38  (((512+2*(1024+8
8390: 29 2b 35 31 31 29 2f 35 31 32 29 2a 35 31 32 20  )+511)/512)*512 
83a0: 2b 20 24 6d 6a 5f 70 6f 69 6e 74 65 72 29 7d 0a  + $mj_pointer)}.
83b0: 7d 20 31 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  } 1.db close.tv 
83c0: 64 65 6c 65 74 65 0a 0a 64 6f 5f 74 65 73 74 20  delete..do_test 
83d0: 70 61 67 65 72 31 2d 35 2e 35 2e 31 20 7b 0a 20  pager1-5.5.1 {. 
83e0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
83f0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
8400: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
8410: 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20  t.db2' AS aux;. 
8420: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
8430: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
8440: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8450: 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20  LE t3(a, b);.   
8460: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
8470: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
8480: 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
8490: 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
84a0: 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 33  1;.    UPDATE t3
84b0: 20 53 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d 62   SET b = randomb
84c0: 6c 6f 62 28 31 35 30 30 29 3b 0a 20 20 7d 0a 20  lob(1500);.  }. 
84d0: 20 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65   expr [file size
84e0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
84f0: 5d 20 3e 20 31 35 30 30 30 0a 7d 20 7b 31 7d 0a  ] > 15000.} {1}.
8500: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
8510: 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .5.2 {.  execsql
8520: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79   {.    PRAGMA sy
8530: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c  nchronous = full
8540: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
8550: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
8560: 31 20 57 48 45 52 45 20 62 20 3d 20 27 53 74 61  1 WHERE b = 'Sta
8570: 6c 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c 45  lin';.      DELE
8580: 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45  TE FROM t2 WHERE
8590: 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20   b = 'Stalin';. 
85a0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
85b0: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
85c0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
85d0: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
85e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
8620: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
8630: 73 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50  sts work with "P
8640: 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63  RAGMA max_page_c
8650: 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74 65 73 74 20  ount".#.do_test 
8660: 70 61 67 65 72 31 2d 36 2e 31 20 7b 0a 20 20 66  pager1-6.1 {.  f
8670: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
8680: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
8690: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
86a0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6e   auto_vacuum = n
86b0: 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  one;.    PRAGMA 
86c0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d  max_page_count =
86d0: 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20   10;.    CREATE 
86e0: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
86f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8700: 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t3(a, b);.    C
8710: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61  REATE TABLE t4(a
8720: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
8730: 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29 3b   TABLE t5(a, b);
8740: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8750: 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t6(a, b);.    
8760: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28  CREATE TABLE t7(
8770: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
8780: 45 20 54 41 42 4c 45 20 74 38 28 61 2c 20 62 29  E TABLE t8(a, b)
8790: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
87a0: 4c 45 20 74 39 28 61 2c 20 62 29 3b 0a 20 20 20  LE t9(a, b);.   
87b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
87c0: 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20 7b  0(a, b);.  }.} {
87d0: 31 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  10}.do_catchsql_
87e0: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 32 20  test pager1-6.2 
87f0: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
8800: 20 74 31 31 28 61 2c 20 62 29 0a 7d 20 7b 31 20   t11(a, b).} {1 
8810: 7b 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73  {database or dis
8820: 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 64 6f 5f 65  k is full}}.do_e
8830: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
8840: 72 31 2d 36 2e 34 20 7b 20 50 52 41 47 4d 41 20  r1-6.4 { PRAGMA 
8850: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 20  max_page_count  
8860: 20 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65 78      } {10}.do_ex
8870: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
8880: 31 2d 36 2e 35 20 7b 20 50 52 41 47 4d 41 20 6d  1-6.5 { PRAGMA m
8890: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20  ax_page_count = 
88a0: 31 35 20 7d 20 7b 31 35 7d 0a 64 6f 5f 65 78 65  15 } {15}.do_exe
88b0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
88c0: 2d 36 2e 36 20 7b 20 43 52 45 41 54 45 20 54 41  -6.6 { CREATE TA
88d0: 42 4c 45 20 74 31 31 28 61 2c 20 62 29 20 20 20  BLE t11(a, b)   
88e0: 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71    } {}.do_execsq
88f0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
8900: 37 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  7 {.  BEGIN;.   
8910: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31   INSERT INTO t11
8920: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
8930: 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61     PRAGMA max_pa
8940: 67 65 5f 63 6f 75 6e 74 20 3d 20 31 33 3b 0a 7d  ge_count = 13;.}
8950: 20 7b 31 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {13}.do_execsql
8960: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 38  _test pager1-6.8
8970: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
8980: 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 33 2c  TO t11 VALUES(3,
8990: 20 34 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   4);.    PRAGMA 
89a0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d  max_page_count =
89b0: 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a 64 6f 5f 65   10;.} {11}.do_e
89c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
89d0: 72 31 2d 36 2e 39 20 7b 20 43 4f 4d 4d 49 54 20  r1-6.9 { COMMIT 
89e0: 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  } {}..do_execsql
89f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31  _test pager1-6.1
8a00: 30 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70  0 { PRAGMA max_p
8a10: 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 20 7d  age_count = 10 }
8a20: 20 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {11}.do_execsql
8a30: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31  _test pager1-6.1
8a40: 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1 { SELECT * FRO
8a50: 4d 20 74 31 31 20 7d 20 20 20 20 20 20 20 20 20  M t11 }         
8a60: 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 65 78   {1 2 3 4}.do_ex
8a70: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
8a80: 31 2d 36 2e 31 32 20 7b 20 50 52 41 47 4d 41 20  1-6.12 { PRAGMA 
8a90: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 7d  max_page_count }
8aa0: 20 20 20 20 20 20 7b 31 31 7d 0a 0a 0a 23 2d 2d        {11}...#--
8ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8af0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
8b00: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f  llowing tests wo
8b10: 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41 20  rk with "PRAGMA 
8b20: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55  journal_mode=TRU
8b30: 4e 43 41 54 45 22 20 61 6e 64 0a 23 20 22 50 52  NCATE" and.# "PR
8b40: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
8b50: 65 3d 45 58 43 4c 55 53 49 56 45 22 2e 0a 23 0a  e=EXCLUSIVE"..#.
8b60: 23 20 45 61 63 68 20 74 65 73 74 20 69 73 20 73  # Each test is s
8b70: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 35 20  pecified with 5 
8b80: 76 61 72 69 61 62 6c 65 73 2e 20 41 73 20 66 6f  variables. As fo
8b90: 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 24 74 6e  llows:.#.#   $tn
8ba0: 3a 20 20 54 65 73 74 20 4e 75 6d 62 65 72 2e 20  :  Test Number. 
8bb0: 55 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  Used as part of 
8bc0: 74 68 65 20 5b 64 6f 5f 74 65 73 74 5d 20 74 65  the [do_test] te
8bd0: 73 74 20 6e 61 6d 65 73 2e 0a 23 20 20 20 24 73  st names..#   $s
8be0: 71 6c 3a 20 53 51 4c 20 74 6f 20 65 78 65 63 75  ql: SQL to execu
8bf0: 74 65 2e 0a 23 20 20 20 24 72 65 73 3a 20 45 78  te..#   $res: Ex
8c00: 70 65 63 74 65 64 20 72 65 73 75 6c 74 20 6f 66  pected result of
8c10: 20 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 2e   executing $sql.
8c20: 0a 23 20 20 20 24 6a 73 3a 20 20 54 68 65 20 65  .#   $js:  The e
8c30: 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20  xpected size of 
8c40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8c50: 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74 65  , in bytes, afte
8c60: 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20 20  r executing.#   
8c70: 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73 63        the SQL sc
8c80: 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20 74  ript. Or -1 if t
8c90: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
8ca0: 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65 78  t expected to ex
8cb0: 69 73 74 2e 0a 23 20 20 20 24 77 73 3a 20 20 54  ist..#   $ws:  T
8cc0: 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65  he expected size
8cd0: 20 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65   of the WAL file
8ce0: 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74 65  , in bytes, afte
8cf0: 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20 20  r executing.#   
8d00: 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73 63        the SQL sc
8d10: 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20 74  ript. Or -1 if t
8d20: 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 65 78  he WAL is not ex
8d30: 70 65 63 74 65 64 20 74 6f 20 65 78 69 73 74 2e  pected to exist.
8d40: 0a 23 0a 69 66 20 7b 24 3a 3a 73 71 6c 69 74 65  .#.if {$::sqlite
8d50: 5f 6f 70 74 69 6f 6e 73 28 77 61 6c 29 20 26 26  _options(wal) &&
8d60: 20 5b 77 61 6c 5f 69 73 5f 6f 6b 5d 7d 20 7b 0a   [wal_is_ok]} {.
8d70: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
8d80: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66  e_and_reopen.  f
8d90: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72  oreach {tn sql r
8da0: 65 73 20 6a 73 20 77 73 7d 20 5b 73 75 62 73 74  es js ws} [subst
8db0: 20 7b 0a 20 20 0a 20 20 20 20 31 20 20 7b 0a 20   {.  .    1  {. 
8dc0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
8dd0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
8de0: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
8df0: 63 75 75 6d 3d 4f 46 46 3b 0a 20 20 20 20 20 20  cuum=OFF;.      
8e00: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
8e10: 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  us=NORMAL;.     
8e20: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
8e30: 65 3d 31 30 32 34 3b 0a 20 20 20 20 20 20 50 52  e=1024;.      PR
8e40: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
8e50: 65 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  e=EXCLUSIVE;.   
8e60: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
8e70: 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 3b  l_mode=TRUNCATE;
8e80: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
8e90: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
8ea0: 32 29 3b 0a 20 20 20 20 7d 20 7b 65 78 63 6c 75  2);.    } {exclu
8eb0: 73 69 76 65 20 74 72 75 6e 63 61 74 65 7d 20 30  sive truncate} 0
8ec0: 20 2d 31 0a 20 20 0a 20 20 20 20 32 20 20 7b 0a   -1.  .    2  {.
8ed0: 20 20 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45        BEGIN IMME
8ee0: 44 49 41 54 45 3b 0a 20 20 20 20 20 20 20 20 53  DIATE;.        S
8ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
8f00: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
8f10: 20 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a     } {1 2} 0 -1.
8f20: 20 20 0a 20 20 20 20 33 20 20 7b 0a 20 20 20 20    .    3  {.    
8f30: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
8f40: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
8f50: 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  1;.      COMMIT;
8f60: 0a 20 20 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d  .    } {1 2} 0 -
8f70: 31 0a 20 20 0a 20 20 20 20 34 20 20 7b 20 50 52  1.  .    4  { PR
8f80: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
8f90: 65 20 3d 20 57 41 4c 20 7d 20 20 20 20 77 61 6c  e = WAL }    wal
8fa0: 20 20 20 20 20 20 20 2d 31 20 2d 31 0a 20 20 20         -1 -1.   
8fb0: 20 35 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54   5  { INSERT INT
8fc0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
8fd0: 29 20 7d 20 20 7b 7d 20 20 20 20 20 20 20 20 2d  ) }  {}        -
8fe0: 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  1 [wal_file_size
8ff0: 20 31 20 31 30 32 34 5d 0a 20 20 20 20 36 20 20   1 1024].    6  
9000: 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67  { PRAGMA locking
9010: 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d  _mode = NORMAL }
9020: 20 65 78 63 6c 75 73 69 76 65 20 2d 31 20 5b 77   exclusive -1 [w
9030: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31  al_file_size 1 1
9040: 30 32 34 5d 0a 20 20 20 20 37 20 20 7b 20 49 4e  024].    7  { IN
9050: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
9060: 55 45 53 28 35 2c 20 36 29 3b 20 7d 20 7b 7d 20  UES(5, 6); } {} 
9070: 20 20 20 20 20 20 20 2d 31 20 5b 77 61 6c 5f 66         -1 [wal_f
9080: 69 6c 65 5f 73 69 7a 65 20 32 20 31 30 32 34 5d  ile_size 2 1024]
9090: 0a 20 20 0a 20 20 20 20 38 20 20 7b 20 50 52 41  .  .    8  { PRA
90a0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
90b0: 20 3d 20 54 52 55 4e 43 41 54 45 20 7d 20 74 72   = TRUNCATE } tr
90c0: 75 6e 63 61 74 65 20 20 20 20 20 20 20 20 20 20  uncate          
90d0: 30 20 2d 31 0a 20 20 20 20 39 20 20 7b 20 49 4e  0 -1.    9  { IN
90e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
90f0: 55 45 53 28 37 2c 20 38 29 20 7d 20 20 20 20 7b  UES(7, 8) }    {
9100: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
9110: 20 30 20 2d 31 0a 20 20 20 20 31 30 20 7b 20 53   0 -1.    10 { S
9120: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
9130: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
9140: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
9150: 7d 20 30 20 2d 31 0a 20 20 0a 20 20 7d 5d 20 7b  } 0 -1.  .  }] {
9160: 0a 20 20 20 20 69 66 63 61 70 61 62 6c 65 20 65  .    ifcapable e
9170: 6e 61 62 6c 65 5f 70 65 72 73 69 73 74 5f 77 61  nable_persist_wa
9180: 6c 20 7b 0a 20 20 20 20 20 20 66 69 6c 65 5f 63  l {.      file_c
9190: 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77  ontrol_persist_w
91a0: 61 6c 20 64 62 20 30 0a 20 20 20 20 7d 0a 20 20  al db 0.    }.  
91b0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
91c0: 74 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e  t pager1-7.1.$tn
91d0: 2e 31 20 24 73 71 6c 20 24 72 65 73 0a 20 20 20  .1 $sql $res.   
91e0: 20 63 61 74 63 68 20 7b 20 73 65 74 20 4a 20 2d   catch { set J -
91f0: 31 20 3b 20 73 65 74 20 4a 20 5b 66 69 6c 65 20  1 ; set J [file 
9200: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
9210: 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63  rnal] }.    catc
9220: 68 20 7b 20 73 65 74 20 57 20 2d 31 20 3b 20 73  h { set W -1 ; s
9230: 65 74 20 57 20 5b 66 69 6c 65 20 73 69 7a 65 20  et W [file size 
9240: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20  test.db-wal] }. 
9250: 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72     do_test pager
9260: 31 2d 37 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69  1-7.1.$tn.2 { li
9270: 73 74 20 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74  st $J $W } [list
9280: 20 24 6a 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a   $js $ws].  }.}.
9290: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
92a0: 37 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  7.2.1 {.  faults
92b0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
92c0: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
92d0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
92e0: 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55  ing_mode = EXCLU
92f0: 53 49 56 45 3b 0a 20 20 20 20 43 52 45 41 54 45  SIVE;.    CREATE
9300: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
9310: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
9320: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
9330: 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a  _mode = delete;.
9340: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
9350: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 74 72 75 6e  rnal_mode = trun
9360: 63 61 74 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63  cate;.  }.} {exc
9370: 6c 75 73 69 76 65 20 64 65 6c 65 74 65 20 74 72  lusive delete tr
9380: 75 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20  uncate}.do_test 
9390: 70 61 67 65 72 31 2d 37 2e 32 2e 32 20 7b 0a 20  pager1-7.2.2 {. 
93a0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
93b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
93c0: 28 31 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73  (1, 2) }.  execs
93d0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
93e0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69  nal_mode = persi
93f0: 73 74 20 7d 0a 7d 20 7b 74 72 75 6e 63 61 74 65  st }.} {truncate
9400: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
9410: 2d 37 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73  -7.2.3 {.  execs
9420: 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  ql { COMMIT }.  
9430: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
9440: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
9450: 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20  e = persist;.   
9460: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
9470: 73 69 7a 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a  size_limit;.  }.
9480: 7d 20 7b 70 65 72 73 69 73 74 20 2d 31 7d 0a 0a  } {persist -1}..
9490: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
94e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
94f0: 2c 20 70 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65  , pager1-8.*, te
9500: 73 74 20 74 68 61 74 20 74 68 65 20 73 70 65 63  st that the spec
9510: 69 61 6c 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23  ial filenames .#
9520: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20   ":memory:" and 
9530: 22 22 20 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72  "" open temporar
9540: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 66  y databases..#.f
9550: 6f 72 65 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e  oreach {tn filen
9560: 61 6d 65 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f  ame} {.  1 :memo
9570: 72 79 3a 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20  ry:.  2 "".} {. 
9580: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
9590: 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61  8.$tn.1 {.    fa
95a0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
95b0: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20  d_reopen.    db 
95c0: 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65  close.    sqlite
95d0: 33 20 64 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20  3 db $filename. 
95e0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
95f0: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
9600: 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20  acuum = 1;.     
9610: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31   CREATE TABLE x1
9620: 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  (x);.      INSER
9630: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
9640: 28 27 43 68 61 72 6c 65 73 27 29 3b 0a 20 20 20  ('Charles');.   
9650: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
9660: 31 20 56 41 4c 55 45 53 28 27 4a 61 6d 65 73 27  1 VALUES('James'
9670: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
9680: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27  INTO x1 VALUES('
9690: 4d 61 72 79 27 29 3b 0a 20 20 20 20 20 20 53 45  Mary');.      SE
96a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a  LECT * FROM x1;.
96b0: 20 20 20 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c      }.  } {Charl
96c0: 65 73 20 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a  es James Mary}..
96d0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
96e0: 2d 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73  -8.$tn.2 {.    s
96f0: 71 6c 69 74 65 33 20 64 62 32 20 24 66 69 6c 65  qlite3 db2 $file
9700: 6e 61 6d 65 0a 20 20 20 20 63 61 74 63 68 73 71  name.    catchsq
9710: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
9720: 4d 20 78 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b  M x1 } db2.  } {
9730: 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  1 {no such table
9740: 3a 20 78 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65  : x1}}..  do_exe
9750: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
9760: 2d 38 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42  -8.$tn.3 {.    B
9770: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
9780: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
9790: 53 28 27 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20  S('William');.  
97a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
97b0: 78 31 20 56 41 4c 55 45 53 28 27 41 6e 6e 65 27  x1 VALUES('Anne'
97c0: 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b  );.    ROLLBACK;
97d0: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .  } {}.}..#----
97e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9820: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74  -----.# The next
9830: 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20   block of tests 
9840: 2d 20 70 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64  - pager1-9.* - d
9850: 65 61 6c 20 77 69 74 68 20 69 6e 74 65 72 61 63  eal with interac
9860: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 23 20  tions between.# 
9870: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  the pager and th
9880: 65 20 62 61 63 6b 75 70 20 41 50 49 2e 20 54 65  e backup API. Te
9890: 73 74 20 63 61 73 65 73 3a 0a 23 0a 23 20 20 20  st cases:.#.#   
98a0: 70 61 67 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65  pager1-9.1.*: Te
98b0: 73 74 20 74 68 61 74 20 61 20 62 61 63 6b 75 70  st that a backup
98c0: 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65   completes succe
98d0: 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66 20  ssfully even if 
98e0: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
98f0: 20 20 20 20 20 20 73 6f 75 72 63 65 20 64 62 20        source db 
9900: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 75  is written to du
9910: 72 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20  ring the backup 
9920: 6f 70 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  op..#.#   pager1
9930: 2d 39 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61  -9.2.*: Test tha
9940: 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c  t a backup compl
9950: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
9960: 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20  y even if the.# 
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 73 6f 75 72 63 65 20 64 62 20 69 73 20 77 72 69  source db is wri
9990: 74 74 65 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e  tten to and then
99a0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 64 75 72   rolled back dur
99b0: 69 6e 67 20 61 20 0a 23 20 20 20 20 20 20 20 20  ing a .#        
99c0: 20 20 20 20 20 20 20 20 20 62 61 63 6b 75 70 20           backup 
99d0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f  operation..#.do_
99e0: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e  test pager1-9.0.
99f0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
9a00: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
9a10: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
9a20: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65  ing a_string.  e
9a30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
9a40: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
9a50: 20 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   10;.    BEGIN;.
9a60: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
9a70: 4c 45 20 61 62 28 61 2c 20 62 2c 20 55 4e 49 51  LE ab(a, b, UNIQ
9a80: 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 20  UE(a, b));.     
9a90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
9aa0: 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67  VALUES( a_string
9ab0: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
9ac0: 33 30 30 29 20 29 3b 0a 20 20 20 20 20 20 49 4e  300) );.      IN
9ad0: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c  SERT INTO ab SEL
9ae0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
9af0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
9b00: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20   FROM ab;.      
9b10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53  INSERT INTO ab S
9b20: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
9b30: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
9b40: 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20  0) FROM ab;.    
9b50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
9b60: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
9b70: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
9b80: 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20  300) FROM ab;.  
9b90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9ba0: 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  ab SELECT a_stri
9bb0: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
9bc0: 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a  g(300) FROM ab;.
9bd0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9be0: 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74  O ab SELECT a_st
9bf0: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
9c00: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62  ing(300) FROM ab
9c10: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9c20: 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f  NTO ab SELECT a_
9c30: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
9c40: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
9c50: 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ab;.      INSERT
9c60: 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20   INTO ab SELECT 
9c70: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
9c80: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
9c90: 4d 20 61 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  M ab;.    COMMIT
9ca0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
9cb0: 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 32 20  st pager1-9.0.2 
9cc0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
9cd0: 74 65 73 74 2e 64 62 32 0a 20 20 64 62 32 20 65  test.db2.  db2 e
9ce0: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63  val { PRAGMA cac
9cf0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20  he_size = 10 }. 
9d00: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
9d10: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
9d20: 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65  in.  list [B ste
9d30: 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69  p 10000] [B fini
9d40: 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f  sh].} {SQLITE_DO
9d50: 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  NE SQLITE_OK}.do
9d60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30  _test pager1-9.0
9d70: 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45  .3 {. db one {SE
9d80: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
9d90: 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62  ) FROM ab}.} [db
9da0: 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64  2 one {SELECT md
9db0: 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20  5sum(a, b) FROM 
9dc0: 61 62 7d 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  ab}]..do_test pa
9dd0: 67 65 72 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65  ger1-9.1.1 {.  e
9de0: 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20  xecsql { UPDATE 
9df0: 61 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72  ab SET a = a_str
9e00: 69 6e 67 28 32 30 31 29 20 7d 0a 20 20 73 71 6c  ing(201) }.  sql
9e10: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62  ite3_backup B db
9e20: 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20  2 main db main. 
9e30: 20 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51   B step 30.} {SQ
9e40: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9e50: 20 70 61 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a   pager1-9.1.2 {.
9e60: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
9e70: 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f  TE ab SET b = a_
9e80: 73 74 72 69 6e 67 28 33 30 31 29 20 7d 0a 20 20  string(301) }.  
9e90: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
9ea0: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
9eb0: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
9ec0: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9ed0: 20 70 61 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a   pager1-9.1.3 {.
9ee0: 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20   db one {SELECT 
9ef0: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9f00: 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65  M ab}.} [db2 one
9f10: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
9f20: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a  a, b) FROM ab}].
9f30: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9f40: 2e 31 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b  .1.4 { execsql {
9f50: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
9f60: 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32   FROM ab } } {12
9f70: 38 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  8}..do_test page
9f80: 72 31 2d 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65  r1-9.2.1 {.  exe
9f90: 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62  csql { UPDATE ab
9fa0: 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e   SET a = a_strin
9fb0: 67 28 32 30 32 29 20 7d 0a 20 20 73 71 6c 69 74  g(202) }.  sqlit
9fc0: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
9fd0: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42  main db main.  B
9fe0: 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49   step 30.} {SQLI
9ff0: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70  TE_OK}.do_test p
a000: 61 67 65 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20  ager1-9.2.2 {.  
a010: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42  execsql { .    B
a020: 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41  EGIN;.      UPDA
a030: 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f  TE ab SET b = a_
a040: 73 74 72 69 6e 67 28 33 30 31 29 3b 0a 20 20 20  string(301);.   
a050: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20   ROLLBACK;.  }. 
a060: 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30   list [B step 10
a070: 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a  000] [B finish].
a080: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53  } {SQLITE_DONE S
a090: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
a0a0: 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b  t pager1-9.2.3 {
a0b0: 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54  . db one {SELECT
a0c0: 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52   md5sum(a, b) FR
a0d0: 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e  OM ab}.} [db2 on
a0e0: 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  e {SELECT md5sum
a0f0: 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d  (a, b) FROM ab}]
a100: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
a110: 39 2e 32 2e 34 20 7b 20 65 78 65 63 73 71 6c 20  9.2.4 { execsql 
a120: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
a130: 29 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31  ) FROM ab } } {1
a140: 32 38 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32  28}.db close.db2
a150: 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20   close..do_test 
a160: 70 61 67 65 72 31 2d 39 2e 33 2e 31 20 7b 0a 20  pager1-9.3.1 {. 
a170: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
a180: 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74  ault 1.  tv sect
a190: 6f 72 73 69 7a 65 20 34 30 39 36 0a 20 20 66 61  orsize 4096.  fa
a1a0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
a1b0: 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 65 78 65 63  d_reopen..  exec
a1c0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 70 61 67  sql { PRAGMA pag
a1d0: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 20 7d 0a  e_size = 1024 }.
a1e0: 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d    for {set ii 0}
a1f0: 20 7b 24 69 69 20 3c 20 34 7d 20 7b 69 6e 63 72   {$ii < 4} {incr
a200: 20 69 69 7d 20 7b 20 65 78 65 63 73 71 6c 20 22   ii} { execsql "
a210: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 24 7b  CREATE TABLE t${
a220: 69 69 7d 28 61 2c 20 62 29 22 20 7d 0a 7d 20 7b  ii}(a, b)" }.} {
a230: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
a240: 2d 39 2e 33 2e 32 20 7b 0a 20 20 73 71 6c 69 74  -9.3.2 {.  sqlit
a250: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
a260: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a270: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
a280: 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 50 52  e = 4096;.    PR
a290: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
a2a0: 20 3d 20 4f 46 46 3b 0a 20 20 20 20 43 52 45 41   = OFF;.    CREA
a2b0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
a2c0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
a2d0: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
a2e0: 7d 20 64 62 32 0a 0a 20 20 73 71 6c 69 74 65 33  } db2..  sqlite3
a2f0: 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61  _backup B db2 ma
a300: 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73  in db main.  B s
a310: 74 65 70 20 33 30 0a 20 20 6c 69 73 74 20 5b 42  tep 30.  list [B
a320: 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20   step 10000] [B 
a330: 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54  finish].} {SQLIT
a340: 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b  E_DONE SQLITE_OK
a350: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
a360: 2d 39 2e 33 2e 33 20 7b 0a 20 20 64 62 32 20 63  -9.3.3 {.  db2 c
a370: 6c 6f 73 65 0a 20 20 64 62 20 63 6c 6f 73 65 0a  lose.  db close.
a380: 20 20 74 76 20 64 65 6c 65 74 65 0a 20 20 66 69    tv delete.  fi
a390: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 32  le size test.db2
a3a0: 0a 7d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  .} [file size te
a3b0: 73 74 2e 64 62 5d 0a 0a 64 6f 5f 74 65 73 74 20  st.db]..do_test 
a3c0: 70 61 67 65 72 31 2d 39 2e 34 2e 31 20 7b 0a 20  pager1-9.4.1 {. 
a3d0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
a3e0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71  _and_reopen.  sq
a3f0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
a400: 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  b2.  execsql {. 
a410: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
a420: 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  ize = 4096;.    
a430: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
a440: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
a450: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
a460: 3b 0a 20 20 7d 20 64 62 32 0a 20 20 73 71 6c 69  ;.  } db2.  sqli
a470: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
a480: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
a490: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
a4a0: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
a4b0: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
a4c0: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
a4d0: 20 70 61 67 65 72 31 2d 39 2e 34 2e 32 20 7b 0a   pager1-9.4.2 {.
a4e0: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a    list [file siz
a4f0: 65 20 74 65 73 74 2e 64 62 32 5d 20 5b 66 69 6c  e test.db2] [fil
a500: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a  e size test.db].
a510: 7d 20 7b 30 20 30 7d 0a 64 62 32 20 63 6c 6f 73  } {0 0}.db2 clos
a520: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
a530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
a570: 54 65 73 74 20 74 68 61 74 20 72 65 67 61 72 64  Test that regard
a580: 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
a590: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 53  e returned by xS
a5a0: 65 63 74 6f 72 53 69 7a 65 28 29 2c 20 74 68 65  ectorSize(), the
a5b0: 0a 23 20 6d 69 6e 69 6d 75 6d 20 65 66 66 65 63  .# minimum effec
a5c0: 74 69 76 65 20 73 65 63 74 6f 72 2d 73 69 7a 65  tive sector-size
a5d0: 20 69 73 20 35 31 32 20 61 6e 64 20 74 68 65 20   is 512 and the 
a5e0: 6d 61 78 69 6d 75 6d 20 36 35 35 33 36 20 62 79  maximum 65536 by
a5f0: 74 65 73 2e 0a 23 0a 74 65 73 74 76 66 73 20 74  tes..#.testvfs t
a600: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 66 6f 72  v -default 1.for
a610: 65 61 63 68 20 73 65 63 74 6f 72 73 69 7a 65 20  each sectorsize 
a620: 7b 0a 20 20 20 20 33 32 20 20 20 36 34 20 20 20  {.    32   64   
a630: 31 32 38 20 20 20 32 35 36 20 20 20 35 31 32 20  128   256   512 
a640: 20 20 31 30 32 34 20 20 20 32 30 34 38 20 0a 20    1024   2048 . 
a650: 20 20 20 34 30 39 36 20 38 31 39 32 20 31 36 33     4096 8192 163
a660: 38 34 20 33 32 37 36 38 20 36 35 35 33 36 20 31  84 32768 65536 1
a670: 33 31 30 37 32 20 32 36 32 31 34 34 0a 7d 20 7b  31072 262144.} {
a680: 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65  .  tv sectorsize
a690: 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 74   $sectorsize.  t
a6a0: 76 20 64 65 76 63 68 61 72 20 7b 7d 0a 20 20 73  v devchar {}.  s
a6b0: 65 74 20 65 66 66 20 24 73 65 63 74 6f 72 73 69  et eff $sectorsi
a6c0: 7a 65 0a 20 20 69 66 20 7b 24 73 65 63 74 6f 72  ze.  if {$sector
a6d0: 73 69 7a 65 20 3c 20 35 31 32 7d 20 20 20 7b 20  size < 512}   { 
a6e0: 73 65 74 20 65 66 66 20 35 31 32 20 7d 0a 20 20  set eff 512 }.  
a6f0: 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20  if {$sectorsize 
a700: 3e 20 36 35 35 33 36 7d 20 7b 20 73 65 74 20 65  > 65536} { set e
a710: 66 66 20 36 35 35 33 36 20 7d 0a 0a 20 20 64 6f  ff 65536 }..  do
a720: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e  _test pager1-10.
a730: 24 73 65 63 74 6f 72 73 69 7a 65 2e 31 20 7b 0a  $sectorsize.1 {.
a740: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c      faultsim_del
a750: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
a760: 20 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72     db func a_str
a770: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20  ing a_string.   
a780: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
a790: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
a7a0: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
a7b0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67        PRAGMA pag
a7c0: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
a7d0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
a7e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a7f0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
a800: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a810: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t2(a, b);.      
a820: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a830: 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43  3(a, b);.      C
a840: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 20  OMMIT;.    }.   
a850: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
a860: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 5b  db-journal.  } [
a870: 65 78 70 72 20 24 73 65 63 74 6f 72 73 69 7a 65  expr $sectorsize
a880: 20 3e 20 36 35 35 33 36 20 3f 20 36 35 35 33 36   > 65536 ? 65536
a890: 20 3a 20 24 73 65 63 74 6f 72 73 69 7a 65 5d 0a   : $sectorsize].
a8a0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
a8b0: 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65  1-10.$sectorsize
a8c0: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
a8d0: 20 7b 20 0a 20 20 20 20 20 20 49 4e 53 45 52 54   { .      INSERT
a8e0: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
a8f0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 2c 20 61  a_string(300), a
a900: 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20  _string(300));. 
a910: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
a920: 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t3 SELECT * FRO
a930: 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20  M t3;        /* 
a940: 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   2 */.      INSE
a950: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
a960: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20  T * FROM t3;    
a970: 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20      /*  4 */.   
a980: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a990: 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  3 SELECT * FROM 
a9a0: 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 38  t3;        /*  8
a9b0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
a9c0: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
a9d0: 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20  * FROM t3;      
a9e0: 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20    /* 16 */.     
a9f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
aa00: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
aa10: 3b 20 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a  ;        /* 32 *
aa20: 2f 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a  /.    }.  } {}..
aa30: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
aa40: 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e  -10.$sectorsize.
aa50: 33 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65  3 {.    db close
aa60: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
aa70: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63  test.db.    exec
aa80: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 50 52 41  sql { .      PRA
aa90: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
aaa0: 20 31 30 3b 0a 20 20 20 20 20 20 42 45 47 49 4e   10;.      BEGIN
aab0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75  ;.    }.    recu
aac0: 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20  rsive_select 32 
aad0: 74 33 20 7b 64 62 20 65 76 61 6c 20 22 49 4e 53  t3 {db eval "INS
aae0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
aaf0: 45 53 28 31 2c 20 32 29 22 7d 0a 20 20 20 20 65  ES(1, 2)"}.    e
ab00: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
ab10: 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53 45 4c  OMMIT;.      SEL
ab20: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
ab30: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 0a     }.  } {1 2}..
ab40: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ab50: 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e  -10.$sectorsize.
ab60: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
ab70: 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  {.      CREATE T
ab80: 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20  ABLE t6(a, b);. 
ab90: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
aba0: 45 20 74 37 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t7(a, b);.    
abb0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
abc0: 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 44  5(a, b);.      D
abd0: 52 4f 50 20 54 41 42 4c 45 20 74 36 3b 0a 20 20  ROP TABLE t6;.  
abe0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
abf0: 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65  7;.    }.    exe
ac00: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47  csql {.      BEG
ac10: 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  IN;.        CREA
ac20: 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62  TE TABLE t6(a, b
ac30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63  );.    }.    rec
ac40: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32  ursive_select 32
ac50: 20 74 33 20 7b 64 62 20 65 76 61 6c 20 22 49 4e   t3 {db eval "IN
ac60: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
ac70: 55 45 53 28 31 2c 20 32 29 22 7d 0a 20 20 20 20  UES(1, 2)"}.    
ac80: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
ac90: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53 45  COMMIT;.      SE
aca0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 3b 0a  LECT * FROM t5;.
acb0: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a      }.  } {1 2}.
acc0: 20 20 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 74    .}.db close..t
acd0: 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39  v sectorsize 409
ace0: 36 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  6.do_test pager1
acf0: 2e 31 30 2e 78 2e 31 20 7b 0a 20 20 66 61 75 6c  .10.x.1 {.  faul
ad00: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
ad10: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
ad20: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75   {.    PRAGMA au
ad30: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6e 6f 6e 65  to_vacuum = none
ad40: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  ;.    PRAGMA pag
ad50: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
ad60: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
ad70: 74 31 28 78 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  t1(x);.  }.  for
ad80: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 33   {set i 0} {$i<3
ad90: 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  0} {incr i} {.  
ada0: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
adb0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
adc0: 53 28 7a 65 72 6f 62 6c 6f 62 28 39 30 30 29 29  S(zeroblob(900))
add0: 20 7d 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69   }.  }.  file si
ade0: 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 33 32  ze test.db.} {32
adf0: 37 36 38 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  768}.do_test pag
ae00: 65 72 31 2e 31 30 2e 78 2e 32 20 7b 0a 20 20 65  er1.10.x.2 {.  e
ae10: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
ae20: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b  ATE TABLE t2(x);
ae30: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
ae40: 74 32 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  t2;.  }.  file s
ae50: 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 33  ize test.db.} {3
ae60: 33 37 39 32 7d 0a 64 6f 5f 74 65 73 74 20 70 61  3792}.do_test pa
ae70: 67 65 72 31 2e 31 30 2e 78 2e 33 20 7b 0a 20 20  ger1.10.x.3 {.  
ae80: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
ae90: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
aea0: 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 7d  TABLE t2(x);.  }
aeb0: 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  .  recursive_sel
aec0: 65 63 74 20 33 30 20 74 31 0a 20 20 65 78 65 63  ect 30 t1.  exec
aed0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
aee0: 20 54 41 42 4c 45 20 74 33 28 78 29 3b 0a 20 20   TABLE t3(x);.  
aef0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
af00: 7b 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  {}..db close.tv 
af10: 64 65 6c 65 74 65 0a 0a 74 65 73 74 76 66 73 20  delete..testvfs 
af20: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 66 61  tv -default 1.fa
af30: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
af40: 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63  d_reopen.db func
af50: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
af60: 6e 67 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ng.do_execsql_te
af70: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 31 20 7b  st pager1-11.1 {
af80: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
af90: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
afa0: 0a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f  .  PRAGMA cache_
afb0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47  size = 10;.  BEG
afc0: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
afd0: 41 42 4c 45 20 7a 7a 28 74 6f 70 20 50 52 49 4d  ABLE zz(top PRIM
afe0: 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e  ARY KEY);.    IN
aff0: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 56 41 4c  SERT INTO zz VAL
b000: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 32 32  UES(a_string(222
b010: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
b020: 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f  NTO zz SELECT a_
b030: 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32  string((SELECT 2
b040: 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52  22+max(rowid) FR
b050: 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b  OM zz)) FROM zz;
b060: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b070: 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72   zz SELECT a_str
b080: 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b  ing((SELECT 222+
b090: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
b0a0: 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20  zz)) FROM zz;.  
b0b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
b0c0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
b0d0: 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78  ((SELECT 222+max
b0e0: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29  (rowid) FROM zz)
b0f0: 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49  ) FROM zz;.    I
b100: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
b110: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
b120: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
b130: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
b140: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
b150: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
b160: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
b170: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
b180: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
b190: 20 7a 7a 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20   zz;.  COMMIT;. 
b1a0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 55 50 44 41   BEGIN;.    UPDA
b1b0: 54 45 20 7a 7a 20 53 45 54 20 74 6f 70 20 3d 20  TE zz SET top = 
b1c0: 61 5f 73 74 72 69 6e 67 28 33 34 35 29 3b 0a 7d  a_string(345);.}
b1d0: 20 7b 64 65 6c 65 74 65 7d 0a 0a 70 72 6f 63 20   {delete}..proc 
b1e0: 6c 6f 63 6b 6f 75 74 20 7b 6d 65 74 68 6f 64 20  lockout {method 
b1f0: 61 72 67 73 7d 20 7b 20 72 65 74 75 72 6e 20 53  args} { return S
b200: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7d 0a 74 76  QLITE_IOERR }.tv
b210: 20 73 63 72 69 70 74 20 6c 6f 63 6b 6f 75 74 0a   script lockout.
b220: 74 76 20 66 69 6c 74 65 72 20 7b 78 57 72 69 74  tv filter {xWrit
b230: 65 20 78 54 72 75 6e 63 61 74 65 20 78 53 79 6e  e xTruncate xSyn
b240: 63 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  c}.do_catchsql_t
b250: 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 32 20  est pager1-11.2 
b260: 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 31 20 7b 64  { COMMIT } {1 {d
b270: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a  isk I/O error}}.
b280: 0a 74 76 20 73 63 72 69 70 74 20 7b 7d 0a 64 6f  .tv script {}.do
b290: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e  _test pager1-11.
b2a0: 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  3 {.  sqlite3 db
b2b0: 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  2 test.db.  exec
b2c0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
b2d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
b2e0: 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 50 52  TRUNCATE;.    PR
b2f0: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
b300: 68 65 63 6b 3b 0a 20 20 7d 20 64 62 32 0a 7d 20  heck;.  } db2.} 
b310: 7b 74 72 75 6e 63 61 74 65 20 6f 6b 7d 0a 64 6f  {truncate ok}.do
b320: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e  _test pager1-11.
b330: 34 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  4 {.  db2 close.
b340: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
b350: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
b360: 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {0}.do_execsql_t
b370: 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 35 20  est pager1-11.5 
b380: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
b390: 29 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b 33 32 7d  ) FROM zz } {32}
b3a0: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
b3b0: 65 74 65 0a 20 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ete.  .#--------
b3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b400: 2d 0a 23 20 54 65 73 74 20 22 50 52 41 47 4d 41  -.# Test "PRAGMA
b410: 20 70 61 67 65 5f 73 69 7a 65 22 0a 23 0a 74 65   page_size".#.te
b420: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
b430: 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a  t 1.tv sectorsiz
b440: 65 20 31 30 32 34 0a 66 6f 72 65 61 63 68 20 70  e 1024.foreach p
b450: 61 67 65 73 69 7a 65 20 7b 0a 20 20 20 20 35 31  agesize {.    51
b460: 32 20 20 20 31 30 32 34 20 20 20 32 30 34 38 20  2   1024   2048 
b470: 34 30 39 36 20 38 31 39 32 20 31 36 33 38 34 20  4096 8192 16384 
b480: 33 32 37 36 38 20 0a 7d 20 7b 0a 20 20 66 61 75  32768 .} {.  fau
b490: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
b4a0: 5f 72 65 6f 70 65 6e 0a 0a 20 20 23 20 54 68 65  _reopen..  # The
b4b0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 28 61 63   sector-size (ac
b4c0: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 56  cording to the V
b4d0: 46 53 29 20 69 73 20 31 30 32 34 20 62 79 74 65  FS) is 1024 byte
b4e0: 73 2e 20 53 6f 20 69 66 20 74 68 65 0a 20 20 23  s. So if the.  #
b4f0: 20 70 61 67 65 2d 73 69 7a 65 20 72 65 71 75 65   page-size reque
b500: 73 74 65 64 20 75 73 69 6e 67 20 22 50 52 41 47  sted using "PRAG
b510: 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 20 69 73  MA page_size" is
b520: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
b530: 65 0a 20 20 23 20 63 6f 6d 70 69 6c 65 20 74 69  e.  # compile ti
b540: 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49  me value of SQLI
b550: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
b560: 2c 20 74 68 65 6e 20 74 68 65 20 65 66 66 65 63  , then the effec
b570: 74 69 76 65 20 0a 20 20 23 20 70 61 67 65 2d 73  tive .  # page-s
b580: 69 7a 65 20 72 65 6d 61 69 6e 73 20 31 30 32 34  ize remains 1024
b590: 20 62 79 74 65 73 2e 0a 20 20 23 0a 20 20 73 65   bytes..  #.  se
b5a0: 74 20 65 66 66 20 24 70 61 67 65 73 69 7a 65 0a  t eff $pagesize.
b5b0: 20 20 69 66 20 7b 24 65 66 66 20 3e 20 24 3a 3a    if {$eff > $::
b5c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
b5d0: 53 49 5a 45 7d 20 7b 20 73 65 74 20 65 66 66 20  SIZE} { set eff 
b5e0: 31 30 32 34 20 7d 0a 0a 20 20 64 6f 5f 74 65 73  1024 }..  do_tes
b5f0: 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67  t pager1-12.$pag
b600: 65 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 73 71  esize.1 {.    sq
b610: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
b620: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a  b.    execsql ".
b630: 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67        PRAGMA pag
b640: 65 5f 73 69 7a 65 20 3d 20 24 70 61 67 65 73 69  e_size = $pagesi
b650: 7a 65 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  ze;.      CREATE
b660: 20 56 49 45 57 20 76 20 41 53 20 53 45 4c 45 43   VIEW v AS SELEC
b670: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
b680: 6d 61 73 74 65 72 3b 0a 20 20 20 20 22 20 64 62  master;.    " db
b690: 32 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20  2.    file size 
b6a0: 74 65 73 74 2e 64 62 0a 20 20 7d 20 24 65 66 66  test.db.  } $eff
b6b0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
b6c0: 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 32  1-12.$pagesize.2
b6d0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
b6e0: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  b2 test.db.    e
b6f0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
b700: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
b710: 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50 52  FROM v;.      PR
b720: 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73  AGMA main.page_s
b730: 69 7a 65 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20  ize;.    } db2. 
b740: 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 66 66 5d   } [list 1 $eff]
b750: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
b760: 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 33  1-12.$pagesize.3
b770: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
b780: 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63   .      SELECT c
b790: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a  ount(*) FROM v;.
b7a0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69        PRAGMA mai
b7b0: 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20  n.page_size;.   
b7c0: 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24   }.  } [list 1 $
b7d0: 65 66 66 5d 0a 20 20 64 62 32 20 63 6c 6f 73 65  eff].  db2 close
b7e0: 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  .}.db close.tv d
b7f0: 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  elete..#--------
b800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b840: 2d 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c 20  -.# Test specal 
b850: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
b860: 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 74 65  mode=PERSIST" te
b870: 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61  st cases..#.# pa
b880: 67 65 72 31 2d 31 33 2e 31 2e 2a 3a 20 54 68 69  ger1-13.1.*: Thi
b890: 73 20 74 65 73 74 73 20 61 20 73 70 65 63 69 61  s tests a specia
b8a0: 6c 20 63 61 73 65 20 65 6e 63 6f 75 6e 74 65 72  l case encounter
b8b0: 65 64 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ed in persistent
b8c0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
b8d0: 20 20 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a     journal mode:
b8e0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
b8f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
b900: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20  a transaction.# 
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
b920: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
b930: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b940: 28 62 65 63 61 75 73 65 20 61 20 70 72 65 76 69  (because a previ
b950: 6f 75 73 20 0a 23 20 20 20 20 20 20 20 20 20 20  ous .#          
b960: 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f        transactio
b970: 6e 20 6c 65 66 74 20 61 20 76 65 72 79 20 6c 61  n left a very la
b980: 72 67 65 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72  rge non-hot jour
b990: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 0a  nal file in the.
b9a0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
b9b0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 29 2c 20 74   file-system), t
b9c0: 68 65 6e 20 53 51 4c 69 74 65 20 68 61 73 20 74  hen SQLite has t
b9d0: 6f 20 62 65 20 63 61 72 65 66 75 6c 20 74 68 61  o be careful tha
b9e0: 74 20 74 68 65 72 65 20 69 73 0a 23 20 20 20 20  t there is.#    
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20              not 
ba00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
ba10: 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
ba20: 61 20 70 72 65 76 69 6f 75 73 20 74 72 61 6e 73  a previous trans
ba30: 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 20  action.#        
ba40: 20 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74          immediat
ba50: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
ba60: 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 65 6e  e journal conten
ba70: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2e 0a  t just written..
ba80: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
ba90: 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
baa0: 64 20 74 68 65 20 70 72 6f 63 65 73 73 20 63 72  d the process cr
bab0: 61 73 68 65 73 20 73 6f 20 74 68 61 74 20 74 68  ashes so that th
bac0: 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 20 20 20 20  e journal.#     
bad0: 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f 6d             becom
bae0: 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  es a hot-journal
baf0: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 6f 6c   and must be rol
bb00: 6c 65 64 20 62 61 63 6b 20 62 79 20 61 6e 6f 74  led back by anot
bb10: 68 65 72 0a 23 20 20 20 20 20 20 20 20 20 20 20  her.#           
bb20: 20 20 20 20 20 70 72 6f 63 65 73 73 2c 20 74 68       process, th
bb30: 65 72 65 20 69 73 20 61 20 64 61 6e 67 65 72 20  ere is a danger 
bb40: 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70  that the other p
bb50: 72 6f 63 65 73 73 20 6d 61 79 20 72 6f 6c 6c 0a  rocess may roll.
bb60: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
bb70: 20 62 61 63 6b 20 74 68 65 20 61 62 6f 72 74 65   back the aborte
bb80: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  d transaction, t
bb90: 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 63 6f 70  hen continue cop
bba0: 79 69 6e 67 20 64 61 74 61 0a 23 20 20 20 20 20  ying data.#     
bbb0: 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
bbc0: 61 6e 20 6f 6c 64 65 72 20 74 72 61 6e 73 61 63  an older transac
bbd0: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65  tion from the re
bbe0: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
bbf0: 6f 75 72 6e 61 6c 2e 0a 23 20 20 20 20 20 20 20  ournal..#       
bc00: 20 20 20 20 20 20 20 20 20 53 65 65 20 74 68 65           See the
bc10: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 20 66   syncJournal() f
bc20: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61  unction for deta
bc30: 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  ils..#.# pager1-
bc40: 31 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65 73  13.2.*: Same tes
bc50: 74 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  t as the previou
bc60: 73 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 74 68  s. This time, th
bc70: 72 6f 77 20 61 6e 20 69 6e 64 65 78 20 69 6e 74  row an index int
bc80: 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  o.#             
bc90: 20 20 20 74 68 65 20 6d 69 78 20 74 6f 20 6d 61     the mix to ma
bca0: 6b 65 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ke the integrity
bcb0: 2d 63 68 65 63 6b 20 6d 6f 72 65 20 6c 69 6b 65  -check more like
bcc0: 6c 79 20 74 6f 20 63 61 74 63 68 0a 23 20 20 20  ly to catch.#   
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
bce0: 6f 72 73 2e 0a 23 0a 74 65 73 74 76 66 73 20 74  ors..#.testvfs t
bcf0: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20  v -default 1.tv 
bd00: 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 74  script xSyncCb.t
bd10: 76 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 70  v filter xSync.p
bd20: 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 6d 65 74  roc xSyncCb {met
bd30: 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67  hod filename arg
bd40: 73 7d 20 7b 0a 20 20 73 65 74 20 74 20 5b 66 69  s} {.  set t [fi
bd50: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d  le tail $filenam
bd60: 65 5d 0a 20 20 69 66 20 7b 24 74 20 3d 3d 20 22  e].  if {$t == "
bd70: 74 65 73 74 2e 64 62 22 7d 20 66 61 75 6c 74 73  test.db"} faults
bd80: 69 6d 5f 73 61 76 65 0a 20 20 72 65 74 75 72 6e  im_save.  return
bd90: 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75   SQLITE_OK.}.fau
bda0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
bdb0: 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63 20  _reopen.db func 
bdc0: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
bdd0: 67 0a 0a 23 20 54 68 65 20 55 50 44 41 54 45 20  g..# The UPDATE 
bde0: 73 74 61 74 65 6d 65 6e 74 20 61 74 20 74 68 65  statement at the
bdf0: 20 65 6e 64 20 6f 66 20 74 68 69 73 20 74 65 73   end of this tes
be00: 74 20 63 61 73 65 20 63 72 65 61 74 65 73 20 61  t case creates a
be10: 20 72 65 61 6c 6c 79 20 62 69 67 0a 23 20 6a 6f   really big.# jo
be20: 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 74 68 65  urnal. Since the
be30: 20 63 61 63 68 65 2d 73 69 7a 65 20 69 73 20 6f   cache-size is o
be40: 6e 6c 79 20 31 30 20 70 61 67 65 73 2c 20 74 68  nly 10 pages, th
be50: 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
be60: 6e 73 20 0a 23 20 66 72 65 71 75 65 6e 74 20 6a  ns .# frequent j
be70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 0a  ournal headers..
be80: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
be90: 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 31 20  t pager1-13.1.1 
bea0: 7b 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f  {.  PRAGMA page_
beb0: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 50  size = 1024;.  P
bec0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
bed0: 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
bee0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
bef0: 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b  e = 10;.  BEGIN;
bf00: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
bf10: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a INTEGER P
bf20: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 42 4c  RIMARY KEY, b BL
bf30: 4f 42 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  OB);.    INSERT 
bf40: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e  INTO t1 VALUES(N
bf50: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  ULL, a_string(40
bf60: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
bf70: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e  INTO t1 SELECT N
bf80: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  ULL, a_string(40
bf90: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
bfa0: 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a 20       /*   2 */. 
bfb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
bfc0: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  1 SELECT NULL, a
bfd0: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
bfe0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f  M t1;          /
bff0: 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e 53  *   4 */.    INS
c000: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
c010: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
c020: 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(400) FROM t1; 
c030: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38 20           /*   8 
c040: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
c050: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
c060: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  L, a_string(400)
c070: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
c080: 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20 20     /*  16 */.   
c090: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
c0a0: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
c0b0: 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20  tring(400) FROM 
c0c0: 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t1;          /* 
c0d0: 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52   32 */.    INSER
c0e0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
c0f0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
c100: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  400) FROM t1;   
c110: 20 20 20 20 20 20 20 2f 2a 20 20 36 34 20 2a 2f         /*  64 */
c120: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
c130: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
c140: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
c150: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
c160: 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 43 4f 4d   /* 128 */.  COM
c170: 4d 49 54 3b 0a 20 20 55 50 44 41 54 45 20 74 31  MIT;.  UPDATE t1
c180: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
c190: 67 28 34 30 30 29 3b 0a 7d 20 7b 70 65 72 73 69  g(400);.} {persi
c1a0: 73 74 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f  st}..if {$::tcl_
c1b0: 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72  platform(platfor
c1c0: 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b  m)!="windows"} {
c1d0: 0a 23 20 52 75 6e 20 74 72 61 6e 73 61 63 74 69  .# Run transacti
c1e0: 6f 6e 73 20 6f 66 20 69 6e 63 72 65 61 73 69 6e  ons of increasin
c1f0: 67 20 73 69 7a 65 73 2e 20 45 76 65 6e 74 75 61  g sizes. Eventua
c200: 6c 6c 79 2c 20 6f 6e 65 20 28 6f 72 20 6d 6f 72  lly, one (or mor
c210: 65 20 74 68 61 6e 20 6f 6e 65 29 0a 23 20 6f 66  e than one).# of
c220: 20 74 68 65 73 65 20 77 69 6c 6c 20 77 72 69 74   these will writ
c230: 65 20 6a 75 73 74 20 65 6e 6f 75 67 68 20 63 6f  e just enough co
c240: 6e 74 65 6e 74 20 74 68 61 74 20 6f 6e 65 20 6f  ntent that one o
c250: 66 20 74 68 65 20 6f 6c 64 20 68 65 61 64 65 72  f the old header
c260: 73 20 63 72 65 61 74 65 64 20 0a 23 20 62 79 20  s created .# by 
c270: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
c280: 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  in the block abo
c290: 76 65 20 6c 69 65 73 20 69 6d 6d 65 64 69 61 74  ve lies immediat
c2a0: 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 63 6f  ely after the co
c2b0: 6e 74 65 6e 74 0a 23 20 6a 6f 75 72 6e 61 6c 6c  ntent.# journall
c2c0: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
c2d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23  t transaction..#
c2e0: 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31 7d  .for {set nUp 1}
c2f0: 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72   {$nUp<64} {incr
c300: 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65   nUp} {.  do_exe
c310: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c320: 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 31 20 7b  -13.1.2.$nUp.1 {
c330: 20 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20   .    UPDATE t1 
c340: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
c350: 28 33 39 39 29 20 57 48 45 52 45 20 61 20 3c 3d  (399) WHERE a <=
c360: 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64   $nUp.  } {}.  d
c370: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
c380: 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55  ager1-13.1.2.$nU
c390: 70 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e 74  p.2 { PRAGMA int
c3a0: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b  egrity_check } {
c3b0: 6f 6b 7d 20 0a 0a 20 20 23 20 54 72 79 20 74 6f  ok} ..  # Try to
c3c0: 20 61 63 63 65 73 73 20 74 68 65 20 73 6e 61 70   access the snap
c3d0: 73 68 6f 74 20 6f 66 20 74 68 65 20 66 69 6c 65  shot of the file
c3e0: 2d 73 79 73 74 65 6d 2e 0a 20 20 23 0a 20 20 73  -system..  #.  s
c3f0: 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74 65  qlite3 db2 sv_te
c400: 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74 20  st.db.  do_test 
c410: 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e  pager1-13.1.2.$n
c420: 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  Up.3 {.    execs
c430: 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28  ql { SELECT sum(
c440: 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d 20  length(b)) FROM 
c450: 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78  t1 } db2.  } [ex
c460: 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28 24  pr {128*400 - ($
c470: 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65  nUp-1)}].  do_te
c480: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32  st pager1-13.1.2
c490: 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65 78  .$nUp.4 {.    ex
c4a0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69  ecsql { PRAGMA i
c4b0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
c4c0: 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20   db2.  } {ok}.  
c4d0: 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a 69  db2 close.}.}..i
c4e0: 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  f {$::tcl_platfo
c4f0: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77  rm(platform)!="w
c500: 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 53 61 6d  indows"} {.# Sam
c510: 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2e  e test as above.
c520: 20 42 75 74 20 74 68 69 73 20 74 69 6d 65 20 77   But this time w
c530: 69 74 68 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20  ith an index on 
c540: 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f  the table..#.do_
c550: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c560: 65 72 31 2d 31 33 2e 32 2e 31 20 7b 0a 20 20 43  er1-13.2.1 {.  C
c570: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
c580: 4e 20 74 31 28 62 29 3b 0a 20 20 55 50 44 41 54  N t1(b);.  UPDAT
c590: 45 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73  E t1 SET b = a_s
c5a0: 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 7d  tring(400);.} {}
c5b0: 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31 7d  .for {set nUp 1}
c5c0: 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72   {$nUp<64} {incr
c5d0: 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65   nUp} {.  do_exe
c5e0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c5f0: 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 31 20 7b  -13.2.2.$nUp.1 {
c600: 20 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20   .    UPDATE t1 
c610: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
c620: 28 33 39 39 29 20 57 48 45 52 45 20 61 20 3c 3d  (399) WHERE a <=
c630: 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64   $nUp.  } {}.  d
c640: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
c650: 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55  ager1-13.2.2.$nU
c660: 70 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e 74  p.2 { PRAGMA int
c670: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b  egrity_check } {
c680: 6f 6b 7d 20 0a 20 20 73 71 6c 69 74 65 33 20 64  ok} .  sqlite3 d
c690: 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20 20  b2 sv_test.db.  
c6a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
c6b0: 33 2e 32 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20  3.2.2.$nUp.3 {. 
c6c0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
c6d0: 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 62  ECT sum(length(b
c6e0: 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32  )) FROM t1 } db2
c6f0: 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a  .  } [expr {128*
c700: 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d  400 - ($nUp-1)}]
c710: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
c720: 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 34 20  1-13.2.2.$nUp.4 
c730: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
c740: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
c750: 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d  _check } db2.  }
c760: 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73   {ok}.  db2 clos
c770: 65 0a 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a  e.}.}..db close.
c780: 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d  tv delete..#----
c790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20 73 70 65  -----.# Test spe
c7e0: 63 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  cal "PRAGMA jour
c7f0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 20 74 65  nal_mode=OFF" te
c800: 73 74 20 63 61 73 65 73 2e 0a 23 0a 66 61 75 6c  st cases..#.faul
c810: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
c820: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
c830: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34  l_test pager1-14
c840: 2e 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20  .1.1 {.  PRAGMA 
c850: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 4f  journal_mode = O
c860: 46 46 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  FF;.  CREATE TAB
c870: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 42  LE t1(a, b);.  B
c880: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
c890: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
c8a0: 31 2c 20 32 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b  1, 2);.  COMMIT;
c8b0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
c8c0: 20 74 31 3b 0a 7d 20 7b 6f 66 66 20 31 20 32 7d   t1;.} {off 1 2}
c8d0: 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73  .do_catchsql_tes
c8e0: 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 32 20  t pager1-14.1.2 
c8f0: 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49  {.  BEGIN;.    I
c900: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
c910: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 52 4f  LUES(3, 4);.  RO
c920: 4c 4c 42 41 43 4b 3b 0a 7d 20 7b 30 20 7b 7d 7d  LLBACK;.} {0 {}}
c930: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
c940: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 33 20 7b   pager1-14.1.3 {
c950: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
c960: 20 74 31 3b 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f   t1;.} {1 2}.do_
c970: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61  catchsql_test pa
c980: 67 65 72 31 2d 31 34 2e 31 2e 34 20 7b 0a 20 20  ger1-14.1.4 {.  
c990: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
c9a0: 54 20 49 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c  T INTO t1(rowid,
c9b0: 20 61 2c 20 62 29 20 53 45 4c 45 43 54 20 61 2b   a, b) SELECT a+
c9c0: 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b  3, b, b FROM t1;
c9d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
c9e0: 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29   t1(rowid, a, b)
c9f0: 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20   SELECT a+3, b, 
ca00: 62 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20  b FROM t1;.} {1 
ca10: 7b 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73  {PRIMARY KEY mus
ca20: 74 20 62 65 20 75 6e 69 71 75 65 7d 7d 0a 64 6f  t be unique}}.do
ca30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
ca40: 67 65 72 31 2d 31 34 2e 31 2e 35 20 7b 0a 20 20  ger1-14.1.5 {.  
ca50: 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54  COMMIT;.  SELECT
ca60: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31   * FROM t1;.} {1
ca70: 20 32 20 32 20 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   2 2 2}..#------
ca80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cac0: 2d 2d 2d 0a 23 20 54 65 73 74 20 6f 70 65 6e 69  ---.# Test openi
cad0: 6e 67 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  ng and closing t
cae0: 68 65 20 70 61 67 65 72 20 73 75 62 2d 73 79 73  he pager sub-sys
caf0: 74 65 6d 20 77 69 74 68 20 64 69 66 66 65 72 65  tem with differe
cb00: 6e 74 20 76 61 6c 75 65 73 0a 23 20 66 6f 72 20  nt values.# for 
cb10: 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
cb20: 73 7a 4f 73 46 69 6c 65 20 76 61 72 69 61 62 6c  szOsFile variabl
cb30: 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65  e..#.faultsim_de
cb40: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
cb50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
cb60: 70 61 67 65 72 31 2d 31 35 2e 30 20 7b 0a 20 20  pager1-15.0 {.  
cb70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 78 28  CREATE TABLE tx(
cb80: 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45 52 54 20  y, z);.  INSERT 
cb90: 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28 27  INTO tx VALUES('
cba0: 41 79 75 74 74 68 61 79 61 27 2c 20 27 42 65 69  Ayutthaya', 'Bei
cbb0: 6a 69 6e 67 27 29 3b 0a 20 20 49 4e 53 45 52 54  jing');.  INSERT
cbc0: 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28   INTO tx VALUES(
cbd0: 27 4c 6f 6e 64 6f 6e 27 2c 20 27 54 6f 6b 79 6f  'London', 'Tokyo
cbe0: 27 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73  ');.} {}.db clos
cbf0: 65 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20  e.for {set i 0} 
cc00: 7b 24 69 3c 35 31 33 7d 20 7b 69 6e 63 72 20 69  {$i<513} {incr i
cc10: 20 33 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 20   3} {.  testvfs 
cc20: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 73  tv -default 1 -s
cc30: 7a 6f 73 66 69 6c 65 20 24 69 0a 20 20 73 71 6c  zosfile $i.  sql
cc40: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
cc50: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
cc60: 74 20 70 61 67 65 72 31 2d 31 35 2e 24 69 2e 31  t pager1-15.$i.1
cc70: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
cc80: 46 52 4f 4d 20 74 78 3b 0a 20 20 7d 20 7b 41 79  FROM tx;.  } {Ay
cc90: 75 74 74 68 61 79 61 20 42 65 69 6a 69 6e 67 20  utthaya Beijing 
cca0: 4c 6f 6e 64 6f 6e 20 54 6f 6b 79 6f 7d 0a 20 20  London Tokyo}.  
ccb0: 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65  db close.  tv de
ccc0: 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lete.}..#-------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20  --.# Check that 
cd20: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
cd30: 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 64 61 74  le to open a dat
cd40: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 74 68  abase file if th
cd50: 65 20 66 75 6c 6c 20 70 61 74 68 0a 23 20 74 6f  e full path.# to
cd60: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
cd70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
cd80: 6c 20 62 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l be longer than
cd90: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
cda0: 61 74 68 6e 61 6d 65 2e 0a 23 0a 74 65 73 74 76  athname..#.testv
cdb0: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
cdc0: 0a 74 76 20 73 63 72 69 70 74 20 78 4f 70 65 6e  .tv script xOpen
cdd0: 43 62 0a 74 76 20 66 69 6c 74 65 72 20 78 4f 70  Cb.tv filter xOp
cde0: 65 6e 0a 70 72 6f 63 20 78 4f 70 65 6e 43 62 20  en.proc xOpenCb 
cdf0: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65  {method filename
ce00: 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 3a   args} {.  set :
ce10: 3a 66 69 6c 65 5f 6c 65 6e 20 5b 73 74 72 69 6e  :file_len [strin
ce20: 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61  g length $filena
ce30: 6d 65 5d 0a 7d 0a 73 71 6c 69 74 65 33 20 64 62  me].}.sqlite3 db
ce40: 20 74 65 73 74 2e 64 62 0a 64 62 20 63 6c 6f 73   test.db.db clos
ce50: 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 66 6f 72  e.tv delete..for
ce60: 20 7b 73 65 74 20 69 69 20 5b 65 78 70 72 20 24   {set ii [expr $
ce70: 3a 3a 66 69 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b  ::file_len-5]} {
ce80: 24 69 69 20 3c 20 5b 65 78 70 72 20 24 3a 3a 66  $ii < [expr $::f
ce90: 69 6c 65 5f 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e  ile_len+20]} {in
cea0: 63 72 20 69 69 7d 20 7b 0a 20 20 74 65 73 74 76  cr ii} {.  testv
ceb0: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
cec0: 20 2d 6d 78 70 61 74 68 6e 61 6d 65 20 24 69 69   -mxpathname $ii
ced0: 0a 0a 20 20 23 20 54 68 65 20 6c 65 6e 67 74 68  ..  # The length
cee0: 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 70 61 74   of the full pat
cef0: 68 20 74 6f 20 66 69 6c 65 20 22 74 65 73 74 2e  h to file "test.
cf00: 64 62 2d 6a 6f 75 72 6e 61 6c 22 20 69 73 20 28  db-journal" is (
cf10: 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a  $::file_len+8)..
cf20: 20 20 23 20 49 66 20 74 68 65 20 63 6f 6e 66 69    # If the confi
cf30: 67 75 72 65 64 20 73 71 6c 69 74 65 33 5f 76 66  gured sqlite3_vf
cf40: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 76 61 6c  s.mxPathname val
cf50: 75 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ue greater than 
cf60: 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 23 20  or equal to.  # 
cf70: 74 68 69 73 2c 20 74 68 65 6e 20 74 68 65 20 66  this, then the f
cf80: 69 6c 65 20 63 61 6e 20 62 65 20 6f 70 65 6e 65  ile can be opene
cf90: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  d. Otherwise, it
cfa0: 20 63 61 6e 6e 6f 74 2e 0a 20 20 23 0a 20 20 69   cannot..  #.  i
cfb0: 66 20 7b 24 69 69 20 3e 3d 20 5b 65 78 70 72 20  f {$ii >= [expr 
cfc0: 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20  $::file_len+8]} 
cfd0: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 30  {.    set res {0
cfe0: 20 7b 7d 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   {}}.  } else {.
cff0: 20 20 20 20 73 65 74 20 72 65 73 20 7b 31 20 7b      set res {1 {
d000: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
d010: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20  atabase file}}. 
d020: 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   }..  do_test pa
d030: 67 65 72 31 2d 31 36 2e 31 2e 24 69 69 20 7b 0a  ger1-16.1.$ii {.
d040: 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20      list [catch 
d050: 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  { sqlite3 db tes
d060: 74 2e 64 62 20 7d 20 6d 73 67 5d 20 24 6d 73 67  t.db } msg] $msg
d070: 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20 63 61 74  .  } $res..  cat
d080: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20  ch {db close}.  
d090: 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 0a 23 2d  tv delete.}...#-
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
d0f0: 74 68 65 20 70 61 67 65 72 73 20 72 65 73 70 6f  the pagers respo
d100: 6e 73 65 20 74 6f 20 74 68 65 20 62 2d 74 72 65  nse to the b-tre
d110: 65 20 6c 61 79 65 72 20 72 65 71 75 65 73 74 69  e layer requesti
d120: 6e 67 20 69 6c 6c 65 67 61 6c 20 70 61 67 65 20  ng illegal page 
d130: 0a 23 20 6e 75 6d 62 65 72 73 3a 0a 23 0a 23 20  .# numbers:.#.# 
d140: 20 20 2b 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20    + The locking 
d150: 70 61 67 65 2c 0a 23 20 20 20 2b 20 50 61 67 65  page,.#   + Page
d160: 20 30 2c 0a 23 20 20 20 2b 20 41 20 70 61 67 65   0,.#   + A page
d170: 20 77 69 74 68 20 61 20 70 61 67 65 20 6e 75 6d   with a page num
d180: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
d190: 20 28 32 5e 33 31 2d 31 29 2e 0a 23 0a 23 20 54   (2^31-1)..#.# T
d1a0: 68 65 73 65 20 74 65 73 74 73 20 77 69 6c 6c 20  hese tests will 
d1b0: 6e 6f 74 20 77 6f 72 6b 20 69 66 20 53 51 4c 49  not work if SQLI
d1c0: 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
d1d0: 4f 57 5f 52 45 41 44 20 69 73 20 64 65 66 69 6e  OW_READ is defin
d1e0: 65 64 2e 20 49 6e 0a 23 20 74 68 61 74 20 63 61  ed. In.# that ca
d1f0: 73 65 20 49 4f 20 65 72 72 6f 72 73 20 61 72 65  se IO errors are
d200: 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 70 6f 72   sometimes repor
d210: 74 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 53  ted instead of S
d220: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 23  QLITE_CORRUPT..#
d230: 0a 69 66 63 61 70 61 62 6c 65 20 21 64 69 72 65  .ifcapable !dire
d240: 63 74 5f 72 65 61 64 20 7b 0a 64 6f 5f 74 65 73  ct_read {.do_tes
d250: 74 20 70 61 67 65 72 31 2d 31 38 2e 31 20 7b 0a  t pager1-18.1 {.
d260: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
d270: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
d280: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
d290: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
d2a0: 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41  ql { .    PRAGMA
d2b0: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
d2c0: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
d2d0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
d2e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d2f0: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
d300: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d310: 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  200));.    INSER
d320: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d330: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d340: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d350: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d360: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d370: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d380: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d390: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d3a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d3b0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d3c0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d3d0: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d3e0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d3f0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d400: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d410: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d420: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d430: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d440: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d450: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d460: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d470: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d480: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d490: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d4a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d4b0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d4c0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d4d0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM t1;.  }.} {}.
d4e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d4f0: 38 2e 32 20 7b 0a 20 20 73 65 74 20 72 6f 6f 74  8.2 {.  set root
d500: 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54   [db one "SELECT
d510: 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73   rootpage FROM s
d520: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20  qlite_master"]. 
d530: 20 73 65 74 20 6c 6f 63 6b 69 6e 67 70 61 67 65   set lockingpage
d540: 20 5b 65 78 70 72 20 28 30 78 31 30 30 30 30 2f   [expr (0x10000/
d550: 31 30 32 34 29 20 2b 20 31 5d 0a 20 20 65 78 65  1024) + 1].  exe
d560: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
d570: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
d580: 61 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54  a = 1;.    UPDAT
d590: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  E sqlite_master 
d5a0: 53 45 54 20 72 6f 6f 74 70 61 67 65 20 3d 20 24  SET rootpage = $
d5b0: 6c 6f 63 6b 69 6e 67 70 61 67 65 3b 0a 20 20 7d  lockingpage;.  }
d5c0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
d5d0: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
d5e0: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
d5f0: 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  (*) FROM t1 } db
d600: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
d610: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
d620: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63  alformed}}.db2 c
d630: 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67  lose.do_test pag
d640: 65 72 31 2d 31 38 2e 33 2e 31 20 7b 0a 20 20 65  er1-18.3.1 {.  e
d650: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
d660: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b  ATE TABLE t2(x);
d670: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d680: 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t2 VALUES(a_str
d690: 69 6e 67 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a  ing(5000));.  }.
d6a0: 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78 70 72    set pgno [expr
d6b0: 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73   ([file size tes
d6c0: 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d  t.db] / 1024)-2]
d6d0: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
d6e0: 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70  est.db [expr ($p
d6f0: 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30 30  gno-1)*1024] 000
d700: 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
d710: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 23 20  db2 test.db.  # 
d720: 65 76 65 6e 20 74 68 6f 75 67 68 20 78 20 69 73  even though x is
d730: 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 62 65 63 61   malformed, beca
d740: 75 73 65 20 74 79 70 65 6f 66 28 29 20 64 6f 65  use typeof() doe
d750: 73 0a 20 20 23 20 6e 6f 74 20 6c 6f 61 64 20 74  s.  # not load t
d760: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 78 2c  he content of x,
d770: 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f   the error is no
d780: 74 20 6e 6f 74 69 63 65 64 2e 0a 20 20 63 61 74  t noticed..  cat
d790: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 74  chsql { SELECT t
d7a0: 79 70 65 6f 66 28 78 29 20 46 52 4f 4d 20 74 32  ypeof(x) FROM t2
d7b0: 20 7d 20 64 62 32 0a 7d 20 7b 30 20 74 65 78 74   } db2.} {0 text
d7c0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
d7d0: 2d 31 38 2e 33 2e 32 20 7b 0a 20 20 23 20 69 6e  -18.3.2 {.  # in
d7e0: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
d7f0: 76 61 6c 75 65 20 6f 66 20 78 20 69 73 20 6c 6f  value of x is lo
d800: 61 64 65 64 20 61 6e 64 20 73 6f 20 74 68 65 20  aded and so the 
d810: 65 72 72 6f 72 20 69 73 0a 20 20 23 20 64 65 74  error is.  # det
d820: 65 63 74 65 64 0a 20 20 63 61 74 63 68 73 71 6c  ected.  catchsql
d830: 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68   { SELECT length
d840: 28 78 7c 7c 27 27 29 20 46 52 4f 4d 20 74 32 20  (x||'') FROM t2 
d850: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
d860: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
d870: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64  is malformed}}.d
d880: 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  b2 close.do_test
d890: 20 70 61 67 65 72 31 2d 31 38 2e 33 2e 33 20 7b   pager1-18.3.3 {
d8a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
d8b0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b   DELETE FROM t2;
d8c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d8d0: 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t2 VALUES(rando
d8e0: 6d 62 6c 6f 62 28 35 30 30 30 29 29 3b 0a 20 20  mblob(5000));.  
d8f0: 7d 0a 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78  }.  set pgno [ex
d900: 70 72 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74  pr ([file size t
d910: 65 73 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d  est.db] / 1024)-
d920: 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  2].  hexio_write
d930: 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28   test.db [expr (
d940: 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30  $pgno-1)*1024] 0
d950: 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65  0000000.  sqlite
d960: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
d970: 23 20 65 76 65 6e 20 74 68 6f 75 67 68 20 78 20  # even though x 
d980: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 62 65  is malformed, be
d990: 63 61 75 73 65 20 6c 65 6e 67 74 68 28 29 20 61  cause length() a
d9a0: 6e 64 20 74 79 70 65 6f 66 28 29 20 64 6f 0a 20  nd typeof() do. 
d9b0: 20 23 20 6e 6f 74 20 6c 6f 61 64 20 74 68 65 20   # not load the 
d9c0: 63 6f 6e 74 65 6e 74 20 6f 66 20 78 2c 20 74 68  content of x, th
d9d0: 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 6e  e error is not n
d9e0: 6f 74 69 63 65 64 2e 0a 20 20 63 61 74 63 68 73  oticed..  catchs
d9f0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67  ql { SELECT leng
da00: 74 68 28 78 29 2c 20 74 79 70 65 6f 66 28 78 29  th(x), typeof(x)
da10: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
da20: 20 7b 30 20 7b 35 30 30 30 20 62 6c 6f 62 7d 7d   {0 {5000 blob}}
da30: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
da40: 31 38 2e 33 2e 34 20 7b 0a 20 20 23 20 69 6e 20  18.3.4 {.  # in 
da50: 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 76  this case, the v
da60: 61 6c 75 65 20 6f 66 20 78 20 69 73 20 6c 6f 61  alue of x is loa
da70: 64 65 64 20 61 6e 64 20 73 6f 20 74 68 65 20 65  ded and so the e
da80: 72 72 6f 72 20 69 73 0a 20 20 23 20 64 65 74 65  rror is.  # dete
da90: 63 74 65 64 0a 20 20 63 61 74 63 68 73 71 6c 20  cted.  catchsql 
daa0: 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28  { SELECT length(
dab0: 78 7c 7c 27 27 29 20 46 52 4f 4d 20 74 32 20 7d  x||'') FROM t2 }
dac0: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
dad0: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
dae0: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
daf0: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
db00: 70 61 67 65 72 31 2d 31 38 2e 34 20 7b 0a 20 20  pager1-18.4 {.  
db10: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
db20: 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f  .db [expr ($pgno
db30: 2d 31 29 2a 31 30 32 34 5d 20 39 30 30 30 30 30  -1)*1024] 900000
db40: 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  00.  sqlite3 db2
db50: 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68   test.db.  catch
db60: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e  sql { SELECT len
db70: 67 74 68 28 78 7c 7c 27 27 29 20 46 52 4f 4d 20  gth(x||'') FROM 
db80: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t2 } db2.} {1 {d
db90: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
dba0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
dbb0: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
dbc0: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 35 20  est pager1-18.5 
dbd0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22  {.  sqlite3 db "
dbe0: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
dbf0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
dc00: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
dc10: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
dc20: 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  b);.    PRAGMA w
dc30: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
dc40: 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73   1;.    UPDATE s
dc50: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54  qlite_master SET
dc60: 20 72 6f 6f 74 70 61 67 65 3d 35 20 57 48 45 52   rootpage=5 WHER
dc70: 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74 31  E tbl_name = 't1
dc80: 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72  ';.    PRAGMA wr
dc90: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
dca0: 30 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42  0;.    ALTER TAB
dcb0: 4c 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20  LE t1 RENAME TO 
dcc0: 78 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73  x1;.  }.  catchs
dcd0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
dce0: 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31 20 7b 64 61  OM x1 }.} {1 {da
dcf0: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
dd00: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
dd10: 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65  .db close..do_te
dd20: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 36 20 7b  st pager1-18.6 {
dd30: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
dd40: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
dd50: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
dd60: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
dd70: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
dd80: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
dd90: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
dda0: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49  BLE t1(x);.    I
ddb0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
ddc0: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30  LUES(a_string(80
ddd0: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
dde0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
ddf0: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
de00: 20 7d 0a 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b   }..  set root [
de10: 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72  db one "SELECT r
de20: 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c  ootpage FROM sql
de30: 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 64  ite_master"].  d
de40: 62 20 63 6c 6f 73 65 0a 0a 20 20 68 65 78 69 6f  b close..  hexio
de50: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b  _write test.db [
de60: 65 78 70 72 20 28 24 72 6f 6f 74 2d 31 29 2a 31  expr ($root-1)*1
de70: 30 32 34 20 2b 20 38 5d 20 30 30 30 30 30 30 30  024 + 8] 0000000
de80: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  0.  sqlite3 db t
de90: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
dea0: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
deb0: 68 28 78 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  h(x) FROM t1 }.}
dec0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
ded0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
dee0: 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65  ormed}}.}..do_te
def0: 73 74 20 70 61 67 65 72 31 2d 31 39 2e 31 20 7b  st pager1-19.1 {
df00: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22 22  .  sqlite3 db ""
df10: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
df20: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65  ing a_string.  e
df30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
df40: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
df50: 35 31 32 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  512;.    PRAGMA 
df60: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b  auto_vacuum = 1;
df70: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
df80: 45 20 74 31 28 61 61 2c 20 61 62 2c 20 61 63 2c  E t1(aa, ab, ac,
df90: 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c   ad, ae, af, ag,
dfa0: 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c   ah, ai, aj, ak,
dfb0: 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20   al, am, an,.   
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c   ba, bb, bc, bd,
dfe0: 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c   be, bf, bg, bh,
dff0: 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c   bi, bj, bk, bl,
e000: 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20   bm, bn,.       
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 2c               ca,
e020: 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c   cb, cc, cd, ce,
e030: 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c   cf, cg, ch, ci,
e040: 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c   cj, ck, cl, cm,
e050: 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   cn,.           
e060: 20 20 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c           da, db,
e070: 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c   dc, dd, de, df,
e080: 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c   dg, dh, di, dj,
e090: 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c   dk, dl, dm, dn,
e0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e0b0: 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c       ea, eb, ec,
e0c0: 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c   ed, ee, ef, eg,
e0d0: 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c   eh, ei, ej, ek,
e0e0: 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20   el, em, en,.   
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c   fa, fb, fc, fd,
e110: 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c   fe, ff, fg, fh,
e120: 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c   fi, fj, fk, fl,
e130: 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20   fm, fn,.       
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 61 2c               ga,
e150: 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c   gb, gc, gd, ge,
e160: 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c   gf, gg, gh, gi,
e170: 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c   gj, gk, gl, gm,
e180: 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   gn,.           
e190: 20 20 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c           ha, hb,
e1a0: 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c   hc, hd, he, hf,
e1b0: 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c   hg, hh, hi, hj,
e1c0: 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c   hk, hl, hm, hn,
e1d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e1e0: 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c       ia, ib, ic,
e1f0: 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c   id, ie, if, ig,
e200: 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c   ih, ii, ij, ik,
e210: 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20   il, im, ix,.   
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c   ja, jb, jc, jd,
e240: 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c   je, jf, jg, jh,
e250: 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c   ji, jj, jk, jl,
e260: 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20   jm, jn,.       
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c               ka,
e280: 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c   kb, kc, kd, ke,
e290: 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c   kf, kg, kh, ki,
e2a0: 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c   kj, kk, kl, km,
e2b0: 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   kn,.           
e2c0: 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c           la, lb,
e2d0: 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c   lc, ld, le, lf,
e2e0: 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c   lg, lh, li, lj,
e2f0: 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c   lk, ll, lm, ln,
e300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e310: 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c       ma, mb, mc,
e320: 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c   md, me, mf, mg,
e330: 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c   mh, mi, mj, mk,
e340: 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20   ml, mm, mn.    
e350: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
e360: 42 4c 45 20 74 32 28 61 61 2c 20 61 62 2c 20 61  BLE t2(aa, ab, a
e370: 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61  c, ad, ae, af, a
e380: 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61  g, ah, ai, aj, a
e390: 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20  k, al, am, an,. 
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62     ba, bb, bc, b
e3c0: 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62  d, be, bf, bg, b
e3d0: 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62  h, bi, bj, bk, b
e3e0: 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20  l, bm, bn,.     
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
e400: 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63  a, cb, cc, cd, c
e410: 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63  e, cf, cg, ch, c
e420: 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63  i, cj, ck, cl, c
e430: 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, cn,.         
e440: 20 20 20 20 20 20 20 20 20 20 20 64 61 2c 20 64             da, d
e450: 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64  b, dc, dd, de, d
e460: 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64  f, dg, dh, di, d
e470: 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64  j, dk, dl, dm, d
e480: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e490: 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65         ea, eb, e
e4a0: 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65  c, ed, ee, ef, e
e4b0: 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65  g, eh, ei, ej, e
e4c0: 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20  k, el, em, en,. 
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66     fa, fb, fc, f
e4f0: 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66  d, fe, ff, fg, f
e500: 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66  h, fi, fj, fk, f
e510: 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20  l, fm, fn,.     
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
e530: 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67  a, gb, gc, gd, g
e540: 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67  e, gf, gg, gh, g
e550: 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67  i, gj, gk, gl, g
e560: 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, gn,.         
e570: 20 20 20 20 20 20 20 20 20 20 20 68 61 2c 20 68             ha, h
e580: 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68  b, hc, hd, he, h
e590: 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68  f, hg, hh, hi, h
e5a0: 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68  j, hk, hl, hm, h
e5b0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e5c0: 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69         ia, ib, i
e5d0: 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69  c, id, ie, if, i
e5e0: 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69  g, ih, ii, ij, i
e5f0: 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20  k, il, im, ix,. 
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a     ja, jb, jc, j
e620: 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a  d, je, jf, jg, j
e630: 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a  h, ji, jj, jk, j
e640: 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20  l, jm, jn,.     
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
e660: 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b  a, kb, kc, kd, k
e670: 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b  e, kf, kg, kh, k
e680: 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b  i, kj, kk, kl, k
e690: 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, kn,.         
e6a0: 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c             la, l
e6b0: 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c  b, lc, ld, le, l
e6c0: 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c  f, lg, lh, li, l
e6d0: 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c  j, lk, ll, lm, l
e6e0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e6f0: 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d         ma, mb, m
e700: 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d  c, md, me, mf, m
e710: 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d  g, mh, mi, mj, m
e720: 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20  k, ml, mm, mn.  
e730: 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20    );.    INSERT 
e740: 49 4e 54 4f 20 74 31 28 61 61 29 20 56 41 4c 55  INTO t1(aa) VALU
e750: 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30 30  ES( a_string(100
e760: 30 30 30 29 20 29 3b 0a 20 20 20 20 49 4e 53 45  000) );.    INSE
e770: 52 54 20 49 4e 54 4f 20 74 32 28 61 61 29 20 56  RT INTO t2(aa) V
e780: 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28  ALUES( a_string(
e790: 31 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20 56  100000) );.    V
e7a0: 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  ACUUM;.  }.} {}.
e7b0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
e7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
e800: 73 74 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 73  st a couple of s
e810: 70 65 63 69 61 6c 20 63 61 73 65 73 20 74 68 61  pecial cases tha
e820: 74 20 63 6f 6d 65 20 75 70 20 77 68 69 6c 65 20  t come up while 
e830: 63 6f 6d 6d 69 74 74 69 6e 67 20 0a 23 20 74 72  committing .# tr
e840: 61 6e 73 61 63 74 69 6f 6e 73 3a 0a 23 0a 23 20  ansactions:.#.# 
e850: 20 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 2a 3a    pager1-20.1.*:
e860: 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 20 69   Committing an i
e870: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
e880: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68  e transaction wh
e890: 65 6e 20 74 68 65 20 0a 23 20 20 20 20 20 20 20  en the .#       
e8a0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
e8b0: 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ase has not been
e8c0: 20 6d 6f 64 69 66 69 65 64 20 61 74 20 61 6c 6c   modified at all
e8d0: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
e8e0: 30 2e 32 2e 2a 3a 20 41 73 20 61 62 6f 76 65 2c  0.2.*: As above,
e8f0: 20 62 75 74 20 77 69 74 68 20 61 20 6e 6f 72 6d   but with a norm
e900: 61 6c 20 64 62 20 69 6e 20 65 78 63 6c 75 73 69  al db in exclusi
e910: 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e  ve-locking mode.
e920: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30  .#.#   pager1-20
e930: 2e 33 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67  .3.*: Committing
e940: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
e950: 6e 20 57 41 4c 20 6d 6f 64 65 20 77 68 65 72 65  n WAL mode where
e960: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
e970: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
e980: 20 20 20 20 20 62 65 65 6e 20 6d 6f 64 69 66 69       been modifi
e990: 65 64 2c 20 62 75 74 20 61 6c 6c 20 64 69 72 74  ed, but all dirt
e9a0: 79 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  y pages have bee
e9b0: 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 0a 23 20  n flushed to .# 
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 20 64 69 73 6b 20 62 65 66 6f 72 65 20 74 68 65   disk before the
e9e0: 20 63 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74 65   commit..#.do_te
e9f0: 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 31  st pager1-20.1.1
ea00: 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63   {.  catch {db c
ea10: 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65 33 20  lose}.  sqlite3 
ea20: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78  db :memory:.  ex
ea30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
ea40: 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f  TE TABLE one(two
ea50: 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e  , three);.    IN
ea60: 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41  SERT INTO one VA
ea70: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
ea80: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
ea90: 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 32 20 7b   pager1-20.1.2 {
eaa0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
eab0: 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45   BEGIN EXCLUSIVE
eac0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
ead0: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
eae0: 70 61 67 65 72 31 2d 32 30 2e 32 2e 31 20 7b 0a  pager1-20.2.1 {.
eaf0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
eb00: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
eb10: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
eb20: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
eb30: 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20   = exclusive;.  
eb40: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
eb50: 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b  _mode = persist;
eb60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
eb70: 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65  E one(two, three
eb80: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
eb90: 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61  TO one VALUES('a
eba0: 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b  ', 'b');.  }.} {
ebb0: 65 78 63 6c 75 73 69 76 65 20 70 65 72 73 69 73  exclusive persis
ebc0: 74 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  t}.do_test pager
ebd0: 31 2d 32 30 2e 32 2e 32 20 7b 0a 20 20 65 78 65  1-20.2.2 {.  exe
ebe0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
ebf0: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20   EXCLUSIVE;.    
ec00: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
ec10: 0a 0a 69 66 20 7b 24 3a 3a 73 71 6c 69 74 65 5f  ..if {$::sqlite_
ec20: 6f 70 74 69 6f 6e 73 28 77 61 6c 29 20 26 26 20  options(wal) && 
ec30: 5b 77 61 6c 5f 69 73 5f 6f 6b 5d 7d 20 7b 0a 20  [wal_is_ok]} {. 
ec40: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
ec50: 32 30 2e 33 2e 31 20 7b 0a 20 20 20 20 66 61 75  20.3.1 {.    fau
ec60: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
ec70: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66  _reopen.    db f
ec80: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
ec90: 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71  tring.    execsq
eca0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
ecb0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
ecc0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
ecd0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61  ournal_mode = wa
ece0: 6c 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  l;.      BEGIN;.
ecf0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
ed00: 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
ed10: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
ed20: 20 74 32 28 79 29 3b 0a 20 20 20 20 20 20 20 20   t2(y);.        
ed30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
ed40: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38  ALUES(a_string(8
ed50: 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  00));.        IN
ed60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
ed70: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
ed80: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
ed90: 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a 20 20 20     /*   2 */.   
eda0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
edb0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
edc0: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
edd0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34  ;         /*   4
ede0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45   */.        INSE
edf0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
ee00: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  T a_string(800) 
ee10: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
ee20: 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20 20   /*   8 */.     
ee30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
ee40: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
ee50: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
ee60: 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36 20 2a          /*  16 *
ee70: 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  /.        INSERT
ee80: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
ee90: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
eea0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
eeb0: 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 20 20 43  *  32 */.      C
eec0: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  OMMIT;.    }.  }
eed0: 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74   {wal}.  do_test
eee0: 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 32 20 7b   pager1-20.3.2 {
eef0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
ef00: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
ef10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
ef20: 20 56 41 4c 55 45 53 28 27 78 78 78 78 27 29 3b   VALUES('xxxx');
ef30: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72  .    }.    recur
ef40: 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74  sive_select 32 t
ef50: 31 0a 20 20 20 20 65 78 65 63 73 71 6c 20 43 4f  1.    execsql CO
ef60: 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23  MMIT.  } {}.}..#
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
efc0: 20 74 68 61 74 20 61 20 57 41 4c 20 64 61 74 61   that a WAL data
efd0: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
efe0: 6f 70 65 6e 65 64 20 69 66 3a 0a 23 0a 23 20 20  opened if:.#.#  
eff0: 20 70 61 67 65 72 31 2d 32 31 2e 31 2e 2a 3a 20   pager1-21.1.*: 
f000: 54 68 65 20 56 46 53 20 68 61 73 20 61 6e 20 69  The VFS has an i
f010: 56 65 72 73 69 6f 6e 20 6c 65 73 73 20 74 68 61  Version less tha
f020: 6e 20 32 2c 20 6f 72 0a 23 20 20 20 70 61 67 65  n 2, or.#   page
f030: 72 31 2d 32 31 2e 32 2e 2a 3a 20 54 68 65 20 56  r1-21.2.*: The V
f040: 46 53 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76  FS does not prov
f050: 69 64 65 20 78 53 68 6d 58 58 58 28 29 20 6d 65  ide xShmXXX() me
f060: 74 68 6f 64 73 2e 0a 23 0a 69 66 20 7b 24 3a 3a  thods..#.if {$::
f070: 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 28 77  sqlite_options(w
f080: 61 6c 29 20 26 26 20 5b 77 61 6c 5f 69 73 5f 6f  al) && [wal_is_o
f090: 6b 5d 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  k]} {.  do_test 
f0a0: 70 61 67 65 72 31 2d 32 31 2e 30 20 7b 0a 20 20  pager1-21.0 {.  
f0b0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
f0c0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20  e_and_reopen.   
f0d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
f0e0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f0f0: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
f100: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b    CREATE TABLE k
f110: 6f 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63  o(c DEFAULT 'abc
f120: 27 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65  ', b DEFAULT 'de
f130: 66 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  f');.      INSER
f140: 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c  T INTO ko DEFAUL
f150: 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a  T VALUES;.    }.
f160: 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74    } {wal}.  do_t
f170: 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e 31 20  est pager1-21.1 
f180: 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76  {.    testvfs tv
f190: 20 2d 6e 6f 73 68 6d 20 31 0a 20 20 20 20 73 71   -noshm 1.    sq
f1a0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
f1b0: 62 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61  b -vfs tv.    ca
f1c0: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
f1d0: 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a  * FROM ko } db2.
f1e0: 20 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74    } {1 {unable t
f1f0: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
f200: 66 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f  file}}.  db2 clo
f210: 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 20  se.  tv delete. 
f220: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
f230: 32 31 2e 32 20 7b 0a 20 20 20 20 74 65 73 74 76  21.2 {.    testv
f240: 66 73 20 74 76 20 2d 69 76 65 72 73 69 6f 6e 20  fs tv -iversion 
f250: 31 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  1.    sqlite3 db
f260: 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74  2 test.db -vfs t
f270: 76 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  v.    catchsql {
f280: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b   SELECT * FROM k
f290: 6f 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b  o } db2.  } {1 {
f2a0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
f2b0: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20  atabase file}}. 
f2c0: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20   db2 close.  tv 
f2d0: 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  delete.}..#-----
f2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f320: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
f330: 20 61 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63   a "PRAGMA wal_c
f340: 68 65 63 6b 70 6f 69 6e 74 22 3a 0a 23 0a 23 20  heckpoint":.#.# 
f350: 20 20 70 61 67 65 72 31 2d 32 32 2e 31 2e 2a 3a    pager1-22.1.*:
f360: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61   is a no-op on a
f370: 20 6e 6f 6e 2d 57 41 4c 20 64 62 2c 20 61 6e 64   non-WAL db, and
f380: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32 2e 32  .#   pager1-22.2
f390: 2e 2a 3a 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  .*: does not cau
f3a0: 73 65 20 78 53 79 6e 63 20 63 61 6c 6c 73 20 77  se xSync calls w
f3b0: 69 74 68 20 61 20 73 79 6e 63 68 72 6f 6e 6f 75  ith a synchronou
f3c0: 73 3d 6f 66 66 20 64 62 2e 0a 23 0a 64 6f 5f 74  s=off db..#.do_t
f3d0: 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e 31 2e  est pager1-22.1.
f3e0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
f3f0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
f400: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f410: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f   CREATE TABLE ko
f420: 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27  (c DEFAULT 'abc'
f430: 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66  , b DEFAULT 'def
f440: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
f450: 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56  NTO ko DEFAULT V
f460: 41 4c 55 45 53 3b 0a 20 20 7d 0a 20 20 65 78 65  ALUES;.  }.  exe
f470: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
f480: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 7d  l_checkpoint }.}
f490: 20 7b 30 20 2d 31 20 2d 31 7d 0a 64 6f 5f 74 65   {0 -1 -1}.do_te
f4a0: 73 74 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 31  st pager1-22.2.1
f4b0: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
f4c0: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20  -default 1.  tv 
f4d0: 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74  filter xSync.  t
f4e0: 76 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62  v script xSyncCb
f4f0: 0a 20 20 70 72 6f 63 20 78 53 79 6e 63 43 62 20  .  proc xSyncCb 
f500: 7b 61 72 67 73 7d 20 7b 69 6e 63 72 20 3a 3a 73  {args} {incr ::s
f510: 79 6e 63 63 6f 75 6e 74 7d 0a 20 20 73 71 6c 69  ynccount}.  sqli
f520: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a  te3 db test.db..
f530: 20 20 23 20 53 77 69 74 63 68 20 74 68 65 20 64    # Switch the d
f540: 62 20 74 6f 20 57 41 4c 20 6d 6f 64 65 2e 20 41  b to WAL mode. A
f550: 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 20  nd then execute 
f560: 61 20 53 45 4c 45 43 54 20 74 6f 20 6d 61 6b 65  a SELECT to make
f570: 20 73 75 72 65 0a 20 20 23 20 74 68 61 74 20 74   sure.  # that t
f580: 68 65 20 57 41 4c 20 66 69 6c 65 20 69 73 20 6f  he WAL file is o
f590: 70 65 6e 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  pen. Note that t
f5a0: 68 69 73 20 6d 61 79 20 63 68 61 6e 67 65 20 74  his may change t
f5b0: 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  he synchronous. 
f5c0: 20 23 20 73 65 74 74 69 6e 67 20 69 66 20 44 45   # setting if DE
f5d0: 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59  FAULT_WAL_SAFETY
f5e0: 4c 45 56 45 4c 20 69 73 20 64 65 66 69 6e 65 64  LEVEL is defined
f5f0: 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  ..  execsql { PR
f600: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f610: 65 20 3d 20 57 41 4c 20 3b 20 53 45 4c 45 43 54  e = WAL ; SELECT
f620: 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 0a 0a 20 20   * FROM ko }..  
f630: 23 20 53 65 74 20 73 79 6e 63 68 72 6f 6e 6f 75  # Set synchronou
f640: 73 3d 4f 46 46 2e 20 49 6e 73 65 72 74 20 73 6f  s=OFF. Insert so
f650: 6d 65 20 64 61 74 61 20 61 6e 64 20 72 75 6e 20  me data and run 
f660: 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 53 69  a checkpoint. Si
f670: 6e 63 65 0a 20 20 23 20 73 79 6e 63 3d 6f 66 66  nce.  # sync=off
f680: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
f690: 74 20 63 61 75 73 65 20 61 6e 79 20 63 61 6c 6c  t cause any call
f6a0: 73 20 74 6f 20 74 68 65 20 78 53 79 6e 63 28 29  s to the xSync()
f6b0: 20 6d 65 74 68 6f 64 2e 0a 20 20 73 65 74 20 3a   method..  set :
f6c0: 3a 73 79 6e 63 63 6f 75 6e 74 20 30 0a 20 20 65  :synccount 0.  e
f6d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
f6e0: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
f6f0: 3d 20 6f 66 66 3b 0a 20 20 20 20 49 4e 53 45 52  = off;.    INSER
f700: 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c  T INTO ko DEFAUL
f710: 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 50 52  T VALUES;.    PR
f720: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
f730: 69 6e 74 3b 0a 20 20 7d 0a 20 20 73 65 74 20 73  int;.  }.  set s
f740: 79 6e 63 63 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 0a  ynccount.} {0}..
f750: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
f760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
f7a0: 74 73 20 66 6f 72 20 63 68 61 6e 67 69 6e 67 20  ts for changing 
f7b0: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a  journal mode..#.
f7c0: 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  #   pager1-23.1.
f7d0: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 77 68 65  *: Test that whe
f7e0: 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20  n changing from 
f7f0: 50 45 52 53 49 53 54 20 74 6f 20 44 45 4c 45 54  PERSIST to DELET
f800: 45 20 6d 6f 64 65 2c 0a 23 20 20 20 20 20 20 20  E mode,.#       
f810: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 6a             the j
f820: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
f830: 65 6c 65 74 65 64 2e 0a 23 0a 23 20 20 20 70 61  eleted..#.#   pa
f840: 67 65 72 31 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d  ger1-23.2.*: Sam
f850: 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c  e test as above,
f860: 20 62 75 74 20 77 68 69 6c 65 20 61 20 73 68 61   but while a sha
f870: 72 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  red lock is held
f880: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
f890: 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
f8a0: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20  ase file..#.#   
f8b0: 70 61 67 65 72 31 2d 32 33 2e 33 2e 2a 3a 20 53  pager1-23.3.*: S
f8c0: 61 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76  ame test as abov
f8d0: 65 2c 20 62 75 74 20 77 68 69 6c 65 20 61 20 72  e, but while a r
f8e0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 69 73 20  eserved lock is 
f8f0: 68 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20 20  held.#          
f900: 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64          on the d
f910: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a  atabase file..#.
f920: 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 34 2e  #   pager1-23.4.
f930: 2a 3a 20 41 6e 64 2c 20 66 6f 72 20 66 75 6e 2c  *: And, for fun,
f940: 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
f950: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
f960: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
f970: 33 2e 35 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65  3.5.*: Try to se
f980: 74 20 76 61 72 69 6f 75 73 20 64 69 66 66 65 72  t various differ
f990: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent journal mode
f9a0: 73 20 77 69 74 68 20 61 6e 0a 23 20 20 20 20 20  s with an.#     
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 2d               in-
f9c0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
f9d0: 28 6f 6e 6c 79 20 4d 45 4d 4f 52 59 20 61 6e 64  (only MEMORY and
f9e0: 20 4f 46 46 20 73 68 6f 75 6c 64 20 77 6f 72 6b   OFF should work
f9f0: 29 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  )..#.#   pager1-
fa00: 32 33 2e 36 2e 2a 3a 20 54 72 79 20 74 6f 20 73  23.6.*: Try to s
fa10: 65 74 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  et locking_mode=
fa20: 6e 6f 72 6d 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d  normal on an in-
fa30: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a  memory database.
fa40: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
fa50: 20 20 20 28 64 6f 65 73 6e 27 74 20 77 6f 72 6b     (doesn't work
fa60: 20 2d 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74   - in-memory dat
fa70: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 75 73  abases always us
fa80: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
fa90: 20 20 20 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64       locking_mod
faa0: 65 3d 65 78 63 6c 75 73 69 76 65 29 2e 0a 23 0a  e=exclusive)..#.
fab0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
fac0: 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  3.1.1 {.  faults
fad0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
fae0: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
faf0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
fb00: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
fb10: 53 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ST;.    CREATE T
fb20: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
fb30: 20 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   }.  file exists
fb40: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
fb50: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {1}.do_test p
fb60: 61 67 65 72 31 2d 32 33 2e 31 2e 32 20 7b 0a 20  ager1-23.1.2 {. 
fb70: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
fb80: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
fb90: 20 44 45 4c 45 54 45 20 7d 0a 20 20 66 69 6c 65   DELETE }.  file
fba0: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
fbb0: 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64  journal.} {0}..d
fbc0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
fbd0: 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.1 {.  execsql
fbe0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
fbf0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
fc00: 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54  SIST;.    INSERT
fc10: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
fc20: 27 43 61 6e 62 65 72 72 61 27 2c 20 27 41 43 54  'Canberra', 'ACT
fc30: 27 29 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61  ');.  }.  db eva
fc40: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
fc50: 4d 20 74 31 20 7d 20 7b 0a 20 20 20 20 64 62 20  M t1 } {.    db 
fc60: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
fc70: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
fc80: 45 54 45 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63  ETE }.  }.  exec
fc90: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
fca0: 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64  rnal_mode }.} {d
fcb0: 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70  elete}.do_test p
fcc0: 61 67 65 72 31 2d 32 33 2e 32 2e 32 20 7b 0a 20  ager1-23.2.2 {. 
fcd0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
fce0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
fcf0: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  0}..do_test page
fd00: 72 31 2d 32 33 2e 33 2e 31 20 7b 0a 20 20 65 78  r1-23.3.1 {.  ex
fd10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
fd20: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
fd30: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49  = PERSIST;.    I
fd40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
fd50: 4c 55 45 53 28 27 44 61 72 77 69 6e 27 2c 20 27  LUES('Darwin', '
fd60: 4e 54 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 20  NT');.    BEGIN 
fd70: 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20 7d 0a 20  IMMEDIATE;.  }. 
fd80: 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d   db eval { PRAGM
fd90: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
fda0: 20 44 45 4c 45 54 45 20 7d 0a 20 20 65 78 65 63   DELETE }.  exec
fdb0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
fdc0: 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64  rnal_mode }.} {d
fdd0: 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70  elete}.do_test p
fde0: 61 67 65 72 31 2d 32 33 2e 33 2e 32 20 7b 0a 20  ager1-23.3.2 {. 
fdf0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
fe00: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
fe10: 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  0}.do_test pager
fe20: 31 2d 32 33 2e 33 2e 33 20 7b 0a 20 20 65 78 65  1-23.3.3 {.  exe
fe30: 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d  csql COMMIT.} {}
fe40: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
fe50: 2d 32 33 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63  -23.4.1 {.  exec
fe60: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
fe70: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
fe80: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53  PERSIST;.    INS
fe90: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
fea0: 45 53 28 27 41 64 65 6c 61 69 64 65 27 2c 20 27  ES('Adelaide', '
feb0: 53 41 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 20  SA');.    BEGIN 
fec0: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
fed0: 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d   db eval { PRAGM
fee0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
fef0: 20 44 45 4c 45 54 45 20 7d 0a 20 20 65 78 65 63   DELETE }.  exec
ff00: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
ff10: 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64  rnal_mode }.} {d
ff20: 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70  elete}.do_test p
ff30: 61 67 65 72 31 2d 32 33 2e 34 2e 32 20 7b 0a 20  ager1-23.4.2 {. 
ff40: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
ff50: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
ff60: 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  0}.do_test pager
ff70: 31 2d 32 33 2e 34 2e 33 20 7b 0a 20 20 65 78 65  1-23.4.3 {.  exe
ff80: 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d  csql COMMIT.} {}
ff90: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
ffa0: 2d 32 33 2e 35 2e 31 20 7b 0a 20 20 66 61 75 6c  -23.5.1 {.  faul
ffb0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
ffc0: 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33  reopen.  sqlite3
ffd0: 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b   db :memory:.} {
ffe0: 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6d 6f  }.foreach {tn mo
fff0: 64 65 20 70 6f 73 73 69 62 6c 65 7d 20 7b 0a 20  de possible} {. 
10000 20 32 20 20 6f 66 66 20 20 20 20 20 20 31 0a 20   2  off      1. 
10010 20 33 20 20 6d 65 6d 6f 72 79 20 20 20 31 0a 20   3  memory   1. 
10020 20 34 20 20 70 65 72 73 69 73 74 20 20 30 0a 20   4  persist  0. 
10030 20 35 20 20 64 65 6c 65 74 65 20 20 20 30 0a 20   5  delete   0. 
10040 20 36 20 20 77 61 6c 20 20 20 20 20 20 30 0a 20   6  wal      0. 
10050 20 37 20 20 74 72 75 6e 63 61 74 65 20 30 0a 7d   7  truncate 0.}
10060 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
10070 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 31 20 7b  er1-23.5.$tn.1 {
10080 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52  .    execsql "PR
10090 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
100a0 65 20 3d 20 6f 66 66 22 0a 20 20 20 20 65 78 65  e = off".    exe
100b0 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75  csql "PRAGMA jou
100c0 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64  rnal_mode = $mod
100d0 65 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73 73  e".  } [if $poss
100e0 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65  ible {list $mode
100f0 7d 20 7b 6c 69 73 74 20 6f 66 66 7d 5d 0a 20 20  } {list off}].  
10100 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10110 33 2e 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  3.5.$tn.2 {.    
10120 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20  execsql "PRAGMA 
10130 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d  journal_mode = m
10140 65 6d 6f 72 79 22 0a 20 20 20 20 65 78 65 63 73  emory".    execs
10150 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  ql "PRAGMA journ
10160 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22  al_mode = $mode"
10170 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62  .  } [if $possib
10180 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20  le {list $mode} 
10190 7b 6c 69 73 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d  {list memory}].}
101a0 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
101b0 32 33 2e 36 2e 31 20 7b 0a 20 20 65 78 65 63 73  23.6.1 {.  execs
101c0 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69  ql {PRAGMA locki
101d0 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c  ng_mode = normal
101e0 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a  }.} {exclusive}.
101f0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10200 33 2e 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  3.6.2 {.  execsq
10210 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e  l {PRAGMA lockin
10220 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69  g_mode = exclusi
10230 76 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65  ve}.} {exclusive
10240 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
10250 2d 32 33 2e 36 2e 33 20 7b 0a 20 20 65 78 65 63  -23.6.3 {.  exec
10260 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b  sql {PRAGMA lock
10270 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63  ing_mode}.} {exc
10280 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20  lusive}.do_test 
10290 70 61 67 65 72 31 2d 32 33 2e 36 2e 34 20 7b 0a  pager1-23.6.4 {.
102a0 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d    execsql {PRAGM
102b0 41 20 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d  A main.locking_m
102c0 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  ode}.} {exclusiv
102d0 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e}..#-----------
102e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
10320 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
10330 32 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  24.1.1 {.  fault
10340 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
10350 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
10360 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
10370 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
10380 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
10390 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52  ize = 10;.    PR
103a0 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
103b0 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 43 52 45   = FULL;.    CRE
103c0 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 2c 20  ATE TABLE x1(x, 
103d0 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45  y, z, PRIMARY KE
103e0 59 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20 43 52  Y(y, z));.    CR
103f0 45 41 54 45 20 54 41 42 4c 45 20 78 32 28 78 2c  EATE TABLE x2(x,
10400 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b   y, z, PRIMARY K
10410 45 59 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20 49  EY(y, z));.    I
10420 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41  NSERT INTO x2 VA
10430 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 34 30  LUES(a_string(40
10440 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
10450 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10460 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10470 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73  TO x2 SELECT a_s
10480 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74  tring(600), a_st
10490 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72  ring(400), a_str
104a0 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20 78 32  ing(500) FROM x2
104b0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
104c0 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74  O x2 SELECT a_st
104d0 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
104e0 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69  ing(600), a_stri
104f0 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 78 32 3b  ng(400) FROM x2;
10500 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10510 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   x2 SELECT a_str
10520 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69  ing(400), a_stri
10530 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
10540 67 28 36 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a  g(600) FROM x2;.
10550 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10560 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  x2 SELECT a_stri
10570 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(600), a_strin
10580 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(400), a_string
10590 28 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20  (500) FROM x2;. 
105a0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
105b0 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
105c0 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(500), a_string
105d0 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (600), a_string(
105e0 34 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  400) FROM x2;.  
105f0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
10600 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10610 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
10620 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  500), a_string(6
10630 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
10640 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
10650 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32  SELECT * FROM x2
10660 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
10670 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 32  st pager1-24.1.2
10680 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
10690 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
106a0 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 20 57  DELETE FROM x1 W
106b0 48 45 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20  HERE rowid<32;. 
106c0 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73   }.  recursive_s
106d0 65 6c 65 63 74 20 36 34 20 78 32 0a 7d 20 7b 7d  elect 64 x2.} {}
106e0 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
106f0 32 34 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  24.1.3 {.  execs
10700 71 6c 20 7b 20 0a 20 20 20 20 20 20 55 50 44 41  ql { .      UPDA
10710 54 45 20 78 31 20 53 45 54 20 7a 20 3d 20 61 5f  TE x1 SET z = a_
10720 73 74 72 69 6e 67 28 33 30 30 29 20 57 48 45 52  string(300) WHER
10730 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20 20 20 20  E rowid>40;.    
10740 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47  COMMIT;.    PRAG
10750 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
10760 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  ck;.    SELECT c
10770 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b  ount(*) FROM x1;
10780 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a  .  }.} {ok 33}..
10790 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
107a0 34 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  4.1.4 {.  execsq
107b0 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
107c0 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53 45  ROM x1;.    INSE
107d0 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43  RT INTO x1 SELEC
107e0 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  T * FROM x2;.   
107f0 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45   BEGIN;.      DE
10800 4c 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45  LETE FROM x1 WHE
10810 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 20  RE rowid<32;.   
10820 20 20 20 55 50 44 41 54 45 20 78 31 20 53 45 54     UPDATE x1 SET
10830 20 7a 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 39   z = a_string(29
10840 39 29 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34  9) WHERE rowid>4
10850 30 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69  0;.  }.  recursi
10860 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32 20  ve_select 64 x2 
10870 7b 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54 7d  {db eval COMMIT}
10880 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10890 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
108a0 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c  y_check;.    SEL
108b0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
108c0 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20  M x1;.  }.} {ok 
108d0 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  33}..do_test pag
108e0 65 72 31 2d 32 34 2e 31 2e 35 20 7b 0a 20 20 65  er1-24.1.5 {.  e
108f0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
10900 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20  ETE FROM x1;.   
10910 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
10920 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32  SELECT * FROM x2
10930 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76  ;.  }.  recursiv
10940 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32 20 7b  e_select 64 x2 {
10950 20 64 62 20 65 76 61 6c 20 7b 43 52 45 41 54 45   db eval {CREATE
10960 20 54 41 42 4c 45 20 78 33 28 78 2c 20 79 2c 20   TABLE x3(x, y, 
10970 7a 29 7d 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  z)} }.  execsql 
10980 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
10990 78 33 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  x3 }.} {}..#----
109a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109e0 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20  -----.#.do_test 
109f0 70 61 67 65 72 31 2d 32 35 2d 31 20 7b 0a 20 20  pager1-25-1 {.  
10a00 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
10a10 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
10a20 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
10a30 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e  ;.      SAVEPOIN
10a40 54 20 61 62 63 3b 0a 20 20 20 20 20 20 20 20 43  T abc;.        C
10a50 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
10a60 2c 20 62 29 3b 0a 20 20 20 20 20 20 52 4f 4c 4c  , b);.      ROLL
10a70 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20  BACK TO abc;.   
10a80 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64   COMMIT;.  }.  d
10a90 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 62 72 65  b close.} {}.bre
10aa0 61 6b 70 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20  akpoint.do_test 
10ab0 70 61 67 65 72 31 2d 32 35 2d 32 20 7b 0a 20 20  pager1-25-2 {.  
10ac0 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
10ad0 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
10ae0 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50  csql {.    SAVEP
10af0 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20  OINT abc;.      
10b00 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
10b10 61 2c 20 62 29 3b 0a 20 20 20 20 52 4f 4c 4c 42  a, b);.    ROLLB
10b20 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20  ACK TO abc;.    
10b30 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62  COMMIT;.  }.  db
10b40 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d   close.} {}..#--
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b90 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 65 63 74 6f 72  -------.# Sector
10ba0 2d 73 69 7a 65 20 74 65 73 74 73 2e 0a 23 0a 64  -size tests..#.d
10bb0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 36  o_test pager1-26
10bc0 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74  .1 {.  testvfs t
10bd0 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74  v -default 1.  t
10be0 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39  v sectorsize 409
10bf0 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  6.  faultsim_del
10c00 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
10c10 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
10c20 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
10c30 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
10c40 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31  A page_size = 51
10c50 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  2;.    CREATE TA
10c60 42 4c 45 20 74 62 6c 28 61 20 50 52 49 4d 41 52  BLE tbl(a PRIMAR
10c70 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 29  Y KEY, b UNIQUE)
10c80 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
10c90 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10ca0 62 6c 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  bl VALUES(a_stri
10cb0 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
10cc0 28 36 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e  (600));.      IN
10cd0 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
10ce0 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
10cf0 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10d00 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
10d10 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
10d20 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10d30 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
10d40 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
10d50 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10d60 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72  tbl SELECT a_str
10d70 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
10d80 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b  g(600) FROM tbl;
10d90 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10da0 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f  TO tbl SELECT a_
10db0 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
10dc0 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74  ring(600) FROM t
10dd0 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bl;.      INSERT
10de0 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
10df0 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
10e00 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
10e10 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
10e20 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
10e30 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
10e40 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10e50 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
10e60 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
10e70 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10e80 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
10e90 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  0) FROM tbl;.   
10ea0 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
10eb0 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
10ec0 74 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a  t pager1-26.1 {.
10ed0 20 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54    UPDATE tbl SET
10ee0 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 35 35   b = a_string(55
10ef0 30 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73  0);.} {}.db clos
10f00 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d  e.tv delete..#--
10f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f50 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73  -------.#.do_tes
10f60 74 20 70 61 67 65 72 31 2e 32 37 2e 31 20 7b 0a  t pager1.27.1 {.
10f70 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
10f80 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73  e_and_reopen.  s
10f90 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66  qlite3_pager_ref
10fa0 63 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65 63  counts db.  exec
10fb0 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
10fc0 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
10fd0 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
10fe0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  }.  sqlite3_page
10ff0 72 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20  r_refcounts db. 
11000 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
11010 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
11020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11060 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 74 74  .# Test that att
11070 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20  empting to open 
11080 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
11090 69 6f 6e 20 77 69 74 68 20 0a 23 20 6c 6f 63 6b  ion with .# lock
110a0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
110b0 76 65 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 66  ve in WAL mode f
110c0 61 69 6c 73 20 69 66 20 74 68 65 72 65 20 61 72  ails if there ar
110d0 65 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 73 20  e other clients 
110e0 6f 6e 20 0a 23 20 74 68 65 20 73 61 6d 65 20 64  on .# the same d
110f0 61 74 61 62 61 73 65 2e 0a 23 0a 63 61 74 63 68  atabase..#.catch
11100 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 69 66   { db close }.if
11110 20 7b 24 3a 3a 73 71 6c 69 74 65 5f 6f 70 74 69   {$::sqlite_opti
11120 6f 6e 73 28 77 61 6c 29 20 26 26 20 5b 77 61 6c  ons(wal) && [wal
11130 5f 69 73 5f 6f 6b 5d 7d 20 7b 0a 20 20 64 6f 5f  _is_ok]} {.  do_
11140 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
11150 20 74 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73   tn {.    do_tes
11160 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11170 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b  1 {.      sql1 {
11180 20 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41   .        PRAGMA
11190 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
111a0 57 41 4c 3b 0a 20 20 20 20 20 20 20 20 43 52 45  WAL;.        CRE
111b0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
111c0 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  b);.        INSE
111d0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
111e0 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20  S('a', 'b');.   
111f0 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d     }.    } {wal}
11200 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
11210 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 73  er1-28.$tn.2 { s
11220 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
11230 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 61 20 62 7d  ROM t1 } } {a b}
11240 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  ..    do_test pa
11250 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20  ger1-28.$tn.3 { 
11260 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f  sql1 { PRAGMA lo
11270 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
11280 73 69 76 65 20 7d 20 7d 20 7b 65 78 63 6c 75 73  sive } } {exclus
11290 69 76 65 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  ive}.    do_test
112a0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34   pager1-28.$tn.4
112b0 20 7b 20 0a 20 20 20 20 20 20 63 73 71 6c 31 20   { .      csql1 
112c0 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20  { BEGIN; INSERT 
112d0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
112e0 63 27 2c 20 27 64 27 29 3b 20 7d 0a 20 20 20 20  c', 'd'); }.    
112f0 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
11300 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 20 20 63  s locked}}.    c
11310 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73 65  ode2 { db2 close
11320 20 3b 20 73 71 6c 69 74 65 33 20 64 62 32 20 74   ; sqlite3 db2 t
11330 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 64 6f 5f  est.db }.    do_
11340 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11350 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 73 71  tn.4 { .      sq
11360 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l1 { INSERT INTO
11370 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20   t1 VALUES('c', 
11380 27 64 27 29 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20  'd'); COMMIT }. 
11390 20 20 20 7d 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23     } {}.  }.}..#
113a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e 6f 72 6d  ---------.# Norm
113f0 61 6c 6c 79 2c 20 77 68 65 6e 20 63 68 61 6e 67  ally, when chang
11400 69 6e 67 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ing from journal
11410 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 74 6f  _mode=PERSIST to
11420 20 44 45 4c 45 54 45 20 74 68 65 20 70 61 67 65   DELETE the page
11430 72 0a 23 20 61 74 74 65 6d 70 74 73 20 74 6f 20  r.# attempts to 
11440 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
11450 61 6c 20 66 69 6c 65 2e 20 48 6f 77 65 76 65 72  al file. However
11460 2c 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 20 6f  , if it cannot o
11470 62 74 61 69 6e 20 61 0a 23 20 52 45 53 45 52 56  btain a.# RESERV
11480 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
11490 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
114a0 69 73 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  is step is skipp
114b0 65 64 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c  ed..#.do_multicl
114c0 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20  ient_test tn {. 
114d0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
114e0 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73  28.$tn.1 {.    s
114f0 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41  ql1 { .      PRA
11500 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
11510 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
11520 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
11530 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49  1(a, b);.      I
11540 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11550 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
11560 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69      }.  } {persi
11570 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  st}.  do_test pa
11580 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20  ger1-28.$tn.2 { 
11590 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
115a0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a  .db-journal } 1.
115b0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
115c0 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31  -28.$tn.3 { sql1
115d0 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
115e0 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
115f0 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f  } } delete.  do_
11600 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11610 74 6e 2e 34 20 7b 20 66 69 6c 65 20 65 78 69 73  tn.4 { file exis
11620 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
11630 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73  al } 0..  do_tes
11640 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11650 35 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a  5 {.    sql1 { .
11660 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
11670 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
11680 49 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  IST;.      INSER
11690 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
116a0 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20  ('c', 'd');.    
116b0 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a  }.  } {persist}.
116c0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
116d0 2d 32 38 2e 24 74 6e 2e 36 20 7b 20 66 69 6c 65  -28.$tn.6 { file
116e0 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
116f0 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f  journal } 1.  do
11700 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11710 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32  $tn.7 {.    sql2
11720 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54   { BEGIN; INSERT
11730 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
11740 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d  'e', 'f'); }.  }
11750 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
11760 67 65 72 31 2d 32 38 2e 24 74 6e 2e 38 20 20 7b  ger1-28.$tn.8  {
11770 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
11780 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
11790 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
117a0 31 2d 32 38 2e 24 74 6e 2e 39 20 20 7b 20 73 71  1-28.$tn.9  { sq
117b0 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  l1 { PRAGMA jour
117c0 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
117d0 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64  E } } delete.  d
117e0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
117f0 2e 24 74 6e 2e 31 30 20 7b 20 66 69 6c 65 20 65  .$tn.10 { file e
11800 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
11810 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f  urnal } 1..  do_
11820 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11830 74 6e 2e 31 31 20 7b 20 73 71 6c 32 20 43 4f 4d  tn.11 { sql2 COM
11840 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  MIT } {}.  do_te
11850 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11860 2e 31 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .12 { file exist
11870 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
11880 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 0..  do_test
11890 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31   pager1-28-$tn.1
118a0 33 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b 20  3 {.    code1 { 
118b0 73 65 74 20 63 68 61 6e 6e 65 6c 20 5b 64 62 20  set channel [db 
118c0 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e  incrblob -readon
118d0 6c 79 20 74 31 20 61 20 32 5d 20 7d 0a 20 20 20  ly t1 a 2] }.   
118e0 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50 52   sql1 {.      PR
118f0 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
11900 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
11910 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11920 31 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68  1 VALUES('g', 'h
11930 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70  ');.    }.  } {p
11940 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73  ersist}.  do_tes
11950 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11960 31 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  14 { file exists
11970 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
11980 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70   } 1.  do_test p
11990 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 35 20  ager1-28.$tn.15 
119a0 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47  {.    sql2 { BEG
119b0 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  IN; INSERT INTO 
119c0 74 31 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27  t1 VALUES('e', '
119d0 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  f'); }.  } {}.  
119e0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
119f0 38 2e 24 74 6e 2e 31 36 20 7b 20 73 71 6c 31 20  8.$tn.16 { sql1 
11a00 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
11a10 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d  _mode = DELETE }
11a20 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74   } delete.  do_t
11a30 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
11a40 6e 2e 31 37 20 7b 20 66 69 6c 65 20 65 78 69 73  n.17 { file exis
11a50 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
11a60 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73  al } 1..  do_tes
11a70 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11a80 31 37 20 7b 20 63 73 71 6c 32 20 7b 20 43 4f 4d  17 { csql2 { COM
11a90 4d 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61  MIT } } {1 {data
11aa0 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
11ab0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11ac0 31 2d 32 38 2d 24 74 6e 2e 31 38 20 7b 20 63 6f  1-28-$tn.18 { co
11ad0 64 65 31 20 7b 20 72 65 61 64 20 24 63 68 61 6e  de1 { read $chan
11ae0 6e 65 6c 20 7d 20 7d 20 63 0a 20 20 64 6f 5f 74  nel } } c.  do_t
11af0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74  est pager1-28-$t
11b00 6e 2e 31 39 20 7b 20 63 6f 64 65 31 20 7b 20 63  n.19 { code1 { c
11b10 6c 6f 73 65 20 24 63 68 61 6e 6e 65 6c 20 7d 20  lose $channel } 
11b20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
11b30 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 30 20  ager1-28.$tn.20 
11b40 7b 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20  { sql2 { COMMIT 
11b50 7d 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73  } } {}.}..do_tes
11b60 74 20 70 61 67 65 72 31 2d 32 39 2e 31 20 7b 0a  t pager1-29.1 {.
11b70 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
11b80 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
11b90 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
11ba0 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
11bb0 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41  1024;.    PRAGMA
11bc0 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 66   auto_vacuum = f
11bd0 75 6c 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ull;.    PRAGMA 
11be0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
11bf0 6c 75 73 69 76 65 3b 0a 20 20 20 20 43 52 45 41  lusive;.    CREA
11c00 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
11c10 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11c20 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
11c30 32 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  2);.  }.  file s
11c40 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65  ize test.db.} [e
11c50 78 70 72 20 31 30 32 34 2a 33 5d 0a 64 6f 5f 74  xpr 1024*3].do_t
11c60 65 73 74 20 70 61 67 65 72 31 2d 32 39 2e 32 20  est pager1-29.2 
11c70 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
11c80 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
11c90 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 56  ze = 4096;.    V
11ca0 41 43 55 55 4d 3b 0a 20 20 7d 0a 20 20 66 69 6c  ACUUM;.  }.  fil
11cb0 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d  e size test.db.}
11cc0 20 5b 65 78 70 72 20 34 30 39 36 2a 33 5d 0a 0a   [expr 4096*3]..
11cd0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
11ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
11d20 74 20 74 68 61 74 20 69 66 20 61 6e 20 65 6d 70  t that if an emp
11d30 74 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ty database file
11d40 20 28 73 69 7a 65 20 30 20 62 79 74 65 73 29 20   (size 0 bytes) 
11d50 69 73 20 6f 70 65 6e 65 64 20 69 6e 20 0a 23 20  is opened in .# 
11d60 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e  exclusive-lockin
11d70 67 20 6d 6f 64 65 2c 20 61 6e 79 20 6a 6f 75 72  g mode, any jour
11d80 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65  nal file is dele
11d90 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
11da0 65 2d 73 79 73 74 65 6d 0a 23 20 77 69 74 68 6f  e-system.# witho
11db0 75 74 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ut being rolled 
11dc0 62 61 63 6b 2e 20 41 6e 64 20 74 68 61 74 20 74  back. And that t
11dd0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
11de0 20 6f 62 74 61 69 6e 65 64 20 77 68 69 6c 65 0a   obtained while.
11df0 23 20 64 6f 69 6e 67 20 74 68 69 73 20 69 73 20  # doing this is 
11e00 6e 6f 74 20 72 65 6c 65 61 73 65 64 2e 0a 23 0a  not released..#.
11e10 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  do_test pager1-3
11e20 30 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  0.1 {.  db close
11e30 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74  .  delete_file t
11e40 65 73 74 2e 64 62 0a 20 20 64 65 6c 65 74 65 5f  est.db.  delete_
11e50 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  file test.db-jou
11e60 72 6e 61 6c 0a 20 20 73 65 74 20 66 64 20 5b 6f  rnal.  set fd [o
11e70 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  pen test.db-jour
11e80 6e 61 6c 20 77 5d 0a 20 20 73 65 65 6b 20 24 66  nal w].  seek $f
11e90 64 20 5b 65 78 70 72 20 35 31 32 2b 31 30 33 32  d [expr 512+1032
11ea0 2a 32 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65  *2].  puts -none
11eb0 77 6c 69 6e 65 20 24 66 64 20 78 0a 20 20 63 6c  wline $fd x.  cl
11ec0 6f 73 65 20 24 66 64 0a 0a 20 20 73 71 6c 69 74  ose $fd..  sqlit
11ed0 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
11ee0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
11ef0 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
11f00 65 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  e=EXCLUSIVE;.   
11f10 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
11f20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
11f30 74 65 72 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ter;.    PRAGMA 
11f40 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d  lock_status;.  }
11f50 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 30 20  .} {exclusive 0 
11f60 6d 61 69 6e 20 72 65 73 65 72 76 65 64 20 74 65  main reserved te
11f70 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 23 2d 2d 2d  mp closed}..#---
11f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fc0 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
11fd0 61 74 20 69 66 20 74 68 65 20 22 70 61 67 65 2d  at if the "page-
11fe0 73 69 7a 65 22 20 66 69 65 6c 64 20 69 6e 20 61  size" field in a
11ff0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
12000 69 73 20 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  is 0, the journa
12010 6c 0a 23 20 66 69 6c 65 20 63 61 6e 20 73 74 69  l.# file can sti
12020 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
12030 6b 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  k. This is requi
12040 72 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64  red for backward
12050 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
12060 0a 23 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  .# versions of S
12070 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33  QLite prior to 3
12080 2e 35 2e 38 20 61 6c 77 61 79 73 20 73 65 74 20  .5.8 always set 
12090 74 68 69 73 20 66 69 65 6c 64 20 74 6f 20 7a 65  this field to ze
120a0 72 6f 2e 0a 23 0a 69 66 20 7b 24 74 63 6c 5f 70  ro..#.if {$tcl_p
120b0 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d  latform(platform
120c0 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 64 6f 5f  )=="unix"} {.do_
120d0 74 65 73 74 20 70 61 67 65 72 31 2d 33 31 2e 31  test pager1-31.1
120e0 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
120f0 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
12100 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
12110 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
12120 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47  e = 10;.    PRAG
12130 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
12140 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20  024;.    CREATE 
12150 54 41 42 4c 45 20 74 31 28 78 2c 20 79 2c 20 55  TABLE t1(x, y, U
12160 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
12170 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12180 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
12190 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
121a0 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20  blob(1500));.   
121b0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
121c0 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
121d0 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
121e0 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
121f0 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
12200 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
12210 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
12220 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
12230 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
12240 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
12250 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
12260 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
12270 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
12280 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
12290 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
122a0 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
122b0 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
122c0 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
122d0 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
122e0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
122f0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
12300 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
12310 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
12320 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
12330 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
12340 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
12350 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12360 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
12370 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
12380 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
12390 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
123a0 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
123b0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
123c0 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
123d0 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
123e0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
123f0 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
12400 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
12410 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
12420 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
12430 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
12440 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
12450 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
12460 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 47  FROM t1;.    BEG
12470 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  IN;.      UPDATE
12480 20 74 31 20 53 45 54 20 79 20 3d 20 72 61 6e 64   t1 SET y = rand
12490 6f 6d 62 6c 6f 62 28 31 34 39 39 29 3b 0a 20 20  omblob(1499);.  
124a0 7d 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65  }.  copy_file te
124b0 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a 20  st.db test.db2. 
124c0 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e   copy_file test.
124d0 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e  db-journal test.
124e0 64 62 32 2d 6a 6f 75 72 6e 61 6c 0a 20 20 0a 20  db2-journal.  . 
124f0 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
12500 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 32 34  t.db2-journal 24
12510 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69   00000000.  sqli
12520 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32  te3 db2 test.db2
12530 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
12540 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
12550 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d  eck } db2.} {ok}
12560 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
12570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
125a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
125b0 20 54 65 73 74 20 74 68 61 74 20 61 20 64 61 74   Test that a dat
125c0 61 62 61 73 65 20 66 69 6c 65 20 63 61 6e 20 62  abase file can b
125d0 65 20 22 70 72 65 2d 68 69 6e 74 65 64 22 20 74  e "pre-hinted" t
125e0 6f 20 61 20 63 65 72 74 61 69 6e 20 73 69 7a 65  o a certain size
125f0 20 61 6e 64 20 74 68 61 74 0a 23 20 73 75 62 73   and that.# subs
12600 65 71 75 65 6e 74 20 73 70 69 6c 6c 69 6e 67 20  equent spilling 
12610 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63  of the pager cac
12620 68 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 75  he does not resu
12630 6c 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  lt in the databa
12640 73 65 0a 23 20 66 69 6c 65 20 62 65 69 6e 67 20  se.# file being 
12650 73 68 72 75 6e 6b 2e 0a 23 0a 63 61 74 63 68 20  shrunk..#.catch 
12660 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72 63 65  {db close}.force
12670 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 0a  delete test.db..
12680 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  do_test pager1-3
12690 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  2.1 {.  sqlite3 
126a0 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
126b0 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
126c0 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29  E TABLE t1(x, y)
126d0 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
126e0 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
126f0 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
12700 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
12710 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
12720 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d  VALUES(1, random
12730 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20  blob(10000));.  
12740 7d 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  }.  file_control
12750 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20  _chunksize_test 
12760 64 62 20 6d 61 69 6e 20 31 30 32 34 0a 20 20 66  db main 1024.  f
12770 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65  ile_control_size
12780 68 69 6e 74 5f 74 65 73 74 20 64 62 20 6d 61 69  hint_test db mai
12790 6e 20 32 30 39 37 31 35 32 30 3b 20 23 20 32 30  n 20971520; # 20
127a0 4d 42 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  MB.  execsql {. 
127b0 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
127c0 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 49  size = 10;.    I
127d0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
127e0 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(1, randombl
127f0 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20 20  ob(10000));.    
12800 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
12810 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62  ALUES(2, randomb
12820 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20  lob(10000));.   
12830 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
12840 53 45 4c 45 43 54 20 78 2b 32 2c 20 72 61 6e 64  SELECT x+2, rand
12850 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72  omblob(10000) fr
12860 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  om t1;.    INSER
12870 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
12880 20 78 2b 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62   x+4, randomblob
12890 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b  (10000) from t1;
128a0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
128b0 20 74 31 20 53 45 4c 45 43 54 20 78 2b 38 2c 20   t1 SELECT x+8, 
128c0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30  randomblob(10000
128d0 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49  ) from t1;.    I
128e0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
128f0 4c 45 43 54 20 78 2b 31 36 2c 20 72 61 6e 64 6f  LECT x+16, rando
12900 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f  mblob(10000) fro
12910 6d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54  m t1;.    SELECT
12920 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
12930 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  1;.    COMMIT;. 
12940 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   }.  db close.  
12950 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
12960 62 0a 7d 20 7b 32 30 39 37 31 35 32 30 7d 0a 0a  b.} {20971520}..
12970 23 20 43 6c 65 61 6e 75 70 20 32 30 4d 42 20 66  # Cleanup 20MB f
12980 69 6c 65 20 6c 65 66 74 20 62 79 20 74 68 65 20  ile left by the 
12990 70 72 65 76 69 6f 75 73 20 74 65 73 74 2e 0a 66  previous test..f
129a0 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
129b0 64 62 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  db..finish_test.