/ Hex Artifact Content
Login

Artifact 819a0ecc0ecf4850155cf18dcd2754121d1018b3:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e 6f 74 20  n.tcl..# Do not 
0210: 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 20  use a codec for 
0220: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0230: 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 62  le, as the datab
0240: 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d 61  ase file is.# ma
0250: 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 74  nipulated direct
0260: 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 72  ly using tcl scr
0270: 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 20  ipts (using the 
0280: 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 6f  [hexio_write] co
0290: 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f 74  mmand)..#.do_not
02a0: 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 20  _use_codec..#.# 
02b0: 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 74  pager1-1.*: Test
02c0: 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 6c   inter-process l
02d0: 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 20  ocking (clients 
02e0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
02f0: 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 65  esses)..#.# page
0300: 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e 74  r1-2.*: Test int
0310: 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b 69  ra-process locki
0320: 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c 69  ng (multiple cli
0330: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ents in this pro
0340: 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 72  cess)..#.# pager
0350: 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e 74  1-3.*: Savepoint
0360: 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a   related tests..
0370: 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a 20  #.# pager1-4.*: 
0380: 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c 61  Hot-journal rela
0390: 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 70  ted tests..#.# p
03a0: 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 73  ager1-5.*: Cases
03b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c 74   related to mult
03c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
03d0: 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a 20  #.# pager1-6.*: 
03e0: 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f  Cases related to
03f0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
0400: 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 67  e_count".#.# pag
0410: 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 73  er1-7.*: Cases s
0420: 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47  pecific to "PRAG
0430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0440: 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 61  TRUNCATE".#.# pa
0450: 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 20  ger1-8.*: Cases 
0460: 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  using temporary 
0470: 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
0480: 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  tabases..#.# pag
0490: 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 72  er1-9.*: Tests r
04a0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  elated to the ba
04b0: 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 61  ckup API..#.# pa
04c0: 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 20  ger1-10.*: Test 
04d0: 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 64  that the assumed
04e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
04f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d 69  tor-size is limi
0500: 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ted to.#        
0510: 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 20        64KB..#.# 
0520: 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 73  pager1-12.*: Tes
0530: 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 52  ts involving "PR
0540: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
0550: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a 3a  #.# pager1-13.*:
0560: 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 20   Cases specific 
0570: 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  to "PRAGMA journ
0580: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
0590: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e 2a  .#.# pager1-14.*
05a0: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
05b0: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
05c0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 0a  nal_mode=OFF".#.
05d0: 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 56  # pager1-15.*: V
05e0: 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76  arying sqlite3_v
05f0: 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 20  fs.szOsFile.#.# 
0600: 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 72  pager1-16.*: Var
0610: 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ying sqlite3_vfs
0620: 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 20  .mxPathname.#.# 
0630: 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 73  pager1-17.*: Tes
0640: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 50  ts related to "P
0650: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
0660: 6f 63 6b 22 0a 23 20 20 20 20 20 20 20 20 20 20  ock".#          
0670: 20 20 20 20 28 54 68 65 20 6f 6d 69 74 5f 72 65      (The omit_re
0680: 61 64 6c 6f 63 6b 20 70 72 61 67 6d 61 20 68 61  adlock pragma ha
0690: 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 61  s been removed a
06a0: 6e 64 20 73 6f 20 68 61 76 65 0a 23 20 20 20 20  nd so have.#    
06b0: 20 20 20 20 20 20 20 20 20 20 74 68 65 73 65 20            these 
06c0: 74 65 73 74 73 2e 29 0a 23 0a 23 20 70 61 67 65  tests.).#.# page
06d0: 72 31 2d 31 38 2e 2a 3a 20 54 65 73 74 20 74 68  r1-18.*: Test th
06e0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  at the pager lay
06f0: 65 72 20 72 65 73 70 6f 6e 64 73 20 63 6f 72 72  er responds corr
0700: 65 63 74 6c 79 20 69 66 20 74 68 65 20 62 2d 74  ectly if the b-t
0710: 72 65 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ree.#           
0720: 20 20 20 72 65 71 75 65 73 74 73 20 61 6e 20 69     requests an i
0730: 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
0740: 65 72 20 28 64 75 65 20 74 6f 20 64 62 20 63 6f  er (due to db co
0750: 72 72 75 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72  rruption)..#..pr
0760: 6f 63 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  oc recursive_sel
0770: 65 63 74 20 7b 69 64 20 74 61 62 6c 65 20 7b 73  ect {id table {s
0780: 63 72 69 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73  cript {}}} {.  s
0790: 65 74 20 63 6e 74 20 30 0a 20 20 64 62 20 65 76  et cnt 0.  db ev
07a0: 61 6c 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64  al "SELECT rowid
07b0: 2c 20 2a 20 46 52 4f 4d 20 24 74 61 62 6c 65 20  , * FROM $table 
07c0: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 28 24  WHERE rowid = ($
07d0: 69 64 2d 31 29 22 20 7b 0a 20 20 20 20 72 65 63  id-1)" {.    rec
07e0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 24 72  ursive_select $r
07f0: 6f 77 69 64 20 24 74 61 62 6c 65 20 24 73 63 72  owid $table $scr
0800: 69 70 74 0a 20 20 20 20 69 6e 63 72 20 63 6e 74  ipt.    incr cnt
0810: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d  .  }.  if {$cnt=
0820: 3d 30 7d 20 7b 20 65 76 61 6c 20 24 73 63 72 69  =0} { eval $scri
0830: 70 74 20 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74  pt }.}..set a_st
0840: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70  ring_counter 1.p
0850: 72 6f 63 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d  roc a_string {n}
0860: 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74   {.  global a_st
0870: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69  ring_counter.  i
0880: 6e 63 72 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75  ncr a_string_cou
0890: 6e 74 65 72 0a 20 20 73 74 72 69 6e 67 20 72 61  nter.  string ra
08a0: 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70 65  nge [string repe
08b0: 61 74 20 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63  at "${a_string_c
08c0: 6f 75 6e 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20  ounter}." $n] 1 
08d0: 24 6e 0a 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73  $n.}.db func a_s
08e0: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a  tring a_string..
08f0: 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
0900: 65 73 74 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72  est tn {..  # Cr
0910: 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  eate and populat
0920: 65 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  e a database tab
0930: 6c 65 20 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74  le using connect
0940: 69 6f 6e 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20  ion [db]. Check 
0950: 0a 20 20 23 20 74 68 61 74 20 63 6f 6e 6e 65 63  .  # that connec
0960: 74 69 6f 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20  tions [db2] and 
0970: 5b 64 62 33 5d 20 63 61 6e 20 73 65 65 20 74 68  [db3] can see th
0980: 65 20 73 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e  e schema and con
0990: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
09a0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
09b0: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   {.    sql1 {.  
09c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
09d0: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
09e0: 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  Y, b);.      CRE
09f0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
0a00: 74 31 28 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  t1(b);.      INS
0a10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0a20: 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e  ES(1, 'one'); IN
0a30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0a40: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
0a50: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
0a60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a70: 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  .2 { sql2 { SELE
0a80: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a90: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20   {1 one 2 two}. 
0aa0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
0ab0: 24 74 6e 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53  $tn.3 { sql3 { S
0ac0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0ad0: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
0ae0: 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 74 72  }..  # Open a tr
0af0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 64  ansaction and ad
0b00: 64 20 61 20 72 6f 77 20 75 73 69 6e 67 20 5b 64  d a row using [d
0b10: 62 5d 2e 20 54 68 69 73 20 70 75 74 73 20 5b 64  b]. This puts [d
0b20: 62 5d 20 69 6e 0a 20 20 23 20 52 45 53 45 52 56  b] in.  # RESERV
0b30: 45 44 20 73 74 61 74 65 2e 20 43 68 65 63 6b 20  ED state. Check 
0b40: 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  that connections
0b50: 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d   [db2] and [db3]
0b60: 20 63 61 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72   can still.  # r
0b70: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
0b80: 20 63 6f 6e 74 65 6e 74 20 61 73 20 69 74 20 77   content as it w
0b90: 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  as before the tr
0ba0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20  ansaction was.  
0bb0: 23 20 6f 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73  # opened. [db] s
0bc0: 68 6f 75 6c 64 20 73 65 65 20 74 68 65 20 69 6e  hould see the in
0bd0: 73 65 72 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a  serted row..  #.
0be0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0bf0: 2d 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c  -$tn.4 {.    sql
0c00: 31 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  1 {.      BEGIN;
0c10: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
0c20: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
0c30: 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20  , 'three');.    
0c40: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0c50: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 35 20  st pager1-$tn.5 
0c60: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0c70: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c80: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0c90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0ca0: 2e 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  .7 { sql1 { SELE
0cb0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0cc0: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20   {1 one 2 two 3 
0cd0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d  three}..  # [db]
0ce0: 20 73 74 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70   still has an op
0cf0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
0d00: 74 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61 74  tion. Check that
0d10: 20 74 68 69 73 20 70 72 65 76 65 6e 74 73 0a 20   this prevents. 
0d20: 20 23 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   # other connect
0d30: 69 6f 6e 73 20 28 73 70 65 63 69 66 69 63 61 6c  ions (specifical
0d40: 6c 79 20 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77  ly [db2]) from w
0d50: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
0d60: 74 61 62 61 73 65 2e 0a 20 20 23 0a 20 20 23 20  tabase..  #.  # 
0d70: 45 76 65 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70  Even if [db2] op
0d80: 65 6e 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ens a transactio
0d90: 6e 20 66 69 72 73 74 2c 20 69 74 20 6d 61 79 20  n first, it may 
0da0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
0db0: 0a 20 20 23 20 64 61 74 61 62 61 73 65 2e 20 41  .  # database. A
0dc0: 66 74 65 72 20 74 68 65 20 61 74 74 65 6d 70 74  fter the attempt
0dd0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64 62   to write the db
0de0: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
0df0: 63 74 69 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32  ction, .  # [db2
0e00: 5d 20 69 73 20 6c 65 66 74 20 77 69 74 68 20 61  ] is left with a
0e10: 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
0e20: 6f 6e 2c 20 62 75 74 20 6e 6f 74 20 61 20 72 65  on, but not a re
0e30: 61 64 2d 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74  ad-lock on.  # t
0e40: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
0e50: 2e 20 53 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74  . So it does not
0e60: 20 70 72 65 76 65 6e 74 20 5b 64 62 5d 20 66 72   prevent [db] fr
0e70: 6f 6d 20 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20  om committing.. 
0e80: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
0e90: 65 72 31 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20  er1-$tn.8 { .   
0ea0: 20 63 73 71 6c 32 20 7b 20 55 50 44 41 54 45 20   csql2 { UPDATE 
0eb0: 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31  t1 SET a = a + 1
0ec0: 30 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61  0 }.  } {1 {data
0ed0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
0ee0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
0ef0: 31 2d 24 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63  1-$tn.9 { .    c
0f00: 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 42 45  sql2 { .      BE
0f10: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
0f20: 45 20 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b  E t1 SET a = a +
0f30: 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   10;.    }.  } {
0f40: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
0f50: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
0f60: 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74  e [db] commit it
0f70: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  s transactions. 
0f80: 43 68 65 63 6b 20 74 68 65 20 6f 74 68 65 72 20  Check the other 
0f90: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a  connections can.
0fa0: 20 20 23 20 6e 6f 77 20 73 65 65 20 74 68 65 20    # now see the 
0fb0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 63 6f 6e  new database con
0fc0: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
0fd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
0fe0: 30 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49  0 { sql1 { COMMI
0ff0: 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  T } } {}.  do_te
1000: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 31  st pager1-$tn.11
1010: 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54   { sql1 { SELECT
1020: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1030: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1040: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1050: 61 67 65 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73  ager1-$tn.12 { s
1060: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
1070: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1080: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1090: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10a0: 31 2d 24 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20  1-$tn.13 { sql3 
10b0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
10c0: 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20  t1 } } {1 one 2 
10d0: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20  two 3 three}..  
10e0: 23 20 43 68 65 63 6b 20 74 68 61 74 2c 20 61 73  # Check that, as
10f0: 20 6e 6f 74 65 64 20 61 62 6f 76 65 2c 20 5b 64   noted above, [d
1100: 62 32 5d 20 72 65 61 6c 6c 79 20 64 69 64 20 6b  b2] really did k
1110: 65 65 70 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  eep an open tran
1120: 73 61 63 74 69 6f 6e 0a 20 20 23 20 61 66 74 65  saction.  # afte
1130: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
1140: 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62   write the datab
1150: 61 73 65 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a  ase failed..  #.
1160: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1170: 2d 24 74 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63  -$tn.14 { .    c
1180: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a  sql2 { BEGIN } .
1190: 20 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73    } {1 {cannot s
11a0: 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
11b0: 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  on within a tran
11c0: 73 61 63 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74  saction}}.  do_t
11d0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
11e0: 35 20 7b 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42  5 { sql2 { ROLLB
11f0: 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20  ACK } } {}..  # 
1200: 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20  Have [db2] open 
1210: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
1220: 64 20 74 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f  d take a read-lo
1230: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1240: 73 65 2e 0a 20 20 23 20 43 68 65 63 6b 20 74 68  se..  # Check th
1250: 61 74 20 74 68 69 73 20 70 72 65 76 65 6e 74 73  at this prevents
1260: 20 5b 64 62 5d 20 66 72 6f 6d 20 77 72 69 74 69   [db] from writi
1270: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1280: 73 65 20 28 6f 75 74 73 69 64 65 0a 20 20 23 20  se (outside.  # 
1290: 6f 66 20 61 6e 79 20 74 72 61 6e 73 61 63 74 69  of any transacti
12a0: 6f 6e 29 2e 20 41 66 74 65 72 20 74 68 69 73 20  on). After this 
12b0: 66 61 69 6c 73 2c 20 63 68 65 63 6b 20 74 68 61  fails, check tha
12c0: 74 20 5b 64 62 33 5d 20 63 61 6e 20 72 65 61 64  t [db3] can read
12d0: 0a 20 20 23 20 74 68 65 20 64 62 20 28 73 68 6f  .  # the db (sho
12e0: 77 69 6e 67 20 74 68 61 74 20 5b 64 62 5d 20 64  wing that [db] d
12f0: 69 64 20 6e 6f 74 20 74 61 6b 65 20 61 20 50 45  id not take a PE
1300: 4e 44 49 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29  NDING lock etc.)
1310: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
1320: 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a  ager1-$tn.15 { .
1330: 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
1340: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1350: 74 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65  t1; }.  } {1 one
1360: 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a   2 two 3 three}.
1370: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1380: 2d 24 74 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63  -$tn.16 { .    c
1390: 73 71 6c 31 20 7b 20 55 50 44 41 54 45 20 74 31  sql1 { UPDATE t1
13a0: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20   SET a = a + 10 
13b0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
13c0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
13d0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
13e0: 24 74 6e 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20  $tn.17 { sql3 { 
13f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1400: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
1410: 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20  o 3 three}..  # 
1420: 54 68 69 73 20 74 69 6d 65 2c 20 68 61 76 65 20  This time, have 
1430: 5b 64 62 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e  [db] open a tran
1440: 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 77  saction before w
1450: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1460: 61 73 65 2e 0a 20 20 23 20 54 68 69 73 20 77 6f  ase..  # This wo
1470: 72 6b 73 20 2d 20 5b 64 62 5d 20 67 65 74 73 20  rks - [db] gets 
1480: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1490: 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 63  which does not c
14a0: 6f 6e 66 6c 69 63 74 20 77 69 74 68 0a 20 20 23  onflict with.  #
14b0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
14c0: 20 5b 64 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e   [db2] is holdin
14d0: 67 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  g..  #.  do_test
14e0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b   pager1-$tn.18 {
14f0: 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20   .    sql1 { .  
1500: 20 20 20 20 42 45 47 49 4e 3b 20 20 0a 20 20 20      BEGIN;  .   
1510: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
1520: 20 61 20 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20   a = a + 10; .  
1530: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
1540: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d  test pager1-$tn-
1550: 31 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b  19 { .    sql1 {
1560: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
1570: 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e  tus } .  } {main
1580: 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63   reserved temp c
1590: 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74  losed}.  do_test
15a0: 20 70 61 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b   pager1-$tn-20 {
15b0: 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 50 52 41   .    sql2 { PRA
15c0: 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20  GMA lock_status 
15d0: 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61  } .  } {main sha
15e0: 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d  red temp closed}
15f0: 0a 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74  ..  # Check that
1600: 20 61 6c 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   all connections
1610: 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20   can still read 
1620: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 4f 6e  the database. On
1630: 6c 79 20 5b 64 62 5d 20 73 65 65 73 0a 20 20 23  ly [db] sees.  #
1640: 20 74 68 65 20 75 70 64 61 74 65 64 20 63 6f 6e   the updated con
1650: 74 65 6e 74 20 28 61 73 20 74 68 65 20 74 72 61  tent (as the tra
1660: 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1670: 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1680: 79 65 74 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  yet)..  #.  do_t
1690: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
16a0: 31 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  1 { sql1 { SELEC
16b0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
16c0: 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31  {11 one 12 two 1
16d0: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
16e0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 32  st pager1-$tn.22
16f0: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1700: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1710: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1720: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1730: 61 67 65 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73  ager1-$tn.23 { s
1740: 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql3 { SELECT * F
1750: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1760: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1770: 0a 0a 20 20 23 20 42 65 63 61 75 73 65 20 5b 64  ..  # Because [d
1780: 62 32 5d 20 73 74 69 6c 6c 20 68 61 73 20 74 68  b2] still has th
1790: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b  e SHARED lock, [
17a0: 64 62 5d 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  db] is unable to
17b0: 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 23 20   commit the.  # 
17c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
17d0: 69 74 20 74 72 69 65 73 2c 20 61 6e 20 65 72 72  it tries, an err
17e0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  or is returned a
17f0: 6e 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  nd the connectio
1800: 6e 20 0a 20 20 23 20 75 70 67 72 61 64 65 73 20  n .  # upgrades 
1810: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
1820: 6b 2e 0a 20 20 23 0a 20 20 23 20 4f 6e 63 65 20  k..  #.  # Once 
1830: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 5b 64  this happens, [d
1840: 62 5d 20 63 61 6e 20 72 65 61 64 20 74 68 65 20  b] can read the 
1850: 64 61 74 61 62 61 73 65 20 61 6e 64 20 73 65 65  database and see
1860: 20 74 68 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74   the new content
1870: 2c 0a 20 20 23 20 5b 64 62 32 5d 20 28 73 74 69  ,.  # [db2] (sti
1880: 6c 6c 20 68 6f 6c 64 69 6e 67 20 53 48 41 52 45  ll holding SHARE
1890: 44 29 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61  D) can still rea
18a0: 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e  d the old conten
18b0: 74 2c 20 62 75 74 20 5b 64 62 33 5d 0a 20 20 23  t, but [db3].  #
18c0: 20 28 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e   (not holding an
18d0: 79 20 6c 6f 63 6b 29 20 69 73 20 70 72 65 76 65  y lock) is preve
18e0: 6e 74 65 64 20 62 79 20 5b 64 62 5d 27 73 20 50  nted by [db]'s P
18f0: 45 4e 44 49 4e 47 20 66 72 6f 6d 20 72 65 61 64  ENDING from read
1900: 69 6e 67 0a 20 20 23 20 74 68 65 20 64 61 74 61  ing.  # the data
1910: 62 61 73 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  base..  #.  do_t
1920: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1930: 34 20 7b 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d  4 { csql1 { COMM
1940: 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  IT } } {1 {datab
1950: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
1960: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1970: 2d 24 74 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73  -$tn-25 { .    s
1980: 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63  ql1 { PRAGMA loc
1990: 6b 5f 73 74 61 74 75 73 20 7d 20 0a 20 20 7d 20  k_status } .  } 
19a0: 7b 6d 61 69 6e 20 70 65 6e 64 69 6e 67 20 74 65  {main pending te
19b0: 6d 70 20 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f  mp closed}.  do_
19c0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
19d0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  26 { sql1 { SELE
19e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
19f0: 7d 20 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f  } {11 one 12 two
1a00: 20 31 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   13 three}.  do_
1a10: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1a20: 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  27 { sql2 { SELE
1a30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
1a40: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
1a50: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1a60: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1a70: 7b 20 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54  { csql3 { SELECT
1a80: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1a90: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1aa0: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
1ab0: 65 20 5b 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69  e [db2] commit i
1ac0: 74 73 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ts read transact
1ad0: 69 6f 6e 2c 20 72 65 6c 65 61 73 69 6e 67 20 74  ion, releasing t
1ae0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69  he SHARED lock i
1af0: 74 0a 20 20 23 20 69 73 20 68 6f 6c 64 69 6e 67  t.  # is holding
1b00: 2e 20 4e 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b  . Now, neither [
1b10: 64 62 32 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d  db2] nor [db3] m
1b20: 61 79 20 72 65 61 64 20 74 68 65 20 64 61 74 61  ay read the data
1b30: 62 61 73 65 20 28 61 73 20 5b 64 62 5d 0a 20 20  base (as [db].  
1b40: 23 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  # is still holdi
1b50: 6e 67 20 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20  ng a PENDING).. 
1b60: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
1b70: 65 72 31 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c  er1-$tn.29 { sql
1b80: 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b  2 { COMMIT } } {
1b90: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1ba0: 72 31 2d 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c  r1-$tn.30 { csql
1bb0: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
1bc0: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1bd0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1be0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1bf0: 72 31 2d 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c  r1-$tn.31 { csql
1c00: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
1c10: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1c20: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1c30: 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 69 73 20 6e  }..  # [db] is n
1c40: 6f 77 20 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69  ow able to commi
1c50: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1c60: 6e 2e 20 4f 6e 63 65 20 74 68 65 20 74 72 61 6e  n. Once the tran
1c70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 20 20 23 20  saction is .  # 
1c80: 63 6f 6d 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74  committed, all t
1c90: 68 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  hree connections
1ca0: 20 63 61 6e 20 72 65 61 64 20 74 68 65 20 6e 65   can read the ne
1cb0: 77 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20  w content..  #. 
1cc0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1cd0: 24 74 6e 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20  $tn.25 { sql1 { 
1ce0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
1cf0: 3d 20 61 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20  = a+10 } } {}.  
1d00: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1d10: 74 6e 2e 32 36 20 7b 20 73 71 6c 31 20 7b 20 43  tn.26 { sql1 { C
1d20: 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64  OMMIT } } {}.  d
1d30: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1d40: 6e 2e 32 37 20 7b 20 73 71 6c 31 20 7b 20 53 45  n.27 { sql1 { SE
1d50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1d60: 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77   } {21 one 22 tw
1d70: 6f 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f  o 23 three}.  do
1d80: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1d90: 2e 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c  .27 { sql2 { SEL
1da0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
1db0: 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f  } {21 one 22 two
1dc0: 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   23 three}.  do_
1dd0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1de0: 32 38 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  28 { sql3 { SELE
1df0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
1e00: 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20   {21 one 22 two 
1e10: 32 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 49  23 three}..  # I
1e20: 6e 73 74 61 6c 6c 20 61 20 62 75 73 79 2d 68 61  nstall a busy-ha
1e30: 6e 64 6c 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63  ndler for connec
1e40: 74 69 6f 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20  tion [db]..  #. 
1e50: 20 73 65 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69   set ::nbusy [li
1e60: 73 74 5d 0a 20 20 70 72 6f 63 20 62 75 73 79 20  st].  proc busy 
1e70: 7b 6e 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  {n} {.    lappen
1e80: 64 20 3a 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20  d ::nbusy $n.   
1e90: 20 69 66 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c   if {$n>5} { sql
1ea0: 32 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72  2 COMMIT }.    r
1eb0: 65 74 75 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62  eturn 0.  }.  db
1ec0: 20 62 75 73 79 20 62 75 73 79 0a 0a 20 20 64 6f   busy busy..  do
1ed0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1ee0: 2e 32 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20  .29 { .    sql1 
1ef0: 7b 20 42 45 47 49 4e 20 3b 20 49 4e 53 45 52 54  { BEGIN ; INSERT
1f00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1f10: 27 78 27 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d  'x', 'y') } .  }
1f20: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
1f30: 67 65 72 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20  ger1-$tn.30 { . 
1f40: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 20     sql2 { BEGIN 
1f50: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1f60: 74 31 20 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e  t1 } .  } {21 on
1f70: 65 20 32 32 20 74 77 6f 20 32 33 20 74 68 72 65  e 22 two 23 thre
1f80: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  e}.  do_test pag
1f90: 65 72 31 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c  er1-$tn.31 { sql
1fa0: 31 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20  1 COMMIT } {}.  
1fb0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1fc0: 74 6e 2e 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62  tn.32 { set ::nb
1fd0: 75 73 79 20 7d 20 7b 30 20 31 20 32 20 33 20 34  usy } {0 1 2 3 4
1fe0: 20 35 20 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   5 6}.}..#------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 0a 23 20 53 61 76 65 70 6f 69 6e 74 20  ---.# Savepoint 
2040: 72 65 6c 61 74 65 64 20 74 65 73 74 20 63 61 73  related test cas
2050: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 33  es..#.# pager1-3
2060: 2e 31 2e 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20  .1.2.*: Force a 
2070: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
2080: 63 6b 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ck to cause the 
2090: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20  database file.# 
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 74 6f 20 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67  to grow..#.# pag
20c0: 65 72 31 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65  er1-3.1.3.*: Use
20d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
20e0: 65 64 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ed in synchronou
20f0: 73 3d 6f 66 66 20 6d 6f 64 65 20 61 73 20 70 61  s=off mode as pa
2100: 72 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  rt.#            
2110: 20 20 20 20 20 6f 66 20 61 20 73 61 76 65 70 6f       of a savepo
2120: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20  int rollback..# 
2130: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
2140: 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  3.1.1 {.  faults
2150: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
2160: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
2170: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2180: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
2190: 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  EY, b);.    CREA
21a0: 54 45 20 54 41 42 4c 45 20 63 6f 75 6e 74 65 72  TE TABLE counter
21b0: 28 0a 20 20 20 20 20 20 69 20 43 48 45 43 4b 20  (.      i CHECK 
21c0: 28 69 3c 35 29 2c 20 0a 20 20 20 20 20 20 75 20  (i<5), .      u 
21d0: 43 48 45 43 4b 20 28 75 3c 31 30 29 0a 20 20 20  CHECK (u<10).   
21e0: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
21f0: 4e 54 4f 20 63 6f 75 6e 74 65 72 20 56 41 4c 55  NTO counter VALU
2200: 45 53 28 30 2c 20 30 29 3b 0a 20 20 20 20 43 52  ES(0, 0);.    CR
2210: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31  EATE TRIGGER tr1
2220: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
2230: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
2240: 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72 20 53  UPDATE counter S
2250: 45 54 20 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20  ET i = i+1;.    
2260: 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20  END;.    CREATE 
2270: 54 52 49 47 47 45 52 20 74 72 32 20 41 46 54 45  TRIGGER tr2 AFTE
2280: 52 20 55 50 44 41 54 45 20 4f 4e 20 74 31 20 42  R UPDATE ON t1 B
2290: 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54  EGIN.      UPDAT
22a0: 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20 75 20  E counter SET u 
22b0: 3d 20 75 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a  = u+1;.    END;.
22c0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
22d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f  SELECT * FROM co
22e0: 75 6e 74 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a  unter }.} {0 0}.
22f0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2300: 20 70 61 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a   pager1-3.1.2 {.
2310: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
2320: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49  ize = 10;.  BEGI
2330: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
2340: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
2350: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2360: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2370: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
2380: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2390: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
23a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
23b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
23c0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
23d0: 46 52 4f 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20  FROM counter;.} 
23e0: 7b 33 20 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71  {3 0}.do_catchsq
23f0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2400: 31 2e 33 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  1.3 {.    INSERT
2410: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2420: 61 2b 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  a+3, randomblob(
2430: 31 35 30 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20  1500) FROM t1.} 
2440: 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66  {1 {constraint f
2450: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73  ailed}}.do_execs
2460: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2470: 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .4 { SELECT * FR
2480: 4f 4d 20 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20  OM counter } {3 
2490: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
24a0: 73 74 20 70 61 67 65 72 31 2d 33 2e 35 20 7b 20  st pager1-3.5 { 
24b0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
24c0: 20 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78   } {1 2 3}.do_ex
24d0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
24e0: 31 2d 33 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d  1-3.6 { COMMIT }
24f0: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e   {}..foreach {tn
2500: 20 73 71 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20   sql tcl} {.  7 
2510: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2520: 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b  onous = NORMAL ;
2530: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
2540: 72 65 20 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74  re = 0 } {.    t
2550: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
2560: 6c 74 20 31 0a 20 20 20 20 74 76 20 64 65 76 63  lt 1.    tv devc
2570: 68 61 72 20 73 61 66 65 5f 61 70 70 65 6e 64 0a  har safe_append.
2580: 20 20 7d 0a 20 20 38 20 20 7b 20 50 52 41 47 4d    }.  8  { PRAGM
2590: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
25a0: 4e 4f 52 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20  NORMAL ; PRAGMA 
25b0: 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d  temp_store = 2 }
25c0: 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74   {.    testvfs t
25d0: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20  v -default 1.   
25e0: 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71 75   tv devchar sequ
25f0: 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20  ential.  }.  9  
2600: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2610: 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20  nous = FULL } { 
2620: 7d 0a 20 20 31 30 20 7b 20 50 52 41 47 4d 41 20  }.  10 { PRAGMA 
2630: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f  synchronous = NO
2640: 52 4d 41 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20  RMAL } { }.  11 
2650: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2660: 6e 6f 75 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d  nous = OFF } { }
2670: 0a 20 20 31 32 20 7b 20 50 52 41 47 4d 41 20 73  .  12 { PRAGMA s
2680: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c  ynchronous = FUL
2690: 4c 20 3b 20 50 52 41 47 4d 41 20 66 75 6c 6c 66  L ; PRAGMA fullf
26a0: 73 79 6e 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20  sync = 1 } { }. 
26b0: 20 31 33 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   13 { PRAGMA syn
26c0: 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20  chronous = FULL 
26d0: 7d 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20  } {.    testvfs 
26e0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
26f0: 20 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71    tv devchar seq
2700: 75 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34  uential.  }.  14
2710: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
2720: 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49  g_mode = EXCLUSI
2730: 56 45 20 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20  VE } {.  }.} {. 
2740: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
2750: 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76  3.$tn.1 {.    ev
2760: 61 6c 20 24 74 63 6c 0a 20 20 20 20 66 61 75 6c  al $tcl.    faul
2770: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
2780: 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75  reopen.    db fu
2790: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
27a0: 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c  ring.    execsql
27b0: 20 24 73 71 6c 0a 20 20 20 20 65 78 65 63 73 71   $sql.    execsq
27c0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
27d0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32   auto_vacuum = 2
27e0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63  ;.      PRAGMA c
27f0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
2800: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
2810: 4c 45 20 7a 28 78 20 49 4e 54 45 47 45 52 20 50  LE z(x INTEGER P
2820: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
2830: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
2840: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2850: 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20   z VALUES(NULL, 
2860: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
2870: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2880: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
2890: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
28a0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
28b0: 20 20 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45    2.        INSE
28c0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
28d0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
28e0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
28f0: 20 2d 2d 20 20 20 34 0a 20 20 20 20 20 20 20 20   --   4.        
2900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2910: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2920: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2930: 20 20 20 20 20 2d 2d 20 20 20 38 0a 20 20 20 20       --   8.    
2940: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2950: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2960: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2970: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a  M z;     --  16.
2980: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2990: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
29a0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
29b0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
29c0: 20 33 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45   32.        INSE
29d0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
29e0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
29f0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
2a00: 20 2d 2d 20 20 36 34 0a 20 20 20 20 20 20 20 20   --  64.        
2a10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2a20: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2a30: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2a40: 20 20 20 20 20 2d 2d 20 31 32 38 0a 20 20 20 20       -- 128.    
2a50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2a60: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2a70: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2a80: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a  M z;     -- 256.
2a90: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
2aa0: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
2ab0: 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61  { PRAGMA auto_va
2ac0: 63 75 75 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20  cuum }.  } {2}. 
2ad0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2ae0: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20   pager1-3.$tn.2 
2af0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
2b00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
2b10: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
2b20: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
2b30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2b40: 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61  z VALUES(NULL, a
2b50: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
2b60: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
2b70: 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41  ne;.        UPDA
2b80: 54 45 20 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c  TE z SET y = NUL
2b90: 4c 20 57 48 45 52 45 20 78 3e 32 35 36 3b 0a 20  L WHERE x>256;. 
2ba0: 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e         PRAGMA in
2bb0: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
2bc0: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
2bd0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a   count(*) FROM z
2be0: 20 57 48 45 52 45 20 78 20 3c 20 31 30 30 3b 0a   WHERE x < 100;.
2bf0: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
2c00: 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49  O one;.    COMMI
2c10: 54 3b 0a 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64  T;.  } {99}..  d
2c20: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
2c30: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a  ager1-3.$tn.3 {.
2c40: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2c50: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
2c60: 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20 7a          UPDATE z
2c70: 20 53 45 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20   SET y = y||x;. 
2c80: 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
2c90: 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   one;.    COMMIT
2ca0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
2cb0: 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20  nt(*) FROM z;.  
2cc0: 7d 20 7b 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78  } {258}..  do_ex
2cd0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
2ce0: 31 2d 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20  1-3.$tn.4 {.    
2cf0: 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20  SAVEPOINT one;. 
2d00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2d10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2d20: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
2d30: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  .  } {}.  do_exe
2d40: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
2d50: 2d 33 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53  -3.$tn.5 {.    S
2d60: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2d70: 52 4f 4d 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41  ROM z;.    RELEA
2d80: 53 45 20 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47  SE one;.    PRAG
2d90: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2da0: 63 6b 3b 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d  ck;.  } {258 ok}
2db0: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
2dc0: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e  est pager1-3.$tn
2dd0: 2e 36 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49  .6 {.    SAVEPOI
2de0: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45  NT one;.    RELE
2df0: 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a  ASE one;.  } {}.
2e00: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61  .  db close.  ca
2e10: 74 63 68 20 7b 20 74 76 20 64 65 6c 65 74 65 20  tch { tv delete 
2e20: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2e70: 23 20 48 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  # Hot journal ro
2e80: 6c 6c 62 61 63 6b 20 72 65 6c 61 74 65 64 20 74  llback related t
2e90: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70  est cases..#.# p
2ea0: 61 67 65 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73  ager1.4.1.*: Tes
2eb0: 74 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  t that the pager
2ec0: 20 6d 6f 64 75 6c 65 20 64 65 6c 65 74 65 73 20   module deletes 
2ed0: 76 65 72 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c  very small inval
2ee0: 69 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  id.#            
2ef0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73     journal files
2f00: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 32  ..#.# pager1.4.2
2f10: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66  .*: Test that if
2f20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2f30: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 74 20 74  nal pointer at t
2f40: 68 65 20 65 6e 64 20 6f 66 20 61 0a 23 20 20 20  he end of a.#   
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 74 2d              hot-
2f60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 70 70  journal file app
2f70: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
2f80: 70 74 20 28 63 68 65 63 6b 73 75 6d 20 64 6f 65  pt (checksum doe
2f90: 73 20 6e 6f 74 0a 23 20 20 20 20 20 20 20 20 20  s not.#         
2fa0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 29 20 74        compute) t
2fb0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f  he associated jo
2fc0: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
2fd0: 62 61 63 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20  back (and no.#  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 41 63               xAc
2ff0: 63 65 73 73 28 29 20 63 61 6c 6c 20 74 6f 20 63  cess() call to c
3000: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 70 72 65  heck for the pre
3010: 73 65 6e 63 65 20 6f 66 20 61 6e 79 20 6d 61 73  sence of any mas
3020: 74 65 72 20 0a 23 20 20 20 20 20 20 20 20 20 20  ter .#          
3030: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
3040: 65 20 69 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20  e is made)..#.# 
3050: 70 61 67 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65  pager1.4.3.*: Te
3060: 73 74 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  st that the cont
3070: 65 6e 74 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  ents of a hot-jo
3080: 75 72 6e 61 6c 20 61 72 65 20 69 67 6e 6f 72 65  urnal are ignore
3090: 64 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20  d if the.#      
30a0: 20 20 20 20 20 20 20 20 20 70 61 67 65 2d 73 69           page-si
30b0: 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a  ze or sector-siz
30c0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
30d0: 20 68 65 61 64 65 72 20 61 70 70 65 61 72 20 74   header appear t
30e0: 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  o.#             
30f0: 20 20 62 65 20 69 6e 76 61 6c 69 64 20 28 74 6f    be invalid (to
3100: 6f 20 6c 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61  o large, too sma
3110: 6c 6c 20 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65  ll or not a powe
3120: 72 20 6f 66 20 32 29 2e 0a 23 0a 23 20 70 61 67  r of 2)..#.# pag
3130: 65 72 31 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20  er1.4.4.*: Test 
3140: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3150: 62 61 63 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  back of journal 
3160: 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 73 74  file with a mast
3170: 65 72 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  er.#            
3180: 20 20 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74     journal point
3190: 65 72 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  er generated in 
31a0: 76 61 72 69 6f 75 73 20 22 50 52 41 47 4d 41 20  various "PRAGMA 
31b0: 73 79 6e 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20  synchronous".#  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64               mod
31d0: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34  es..#.# pager1.4
31e0: 2e 35 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .5.*: Test that 
31f0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3200: 62 61 63 6b 20 73 74 6f 70 73 20 69 66 20 69 74  back stops if it
3210: 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 0a 23 20   encounters a.# 
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
3230: 75 72 6e 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72  urnal-record for
3240: 20 77 68 69 63 68 20 74 68 65 20 63 68 65 63 6b   which the check
3250: 73 75 6d 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70  sum fails..#.# p
3260: 61 67 65 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73  ager1.4.6.*: Tes
3270: 74 20 74 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c  t that when roll
3280: 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
3290: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74  ournal that cont
32a0: 61 69 6e 73 20 61 0a 23 20 20 20 20 20 20 20 20  ains a.#        
32b0: 20 20 20 20 20 20 20 6d 61 73 74 65 72 20 6a 6f         master jo
32c0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74  urnal pointer, t
32d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
32e0: 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65  l file is delete
32f0: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
3300: 20 20 61 66 74 65 72 20 61 6c 6c 20 74 68 65 20    after all the 
3310: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61  hot-journals tha
3320: 74 20 72 65 66 65 72 20 74 6f 20 69 74 20 61 72  t refer to it ar
3330: 65 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70  e deleted..#.# p
3340: 61 67 65 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73  ager1.4.7.*: Tes
3350: 74 20 74 68 61 74 20 69 66 20 61 20 68 6f 74 2d  t that if a hot-
3360: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
3370: 73 74 73 20 62 75 74 20 61 20 63 6c 69 65 6e 74  sts but a client
3380: 20 63 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20   can.#          
3390: 20 20 20 20 20 6f 70 65 6e 20 69 74 20 66 6f 72       open it for
33a0: 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74   reading only, t
33b0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
33c0: 6f 74 20 62 65 20 61 63 63 65 73 73 65 64 20 61  ot be accessed a
33d0: 6e 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  nd.#            
33e0: 20 20 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50     SQLITE_CANTOP
33f0: 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EN is returned..
3400: 23 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  # .do_test pager
3410: 31 2e 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c  1.4.1.1 {.  faul
3420: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
3430: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
3440: 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54   { .    CREATE T
3450: 41 42 4c 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20  ABLE x(y, z);.  
3460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20    INSERT INTO x 
3470: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
3480: 7d 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  }.  set fd [open
3490: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34a0: 20 77 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65   w].  puts -none
34b0: 77 6c 69 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f  wline $fd "hello
34c0: 77 6f 72 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24  world".  close $
34d0: 66 64 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73  fd.  file exists
34e0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34f0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {1}.do_test p
3500: 61 67 65 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78  ager1.4.1.2 { ex
3510: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
3520: 20 46 52 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32   FROM x } } {1 2
3530: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
3540: 2e 34 2e 31 2e 33 20 7b 20 66 69 6c 65 20 65 78  .4.1.3 { file ex
3550: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
3560: 72 6e 61 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65  rnal } {0}..# Se
3570: 74 20 75 70 20 61 20 5b 74 65 73 74 76 66 73 5d  t up a [testvfs]
3580: 20 74 6f 20 73 6e 61 70 73 68 6f 74 20 74 68 65   to snapshot the
3590: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73   file-system jus
35a0: 74 20 62 65 66 6f 72 65 20 53 51 4c 69 74 65 0a  t before SQLite.
35b0: 23 20 64 65 6c 65 74 65 73 20 74 68 65 20 6d 61  # deletes the ma
35c0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20  ster-journal to 
35d0: 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66  commit a multi-f
35e0: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ile transaction.
35f0: 0a 23 0a 23 20 49 6e 20 73 75 62 73 65 71 75 65  .#.# In subseque
3600: 6e 74 20 74 65 73 74 20 63 61 73 65 73 2c 20 69  nt test cases, i
3610: 6e 76 6f 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69  nvoking [faultsi
3620: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3630: 6f 70 65 6e 5d 20 73 65 74 73 0a 23 20 75 70 20  open] sets.# up 
3640: 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
3650: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64  to contain two d
3660: 61 74 61 62 61 73 65 73 2c 20 74 77 6f 20 68 6f  atabases, two ho
3670: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t-journal files 
3680: 61 6e 64 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a  and.# a master-j
3690: 6f 75 72 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73  ournal..#.do_tes
36a0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b  t pager1.4.2.1 {
36b0: 0a 20 20 74 65 73 74 76 66 73 20 74 73 74 76 66  .  testvfs tstvf
36c0: 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74  s -default 1.  t
36d0: 73 74 76 66 73 20 66 69 6c 74 65 72 20 78 44 65  stvfs filter xDe
36e0: 6c 65 74 65 0a 20 20 74 73 74 76 66 73 20 73 63  lete.  tstvfs sc
36f0: 72 69 70 74 20 78 44 65 6c 65 74 65 43 61 6c 6c  ript xDeleteCall
3700: 62 61 63 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c  back.  proc xDel
3710: 65 74 65 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74  eteCallback {met
3720: 68 6f 64 20 66 69 6c 65 20 61 72 67 73 7d 20 7b  hod file args} {
3730: 0a 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b 66  .    set file [f
3740: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a  ile tail $file].
3750: 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67      if { [string
3760: 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c   match *mj* $fil
3770: 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f  e] } { faultsim_
3780: 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75  save }.  }.  fau
3790: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
37a0: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
37b0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
37c0: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
37d0: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
37e0: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
37f0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
3800: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
3810: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
3820: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3830: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e  .    PRAGMA aux.
3840: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3850: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3860: 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62  E t1(a UNIQUE, b
3870: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52   UNIQUE);.    CR
3880: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
3890: 32 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  2(a UNIQUE, b UN
38a0: 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52  IQUE);.    INSER
38b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
38c0: 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20  (a_string(200), 
38d0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a  a_string(300));.
38e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
38f0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3900: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3910: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3920: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3930: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3940: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3950: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3960: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3970: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
3980: 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   t1;.    BEGIN;.
3990: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
39a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
39b0: 72 69 6e 67 28 32 30 31 29 2c 20 61 5f 73 74 72  ring(201), a_str
39c0: 69 6e 67 28 33 30 31 29 20 46 52 4f 4d 20 74 31  ing(301) FROM t1
39d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
39e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
39f0: 73 74 72 69 6e 67 28 32 30 32 29 2c 20 61 5f 73  string(202), a_s
3a00: 74 72 69 6e 67 28 33 30 32 29 20 46 52 4f 4d 20  tring(302) FROM 
3a10: 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t1;.      INSERT
3a20: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3a30: 61 5f 73 74 72 69 6e 67 28 32 30 33 29 2c 20 61  a_string(203), a
3a40: 5f 73 74 72 69 6e 67 28 33 30 33 29 20 46 52 4f  _string(303) FRO
3a50: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
3a60: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
3a70: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 34 29 2c  T a_string(204),
3a80: 20 61 5f 73 74 72 69 6e 67 28 33 30 34 29 20 46   a_string(304) F
3a90: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 45  ROM t1;.      RE
3aa0: 50 4c 41 43 45 20 49 4e 54 4f 20 74 32 20 53 45  PLACE INTO t2 SE
3ab0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
3ac0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
3ad0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73 74    db close.  tst
3ae0: 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a  vfs delete.} {}.
3af0: 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74  .if {$::tcl_plat
3b00: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d  form(platform)!=
3b10: 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 64 6f 5f  "windows"} {.do_
3b20: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3b30: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
3b40: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3b50: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3b60: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3b70: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3b80: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3b90: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3ba0: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
3bb0: 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75  r1.4.2.3 {.  fau
3bc0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
3bd0: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
3be0: 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e  ch f [glob test.
3bf0: 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64  db-mj*] { forced
3c00: 65 6c 65 74 65 20 24 66 20 7d 0a 20 20 65 78 65  elete $f }.  exe
3c10: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3c20: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3c30: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3c40: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3c50: 20 20 7d 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f    }.} {64 ok}.do
3c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32  _test pager1.4.2
3c70: 2e 34 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .4 {.  faultsim_
3c80: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
3c90: 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  en.  hexio_write
3ca0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3cb0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
3cc0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
3cd0: 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20  l]-20] 123456.  
3ce0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3cf0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
3d00: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
3d10: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
3d20: 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a  k;.  }.} {4 ok}.
3d30: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
3d40: 2e 32 2e 35 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.5 {.  faultsi
3d50: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3d60: 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69  open.  hexio_wri
3d70: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
3d80: 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  al [expr [file s
3d90: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
3da0: 6e 61 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a  nal]-20] 123456.
3db0: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
3dc0: 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b  b test.db-mj*] {
3dd0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 66 20   forcedelete $f 
3de0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3df0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3e00: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3e10: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3e20: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3e30: 6f 6b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  ok}.}..do_test p
3e40: 61 67 65 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20  ager1.4.3.1 {.  
3e50: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3e60: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3e70: 66 73 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a  fs filter xSync.
3e80: 20 20 74 73 74 76 66 73 20 73 63 72 69 70 74 20    tstvfs script 
3e90: 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20  xSyncCallback.  
3ea0: 70 72 6f 63 20 78 53 79 6e 63 43 61 6c 6c 62 61  proc xSyncCallba
3eb0: 63 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20  ck {method file 
3ec0: 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20  args} {.    set 
3ed0: 66 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  file [file tail 
3ee0: 24 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20  $file].    if { 
3ef0: 30 3d 3d 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  0==[string match
3f00: 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d   *journal $file]
3f10: 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61   } { faultsim_sa
3f20: 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74  ve }.  }.  fault
3f30: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
3f40: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3f50: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
3f60: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
3f70: 54 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  TE;.    CREATE T
3f80: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
3f90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3fa0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
3fb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3fc0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
3fd0: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
3fe0: 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a    tstvfs delete.
3ff0: 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  } {}..foreach {t
4000: 6e 20 6f 66 73 74 20 76 61 6c 75 65 20 72 65 73  n ofst value res
4010: 75 6c 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ult} {.         
4020: 20 32 20 20 20 32 30 20 20 20 20 33 31 20 20 20   2   20    31   
4030: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
4040: 20 20 20 20 20 20 20 20 33 20 20 20 32 30 20 20          3   20  
4050: 20 20 33 32 20 20 20 20 20 20 20 7b 31 20 32 20    32       {1 2 
4060: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 34  3 4}.          4
4070: 20 20 20 32 30 20 20 20 20 33 33 20 20 20 20 20     20    33     
4080: 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20    {1 2 3 4}.    
4090: 20 20 20 20 20 20 35 20 20 20 32 30 20 20 20 20        5   20    
40a0: 36 35 35 33 36 20 20 20 20 7b 31 20 32 20 33 20  65536    {1 2 3 
40b0: 34 7d 0a 20 20 20 20 20 20 20 20 20 20 36 20 20  4}.          6  
40c0: 20 32 30 20 20 20 20 31 33 31 30 37 32 20 20 20   20    131072   
40d0: 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 20 20 20  {1 2 3 4}..     
40e0: 20 20 20 20 20 37 20 20 20 32 34 20 20 20 20 35       7   24    5
40f0: 31 31 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  11      {1 2 3 4
4100: 7d 0a 20 20 20 20 20 20 20 20 20 20 38 20 20 20  }.          8   
4110: 32 34 20 20 20 20 35 31 33 20 20 20 20 20 20 7b  24    513      {
4120: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4130: 20 20 20 39 20 20 20 32 34 20 20 20 20 31 33 31     9   24    131
4140: 30 37 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  072   {1 2 3 4}.
4150: 0a 20 20 20 20 20 20 20 20 20 31 30 20 20 20 33  .         10   3
4160: 32 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31  2    65536    {1
4170: 20 32 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   2}.} {.  do_tes
4180: 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e  t pager1.4.3.$tn
4190: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
41a0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
41b0: 65 6e 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69  en.    hexio_wri
41c0: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
41d0: 61 6c 20 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74  al $ofst [format
41e0: 20 25 2e 38 78 20 24 76 61 6c 75 65 5d 0a 20 20   %.8x $value].  
41f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
4200: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
4210: 20 7d 20 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20   } $result.}.db 
4220: 63 6c 6f 73 65 0a 0a 23 20 53 65 74 20 75 70 20  close..# Set up 
4230: 61 20 56 46 53 20 74 68 61 74 20 73 6e 61 70 73  a VFS that snaps
4240: 68 6f 74 73 20 74 68 65 20 66 69 6c 65 2d 73 79  hots the file-sy
4250: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
4260: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
4270: 6c 0a 23 20 66 69 6c 65 20 69 73 20 64 65 6c 65  l.# file is dele
4280: 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20  ted to commit a 
4290: 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
42a0: 61 63 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63  action. Specific
42b0: 61 6c 6c 79 2c 20 74 68 65 0a 23 20 66 69 6c 65  ally, the.# file
42c0: 2d 73 79 73 74 65 6d 20 69 73 20 73 61 76 65 64  -system is saved
42d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
42e0: 20 78 44 65 6c 65 74 65 28 29 20 63 61 6c 6c 20   xDelete() call 
42f0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 0a 23  to remove the .#
4300: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4310: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69  file from the fi
4320: 6c 65 2d 73 79 73 74 65 6d 2e 0a 23 0a 73 65 74  le-system..#.set
4330: 20 70 77 64 20 5b 67 65 74 5f 70 77 64 5d 0a 74   pwd [get_pwd].t
4340: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
4350: 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 20 63  lt 1.tv script c
4360: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
4370: 0a 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  .set ::mj_filena
4380: 6d 65 5f 6c 65 6e 67 74 68 20 30 0a 70 72 6f 63  me_length 0.proc
4390: 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65   copy_on_mj_dele
43a0: 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  te {method filen
43b0: 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66  ame args} {.  if
43c0: 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
43d0: 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20  *mj* [file tail 
43e0: 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a  $filename]]} { .
43f0: 20 20 20 20 23 0a 20 20 20 20 23 20 4e 4f 54 45      #.    # NOTE
4400: 3a 20 49 73 20 74 68 65 20 66 69 6c 65 20 6e 61  : Is the file na
4410: 6d 65 20 72 65 6c 61 74 69 76 65 3f 20 20 49 66  me relative?  If
4420: 20 73 6f 2c 20 61 64 64 20 74 68 65 20 6c 65 6e   so, add the len
4430: 67 74 68 20 6f 66 20 74 68 65 20 63 75 72 72 65  gth of the curre
4440: 6e 74 0a 20 20 20 20 23 20 20 20 20 20 20 20 64  nt.    #       d
4450: 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 23 0a  irectory..    #.
4460: 20 20 20 20 69 66 20 7b 5b 69 73 5f 72 65 6c 61      if {[is_rela
4470: 74 69 76 65 5f 66 69 6c 65 20 24 66 69 6c 65 6e  tive_file $filen
4480: 61 6d 65 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65  ame]} {.      se
4490: 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f  t ::mj_filename_
44a0: 6c 65 6e 67 74 68 20 5c 0a 20 20 20 20 20 20 20  length \.       
44b0: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
44c0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65  length $filename
44d0: 5d 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  ] + [string leng
44e0: 74 68 20 24 3a 3a 70 77 64 5d 7d 5d 0a 20 20 20  th $::pwd]}].   
44f0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
4500: 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  set ::mj_filenam
4510: 65 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67  e_length [string
4520: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d   length $filenam
4530: 65 5d 0a 20 20 20 20 7d 0a 20 20 20 20 66 61 75  e].    }.    fau
4540: 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d 0a  ltsim_save .  }.
4550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4560: 4f 4b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  OK.}..foreach {t
4570: 6e 31 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b 20  n1 tcl} {.  1 { 
4580: 73 65 74 20 70 72 65 66 69 78 20 22 74 65 73 74  set prefix "test
4590: 2e 64 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20 20  .db" }.  2 { .  
45a0: 20 20 23 20 54 68 69 73 20 74 65 73 74 20 64 65    # This test de
45b0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e 64  pends on the und
45c0: 65 72 6c 79 69 6e 67 20 56 46 53 20 62 65 69 6e  erlying VFS bein
45d0: 67 20 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 70  g able to open p
45e0: 61 74 68 73 0a 20 20 20 20 23 20 35 31 32 20 62  aths.    # 512 b
45f0: 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
4600: 54 68 65 20 69 64 65 61 20 69 73 20 74 6f 20 63  The idea is to c
4610: 72 65 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75 72  reate a hot-jour
4620: 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 0a 20 20  nal file that.  
4630: 20 20 23 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d    # contains a m
4640: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
4650: 69 6e 74 65 72 20 73 6f 20 6c 61 72 67 65 20 74  inter so large t
4660: 68 61 74 20 69 74 20 63 6f 75 6c 64 20 63 6f 6e  hat it could con
4670: 74 61 69 6e 0a 20 20 20 20 23 20 61 20 76 61 6c  tain.    # a val
4680: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 20 28  id page record (
4690: 69 66 20 74 68 65 20 66 69 6c 65 20 70 61 67 65  if the file page
46a0: 2d 73 69 7a 65 20 69 73 20 35 31 32 20 62 79 74  -size is 512 byt
46b0: 65 73 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20 20  es). So as to.  
46c0: 20 20 23 20 6d 61 6b 65 20 73 75 72 65 20 53 51    # make sure SQ
46d0: 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 67 65 74  Lite doesn't get
46e0: 20 63 6f 6e 66 75 73 65 64 20 62 79 20 74 68 69   confused by thi
46f0: 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74  s..    #.    set
4700: 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20   nPadding [expr 
4710: 35 31 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65  511 - $::mj_file
4720: 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20 20  name_length].   
4730: 20 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f   if {$tcl_platfo
4740: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 77  rm(platform)=="w
4750: 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20 20  indows"} {.     
4760: 20 23 20 54 42 44 20 6e 65 65 64 20 74 6f 20 66   # TBD need to f
4770: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 74 6f  igure out how to
4780: 20 64 6f 20 74 68 69 73 20 63 6f 72 72 65 63 74   do this correct
4790: 6c 79 20 66 6f 72 20 57 69 6e 64 6f 77 73 21 21  ly for Windows!!
47a0: 21 0a 20 20 20 20 20 20 73 65 74 20 6e 50 61 64  !.      set nPad
47b0: 64 69 6e 67 20 5b 65 78 70 72 20 32 35 35 20 2d  ding [expr 255 -
47c0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f   $::mj_filename_
47d0: 6c 65 6e 67 74 68 5d 0a 20 20 20 20 7d 0a 0a 20  length].    }.. 
47e0: 20 20 20 23 20 57 65 20 63 61 6e 6e 6f 74 20 6a     # We cannot j
47f0: 75 73 74 20 63 72 65 61 74 65 20 61 20 72 65 61  ust create a rea
4800: 6c 6c 79 20 6c 6f 6e 67 20 64 61 74 61 62 61 73  lly long databas
4810: 65 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f  e file name to o
4820: 70 65 6e 2c 20 61 73 0a 20 20 20 20 23 20 4c 69  pen, as.    # Li
4830: 6e 75 78 20 6c 69 6d 69 74 73 20 61 20 73 69 6e  nux limits a sin
4840: 67 6c 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  gle component of
4850: 20 61 20 70 61 74 68 20 74 6f 20 32 35 35 20 62   a path to 255 b
4860: 79 74 65 73 20 62 79 20 64 65 66 61 75 6c 74 0a  ytes by default.
4870: 20 20 20 20 23 20 28 61 6e 64 20 70 72 65 73 75      # (and presu
4880: 6d 61 62 6c 79 20 6f 74 68 65 72 20 73 79 73 74  mably other syst
4890: 65 6d 73 20 68 61 76 65 20 6c 69 6d 69 74 73 20  ems have limits 
48a0: 74 6f 6f 29 2e 20 53 6f 20 63 72 65 61 74 65 20  too). So create 
48b0: 61 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20  a directory.    
48c0: 23 20 68 69 65 72 61 72 63 68 79 20 74 6f 20 77  # hierarchy to w
48d0: 6f 72 6b 20 69 6e 2e 0a 20 20 20 20 23 0a 20 20  ork in..    #.  
48e0: 20 20 73 65 74 20 64 69 72 6e 61 6d 65 20 22 64    set dirname "d
48f0: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
4900: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 2f 22  78901234567890/"
4910: 0a 20 20 20 20 73 65 74 20 6e 44 69 72 20 5b 65  .    set nDir [e
4920: 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20 2f 20  xpr $nPadding / 
4930: 33 32 5d 0a 20 20 20 20 69 66 20 7b 20 24 6e 44  32].    if { $nD
4940: 69 72 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  ir } {.      set
4950: 20 70 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61   p [string repea
4960: 74 20 24 64 69 72 6e 61 6d 65 20 24 6e 44 69 72  t $dirname $nDir
4970: 5d 0a 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64  ].      file mkd
4980: 69 72 20 24 70 0a 20 20 20 20 20 20 63 64 20 24  ir $p.      cd $
4990: 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74  p.    }..    set
49a0: 20 70 61 64 64 69 6e 67 20 5b 73 74 72 69 6e 67   padding [string
49b0: 20 72 65 70 65 61 74 20 78 20 5b 65 78 70 72 20   repeat x [expr 
49c0: 24 6e 50 61 64 64 69 6e 67 20 25 33 32 5d 5d 0a  $nPadding %32]].
49d0: 20 20 20 20 73 65 74 20 70 72 65 66 69 78 20 22      set prefix "
49e0: 74 65 73 74 2e 64 62 24 7b 70 61 64 64 69 6e 67  test.db${padding
49f0: 7d 22 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 76 61  }".  }.} {.  eva
4a00: 6c 20 24 74 63 6c 0a 20 20 66 6f 72 65 61 63 68  l $tcl.  foreach
4a10: 20 7b 74 6e 32 20 73 71 6c 7d 20 7b 0a 20 20 20   {tn2 sql} {.   
4a20: 20 6f 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47   o { .      PRAG
4a30: 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e  MA main.synchron
4a40: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  ous=OFF;.      P
4a50: 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72  RAGMA aux.synchr
4a60: 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20  onous=OFF;.     
4a70: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
4a80: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
4a90: 20 20 20 7d 0a 20 20 20 20 6f 35 31 32 20 7b 20     }.    o512 { 
4aa0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
4ab0: 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  in.synchronous=O
4ac0: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
4ad0: 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73   aux.synchronous
4ae0: 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47  =OFF;.      PRAG
4af0: 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a  MA main.page_siz
4b00: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50  e = 512;.      P
4b10: 52 41 47 4d 41 20 61 75 78 2e 70 61 67 65 5f 73  RAGMA aux.page_s
4b20: 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20  ize = 512;.     
4b30: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
4b40: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
4b50: 20 20 20 7d 0a 20 20 20 20 6e 20 7b 20 0a 20 20     }.    n { .  
4b60: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
4b70: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
4b80: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
4b90: 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73   aux.synchronous
4ba0: 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50  =NORMAL;.      P
4bb0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4bc0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4bd0: 20 7d 0a 20 20 20 20 66 20 7b 20 0a 20 20 20 20   }.    f { .    
4be0: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
4bf0: 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a  nchronous=FULL;.
4c00: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
4c10: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c  .synchronous=FUL
4c20: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
4c30: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
4c40: 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  ELETE;.    }.  }
4c50: 20 7b 0a 0a 20 20 20 20 73 65 74 20 74 6e 20 22   {..    set tn "
4c60: 24 7b 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a 20  ${tn1}.${tn2}". 
4c70: 20 0a 20 20 20 20 23 20 53 65 74 20 75 70 20 61   .    # Set up a
4c80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 68   connection to h
4c90: 61 76 65 20 74 77 6f 20 64 61 74 61 62 61 73 65  ave two database
4ca0: 73 2c 20 74 65 73 74 2e 64 62 20 28 6d 61 69 6e  s, test.db (main
4cb0: 29 20 61 6e 64 20 0a 20 20 20 20 23 20 74 65 73  ) and .    # tes
4cc0: 74 2e 64 62 32 20 28 61 75 78 29 2e 20 54 68 65  t.db2 (aux). The
4cd0: 6e 20 72 75 6e 20 61 20 6d 75 6c 74 69 2d 66 69  n run a multi-fi
4ce0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  le transaction o
4cf0: 6e 20 74 68 65 6d 2e 20 54 68 65 0a 20 20 20 20  n them. The.    
4d00: 23 20 56 46 53 20 77 69 6c 6c 20 73 6e 61 70 73  # VFS will snaps
4d10: 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hot the file-sys
4d20: 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20  tem just before 
4d30: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
4d40: 61 6c 0a 20 20 20 20 23 20 66 69 6c 65 20 69 73  al.    # file is
4d50: 20 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d   deleted to comm
4d60: 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
4d70: 6f 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20 74 76  on..    #.    tv
4d80: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
4d90: 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
4da0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a 20  r1-4.4.$tn.1 {. 
4db0: 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65       faultsim_de
4dc0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20  lete_and_reopen 
4dd0: 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65 78  $prefix.      ex
4de0: 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  ecsql ".        
4df0: 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69 78  ATTACH '${prefix
4e00: 7d 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20  }2' AS aux;.    
4e10: 20 20 20 20 24 73 71 6c 0a 20 20 20 20 20 20 20      $sql.       
4e20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 28   CREATE TABLE a(
4e30: 78 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  x);.        CREA
4e40: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 62 28 78  TE TABLE aux.b(x
4e50: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
4e60: 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28  T INTO a VALUES(
4e70: 27 64 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a 20  'double-you');. 
4e80: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4e90: 54 4f 20 61 20 56 41 4c 55 45 53 28 27 77 68 79  TO a VALUES('why
4ea0: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
4eb0: 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53  RT INTO a VALUES
4ec0: 28 27 7a 65 64 27 29 3b 0a 20 20 20 20 20 20 20  ('zed');.       
4ed0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56   INSERT INTO b V
4ee0: 41 4c 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20 20  ALUES('won');.  
4ef0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4f00: 4f 20 62 20 56 41 4c 55 45 53 28 27 74 6f 6f 27  O b VALUES('too'
4f10: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
4f20: 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28  T INTO b VALUES(
4f30: 27 66 72 65 65 27 29 3b 0a 20 20 20 20 20 20 22  'free');.      "
4f40: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
4f50: 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  .        BEGIN;.
4f60: 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54            INSERT
4f70: 20 49 4e 54 4f 20 61 20 53 45 4c 45 43 54 20 2a   INTO a SELECT *
4f80: 20 46 52 4f 4d 20 62 20 57 48 45 52 45 20 72 6f   FROM b WHERE ro
4f90: 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20  wid<=3;.        
4fa0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
4fb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 20  SELECT * FROM a 
4fc0: 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a  WHERE rowid<=3;.
4fd0: 20 20 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a          COMMIT;.
4fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d        }.    } {}
4ff0: 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 7b  .    tv filter {
5000: 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 43 68 65  }.    .    # Che
5010: 63 6b 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ck that the tran
5020: 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
5030: 69 74 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  itted successful
5040: 6c 79 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f  ly..    #.    do
5050: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5060: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 32 20 7b  ger1-4.4.$tn.2 {
5070: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
5080: 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f  FROM a.    } {do
5090: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
50a0: 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20   won too free}. 
50b0: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
50c0: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
50d0: 6e 2e 33 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.3 {.      SELE
50e0: 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20  CT * FROM b.    
50f0: 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20  } {won too free 
5100: 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a  double-you why z
5110: 65 64 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52  ed}.    .    # R
5120: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5130: 73 79 73 74 65 6d 20 61 6e 64 20 72 65 6f 70 65  system and reope
5140: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e  n the databases.
5150: 20 43 68 65 63 6b 20 74 68 61 74 20 69 74 20 6e   Check that it n
5160: 6f 77 0a 20 20 20 20 23 20 61 70 70 65 61 72 73  ow.    # appears
5170: 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
5180: 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f  ction was not co
5190: 6d 6d 69 74 74 65 64 20 28 62 65 63 61 75 73 65  mmitted (because
51a0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
51b0: 0a 20 20 20 20 23 20 77 61 73 20 72 65 73 74 6f  .    # was resto
51c0: 72 65 64 20 74 6f 20 74 68 65 20 73 74 61 74 65  red to the state
51d0: 20 77 68 65 72 65 20 69 74 20 68 61 64 20 6e 6f   where it had no
51e0: 74 20 62 65 65 6e 29 2e 0a 20 20 20 20 23 0a 20  t been)..    #. 
51f0: 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72     do_test pager
5200: 31 2d 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20 20  1-4.4.$tn.4 {.  
5210: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
5220: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20  tore_and_reopen 
5230: 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65 78  $prefix.      ex
5240: 65 63 73 71 6c 20 22 41 54 54 41 43 48 20 27 24  ecsql "ATTACH '$
5250: 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75  {prefix}2' AS au
5260: 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20  x".    } {}.    
5270: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5280: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35  pager1-4.4.$tn.5
5290: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
52a0: 61 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77  a} {double-you w
52b0: 68 79 20 7a 65 64 7d 0a 20 20 20 20 64 6f 5f 65  hy zed}.    do_e
52c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
52d0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45  r1-4.4.$tn.6 {SE
52e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b  LECT * FROM b} {
52f0: 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20  won too free}.  
5300: 20 20 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65    .    # Restore
5310: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5320: 20 61 67 61 69 6e 2e 20 54 68 69 73 20 74 69 6d   again. This tim
5330: 65 2c 20 62 65 66 6f 72 65 20 72 65 6f 70 65 6e  e, before reopen
5340: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
5350: 73 2c 0a 20 20 20 20 23 20 64 65 6c 65 74 65 20  s,.    # delete 
5360: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
5370: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65  al file from the
5380: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 49 74   file-system. It
5390: 20 6e 6f 77 20 61 70 70 65 61 72 73 20 74 68 61   now appears tha
53a0: 74 0a 20 20 20 20 23 20 74 68 65 20 74 72 61 6e  t.    # the tran
53b0: 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
53c0: 69 74 74 65 64 20 28 6e 6f 20 6d 61 73 74 65 72  itted (no master
53d0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 3d 3d  -journal file ==
53e0: 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20   no rollback).. 
53f0: 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74     #.    do_test
5400: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5410: 37 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73  7 {.      faults
5420: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5430: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
5440: 20 20 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67      foreach f [g
5450: 6c 6f 62 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a  lob ${prefix}-mj
5460: 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65  *] { forcedelete
5470: 20 24 66 20 7d 0a 20 20 20 20 20 20 65 78 65 63   $f }.      exec
5480: 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70  sql "ATTACH '${p
5490: 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22  refix}2' AS aux"
54a0: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
54b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
54c0: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b  ger1-4.4.$tn.8 {
54d0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
54e0: 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f  FROM a.    } {do
54f0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
5500: 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20   won too free}. 
5510: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
5520: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5530: 6e 2e 39 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.9 {.      SELE
5540: 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20  CT * FROM b.    
5550: 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20  } {won too free 
5560: 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a  double-you why z
5570: 65 64 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70  ed}.  }..  cd $p
5580: 77 64 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  wd.}.db close.tv
5590: 20 64 65 6c 65 74 65 0a 66 6f 72 63 65 64 65 6c   delete.forcedel
55a0: 65 74 65 20 24 64 69 72 6e 61 6d 65 0a 0a 0a 23  ete $dirname...#
55b0: 20 53 65 74 20 75 70 20 61 20 56 46 53 20 74 6f   Set up a VFS to
55c0: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
55d0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
55e0: 6a 75 73 74 20 62 65 66 6f 72 65 20 64 65 6c 65  just before dele
55f0: 74 69 6e 67 20 61 0a 23 20 6a 6f 75 72 6e 61 6c  ting a.# journal
5600: 20 66 69 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20   file to commit 
5610: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  a transaction. T
5620: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  he transaction m
5630: 6f 64 69 66 69 65 73 20 65 78 61 63 74 6c 79 0a  odifies exactly.
5640: 23 20 74 77 6f 20 64 61 74 61 62 61 73 65 20 70  # two database p
5650: 61 67 65 73 20 28 61 6e 64 20 70 61 67 65 20 31  ages (and page 1
5660: 20 2d 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f   - the change co
5670: 75 6e 74 65 72 29 2e 0a 23 0a 74 65 73 74 76 66  unter)..#.testvf
5680: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
5690: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 35 31  tv sectorsize 51
56a0: 32 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70 79  2.tv script copy
56b0: 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65  _on_journal_dele
56c0: 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78 44 65  te.tv filter xDe
56d0: 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f  lete.proc copy_o
56e0: 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65  n_journal_delete
56f0: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
5700: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
5710: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a  [string match *j
5720: 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e 61 6d 65  ournal $filename
5730: 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  ]} faultsim_save
5740: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
5750: 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f  E_OK.}.faultsim_
5760: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
5770: 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  n.do_execsql_tes
5780: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 31 20 7b  t pager1.4.5.1 {
5790: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
57a0: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
57b0: 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73  .  PRAGMA page_s
57c0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 43 52  ize = 1024;.  CR
57d0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
57e0: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   b);.  CREATE TA
57f0: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
5800: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5810: 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27 29  ALUES('I', 'II')
5820: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
5830: 74 32 20 56 41 4c 55 45 53 28 27 49 49 49 27 2c  t2 VALUES('III',
5840: 20 27 49 56 27 29 3b 0a 20 20 42 45 47 49 4e 3b   'IV');.  BEGIN;
5850: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5860: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
5870: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5880: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34  O t2 VALUES(3, 4
5890: 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b  );.  COMMIT;.} {
58a0: 64 65 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65  delete}.tv filte
58b0: 72 20 7b 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68  r {}..# Check th
58c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
58d0: 73 20 63 6f 6d 6d 69 74 74 65 64 3a 0a 23 0a 64  s committed:.#.d
58e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
58f0: 61 67 65 72 31 2e 34 2e 35 2e 32 20 7b 0a 20 20  ager1.4.5.2 {.  
5900: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5910: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5920: 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20  M t2;.} {I II 1 
5930: 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 23  2 III IV 3 4}..#
5940: 20 4e 6f 77 20 74 72 79 20 66 6f 75 72 20 74 65   Now try four te
5950: 73 74 73 3a 0a 23 0a 23 20 20 70 61 67 65 72 31  sts:.#.#  pager1
5960: 2d 34 2e 35 2e 33 3a 20 52 65 73 74 6f 72 65 20  -4.5.3: Restore 
5970: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
5980: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
5990: 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
59a0: 6e 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  n .#            
59b0: 20 20 20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61      is rolled ba
59c0: 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  ck..#.#  pager1-
59d0: 34 2e 35 2e 34 3a 20 52 65 73 74 6f 72 65 20 74  4.5.4: Restore t
59e0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
59f0: 43 6f 72 72 75 70 74 20 74 68 65 20 66 69 72 73  Corrupt the firs
5a00: 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 0a  t record in the.
5a10: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
5a20: 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20   journal. Check 
5a30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5a40: 69 73 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61  is not rolled ba
5a50: 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  ck..#.#  pager1-
5a60: 34 2e 35 2e 35 3a 20 52 65 73 74 6f 72 65 20 74  4.5.5: Restore t
5a70: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
5a80: 43 6f 72 72 75 70 74 20 74 68 65 20 73 65 63 6f  Corrupt the seco
5a90: 6e 64 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  nd record in the
5aa0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5ab0: 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b    journal. Check
5ac0: 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
5ad0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74 72  record in the tr
5ae0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20  ansaction is .# 
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
5b00: 6c 61 79 65 64 20 62 61 63 6b 2c 20 62 75 74 20  layed back, but 
5b10: 6e 6f 74 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a  not the second..
5b20: 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e  #.#  pager1-4.5.
5b30: 36 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20 66  6: Restore the f
5b40: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 72 79 20  ile-system. Try 
5b50: 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
5b60: 62 61 73 65 20 77 69 74 68 20 61 0a 23 20 20 20  base with a.#   
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
5b80: 64 6f 6e 6c 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  donly connection
5b90: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61  . This should fa
5ba0: 69 6c 2c 20 61 73 20 61 20 72 65 61 64 2d 6f 6e  il, as a read-on
5bb0: 6c 79 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ly.#            
5bc0: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63      connection c
5bd0: 61 6e 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  annot roll back 
5be0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
5bf0: 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 72 65  e..#.faultsim_re
5c00: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5c10: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
5c20: 20 70 61 67 65 72 31 2e 34 2e 35 2e 33 20 7b 0a   pager1.4.5.3 {.
5c30: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5c40: 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  t1;.  SELECT * F
5c50: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20  ROM t2;.} {I II 
5c60: 49 49 49 20 49 56 7d 0a 66 61 75 6c 74 73 69 6d  III IV}.faultsim
5c70: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5c80: 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20  pen.hexio_write 
5c90: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
5ca0: 5b 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34  [expr 512+4+1024
5cb0: 20 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37   - 202] 01234567
5cc0: 38 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63  89ABCDEF.do_exec
5cd0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5ce0: 34 2e 35 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  4.5.4 {.  SELECT
5cf0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
5d00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
5d10: 7d 20 7b 49 20 49 49 20 31 20 32 20 49 49 49 20  } {I II 1 2 III 
5d20: 49 56 20 33 20 34 7d 0a 66 61 75 6c 74 73 69 6d  IV 3 4}.faultsim
5d30: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5d40: 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20  pen.hexio_write 
5d50: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
5d60: 5b 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34  [expr 512+4+1024
5d70: 2b 34 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d  +4+4+1024 - 202]
5d80: 20 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45   0123456789ABCDE
5d90: 46 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  F.do_execsql_tes
5da0: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 35 20 7b  t pager1.4.5.5 {
5db0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5dc0: 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20   t1;.  SELECT * 
5dd0: 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49  FROM t2;.} {I II
5de0: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 66 61   III IV 3 4}..fa
5df0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5e00: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f  nd_reopen.db clo
5e10: 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  se.sqlite3 db te
5e20: 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20  st.db -readonly 
5e30: 31 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  1.do_catchsql_te
5e40: 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 36 20  st pager1.4.5.6 
5e50: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
5e60: 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a  M t1;.  SELECT *
5e70: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b   FROM t2;.} {1 {
5e80: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d  disk I/O error}}
5e90: 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20 53 6e 61  .db close..# Sna
5ea0: 70 73 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73  pshot the file-s
5eb0: 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72  ystem just befor
5ec0: 65 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  e multi-file com
5ed0: 6d 69 74 2e 20 53 61 76 65 20 74 68 65 20 6e 61  mit. Save the na
5ee0: 6d 65 0a 23 20 6f 66 20 74 68 65 20 6d 61 73 74  me.# of the mast
5ef0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5f00: 69 6e 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  in $::mj_filenam
5f10: 65 2e 0a 23 0a 74 76 20 73 63 72 69 70 74 20 63  e..#.tv script c
5f20: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
5f30: 0a 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65  .tv filter xDele
5f40: 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f  te.proc copy_on_
5f50: 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f  mj_delete {metho
5f60: 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d  d filename args}
5f70: 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67   {.  if {[string
5f80: 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c   match *mj* [fil
5f90: 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65  e tail $filename
5fa0: 5d 5d 7d 20 7b 20 0a 20 20 20 20 73 65 74 20 3a  ]]} { .    set :
5fb0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 24 66 69  :mj_filename $fi
5fc0: 6c 65 6e 61 6d 65 0a 20 20 20 20 66 61 75 6c 74  lename.    fault
5fd0: 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d 0a 20 20  sim_save .  }.  
5fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5ff0: 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .}.do_test pager
6000: 31 2e 34 2e 36 2e 31 20 7b 0a 20 20 66 61 75 6c  1.4.6.1 {.  faul
6010: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
6020: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
6030: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
6040: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
6050: 45 54 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20  ETE;.    ATTACH 
6060: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74 77  'test.db2' AS tw
6070: 6f 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  o;.    CREATE TA
6080: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
6090: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
60a0: 77 6f 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  wo.t2(a, b);.   
60b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
60c0: 56 41 4c 55 45 53 28 31 2c 20 27 74 31 2e 31 27  VALUES(1, 't1.1'
60d0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
60e0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
60f0: 27 74 32 2e 31 27 29 3b 0a 20 20 20 20 42 45 47  't2.1');.    BEG
6100: 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  IN;.      UPDATE
6110: 20 74 31 20 53 45 54 20 62 20 3d 20 27 74 31 2e   t1 SET b = 't1.
6120: 32 27 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  2';.      UPDATE
6130: 20 74 32 20 53 45 54 20 62 20 3d 20 27 74 32 2e   t2 SET b = 't2.
6140: 32 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  2';.    COMMIT;.
6150: 20 20 7d 0a 20 20 74 76 20 66 69 6c 74 65 72 20    }.  tv filter 
6160: 7b 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20  {}.  db close.} 
6170: 7b 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  {}..faultsim_res
6180: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
6190: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
61a0: 70 61 67 65 72 31 2e 34 2e 36 2e 32 20 7b 20 53  pager1.4.6.2 { S
61b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
61c0: 7d 20 20 20 20 20 20 20 20 20 20 20 7b 31 20 74  }           {1 t
61d0: 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20  1.1}.do_test    
61e0: 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e       pager1.4.6.
61f0: 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  3 { file exists 
6200: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d  $::mj_filename }
6210: 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {1}.do_execsql_
6220: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6230: 34 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65  4 {.  ATTACH 'te
6240: 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a  st.db2' AS two;.
6250: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6260: 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64  t2;.} {1 t2.1}.d
6270: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
6280: 36 2e 35 20 7b 20 66 69 6c 65 20 65 78 69 73 74  6.5 { file exist
6290: 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  s $::mj_filename
62a0: 20 7d 20 7b 30 7d 0a 0a 66 61 75 6c 74 73 69 6d   } {0}..faultsim
62b0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
62c0: 70 65 6e 0a 64 62 20 63 6c 6f 73 65 0a 64 6f 5f  pen.db close.do_
62d0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
62e0: 38 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 6a 5f 66  8 {.  set ::mj_f
62f0: 69 6c 65 6e 61 6d 65 31 20 24 3a 3a 6d 6a 5f 66  ilename1 $::mj_f
6300: 69 6c 65 6e 61 6d 65 0a 20 20 74 76 20 66 69 6c  ilename.  tv fil
6310: 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20 73 71  ter xDelete.  sq
6320: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
6330: 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  2.  execsql {.  
6340: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
6350: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
6360: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
6370: 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a  .db3' AS three;.
6380: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6390: 20 74 68 72 65 65 2e 74 33 28 61 2c 20 62 29 3b   three.t3(a, b);
63a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
63b0: 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20 27 74   t3 VALUES(1, 't
63c0: 33 2e 31 27 29 3b 0a 20 20 20 20 42 45 47 49 4e  3.1');.    BEGIN
63d0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
63e0: 32 20 53 45 54 20 62 20 3d 20 27 74 32 2e 33 27  2 SET b = 't2.3'
63f0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
6400: 33 20 53 45 54 20 62 20 3d 20 27 74 33 2e 33 27  3 SET b = 't3.3'
6410: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
6420: 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 6a 5f  }.  expr {$::mj_
6430: 66 69 6c 65 6e 61 6d 65 31 20 21 3d 20 24 3a 3a  filename1 != $::
6440: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 7d 0a 7d 20 7b  mj_filename}.} {
6450: 31 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  1}.faultsim_rest
6460: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 74  ore_and_reopen.t
6470: 76 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 54  v filter {}..# T
6480: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6e  he file-system n
6490: 6f 77 20 63 6f 6e 74 61 69 6e 73 3a 0a 23 0a 23  ow contains:.#.#
64a0: 20 20 20 2a 20 74 68 72 65 65 20 64 61 74 61 62     * three datab
64b0: 61 73 65 73 0a 23 20 20 20 2a 20 74 68 72 65 65  ases.#   * three
64c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
64d0: 65 73 0a 23 20 20 20 2a 20 74 77 6f 20 6d 61 73  es.#   * two mas
64e0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
64f0: 73 2e 0a 23 0a 23 20 54 68 65 20 68 6f 74 2d 6a  s..#.# The hot-j
6500: 6f 75 72 6e 61 6c 73 20 61 73 73 6f 63 69 61 74  ournals associat
6510: 65 64 20 77 69 74 68 20 74 65 73 74 2e 64 62 32  ed with test.db2
6520: 20 61 6e 64 20 74 65 73 74 2e 64 62 33 20 70 6f   and test.db3 po
6530: 69 6e 74 20 74 6f 0a 23 20 6d 61 73 74 65 72 20  int to.# master 
6540: 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69  journal $::mj_fi
6550: 6c 65 6e 61 6d 65 2e 20 54 68 65 20 68 6f 74 2d  lename. The hot-
6560: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 73  journal file ass
6570: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 23 20 74  ociated with.# t
6580: 65 73 74 2e 64 62 20 70 6f 69 6e 74 73 20 74 6f  est.db points to
6590: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
65a0: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e  $::mj_filename1.
65b0: 20 53 6f 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   So reading from
65c0: 0a 23 20 74 65 73 74 2e 64 62 20 73 68 6f 75 6c  .# test.db shoul
65d0: 64 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66  d delete $::mj_f
65e0: 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74  ilename1..#.do_t
65f0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 39  est pager1.4.6.9
6600: 20 7b 0a 20 20 6c 73 6f 72 74 20 5b 67 6c 6f 62   {.  lsort [glob
6610: 20 74 65 73 74 2e 64 62 2a 5d 0a 7d 20 5b 6c 73   test.db*].} [ls
6620: 6f 72 74 20 5b 6c 69 73 74 20 20 20 20 20 20 20  ort [list       
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 20      \.  test.db 
6660: 74 65 73 74 2e 64 62 32 20 74 65 73 74 2e 64 62  test.db2 test.db
6670: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
6690: 0a 20 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  .  test.db-journ
66a0: 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72  al test.db2-jour
66b0: 6e 61 6c 20 74 65 73 74 2e 64 62 33 2d 6a 6f 75  nal test.db3-jou
66c0: 72 6e 61 6c 20 20 20 20 20 20 5c 0a 20 20 5b 66  rnal      \.  [f
66d0: 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66  ile tail $::mj_f
66e0: 69 6c 65 6e 61 6d 65 5d 20 5b 66 69 6c 65 20 74  ilename] [file t
66f0: 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  ail $::mj_filena
6700: 6d 65 31 5d 0a 5d 5d 0a 0a 23 20 54 68 65 20 6d  me1].]]..# The m
6710: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 24 3a  aster-journal $:
6720: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 63 6f  :mj_filename1 co
6730: 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
6740: 74 6f 20 74 65 73 74 2e 64 62 20 61 6e 64 20 0a  to test.db and .
6750: 23 20 74 65 73 74 2e 64 62 32 2e 20 48 6f 77 65  # test.db2. Howe
6760: 76 65 72 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ver the hot-jour
6770: 6e 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77  nal associated w
6780: 69 74 68 20 74 65 73 74 2e 64 62 32 20 70 6f 69  ith test.db2 poi
6790: 6e 74 73 20 74 6f 0a 23 20 61 20 64 69 66 66 65  nts to.# a diffe
67a0: 72 65 6e 74 20 6d 61 73 74 65 72 2d 6a 6f 75 72  rent master-jour
67b0: 6e 61 6c 2e 20 54 68 65 72 65 66 6f 72 65 2c 20  nal. Therefore, 
67c0: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 65 73  reading from tes
67d0: 74 2e 64 62 20 6f 6e 6c 79 20 73 68 6f 75 6c 64  t.db only should
67e0: 0a 23 20 62 65 20 65 6e 6f 75 67 68 20 74 6f 20  .# be enough to 
67f0: 63 61 75 73 65 20 53 51 4c 69 74 65 20 74 6f 20  cause SQLite to 
6800: 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c  delete $::mj_fil
6810: 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73  ename1..#.do_tes
6820: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
6830: 2e 34 2e 36 2e 31 30 20 7b 20 66 69 6c 65 20 65  .4.6.10 { file e
6840: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6850: 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74  name  } {1}.do_t
6860: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
6870: 72 31 2e 34 2e 36 2e 31 31 20 7b 20 66 69 6c 65  r1.4.6.11 { file
6880: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
6890: 6c 65 6e 61 6d 65 31 20 7d 20 7b 31 7d 0a 64 6f  lename1 } {1}.do
68a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
68b0: 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b 20 53 45  ger1.4.6.12 { SE
68c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
68d0: 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73   {1 t1.1}.do_tes
68e0: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
68f0: 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 65  .4.6.13 { file e
6900: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6910: 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74  name  } {1}.do_t
6920: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
6930: 72 31 2e 34 2e 36 2e 31 34 20 7b 20 66 69 6c 65  r1.4.6.14 { file
6940: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
6950: 6c 65 6e 61 6d 65 31 20 7d 20 7b 30 7d 0a 0a 64  lename1 } {0}..d
6960: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
6970: 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b 0a 20  ager1.4.6.12 {. 
6980: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
6990: 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 53 45 4c  2' AS two;.  SEL
69a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
69b0: 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65 73   {1 t2.1}.do_tes
69c0: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
69d0: 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 65  .4.6.13 { file e
69e0: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
69f0: 6e 61 6d 65 20 7d 20 20 7b 31 7d 0a 64 6f 5f 65  name }  {1}.do_e
6a00: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
6a10: 72 31 2e 34 2e 36 2e 31 34 20 7b 0a 20 20 41 54  r1.4.6.14 {.  AT
6a20: 54 41 43 48 20 27 74 65 73 74 2e 64 62 33 27 20  TACH 'test.db3' 
6a30: 41 53 20 74 68 72 65 65 3b 0a 20 20 53 45 4c 45  AS three;.  SELE
6a40: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d 20  CT * FROM t3;.} 
6a50: 7b 31 20 74 33 2e 31 7d 0a 64 6f 5f 74 65 73 74  {1 t3.1}.do_test
6a60: 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e           pager1.
6a70: 34 2e 36 2e 31 35 20 7b 20 66 69 6c 65 20 65 78  4.6.15 { file ex
6a80: 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  ists $::mj_filen
6a90: 61 6d 65 20 7d 20 20 7b 30 7d 0a 0a 64 62 20 63  ame }  {0}..db c
6aa0: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
6ab0: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
6ac0: 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73  ult 1.tv sectors
6ad0: 69 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69 70  ize 512.tv scrip
6ae0: 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61  t copy_on_journa
6af0: 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74  l_delete.tv filt
6b00: 65 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20  er xDelete.proc 
6b10: 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f  copy_on_journal_
6b20: 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66  delete {method f
6b30: 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a  ilename args} {.
6b40: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
6b50: 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69  tch *journal $fi
6b60: 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69  lename]} faultsi
6b70: 6d 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e  m_save .  return
6b80: 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75   SQLITE_OK.}.fau
6b90: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
6ba0: 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73  _reopen.do_execs
6bb0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
6bc0: 2e 37 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20  .7.1 {.  PRAGMA 
6bd0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
6be0: 45 4c 45 54 45 3b 0a 20 20 43 52 45 41 54 45 20  ELETE;.  CREATE 
6bf0: 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41  TABLE t1(x PRIMA
6c00: 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 43 52  RY KEY, y);.  CR
6c10: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
6c20: 20 74 31 28 79 29 3b 0a 20 20 49 4e 53 45 52 54   t1(y);.  INSERT
6c30: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6c40: 27 49 27 2c 20 20 20 27 6f 6e 65 27 29 3b 0a 20  'I',   'one');. 
6c50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6c60: 56 41 4c 55 45 53 28 27 49 49 27 2c 20 20 27 66  VALUES('II',  'f
6c70: 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  our');.  INSERT 
6c80: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
6c90: 49 49 49 27 2c 20 27 6e 69 6e 65 27 29 3b 0a 20  III', 'nine');. 
6ca0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
6cb0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6cc0: 53 28 27 49 56 27 2c 20 27 73 69 78 74 65 65 6e  S('IV', 'sixteen
6cd0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
6ce0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 56  NTO t1 VALUES('V
6cf0: 27 20 2c 20 27 74 77 65 6e 74 79 66 69 76 65 27  ' , 'twentyfive'
6d00: 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b  );.  COMMIT;.} {
6d10: 64 65 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65  delete}.tv filte
6d20: 72 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  r {}.db close.tv
6d30: 20 64 65 6c 65 74 65 20 0a 64 6f 5f 74 65 73 74   delete .do_test
6d40: 20 70 61 67 65 72 31 2e 34 2e 37 2e 32 20 7b 0a   pager1.4.7.2 {.
6d50: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
6d60: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
6d70: 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72  catch {file attr
6d80: 69 62 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a  ibutes test.db-j
6d90: 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69 73 73 69  ournal -permissi
6da0: 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20  ons r--------}. 
6db0: 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74   catch {file att
6dc0: 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62 2d  ributes test.db-
6dd0: 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c  journal -readonl
6de0: 79 20 31 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  y 1}.  catchsql 
6df0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6e00: 74 31 20 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c  t1 }.} {1 {unabl
6e10: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
6e20: 73 65 20 66 69 6c 65 7d 7d 0a 64 6f 5f 74 65 73  se file}}.do_tes
6e30: 74 20 70 61 67 65 72 31 2e 34 2e 37 2e 33 20 7b  t pager1.4.7.3 {
6e40: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61  .  db close.  ca
6e50: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
6e60: 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  utes test.db-jou
6e70: 72 6e 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e  rnal -permission
6e80: 73 20 72 77 2d 72 77 2d 72 77 2d 7d 0a 20 20 63  s rw-rw-rw-}.  c
6e90: 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69  atch {file attri
6ea0: 62 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f  butes test.db-jo
6eb0: 75 72 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20  urnal -readonly 
6ec0: 30 7d 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65  0}.  delete_file
6ed0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
6ee0: 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74  .  file exists t
6ef0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d  est.db-journal.}
6f00: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   {0}.do_test pag
6f10: 65 72 31 2e 34 2e 38 2e 31 20 7b 0a 20 20 63 61  er1.4.8.1 {.  ca
6f20: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
6f30: 75 74 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65  utes test.db -pe
6f40: 72 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d  rmissions r-----
6f50: 2d 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69  ---}.  catch {fi
6f60: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
6f70: 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20  st.db -readonly 
6f80: 31 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  1}.  sqlite3 db 
6f90: 74 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61  test.db.  db eva
6fa0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
6fb0: 4d 20 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33  M t1 }.  sqlite3
6fc0: 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20  _db_readonly db 
6fd0: 6d 61 69 6e 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  main.} {1}.do_te
6fe0: 73 74 20 70 61 67 65 72 31 2e 34 2e 38 2e 32 20  st pager1.4.8.2 
6ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  {.  sqlite3_db_r
7000: 65 61 64 6f 6e 6c 79 20 64 62 20 78 79 7a 0a 7d  eadonly db xyz.}
7010: 20 7b 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61   {-1}.do_test pa
7020: 67 65 72 31 2e 34 2e 38 2e 33 20 7b 0a 20 20 64  ger1.4.8.3 {.  d
7030: 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68 20  b close.  catch 
7040: 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73  {file attributes
7050: 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e   test.db -readon
7060: 6c 79 20 30 7d 0a 20 20 63 61 74 63 68 20 7b 66  ly 0}.  catch {f
7070: 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74  ile attributes t
7080: 65 73 74 2e 64 62 20 2d 70 65 72 6d 69 73 73 69  est.db -permissi
7090: 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d 20 6d  ons rw-rw-rw-} m
70a0: 73 67 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  sg.  sqlite3 db 
70b0: 74 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61  test.db.  db eva
70c0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
70d0: 4d 20 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33  M t1 }.  sqlite3
70e0: 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20  _db_readonly db 
70f0: 6d 61 69 6e 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d  main.} {0}..#---
7100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7140: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
7150: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 64 65 61  lowing tests dea
7160: 6c 20 77 69 74 68 20 6d 75 6c 74 69 2d 66 69 6c  l with multi-fil
7170: 65 20 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20 70  e commits..#.# p
7180: 61 67 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68 65  ager1-5.1.*: The
7190: 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 75   case where a mu
71a0: 6c 74 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74 20  lti-file cannot 
71b0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 63  be committed bec
71c0: 61 75 73 65 0a 23 20 20 20 20 20 20 20 20 20 20  ause.#          
71d0: 20 20 20 20 20 61 6e 6f 74 68 65 72 20 63 6f 6e       another con
71e0: 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
71f0: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
7200: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a 23   on one of the.#
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
7220: 69 6c 65 73 2e 20 41 66 74 65 72 20 74 68 65 20  iles. After the 
7230: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
7240: 65 6d 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d 4d  emoved, the COMM
7250: 49 54 20 73 75 63 63 65 65 64 73 2e 0a 23 0a 23  IT succeeds..#.#
7260: 20 70 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20 4d   pager1-5.2.*: M
7270: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
7280: 73 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  s with journal_m
7290: 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20  ode=memory..#.# 
72a0: 70 61 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d 75  pager1-5.3.*: Mu
72b0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
72c0: 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
72d0: 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70  de=memory..#.# p
72e0: 61 67 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68 65  ager1-5.4.*: Che
72f0: 63 6b 20 74 68 61 74 20 77 69 74 68 20 73 79 6e  ck that with syn
7300: 63 68 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c 2c  chronous=normal,
7310: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
7320: 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20  nal file.#      
7330: 20 20 20 20 20 20 20 20 20 6e 61 6d 65 20 69 73           name is
7340: 20 61 64 64 65 64 20 74 6f 20 61 20 6a 6f 75 72   added to a jour
7350: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
7360: 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c  tely after the l
7370: 61 73 74 0a 23 20 20 20 20 20 20 20 20 20 20 20  ast.#           
7380: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f      journal reco
7390: 72 64 2e 20 42 75 74 20 77 69 74 68 20 73 79 6e  rd. But with syn
73a0: 63 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20 65  chronous=full, e
73b0: 78 74 72 61 20 75 6e 75 73 65 64 20 73 70 61 63  xtra unused spac
73c0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
73d0: 20 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62    is allocated b
73e0: 65 74 77 65 65 6e 20 74 68 65 20 6c 61 73 74 20  etween the last 
73f0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 61  journal record a
7400: 6e 64 20 74 68 65 20 0a 23 20 20 20 20 20 20 20  nd the .#       
7410: 20 20 20 20 20 20 20 20 6d 61 73 74 65 72 2d 6a          master-j
7420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
7430: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6d 61 73   so that the mas
7440: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
7450: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
7460: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 6c   name does not l
7470: 69 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  ie on the same s
7480: 65 63 74 6f 72 20 61 73 20 74 68 65 20 6c 61 73  ector as the las
7490: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23  t journal file.#
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
74b0: 65 63 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65 72  ecord..#.# pager
74c0: 31 2d 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20 74  1-5.5.*: Check t
74d0: 68 61 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  hat in journal_m
74e0: 6f 64 65 3d 50 45 52 53 49 53 54 20 6d 6f 64 65  ode=PERSIST mode
74f0: 2c 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  , a journal file
7500: 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20   is.#           
7510: 20 20 20 20 74 72 75 6e 63 61 74 65 64 20 74 6f      truncated to
7520: 20 7a 65 72 6f 20 62 79 74 65 73 20 77 68 65 6e   zero bytes when
7530: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
7540: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20  ansaction is .# 
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7560: 6d 6d 69 74 74 65 64 20 28 69 6e 73 74 65 61 64  mmitted (instead
7570: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 63 6f   of the first co
7580: 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 62 65  uple of bytes be
7590: 69 6e 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a 23  ing zeroed)..#.#
75a0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
75b0: 35 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  5.1.1 {.  faults
75c0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
75d0: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
75e0: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
75f0: 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20  t.db2' AS aux;. 
7600: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7610: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
7620: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
7630: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  2(a, b);.    INS
7640: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7650: 45 53 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29 3b  ES(17, 'Lenin');
7660: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7670: 20 74 31 20 56 41 4c 55 45 53 28 32 32 2c 20 27   t1 VALUES(22, '
7680: 53 74 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49 4e  Stalin');.    IN
7690: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
76a0: 55 45 53 28 35 33 2c 20 27 4b 68 72 75 73 68 63  UES(53, 'Khrushc
76b0: 68 65 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  hev');.  }.} {}.
76c0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
76d0: 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
76e0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
76f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7700: 74 31 20 56 41 4c 55 45 53 28 36 34 2c 20 27 42  t1 VALUES(64, 'B
7710: 72 65 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20 20  rezhnev');.     
7720: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
7730: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
7740: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20  ;.  }.  sqlite3 
7750: 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65  db2 test.db2.  e
7760: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
7770: 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  IN;.      SELECT
7780: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20   * FROM t2;.  } 
7790: 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  db2.} {}.do_test
77a0: 20 70 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b 0a   pager1-5.1.3 {.
77b0: 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49    catchsql COMMI
77c0: 54 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  T.} {1 {database
77d0: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f   is locked}}.do_
77e0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e  test pager1-5.1.
77f0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f  4 {.  execsql CO
7800: 4d 4d 49 54 20 64 62 32 0a 20 20 65 78 65 63 73  MMIT db2.  execs
7810: 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63  ql COMMIT.  exec
7820: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
7830: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
7840: 31 37 20 4c 65 6e 69 6e 20 32 32 20 53 74 61 6c  17 Lenin 22 Stal
7850: 69 6e 20 35 33 20 4b 68 72 75 73 68 63 68 65 76  in 53 Khrushchev
7860: 20 36 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64 6f   64 Brezhnev}.do
7870: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
7880: 2e 35 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65  .5 {.  db2 close
7890: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  .} {}..do_test p
78a0: 61 67 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20 20  ager1-5.2.1 {.  
78b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
78c0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
78d0: 65 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20 20  e = memory;.    
78e0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
78f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7900: 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76  ES(84, 'Andropov
7910: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
7920: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
7930: 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b  84, 'Andropov');
7940: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
7950: 0a 7d 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f 74  .} {memory}.do_t
7960: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 33 2e 31  est pager1-5.3.1
7970: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
7980: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
7990: 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20 20  l_mode = off;.  
79a0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
79b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
79c0: 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63  LUES(85, 'Gorbac
79d0: 68 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  hev');.      INS
79e0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
79f0: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
7a00: 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  v');.    COMMIT;
7a10: 0a 20 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64 6f  .  }.} {off}..do
7a20: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34  _test pager1-5.4
7a30: 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .1 {.  db close.
7a40: 20 20 74 65 73 74 76 66 73 20 74 76 0a 20 20 73    testvfs tv.  s
7a50: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
7a60: 62 20 2d 76 66 73 20 74 76 0a 20 20 65 78 65 63  b -vfs tv.  exec
7a70: 73 71 6c 20 7b 20 41 54 54 41 43 48 20 27 74 65  sql { ATTACH 'te
7a80: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 20 7d  st.db2' AS aux }
7a90: 0a 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78 44  ..  tv filter xD
7aa0: 65 6c 65 74 65 0a 20 20 74 76 20 73 63 72 69 70  elete.  tv scrip
7ab0: 74 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69  t max_journal_si
7ac0: 7a 65 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69  ze.  tv sectorsi
7ad0: 7a 65 20 35 31 32 0a 20 20 73 65 74 20 3a 3a 6d  ze 512.  set ::m
7ae0: 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 70  ax_journal 0.  p
7af0: 72 6f 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f  roc max_journal_
7b00: 73 69 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72 67  size {method arg
7b10: 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 7a 20  s} {.    set sz 
7b20: 30 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73 65  0.    catch { se
7b30: 74 20 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65 20  t sz [file size 
7b40: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d  test.db-journal]
7b50: 20 7d 0a 20 20 20 20 69 66 20 7b 24 73 7a 20 3e   }.    if {$sz >
7b60: 20 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 7d   $::max_journal}
7b70: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d   {.      set ::m
7b80: 61 78 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a 20  ax_journal $sz. 
7b90: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
7ba0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20  SQLITE_OK.  }.  
7bb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
7bc0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
7bd0: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20  e = DELETE;.    
7be0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
7bf0: 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20  us = NORMAL;.   
7c00: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
7c10: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
7c20: 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68  UES(85, 'Gorbach
7c30: 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ev');.      INSE
7c40: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
7c50: 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76  S(85, 'Gorbachev
7c60: 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ');.    COMMIT;.
7c70: 20 20 7d 0a 0a 20 20 23 20 54 68 65 20 73 69 7a    }..  # The siz
7c80: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
7c90: 20 66 69 6c 65 20 69 73 20 6e 6f 77 3a 0a 20 20   file is now:.  
7ca0: 23 20 0a 20 20 23 20 20 20 31 29 20 35 31 32 20  # .  #   1) 512 
7cb0: 62 79 74 65 20 68 65 61 64 65 72 20 2b 0a 20 20  byte header +.  
7cc0: 23 20 20 20 32 29 20 32 20 2a 20 28 31 30 32 34  #   2) 2 * (1024
7cd0: 2b 38 29 20 62 79 74 65 20 72 65 63 6f 72 64 73  +8) byte records
7ce0: 20 2b 0a 20 20 23 20 20 20 33 29 20 32 30 2b 4e   +.  #   3) 20+N
7cf0: 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72   bytes of master
7d00: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
7d10: 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  , where N is the
7d20: 20 73 69 7a 65 20 6f 66 20 0a 20 20 23 20 20 20   size of .  #   
7d30: 20 20 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f     the master-jo
7d40: 75 72 6e 61 6c 20 6e 61 6d 65 20 65 6e 63 6f 64  urnal name encod
7d50: 65 64 20 61 73 20 75 74 66 2d 38 20 77 69 74 68  ed as utf-8 with
7d60: 20 6e 6f 20 6e 75 6c 20 74 65 72 6d 2e 0a 20 20   no nul term..  
7d70: 23 0a 20 20 73 65 74 20 6d 6a 5f 70 6f 69 6e 74  #.  set mj_point
7d80: 65 72 20 5b 65 78 70 72 20 7b 0a 20 20 20 20 32  er [expr {.    2
7d90: 30 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  0 + [string leng
7da0: 74 68 20 22 74 65 73 74 2e 64 62 2d 6d 6a 58 58  th "test.db-mjXX
7db0: 58 58 58 58 39 58 58 22 5d 0a 20 20 7d 5d 0a 20  XXXX9XX"].  }]. 
7dc0: 20 23 0a 20 20 23 20 20 20 4e 4f 54 45 3a 20 46   #.  #   NOTE: F
7dd0: 6f 72 20 69 74 65 6d 20 33 20 61 62 6f 76 65 2c  or item 3 above,
7de0: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
7df0: 53 51 4c 69 74 65 20 56 46 53 20 6c 61 63 6b 73  SQLite VFS lacks
7e00: 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
7e10: 61 0a 20 20 23 20 20 20 20 20 20 20 20 20 63 75  a.  #         cu
7e20: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2c  rrent directory,
7e30: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
7e40: 68 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63  he current direc
7e50: 74 6f 72 79 20 6e 61 6d 65 20 70 6c 75 73 20 31  tory name plus 1
7e60: 0a 20 20 23 20 20 20 20 20 20 20 20 20 63 68 61  .  #         cha
7e70: 72 61 63 74 65 72 20 66 6f 72 20 74 68 65 20 64  racter for the d
7e80: 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
7e90: 6f 72 20 63 68 61 72 61 63 74 65 72 20 61 72 65  or character are
7ea0: 20 4e 4f 54 20 63 6f 75 6e 74 65 64 20 61 73 0a   NOT counted as.
7eb0: 20 20 23 20 20 20 20 20 20 20 20 20 70 61 72 74    #         part
7ec0: 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 73 69   of the total si
7ed0: 7a 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74  ze; otherwise, t
7ee0: 68 65 79 20 61 72 65 2e 0a 20 20 23 0a 20 20 69  hey are..  #.  i
7ef0: 66 63 61 70 61 62 6c 65 20 63 75 72 64 69 72 20  fcapable curdir 
7f00: 7b 0a 20 20 20 20 73 65 74 20 6d 6a 5f 70 6f 69  {.    set mj_poi
7f10: 6e 74 65 72 20 5b 65 78 70 72 20 7b 24 6d 6a 5f  nter [expr {$mj_
7f20: 70 6f 69 6e 74 65 72 20 2b 20 5b 73 74 72 69 6e  pointer + [strin
7f30: 67 20 6c 65 6e 67 74 68 20 5b 67 65 74 5f 70 77  g length [get_pw
7f40: 64 5d 5d 20 2b 20 31 7d 5d 0a 20 20 7d 0a 20 20  d]] + 1}].  }.  
7f50: 65 78 70 72 20 7b 24 3a 3a 6d 61 78 5f 6a 6f 75  expr {$::max_jou
7f60: 72 6e 61 6c 3d 3d 28 35 31 32 2b 32 2a 28 31 30  rnal==(512+2*(10
7f70: 32 34 2b 38 29 2b 24 6d 6a 5f 70 6f 69 6e 74 65  24+8)+$mj_pointe
7f80: 72 29 7d 0a 7d 20 31 0a 64 6f 5f 74 65 73 74 20  r)}.} 1.do_test 
7f90: 70 61 67 65 72 31 2d 35 2e 34 2e 32 20 7b 0a 20  pager1-5.4.2 {. 
7fa0: 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e   set ::max_journ
7fb0: 61 6c 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b  al 0.  execsql {
7fc0: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
7fd0: 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a  hronous = full;.
7fe0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
7ff0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
8000: 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e  WHERE b = 'Lenin
8010: 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  ';.      DELETE 
8020: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20  FROM t2 WHERE b 
8030: 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 43  = 'Lenin';.    C
8040: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 23 20  OMMIT;.  }..  # 
8050: 49 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66  In synchronous=f
8060: 75 6c 6c 20 6d 6f 64 65 2c 20 74 68 65 20 6d 61  ull mode, the ma
8070: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
8080: 6e 74 65 72 20 69 73 20 6e 6f 74 20 77 72 69 74  nter is not writ
8090: 74 65 6e 0a 20 20 23 20 64 69 72 65 63 74 6c 79  ten.  # directly
80a0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
80b0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
80c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 73 74  urnal file. Inst
80d0: 65 61 64 2c 20 69 74 20 69 73 0a 20 20 23 20 77  ead, it is.  # w
80e0: 72 69 74 74 65 6e 20 73 74 61 72 74 69 6e 67 20  ritten starting 
80f0: 61 74 20 74 68 65 20 6e 65 78 74 20 28 69 6e 20  at the next (in 
8100: 74 68 69 73 20 63 61 73 65 20 35 31 32 20 62 79  this case 512 by
8110: 74 65 29 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  te) sector bound
8120: 61 72 79 2e 0a 20 20 23 0a 20 20 73 65 74 20 6d  ary..  #.  set m
8130: 6a 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20  j_pointer [expr 
8140: 7b 0a 20 20 20 20 32 30 20 2b 20 5b 73 74 72 69  {.    20 + [stri
8150: 6e 67 20 6c 65 6e 67 74 68 20 22 74 65 73 74 2e  ng length "test.
8160: 64 62 2d 6d 6a 58 58 58 58 58 58 39 58 58 22 5d  db-mjXXXXXX9XX"]
8170: 0a 20 20 7d 5d 0a 20 20 23 0a 20 20 23 20 20 20  .  }].  #.  #   
8180: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 63 75 72  NOTE: If the cur
8190: 72 65 6e 74 20 53 51 4c 69 74 65 20 56 46 53 20  rent SQLite VFS 
81a0: 6c 61 63 6b 73 20 74 68 65 20 63 6f 6e 63 65 70  lacks the concep
81b0: 74 20 6f 66 20 61 20 63 75 72 72 65 6e 74 20 64  t of a current d
81c0: 69 72 65 63 74 6f 72 79 2c 0a 20 20 23 20 20 20  irectory,.  #   
81d0: 20 20 20 20 20 20 74 68 65 20 6c 65 6e 67 74 68        the length
81e0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
81f0: 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 70  directory name p
8200: 6c 75 73 20 31 20 63 68 61 72 61 63 74 65 72 20  lus 1 character 
8210: 66 6f 72 20 74 68 65 0a 20 20 23 20 20 20 20 20  for the.  #     
8220: 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 73 65      directory se
8230: 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
8240: 72 20 61 72 65 20 4e 4f 54 20 63 6f 75 6e 74 65  r are NOT counte
8250: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
8260: 20 74 6f 74 61 6c 0a 20 20 23 20 20 20 20 20 20   total.  #      
8270: 20 20 20 73 69 7a 65 3b 20 6f 74 68 65 72 77 69     size; otherwi
8280: 73 65 2c 20 74 68 65 79 20 61 72 65 2e 0a 20 20  se, they are..  
8290: 23 0a 20 20 69 66 63 61 70 61 62 6c 65 20 63 75  #.  ifcapable cu
82a0: 72 64 69 72 20 7b 0a 20 20 20 20 73 65 74 20 6d  rdir {.    set m
82b0: 6a 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20  j_pointer [expr 
82c0: 7b 24 6d 6a 5f 70 6f 69 6e 74 65 72 20 2b 20 5b  {$mj_pointer + [
82d0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67  string length [g
82e0: 65 74 5f 70 77 64 5d 5d 20 2b 20 31 7d 5d 0a 20  et_pwd]] + 1}]. 
82f0: 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 61   }.  expr {$::ma
8300: 78 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 28 28 35 31  x_journal==(((51
8310: 32 2b 32 2a 28 31 30 32 34 2b 38 29 2b 35 31 31  2+2*(1024+8)+511
8320: 29 2f 35 31 32 29 2a 35 31 32 20 2b 20 24 6d 6a  )/512)*512 + $mj
8330: 5f 70 6f 69 6e 74 65 72 29 7d 0a 7d 20 31 0a 64  _pointer)}.} 1.d
8340: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
8350: 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e..do_test pager
8360: 31 2d 35 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69  1-5.5.1 {.  sqli
8370: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
8380: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
8390: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32  ATTACH 'test.db2
83a0: 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52  ' AS aux;.    PR
83b0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
83c0: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
83d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
83e0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
83f0: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
8400: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
8410: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
8420: 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
8430: 20 20 55 50 44 41 54 45 20 74 33 20 53 45 54 20    UPDATE t3 SET 
8440: 62 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  b = randomblob(1
8450: 35 30 30 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72  500);.  }.  expr
8460: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
8470: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31  .db-journal] > 1
8480: 35 30 30 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  5000.} {1}.do_te
8490: 73 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 32 20  st pager1-5.5.2 
84a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
84b0: 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
84c0: 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20  nous = full;.   
84d0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45   BEGIN;.      DE
84e0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
84f0: 52 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b  RE b = 'Stalin';
8500: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
8510: 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20 3d 20  OM t2 WHERE b = 
8520: 27 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 43 4f  'Stalin';.    CO
8530: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  MMIT;.  }.  file
8540: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
8550: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d  urnal.} {0}...#-
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
85b0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77  ollowing tests w
85c0: 6f 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41  ork with "PRAGMA
85d0: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22   max_page_count"
85e0: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
85f0: 31 2d 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  1-6.1 {.  faults
8600: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
8610: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
8620: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
8630: 5f 76 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a  _vacuum = none;.
8640: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70      PRAGMA max_p
8650: 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a  age_count = 10;.
8660: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8670: 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t2(a, b);.    C
8680: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
8690: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
86a0: 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b   TABLE t4(a, b);
86b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
86c0: 45 20 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t5(a, b);.    
86d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28  CREATE TABLE t6(
86e0: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
86f0: 45 20 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29  E TABLE t7(a, b)
8700: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8710: 4c 45 20 74 38 28 61 2c 20 62 29 3b 0a 20 20 20  LE t8(a, b);.   
8720: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 39   CREATE TABLE t9
8730: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
8740: 54 45 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20  TE TABLE t10(a, 
8750: 62 29 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64  b);.  }.} {10}.d
8760: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
8770: 70 61 67 65 72 31 2d 36 2e 32 20 7b 0a 20 20 43  pager1-6.2 {.  C
8780: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 31 28  REATE TABLE t11(
8790: 61 2c 20 62 29 0a 7d 20 7b 31 20 7b 64 61 74 61  a, b).} {1 {data
87a0: 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20  base or disk is 
87b0: 66 75 6c 6c 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  full}}.do_execsq
87c0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
87d0: 34 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70  4 { PRAGMA max_p
87e0: 61 67 65 5f 63 6f 75 6e 74 20 20 20 20 20 20 7d  age_count      }
87f0: 20 7b 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {10}.do_execsql
8800: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 35  _test pager1-6.5
8810: 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61   { PRAGMA max_pa
8820: 67 65 5f 63 6f 75 6e 74 20 3d 20 31 35 20 7d 20  ge_count = 15 } 
8830: 7b 31 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {15}.do_execsql_
8840: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 36 20  test pager1-6.6 
8850: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  { CREATE TABLE t
8860: 31 31 28 61 2c 20 62 29 20 20 20 20 20 7d 20 7b  11(a, b)     } {
8870: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
8880: 74 20 70 61 67 65 72 31 2d 36 2e 37 20 7b 0a 20  t pager1-6.7 {. 
8890: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
88a0: 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55  RT INTO t11 VALU
88b0: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 50 52  ES(1, 2);.    PR
88c0: 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f  AGMA max_page_co
88d0: 75 6e 74 20 3d 20 31 33 3b 0a 7d 20 7b 31 33 7d  unt = 13;.} {13}
88e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
88f0: 20 70 61 67 65 72 31 2d 36 2e 38 20 7b 0a 20 20   pager1-6.8 {.  
8900: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
8910: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a  1 VALUES(3, 4);.
8920: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70      PRAGMA max_p
8930: 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a  age_count = 10;.
8940: 7d 20 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71  } {11}.do_execsq
8950: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
8960: 39 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a  9 { COMMIT } {}.
8970: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8980: 20 70 61 67 65 72 31 2d 36 2e 31 30 20 7b 20 50   pager1-6.10 { P
8990: 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63  RAGMA max_page_c
89a0: 6f 75 6e 74 20 3d 20 31 30 20 7d 20 7b 31 31 7d  ount = 10 } {11}
89b0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
89c0: 20 70 61 67 65 72 31 2d 36 2e 31 31 20 7b 20 53   pager1-6.11 { S
89d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31  ELECT * FROM t11
89e0: 20 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 32   }          {1 2
89f0: 20 33 20 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   3 4}.do_execsql
8a00: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31  _test pager1-6.1
8a10: 32 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70  2 { PRAGMA max_p
8a20: 61 67 65 5f 63 6f 75 6e 74 20 7d 20 20 20 20 20  age_count }     
8a30: 20 7b 31 31 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   {11}...#-------
8a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a80: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
8a90: 6e 67 20 74 65 73 74 73 20 77 6f 72 6b 20 77 69  ng tests work wi
8aa0: 74 68 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  th "PRAGMA journ
8ab0: 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45  al_mode=TRUNCATE
8ac0: 22 20 61 6e 64 0a 23 20 22 50 52 41 47 4d 41 20  " and.# "PRAGMA 
8ad0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
8ae0: 4c 55 53 49 56 45 22 2e 0a 23 0a 23 20 45 61 63  LUSIVE"..#.# Eac
8af0: 68 20 74 65 73 74 20 69 73 20 73 70 65 63 69 66  h test is specif
8b00: 69 65 64 20 77 69 74 68 20 35 20 76 61 72 69 61  ied with 5 varia
8b10: 62 6c 65 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  bles. As follows
8b20: 3a 0a 23 0a 23 20 20 20 24 74 6e 3a 20 20 54 65  :.#.#   $tn:  Te
8b30: 73 74 20 4e 75 6d 62 65 72 2e 20 55 73 65 64 20  st Number. Used 
8b40: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 5b  as part of the [
8b50: 64 6f 5f 74 65 73 74 5d 20 74 65 73 74 20 6e 61  do_test] test na
8b60: 6d 65 73 2e 0a 23 20 20 20 24 73 71 6c 3a 20 53  mes..#   $sql: S
8b70: 51 4c 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 23  QL to execute..#
8b80: 20 20 20 24 72 65 73 3a 20 45 78 70 65 63 74 65     $res: Expecte
8b90: 64 20 72 65 73 75 6c 74 20 6f 66 20 65 78 65 63  d result of exec
8ba0: 75 74 69 6e 67 20 24 73 71 6c 2e 0a 23 20 20 20  uting $sql..#   
8bb0: 24 6a 73 3a 20 20 54 68 65 20 65 78 70 65 63 74  $js:  The expect
8bc0: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ed size of the j
8bd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 6e 20  ournal file, in 
8be0: 62 79 74 65 73 2c 20 61 66 74 65 72 20 65 78 65  bytes, after exe
8bf0: 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20 20  cuting.#        
8c00: 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 2e   the SQL script.
8c10: 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20 6a 6f   Or -1 if the jo
8c20: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 65 78 70  urnal is not exp
8c30: 65 63 74 65 64 20 74 6f 20 65 78 69 73 74 2e 0a  ected to exist..
8c40: 23 20 20 20 24 77 73 3a 20 20 54 68 65 20 65 78  #   $ws:  The ex
8c50: 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20 74  pected size of t
8c60: 68 65 20 57 41 4c 20 66 69 6c 65 2c 20 69 6e 20  he WAL file, in 
8c70: 62 79 74 65 73 2c 20 61 66 74 65 72 20 65 78 65  bytes, after exe
8c80: 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20 20  cuting.#        
8c90: 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 2e   the SQL script.
8ca0: 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20 57 41   Or -1 if the WA
8cb0: 4c 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65  L is not expecte
8cc0: 64 20 74 6f 20 65 78 69 73 74 2e 0a 23 0a 69 66  d to exist..#.if
8cd0: 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20  capable wal {.  
8ce0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
8cf0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72  and_reopen.  for
8d00: 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72 65 73  each {tn sql res
8d10: 20 6a 73 20 77 73 7d 20 5b 73 75 62 73 74 20 7b   js ws} [subst {
8d20: 0a 20 20 0a 20 20 20 20 31 20 20 7b 0a 20 20 20  .  .    1  {.   
8d30: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
8d40: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
8d50: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
8d60: 75 6d 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52  um=OFF;.      PR
8d70: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
8d80: 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50  =NORMAL;.      P
8d90: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d  RAGMA page_size=
8da0: 31 30 32 34 3b 0a 20 20 20 20 20 20 50 52 41 47  1024;.      PRAG
8db0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  MA locking_mode=
8dc0: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
8dd0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
8de0: 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 3b 0a 20  mode=TRUNCATE;. 
8df0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
8e00: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
8e10: 3b 0a 20 20 20 20 7d 20 7b 65 78 63 6c 75 73 69  ;.    } {exclusi
8e20: 76 65 20 74 72 75 6e 63 61 74 65 7d 20 30 20 2d  ve truncate} 0 -
8e30: 31 0a 20 20 0a 20 20 20 20 32 20 20 7b 0a 20 20  1.  .    2  {.  
8e40: 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45 44 49      BEGIN IMMEDI
8e50: 41 54 45 3b 0a 20 20 20 20 20 20 20 20 53 45 4c  ATE;.        SEL
8e60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
8e70: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20       COMMIT;.   
8e80: 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20   } {1 2} 0 -1.  
8e90: 0a 20 20 20 20 33 20 20 7b 0a 20 20 20 20 20 20  .    3  {.      
8ea0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 53  BEGIN;.        S
8eb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
8ec0: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
8ed0: 20 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a     } {1 2} 0 -1.
8ee0: 20 20 0a 20 20 20 20 34 20 20 7b 20 50 52 41 47    .    4  { PRAG
8ef0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
8f00: 3d 20 57 41 4c 20 7d 20 20 20 20 77 61 6c 20 20  = WAL }    wal  
8f10: 20 20 20 20 20 2d 31 20 2d 31 0a 20 20 20 20 35       -1 -1.    5
8f20: 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20    { INSERT INTO 
8f30: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20  t1 VALUES(3, 4) 
8f40: 7d 20 20 7b 7d 20 20 20 20 20 20 20 20 2d 31 20  }  {}        -1 
8f50: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31  [wal_file_size 1
8f60: 20 31 30 32 34 5d 0a 20 20 20 20 36 20 20 7b 20   1024].    6  { 
8f70: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
8f80: 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20 65  ode = NORMAL } e
8f90: 78 63 6c 75 73 69 76 65 20 2d 31 20 5b 77 61 6c  xclusive -1 [wal
8fa0: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32  _file_size 1 102
8fb0: 34 5d 0a 20 20 20 20 37 20 20 7b 20 49 4e 53 45  4].    7  { INSE
8fc0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
8fd0: 53 28 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20  S(5, 6); } {}   
8fe0: 20 20 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c       -1 [wal_fil
8ff0: 65 5f 73 69 7a 65 20 32 20 31 30 32 34 5d 0a 20  e_size 2 1024]. 
9000: 20 0a 20 20 20 20 38 20 20 7b 20 50 52 41 47 4d   .    8  { PRAGM
9010: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
9020: 20 54 52 55 4e 43 41 54 45 20 7d 20 74 72 75 6e   TRUNCATE } trun
9030: 63 61 74 65 20 20 20 20 20 20 20 20 20 20 30 20  cate          0 
9040: 2d 31 0a 20 20 20 20 39 20 20 7b 20 49 4e 53 45  -1.    9  { INSE
9050: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
9060: 53 28 37 2c 20 38 29 20 7d 20 20 20 20 7b 7d 20  S(7, 8) }    {} 
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
9080: 20 2d 31 0a 20 20 20 20 31 30 20 7b 20 53 45 4c   -1.    10 { SEL
9090: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 31                {1
90b0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 7d 20   2 3 4 5 6 7 8} 
90c0: 30 20 2d 31 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20  0 -1.  .  }] {. 
90d0: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
90e0: 73 74 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74  st pager1-7.1.$t
90f0: 6e 2e 31 20 24 73 71 6c 20 24 72 65 73 0a 20 20  n.1 $sql $res.  
9100: 20 20 63 61 74 63 68 20 7b 20 73 65 74 20 4a 20    catch { set J 
9110: 2d 31 20 3b 20 73 65 74 20 4a 20 5b 66 69 6c 65  -1 ; set J [file
9120: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
9130: 75 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 63 61 74  urnal] }.    cat
9140: 63 68 20 7b 20 73 65 74 20 57 20 2d 31 20 3b 20  ch { set W -1 ; 
9150: 73 65 74 20 57 20 5b 66 69 6c 65 20 73 69 7a 65  set W [file size
9160: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a   test.db-wal] }.
9170: 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
9180: 72 31 2d 37 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c  r1-7.1.$tn.2 { l
9190: 69 73 74 20 24 4a 20 24 57 20 7d 20 5b 6c 69 73  ist $J $W } [lis
91a0: 74 20 24 6a 73 20 24 77 73 5d 0a 20 20 7d 0a 7d  t $js $ws].  }.}
91b0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
91c0: 2d 37 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74  -7.2.1 {.  fault
91d0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
91e0: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
91f0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  {.    PRAGMA loc
9200: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c  king_mode = EXCL
9210: 55 53 49 56 45 3b 0a 20 20 20 20 43 52 45 41 54  USIVE;.    CREAT
9220: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
9230: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
9240: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
9250: 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b  l_mode = delete;
9260: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
9270: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 74 72 75  urnal_mode = tru
9280: 6e 63 61 74 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78  ncate;.  }.} {ex
9290: 63 6c 75 73 69 76 65 20 64 65 6c 65 74 65 20 74  clusive delete t
92a0: 72 75 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74  runcate}.do_test
92b0: 20 70 61 67 65 72 31 2d 37 2e 32 2e 32 20 7b 0a   pager1-7.2.2 {.
92c0: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
92d0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
92e0: 53 28 31 2c 20 32 29 20 7d 0a 20 20 65 78 65 63  S(1, 2) }.  exec
92f0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
9300: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73  rnal_mode = pers
9310: 69 73 74 20 7d 0a 7d 20 7b 74 72 75 6e 63 61 74  ist }.} {truncat
9320: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
9330: 31 2d 37 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63  1-7.2.3 {.  exec
9340: 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20  sql { COMMIT }. 
9350: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
9360: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
9370: 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20  de = persist;.  
9380: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
9390: 5f 73 69 7a 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d  _size_limit;.  }
93a0: 0a 7d 20 7b 70 65 72 73 69 73 74 20 2d 31 7d 0a  .} {persist -1}.
93b0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
9400: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
9410: 73 2c 20 70 61 67 65 72 31 2d 38 2e 2a 2c 20 74  s, pager1-8.*, t
9420: 65 73 74 20 74 68 61 74 20 74 68 65 20 73 70 65  est that the spe
9430: 63 69 61 6c 20 66 69 6c 65 6e 61 6d 65 73 20 0a  cial filenames .
9440: 23 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 61 6e 64  # ":memory:" and
9450: 20 22 22 20 6f 70 65 6e 20 74 65 6d 70 6f 72 61   "" open tempora
9460: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a  ry databases..#.
9470: 66 6f 72 65 61 63 68 20 7b 74 6e 20 66 69 6c 65  foreach {tn file
9480: 6e 61 6d 65 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d  name} {.  1 :mem
9490: 6f 72 79 3a 0a 20 20 32 20 22 22 0a 7d 20 7b 0a  ory:.  2 "".} {.
94a0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
94b0: 2d 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66  -8.$tn.1 {.    f
94c0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
94d0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62  nd_reopen.    db
94e0: 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74   close.    sqlit
94f0: 65 33 20 64 62 20 24 66 69 6c 65 6e 61 6d 65 0a  e3 db $filename.
9500: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
9510: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
9520: 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20  vacuum = 1;.    
9530: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
9540: 31 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  1(x);.      INSE
9550: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
9560: 53 28 27 43 68 61 72 6c 65 73 27 29 3b 0a 20 20  S('Charles');.  
9570: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9580: 78 31 20 56 41 4c 55 45 53 28 27 4a 61 6d 65 73  x1 VALUES('James
9590: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
95a0: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
95b0: 27 4d 61 72 79 27 29 3b 0a 20 20 20 20 20 20 53  'Mary');.      S
95c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 3b  ELECT * FROM x1;
95d0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 43 68 61 72  .    }.  } {Char
95e0: 6c 65 73 20 4a 61 6d 65 73 20 4d 61 72 79 7d 0a  les James Mary}.
95f0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
9600: 31 2d 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  1-8.$tn.2 {.    
9610: 73 71 6c 69 74 65 33 20 64 62 32 20 24 66 69 6c  sqlite3 db2 $fil
9620: 65 6e 61 6d 65 0a 20 20 20 20 63 61 74 63 68 73  ename.    catchs
9630: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
9640: 4f 4d 20 78 31 20 7d 20 64 62 32 0a 20 20 7d 20  OM x1 } db2.  } 
9650: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c  {1 {no such tabl
9660: 65 3a 20 78 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78  e: x1}}..  do_ex
9670: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
9680: 31 2d 38 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  1-8.$tn.3 {.    
9690: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
96a0: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
96b0: 45 53 28 27 57 69 6c 6c 69 61 6d 27 29 3b 0a 20  ES('William');. 
96c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
96d0: 20 78 31 20 56 41 4c 55 45 53 28 27 41 6e 6e 65   x1 VALUES('Anne
96e0: 27 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ');.    ROLLBACK
96f0: 3b 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d  ;.  } {}.}..#---
9700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9740: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78  ------.# The nex
9750: 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73  t block of tests
9760: 20 2d 20 70 61 67 65 72 31 2d 39 2e 2a 20 2d 20   - pager1-9.* - 
9770: 64 65 61 6c 20 77 69 74 68 20 69 6e 74 65 72 61  deal with intera
9780: 63 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 23  ctions between.#
9790: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 74   the pager and t
97a0: 68 65 20 62 61 63 6b 75 70 20 41 50 49 2e 20 54  he backup API. T
97b0: 65 73 74 20 63 61 73 65 73 3a 0a 23 0a 23 20 20  est cases:.#.#  
97c0: 20 70 61 67 65 72 31 2d 39 2e 31 2e 2a 3a 20 54   pager1-9.1.*: T
97d0: 65 73 74 20 74 68 61 74 20 61 20 62 61 63 6b 75  est that a backu
97e0: 70 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  p completes succ
97f0: 65 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66  essfully even if
9800: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
9810: 20 20 20 20 20 20 20 73 6f 75 72 63 65 20 64 62         source db
9820: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
9830: 75 72 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  uring the backup
9840: 20 6f 70 2e 0a 23 0a 23 20 20 20 70 61 67 65 72   op..#.#   pager
9850: 31 2d 39 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68  1-9.2.*: Test th
9860: 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70  at a backup comp
9870: 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c  letes successful
9880: 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23  ly even if the.#
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 73 6f 75 72 63 65 20 64 62 20 69 73 20 77 72   source db is wr
98b0: 69 74 74 65 6e 20 74 6f 20 61 6e 64 20 74 68 65  itten to and the
98c0: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 64 75  n rolled back du
98d0: 72 69 6e 67 20 61 20 0a 23 20 20 20 20 20 20 20  ring a .#       
98e0: 20 20 20 20 20 20 20 20 20 20 62 61 63 6b 75 70            backup
98f0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f   operation..#.do
9900: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30  _test pager1-9.0
9910: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
9920: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
9930: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
9940: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
9950: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
9960: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
9970: 3d 20 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b  = 10;.    BEGIN;
9980: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
9990: 42 4c 45 20 61 62 28 61 2c 20 62 2c 20 55 4e 49  BLE ab(a, b, UNI
99a0: 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20  QUE(a, b));.    
99b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
99c0: 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e   VALUES( a_strin
99d0: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
99e0: 28 33 30 30 29 20 29 3b 0a 20 20 20 20 20 20 49  (300) );.      I
99f0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
9a00: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
9a10: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
9a20: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
9a30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
9a40: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
9a50: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9a60: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
9a70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
9a80: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
9a90: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
9aa0: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
9ab0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9ac0: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
9ad0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
9ae0: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
9af0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9b00: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
9b10: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
9b20: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
9b30: 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  b;.      INSERT 
9b40: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
9b50: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
9b60: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
9b70: 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   ab;.      INSER
9b80: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
9b90: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
9ba0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
9bb0: 4f 4d 20 61 62 3b 0a 20 20 20 20 43 4f 4d 4d 49  OM ab;.    COMMI
9bc0: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  T;.  }.} {}.do_t
9bd0: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 32  est pager1-9.0.2
9be0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
9bf0: 20 74 65 73 74 2e 64 62 32 0a 20 20 64 62 32 20   test.db2.  db2 
9c00: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 63 61  eval { PRAGMA ca
9c10: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a  che_size = 10 }.
9c20: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
9c30: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
9c40: 61 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74  ain.  list [B st
9c50: 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e  ep 10000] [B fin
9c60: 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  ish].} {SQLITE_D
9c70: 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  ONE SQLITE_OK}.d
9c80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9c90: 30 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53  0.3 {. db one {S
9ca0: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
9cb0: 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64  b) FROM ab}.} [d
9cc0: 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  b2 one {SELECT m
9cd0: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
9ce0: 20 61 62 7d 5d 0a 0a 64 6f 5f 74 65 73 74 20 70   ab}]..do_test p
9cf0: 61 67 65 72 31 2d 39 2e 31 2e 31 20 7b 0a 20 20  ager1-9.1.1 {.  
9d00: 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45  execsql { UPDATE
9d10: 20 61 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74   ab SET a = a_st
9d20: 72 69 6e 67 28 32 30 31 29 20 7d 0a 20 20 73 71  ring(201) }.  sq
9d30: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
9d40: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
9d50: 20 20 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53    B step 30.} {S
9d60: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
9d70: 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 32 20 7b  t pager1-9.1.2 {
9d80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44  .  execsql { UPD
9d90: 41 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 61  ATE ab SET b = a
9da0: 5f 73 74 72 69 6e 67 28 33 30 31 29 20 7d 0a 20  _string(301) }. 
9db0: 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30   list [B step 10
9dc0: 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a  000] [B finish].
9dd0: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53  } {SQLITE_DONE S
9de0: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
9df0: 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 33 20 7b  t pager1-9.1.3 {
9e00: 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54  . db one {SELECT
9e10: 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52   md5sum(a, b) FR
9e20: 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e  OM ab}.} [db2 on
9e30: 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  e {SELECT md5sum
9e40: 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d  (a, b) FROM ab}]
9e50: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9e60: 39 2e 31 2e 34 20 7b 20 65 78 65 63 73 71 6c 20  9.1.4 { execsql 
9e70: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
9e80: 29 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31  ) FROM ab } } {1
9e90: 32 38 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  28}..do_test pag
9ea0: 65 72 31 2d 39 2e 32 2e 31 20 7b 0a 20 20 65 78  er1-9.2.1 {.  ex
9eb0: 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61  ecsql { UPDATE a
9ec0: 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69  b SET a = a_stri
9ed0: 6e 67 28 32 30 32 29 20 7d 0a 20 20 73 71 6c 69  ng(202) }.  sqli
9ee0: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
9ef0: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
9f00: 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c  B step 30.} {SQL
9f10: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
9f20: 70 61 67 65 72 31 2d 39 2e 32 2e 32 20 7b 0a 20  pager1-9.2.2 {. 
9f30: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
9f40: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
9f50: 41 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 61  ATE ab SET b = a
9f60: 5f 73 74 72 69 6e 67 28 33 30 31 29 3b 0a 20 20  _string(301);.  
9f70: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a    ROLLBACK;.  }.
9f80: 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31    list [B step 1
9f90: 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d  0000] [B finish]
9fa0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .} {SQLITE_DONE 
9fb0: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
9fc0: 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 33 20  st pager1-9.2.3 
9fd0: 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  {. db one {SELEC
9fe0: 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46  T md5sum(a, b) F
9ff0: 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f  ROM ab}.} [db2 o
a000: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
a010: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
a020: 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ].do_test pager1
a030: 2d 39 2e 32 2e 34 20 7b 20 65 78 65 63 73 71 6c  -9.2.4 { execsql
a040: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
a050: 2a 29 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b  *) FROM ab } } {
a060: 31 32 38 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62  128}.db close.db
a070: 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74  2 close..do_test
a080: 20 70 61 67 65 72 31 2d 39 2e 33 2e 31 20 7b 0a   pager1-9.3.1 {.
a090: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65    testvfs tv -de
a0a0: 66 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63  fault 1.  tv sec
a0b0: 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 20 20 66  torsize 4096.  f
a0c0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
a0d0: 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 65 78 65  nd_reopen..  exe
a0e0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 70 61  csql { PRAGMA pa
a0f0: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 20 7d  ge_size = 1024 }
a100: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30  .  for {set ii 0
a110: 7d 20 7b 24 69 69 20 3c 20 34 7d 20 7b 69 6e 63  } {$ii < 4} {inc
a120: 72 20 69 69 7d 20 7b 20 65 78 65 63 73 71 6c 20  r ii} { execsql 
a130: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 24  "CREATE TABLE t$
a140: 7b 69 69 7d 28 61 2c 20 62 29 22 20 7d 0a 7d 20  {ii}(a, b)" }.} 
a150: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
a160: 31 2d 39 2e 33 2e 32 20 7b 0a 20 20 73 71 6c 69  1-9.3.2 {.  sqli
a170: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32  te3 db2 test.db2
a180: 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
a190: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
a1a0: 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 50  ze = 4096;.    P
a1b0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
a1c0: 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20 43 52 45  s = OFF;.    CRE
a1d0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
a1e0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
a1f0: 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20  ABLE t2(a, b);. 
a200: 20 7d 20 64 62 32 0a 0a 20 20 73 71 6c 69 74 65   } db2..  sqlite
a210: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d  3_backup B db2 m
a220: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20  ain db main.  B 
a230: 73 74 65 70 20 33 30 0a 20 20 6c 69 73 74 20 5b  step 30.  list [
a240: 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42  B step 10000] [B
a250: 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49   finish].} {SQLI
a260: 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f  TE_DONE SQLITE_O
a270: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
a280: 31 2d 39 2e 33 2e 33 20 7b 0a 20 20 64 62 32 20  1-9.3.3 {.  db2 
a290: 63 6c 6f 73 65 0a 20 20 64 62 20 63 6c 6f 73 65  close.  db close
a2a0: 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 20 20 66  .  tv delete.  f
a2b0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
a2c0: 32 0a 7d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  2.} [file size t
a2d0: 65 73 74 2e 64 62 5d 0a 0a 64 6f 5f 74 65 73 74  est.db]..do_test
a2e0: 20 70 61 67 65 72 31 2d 39 2e 34 2e 31 20 7b 0a   pager1-9.4.1 {.
a2f0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
a300: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73  e_and_reopen.  s
a310: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
a320: 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  db2.  execsql {.
a330: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
a340: 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20  size = 4096;.   
a350: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
a360: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
a370: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
a380: 29 3b 0a 20 20 7d 20 64 62 32 0a 20 20 73 71 6c  );.  } db2.  sql
a390: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62  ite3_backup B db
a3a0: 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20  2 main db main. 
a3b0: 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30   list [B step 10
a3c0: 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a  000] [B finish].
a3d0: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53  } {SQLITE_DONE S
a3e0: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
a3f0: 74 20 70 61 67 65 72 31 2d 39 2e 34 2e 32 20 7b  t pager1-9.4.2 {
a400: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69  .  list [file si
a410: 7a 65 20 74 65 73 74 2e 64 62 32 5d 20 5b 66 69  ze test.db2] [fi
a420: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
a430: 0a 7d 20 7b 30 20 30 7d 0a 64 62 32 20 63 6c 6f  .} {0 0}.db2 clo
a440: 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  se..#-----------
a450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
a490: 20 54 65 73 74 20 74 68 61 74 20 72 65 67 61 72   Test that regar
a4a0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
a4b0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  ue returned by x
a4c0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2c 20 74 68  SectorSize(), th
a4d0: 65 0a 23 20 6d 69 6e 69 6d 75 6d 20 65 66 66 65  e.# minimum effe
a4e0: 63 74 69 76 65 20 73 65 63 74 6f 72 2d 73 69 7a  ctive sector-siz
a4f0: 65 20 69 73 20 35 31 32 20 61 6e 64 20 74 68 65  e is 512 and the
a500: 20 6d 61 78 69 6d 75 6d 20 36 35 35 33 36 20 62   maximum 65536 b
a510: 79 74 65 73 2e 0a 23 0a 74 65 73 74 76 66 73 20  ytes..#.testvfs 
a520: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 66 6f  tv -default 1.fo
a530: 72 65 61 63 68 20 73 65 63 74 6f 72 73 69 7a 65  reach sectorsize
a540: 20 7b 0a 20 20 20 20 33 32 20 20 20 36 34 20 20   {.    32   64  
a550: 20 31 32 38 20 20 20 32 35 36 20 20 20 35 31 32   128   256   512
a560: 20 20 20 31 30 32 34 20 20 20 32 30 34 38 20 0a     1024   2048 .
a570: 20 20 20 20 34 30 39 36 20 38 31 39 32 20 31 36      4096 8192 16
a580: 33 38 34 20 33 32 37 36 38 20 36 35 35 33 36 20  384 32768 65536 
a590: 31 33 31 30 37 32 20 32 36 32 31 34 34 0a 7d 20  131072 262144.} 
a5a0: 7b 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  {.  tv sectorsiz
a5b0: 65 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20  e $sectorsize.  
a5c0: 74 76 20 64 65 76 63 68 61 72 20 7b 7d 0a 20 20  tv devchar {}.  
a5d0: 73 65 74 20 65 66 66 20 24 73 65 63 74 6f 72 73  set eff $sectors
a5e0: 69 7a 65 0a 20 20 69 66 20 7b 24 73 65 63 74 6f  ize.  if {$secto
a5f0: 72 73 69 7a 65 20 3c 20 35 31 32 7d 20 20 20 7b  rsize < 512}   {
a600: 20 73 65 74 20 65 66 66 20 35 31 32 20 7d 0a 20   set eff 512 }. 
a610: 20 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65   if {$sectorsize
a620: 20 3e 20 36 35 35 33 36 7d 20 7b 20 73 65 74 20   > 65536} { set 
a630: 65 66 66 20 36 35 35 33 36 20 7d 0a 0a 20 20 64  eff 65536 }..  d
a640: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30  o_test pager1-10
a650: 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 31 20 7b  .$sectorsize.1 {
a660: 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65  .    faultsim_de
a670: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
a680: 20 20 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74      db func a_st
a690: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
a6a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a6b0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
a6c0: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
a6d0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61  .      PRAGMA pa
a6e0: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
a6f0: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
a700: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a710: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
a720: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a730: 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t2(a, b);.     
a740: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a750: 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t3(a, b);.      
a760: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20  COMMIT;.    }.  
a770: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
a780: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20  .db-journal.  } 
a790: 5b 65 78 70 72 20 24 73 65 63 74 6f 72 73 69 7a  [expr $sectorsiz
a7a0: 65 20 3e 20 36 35 35 33 36 20 3f 20 36 35 35 33  e > 65536 ? 6553
a7b0: 36 20 3a 20 24 73 65 63 74 6f 72 73 69 7a 65 5d  6 : $sectorsize]
a7c0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
a7d0: 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a  r1-10.$sectorsiz
a7e0: 65 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  e.2 {.    execsq
a7f0: 6c 20 7b 20 0a 20 20 20 20 20 20 49 4e 53 45 52  l { .      INSER
a800: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
a810: 28 61 5f 73 74 72 69 6e 67 28 33 30 30 29 2c 20  (a_string(300), 
a820: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a  a_string(300));.
a830: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
a840: 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52  O t3 SELECT * FR
a850: 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a  OM t3;        /*
a860: 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    2 */.      INS
a870: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
a880: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20  CT * FROM t3;   
a890: 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20       /*  4 */.  
a8a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a8b0: 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t3 SELECT * FROM
a8c0: 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20   t3;        /*  
a8d0: 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  8 */.      INSER
a8e0: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
a8f0: 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20   * FROM t3;     
a900: 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20     /* 16 */.    
a910: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
a920: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
a930: 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 33 32 20  3;        /* 32 
a940: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  */.    }.  } {}.
a950: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
a960: 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65  1-10.$sectorsize
a970: 2e 33 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73  .3 {.    db clos
a980: 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  e.    sqlite3 db
a990: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65   test.db.    exe
a9a0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 50 52  csql { .      PR
a9b0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
a9c0: 3d 20 31 30 3b 0a 20 20 20 20 20 20 42 45 47 49  = 10;.      BEGI
a9d0: 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63  N;.    }.    rec
a9e0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32  ursive_select 32
a9f0: 20 74 33 20 7b 64 62 20 65 76 61 6c 20 22 49 4e   t3 {db eval "IN
aa00: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
aa10: 55 45 53 28 31 2c 20 32 29 22 7d 0a 20 20 20 20  UES(1, 2)"}.    
aa20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
aa30: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53 45  COMMIT;.      SE
aa40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
aa50: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a      }.  } {1 2}.
aa60: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
aa70: 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65  1-10.$sectorsize
aa80: 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .4 {.    execsql
aa90: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
aaa0: 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a  TABLE t6(a, b);.
aab0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
aac0: 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a 20 20 20  LE t7(a, b);.   
aad0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
aae0: 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t5(a, b);.      
aaf0: 44 52 4f 50 20 54 41 42 4c 45 20 74 36 3b 0a 20  DROP TABLE t6;. 
ab00: 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20       DROP TABLE 
ab10: 74 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  t7;.    }.    ex
ab20: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45  ecsql {.      BE
ab30: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45  GIN;.        CRE
ab40: 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c 20  ATE TABLE t6(a, 
ab50: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  b);.    }.    re
ab60: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33  cursive_select 3
ab70: 32 20 74 33 20 7b 64 62 20 65 76 61 6c 20 22 49  2 t3 {db eval "I
ab80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41  NSERT INTO t5 VA
ab90: 4c 55 45 53 28 31 2c 20 32 29 22 7d 0a 20 20 20  LUES(1, 2)"}.   
aba0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
abb0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53   COMMIT;.      S
abc0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 3b  ELECT * FROM t5;
abd0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d  .    }.  } {1 2}
abe0: 0a 20 20 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a  .  .}.db close..
abf0: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30  tv sectorsize 40
ac00: 39 36 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  96.do_test pager
ac10: 31 2e 31 30 2e 78 2e 31 20 7b 0a 20 20 66 61 75  1.10.x.1 {.  fau
ac20: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
ac30: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
ac40: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  l {.    PRAGMA a
ac50: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6e 6f 6e  uto_vacuum = non
ac60: 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61  e;.    PRAGMA pa
ac70: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
ac80: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
ac90: 20 74 31 28 78 29 3b 0a 20 20 7d 0a 20 20 66 6f   t1(x);.  }.  fo
aca0: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c  r {set i 0} {$i<
acb0: 33 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  30} {incr i} {. 
acc0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
acd0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
ace0: 45 53 28 7a 65 72 6f 62 6c 6f 62 28 39 30 30 29  ES(zeroblob(900)
acf0: 29 20 7d 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  ) }.  }.  file s
ad00: 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 33  ize test.db.} {3
ad10: 32 37 36 38 7d 0a 64 6f 5f 74 65 73 74 20 70 61  2768}.do_test pa
ad20: 67 65 72 31 2e 31 30 2e 78 2e 32 20 7b 0a 20 20  ger1.10.x.2 {.  
ad30: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
ad40: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29  EATE TABLE t2(x)
ad50: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
ad60: 20 74 32 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20   t2;.  }.  file 
ad70: 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b  size test.db.} {
ad80: 33 33 37 39 32 7d 0a 64 6f 5f 74 65 73 74 20 70  33792}.do_test p
ad90: 61 67 65 72 31 2e 31 30 2e 78 2e 33 20 7b 0a 20  ager1.10.x.3 {. 
ada0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
adb0: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
adc0: 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20   TABLE t2(x);.  
add0: 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65  }.  recursive_se
ade0: 6c 65 63 74 20 33 30 20 74 31 0a 20 20 65 78 65  lect 30 t1.  exe
adf0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
ae00: 45 20 54 41 42 4c 45 20 74 33 28 78 29 3b 0a 20  E TABLE t3(x);. 
ae10: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
ae20: 20 7b 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76   {}..db close.tv
ae30: 20 64 65 6c 65 74 65 0a 0a 74 65 73 74 76 66 73   delete..testvfs
ae40: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 66   tv -default 1.f
ae50: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
ae60: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e  nd_reopen.db fun
ae70: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
ae80: 69 6e 67 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ing.do_execsql_t
ae90: 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 31 20  est pager1-11.1 
aea0: 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  {.  PRAGMA journ
aeb0: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
aec0: 3b 0a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65  ;.  PRAGMA cache
aed0: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45  _size = 10;.  BE
aee0: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
aef0: 54 41 42 4c 45 20 7a 7a 28 74 6f 70 20 50 52 49  TABLE zz(top PRI
af00: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49  MARY KEY);.    I
af10: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 56 41  NSERT INTO zz VA
af20: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 32  LUES(a_string(22
af30: 32 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  2));.    INSERT 
af40: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
af50: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
af60: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
af70: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
af80: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
af90: 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74  O zz SELECT a_st
afa0: 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32  ring((SELECT 222
afb0: 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d  +max(rowid) FROM
afc0: 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20   zz)) FROM zz;. 
afd0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
afe0: 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  z SELECT a_strin
aff0: 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61  g((SELECT 222+ma
b000: 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a  x(rowid) FROM zz
b010: 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20  )) FROM zz;.    
b020: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53  INSERT INTO zz S
b030: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28  ELECT a_string((
b040: 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72  SELECT 222+max(r
b050: 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20  owid) FROM zz)) 
b060: 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53  FROM zz;.    INS
b070: 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45  ERT INTO zz SELE
b080: 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c  CT a_string((SEL
b090: 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69  ECT 222+max(rowi
b0a0: 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f  d) FROM zz)) FRO
b0b0: 4d 20 7a 7a 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a  M zz;.  COMMIT;.
b0c0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 55 50 44    BEGIN;.    UPD
b0d0: 41 54 45 20 7a 7a 20 53 45 54 20 74 6f 70 20 3d  ATE zz SET top =
b0e0: 20 61 5f 73 74 72 69 6e 67 28 33 34 35 29 3b 0a   a_string(345);.
b0f0: 7d 20 7b 64 65 6c 65 74 65 7d 0a 0a 70 72 6f 63  } {delete}..proc
b100: 20 6c 6f 63 6b 6f 75 74 20 7b 6d 65 74 68 6f 64   lockout {method
b110: 20 61 72 67 73 7d 20 7b 20 72 65 74 75 72 6e 20   args} { return 
b120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7d 0a 74  SQLITE_IOERR }.t
b130: 76 20 73 63 72 69 70 74 20 6c 6f 63 6b 6f 75 74  v script lockout
b140: 0a 74 76 20 66 69 6c 74 65 72 20 7b 78 57 72 69  .tv filter {xWri
b150: 74 65 20 78 54 72 75 6e 63 61 74 65 20 78 53 79  te xTruncate xSy
b160: 6e 63 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  nc}.do_catchsql_
b170: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 32  test pager1-11.2
b180: 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 31 20 7b   { COMMIT } {1 {
b190: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d  disk I/O error}}
b1a0: 0a 0a 74 76 20 73 63 72 69 70 74 20 7b 7d 0a 64  ..tv script {}.d
b1b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31  o_test pager1-11
b1c0: 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .3 {.  sqlite3 d
b1d0: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  b2 test.db.  exe
b1e0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
b1f0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
b200: 20 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 50   TRUNCATE;.    P
b210: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
b220: 63 68 65 63 6b 3b 0a 20 20 7d 20 64 62 32 0a 7d  check;.  } db2.}
b230: 20 7b 74 72 75 6e 63 61 74 65 20 6f 6b 7d 0a 64   {truncate ok}.d
b240: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31  o_test pager1-11
b250: 2e 34 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65  .4 {.  db2 close
b260: 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74  .  file exists t
b270: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d  est.db-journal.}
b280: 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {0}.do_execsql_
b290: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 35  test pager1-11.5
b2a0: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
b2b0: 2a 29 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b 33 32  *) FROM zz } {32
b2c0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  }.db close.tv de
b2d0: 6c 65 74 65 0a 20 20 0a 23 2d 2d 2d 2d 2d 2d 2d  lete.  .#-------
b2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b320: 2d 2d 0a 23 20 54 65 73 74 20 22 50 52 41 47 4d  --.# Test "PRAGM
b330: 41 20 70 61 67 65 5f 73 69 7a 65 22 0a 23 0a 74  A page_size".#.t
b340: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
b350: 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69  lt 1.tv sectorsi
b360: 7a 65 20 31 30 32 34 0a 66 6f 72 65 61 63 68 20  ze 1024.foreach 
b370: 70 61 67 65 73 69 7a 65 20 7b 0a 20 20 20 20 35  pagesize {.    5
b380: 31 32 20 20 20 31 30 32 34 20 20 20 32 30 34 38  12   1024   2048
b390: 20 34 30 39 36 20 38 31 39 32 20 31 36 33 38 34   4096 8192 16384
b3a0: 20 33 32 37 36 38 20 0a 7d 20 7b 0a 20 20 66 61   32768 .} {.  fa
b3b0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
b3c0: 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 23 20 54 68  d_reopen..  # Th
b3d0: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 28 61  e sector-size (a
b3e0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
b3f0: 56 46 53 29 20 69 73 20 31 30 32 34 20 62 79 74  VFS) is 1024 byt
b400: 65 73 2e 20 53 6f 20 69 66 20 74 68 65 0a 20 20  es. So if the.  
b410: 23 20 70 61 67 65 2d 73 69 7a 65 20 72 65 71 75  # page-size requ
b420: 65 73 74 65 64 20 75 73 69 6e 67 20 22 50 52 41  ested using "PRA
b430: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 20 69  GMA page_size" i
b440: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
b450: 68 65 0a 20 20 23 20 63 6f 6d 70 69 6c 65 20 74  he.  # compile t
b460: 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c  ime value of SQL
b470: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
b480: 45 2c 20 74 68 65 6e 20 74 68 65 20 65 66 66 65  E, then the effe
b490: 63 74 69 76 65 20 0a 20 20 23 20 70 61 67 65 2d  ctive .  # page-
b4a0: 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 31 30 32  size remains 102
b4b0: 34 20 62 79 74 65 73 2e 0a 20 20 23 0a 20 20 73  4 bytes..  #.  s
b4c0: 65 74 20 65 66 66 20 24 70 61 67 65 73 69 7a 65  et eff $pagesize
b4d0: 0a 20 20 69 66 20 7b 24 65 66 66 20 3e 20 24 3a  .  if {$eff > $:
b4e0: 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  :SQLITE_MAX_PAGE
b4f0: 5f 53 49 5a 45 7d 20 7b 20 73 65 74 20 65 66 66  _SIZE} { set eff
b500: 20 31 30 32 34 20 7d 0a 0a 20 20 64 6f 5f 74 65   1024 }..  do_te
b510: 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61  st pager1-12.$pa
b520: 67 65 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 73  gesize.1 {.    s
b530: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
b540: 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  db.    execsql "
b550: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61  .      PRAGMA pa
b560: 67 65 5f 73 69 7a 65 20 3d 20 24 70 61 67 65 73  ge_size = $pages
b570: 69 7a 65 3b 0a 20 20 20 20 20 20 43 52 45 41 54  ize;.      CREAT
b580: 45 20 56 49 45 57 20 76 20 41 53 20 53 45 4c 45  E VIEW v AS SELE
b590: 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
b5a0: 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 22 20 64  _master;.    " d
b5b0: 62 32 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65  b2.    file size
b5c0: 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 24 65 66   test.db.  } $ef
b5d0: 66 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  f.  do_test page
b5e0: 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e  r1-12.$pagesize.
b5f0: 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  2 {.    sqlite3 
b600: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20  db2 test.db.    
b610: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
b620: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
b630: 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50   FROM v;.      P
b640: 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f  RAGMA main.page_
b650: 73 69 7a 65 3b 0a 20 20 20 20 7d 20 64 62 32 0a  size;.    } db2.
b660: 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 66 66    } [list 1 $eff
b670: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
b680: 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e  r1-12.$pagesize.
b690: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
b6a0: 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  { .      SELECT 
b6b0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b  count(*) FROM v;
b6c0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
b6d0: 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20  in.page_size;.  
b6e0: 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20    }.  } [list 1 
b6f0: 24 65 66 66 5d 0a 20 20 64 62 32 20 63 6c 6f 73  $eff].  db2 clos
b700: 65 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  e.}.db close.tv 
b710: 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  delete..#-------
b720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b760: 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c  --.# Test specal
b770: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
b780: 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 74  _mode=PERSIST" t
b790: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70  est cases..#.# p
b7a0: 61 67 65 72 31 2d 31 33 2e 31 2e 2a 3a 20 54 68  ager1-13.1.*: Th
b7b0: 69 73 20 74 65 73 74 73 20 61 20 73 70 65 63 69  is tests a speci
b7c0: 61 6c 20 63 61 73 65 20 65 6e 63 6f 75 6e 74 65  al case encounte
b7d0: 72 65 64 20 69 6e 20 70 65 72 73 69 73 74 65 6e  red in persisten
b7e0: 74 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  t .#            
b7f0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65      journal mode
b800: 3a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  : If the journal
b810: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
b820: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23   a transaction.#
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
b850: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b860: 20 28 62 65 63 61 75 73 65 20 61 20 70 72 65 76   (because a prev
b870: 69 6f 75 73 20 0a 23 20 20 20 20 20 20 20 20 20  ious .#         
b880: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
b890: 6f 6e 20 6c 65 66 74 20 61 20 76 65 72 79 20 6c  on left a very l
b8a0: 61 72 67 65 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75  arge non-hot jou
b8b0: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65  rnal file in the
b8c0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b8d0: 20 20 66 69 6c 65 2d 73 79 73 74 65 6d 29 2c 20    file-system), 
b8e0: 74 68 65 6e 20 53 51 4c 69 74 65 20 68 61 73 20  then SQLite has 
b8f0: 74 6f 20 62 65 20 63 61 72 65 66 75 6c 20 74 68  to be careful th
b900: 61 74 20 74 68 65 72 65 20 69 73 0a 23 20 20 20  at there is.#   
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74               not
b920: 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
b930: 72 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  r left over from
b940: 20 61 20 70 72 65 76 69 6f 75 73 20 74 72 61 6e   a previous tran
b950: 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20  saction.#       
b960: 20 20 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61           immedia
b970: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
b980: 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 65  he journal conte
b990: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2e  nt just written.
b9a0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b9b0: 20 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61    If there is, a
b9c0: 6e 64 20 74 68 65 20 70 72 6f 63 65 73 73 20 63  nd the process c
b9d0: 72 61 73 68 65 73 20 73 6f 20 74 68 61 74 20 74  rashes so that t
b9e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 20 20 20  he journal.#    
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f              beco
ba00: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
ba10: 6c 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 6f  l and must be ro
ba20: 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 61 6e 6f  lled back by ano
ba30: 74 68 65 72 0a 23 20 20 20 20 20 20 20 20 20 20  ther.#          
ba40: 20 20 20 20 20 20 70 72 6f 63 65 73 73 2c 20 74        process, t
ba50: 68 65 72 65 20 69 73 20 61 20 64 61 6e 67 65 72  here is a danger
ba60: 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
ba70: 70 72 6f 63 65 73 73 20 6d 61 79 20 72 6f 6c 6c  process may roll
ba80: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
ba90: 20 20 62 61 63 6b 20 74 68 65 20 61 62 6f 72 74    back the abort
baa0: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ed transaction, 
bab0: 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 63 6f  then continue co
bac0: 70 79 69 6e 67 20 64 61 74 61 0a 23 20 20 20 20  pying data.#    
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
bae0: 20 61 6e 20 6f 6c 64 65 72 20 74 72 61 6e 73 61   an older transa
baf0: 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72  ction from the r
bb00: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
bb10: 6a 6f 75 72 6e 61 6c 2e 0a 23 20 20 20 20 20 20  journal..#      
bb20: 20 20 20 20 20 20 20 20 20 20 53 65 65 20 74 68            See th
bb30: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 20  e syncJournal() 
bb40: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74  function for det
bb50: 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65 72 31  ails..#.# pager1
bb60: 2d 31 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65  -13.2.*: Same te
bb70: 73 74 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  st as the previo
bb80: 75 73 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 74  us. This time, t
bb90: 68 72 6f 77 20 61 6e 20 69 6e 64 65 78 20 69 6e  hrow an index in
bba0: 74 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  to.#            
bbb0: 20 20 20 20 74 68 65 20 6d 69 78 20 74 6f 20 6d      the mix to m
bbc0: 61 6b 65 20 74 68 65 20 69 6e 74 65 67 72 69 74  ake the integrit
bbd0: 79 2d 63 68 65 63 6b 20 6d 6f 72 65 20 6c 69 6b  y-check more lik
bbe0: 65 6c 79 20 74 6f 20 63 61 74 63 68 0a 23 20 20  ely to catch.#  
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
bc00: 72 6f 72 73 2e 0a 23 0a 74 65 73 74 76 66 73 20  rors..#.testvfs 
bc10: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76  tv -default 1.tv
bc20: 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a   script xSyncCb.
bc30: 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a  tv filter xSync.
bc40: 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 6d 65  proc xSyncCb {me
bc50: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
bc60: 67 73 7d 20 7b 0a 20 20 73 65 74 20 74 20 5b 66  gs} {.  set t [f
bc70: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61  ile tail $filena
bc80: 6d 65 5d 0a 20 20 69 66 20 7b 24 74 20 3d 3d 20  me].  if {$t == 
bc90: 22 74 65 73 74 2e 64 62 22 7d 20 66 61 75 6c 74  "test.db"} fault
bca0: 73 69 6d 5f 73 61 76 65 0a 20 20 72 65 74 75 72  sim_save.  retur
bcb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61  n SQLITE_OK.}.fa
bcc0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
bcd0: 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63  d_reopen.db func
bce0: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
bcf0: 6e 67 0a 0a 23 20 54 68 65 20 55 50 44 41 54 45  ng..# The UPDATE
bd00: 20 73 74 61 74 65 6d 65 6e 74 20 61 74 20 74 68   statement at th
bd10: 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 74 65  e end of this te
bd20: 73 74 20 63 61 73 65 20 63 72 65 61 74 65 73 20  st case creates 
bd30: 61 20 72 65 61 6c 6c 79 20 62 69 67 0a 23 20 6a  a really big.# j
bd40: 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 74 68  ournal. Since th
bd50: 65 20 63 61 63 68 65 2d 73 69 7a 65 20 69 73 20  e cache-size is 
bd60: 6f 6e 6c 79 20 31 30 20 70 61 67 65 73 2c 20 74  only 10 pages, t
bd70: 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
bd80: 69 6e 73 20 0a 23 20 66 72 65 71 75 65 6e 74 20  ins .# frequent 
bd90: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
bda0: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
bdb0: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 31  st pager1-13.1.1
bdc0: 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65   {.  PRAGMA page
bdd0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
bde0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
bdf0: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
be00: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
be10: 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e  ze = 10;.  BEGIN
be20: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
be30: 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20  LE t1(a INTEGER 
be40: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 42  PRIMARY KEY, b B
be50: 4c 4f 42 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  LOB);.    INSERT
be60: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
be70: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
be80: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
be90: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
bea0: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
beb0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
bec0: 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a        /*   2 */.
bed0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bee0: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
bef0: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
bf00: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
bf10: 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e  /*   4 */.    IN
bf20: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
bf30: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
bf40: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
bf50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38            /*   8
bf60: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
bf70: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
bf80: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
bf90: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
bfa0: 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20      /*  16 */.  
bfb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
bfc0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
bfd0: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
bfe0: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
bff0: 20 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45    32 */.    INSE
c000: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
c010: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
c020: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
c030: 20 20 20 20 20 20 20 20 2f 2a 20 20 36 34 20 2a          /*  64 *
c040: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
c050: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
c060: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
c070: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
c080: 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 43 4f    /* 128 */.  CO
c090: 4d 4d 49 54 3b 0a 20 20 55 50 44 41 54 45 20 74  MMIT;.  UPDATE t
c0a0: 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  1 SET b = a_stri
c0b0: 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 70 65 72 73  ng(400);.} {pers
c0c0: 69 73 74 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c  ist}..if {$::tcl
c0d0: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
c0e0: 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d 20  rm)!="windows"} 
c0f0: 7b 0a 23 20 52 75 6e 20 74 72 61 6e 73 61 63 74  {.# Run transact
c100: 69 6f 6e 73 20 6f 66 20 69 6e 63 72 65 61 73 69  ions of increasi
c110: 6e 67 20 73 69 7a 65 73 2e 20 45 76 65 6e 74 75  ng sizes. Eventu
c120: 61 6c 6c 79 2c 20 6f 6e 65 20 28 6f 72 20 6d 6f  ally, one (or mo
c130: 72 65 20 74 68 61 6e 20 6f 6e 65 29 0a 23 20 6f  re than one).# o
c140: 66 20 74 68 65 73 65 20 77 69 6c 6c 20 77 72 69  f these will wri
c150: 74 65 20 6a 75 73 74 20 65 6e 6f 75 67 68 20 63  te just enough c
c160: 6f 6e 74 65 6e 74 20 74 68 61 74 20 6f 6e 65 20  ontent that one 
c170: 6f 66 20 74 68 65 20 6f 6c 64 20 68 65 61 64 65  of the old heade
c180: 72 73 20 63 72 65 61 74 65 64 20 0a 23 20 62 79  rs created .# by
c190: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c1a0: 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
c1b0: 6f 76 65 20 6c 69 65 73 20 69 6d 6d 65 64 69 61  ove lies immedia
c1c0: 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 63  tely after the c
c1d0: 6f 6e 74 65 6e 74 0a 23 20 6a 6f 75 72 6e 61 6c  ontent.# journal
c1e0: 6c 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  led by the curre
c1f0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
c200: 23 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31  #.for {set nUp 1
c210: 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63  } {$nUp<64} {inc
c220: 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78  r nUp} {.  do_ex
c230: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
c240: 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 31 20  1-13.1.2.$nUp.1 
c250: 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 74 31  { .    UPDATE t1
c260: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
c270: 67 28 33 39 39 29 20 57 48 45 52 45 20 61 20 3c  g(399) WHERE a <
c280: 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20  = $nUp.  } {}.  
c290: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
c2a0: 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e  pager1-13.1.2.$n
c2b0: 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e  Up.2 { PRAGMA in
c2c0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
c2d0: 7b 6f 6b 7d 20 0a 0a 20 20 23 20 54 72 79 20 74  {ok} ..  # Try t
c2e0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 73 6e 61  o access the sna
c2f0: 70 73 68 6f 74 20 6f 66 20 74 68 65 20 66 69 6c  pshot of the fil
c300: 65 2d 73 79 73 74 65 6d 2e 0a 20 20 23 0a 20 20  e-system..  #.  
c310: 73 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74  sqlite3 db2 sv_t
c320: 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74  est.db.  do_test
c330: 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24   pager1-13.1.2.$
c340: 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  nUp.3 {.    exec
c350: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d  sql { SELECT sum
c360: 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d  (length(b)) FROM
c370: 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65   t1 } db2.  } [e
c380: 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28  xpr {128*400 - (
c390: 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74  $nUp-1)}].  do_t
c3a0: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e  est pager1-13.1.
c3b0: 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65  2.$nUp.4 {.    e
c3c0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
c3d0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
c3e0: 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20  } db2.  } {ok}. 
c3f0: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a   db2 close.}.}..
c400: 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  if {$::tcl_platf
c410: 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22  orm(platform)!="
c420: 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 53 61  windows"} {.# Sa
c430: 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65  me test as above
c440: 2e 20 42 75 74 20 74 68 69 73 20 74 69 6d 65 20  . But this time 
c450: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 6f 6e  with an index on
c460: 20 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a 64 6f   the table..#.do
c470: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
c480: 67 65 72 31 2d 31 33 2e 32 2e 31 20 7b 0a 20 20  ger1-13.2.1 {.  
c490: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
c4a0: 4f 4e 20 74 31 28 62 29 3b 0a 20 20 55 50 44 41  ON t1(b);.  UPDA
c4b0: 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f  TE t1 SET b = a_
c4c0: 73 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b  string(400);.} {
c4d0: 7d 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31  }.for {set nUp 1
c4e0: 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63  } {$nUp<64} {inc
c4f0: 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78  r nUp} {.  do_ex
c500: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
c510: 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 31 20  1-13.2.2.$nUp.1 
c520: 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 74 31  { .    UPDATE t1
c530: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
c540: 67 28 33 39 39 29 20 57 48 45 52 45 20 61 20 3c  g(399) WHERE a <
c550: 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20  = $nUp.  } {}.  
c560: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
c570: 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e  pager1-13.2.2.$n
c580: 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e  Up.2 { PRAGMA in
c590: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
c5a0: 7b 6f 6b 7d 20 0a 20 20 73 71 6c 69 74 65 33 20  {ok} .  sqlite3 
c5b0: 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20  db2 sv_test.db. 
c5c0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
c5d0: 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a  13.2.2.$nUp.3 {.
c5e0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
c5f0: 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28  LECT sum(length(
c600: 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  b)) FROM t1 } db
c610: 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38  2.  } [expr {128
c620: 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d  *400 - ($nUp-1)}
c630: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
c640: 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 34  r1-13.2.2.$nUp.4
c650: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
c660: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
c670: 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20  y_check } db2.  
c680: 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f  } {ok}.  db2 clo
c690: 73 65 0a 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65  se.}.}..db close
c6a0: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d  .tv delete..#---
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6f0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 70  ------.# Test sp
c700: 65 63 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75  ecal "PRAGMA jou
c710: 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 20 74  rnal_mode=OFF" t
c720: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 66 61 75  est cases..#.fau
c730: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
c740: 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73  _reopen.do_execs
c750: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c760: 34 2e 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  4.1.1 {.  PRAGMA
c770: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
c780: 4f 46 46 3b 0a 20 20 43 52 45 41 54 45 20 54 41  OFF;.  CREATE TA
c790: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
c7a0: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
c7b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
c7c0: 28 31 2c 20 32 29 3b 0a 20 20 43 4f 4d 4d 49 54  (1, 2);.  COMMIT
c7d0: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
c7e0: 4d 20 74 31 3b 0a 7d 20 7b 6f 66 66 20 31 20 32  M t1;.} {off 1 2
c7f0: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
c800: 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 32  st pager1-14.1.2
c810: 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20   {.  BEGIN;.    
c820: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
c830: 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 52  ALUES(3, 4);.  R
c840: 4f 4c 4c 42 41 43 4b 3b 0a 7d 20 7b 30 20 7b 7d  OLLBACK;.} {0 {}
c850: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
c860: 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 33 20  t pager1-14.1.3 
c870: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
c880: 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 7d 0a 64 6f  M t1;.} {1 2}.do
c890: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
c8a0: 61 67 65 72 31 2d 31 34 2e 31 2e 34 20 7b 0a 20  ager1-14.1.4 {. 
c8b0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
c8c0: 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77 69 64  RT INTO t1(rowid
c8d0: 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54 20 61  , a, b) SELECT a
c8e0: 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20 74 31  +3, b, b FROM t1
c8f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c900: 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62  O t1(rowid, a, b
c910: 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c  ) SELECT a+3, b,
c920: 20 62 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31   b FROM t1;.} {1
c930: 20 7b 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75   {PRIMARY KEY mu
c940: 73 74 20 62 65 20 75 6e 69 71 75 65 7d 7d 0a 64  st be unique}}.d
c950: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
c960: 61 67 65 72 31 2d 31 34 2e 31 2e 35 20 7b 0a 20  ager1-14.1.5 {. 
c970: 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43   COMMIT;.  SELEC
c980: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b  T * FROM t1;.} {
c990: 31 20 32 20 32 20 32 7d 0a 0a 23 2d 2d 2d 2d 2d  1 2 2 2}..#-----
c9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9e0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 6f 70 65 6e  ----.# Test open
c9f0: 69 6e 67 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ing and closing 
ca00: 74 68 65 20 70 61 67 65 72 20 73 75 62 2d 73 79  the pager sub-sy
ca10: 73 74 65 6d 20 77 69 74 68 20 64 69 66 66 65 72  stem with differ
ca20: 65 6e 74 20 76 61 6c 75 65 73 0a 23 20 66 6f 72  ent values.# for
ca30: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73   the sqlite3_vfs
ca40: 2e 73 7a 4f 73 46 69 6c 65 20 76 61 72 69 61 62  .szOsFile variab
ca50: 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64  le..#.faultsim_d
ca60: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
ca70: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
ca80: 20 70 61 67 65 72 31 2d 31 35 2e 30 20 7b 0a 20   pager1-15.0 {. 
ca90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 78   CREATE TABLE tx
caa0: 28 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45 52 54  (y, z);.  INSERT
cab0: 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28   INTO tx VALUES(
cac0: 27 41 79 75 74 74 68 61 79 61 27 2c 20 27 42 65  'Ayutthaya', 'Be
cad0: 69 6a 69 6e 67 27 29 3b 0a 20 20 49 4e 53 45 52  ijing');.  INSER
cae0: 54 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53  T INTO tx VALUES
caf0: 28 27 4c 6f 6e 64 6f 6e 27 2c 20 27 54 6f 6b 79  ('London', 'Toky
cb00: 6f 27 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f  o');.} {}.db clo
cb10: 73 65 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  se.for {set i 0}
cb20: 20 7b 24 69 3c 35 31 33 7d 20 7b 69 6e 63 72 20   {$i<513} {incr 
cb30: 69 20 33 7d 20 7b 0a 20 20 74 65 73 74 76 66 73  i 3} {.  testvfs
cb40: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d   tv -default 1 -
cb50: 73 7a 6f 73 66 69 6c 65 20 24 69 0a 20 20 73 71  szosfile $i.  sq
cb60: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
cb70: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
cb80: 73 74 20 70 61 67 65 72 31 2d 31 35 2e 24 69 2e  st pager1-15.$i.
cb90: 31 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  1 {.    SELECT *
cba0: 20 46 52 4f 4d 20 74 78 3b 0a 20 20 7d 20 7b 41   FROM tx;.  } {A
cbb0: 79 75 74 74 68 61 79 61 20 42 65 69 6a 69 6e 67  yutthaya Beijing
cbc0: 20 4c 6f 6e 64 6f 6e 20 54 6f 6b 79 6f 7d 0a 20   London Tokyo}. 
cbd0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64   db close.  tv d
cbe0: 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  elete.}..#------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc30: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
cc40: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
cc50: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 64 61  ble to open a da
cc60: 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 74  tabase file if t
cc70: 68 65 20 66 75 6c 6c 20 70 61 74 68 0a 23 20 74  he full path.# t
cc80: 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  o the associated
cc90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
cca0: 6c 6c 20 62 65 20 6c 6f 6e 67 65 72 20 74 68 61  ll be longer tha
ccb0: 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  n sqlite3_vfs.mx
ccc0: 50 61 74 68 6e 61 6d 65 2e 0a 23 0a 74 65 73 74  Pathname..#.test
ccd0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
cce0: 31 0a 74 76 20 73 63 72 69 70 74 20 78 4f 70 65  1.tv script xOpe
ccf0: 6e 43 62 0a 74 76 20 66 69 6c 74 65 72 20 78 4f  nCb.tv filter xO
cd00: 70 65 6e 0a 70 72 6f 63 20 78 4f 70 65 6e 43 62  pen.proc xOpenCb
cd10: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
cd20: 65 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20  e args} {.  set 
cd30: 3a 3a 66 69 6c 65 5f 6c 65 6e 20 5b 73 74 72 69  ::file_len [stri
cd40: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e  ng length $filen
cd50: 61 6d 65 5d 0a 7d 0a 73 71 6c 69 74 65 33 20 64  ame].}.sqlite3 d
cd60: 62 20 74 65 73 74 2e 64 62 0a 64 62 20 63 6c 6f  b test.db.db clo
cd70: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 66 6f  se.tv delete..fo
cd80: 72 20 7b 73 65 74 20 69 69 20 5b 65 78 70 72 20  r {set ii [expr 
cd90: 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2d 35 5d 7d 20  $::file_len-5]} 
cda0: 7b 24 69 69 20 3c 20 5b 65 78 70 72 20 24 3a 3a  {$ii < [expr $::
cdb0: 66 69 6c 65 5f 6c 65 6e 2b 32 30 5d 7d 20 7b 69  file_len+20]} {i
cdc0: 6e 63 72 20 69 69 7d 20 7b 0a 20 20 74 65 73 74  ncr ii} {.  test
cdd0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
cde0: 31 20 2d 6d 78 70 61 74 68 6e 61 6d 65 20 24 69  1 -mxpathname $i
cdf0: 69 0a 0a 20 20 23 20 54 68 65 20 6c 65 6e 67 74  i..  # The lengt
ce00: 68 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 70 61  h of the full pa
ce10: 74 68 20 74 6f 20 66 69 6c 65 20 22 74 65 73 74  th to file "test
ce20: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 22 20 69 73 20  .db-journal" is 
ce30: 28 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 29 2e  ($::file_len+8).
ce40: 0a 20 20 23 20 49 66 20 74 68 65 20 63 6f 6e 66  .  # If the conf
ce50: 69 67 75 72 65 64 20 73 71 6c 69 74 65 33 5f 76  igured sqlite3_v
ce60: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 76 61  fs.mxPathname va
ce70: 6c 75 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  lue greater than
ce80: 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 23   or equal to.  #
ce90: 20 74 68 69 73 2c 20 74 68 65 6e 20 74 68 65 20   this, then the 
cea0: 66 69 6c 65 20 63 61 6e 20 62 65 20 6f 70 65 6e  file can be open
ceb0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
cec0: 74 20 63 61 6e 6e 6f 74 2e 0a 20 20 23 0a 20 20  t cannot..  #.  
ced0: 69 66 20 7b 24 69 69 20 3e 3d 20 5b 65 78 70 72  if {$ii >= [expr
cee0: 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 5d 7d   $::file_len+8]}
cef0: 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b   {.    set res {
cf00: 30 20 7b 7d 7d 0a 20 20 7d 20 65 6c 73 65 20 7b  0 {}}.  } else {
cf10: 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 31 20  .    set res {1 
cf20: 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  {unable to open 
cf30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a  database file}}.
cf40: 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70    }..  do_test p
cf50: 61 67 65 72 31 2d 31 36 2e 31 2e 24 69 69 20 7b  ager1-16.1.$ii {
cf60: 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68  .    list [catch
cf70: 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74 65   { sqlite3 db te
cf80: 73 74 2e 64 62 20 7d 20 6d 73 67 5d 20 24 6d 73  st.db } msg] $ms
cf90: 67 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20 63 61  g.  } $res..  ca
cfa0: 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20  tch {db close}. 
cfb0: 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 0a 23   tv delete.}...#
cfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
d010: 20 74 68 65 20 70 61 67 65 72 73 20 72 65 73 70   the pagers resp
d020: 6f 6e 73 65 20 74 6f 20 74 68 65 20 62 2d 74 72  onse to the b-tr
d030: 65 65 20 6c 61 79 65 72 20 72 65 71 75 65 73 74  ee layer request
d040: 69 6e 67 20 69 6c 6c 65 67 61 6c 20 70 61 67 65  ing illegal page
d050: 20 0a 23 20 6e 75 6d 62 65 72 73 3a 0a 23 0a 23   .# numbers:.#.#
d060: 20 20 20 2b 20 54 68 65 20 6c 6f 63 6b 69 6e 67     + The locking
d070: 20 70 61 67 65 2c 0a 23 20 20 20 2b 20 50 61 67   page,.#   + Pag
d080: 65 20 30 2c 0a 23 20 20 20 2b 20 41 20 70 61 67  e 0,.#   + A pag
d090: 65 20 77 69 74 68 20 61 20 70 61 67 65 20 6e 75  e with a page nu
d0a0: 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
d0b0: 6e 20 28 32 5e 33 31 2d 31 29 2e 0a 23 0a 23 20  n (2^31-1)..#.# 
d0c0: 54 68 65 73 65 20 74 65 73 74 73 20 77 69 6c 6c  These tests will
d0d0: 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 53 51 4c   not work if SQL
d0e0: 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
d0f0: 4c 4f 57 5f 52 45 41 44 20 69 73 20 64 65 66 69  LOW_READ is defi
d100: 6e 65 64 2e 20 49 6e 0a 23 20 74 68 61 74 20 63  ned. In.# that c
d110: 61 73 65 20 49 4f 20 65 72 72 6f 72 73 20 61 72  ase IO errors ar
d120: 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 70 6f  e sometimes repo
d130: 72 74 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rted instead of 
d140: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
d150: 23 0a 69 66 63 61 70 61 62 6c 65 20 21 64 69 72  #.ifcapable !dir
d160: 65 63 74 5f 72 65 61 64 20 7b 0a 64 6f 5f 74 65  ect_read {.do_te
d170: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 31 20 7b  st pager1-18.1 {
d180: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
d190: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
d1a0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
d1b0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
d1c0: 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d  sql { .    PRAGM
d1d0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
d1e0: 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  24;.    CREATE T
d1f0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
d200: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
d210: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
d220: 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(500), a_string
d230: 28 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (200));.    INSE
d240: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
d250: 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  T a_string(500),
d260: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46   a_string(200) F
d270: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
d280: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
d290: 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  T a_string(500),
d2a0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46   a_string(200) F
d2b0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
d2c0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
d2d0: 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  T a_string(500),
d2e0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46   a_string(200) F
d2f0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
d300: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
d310: 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  T a_string(500),
d320: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46   a_string(200) F
d330: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
d340: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
d350: 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  T a_string(500),
d360: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46   a_string(200) F
d370: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
d380: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
d390: 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  T a_string(500),
d3a0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46   a_string(200) F
d3b0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
d3c0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
d3d0: 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  T a_string(500),
d3e0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46   a_string(200) F
d3f0: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d  ROM t1;.  }.} {}
d400: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
d410: 31 38 2e 32 20 7b 0a 20 20 73 65 74 20 72 6f 6f  18.2 {.  set roo
d420: 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43  t [db one "SELEC
d430: 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20  T rootpage FROM 
d440: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a  sqlite_master"].
d450: 20 20 73 65 74 20 6c 6f 63 6b 69 6e 67 70 61 67    set lockingpag
d460: 65 20 5b 65 78 70 72 20 28 30 78 31 30 30 30 30  e [expr (0x10000
d470: 2f 31 30 32 34 29 20 2b 20 31 5d 0a 20 20 65 78  /1024) + 1].  ex
d480: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
d490: 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
d4a0: 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41  ma = 1;.    UPDA
d4b0: 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TE sqlite_master
d4c0: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 20 3d 20   SET rootpage = 
d4d0: 24 6c 6f 63 6b 69 6e 67 70 61 67 65 3b 0a 20 20  $lockingpage;.  
d4e0: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  }.  sqlite3 db2 
d4f0: 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73  test.db.  catchs
d500: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
d510: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 20 64  t(*) FROM t1 } d
d520: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
d530: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
d540: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20  malformed}}.db2 
d550: 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61  close.do_test pa
d560: 67 65 72 31 2d 31 38 2e 33 2e 31 20 7b 0a 20 20  ger1-18.3.1 {.  
d570: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
d580: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29  EATE TABLE t2(x)
d590: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d5a0: 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73 74  O t2 VALUES(a_st
d5b0: 72 69 6e 67 28 35 30 30 30 29 29 3b 0a 20 20 7d  ring(5000));.  }
d5c0: 0a 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78 70  .  set pgno [exp
d5d0: 72 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  r ([file size te
d5e0: 73 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d 32  st.db] / 1024)-2
d5f0: 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ].  hexio_write 
d600: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
d610: 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30  pgno-1)*1024] 00
d620: 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  000000.  sqlite3
d630: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 23   db2 test.db.  #
d640: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 78 20 69   even though x i
d650: 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 62 65 63  s malformed, bec
d660: 61 75 73 65 20 74 79 70 65 6f 66 28 29 20 64 6f  ause typeof() do
d670: 65 73 0a 20 20 23 20 6e 6f 74 20 6c 6f 61 64 20  es.  # not load 
d680: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 78  the content of x
d690: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 6e  , the error is n
d6a0: 6f 74 20 6e 6f 74 69 63 65 64 2e 0a 20 20 63 61  ot noticed..  ca
d6b0: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
d6c0: 74 79 70 65 6f 66 28 78 29 20 46 52 4f 4d 20 74  typeof(x) FROM t
d6d0: 32 20 7d 20 64 62 32 0a 7d 20 7b 30 20 74 65 78  2 } db2.} {0 tex
d6e0: 74 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  t}.do_test pager
d6f0: 31 2d 31 38 2e 33 2e 32 20 7b 0a 20 20 23 20 69  1-18.3.2 {.  # i
d700: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
d710: 20 76 61 6c 75 65 20 6f 66 20 78 20 69 73 20 6c   value of x is l
d720: 6f 61 64 65 64 20 61 6e 64 20 73 6f 20 74 68 65  oaded and so the
d730: 20 65 72 72 6f 72 20 69 73 0a 20 20 23 20 64 65   error is.  # de
d740: 74 65 63 74 65 64 0a 20 20 63 61 74 63 68 73 71  tected.  catchsq
d750: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
d760: 68 28 78 7c 7c 27 27 29 20 46 52 4f 4d 20 74 32  h(x||'') FROM t2
d770: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74   } db2.} {1 {dat
d780: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
d790: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
d7a0: 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73  db2 close.do_tes
d7b0: 74 20 70 61 67 65 72 31 2d 31 38 2e 33 2e 33 20  t pager1-18.3.3 
d7c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
d7d0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32    DELETE FROM t2
d7e0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d7f0: 4f 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64  O t2 VALUES(rand
d800: 6f 6d 62 6c 6f 62 28 35 30 30 30 29 29 3b 0a 20  omblob(5000));. 
d810: 20 7d 0a 20 20 73 65 74 20 70 67 6e 6f 20 5b 65   }.  set pgno [e
d820: 78 70 72 20 28 5b 66 69 6c 65 20 73 69 7a 65 20  xpr ([file size 
d830: 74 65 73 74 2e 64 62 5d 20 2f 20 31 30 32 34 29  test.db] / 1024)
d840: 2d 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  -2].  hexio_writ
d850: 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20  e test.db [expr 
d860: 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20  ($pgno-1)*1024] 
d870: 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74  00000000.  sqlit
d880: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
d890: 20 23 20 65 76 65 6e 20 74 68 6f 75 67 68 20 78   # even though x
d8a0: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 62   is malformed, b
d8b0: 65 63 61 75 73 65 20 6c 65 6e 67 74 68 28 29 20  ecause length() 
d8c0: 61 6e 64 20 74 79 70 65 6f 66 28 29 20 64 6f 0a  and typeof() do.
d8d0: 20 20 23 20 6e 6f 74 20 6c 6f 61 64 20 74 68 65    # not load the
d8e0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 78 2c 20 74   content of x, t
d8f0: 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20  he error is not 
d900: 6e 6f 74 69 63 65 64 2e 0a 20 20 63 61 74 63 68  noticed..  catch
d910: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e  sql { SELECT len
d920: 67 74 68 28 78 29 2c 20 74 79 70 65 6f 66 28 78  gth(x), typeof(x
d930: 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a  ) FROM t2 } db2.
d940: 7d 20 7b 30 20 7b 35 30 30 30 20 62 6c 6f 62 7d  } {0 {5000 blob}
d950: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
d960: 2d 31 38 2e 33 2e 34 20 7b 0a 20 20 23 20 69 6e  -18.3.4 {.  # in
d970: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
d980: 76 61 6c 75 65 20 6f 66 20 78 20 69 73 20 6c 6f  value of x is lo
d990: 61 64 65 64 20 61 6e 64 20 73 6f 20 74 68 65 20  aded and so the 
d9a0: 65 72 72 6f 72 20 69 73 0a 20 20 23 20 64 65 74  error is.  # det
d9b0: 65 63 74 65 64 0a 20 20 63 61 74 63 68 73 71 6c  ected.  catchsql
d9c0: 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68   { SELECT length
d9d0: 28 78 7c 7c 27 27 29 20 46 52 4f 4d 20 74 32 20  (x||'') FROM t2 
d9e0: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
d9f0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
da00: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64  is malformed}}.d
da10: 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  b2 close.do_test
da20: 20 70 61 67 65 72 31 2d 31 38 2e 34 20 7b 0a 20   pager1-18.4 {. 
da30: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
da40: 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e  t.db [expr ($pgn
da50: 6f 2d 31 29 2a 31 30 32 34 5d 20 39 30 30 30 30  o-1)*1024] 90000
da60: 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62  000.  sqlite3 db
da70: 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  2 test.db.  catc
da80: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65  hsql { SELECT le
da90: 6e 67 74 68 28 78 7c 7c 27 27 29 20 46 52 4f 4d  ngth(x||'') FROM
daa0: 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b   t2 } db2.} {1 {
dab0: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
dac0: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
dad0: 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f  }}.db2 close.do_
dae0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 35  test pager1-18.5
daf0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
db00: 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  "".  execsql {. 
db10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
db20: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
db30: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
db40: 20 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   b);.    PRAGMA 
db50: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
db60: 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20  = 1;.    UPDATE 
db70: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45  sqlite_master SE
db80: 54 20 72 6f 6f 74 70 61 67 65 3d 35 20 57 48 45  T rootpage=5 WHE
db90: 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74  RE tbl_name = 't
dba0: 31 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  1';.    PRAGMA w
dbb0: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
dbc0: 20 30 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41   0;.    ALTER TA
dbd0: 42 4c 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f  BLE t1 RENAME TO
dbe0: 20 78 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68   x1;.  }.  catch
dbf0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
dc00: 52 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31 20 7b 64  ROM x1 }.} {1 {d
dc10: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
dc20: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
dc30: 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74  }.db close..do_t
dc40: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 36 20  est pager1-18.6 
dc50: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
dc60: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
dc70: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
dc80: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
dc90: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
dca0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
dcb0: 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  24;.    CREATE T
dcc0: 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
dcd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
dce0: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38  ALUES(a_string(8
dcf0: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
dd00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
dd10: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
dd20: 20 20 7d 0a 0a 20 20 73 65 74 20 72 6f 6f 74 20    }..  set root 
dd30: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
dd40: 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
dd50: 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20  lite_master"].  
dd60: 64 62 20 63 6c 6f 73 65 0a 0a 20 20 68 65 78 69  db close..  hexi
dd70: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
dd80: 5b 65 78 70 72 20 28 24 72 6f 6f 74 2d 31 29 2a  [expr ($root-1)*
dd90: 31 30 32 34 20 2b 20 38 5d 20 30 30 30 30 30 30  1024 + 8] 000000
dda0: 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  00.  sqlite3 db 
ddb0: 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73  test.db.  catchs
ddc0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67  ql { SELECT leng
ddd0: 74 68 28 78 29 20 46 52 4f 4d 20 74 31 20 7d 0a  th(x) FROM t1 }.
dde0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64  } {1 {database d
ddf0: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
de00: 66 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 74  formed}}.}..do_t
de10: 65 73 74 20 70 61 67 65 72 31 2d 31 39 2e 31 20  est pager1-19.1 
de20: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22  {.  sqlite3 db "
de30: 22 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  ".  db func a_st
de40: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
de50: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
de60: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
de70: 20 35 31 32 3b 0a 20 20 20 20 50 52 41 47 4d 41   512;.    PRAGMA
de80: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31   auto_vacuum = 1
de90: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
dea0: 4c 45 20 74 31 28 61 61 2c 20 61 62 2c 20 61 63  LE t1(aa, ab, ac
deb0: 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67  , ad, ae, af, ag
dec0: 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b  , ah, ai, aj, ak
ded0: 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20  , al, am, an,.  
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
def0: 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64    ba, bb, bc, bd
df00: 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68  , be, bf, bg, bh
df10: 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c  , bi, bj, bk, bl
df20: 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20  , bm, bn,.      
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
df40: 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65  , cb, cc, cd, ce
df50: 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69  , cf, cg, ch, ci
df60: 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d  , cj, ck, cl, cm
df70: 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , cn,.          
df80: 20 20 20 20 20 20 20 20 20 20 64 61 2c 20 64 62            da, db
df90: 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66  , dc, dd, de, df
dfa0: 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a  , dg, dh, di, dj
dfb0: 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e  , dk, dl, dm, dn
dfc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dfd0: 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63        ea, eb, ec
dfe0: 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67  , ed, ee, ef, eg
dff0: 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b  , eh, ei, ej, ek
e000: 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20  , el, em, en,.  
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64    fa, fb, fc, fd
e030: 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68  , fe, ff, fg, fh
e040: 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c  , fi, fj, fk, fl
e050: 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20  , fm, fn,.      
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 61                ga
e070: 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65  , gb, gc, gd, ge
e080: 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69  , gf, gg, gh, gi
e090: 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d  , gj, gk, gl, gm
e0a0: 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , gn,.          
e0b0: 20 20 20 20 20 20 20 20 20 20 68 61 2c 20 68 62            ha, hb
e0c0: 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66  , hc, hd, he, hf
e0d0: 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a  , hg, hh, hi, hj
e0e0: 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e  , hk, hl, hm, hn
e0f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e100: 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63        ia, ib, ic
e110: 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67  , id, ie, if, ig
e120: 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b  , ih, ii, ij, ik
e130: 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20  , il, im, ix,.  
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64    ja, jb, jc, jd
e160: 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68  , je, jf, jg, jh
e170: 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c  , ji, jj, jk, jl
e180: 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20  , jm, jn,.      
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 61                ka
e1a0: 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65  , kb, kc, kd, ke
e1b0: 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69  , kf, kg, kh, ki
e1c0: 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d  , kj, kk, kl, km
e1d0: 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , kn,.          
e1e0: 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62            la, lb
e1f0: 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66  , lc, ld, le, lf
e200: 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a  , lg, lh, li, lj
e210: 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e  , lk, ll, lm, ln
e220: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e230: 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63        ma, mb, mc
e240: 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67  , md, me, mf, mg
e250: 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b  , mh, mi, mj, mk
e260: 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20  , ml, mm, mn.   
e270: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
e280: 41 42 4c 45 20 74 32 28 61 61 2c 20 61 62 2c 20  ABLE t2(aa, ab, 
e290: 61 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20  ac, ad, ae, af, 
e2a0: 61 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20  ag, ah, ai, aj, 
e2b0: 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a  ak, al, am, an,.
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20      ba, bb, bc, 
e2e0: 62 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20  bd, be, bf, bg, 
e2f0: 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20  bh, bi, bj, bk, 
e300: 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20  bl, bm, bn,.    
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 63 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20  ca, cb, cc, cd, 
e330: 63 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20  ce, cf, cg, ch, 
e340: 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20  ci, cj, ck, cl, 
e350: 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20  cm, cn,.        
e360: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 2c 20              da, 
e370: 64 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20  db, dc, dd, de, 
e380: 64 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20  df, dg, dh, di, 
e390: 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20  dj, dk, dl, dm, 
e3a0: 64 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dn,.            
e3b0: 20 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20          ea, eb, 
e3c0: 65 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20  ec, ed, ee, ef, 
e3d0: 65 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20  eg, eh, ei, ej, 
e3e0: 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a  ek, el, em, en,.
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20      fa, fb, fc, 
e410: 66 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20  fd, fe, ff, fg, 
e420: 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20  fh, fi, fj, fk, 
e430: 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20  fl, fm, fn,.    
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 67 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20  ga, gb, gc, gd, 
e460: 67 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20  ge, gf, gg, gh, 
e470: 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20  gi, gj, gk, gl, 
e480: 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20  gm, gn,.        
e490: 20 20 20 20 20 20 20 20 20 20 20 20 68 61 2c 20              ha, 
e4a0: 68 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20  hb, hc, hd, he, 
e4b0: 68 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20  hf, hg, hh, hi, 
e4c0: 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20  hj, hk, hl, hm, 
e4d0: 68 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  hn,.            
e4e0: 20 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20          ia, ib, 
e4f0: 69 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20  ic, id, ie, if, 
e500: 69 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20  ig, ih, ii, ij, 
e510: 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a  ik, il, im, ix,.
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20      ja, jb, jc, 
e540: 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20  jd, je, jf, jg, 
e550: 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20  jh, ji, jj, jk, 
e560: 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20  jl, jm, jn,.    
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20  ka, kb, kc, kd, 
e590: 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20  ke, kf, kg, kh, 
e5a0: 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20  ki, kj, kk, kl, 
e5b0: 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20  km, kn,.        
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20              la, 
e5d0: 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20  lb, lc, ld, le, 
e5e0: 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20  lf, lg, lh, li, 
e5f0: 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20  lj, lk, ll, lm, 
e600: 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ln,.            
e610: 20 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20          ma, mb, 
e620: 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20  mc, md, me, mf, 
e630: 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20  mg, mh, mi, mj, 
e640: 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20  mk, ml, mm, mn. 
e650: 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54     );.    INSERT
e660: 20 49 4e 54 4f 20 74 31 28 61 61 29 20 56 41 4c   INTO t1(aa) VAL
e670: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30  UES( a_string(10
e680: 30 30 30 30 29 20 29 3b 0a 20 20 20 20 49 4e 53  0000) );.    INS
e690: 45 52 54 20 49 4e 54 4f 20 74 32 28 61 61 29 20  ERT INTO t2(aa) 
e6a0: 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67  VALUES( a_string
e6b0: 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20  (100000) );.    
e6c0: 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d  VACUUM;.  }.} {}
e6d0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
e6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
e720: 65 73 74 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  est a couple of 
e730: 73 70 65 63 69 61 6c 20 63 61 73 65 73 20 74 68  special cases th
e740: 61 74 20 63 6f 6d 65 20 75 70 20 77 68 69 6c 65  at come up while
e750: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 0a 23 20 74   committing .# t
e760: 72 61 6e 73 61 63 74 69 6f 6e 73 3a 0a 23 0a 23  ransactions:.#.#
e770: 20 20 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 2a     pager1-20.1.*
e780: 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 20  : Committing an 
e790: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
e7a0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  se transaction w
e7b0: 68 65 6e 20 74 68 65 20 0a 23 20 20 20 20 20 20  hen the .#      
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
e7d0: 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65 65  base has not bee
e7e0: 6e 20 6d 6f 64 69 66 69 65 64 20 61 74 20 61 6c  n modified at al
e7f0: 6c 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  l..#.#   pager1-
e800: 32 30 2e 32 2e 2a 3a 20 41 73 20 61 62 6f 76 65  20.2.*: As above
e810: 2c 20 62 75 74 20 77 69 74 68 20 61 20 6e 6f 72  , but with a nor
e820: 6d 61 6c 20 64 62 20 69 6e 20 65 78 63 6c 75 73  mal db in exclus
e830: 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
e840: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
e850: 30 2e 33 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e  0.3.*: Committin
e860: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
e870: 69 6e 20 57 41 4c 20 6d 6f 64 65 20 77 68 65 72  in WAL mode wher
e880: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  e the database h
e890: 61 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  as.#            
e8a0: 20 20 20 20 20 20 62 65 65 6e 20 6d 6f 64 69 66        been modif
e8b0: 69 65 64 2c 20 62 75 74 20 61 6c 6c 20 64 69 72  ied, but all dir
e8c0: 74 79 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ty pages have be
e8d0: 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 0a 23  en flushed to .#
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 64 69 73 6b 20 62 65 66 6f 72 65 20 74 68    disk before th
e900: 65 20 63 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74  e commit..#.do_t
e910: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e  est pager1-20.1.
e920: 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20  1 {.  catch {db 
e930: 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65 33  close}.  sqlite3
e940: 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65   db :memory:.  e
e950: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
e960: 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77  ATE TABLE one(tw
e970: 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49  o, three);.    I
e980: 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56  NSERT INTO one V
e990: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
e9a0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
e9b0: 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 32 20  t pager1-20.1.2 
e9c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
e9d0: 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56    BEGIN EXCLUSIV
e9e0: 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  E;.    COMMIT;. 
e9f0: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
ea00: 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 31 20 7b   pager1-20.2.1 {
ea10: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
ea20: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
ea30: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
ea40: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
ea50: 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20  e = exclusive;. 
ea60: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
ea70: 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74  l_mode = persist
ea80: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
ea90: 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65  LE one(two, thre
eaa0: 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  e);.    INSERT I
eab0: 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27  NTO one VALUES('
eac0: 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20  a', 'b');.  }.} 
ead0: 7b 65 78 63 6c 75 73 69 76 65 20 70 65 72 73 69  {exclusive persi
eae0: 73 74 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  st}.do_test page
eaf0: 72 31 2d 32 30 2e 32 2e 32 20 7b 0a 20 20 65 78  r1-20.2.2 {.  ex
eb00: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
eb10: 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  N EXCLUSIVE;.   
eb20: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
eb30: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c  }..ifcapable wal
eb40: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
eb50: 65 72 31 2d 32 30 2e 33 2e 31 20 7b 0a 20 20 20  er1-20.3.1 {.   
eb60: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
eb70: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
eb80: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
eb90: 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78   a_string.    ex
eba0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
ebb0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
ebc0: 3d 20 31 30 3b 0a 20 20 20 20 20 20 50 52 41 47  = 10;.      PRAG
ebd0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
ebe0: 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 42 45 47  = wal;.      BEG
ebf0: 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  IN;.        CREA
ec00: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
ec10: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
ec20: 41 42 4c 45 20 74 32 28 79 29 3b 0a 20 20 20 20  ABLE t2(y);.    
ec30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ec40: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
ec50: 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20 20  ng(800));.      
ec60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ec70: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
ec80: 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (800) FROM t1;  
ec90: 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f         /*   2 */
eca0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
ecb0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
ecc0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
ecd0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  M t1;         /*
ece0: 20 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20     4 */.        
ecf0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
ed00: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38  ELECT a_string(8
ed10: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
ed20: 20 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20       /*   8 */. 
ed30: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
ed40: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
ed50: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
ed60: 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20  t1;         /*  
ed70: 31 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e  16 */.        IN
ed80: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
ed90: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
eda0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
edb0: 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20     /*  32 */.   
edc0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
edd0: 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f  .  } {wal}.  do_
ede0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33  test pager1-20.3
edf0: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
ee00: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
ee10: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
ee20: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 78 78 78  O t2 VALUES('xxx
ee30: 78 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  x');.    }.    r
ee40: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
ee50: 33 32 20 74 31 0a 20 20 20 20 65 78 65 63 73 71  32 t1.    execsq
ee60: 6c 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a  l COMMIT.  } {}.
ee70: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
ee80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
eec0: 54 65 73 74 20 74 68 61 74 20 61 20 57 41 4c 20  Test that a WAL 
eed0: 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74  database may not
eee0: 20 62 65 20 6f 70 65 6e 65 64 20 69 66 3a 0a 23   be opened if:.#
eef0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e 31  .#   pager1-21.1
ef00: 2e 2a 3a 20 54 68 65 20 56 46 53 20 68 61 73 20  .*: The VFS has 
ef10: 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c 65 73 73  an iVersion less
ef20: 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23 20 20 20   than 2, or.#   
ef30: 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a 3a 20 54  pager1-21.2.*: T
ef40: 68 65 20 56 46 53 20 64 6f 65 73 20 6e 6f 74 20  he VFS does not 
ef50: 70 72 6f 76 69 64 65 20 78 53 68 6d 58 58 58 28  provide xShmXXX(
ef60: 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a 69 66 63  ) methods..#.ifc
ef70: 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64  apable wal {.  d
ef80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 31  o_test pager1-21
ef90: 2e 30 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  .0 {.    faultsi
efa0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
efb0: 70 65 6e 0a 20 20 20 20 65 78 65 63 73 71 6c 20  pen.    execsql 
efc0: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  {.      PRAGMA j
efd0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
efe0: 4c 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  L;.      CREATE 
eff0: 54 41 42 4c 45 20 6b 6f 28 63 20 44 45 46 41 55  TABLE ko(c DEFAU
f000: 4c 54 20 27 61 62 63 27 2c 20 62 20 44 45 46 41  LT 'abc', b DEFA
f010: 55 4c 54 20 27 64 65 66 27 29 3b 0a 20 20 20 20  ULT 'def');.    
f020: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f    INSERT INTO ko
f030: 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b   DEFAULT VALUES;
f040: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d  .    }.  } {wal}
f050: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
f060: 31 2d 32 31 2e 31 20 7b 0a 20 20 20 20 74 65 73  1-21.1 {.    tes
f070: 74 76 66 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31  tvfs tv -noshm 1
f080: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
f090: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76   test.db -vfs tv
f0a0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
f0b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f  SELECT * FROM ko
f0c0: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75   } db2.  } {1 {u
f0d0: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
f0e0: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20  tabase file}}.  
f0f0: 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20 64  db2 close.  tv d
f100: 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20  elete.  do_test 
f110: 70 61 67 65 72 31 2d 32 31 2e 32 20 7b 0a 20 20  pager1-21.2 {.  
f120: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 69 76    testvfs tv -iv
f130: 65 72 73 69 6f 6e 20 31 0a 20 20 20 20 73 71 6c  ersion 1.    sql
f140: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
f150: 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61 74   -vfs tv.    cat
f160: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
f170: 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20   FROM ko } db2. 
f180: 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f   } {1 {unable to
f190: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
f1a0: 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73  ile}}.  db2 clos
f1b0: 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a  e.  tv delete.}.
f1c0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
f1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
f210: 73 74 20 74 68 61 74 20 61 20 22 50 52 41 47 4d  st that a "PRAGM
f220: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
f230: 22 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  ":.#.#   pager1-
f240: 32 32 2e 31 2e 2a 3a 20 69 73 20 61 20 6e 6f 2d  22.1.*: is a no-
f250: 6f 70 20 6f 6e 20 61 20 6e 6f 6e 2d 57 41 4c 20  op on a non-WAL 
f260: 64 62 2c 20 61 6e 64 0a 23 20 20 20 70 61 67 65  db, and.#   page
f270: 72 31 2d 32 32 2e 32 2e 2a 3a 20 64 6f 65 73 20  r1-22.2.*: does 
f280: 6e 6f 74 20 63 61 75 73 65 20 78 53 79 6e 63 20  not cause xSync 
f290: 63 61 6c 6c 73 20 77 69 74 68 20 61 20 73 79 6e  calls with a syn
f2a0: 63 68 72 6f 6e 6f 75 73 3d 6f 66 66 20 64 62 2e  chronous=off db.
f2b0: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c  .#.ifcapable wal
f2c0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
f2d0: 65 72 31 2d 32 32 2e 31 2e 31 20 7b 0a 20 20 20  er1-22.1.1 {.   
f2e0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
f2f0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
f300: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
f310: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28  CREATE TABLE ko(
f320: 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c  c DEFAULT 'abc',
f330: 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66 27   b DEFAULT 'def'
f340: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
f350: 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20  INTO ko DEFAULT 
f360: 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20 20  VALUES;.    }.  
f370: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
f380: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
f390: 74 20 7d 0a 20 20 7d 20 7b 30 20 2d 31 20 2d 31  t }.  } {0 -1 -1
f3a0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
f3b0: 72 31 2d 32 32 2e 32 2e 31 20 7b 0a 20 20 20 20  r1-22.2.1 {.    
f3c0: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
f3d0: 75 6c 74 20 31 0a 20 20 20 20 74 76 20 66 69 6c  ult 1.    tv fil
f3e0: 74 65 72 20 78 53 79 6e 63 0a 20 20 20 20 74 76  ter xSync.    tv
f3f0: 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a   script xSyncCb.
f400: 20 20 20 20 70 72 6f 63 20 78 53 79 6e 63 43 62      proc xSyncCb
f410: 20 7b 61 72 67 73 7d 20 7b 69 6e 63 72 20 3a 3a   {args} {incr ::
f420: 73 79 6e 63 63 6f 75 6e 74 7d 0a 20 20 20 20 73  synccount}.    s
f430: 65 74 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 20 30  et ::synccount 0
f440: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
f450: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63  test.db.    exec
f460: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
f470: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
f480: 20 6f 66 66 3b 0a 20 20 20 20 20 20 50 52 41 47   off;.      PRAG
f490: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f4a0: 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 49 4e 53  = WAL;.      INS
f4b0: 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41  ERT INTO ko DEFA
f4c0: 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20  ULT VALUES;.    
f4d0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
f4e0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
f4f0: 70 6f 69 6e 74 20 7d 0a 20 20 20 20 73 65 74 20  point }.    set 
f500: 73 79 6e 63 63 6f 75 6e 74 0a 20 20 7d 20 7b 30  synccount.  } {0
f510: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  }.  db close.  t
f520: 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d  v delete.}..#---
f530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f570: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66  ------.# Tests f
f580: 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a 6f 75 72  or changing jour
f590: 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20  nal mode..#.#   
f5a0: 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a 3a 20 54  pager1-23.1.*: T
f5b0: 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 63 68  est that when ch
f5c0: 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50 45 52 53  anging from PERS
f5d0: 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 6d 6f  IST to DELETE mo
f5e0: 64 65 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20  de,.#           
f5f0: 20 20 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e         the journ
f600: 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  al file is delet
f610: 65 64 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  ed..#.#   pager1
f620: 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65  -23.2.*: Same te
f630: 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74  st as above, but
f640: 20 77 68 69 6c 65 20 61 20 73 68 61 72 65 64 20   while a shared 
f650: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20  lock is held.#  
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f670: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f680: 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65  file..#.#   page
f690: 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d 65 20  r1-23.3.*: Same 
f6a0: 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62  test as above, b
f6b0: 75 74 20 77 68 69 6c 65 20 61 20 72 65 73 65 72  ut while a reser
f6c0: 76 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ved lock is held
f6d0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
f6e0: 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
f6f0: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20  ase file..#.#   
f700: 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a 3a 20 41  pager1-23.4.*: A
f710: 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20 77 68 69  nd, for fun, whi
f720: 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  le holding an ex
f730: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 23 0a  clusive lock..#.
f740: 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  #   pager1-23.5.
f750: 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 76 61  *: Try to set va
f760: 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20  rious different 
f770: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 77 69  journal modes wi
f780: 74 68 20 61 6e 0a 23 20 20 20 20 20 20 20 20 20  th an.#         
f790: 20 20 20 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f           in-memo
f7a0: 72 79 20 64 61 74 61 62 61 73 65 20 28 6f 6e 6c  ry database (onl
f7b0: 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20 4f 46 46  y MEMORY and OFF
f7c0: 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a 23   should work)..#
f7d0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 36  .#   pager1-23.6
f7e0: 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 6c  .*: Try to set l
f7f0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
f800: 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  al on an in-memo
f810: 72 79 20 64 61 74 61 62 61 73 65 0a 23 20 20 20  ry database.#   
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f830: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 2d 20 69  doesn't work - i
f840: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
f850: 65 73 20 61 6c 77 61 79 73 20 75 73 65 0a 23 20  es always use.# 
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
f880: 63 6c 75 73 69 76 65 29 2e 0a 23 0a 64 6f 5f 74  clusive)..#.do_t
f890: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  est pager1-23.1.
f8a0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
f8b0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
f8c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f8d0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f8e0: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
f8f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
f900: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20   t1(a, b);.  }. 
f910: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
f920: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
f930: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
f940: 31 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65  1-23.1.2 {.  exe
f950: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
f960: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
f970: 45 54 45 20 7d 0a 20 20 66 69 6c 65 20 65 78 69  ETE }.  file exi
f980: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
f990: 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65  nal.} {0}..do_te
f9a0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 31  st pager1-23.2.1
f9b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
f9c0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
f9d0: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
f9e0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
f9f0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 43 61 6e  O t1 VALUES('Can
fa00: 62 65 72 72 61 27 2c 20 27 41 43 54 27 29 3b 0a  berra', 'ACT');.
fa10: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
fa20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
fa30: 20 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c   } {.    db eval
fa40: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
fa50: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
fa60: 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  }.  }.  execsql 
fa70: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
fa80: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
fa90: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
faa0: 31 2d 32 33 2e 32 2e 32 20 7b 0a 20 20 66 69 6c  1-23.2.2 {.  fil
fab0: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
fac0: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a  -journal.} {0}..
fad0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
fae0: 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.3.1 {.  execsq
faf0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
fb00: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
fb10: 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52  RSIST;.    INSER
fb20: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
fb30: 28 27 44 61 72 77 69 6e 27 2c 20 27 4e 54 27 29  ('Darwin', 'NT')
fb40: 3b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45  ;.    BEGIN IMME
fb50: 44 49 41 54 45 3b 0a 20 20 7d 0a 20 20 64 62 20  DIATE;.  }.  db 
fb60: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
fb70: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
fb80: 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
fb90: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
fba0: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
fbb0: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
fbc0: 31 2d 32 33 2e 33 2e 32 20 7b 0a 20 20 66 69 6c  1-23.3.2 {.  fil
fbd0: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
fbe0: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
fbf0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
fc00: 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.3 {.  execsql
fc10: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
fc20: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fc30: 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
fc40: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
fc50: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
fc60: 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  IST;.    INSERT 
fc70: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
fc80: 41 64 65 6c 61 69 64 65 27 2c 20 27 53 41 27 29  Adelaide', 'SA')
fc90: 3b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c  ;.    BEGIN EXCL
fca0: 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 64 62 20  USIVE;.  }.  db 
fcb0: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
fcc0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
fcd0: 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
fce0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
fcf0: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
fd00: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
fd10: 31 2d 32 33 2e 34 2e 32 20 7b 0a 20 20 66 69 6c  1-23.4.2 {.  fil
fd20: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
fd30: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
fd40: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
fd50: 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.3 {.  execsql
fd60: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
fd70: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fd80: 35 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  5.1 {.  faultsim
fd90: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
fda0: 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  en.  sqlite3 db 
fdb0: 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66 6f  :memory:.} {}.fo
fdc0: 72 65 61 63 68 20 7b 74 6e 20 6d 6f 64 65 20 70  reach {tn mode p
fdd0: 6f 73 73 69 62 6c 65 7d 20 7b 0a 20 20 32 20 20  ossible} {.  2  
fde0: 6f 66 66 20 20 20 20 20 20 31 0a 20 20 33 20 20  off      1.  3  
fdf0: 6d 65 6d 6f 72 79 20 20 20 31 0a 20 20 34 20 20  memory   1.  4  
fe00: 70 65 72 73 69 73 74 20 20 30 0a 20 20 35 20 20  persist  0.  5  
fe10: 64 65 6c 65 74 65 20 20 20 30 0a 20 20 36 20 20  delete   0.  6  
fe20: 77 61 6c 20 20 20 20 20 20 30 0a 20 20 37 20 20  wal      0.  7  
fe30: 74 72 75 6e 63 61 74 65 20 30 0a 7d 20 7b 0a 20  truncate 0.} {. 
fe40: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
fe50: 32 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  23.5.$tn.1 {.   
fe60: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
fe70: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
fe80: 6f 66 66 22 0a 20 20 20 20 65 78 65 63 73 71 6c  off".    execsql
fe90: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
fea0: 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20  _mode = $mode". 
feb0: 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65   } [if $possible
fec0: 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c   {list $mode} {l
fed0: 69 73 74 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f 74  ist off}].  do_t
fee0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  est pager1-23.5.
fef0: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  $tn.2 {.    exec
ff00: 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  sql "PRAGMA jour
ff10: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72  nal_mode = memor
ff20: 79 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  y".    execsql "
ff30: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
ff40: 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d  ode = $mode".  }
ff50: 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b   [if $possible {
ff60: 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73  list $mode} {lis
ff70: 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f  t memory}].}.do_
ff80: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
ff90: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
ffa0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
ffb0: 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d 20  ode = normal}.} 
ffc0: 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74  {exclusive}.do_t
ffd0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  est pager1-23.6.
ffe0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  2 {.  execsql {P
fff0: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
10000 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 7d 0a  de = exclusive}.
10010 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f  } {exclusive}.do
10020 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
10030 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.3 {.  execsql 
10040 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  {PRAGMA locking_
10050 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  mode}.} {exclusi
10060 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ve}.do_test page
10070 72 31 2d 32 33 2e 36 2e 34 20 7b 0a 20 20 65 78  r1-23.6.4 {.  ex
10080 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6d 61  ecsql {PRAGMA ma
10090 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d  in.locking_mode}
100a0 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 0a  .} {exclusive}..
100b0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
100c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
10100 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
10110 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
10120 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
10130 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
10140 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
10150 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
10160 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
10170 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41  = 10;.    PRAGMA
10180 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46   auto_vacuum = F
10190 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ULL;.    CREATE 
101a0 54 41 42 4c 45 20 78 31 28 78 2c 20 79 2c 20 7a  TABLE x1(x, y, z
101b0 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c  , PRIMARY KEY(y,
101c0 20 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   z));.    CREATE
101d0 20 54 41 42 4c 45 20 78 32 28 78 2c 20 79 2c 20   TABLE x2(x, y, 
101e0 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79  z, PRIMARY KEY(y
101f0 2c 20 7a 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  , z));.    INSER
10200 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53  T INTO x2 VALUES
10210 28 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20  (a_string(400), 
10220 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
10230 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20  _string(600));. 
10240 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
10250 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
10260 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(600), a_string
10270 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
10280 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  500) FROM x2;.  
10290 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
102a0 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
102b0 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
102c0 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34  600), a_string(4
102d0 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
102e0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
102f0 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10300 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35  400), a_string(5
10310 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
10320 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
10330 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
10340 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36  ELECT a_string(6
10350 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  00), a_string(40
10360 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
10370 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
10380 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
10390 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
103a0 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
103b0 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ), a_string(400)
103c0 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
103d0 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
103e0 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30  ECT a_string(400
103f0 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ), a_string(500)
10400 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10410 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
10420 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
10430 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
10440 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
10450 61 67 65 72 31 2d 32 34 2e 31 2e 32 20 7b 0a 20  ager1-24.1.2 {. 
10460 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
10470 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
10480 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45  TE FROM x1 WHERE
10490 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 7d 0a 20   rowid<32;.  }. 
104a0 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63   recursive_selec
104b0 74 20 36 34 20 78 32 0a 7d 20 7b 7d 0a 64 6f 5f  t 64 x2.} {}.do_
104c0 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
104d0 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
104e0 20 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78   .      UPDATE x
104f0 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69  1 SET z = a_stri
10500 6e 67 28 33 30 30 29 20 57 48 45 52 45 20 72 6f  ng(300) WHERE ro
10510 77 69 64 3e 34 30 3b 0a 20 20 20 20 43 4f 4d 4d  wid>40;.    COMM
10520 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  IT;.    PRAGMA i
10530 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
10540 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
10550 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d  (*) FROM x1;.  }
10560 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74  .} {ok 33}..do_t
10570 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e  est pager1-24.1.
10580 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
10590 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
105a0 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x1;.    INSERT I
105b0 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20  NTO x1 SELECT * 
105c0 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 42 45 47  FROM x2;.    BEG
105d0 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
105e0 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72   FROM x1 WHERE r
105f0 6f 77 69 64 3c 33 32 3b 0a 20 20 20 20 20 20 55  owid<32;.      U
10600 50 44 41 54 45 20 78 31 20 53 45 54 20 7a 20 3d  PDATE x1 SET z =
10610 20 61 5f 73 74 72 69 6e 67 28 32 39 39 29 20 57   a_string(299) W
10620 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20  HERE rowid>40;. 
10630 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73   }.  recursive_s
10640 65 6c 65 63 74 20 36 34 20 78 32 20 7b 64 62 20  elect 64 x2 {db 
10650 65 76 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20 20 65  eval COMMIT}.  e
10660 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
10670 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
10680 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  eck;.    SELECT 
10690 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31  count(*) FROM x1
106a0 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a  ;.  }.} {ok 33}.
106b0 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
106c0 32 34 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  24.1.5 {.  execs
106d0 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
106e0 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53  FROM x1;.    INS
106f0 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
10700 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
10710 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65  }.  recursive_se
10720 6c 65 63 74 20 36 34 20 78 32 20 7b 20 64 62 20  lect 64 x2 { db 
10730 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42  eval {CREATE TAB
10740 4c 45 20 78 33 28 78 2c 20 79 2c 20 7a 29 7d 20  LE x3(x, y, z)} 
10750 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
10760 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 33 20 7d  LECT * FROM x3 }
10770 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
10780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107c0 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  -.#.do_test page
107d0 72 31 2d 32 35 2d 31 20 7b 0a 20 20 66 61 75 6c  r1-25-1 {.  faul
107e0 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
107f0 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
10800 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
10810 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62      SAVEPOINT ab
10820 63 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  c;.        CREAT
10830 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
10840 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ;.      ROLLBACK
10850 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d   TO abc;.    COM
10860 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c  MIT;.  }.  db cl
10870 6f 73 65 0a 7d 20 7b 7d 0a 62 72 65 61 6b 70 6f  ose.} {}.breakpo
10880 69 6e 74 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  int.do_test page
10890 72 31 2d 32 35 2d 32 20 7b 0a 20 20 66 61 75 6c  r1-25-2 {.  faul
108a0 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
108b0 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
108c0 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54   {.    SAVEPOINT
108d0 20 61 62 63 3b 0a 20 20 20 20 20 20 43 52 45 41   abc;.      CREA
108e0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
108f0 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  );.    ROLLBACK 
10900 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d  TO abc;.    COMM
10910 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f  IT;.  }.  db clo
10920 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  se.} {}..#------
10930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10970 2d 2d 2d 0a 23 20 53 65 63 74 6f 72 2d 73 69 7a  ---.# Sector-siz
10980 65 20 74 65 73 74 73 2e 0a 23 0a 64 6f 5f 74 65  e tests..#.do_te
10990 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b  st pager1-26.1 {
109a0 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
109b0 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65  efault 1.  tv se
109c0 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 20 20  ctorsize 4096.  
109d0 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
109e0 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
109f0 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
10a00 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
10a10 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
10a20 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
10a30 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10a40 74 62 6c 28 61 20 50 52 49 4d 41 52 59 20 4b 45  tbl(a PRIMARY KE
10a50 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20  Y, b UNIQUE);.  
10a60 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
10a70 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56  NSERT INTO tbl V
10a80 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32  ALUES(a_string(2
10a90 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
10aa0 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
10ab0 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
10ac0 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
10ad0 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
10ae0 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
10af0 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
10b00 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
10b10 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10b20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
10b30 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
10b40 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10b50 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
10b60 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  0) FROM tbl;.   
10b70 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10b80 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
10b90 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
10ba0 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
10bb0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
10bc0 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
10bd0 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
10be0 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
10bf0 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
10c00 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
10c10 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
10c20 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10c30 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45   tbl;.      INSE
10c40 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
10c50 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
10c60 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
10c70 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 43 4f 4d  ROM tbl;.    COM
10c80 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  MIT;.  }.} {}.do
10c90 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
10ca0 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20 55 50  ger1-26.1 {.  UP
10cb0 44 41 54 45 20 74 62 6c 20 53 45 54 20 62 20 3d  DATE tbl SET b =
10cc0 20 61 5f 73 74 72 69 6e 67 28 35 35 30 29 3b 0a   a_string(550);.
10cd0 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  } {}.db close.tv
10ce0 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d   delete..#------
10cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d30 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ---.#.do_test pa
10d40 67 65 72 31 2e 32 37 2e 31 20 7b 0a 20 20 66 61  ger1.27.1 {.  fa
10d50 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
10d60 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74  d_reopen.  sqlit
10d70 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
10d80 74 73 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20  ts db.  execsql 
10d90 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
10da0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10db0 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20  t1(a, b);.  }.  
10dc0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
10dd0 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65  fcounts db.  exe
10de0 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d  csql COMMIT.} {}
10df0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
10e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
10e40 65 73 74 20 74 68 61 74 20 61 74 74 65 6d 70 74  est that attempt
10e50 69 6e 67 20 74 6f 20 6f 70 65 6e 20 61 20 77 72  ing to open a wr
10e60 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
10e70 77 69 74 68 20 0a 23 20 6c 6f 63 6b 69 6e 67 5f  with .# locking_
10e80 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 69  mode=exclusive i
10e90 6e 20 57 41 4c 20 6d 6f 64 65 20 66 61 69 6c 73  n WAL mode fails
10ea0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   if there are ot
10eb0 68 65 72 20 63 6c 69 65 6e 74 73 20 6f 6e 20 0a  her clients on .
10ec0 23 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  # the same datab
10ed0 61 73 65 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64  ase..#.catch { d
10ee0 62 20 63 6c 6f 73 65 20 7d 0a 69 66 63 61 70 61  b close }.ifcapa
10ef0 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 6d  ble wal {.  do_m
10f00 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20  ulticlient_test 
10f10 74 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74  tn {.    do_test
10f20 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
10f30 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 20   {.      sql1 { 
10f40 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  .        PRAGMA 
10f50 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
10f60 41 4c 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  AL;.        CREA
10f70 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
10f80 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
10f90 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
10fa0 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
10fb0 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d 0a    }.    } {wal}.
10fc0 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
10fd0 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 73 71  r1-28.$tn.2 { sq
10fe0 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l2 { SELECT * FR
10ff0 4f 4d 20 74 31 20 7d 20 7d 20 7b 61 20 62 7d 0a  OM t1 } } {a b}.
11000 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
11010 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73  er1-28.$tn.3 { s
11020 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63  ql1 { PRAGMA loc
11030 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
11040 69 76 65 20 7d 20 7d 20 7b 65 78 63 6c 75 73 69  ive } } {exclusi
11050 76 65 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  ve}.    do_test 
11060 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20  pager1-28.$tn.4 
11070 7b 20 0a 20 20 20 20 20 20 63 73 71 6c 31 20 7b  { .      csql1 {
11080 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49   BEGIN; INSERT I
11090 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63  NTO t1 VALUES('c
110a0 27 2c 20 27 64 27 29 3b 20 7d 0a 20 20 20 20 7d  ', 'd'); }.    }
110b0 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
110c0 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 20 20 63 6f   locked}}.    co
110d0 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73 65 20  de2 { db2 close 
110e0 3b 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65  ; sqlite3 db2 te
110f0 73 74 2e 64 62 20 7d 0a 20 20 20 20 64 6f 5f 74  st.db }.    do_t
11100 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
11110 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 73 71 6c  n.4 { .      sql
11120 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  1 { INSERT INTO 
11130 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27  t1 VALUES('c', '
11140 64 27 29 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  d'); COMMIT }.  
11150 20 20 7d 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d    } {}.  }.}..#-
11160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
111a0 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e 6f 72 6d 61  --------.# Norma
111b0 6c 6c 79 2c 20 77 68 65 6e 20 63 68 61 6e 67 69  lly, when changi
111c0 6e 67 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f  ng from journal_
111d0 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 74 6f 20  mode=PERSIST to 
111e0 44 45 4c 45 54 45 20 74 68 65 20 70 61 67 65 72  DELETE the pager
111f0 0a 23 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  .# attempts to d
11200 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
11210 6c 20 66 69 6c 65 2e 20 48 6f 77 65 76 65 72 2c  l file. However,
11220 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 20 6f 62   if it cannot ob
11230 74 61 69 6e 20 61 0a 23 20 52 45 53 45 52 56 45  tain a.# RESERVE
11240 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
11250 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
11260 73 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  s step is skippe
11270 64 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69  d..#.do_multicli
11280 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20  ent_test tn {.  
11290 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
112a0 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71  8.$tn.1 {.    sq
112b0 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  l1 { .      PRAG
112c0 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
112d0 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20  = PERSIST;.     
112e0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
112f0 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e  (a, b);.      IN
11300 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11310 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
11320 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73     }.  } {persis
11330 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  t}.  do_test pag
11340 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 66  er1-28.$tn.2 { f
11350 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
11360 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20  db-journal } 1. 
11370 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11380 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20  28.$tn.3 { sql1 
11390 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
113a0 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d  _mode = DELETE }
113b0 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74   } delete.  do_t
113c0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
113d0 6e 2e 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74  n.4 { file exist
113e0 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
113f0 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 0..  do_test
11400 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 35   pager1-28.$tn.5
11410 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20   {.    sql1 { . 
11420 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
11430 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
11440 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ST;.      INSERT
11450 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
11460 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20 7d  'c', 'd');.    }
11470 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20  .  } {persist}. 
11480 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11490 32 38 2e 24 74 6e 2e 36 20 7b 20 66 69 6c 65 20  28.$tn.6 { file 
114a0 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
114b0 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f  ournal } 1.  do_
114c0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
114d0 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32 20  tn.7 {.    sql2 
114e0 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20  { BEGIN; INSERT 
114f0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
11500 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20  e', 'f'); }.  } 
11510 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  {}.  do_test pag
11520 65 72 31 2d 32 38 2e 24 74 6e 2e 38 20 20 7b 20  er1-28.$tn.8  { 
11530 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
11540 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a  .db-journal } 1.
11550 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11560 2d 32 38 2e 24 74 6e 2e 39 20 20 7b 20 73 71 6c  -28.$tn.9  { sql
11570 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  1 { PRAGMA journ
11580 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
11590 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f   } } delete.  do
115a0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
115b0 24 74 6e 2e 31 30 20 7b 20 66 69 6c 65 20 65 78  $tn.10 { file ex
115c0 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
115d0 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74  rnal } 1..  do_t
115e0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
115f0 6e 2e 31 31 20 7b 20 73 71 6c 32 20 43 4f 4d 4d  n.11 { sql2 COMM
11600 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  IT } {}.  do_tes
11610 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11620 31 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  12 { file exists
11630 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
11640 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20   } 0..  do_test 
11650 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 33  pager1-28-$tn.13
11660 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b 20 73   {.    code1 { s
11670 65 74 20 63 68 61 6e 6e 65 6c 20 5b 64 62 20 69  et channel [db i
11680 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c  ncrblob -readonl
11690 79 20 74 31 20 61 20 32 5d 20 7d 0a 20 20 20 20  y t1 a 2] }.    
116a0 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50 52 41  sql1 {.      PRA
116b0 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
116c0 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
116d0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
116e0 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68 27   VALUES('g', 'h'
116f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65  );.    }.  } {pe
11700 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74  rsist}.  do_test
11710 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
11720 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  4 { file exists 
11730 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
11740 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } 1.  do_test pa
11750 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 35 20 7b  ger1-28.$tn.15 {
11760 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49  .    sql2 { BEGI
11770 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  N; INSERT INTO t
11780 31 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66  1 VALUES('e', 'f
11790 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64  '); }.  } {}.  d
117a0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
117b0 2e 24 74 6e 2e 31 36 20 7b 20 73 71 6c 31 20 7b  .$tn.16 { sql1 {
117c0 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
117d0 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20  mode = DELETE } 
117e0 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65  } delete.  do_te
117f0 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11800 2e 31 37 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .17 { file exist
11810 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
11820 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 1..  do_test
11830 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
11840 37 20 7b 20 63 73 71 6c 32 20 7b 20 43 4f 4d 4d  7 { csql2 { COMM
11850 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  IT } } {1 {datab
11860 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
11870 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11880 2d 32 38 2d 24 74 6e 2e 31 38 20 7b 20 63 6f 64  -28-$tn.18 { cod
11890 65 31 20 7b 20 72 65 61 64 20 24 63 68 61 6e 6e  e1 { read $chann
118a0 65 6c 20 7d 20 7d 20 63 0a 20 20 64 6f 5f 74 65  el } } c.  do_te
118b0 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e  st pager1-28-$tn
118c0 2e 31 39 20 7b 20 63 6f 64 65 31 20 7b 20 63 6c  .19 { code1 { cl
118d0 6f 73 65 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d  ose $channel } }
118e0 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
118f0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 30 20 7b  ger1-28.$tn.20 {
11900 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql2 { COMMIT }
11910 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74   } {}.}..do_test
11920 20 70 61 67 65 72 31 2d 32 39 2e 31 20 7b 0a 20   pager1-29.1 {. 
11930 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
11940 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
11950 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
11960 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
11970 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  024;.    PRAGMA 
11980 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 66 75  auto_vacuum = fu
11990 6c 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c  ll;.    PRAGMA l
119a0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
119b0 75 73 69 76 65 3b 0a 20 20 20 20 43 52 45 41 54  usive;.    CREAT
119c0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
119d0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
119e0 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
119f0 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  );.  }.  file si
11a00 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78  ze test.db.} [ex
11a10 70 72 20 31 30 32 34 2a 33 5d 0a 64 6f 5f 74 65  pr 1024*3].do_te
11a20 73 74 20 70 61 67 65 72 31 2d 32 39 2e 32 20 7b  st pager1-29.2 {
11a30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11a40 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
11a50 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 56 41  e = 4096;.    VA
11a60 43 55 55 4d 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  CUUM;.  }.  file
11a70 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
11a80 5b 65 78 70 72 20 34 30 39 36 2a 33 5d 0a 0a 23  [expr 4096*3]..#
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
11ae0 20 74 68 61 74 20 69 66 20 61 6e 20 65 6d 70 74   that if an empt
11af0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
11b00 28 73 69 7a 65 20 30 20 62 79 74 65 73 29 20 69  (size 0 bytes) i
11b10 73 20 6f 70 65 6e 65 64 20 69 6e 20 0a 23 20 65  s opened in .# e
11b20 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
11b30 20 6d 6f 64 65 2c 20 61 6e 79 20 6a 6f 75 72 6e   mode, any journ
11b40 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  al file is delet
11b50 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
11b60 2d 73 79 73 74 65 6d 0a 23 20 77 69 74 68 6f 75  -system.# withou
11b70 74 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  t being rolled b
11b80 61 63 6b 2e 20 41 6e 64 20 74 68 61 74 20 74 68  ack. And that th
11b90 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
11ba0 6f 62 74 61 69 6e 65 64 20 77 68 69 6c 65 0a 23  obtained while.#
11bb0 20 64 6f 69 6e 67 20 74 68 69 73 20 69 73 20 6e   doing this is n
11bc0 6f 74 20 72 65 6c 65 61 73 65 64 2e 0a 23 0a 64  ot released..#.d
11bd0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 30  o_test pager1-30
11be0 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .1 {.  db close.
11bf0 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65    delete_file te
11c00 73 74 2e 64 62 0a 20 20 64 65 6c 65 74 65 5f 66  st.db.  delete_f
11c10 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ile test.db-jour
11c20 6e 61 6c 0a 20 20 73 65 74 20 66 64 20 5b 6f 70  nal.  set fd [op
11c30 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  en test.db-journ
11c40 61 6c 20 77 5d 0a 20 20 73 65 65 6b 20 24 66 64  al w].  seek $fd
11c50 20 5b 65 78 70 72 20 35 31 32 2b 31 30 33 32 2a   [expr 512+1032*
11c60 32 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77  2].  puts -nonew
11c70 6c 69 6e 65 20 24 66 64 20 78 0a 20 20 63 6c 6f  line $fd x.  clo
11c80 73 65 20 24 66 64 0a 0a 20 20 73 71 6c 69 74 65  se $fd..  sqlite
11c90 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
11ca0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
11cb0 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
11cc0 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  =EXCLUSIVE;.    
11cd0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
11ce0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
11cf0 65 72 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c  er;.    PRAGMA l
11d00 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a  ock_status;.  }.
11d10 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 30 20 6d  } {exclusive 0 m
11d20 61 69 6e 20 72 65 73 65 72 76 65 64 20 74 65 6d  ain reserved tem
11d30 70 20 63 6c 6f 73 65 64 7d 0a 0a 23 2d 2d 2d 2d  p closed}..#----
11d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d80 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
11d90 74 20 69 66 20 74 68 65 20 22 70 61 67 65 2d 73  t if the "page-s
11da0 69 7a 65 22 20 66 69 65 6c 64 20 69 6e 20 61 20  ize" field in a 
11db0 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
11dc0 73 20 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s 0, the journal
11dd0 0a 23 20 66 69 6c 65 20 63 61 6e 20 73 74 69 6c  .# file can stil
11de0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
11df0 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
11e00 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64 20  ed for backward 
11e10 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 0a  compatibility -.
11e20 23 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  # versions of SQ
11e30 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e  Lite prior to 3.
11e40 35 2e 38 20 61 6c 77 61 79 73 20 73 65 74 20 74  5.8 always set t
11e50 68 69 73 20 66 69 65 6c 64 20 74 6f 20 7a 65 72  his field to zer
11e60 6f 2e 0a 23 0a 69 66 20 7b 24 74 63 6c 5f 70 6c  o..#.if {$tcl_pl
11e70 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29  atform(platform)
11e80 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 64 6f 5f 74  =="unix"} {.do_t
11e90 65 73 74 20 70 61 67 65 72 31 2d 33 31 2e 31 20  est pager1-31.1 
11ea0 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
11eb0 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
11ec0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
11ed0 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
11ee0 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d   = 10;.    PRAGM
11ef0 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
11f00 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  24;.    CREATE T
11f10 41 42 4c 45 20 74 31 28 78 2c 20 79 2c 20 55 4e  ABLE t1(x, y, UN
11f20 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
11f30 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11f40 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
11f50 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11f60 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20  lob(1500));.    
11f70 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
11f80 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
11f90 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
11fa0 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
11fb0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11fc0 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
11fd0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
11fe0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
11ff0 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
12000 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
12010 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
12020 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
12030 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
12040 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12050 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
12060 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
12070 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
12080 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
12090 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
120a0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
120b0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
120c0 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
120d0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
120e0 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
120f0 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
12100 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
12110 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12120 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
12130 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
12140 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
12150 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
12160 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
12170 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12180 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
12190 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
121a0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
121b0 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
121c0 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
121d0 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
121e0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
121f0 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
12200 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
12210 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
12220 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 47 49  ROM t1;.    BEGI
12230 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
12240 74 31 20 53 45 54 20 79 20 3d 20 72 61 6e 64 6f  t1 SET y = rando
12250 6d 62 6c 6f 62 28 31 34 39 39 29 3b 0a 20 20 7d  mblob(1499);.  }
12260 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73  .  copy_file tes
12270 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20  t.db test.db2.  
12280 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64  copy_file test.d
12290 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64  b-journal test.d
122a0 62 32 2d 6a 6f 75 72 6e 61 6c 0a 20 20 0a 20 20  b2-journal.  .  
122b0 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
122c0 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 32 34 20  .db2-journal 24 
122d0 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74  00000000.  sqlit
122e0 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
122f0 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
12300 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
12310 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a  ck } db2.} {ok}.
12320 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
12330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
12370 54 65 73 74 20 74 68 61 74 20 61 20 64 61 74 61  Test that a data
12380 62 61 73 65 20 66 69 6c 65 20 63 61 6e 20 62 65  base file can be
12390 20 22 70 72 65 2d 68 69 6e 74 65 64 22 20 74 6f   "pre-hinted" to
123a0 20 61 20 63 65 72 74 61 69 6e 20 73 69 7a 65 20   a certain size 
123b0 61 6e 64 20 74 68 61 74 0a 23 20 73 75 62 73 65  and that.# subse
123c0 71 75 65 6e 74 20 73 70 69 6c 6c 69 6e 67 20 6f  quent spilling o
123d0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
123e0 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 75 6c  e does not resul
123f0 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
12400 65 0a 23 20 66 69 6c 65 20 62 65 69 6e 67 20 73  e.# file being s
12410 68 72 75 6e 6b 2e 0a 23 0a 63 61 74 63 68 20 7b  hrunk..#.catch {
12420 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72 63 65 64  db close}.forced
12430 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 0a 64  elete test.db..d
12440 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 32  o_test pager1-32
12450 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .1 {.  sqlite3 d
12460 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
12470 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
12480 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b   TABLE t1(x, y);
12490 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
124a0 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
124b0 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
124c0 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
124d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
124e0 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62  ALUES(1, randomb
124f0 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 7d  lob(10000));.  }
12500 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  .  file_control_
12510 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 64  chunksize_test d
12520 62 20 6d 61 69 6e 20 31 30 32 34 0a 20 20 66 69  b main 1024.  fi
12530 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68  le_control_sizeh
12540 69 6e 74 5f 74 65 73 74 20 64 62 20 6d 61 69 6e  int_test db main
12550 20 32 30 39 37 31 35 32 30 3b 20 23 20 32 30 4d   20971520; # 20M
12560 42 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  B.  execsql {.  
12570 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
12580 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 49 4e  ize = 10;.    IN
12590 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
125a0 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(1, randomblo
125b0 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20 20 49  b(10000));.    I
125c0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
125d0 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(2, randombl
125e0 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20 20  ob(10000));.    
125f0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12600 45 4c 45 43 54 20 78 2b 32 2c 20 72 61 6e 64 6f  ELECT x+2, rando
12610 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f  mblob(10000) fro
12620 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  m t1;.    INSERT
12630 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
12640 78 2b 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  x+4, randomblob(
12650 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a  10000) from t1;.
12660 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12670 74 31 20 53 45 4c 45 43 54 20 78 2b 38 2c 20 72  t1 SELECT x+8, r
12680 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29  andomblob(10000)
12690 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e   from t1;.    IN
126a0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
126b0 45 43 54 20 78 2b 31 36 2c 20 72 61 6e 64 6f 6d  ECT x+16, random
126c0 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d  blob(10000) from
126d0 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   t1;.    SELECT 
126e0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
126f0 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
12700 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66  }.  db close.  f
12710 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
12720 0a 7d 20 7b 32 30 39 37 31 35 32 30 7d 0a 0a 23  .} {20971520}..#
12730 20 43 6c 65 61 6e 75 70 20 32 30 4d 42 20 66 69   Cleanup 20MB fi
12740 6c 65 20 6c 65 66 74 20 62 79 20 74 68 65 20 70  le left by the p
12750 72 65 76 69 6f 75 73 20 74 65 73 74 2e 0a 66 6f  revious test..fo
12760 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
12770 62 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     b..finish_test.