/ Hex Artifact Content
Login

Artifact 717d4fbe95a704c0b08b22a85b06c077b898416d:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e 6f 74 20  n.tcl..# Do not 
0210: 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 20  use a codec for 
0220: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0230: 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 62  le, as the datab
0240: 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d 61  ase file is.# ma
0250: 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 74  nipulated direct
0260: 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 72  ly using tcl scr
0270: 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 20  ipts (using the 
0280: 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 6f  [hexio_write] co
0290: 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f 74  mmand)..#.do_not
02a0: 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 20  _use_codec..#.# 
02b0: 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 74  pager1-1.*: Test
02c0: 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 6c   inter-process l
02d0: 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 20  ocking (clients 
02e0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
02f0: 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 65  esses)..#.# page
0300: 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e 74  r1-2.*: Test int
0310: 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b 69  ra-process locki
0320: 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c 69  ng (multiple cli
0330: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ents in this pro
0340: 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 72  cess)..#.# pager
0350: 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e 74  1-3.*: Savepoint
0360: 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a   related tests..
0370: 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a 20  #.# pager1-4.*: 
0380: 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c 61  Hot-journal rela
0390: 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 70  ted tests..#.# p
03a0: 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 73  ager1-5.*: Cases
03b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c 74   related to mult
03c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
03d0: 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a 20  #.# pager1-6.*: 
03e0: 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f  Cases related to
03f0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
0400: 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 67  e_count".#.# pag
0410: 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 73  er1-7.*: Cases s
0420: 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47  pecific to "PRAG
0430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0440: 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 61  TRUNCATE".#.# pa
0450: 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 20  ger1-8.*: Cases 
0460: 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  using temporary 
0470: 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
0480: 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  tabases..#.# pag
0490: 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 72  er1-9.*: Tests r
04a0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  elated to the ba
04b0: 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 61  ckup API..#.# pa
04c0: 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 20  ger1-10.*: Test 
04d0: 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 64  that the assumed
04e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
04f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d 69  tor-size is limi
0500: 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ted to.#        
0510: 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 20        64KB..#.# 
0520: 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 73  pager1-12.*: Tes
0530: 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 52  ts involving "PR
0540: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
0550: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a 3a  #.# pager1-13.*:
0560: 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 20   Cases specific 
0570: 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  to "PRAGMA journ
0580: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
0590: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e 2a  .#.# pager1-14.*
05a0: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
05b0: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
05c0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 0a  nal_mode=OFF".#.
05d0: 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 56  # pager1-15.*: V
05e0: 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76  arying sqlite3_v
05f0: 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 20  fs.szOsFile.#.# 
0600: 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 72  pager1-16.*: Var
0610: 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ying sqlite3_vfs
0620: 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 20  .mxPathname.#.# 
0630: 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 73  pager1-17.*: Tes
0640: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 50  ts related to "P
0650: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
0660: 6f 63 6b 22 0a 23 20 20 20 20 20 20 20 20 20 20  ock".#          
0670: 20 20 20 20 28 54 68 65 20 6f 6d 69 74 5f 72 65      (The omit_re
0680: 61 64 6c 6f 63 6b 20 70 72 61 67 6d 61 20 68 61  adlock pragma ha
0690: 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 61  s been removed a
06a0: 6e 64 20 73 6f 20 68 61 76 65 0a 23 20 20 20 20  nd so have.#    
06b0: 20 20 20 20 20 20 20 20 20 20 74 68 65 73 65 20            these 
06c0: 74 65 73 74 73 2e 29 0a 23 0a 23 20 70 61 67 65  tests.).#.# page
06d0: 72 31 2d 31 38 2e 2a 3a 20 54 65 73 74 20 74 68  r1-18.*: Test th
06e0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  at the pager lay
06f0: 65 72 20 72 65 73 70 6f 6e 64 73 20 63 6f 72 72  er responds corr
0700: 65 63 74 6c 79 20 69 66 20 74 68 65 20 62 2d 74  ectly if the b-t
0710: 72 65 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ree.#           
0720: 20 20 20 72 65 71 75 65 73 74 73 20 61 6e 20 69     requests an i
0730: 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
0740: 65 72 20 28 64 75 65 20 74 6f 20 64 62 20 63 6f  er (due to db co
0750: 72 72 75 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72  rruption)..#..pr
0760: 6f 63 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  oc recursive_sel
0770: 65 63 74 20 7b 69 64 20 74 61 62 6c 65 20 7b 73  ect {id table {s
0780: 63 72 69 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73  cript {}}} {.  s
0790: 65 74 20 63 6e 74 20 30 0a 20 20 64 62 20 65 76  et cnt 0.  db ev
07a0: 61 6c 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64  al "SELECT rowid
07b0: 2c 20 2a 20 46 52 4f 4d 20 24 74 61 62 6c 65 20  , * FROM $table 
07c0: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 28 24  WHERE rowid = ($
07d0: 69 64 2d 31 29 22 20 7b 0a 20 20 20 20 72 65 63  id-1)" {.    rec
07e0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 24 72  ursive_select $r
07f0: 6f 77 69 64 20 24 74 61 62 6c 65 20 24 73 63 72  owid $table $scr
0800: 69 70 74 0a 20 20 20 20 69 6e 63 72 20 63 6e 74  ipt.    incr cnt
0810: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d  .  }.  if {$cnt=
0820: 3d 30 7d 20 7b 20 65 76 61 6c 20 24 73 63 72 69  =0} { eval $scri
0830: 70 74 20 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74  pt }.}..set a_st
0840: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70  ring_counter 1.p
0850: 72 6f 63 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d  roc a_string {n}
0860: 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74   {.  global a_st
0870: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69  ring_counter.  i
0880: 6e 63 72 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75  ncr a_string_cou
0890: 6e 74 65 72 0a 20 20 73 74 72 69 6e 67 20 72 61  nter.  string ra
08a0: 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70 65  nge [string repe
08b0: 61 74 20 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63  at "${a_string_c
08c0: 6f 75 6e 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20  ounter}." $n] 1 
08d0: 24 6e 0a 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73  $n.}.db func a_s
08e0: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a  tring a_string..
08f0: 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
0900: 65 73 74 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72  est tn {..  # Cr
0910: 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  eate and populat
0920: 65 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  e a database tab
0930: 6c 65 20 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74  le using connect
0940: 69 6f 6e 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20  ion [db]. Check 
0950: 0a 20 20 23 20 74 68 61 74 20 63 6f 6e 6e 65 63  .  # that connec
0960: 74 69 6f 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20  tions [db2] and 
0970: 5b 64 62 33 5d 20 63 61 6e 20 73 65 65 20 74 68  [db3] can see th
0980: 65 20 73 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e  e schema and con
0990: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
09a0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
09b0: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   {.    sql1 {.  
09c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
09d0: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
09e0: 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  Y, b);.      CRE
09f0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
0a00: 74 31 28 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  t1(b);.      INS
0a10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0a20: 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e  ES(1, 'one'); IN
0a30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0a40: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
0a50: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
0a60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a70: 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  .2 { sql2 { SELE
0a80: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a90: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20   {1 one 2 two}. 
0aa0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
0ab0: 24 74 6e 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53  $tn.3 { sql3 { S
0ac0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0ad0: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
0ae0: 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 74 72  }..  # Open a tr
0af0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 64  ansaction and ad
0b00: 64 20 61 20 72 6f 77 20 75 73 69 6e 67 20 5b 64  d a row using [d
0b10: 62 5d 2e 20 54 68 69 73 20 70 75 74 73 20 5b 64  b]. This puts [d
0b20: 62 5d 20 69 6e 0a 20 20 23 20 52 45 53 45 52 56  b] in.  # RESERV
0b30: 45 44 20 73 74 61 74 65 2e 20 43 68 65 63 6b 20  ED state. Check 
0b40: 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  that connections
0b50: 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d   [db2] and [db3]
0b60: 20 63 61 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72   can still.  # r
0b70: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
0b80: 20 63 6f 6e 74 65 6e 74 20 61 73 20 69 74 20 77   content as it w
0b90: 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  as before the tr
0ba0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20  ansaction was.  
0bb0: 23 20 6f 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73  # opened. [db] s
0bc0: 68 6f 75 6c 64 20 73 65 65 20 74 68 65 20 69 6e  hould see the in
0bd0: 73 65 72 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a  serted row..  #.
0be0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0bf0: 2d 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c  -$tn.4 {.    sql
0c00: 31 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  1 {.      BEGIN;
0c10: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
0c20: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
0c30: 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20  , 'three');.    
0c40: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0c50: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 35 20  st pager1-$tn.5 
0c60: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0c70: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c80: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0c90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0ca0: 2e 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  .7 { sql1 { SELE
0cb0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0cc0: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20   {1 one 2 two 3 
0cd0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d  three}..  # [db]
0ce0: 20 73 74 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70   still has an op
0cf0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
0d00: 74 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61 74  tion. Check that
0d10: 20 74 68 69 73 20 70 72 65 76 65 6e 74 73 0a 20   this prevents. 
0d20: 20 23 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   # other connect
0d30: 69 6f 6e 73 20 28 73 70 65 63 69 66 69 63 61 6c  ions (specifical
0d40: 6c 79 20 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77  ly [db2]) from w
0d50: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
0d60: 74 61 62 61 73 65 2e 0a 20 20 23 0a 20 20 23 20  tabase..  #.  # 
0d70: 45 76 65 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70  Even if [db2] op
0d80: 65 6e 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ens a transactio
0d90: 6e 20 66 69 72 73 74 2c 20 69 74 20 6d 61 79 20  n first, it may 
0da0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
0db0: 0a 20 20 23 20 64 61 74 61 62 61 73 65 2e 20 41  .  # database. A
0dc0: 66 74 65 72 20 74 68 65 20 61 74 74 65 6d 70 74  fter the attempt
0dd0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64 62   to write the db
0de0: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
0df0: 63 74 69 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32  ction, .  # [db2
0e00: 5d 20 69 73 20 6c 65 66 74 20 77 69 74 68 20 61  ] is left with a
0e10: 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
0e20: 6f 6e 2c 20 62 75 74 20 6e 6f 74 20 61 20 72 65  on, but not a re
0e30: 61 64 2d 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74  ad-lock on.  # t
0e40: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
0e50: 2e 20 53 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74  . So it does not
0e60: 20 70 72 65 76 65 6e 74 20 5b 64 62 5d 20 66 72   prevent [db] fr
0e70: 6f 6d 20 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20  om committing.. 
0e80: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
0e90: 65 72 31 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20  er1-$tn.8 { .   
0ea0: 20 63 73 71 6c 32 20 7b 20 55 50 44 41 54 45 20   csql2 { UPDATE 
0eb0: 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31  t1 SET a = a + 1
0ec0: 30 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61  0 }.  } {1 {data
0ed0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
0ee0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
0ef0: 31 2d 24 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63  1-$tn.9 { .    c
0f00: 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 42 45  sql2 { .      BE
0f10: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
0f20: 45 20 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b  E t1 SET a = a +
0f30: 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   10;.    }.  } {
0f40: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
0f50: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
0f60: 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74  e [db] commit it
0f70: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  s transactions. 
0f80: 43 68 65 63 6b 20 74 68 65 20 6f 74 68 65 72 20  Check the other 
0f90: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a  connections can.
0fa0: 20 20 23 20 6e 6f 77 20 73 65 65 20 74 68 65 20    # now see the 
0fb0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 63 6f 6e  new database con
0fc0: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
0fd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
0fe0: 30 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49  0 { sql1 { COMMI
0ff0: 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  T } } {}.  do_te
1000: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 31  st pager1-$tn.11
1010: 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54   { sql1 { SELECT
1020: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1030: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1040: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1050: 61 67 65 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73  ager1-$tn.12 { s
1060: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
1070: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1080: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1090: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10a0: 31 2d 24 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20  1-$tn.13 { sql3 
10b0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
10c0: 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20  t1 } } {1 one 2 
10d0: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20  two 3 three}..  
10e0: 23 20 43 68 65 63 6b 20 74 68 61 74 2c 20 61 73  # Check that, as
10f0: 20 6e 6f 74 65 64 20 61 62 6f 76 65 2c 20 5b 64   noted above, [d
1100: 62 32 5d 20 72 65 61 6c 6c 79 20 64 69 64 20 6b  b2] really did k
1110: 65 65 70 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  eep an open tran
1120: 73 61 63 74 69 6f 6e 0a 20 20 23 20 61 66 74 65  saction.  # afte
1130: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
1140: 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62   write the datab
1150: 61 73 65 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a  ase failed..  #.
1160: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1170: 2d 24 74 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63  -$tn.14 { .    c
1180: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a  sql2 { BEGIN } .
1190: 20 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73    } {1 {cannot s
11a0: 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
11b0: 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  on within a tran
11c0: 73 61 63 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74  saction}}.  do_t
11d0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
11e0: 35 20 7b 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42  5 { sql2 { ROLLB
11f0: 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20  ACK } } {}..  # 
1200: 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20  Have [db2] open 
1210: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
1220: 64 20 74 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f  d take a read-lo
1230: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1240: 73 65 2e 0a 20 20 23 20 43 68 65 63 6b 20 74 68  se..  # Check th
1250: 61 74 20 74 68 69 73 20 70 72 65 76 65 6e 74 73  at this prevents
1260: 20 5b 64 62 5d 20 66 72 6f 6d 20 77 72 69 74 69   [db] from writi
1270: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1280: 73 65 20 28 6f 75 74 73 69 64 65 0a 20 20 23 20  se (outside.  # 
1290: 6f 66 20 61 6e 79 20 74 72 61 6e 73 61 63 74 69  of any transacti
12a0: 6f 6e 29 2e 20 41 66 74 65 72 20 74 68 69 73 20  on). After this 
12b0: 66 61 69 6c 73 2c 20 63 68 65 63 6b 20 74 68 61  fails, check tha
12c0: 74 20 5b 64 62 33 5d 20 63 61 6e 20 72 65 61 64  t [db3] can read
12d0: 0a 20 20 23 20 74 68 65 20 64 62 20 28 73 68 6f  .  # the db (sho
12e0: 77 69 6e 67 20 74 68 61 74 20 5b 64 62 5d 20 64  wing that [db] d
12f0: 69 64 20 6e 6f 74 20 74 61 6b 65 20 61 20 50 45  id not take a PE
1300: 4e 44 49 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29  NDING lock etc.)
1310: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
1320: 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a  ager1-$tn.15 { .
1330: 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
1340: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1350: 74 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65  t1; }.  } {1 one
1360: 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a   2 two 3 three}.
1370: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1380: 2d 24 74 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63  -$tn.16 { .    c
1390: 73 71 6c 31 20 7b 20 55 50 44 41 54 45 20 74 31  sql1 { UPDATE t1
13a0: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20   SET a = a + 10 
13b0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
13c0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
13d0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
13e0: 24 74 6e 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20  $tn.17 { sql3 { 
13f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1400: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
1410: 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20  o 3 three}..  # 
1420: 54 68 69 73 20 74 69 6d 65 2c 20 68 61 76 65 20  This time, have 
1430: 5b 64 62 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e  [db] open a tran
1440: 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 77  saction before w
1450: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1460: 61 73 65 2e 0a 20 20 23 20 54 68 69 73 20 77 6f  ase..  # This wo
1470: 72 6b 73 20 2d 20 5b 64 62 5d 20 67 65 74 73 20  rks - [db] gets 
1480: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1490: 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 63  which does not c
14a0: 6f 6e 66 6c 69 63 74 20 77 69 74 68 0a 20 20 23  onflict with.  #
14b0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
14c0: 20 5b 64 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e   [db2] is holdin
14d0: 67 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  g..  #.  do_test
14e0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b   pager1-$tn.18 {
14f0: 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20   .    sql1 { .  
1500: 20 20 20 20 42 45 47 49 4e 3b 20 20 0a 20 20 20      BEGIN;  .   
1510: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
1520: 20 61 20 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20   a = a + 10; .  
1530: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
1540: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d  test pager1-$tn-
1550: 31 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b  19 { .    sql1 {
1560: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
1570: 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e  tus } .  } {main
1580: 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63   reserved temp c
1590: 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74  losed}.  do_test
15a0: 20 70 61 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b   pager1-$tn-20 {
15b0: 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 50 52 41   .    sql2 { PRA
15c0: 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20  GMA lock_status 
15d0: 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61  } .  } {main sha
15e0: 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d  red temp closed}
15f0: 0a 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74  ..  # Check that
1600: 20 61 6c 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   all connections
1610: 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20   can still read 
1620: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 4f 6e  the database. On
1630: 6c 79 20 5b 64 62 5d 20 73 65 65 73 0a 20 20 23  ly [db] sees.  #
1640: 20 74 68 65 20 75 70 64 61 74 65 64 20 63 6f 6e   the updated con
1650: 74 65 6e 74 20 28 61 73 20 74 68 65 20 74 72 61  tent (as the tra
1660: 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1670: 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1680: 79 65 74 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  yet)..  #.  do_t
1690: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
16a0: 31 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  1 { sql1 { SELEC
16b0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
16c0: 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31  {11 one 12 two 1
16d0: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
16e0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 32  st pager1-$tn.22
16f0: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1700: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1710: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1720: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1730: 61 67 65 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73  ager1-$tn.23 { s
1740: 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql3 { SELECT * F
1750: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1760: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1770: 0a 0a 20 20 23 20 42 65 63 61 75 73 65 20 5b 64  ..  # Because [d
1780: 62 32 5d 20 73 74 69 6c 6c 20 68 61 73 20 74 68  b2] still has th
1790: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b  e SHARED lock, [
17a0: 64 62 5d 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  db] is unable to
17b0: 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 23 20   commit the.  # 
17c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
17d0: 69 74 20 74 72 69 65 73 2c 20 61 6e 20 65 72 72  it tries, an err
17e0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  or is returned a
17f0: 6e 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  nd the connectio
1800: 6e 20 0a 20 20 23 20 75 70 67 72 61 64 65 73 20  n .  # upgrades 
1810: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
1820: 6b 2e 0a 20 20 23 0a 20 20 23 20 4f 6e 63 65 20  k..  #.  # Once 
1830: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 5b 64  this happens, [d
1840: 62 5d 20 63 61 6e 20 72 65 61 64 20 74 68 65 20  b] can read the 
1850: 64 61 74 61 62 61 73 65 20 61 6e 64 20 73 65 65  database and see
1860: 20 74 68 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74   the new content
1870: 2c 0a 20 20 23 20 5b 64 62 32 5d 20 28 73 74 69  ,.  # [db2] (sti
1880: 6c 6c 20 68 6f 6c 64 69 6e 67 20 53 48 41 52 45  ll holding SHARE
1890: 44 29 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61  D) can still rea
18a0: 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e  d the old conten
18b0: 74 2c 20 62 75 74 20 5b 64 62 33 5d 0a 20 20 23  t, but [db3].  #
18c0: 20 28 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e   (not holding an
18d0: 79 20 6c 6f 63 6b 29 20 69 73 20 70 72 65 76 65  y lock) is preve
18e0: 6e 74 65 64 20 62 79 20 5b 64 62 5d 27 73 20 50  nted by [db]'s P
18f0: 45 4e 44 49 4e 47 20 66 72 6f 6d 20 72 65 61 64  ENDING from read
1900: 69 6e 67 0a 20 20 23 20 74 68 65 20 64 61 74 61  ing.  # the data
1910: 62 61 73 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  base..  #.  do_t
1920: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1930: 34 20 7b 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d  4 { csql1 { COMM
1940: 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  IT } } {1 {datab
1950: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
1960: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1970: 2d 24 74 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73  -$tn-25 { .    s
1980: 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63  ql1 { PRAGMA loc
1990: 6b 5f 73 74 61 74 75 73 20 7d 20 0a 20 20 7d 20  k_status } .  } 
19a0: 7b 6d 61 69 6e 20 70 65 6e 64 69 6e 67 20 74 65  {main pending te
19b0: 6d 70 20 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f  mp closed}.  do_
19c0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
19d0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  26 { sql1 { SELE
19e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
19f0: 7d 20 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f  } {11 one 12 two
1a00: 20 31 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   13 three}.  do_
1a10: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1a20: 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  27 { sql2 { SELE
1a30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
1a40: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
1a50: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1a60: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1a70: 7b 20 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54  { csql3 { SELECT
1a80: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1a90: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1aa0: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
1ab0: 65 20 5b 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69  e [db2] commit i
1ac0: 74 73 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ts read transact
1ad0: 69 6f 6e 2c 20 72 65 6c 65 61 73 69 6e 67 20 74  ion, releasing t
1ae0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69  he SHARED lock i
1af0: 74 0a 20 20 23 20 69 73 20 68 6f 6c 64 69 6e 67  t.  # is holding
1b00: 2e 20 4e 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b  . Now, neither [
1b10: 64 62 32 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d  db2] nor [db3] m
1b20: 61 79 20 72 65 61 64 20 74 68 65 20 64 61 74 61  ay read the data
1b30: 62 61 73 65 20 28 61 73 20 5b 64 62 5d 0a 20 20  base (as [db].  
1b40: 23 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  # is still holdi
1b50: 6e 67 20 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20  ng a PENDING).. 
1b60: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
1b70: 65 72 31 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c  er1-$tn.29 { sql
1b80: 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b  2 { COMMIT } } {
1b90: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1ba0: 72 31 2d 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c  r1-$tn.30 { csql
1bb0: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
1bc0: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1bd0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1be0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1bf0: 72 31 2d 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c  r1-$tn.31 { csql
1c00: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
1c10: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1c20: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1c30: 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 69 73 20 6e  }..  # [db] is n
1c40: 6f 77 20 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69  ow able to commi
1c50: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1c60: 6e 2e 20 4f 6e 63 65 20 74 68 65 20 74 72 61 6e  n. Once the tran
1c70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 20 20 23 20  saction is .  # 
1c80: 63 6f 6d 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74  committed, all t
1c90: 68 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  hree connections
1ca0: 20 63 61 6e 20 72 65 61 64 20 74 68 65 20 6e 65   can read the ne
1cb0: 77 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20  w content..  #. 
1cc0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1cd0: 24 74 6e 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20  $tn.25 { sql1 { 
1ce0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
1cf0: 3d 20 61 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20  = a+10 } } {}.  
1d00: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1d10: 74 6e 2e 32 36 20 7b 20 73 71 6c 31 20 7b 20 43  tn.26 { sql1 { C
1d20: 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64  OMMIT } } {}.  d
1d30: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1d40: 6e 2e 32 37 20 7b 20 73 71 6c 31 20 7b 20 53 45  n.27 { sql1 { SE
1d50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1d60: 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77   } {21 one 22 tw
1d70: 6f 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f  o 23 three}.  do
1d80: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1d90: 2e 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c  .27 { sql2 { SEL
1da0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
1db0: 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f  } {21 one 22 two
1dc0: 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   23 three}.  do_
1dd0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1de0: 32 38 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  28 { sql3 { SELE
1df0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
1e00: 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20   {21 one 22 two 
1e10: 32 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 49  23 three}..  # I
1e20: 6e 73 74 61 6c 6c 20 61 20 62 75 73 79 2d 68 61  nstall a busy-ha
1e30: 6e 64 6c 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63  ndler for connec
1e40: 74 69 6f 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20  tion [db]..  #. 
1e50: 20 73 65 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69   set ::nbusy [li
1e60: 73 74 5d 0a 20 20 70 72 6f 63 20 62 75 73 79 20  st].  proc busy 
1e70: 7b 6e 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  {n} {.    lappen
1e80: 64 20 3a 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20  d ::nbusy $n.   
1e90: 20 69 66 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c   if {$n>5} { sql
1ea0: 32 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72  2 COMMIT }.    r
1eb0: 65 74 75 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62  eturn 0.  }.  db
1ec0: 20 62 75 73 79 20 62 75 73 79 0a 0a 20 20 64 6f   busy busy..  do
1ed0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1ee0: 2e 32 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20  .29 { .    sql1 
1ef0: 7b 20 42 45 47 49 4e 20 3b 20 49 4e 53 45 52 54  { BEGIN ; INSERT
1f00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1f10: 27 78 27 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d  'x', 'y') } .  }
1f20: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
1f30: 67 65 72 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20  ger1-$tn.30 { . 
1f40: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 20     sql2 { BEGIN 
1f50: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1f60: 74 31 20 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e  t1 } .  } {21 on
1f70: 65 20 32 32 20 74 77 6f 20 32 33 20 74 68 72 65  e 22 two 23 thre
1f80: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  e}.  do_test pag
1f90: 65 72 31 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c  er1-$tn.31 { sql
1fa0: 31 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20  1 COMMIT } {}.  
1fb0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1fc0: 74 6e 2e 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62  tn.32 { set ::nb
1fd0: 75 73 79 20 7d 20 7b 30 20 31 20 32 20 33 20 34  usy } {0 1 2 3 4
1fe0: 20 35 20 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   5 6}.}..#------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 0a 23 20 53 61 76 65 70 6f 69 6e 74 20  ---.# Savepoint 
2040: 72 65 6c 61 74 65 64 20 74 65 73 74 20 63 61 73  related test cas
2050: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 33  es..#.# pager1-3
2060: 2e 31 2e 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20  .1.2.*: Force a 
2070: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
2080: 63 6b 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ck to cause the 
2090: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20  database file.# 
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 74 6f 20 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67  to grow..#.# pag
20c0: 65 72 31 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65  er1-3.1.3.*: Use
20d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
20e0: 65 64 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ed in synchronou
20f0: 73 3d 6f 66 66 20 6d 6f 64 65 20 61 73 20 70 61  s=off mode as pa
2100: 72 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  rt.#            
2110: 20 20 20 20 20 6f 66 20 61 20 73 61 76 65 70 6f       of a savepo
2120: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20  int rollback..# 
2130: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
2140: 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  3.1.1 {.  faults
2150: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
2160: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
2170: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2180: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
2190: 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  EY, b);.    CREA
21a0: 54 45 20 54 41 42 4c 45 20 63 6f 75 6e 74 65 72  TE TABLE counter
21b0: 28 0a 20 20 20 20 20 20 69 20 43 48 45 43 4b 20  (.      i CHECK 
21c0: 28 69 3c 35 29 2c 20 0a 20 20 20 20 20 20 75 20  (i<5), .      u 
21d0: 43 48 45 43 4b 20 28 75 3c 31 30 29 0a 20 20 20  CHECK (u<10).   
21e0: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
21f0: 4e 54 4f 20 63 6f 75 6e 74 65 72 20 56 41 4c 55  NTO counter VALU
2200: 45 53 28 30 2c 20 30 29 3b 0a 20 20 20 20 43 52  ES(0, 0);.    CR
2210: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31  EATE TRIGGER tr1
2220: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
2230: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
2240: 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72 20 53  UPDATE counter S
2250: 45 54 20 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20  ET i = i+1;.    
2260: 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20  END;.    CREATE 
2270: 54 52 49 47 47 45 52 20 74 72 32 20 41 46 54 45  TRIGGER tr2 AFTE
2280: 52 20 55 50 44 41 54 45 20 4f 4e 20 74 31 20 42  R UPDATE ON t1 B
2290: 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54  EGIN.      UPDAT
22a0: 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20 75 20  E counter SET u 
22b0: 3d 20 75 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a  = u+1;.    END;.
22c0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
22d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f  SELECT * FROM co
22e0: 75 6e 74 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a  unter }.} {0 0}.
22f0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2300: 20 70 61 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a   pager1-3.1.2 {.
2310: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
2320: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49  ize = 10;.  BEGI
2330: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
2340: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
2350: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2360: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2370: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
2380: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2390: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
23a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
23b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
23c0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
23d0: 46 52 4f 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20  FROM counter;.} 
23e0: 7b 33 20 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71  {3 0}.do_catchsq
23f0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2400: 31 2e 33 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  1.3 {.    INSERT
2410: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2420: 61 2b 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  a+3, randomblob(
2430: 31 35 30 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20  1500) FROM t1.} 
2440: 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66  {1 {constraint f
2450: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73  ailed}}.do_execs
2460: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2470: 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .4 { SELECT * FR
2480: 4f 4d 20 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20  OM counter } {3 
2490: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
24a0: 73 74 20 70 61 67 65 72 31 2d 33 2e 35 20 7b 20  st pager1-3.5 { 
24b0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
24c0: 20 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78   } {1 2 3}.do_ex
24d0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
24e0: 31 2d 33 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d  1-3.6 { COMMIT }
24f0: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e   {}..foreach {tn
2500: 20 73 71 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20   sql tcl} {.  7 
2510: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2520: 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b  onous = NORMAL ;
2530: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
2540: 72 65 20 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74  re = 0 } {.    t
2550: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
2560: 6c 74 20 31 0a 20 20 20 20 74 76 20 64 65 76 63  lt 1.    tv devc
2570: 68 61 72 20 73 61 66 65 5f 61 70 70 65 6e 64 0a  har safe_append.
2580: 20 20 7d 0a 20 20 38 20 20 7b 20 50 52 41 47 4d    }.  8  { PRAGM
2590: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
25a0: 4e 4f 52 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20  NORMAL ; PRAGMA 
25b0: 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d  temp_store = 2 }
25c0: 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74   {.    testvfs t
25d0: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20  v -default 1.   
25e0: 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71 75   tv devchar sequ
25f0: 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20  ential.  }.  9  
2600: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2610: 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20  nous = FULL } { 
2620: 7d 0a 20 20 31 30 20 7b 20 50 52 41 47 4d 41 20  }.  10 { PRAGMA 
2630: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f  synchronous = NO
2640: 52 4d 41 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20  RMAL } { }.  11 
2650: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2660: 6e 6f 75 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d  nous = OFF } { }
2670: 0a 20 20 31 32 20 7b 20 50 52 41 47 4d 41 20 73  .  12 { PRAGMA s
2680: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c  ynchronous = FUL
2690: 4c 20 3b 20 50 52 41 47 4d 41 20 66 75 6c 6c 66  L ; PRAGMA fullf
26a0: 73 79 6e 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20  sync = 1 } { }. 
26b0: 20 31 33 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   13 { PRAGMA syn
26c0: 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20  chronous = FULL 
26d0: 7d 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20  } {.    testvfs 
26e0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
26f0: 20 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71    tv devchar seq
2700: 75 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34  uential.  }.  14
2710: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
2720: 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49  g_mode = EXCLUSI
2730: 56 45 20 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20  VE } {.  }.} {. 
2740: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
2750: 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76  3.$tn.1 {.    ev
2760: 61 6c 20 24 74 63 6c 0a 20 20 20 20 66 61 75 6c  al $tcl.    faul
2770: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
2780: 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75  reopen.    db fu
2790: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
27a0: 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c  ring.    execsql
27b0: 20 24 73 71 6c 0a 20 20 20 20 65 78 65 63 73 71   $sql.    execsq
27c0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
27d0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32   auto_vacuum = 2
27e0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63  ;.      PRAGMA c
27f0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
2800: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
2810: 4c 45 20 7a 28 78 20 49 4e 54 45 47 45 52 20 50  LE z(x INTEGER P
2820: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
2830: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
2840: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2850: 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20   z VALUES(NULL, 
2860: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
2870: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2880: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
2890: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
28a0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
28b0: 20 20 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45    2.        INSE
28c0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
28d0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
28e0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
28f0: 20 2d 2d 20 20 20 34 0a 20 20 20 20 20 20 20 20   --   4.        
2900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2910: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2920: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2930: 20 20 20 20 20 2d 2d 20 20 20 38 0a 20 20 20 20       --   8.    
2940: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2950: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2960: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2970: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a  M z;     --  16.
2980: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2990: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
29a0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
29b0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
29c0: 20 33 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45   32.        INSE
29d0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
29e0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
29f0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
2a00: 20 2d 2d 20 20 36 34 0a 20 20 20 20 20 20 20 20   --  64.        
2a10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2a20: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2a30: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2a40: 20 20 20 20 20 2d 2d 20 31 32 38 0a 20 20 20 20       -- 128.    
2a50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2a60: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2a70: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2a80: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a  M z;     -- 256.
2a90: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
2aa0: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
2ab0: 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61  { PRAGMA auto_va
2ac0: 63 75 75 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20  cuum }.  } {2}. 
2ad0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2ae0: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20   pager1-3.$tn.2 
2af0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
2b00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
2b10: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
2b20: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
2b30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2b40: 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61  z VALUES(NULL, a
2b50: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
2b60: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
2b70: 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41  ne;.        UPDA
2b80: 54 45 20 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c  TE z SET y = NUL
2b90: 4c 20 57 48 45 52 45 20 78 3e 32 35 36 3b 0a 20  L WHERE x>256;. 
2ba0: 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e         PRAGMA in
2bb0: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
2bc0: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
2bd0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a   count(*) FROM z
2be0: 20 57 48 45 52 45 20 78 20 3c 20 31 30 30 3b 0a   WHERE x < 100;.
2bf0: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
2c00: 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49  O one;.    COMMI
2c10: 54 3b 0a 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64  T;.  } {99}..  d
2c20: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
2c30: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a  ager1-3.$tn.3 {.
2c40: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2c50: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
2c60: 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20 7a          UPDATE z
2c70: 20 53 45 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20   SET y = y||x;. 
2c80: 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
2c90: 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   one;.    COMMIT
2ca0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
2cb0: 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20  nt(*) FROM z;.  
2cc0: 7d 20 7b 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78  } {258}..  do_ex
2cd0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
2ce0: 31 2d 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20  1-3.$tn.4 {.    
2cf0: 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20  SAVEPOINT one;. 
2d00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2d10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2d20: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
2d30: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  .  } {}.  do_exe
2d40: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
2d50: 2d 33 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53  -3.$tn.5 {.    S
2d60: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2d70: 52 4f 4d 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41  ROM z;.    RELEA
2d80: 53 45 20 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47  SE one;.    PRAG
2d90: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2da0: 63 6b 3b 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d  ck;.  } {258 ok}
2db0: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
2dc0: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e  est pager1-3.$tn
2dd0: 2e 36 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49  .6 {.    SAVEPOI
2de0: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45  NT one;.    RELE
2df0: 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a  ASE one;.  } {}.
2e00: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61  .  db close.  ca
2e10: 74 63 68 20 7b 20 74 76 20 64 65 6c 65 74 65 20  tch { tv delete 
2e20: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2e70: 23 20 48 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  # Hot journal ro
2e80: 6c 6c 62 61 63 6b 20 72 65 6c 61 74 65 64 20 74  llback related t
2e90: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70  est cases..#.# p
2ea0: 61 67 65 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73  ager1.4.1.*: Tes
2eb0: 74 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  t that the pager
2ec0: 20 6d 6f 64 75 6c 65 20 64 65 6c 65 74 65 73 20   module deletes 
2ed0: 76 65 72 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c  very small inval
2ee0: 69 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  id.#            
2ef0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73     journal files
2f00: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 32  ..#.# pager1.4.2
2f10: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66  .*: Test that if
2f20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2f30: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 74 20 74  nal pointer at t
2f40: 68 65 20 65 6e 64 20 6f 66 20 61 0a 23 20 20 20  he end of a.#   
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 74 2d              hot-
2f60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 70 70  journal file app
2f70: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
2f80: 70 74 20 28 63 68 65 63 6b 73 75 6d 20 64 6f 65  pt (checksum doe
2f90: 73 20 6e 6f 74 0a 23 20 20 20 20 20 20 20 20 20  s not.#         
2fa0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 29 20 74        compute) t
2fb0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f  he associated jo
2fc0: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
2fd0: 62 61 63 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20  back (and no.#  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 41 63               xAc
2ff0: 63 65 73 73 28 29 20 63 61 6c 6c 20 74 6f 20 63  cess() call to c
3000: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 70 72 65  heck for the pre
3010: 73 65 6e 63 65 20 6f 66 20 61 6e 79 20 6d 61 73  sence of any mas
3020: 74 65 72 20 0a 23 20 20 20 20 20 20 20 20 20 20  ter .#          
3030: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
3040: 65 20 69 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20  e is made)..#.# 
3050: 70 61 67 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65  pager1.4.3.*: Te
3060: 73 74 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  st that the cont
3070: 65 6e 74 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  ents of a hot-jo
3080: 75 72 6e 61 6c 20 61 72 65 20 69 67 6e 6f 72 65  urnal are ignore
3090: 64 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20  d if the.#      
30a0: 20 20 20 20 20 20 20 20 20 70 61 67 65 2d 73 69           page-si
30b0: 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a  ze or sector-siz
30c0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
30d0: 20 68 65 61 64 65 72 20 61 70 70 65 61 72 20 74   header appear t
30e0: 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  o.#             
30f0: 20 20 62 65 20 69 6e 76 61 6c 69 64 20 28 74 6f    be invalid (to
3100: 6f 20 6c 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61  o large, too sma
3110: 6c 6c 20 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65  ll or not a powe
3120: 72 20 6f 66 20 32 29 2e 0a 23 0a 23 20 70 61 67  r of 2)..#.# pag
3130: 65 72 31 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20  er1.4.4.*: Test 
3140: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3150: 62 61 63 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  back of journal 
3160: 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 73 74  file with a mast
3170: 65 72 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  er.#            
3180: 20 20 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74     journal point
3190: 65 72 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  er generated in 
31a0: 76 61 72 69 6f 75 73 20 22 50 52 41 47 4d 41 20  various "PRAGMA 
31b0: 73 79 6e 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20  synchronous".#  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64               mod
31d0: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34  es..#.# pager1.4
31e0: 2e 35 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .5.*: Test that 
31f0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3200: 62 61 63 6b 20 73 74 6f 70 73 20 69 66 20 69 74  back stops if it
3210: 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 0a 23 20   encounters a.# 
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
3230: 75 72 6e 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72  urnal-record for
3240: 20 77 68 69 63 68 20 74 68 65 20 63 68 65 63 6b   which the check
3250: 73 75 6d 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70  sum fails..#.# p
3260: 61 67 65 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73  ager1.4.6.*: Tes
3270: 74 20 74 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c  t that when roll
3280: 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
3290: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74  ournal that cont
32a0: 61 69 6e 73 20 61 0a 23 20 20 20 20 20 20 20 20  ains a.#        
32b0: 20 20 20 20 20 20 20 6d 61 73 74 65 72 20 6a 6f         master jo
32c0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74  urnal pointer, t
32d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
32e0: 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65  l file is delete
32f0: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
3300: 20 20 61 66 74 65 72 20 61 6c 6c 20 74 68 65 20    after all the 
3310: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61  hot-journals tha
3320: 74 20 72 65 66 65 72 20 74 6f 20 69 74 20 61 72  t refer to it ar
3330: 65 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70  e deleted..#.# p
3340: 61 67 65 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73  ager1.4.7.*: Tes
3350: 74 20 74 68 61 74 20 69 66 20 61 20 68 6f 74 2d  t that if a hot-
3360: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
3370: 73 74 73 20 62 75 74 20 61 20 63 6c 69 65 6e 74  sts but a client
3380: 20 63 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20   can.#          
3390: 20 20 20 20 20 6f 70 65 6e 20 69 74 20 66 6f 72       open it for
33a0: 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74   reading only, t
33b0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
33c0: 6f 74 20 62 65 20 61 63 63 65 73 73 65 64 20 61  ot be accessed a
33d0: 6e 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  nd.#            
33e0: 20 20 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50     SQLITE_CANTOP
33f0: 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EN is returned..
3400: 23 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  # .do_test pager
3410: 31 2e 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c  1.4.1.1 {.  faul
3420: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
3430: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
3440: 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54   { .    CREATE T
3450: 41 42 4c 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20  ABLE x(y, z);.  
3460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20    INSERT INTO x 
3470: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
3480: 7d 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  }.  set fd [open
3490: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34a0: 20 77 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65   w].  puts -none
34b0: 77 6c 69 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f  wline $fd "hello
34c0: 77 6f 72 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24  world".  close $
34d0: 66 64 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73  fd.  file exists
34e0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34f0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {1}.do_test p
3500: 61 67 65 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78  ager1.4.1.2 { ex
3510: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
3520: 20 46 52 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32   FROM x } } {1 2
3530: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
3540: 2e 34 2e 31 2e 33 20 7b 20 66 69 6c 65 20 65 78  .4.1.3 { file ex
3550: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
3560: 72 6e 61 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65  rnal } {0}..# Se
3570: 74 20 75 70 20 61 20 5b 74 65 73 74 76 66 73 5d  t up a [testvfs]
3580: 20 74 6f 20 73 6e 61 70 73 68 6f 74 20 74 68 65   to snapshot the
3590: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73   file-system jus
35a0: 74 20 62 65 66 6f 72 65 20 53 51 4c 69 74 65 0a  t before SQLite.
35b0: 23 20 64 65 6c 65 74 65 73 20 74 68 65 20 6d 61  # deletes the ma
35c0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20  ster-journal to 
35d0: 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66  commit a multi-f
35e0: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ile transaction.
35f0: 0a 23 0a 23 20 49 6e 20 73 75 62 73 65 71 75 65  .#.# In subseque
3600: 6e 74 20 74 65 73 74 20 63 61 73 65 73 2c 20 69  nt test cases, i
3610: 6e 76 6f 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69  nvoking [faultsi
3620: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3630: 6f 70 65 6e 5d 20 73 65 74 73 0a 23 20 75 70 20  open] sets.# up 
3640: 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
3650: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64  to contain two d
3660: 61 74 61 62 61 73 65 73 2c 20 74 77 6f 20 68 6f  atabases, two ho
3670: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t-journal files 
3680: 61 6e 64 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a  and.# a master-j
3690: 6f 75 72 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73  ournal..#.do_tes
36a0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b  t pager1.4.2.1 {
36b0: 0a 20 20 74 65 73 74 76 66 73 20 74 73 74 76 66  .  testvfs tstvf
36c0: 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74  s -default 1.  t
36d0: 73 74 76 66 73 20 66 69 6c 74 65 72 20 78 44 65  stvfs filter xDe
36e0: 6c 65 74 65 0a 20 20 74 73 74 76 66 73 20 73 63  lete.  tstvfs sc
36f0: 72 69 70 74 20 78 44 65 6c 65 74 65 43 61 6c 6c  ript xDeleteCall
3700: 62 61 63 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c  back.  proc xDel
3710: 65 74 65 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74  eteCallback {met
3720: 68 6f 64 20 66 69 6c 65 20 61 72 67 73 7d 20 7b  hod file args} {
3730: 0a 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b 66  .    set file [f
3740: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a  ile tail $file].
3750: 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67      if { [string
3760: 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c   match *mj* $fil
3770: 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f  e] } { faultsim_
3780: 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75  save }.  }.  fau
3790: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
37a0: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
37b0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
37c0: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
37d0: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
37e0: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
37f0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
3800: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
3810: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
3820: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3830: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e  .    PRAGMA aux.
3840: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3850: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3860: 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62  E t1(a UNIQUE, b
3870: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52   UNIQUE);.    CR
3880: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
3890: 32 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  2(a UNIQUE, b UN
38a0: 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52  IQUE);.    INSER
38b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
38c0: 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20  (a_string(200), 
38d0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a  a_string(300));.
38e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
38f0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3900: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3910: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3920: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3930: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3940: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3950: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3960: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3970: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
3980: 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   t1;.    BEGIN;.
3990: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
39a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
39b0: 72 69 6e 67 28 32 30 31 29 2c 20 61 5f 73 74 72  ring(201), a_str
39c0: 69 6e 67 28 33 30 31 29 20 46 52 4f 4d 20 74 31  ing(301) FROM t1
39d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
39e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
39f0: 73 74 72 69 6e 67 28 32 30 32 29 2c 20 61 5f 73  string(202), a_s
3a00: 74 72 69 6e 67 28 33 30 32 29 20 46 52 4f 4d 20  tring(302) FROM 
3a10: 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t1;.      INSERT
3a20: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3a30: 61 5f 73 74 72 69 6e 67 28 32 30 33 29 2c 20 61  a_string(203), a
3a40: 5f 73 74 72 69 6e 67 28 33 30 33 29 20 46 52 4f  _string(303) FRO
3a50: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
3a60: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
3a70: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 34 29 2c  T a_string(204),
3a80: 20 61 5f 73 74 72 69 6e 67 28 33 30 34 29 20 46   a_string(304) F
3a90: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 45  ROM t1;.      RE
3aa0: 50 4c 41 43 45 20 49 4e 54 4f 20 74 32 20 53 45  PLACE INTO t2 SE
3ab0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
3ac0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
3ad0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73 74    db close.  tst
3ae0: 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a  vfs delete.} {}.
3af0: 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74  .if {$::tcl_plat
3b00: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d  form(platform)!=
3b10: 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 64 6f 5f  "windows"} {.do_
3b20: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3b30: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
3b40: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3b50: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3b60: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3b70: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3b80: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3b90: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3ba0: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
3bb0: 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75  r1.4.2.3 {.  fau
3bc0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
3bd0: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
3be0: 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e  ch f [glob test.
3bf0: 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64  db-mj*] { forced
3c00: 65 6c 65 74 65 20 24 66 20 7d 0a 20 20 65 78 65  elete $f }.  exe
3c10: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3c20: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3c30: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3c40: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3c50: 20 20 7d 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f    }.} {64 ok}.do
3c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32  _test pager1.4.2
3c70: 2e 34 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .4 {.  faultsim_
3c80: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
3c90: 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  en.  hexio_write
3ca0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3cb0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
3cc0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
3cd0: 6c 5d 2d 33 30 5d 20 31 32 33 34 35 36 0a 20 20  l]-30] 123456.  
3ce0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3cf0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
3d00: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
3d10: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
3d20: 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a  k;.  }.} {4 ok}.
3d30: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
3d40: 2e 32 2e 35 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.5 {.  faultsi
3d50: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3d60: 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69  open.  hexio_wri
3d70: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
3d80: 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  al [expr [file s
3d90: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
3da0: 6e 61 6c 5d 2d 33 30 5d 20 31 32 33 34 35 36 0a  nal]-30] 123456.
3db0: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
3dc0: 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b  b test.db-mj*] {
3dd0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 66 20   forcedelete $f 
3de0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3df0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3e00: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3e10: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3e20: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3e30: 6f 6b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  ok}.}..do_test p
3e40: 61 67 65 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20  ager1.4.3.1 {.  
3e50: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3e60: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3e70: 66 73 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a  fs filter xSync.
3e80: 20 20 74 73 74 76 66 73 20 73 63 72 69 70 74 20    tstvfs script 
3e90: 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20  xSyncCallback.  
3ea0: 70 72 6f 63 20 78 53 79 6e 63 43 61 6c 6c 62 61  proc xSyncCallba
3eb0: 63 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20  ck {method file 
3ec0: 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20  args} {.    set 
3ed0: 66 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  file [file tail 
3ee0: 24 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20  $file].    if { 
3ef0: 30 3d 3d 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  0==[string match
3f00: 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d   *journal $file]
3f10: 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61   } { faultsim_sa
3f20: 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74  ve }.  }.  fault
3f30: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
3f40: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3f50: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
3f60: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
3f70: 54 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  TE;.    CREATE T
3f80: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
3f90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3fa0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
3fb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3fc0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
3fd0: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
3fe0: 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a    tstvfs delete.
3ff0: 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  } {}..foreach {t
4000: 6e 20 6f 66 73 74 20 76 61 6c 75 65 20 72 65 73  n ofst value res
4010: 75 6c 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ult} {.         
4020: 20 32 20 20 20 32 30 20 20 20 20 33 31 20 20 20   2   20    31   
4030: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
4040: 20 20 20 20 20 20 20 20 33 20 20 20 32 30 20 20          3   20  
4050: 20 20 33 32 20 20 20 20 20 20 20 7b 31 20 32 20    32       {1 2 
4060: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 34  3 4}.          4
4070: 20 20 20 32 30 20 20 20 20 33 33 20 20 20 20 20     20    33     
4080: 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20    {1 2 3 4}.    
4090: 20 20 20 20 20 20 35 20 20 20 32 30 20 20 20 20        5   20    
40a0: 36 35 35 33 36 20 20 20 20 7b 31 20 32 20 33 20  65536    {1 2 3 
40b0: 34 7d 0a 20 20 20 20 20 20 20 20 20 20 36 20 20  4}.          6  
40c0: 20 32 30 20 20 20 20 31 33 31 30 37 32 20 20 20   20    131072   
40d0: 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 20 20 20  {1 2 3 4}..     
40e0: 20 20 20 20 20 37 20 20 20 32 34 20 20 20 20 35       7   24    5
40f0: 31 31 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  11      {1 2 3 4
4100: 7d 0a 20 20 20 20 20 20 20 20 20 20 38 20 20 20  }.          8   
4110: 32 34 20 20 20 20 35 31 33 20 20 20 20 20 20 7b  24    513      {
4120: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4130: 20 20 20 39 20 20 20 32 34 20 20 20 20 31 33 31     9   24    131
4140: 30 37 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  072   {1 2 3 4}.
4150: 0a 20 20 20 20 20 20 20 20 20 31 30 20 20 20 33  .         10   3
4160: 32 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31  2    65536    {1
4170: 20 32 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   2}.} {.  do_tes
4180: 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e  t pager1.4.3.$tn
4190: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
41a0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
41b0: 65 6e 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69  en.    hexio_wri
41c0: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
41d0: 61 6c 20 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74  al $ofst [format
41e0: 20 25 2e 38 78 20 24 76 61 6c 75 65 5d 0a 20 20   %.8x $value].  
41f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
4200: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
4210: 20 7d 20 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20   } $result.}.db 
4220: 63 6c 6f 73 65 0a 0a 23 20 53 65 74 20 75 70 20  close..# Set up 
4230: 61 20 56 46 53 20 74 68 61 74 20 73 6e 61 70 73  a VFS that snaps
4240: 68 6f 74 73 20 74 68 65 20 66 69 6c 65 2d 73 79  hots the file-sy
4250: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
4260: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
4270: 6c 0a 23 20 66 69 6c 65 20 69 73 20 64 65 6c 65  l.# file is dele
4280: 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20  ted to commit a 
4290: 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
42a0: 61 63 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63  action. Specific
42b0: 61 6c 6c 79 2c 20 74 68 65 0a 23 20 66 69 6c 65  ally, the.# file
42c0: 2d 73 79 73 74 65 6d 20 69 73 20 73 61 76 65 64  -system is saved
42d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
42e0: 20 78 44 65 6c 65 74 65 28 29 20 63 61 6c 6c 20   xDelete() call 
42f0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 0a 23  to remove the .#
4300: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4310: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69  file from the fi
4320: 6c 65 2d 73 79 73 74 65 6d 2e 0a 23 0a 74 65 73  le-system..#.tes
4330: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
4340: 20 31 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70   1.tv script cop
4350: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73  y_on_mj_delete.s
4360: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
4370: 5f 6c 65 6e 67 74 68 20 30 0a 70 72 6f 63 20 63  _length 0.proc c
4380: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
4390: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
43a0: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
43b0: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d  [string match *m
43c0: 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  j* [file tail $f
43d0: 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20  ilename]]} { .  
43e0: 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e    set ::mj_filen
43f0: 61 6d 65 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69  ame_length [stri
4400: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e  ng length $filen
4410: 61 6d 65 5d 0a 20 20 20 20 66 61 75 6c 74 73 69  ame].    faultsi
4420: 6d 5f 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65  m_save .  }.  re
4430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
4440: 0a 0a 73 65 74 20 70 77 64 20 5b 67 65 74 5f 70  ..set pwd [get_p
4450: 77 64 5d 0a 69 66 20 7b 21 5b 66 6f 72 63 65 64  wd].if {![forced
4460: 5f 70 72 6f 78 79 5f 6c 6f 63 6b 69 6e 67 5d 7d  _proxy_locking]}
4470: 20 7b 0a 20 20 23 20 70 72 6f 78 79 20 6c 6f 63   {.  # proxy loc
4480: 6b 69 6e 67 20 75 73 65 73 20 63 61 6e 27 74 20  king uses can't 
4490: 64 65 61 6c 20 77 69 74 68 20 61 75 74 6f 20 70  deal with auto p
44a0: 72 6f 78 79 20 66 69 6c 65 20 70 61 74 68 73 20  roxy file paths 
44b0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 4d 41 58 50  longer than MAXP
44c0: 41 54 48 4c 45 4e 0a 66 6f 72 65 61 63 68 20 7b  ATHLEN.foreach {
44d0: 74 6e 31 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b  tn1 tcl} {.  1 {
44e0: 20 73 65 74 20 70 72 65 66 69 78 20 22 74 65 73   set prefix "tes
44f0: 74 2e 64 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20  t.db" }.  2 { . 
4500: 20 20 20 23 20 54 68 69 73 20 74 65 73 74 20 64     # This test d
4510: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e  epends on the un
4520: 64 65 72 6c 79 69 6e 67 20 56 46 53 20 62 65 69  derlying VFS bei
4530: 6e 67 20 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ng able to open 
4540: 70 61 74 68 73 0a 20 20 20 20 23 20 35 31 32 20  paths.    # 512 
4550: 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
4560: 20 54 68 65 20 69 64 65 61 20 69 73 20 74 6f 20   The idea is to 
4570: 63 72 65 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75  create a hot-jou
4580: 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 0a 20  rnal file that. 
4590: 20 20 20 23 20 63 6f 6e 74 61 69 6e 73 20 61 20     # contains a 
45a0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
45b0: 6f 69 6e 74 65 72 20 73 6f 20 6c 61 72 67 65 20  ointer so large 
45c0: 74 68 61 74 20 69 74 20 63 6f 75 6c 64 20 63 6f  that it could co
45d0: 6e 74 61 69 6e 0a 20 20 20 20 23 20 61 20 76 61  ntain.    # a va
45e0: 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 20  lid page record 
45f0: 28 69 66 20 74 68 65 20 66 69 6c 65 20 70 61 67  (if the file pag
4600: 65 2d 73 69 7a 65 20 69 73 20 35 31 32 20 62 79  e-size is 512 by
4610: 74 65 73 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20  tes). So as to. 
4620: 20 20 20 23 20 6d 61 6b 65 20 73 75 72 65 20 53     # make sure S
4630: 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 67 65  QLite doesn't ge
4640: 74 20 63 6f 6e 66 75 73 65 64 20 62 79 20 74 68  t confused by th
4650: 69 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65  is..    #.    se
4660: 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72  t nPadding [expr
4670: 20 35 31 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c   511 - $::mj_fil
4680: 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20  ename_length].  
4690: 20 20 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66    if {$tcl_platf
46a0: 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22  orm(platform)=="
46b0: 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20  windows"} {.    
46c0: 20 20 23 20 54 42 44 20 6e 65 65 64 20 74 6f 20    # TBD need to 
46d0: 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 74  figure out how t
46e0: 6f 20 64 6f 20 74 68 69 73 20 63 6f 72 72 65 63  o do this correc
46f0: 74 6c 79 20 66 6f 72 20 57 69 6e 64 6f 77 73 21  tly for Windows!
4700: 21 21 0a 20 20 20 20 20 20 73 65 74 20 6e 50 61  !!.      set nPa
4710: 64 64 69 6e 67 20 5b 65 78 70 72 20 32 35 35 20  dding [expr 255 
4720: 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  - $::mj_filename
4730: 5f 6c 65 6e 67 74 68 5d 0a 20 20 20 20 7d 0a 0a  _length].    }..
4740: 20 20 20 20 23 20 57 65 20 63 61 6e 6e 6f 74 20      # We cannot 
4750: 6a 75 73 74 20 63 72 65 61 74 65 20 61 20 72 65  just create a re
4760: 61 6c 6c 79 20 6c 6f 6e 67 20 64 61 74 61 62 61  ally long databa
4770: 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20  se file name to 
4780: 6f 70 65 6e 2c 20 61 73 0a 20 20 20 20 23 20 4c  open, as.    # L
4790: 69 6e 75 78 20 6c 69 6d 69 74 73 20 61 20 73 69  inux limits a si
47a0: 6e 67 6c 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  ngle component o
47b0: 66 20 61 20 70 61 74 68 20 74 6f 20 32 35 35 20  f a path to 255 
47c0: 62 79 74 65 73 20 62 79 20 64 65 66 61 75 6c 74  bytes by default
47d0: 0a 20 20 20 20 23 20 28 61 6e 64 20 70 72 65 73  .    # (and pres
47e0: 75 6d 61 62 6c 79 20 6f 74 68 65 72 20 73 79 73  umably other sys
47f0: 74 65 6d 73 20 68 61 76 65 20 6c 69 6d 69 74 73  tems have limits
4800: 20 74 6f 6f 29 2e 20 53 6f 20 63 72 65 61 74 65   too). So create
4810: 20 61 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20   a directory.   
4820: 20 23 20 68 69 65 72 61 72 63 68 79 20 74 6f 20   # hierarchy to 
4830: 77 6f 72 6b 20 69 6e 2e 0a 20 20 20 20 23 0a 20  work in..    #. 
4840: 20 20 20 73 65 74 20 64 69 72 6e 61 6d 65 20 22     set dirname "
4850: 64 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  d123456789012345
4860: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 2f  678901234567890/
4870: 22 0a 20 20 20 20 73 65 74 20 6e 44 69 72 20 5b  ".    set nDir [
4880: 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20 2f  expr $nPadding /
4890: 20 33 32 5d 0a 20 20 20 20 69 66 20 7b 20 24 6e   32].    if { $n
48a0: 44 69 72 20 7d 20 7b 0a 20 20 20 20 20 20 73 65  Dir } {.      se
48b0: 74 20 70 20 5b 73 74 72 69 6e 67 20 72 65 70 65  t p [string repe
48c0: 61 74 20 24 64 69 72 6e 61 6d 65 20 24 6e 44 69  at $dirname $nDi
48d0: 72 5d 0a 20 20 20 20 20 20 66 69 6c 65 20 6d 6b  r].      file mk
48e0: 64 69 72 20 24 70 0a 20 20 20 20 20 20 63 64 20  dir $p.      cd 
48f0: 24 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65  $p.    }..    se
4900: 74 20 70 61 64 64 69 6e 67 20 5b 73 74 72 69 6e  t padding [strin
4910: 67 20 72 65 70 65 61 74 20 78 20 5b 65 78 70 72  g repeat x [expr
4920: 20 24 6e 50 61 64 64 69 6e 67 20 25 33 32 5d 5d   $nPadding %32]]
4930: 0a 20 20 20 20 73 65 74 20 70 72 65 66 69 78 20  .    set prefix 
4940: 22 74 65 73 74 2e 64 62 24 7b 70 61 64 64 69 6e  "test.db${paddin
4950: 67 7d 22 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 76  g}".  }.} {.  ev
4960: 61 6c 20 24 74 63 6c 0a 20 20 66 6f 72 65 61 63  al $tcl.  foreac
4970: 68 20 7b 74 6e 32 20 73 71 6c 7d 20 7b 0a 20 20  h {tn2 sql} {.  
4980: 20 20 6f 20 7b 20 0a 20 20 20 20 20 20 50 52 41    o { .      PRA
4990: 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f  GMA main.synchro
49a0: 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20  nous=OFF;.      
49b0: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
49c0: 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20  ronous=OFF;.    
49d0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
49e0: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
49f0: 20 20 20 20 7d 0a 20 20 20 20 6f 35 31 32 20 7b      }.    o512 {
4a00: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d   .      PRAGMA m
4a10: 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ain.synchronous=
4a20: 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  OFF;.      PRAGM
4a30: 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75  A aux.synchronou
4a40: 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  s=OFF;.      PRA
4a50: 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69  GMA main.page_si
4a60: 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20  ze = 512;.      
4a70: 50 52 41 47 4d 41 20 61 75 78 2e 70 61 67 65 5f  PRAGMA aux.page_
4a80: 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20  size = 512;.    
4a90: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
4aa0: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
4ab0: 20 20 20 20 7d 0a 20 20 20 20 6e 20 7b 20 0a 20      }.    n { . 
4ac0: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
4ad0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52  .synchronous=NOR
4ae0: 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  MAL;.      PRAGM
4af0: 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75  A aux.synchronou
4b00: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
4b10: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
4b20: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
4b30: 20 20 7d 0a 20 20 20 20 66 20 7b 20 0a 20 20 20    }.    f { .   
4b40: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73     PRAGMA main.s
4b50: 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b  ynchronous=FULL;
4b60: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
4b70: 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  x.synchronous=FU
4b80: 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  LL;.      PRAGMA
4b90: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
4ba0: 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20  DELETE;.    }.  
4bb0: 7d 20 7b 0a 0a 20 20 20 20 73 65 74 20 74 6e 20  } {..    set tn 
4bc0: 22 24 7b 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a  "${tn1}.${tn2}".
4bd0: 20 20 0a 20 20 20 20 23 20 53 65 74 20 75 70 20    .    # Set up 
4be0: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
4bf0: 68 61 76 65 20 74 77 6f 20 64 61 74 61 62 61 73  have two databas
4c00: 65 73 2c 20 74 65 73 74 2e 64 62 20 28 6d 61 69  es, test.db (mai
4c10: 6e 29 20 61 6e 64 20 0a 20 20 20 20 23 20 74 65  n) and .    # te
4c20: 73 74 2e 64 62 32 20 28 61 75 78 29 2e 20 54 68  st.db2 (aux). Th
4c30: 65 6e 20 72 75 6e 20 61 20 6d 75 6c 74 69 2d 66  en run a multi-f
4c40: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ile transaction 
4c50: 6f 6e 20 74 68 65 6d 2e 20 54 68 65 0a 20 20 20  on them. The.   
4c60: 20 23 20 56 46 53 20 77 69 6c 6c 20 73 6e 61 70   # VFS will snap
4c70: 73 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79  shot the file-sy
4c80: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
4c90: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
4ca0: 6e 61 6c 0a 20 20 20 20 23 20 66 69 6c 65 20 69  nal.    # file i
4cb0: 73 20 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d  s deleted to com
4cc0: 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
4cd0: 69 6f 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20 74  ion..    #.    t
4ce0: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
4cf0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
4d00: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a  er1-4.4.$tn.1 {.
4d10: 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64        faultsim_d
4d20: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
4d30: 20 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65   $prefix.      e
4d40: 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20  xecsql ".       
4d50: 20 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69   ATTACH '${prefi
4d60: 78 7d 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20  x}2' AS aux;.   
4d70: 20 20 20 20 20 24 73 71 6c 0a 20 20 20 20 20 20       $sql.      
4d80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
4d90: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45  (x);.        CRE
4da0: 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 62 28  ATE TABLE aux.b(
4db0: 78 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  x);.        INSE
4dc0: 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53  RT INTO a VALUES
4dd0: 28 27 64 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a  ('double-you');.
4de0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4df0: 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 77 68  NTO a VALUES('wh
4e00: 79 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  y');.        INS
4e10: 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45  ERT INTO a VALUE
4e20: 53 28 27 7a 65 64 27 29 3b 0a 20 20 20 20 20 20  S('zed');.      
4e30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
4e40: 56 41 4c 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20  VALUES('won');. 
4e50: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4e60: 54 4f 20 62 20 56 41 4c 55 45 53 28 27 74 6f 6f  TO b VALUES('too
4e70: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
4e80: 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53  RT INTO b VALUES
4e90: 28 27 66 72 65 65 27 29 3b 0a 20 20 20 20 20 20  ('free');.      
4ea0: 22 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  ".      execsql 
4eb0: 7b 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b  {.        BEGIN;
4ec0: 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52  .          INSER
4ed0: 54 20 49 4e 54 4f 20 61 20 53 45 4c 45 43 54 20  T INTO a SELECT 
4ee0: 2a 20 46 52 4f 4d 20 62 20 57 48 45 52 45 20 72  * FROM b WHERE r
4ef0: 6f 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20  owid<=3;.       
4f00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62     INSERT INTO b
4f10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
4f20: 20 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b   WHERE rowid<=3;
4f30: 0a 20 20 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  .        COMMIT;
4f40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b  .      }.    } {
4f50: 7d 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20  }.    tv filter 
4f60: 7b 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 43 68  {}.    .    # Ch
4f70: 65 63 6b 20 74 68 61 74 20 74 68 65 20 74 72 61  eck that the tra
4f80: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
4f90: 6d 69 74 74 65 64 20 73 75 63 63 65 73 73 66 75  mitted successfu
4fa0: 6c 6c 79 2e 0a 20 20 20 20 23 0a 20 20 20 20 64  lly..    #.    d
4fb0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
4fc0: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 32 20  ager1-4.4.$tn.2 
4fd0: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
4fe0: 20 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64   FROM a.    } {d
4ff0: 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65  ouble-you why ze
5000: 64 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a  d won too free}.
5010: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
5020: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
5030: 74 6e 2e 33 20 7b 0a 20 20 20 20 20 20 53 45 4c  tn.3 {.      SEL
5040: 45 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20  ECT * FROM b.   
5050: 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65   } {won too free
5060: 20 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20   double-you why 
5070: 7a 65 64 7d 0a 20 20 20 20 0a 20 20 20 20 23 20  zed}.    .    # 
5080: 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  Restore the file
5090: 2d 73 79 73 74 65 6d 20 61 6e 64 20 72 65 6f 70  -system and reop
50a0: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 73  en the databases
50b0: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 69 74 20  . Check that it 
50c0: 6e 6f 77 0a 20 20 20 20 23 20 61 70 70 65 61 72  now.    # appear
50d0: 73 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  s that the trans
50e0: 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63  action was not c
50f0: 6f 6d 6d 69 74 74 65 64 20 28 62 65 63 61 75 73  ommitted (becaus
5100: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
5110: 6d 0a 20 20 20 20 23 20 77 61 73 20 72 65 73 74  m.    # was rest
5120: 6f 72 65 64 20 74 6f 20 74 68 65 20 73 74 61 74  ored to the stat
5130: 65 20 77 68 65 72 65 20 69 74 20 68 61 64 20 6e  e where it had n
5140: 6f 74 20 62 65 65 6e 29 2e 0a 20 20 20 20 23 0a  ot been)..    #.
5150: 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
5160: 72 31 2d 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20  r1-4.4.$tn.4 {. 
5170: 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65       faultsim_re
5180: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5190: 20 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65   $prefix.      e
51a0: 78 65 63 73 71 6c 20 22 41 54 54 41 43 48 20 27  xecsql "ATTACH '
51b0: 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61  ${prefix}2' AS a
51c0: 75 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20  ux".    } {}.   
51d0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
51e0: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
51f0: 35 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  5 {SELECT * FROM
5200: 20 61 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20   a} {double-you 
5210: 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 64 6f 5f  why zed}.    do_
5220: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
5230: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53  er1-4.4.$tn.6 {S
5240: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20  ELECT * FROM b} 
5250: 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20  {won too free}. 
5260: 20 20 20 0a 20 20 20 20 23 20 52 65 73 74 6f 72     .    # Restor
5270: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
5280: 6d 20 61 67 61 69 6e 2e 20 54 68 69 73 20 74 69  m again. This ti
5290: 6d 65 2c 20 62 65 66 6f 72 65 20 72 65 6f 70 65  me, before reope
52a0: 6e 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ning the databas
52b0: 65 73 2c 0a 20 20 20 20 23 20 64 65 6c 65 74 65  es,.    # delete
52c0: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
52d0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74 68  nal file from th
52e0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 49  e file-system. I
52f0: 74 20 6e 6f 77 20 61 70 70 65 61 72 73 20 74 68  t now appears th
5300: 61 74 0a 20 20 20 20 23 20 74 68 65 20 74 72 61  at.    # the tra
5310: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
5320: 6d 69 74 74 65 64 20 28 6e 6f 20 6d 61 73 74 65  mitted (no maste
5330: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 3d  r-journal file =
5340: 3d 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  = no rollback)..
5350: 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73      #.    do_tes
5360: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
5370: 2e 37 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74  .7 {.      fault
5380: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5390: 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20  reopen $prefix. 
53a0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 20 5b       foreach f [
53b0: 67 6c 6f 62 20 24 7b 70 72 65 66 69 78 7d 2d 6d  glob ${prefix}-m
53c0: 6a 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74  j*] { forcedelet
53d0: 65 20 24 66 20 7d 0a 20 20 20 20 20 20 65 78 65  e $f }.      exe
53e0: 63 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b  csql "ATTACH '${
53f0: 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78  prefix}2' AS aux
5400: 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64  ".    } {}.    d
5410: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5420: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20  ager1-4.4.$tn.8 
5430: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
5440: 20 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64   FROM a.    } {d
5450: 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65  ouble-you why ze
5460: 64 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a  d won too free}.
5470: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
5480: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
5490: 74 6e 2e 39 20 7b 0a 20 20 20 20 20 20 53 45 4c  tn.9 {.      SEL
54a0: 45 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20  ECT * FROM b.   
54b0: 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65   } {won too free
54c0: 20 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20   double-you why 
54d0: 7a 65 64 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24  zed}.  }..  cd $
54e0: 70 77 64 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74  pwd.}.db close.t
54f0: 76 20 64 65 6c 65 74 65 0a 66 6f 72 63 65 64 65  v delete.forcede
5500: 6c 65 74 65 20 24 64 69 72 6e 61 6d 65 0a 7d 0a  lete $dirname.}.
5510: 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56 46 53  ..# Set up a VFS
5520: 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20   to make a copy 
5530: 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
5540: 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 64  em just before d
5550: 65 6c 65 74 69 6e 67 20 61 0a 23 20 6a 6f 75 72  eleting a.# jour
5560: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 63 6f 6d 6d  nal file to comm
5570: 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
5580: 2e 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  . The transactio
5590: 6e 20 6d 6f 64 69 66 69 65 73 20 65 78 61 63 74  n modifies exact
55a0: 6c 79 0a 23 20 74 77 6f 20 64 61 74 61 62 61 73  ly.# two databas
55b0: 65 20 70 61 67 65 73 20 28 61 6e 64 20 70 61 67  e pages (and pag
55c0: 65 20 31 20 2d 20 74 68 65 20 63 68 61 6e 67 65  e 1 - the change
55d0: 20 63 6f 75 6e 74 65 72 29 2e 0a 23 0a 74 65 73   counter)..#.tes
55e0: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
55f0: 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65   1.tv sectorsize
5600: 20 35 31 32 0a 74 76 20 73 63 72 69 70 74 20 63   512.tv script c
5610: 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64  opy_on_journal_d
5620: 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20  elete.tv filter 
5630: 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70  xDelete.proc cop
5640: 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c  y_on_journal_del
5650: 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65  ete {method file
5660: 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69  name args} {.  i
5670: 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
5680: 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e   *journal $filen
5690: 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73  ame]} faultsim_s
56a0: 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53 51  ave .  return SQ
56b0: 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73  LITE_OK.}.faults
56c0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
56d0: 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  open.do_execsql_
56e0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
56f0: 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75  1 {.  PRAGMA jou
5700: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
5710: 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 70 61 67  TE;.  PRAGMA pag
5720: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
5730: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
5740: 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45  (a, b);.  CREATE
5750: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
5760: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
5770: 31 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49  1 VALUES('I', 'I
5780: 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  I');.  INSERT IN
5790: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 49 49  TO t2 VALUES('II
57a0: 49 27 2c 20 27 49 56 27 29 3b 0a 20 20 42 45 47  I', 'IV');.  BEG
57b0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
57c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
57d0: 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
57e0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33  INTO t2 VALUES(3
57f0: 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a  , 4);.  COMMIT;.
5800: 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20 66 69  } {delete}.tv fi
5810: 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65 63 6b  lter {}..# Check
5820: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
5830: 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 3a 0a   was committed:.
5840: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
5850: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32 20 7b  t pager1.4.5.2 {
5860: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5870: 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20   t1;.  SELECT * 
5880: 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49  FROM t2;.} {I II
5890: 20 31 20 32 20 49 49 49 20 49 56 20 33 20 34 7d   1 2 III IV 3 4}
58a0: 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f 75 72  ..# Now try four
58b0: 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70 61 67   tests:.#.#  pag
58c0: 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73 74 6f  er1-4.5.3: Resto
58d0: 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  re the file-syst
58e0: 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74  em. Check that t
58f0: 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
5900: 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20 20 20  tion .#         
5910: 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c 65 64         is rolled
5920: 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65   back..#.#  page
5930: 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74 6f 72  r1-4.5.4: Restor
5940: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
5950: 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20 66  m. Corrupt the f
5960: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74  irst record in t
5970: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
5980: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65      journal. Che
5990: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
59a0: 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c 65 64  on is not rolled
59b0: 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65   back..#.#  page
59c0: 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74 6f 72  r1-4.5.5: Restor
59d0: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
59e0: 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20 73  m. Corrupt the s
59f0: 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69 6e 20  econd record in 
5a00: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
5a10: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68       journal. Ch
5a20: 65 63 6b 20 74 68 61 74 20 74 68 65 20 66 69 72  eck that the fir
5a30: 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  st record in the
5a40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5a50: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5a60: 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 62    played back, b
5a70: 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63 6f 6e  ut not the secon
5a80: 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34  d..#.#  pager1-4
5a90: 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20 74 68  .5.6: Restore th
5aa0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
5ab0: 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64  ry to open the d
5ac0: 61 74 61 62 61 73 65 20 77 69 74 68 20 61 0a 23  atabase with a.#
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ae0: 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65 63 74  readonly connect
5af0: 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ion. This should
5b00: 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65 61 64   fail, as a read
5b10: 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20 20 20  -only.#         
5b20: 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
5b30: 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20 62 61  n cannot roll ba
5b40: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
5b50: 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d  file..#.faultsim
5b60: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5b70: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
5b80: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 33  est pager1.4.5.3
5b90: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
5ba0: 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20  OM t1;.  SELECT 
5bb0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20  * FROM t2;.} {I 
5bc0: 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75 6c 74  II III IV}.fault
5bd0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5be0: 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69  reopen.hexio_wri
5bf0: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
5c00: 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 2b 31  al [expr 512+4+1
5c10: 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32 33 34  024 - 202] 01234
5c20: 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f 5f 65  56789ABCDEF.do_e
5c30: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
5c40: 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53 45 4c  r1.4.5.4 {.  SEL
5c50: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
5c60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5c70: 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 20 49  2;.} {I II 1 2 I
5c80: 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75 6c 74  II IV 3 4}.fault
5c90: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5ca0: 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69  reopen.hexio_wri
5cb0: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
5cc0: 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 2b 31  al [expr 512+4+1
5cd0: 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d 20 32  024+4+4+1024 - 2
5ce0: 30 32 5d 20 30 31 32 33 34 35 36 37 38 39 41 42  02] 0123456789AB
5cf0: 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  CDEF.do_execsql_
5d00: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
5d10: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  5 {.  SELECT * F
5d20: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
5d30: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49   * FROM t2;.} {I
5d40: 20 49 49 20 49 49 49 20 49 56 20 33 20 34 7d 0a   II III IV 3 4}.
5d50: 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72  .faultsim_restor
5d60: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20  e_and_reopen.db 
5d70: 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62  close.sqlite3 db
5d80: 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e   test.db -readon
5d90: 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73 71 6c  ly 1.do_catchsql
5da0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5db0: 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .6 {.  SELECT * 
5dc0: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
5dd0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
5de0: 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  1 {disk I/O erro
5df0: 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20  r}}.db close..# 
5e00: 53 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69 6c  Snapshot the fil
5e10: 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65  e-system just be
5e20: 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69 6c 65 20  fore multi-file 
5e30: 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20 74 68 65  commit. Save the
5e40: 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68 65 20 6d   name.# of the m
5e50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5e60: 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66 69 6c 65  le in $::mj_file
5e70: 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63 72 69 70  name..#.tv scrip
5e80: 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c  t copy_on_mj_del
5e90: 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78 44  ete.tv filter xD
5ea0: 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f  elete.proc copy_
5eb0: 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d 65  on_mj_delete {me
5ec0: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
5ed0: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
5ee0: 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 5b  ing match *mj* [
5ef0: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e  file tail $filen
5f00: 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73 65  ame]]} { .    se
5f10: 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20  t ::mj_filename 
5f20: 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 66 61  $filename.    fa
5f30: 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d  ultsim_save .  }
5f40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5f50: 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61  _OK.}.do_test pa
5f60: 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a 20 20 66  ger1.4.6.1 {.  f
5f70: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
5f80: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
5f90: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
5fa0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
5fb0: 44 45 4c 45 54 45 3b 0a 20 20 20 20 41 54 54 41  DELETE;.    ATTA
5fc0: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
5fd0: 20 74 77 6f 3b 0a 20 20 20 20 43 52 45 41 54 45   two;.    CREATE
5fe0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
5ff0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6000: 45 20 74 77 6f 2e 74 32 28 61 2c 20 62 29 3b 0a  E two.t2(a, b);.
6010: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6020: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 74 31  t1 VALUES(1, 't1
6030: 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  .1');.    INSERT
6040: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
6050: 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20 20 20 20  1, 't2.1');.    
6060: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
6070: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 27  ATE t1 SET b = '
6080: 74 31 2e 32 27 3b 0a 20 20 20 20 20 20 55 50 44  t1.2';.      UPD
6090: 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27  ATE t2 SET b = '
60a0: 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f 4d 4d 49  t2.2';.    COMMI
60b0: 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66 69 6c 74  T;.  }.  tv filt
60c0: 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c 6f 73 65  er {}.  db close
60d0: 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f  .} {}..faultsim_
60e0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
60f0: 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  en.do_execsql_te
6100: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 32 20  st pager1.4.6.2 
6110: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6120: 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20 7b  t1 }           {
6130: 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20  1 t1.1}.do_test 
6140: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
6150: 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73  .6.3 { file exis
6160: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  ts $::mj_filenam
6170: 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73  e } {1}.do_execs
6180: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
6190: 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41 43 48 20  .6.4 {.  ATTACH 
61a0: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74 77  'test.db2' AS tw
61b0: 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  o;.  SELECT * FR
61c0: 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31  OM t2;.} {1 t2.1
61d0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
61e0: 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65 20 65 78  .4.6.5 { file ex
61f0: 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  ists $::mj_filen
6200: 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61 75 6c 74  ame } {0}..fault
6210: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
6220: 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65 0a  reopen.db close.
6230: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
6240: 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20 3a 3a 6d  .6.8 {.  set ::m
6250: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24 3a 3a 6d  j_filename1 $::m
6260: 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20 74 76 20  j_filename.  tv 
6270: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20  filter xDelete. 
6280: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
6290: 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b  .db2.  execsql {
62a0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
62b0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
62c0: 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74  E;.    ATTACH 't
62d0: 65 73 74 2e 64 62 33 27 20 41 53 20 74 68 72 65  est.db3' AS thre
62e0: 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  e;.    CREATE TA
62f0: 42 4c 45 20 74 68 72 65 65 2e 74 33 28 61 2c 20  BLE three.t3(a, 
6300: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
6310: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c  NTO t3 VALUES(1,
6320: 20 27 74 33 2e 31 27 29 3b 0a 20 20 20 20 42 45   't3.1');.    BE
6330: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
6340: 45 20 74 32 20 53 45 54 20 62 20 3d 20 27 74 32  E t2 SET b = 't2
6350: 2e 33 27 3b 0a 20 20 20 20 20 20 55 50 44 41 54  .3';.      UPDAT
6360: 45 20 74 33 20 53 45 54 20 62 20 3d 20 27 74 33  E t3 SET b = 't3
6370: 2e 33 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  .3';.    COMMIT;
6380: 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a  .  }.  expr {$::
6390: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 21 3d 20  mj_filename1 != 
63a0: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 7d 0a  $::mj_filename}.
63b0: 7d 20 7b 31 7d 0a 66 61 75 6c 74 73 69 6d 5f 72  } {1}.faultsim_r
63c0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
63d0: 6e 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 0a  n.tv filter {}..
63e0: 23 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  # The file-syste
63f0: 6d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 3a 0a  m now contains:.
6400: 23 0a 23 20 20 20 2a 20 74 68 72 65 65 20 64 61  #.#   * three da
6410: 74 61 62 61 73 65 73 0a 23 20 20 20 2a 20 74 68  tabases.#   * th
6420: 72 65 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ree hot-journal 
6430: 66 69 6c 65 73 0a 23 20 20 20 2a 20 74 77 6f 20  files.#   * two 
6440: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
6450: 69 6c 65 73 2e 0a 23 0a 23 20 54 68 65 20 68 6f  iles..#.# The ho
6460: 74 2d 6a 6f 75 72 6e 61 6c 73 20 61 73 73 6f 63  t-journals assoc
6470: 69 61 74 65 64 20 77 69 74 68 20 74 65 73 74 2e  iated with test.
6480: 64 62 32 20 61 6e 64 20 74 65 73 74 2e 64 62 33  db2 and test.db3
6490: 20 70 6f 69 6e 74 20 74 6f 0a 23 20 6d 61 73 74   point to.# mast
64a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a  er journal $::mj
64b0: 5f 66 69 6c 65 6e 61 6d 65 2e 20 54 68 65 20 68  _filename. The h
64c0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
64d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
64e0: 23 20 74 65 73 74 2e 64 62 20 70 6f 69 6e 74 73  # test.db points
64f0: 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
6500: 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  al $::mj_filenam
6510: 65 31 2e 20 53 6f 20 72 65 61 64 69 6e 67 20 66  e1. So reading f
6520: 72 6f 6d 0a 23 20 74 65 73 74 2e 64 62 20 73 68  rom.# test.db sh
6530: 6f 75 6c 64 20 64 65 6c 65 74 65 20 24 3a 3a 6d  ould delete $::m
6540: 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64  j_filename1..#.d
6550: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
6560: 36 2e 39 20 7b 0a 20 20 6c 73 6f 72 74 20 5b 67  6.9 {.  lsort [g
6570: 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d 0a 7d 20  lob test.db*].} 
6580: 5b 6c 73 6f 72 74 20 5b 6c 69 73 74 20 20 20 20  [lsort [list    
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e         \.  test.
65c0: 64 62 20 74 65 73 74 2e 64 62 32 20 74 65 73 74  db test.db2 test
65d0: 2e 64 62 33 20 20 20 20 20 20 20 20 20 20 20 20  .db3            
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 2d 6a 6f    \.  test.db-jo
6600: 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a  urnal test.db2-j
6610: 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 33 2d  ournal test.db3-
6620: 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20 5c 0a 20  journal      \. 
6630: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d   [file tail $::m
6640: 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b 66 69 6c  j_filename] [fil
6650: 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c  e tail $::mj_fil
6660: 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23 20 54 68  ename1].]]..# Th
6670: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
6680: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31   $::mj_filename1
6690: 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
66a0: 72 73 20 74 6f 20 74 65 73 74 2e 64 62 20 61 6e  rs to test.db an
66b0: 64 20 0a 23 20 74 65 73 74 2e 64 62 32 2e 20 48  d .# test.db2. H
66c0: 6f 77 65 76 65 72 20 74 68 65 20 68 6f 74 2d 6a  owever the hot-j
66d0: 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61 74 65  ournal associate
66e0: 64 20 77 69 74 68 20 74 65 73 74 2e 64 62 32 20  d with test.db2 
66f0: 70 6f 69 6e 74 73 20 74 6f 0a 23 20 61 20 64 69  points to.# a di
6700: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 2d 6a  fferent master-j
6710: 6f 75 72 6e 61 6c 2e 20 54 68 65 72 65 66 6f 72  ournal. Therefor
6720: 65 2c 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  e, reading from 
6730: 74 65 73 74 2e 64 62 20 6f 6e 6c 79 20 73 68 6f  test.db only sho
6740: 75 6c 64 0a 23 20 62 65 20 65 6e 6f 75 67 68 20  uld.# be enough 
6750: 74 6f 20 63 61 75 73 65 20 53 51 4c 69 74 65 20  to cause SQLite 
6760: 74 6f 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f  to delete $::mj_
6770: 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f  filename1..#.do_
6780: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
6790: 65 72 31 2e 34 2e 36 2e 31 30 20 7b 20 66 69 6c  er1.4.6.10 { fil
67a0: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
67b0: 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64  ilename  } {1}.d
67c0: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
67d0: 61 67 65 72 31 2e 34 2e 36 2e 31 31 20 7b 20 66  ager1.4.6.11 { f
67e0: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
67f0: 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 31 7d  _filename1 } {1}
6800: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6810: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b   pager1.4.6.12 {
6820: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6830: 31 20 7d 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f  1 } {1 t1.1}.do_
6840: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
6850: 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c  er1.4.6.13 { fil
6860: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
6870: 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64  ilename  } {1}.d
6880: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
6890: 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b 20 66  ager1.4.6.14 { f
68a0: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
68b0: 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 30 7d  _filename1 } {0}
68c0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
68d0: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20  t pager1.4.6.12 
68e0: 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74  {.  ATTACH 'test
68f0: 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20  .db2' AS two;.  
6900: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
6910: 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f  ;.} {1 t2.1}.do_
6920: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
6930: 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c  er1.4.6.13 { fil
6940: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
6950: 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 31 7d 0a 64  ilename }  {1}.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 34 20 7b 0a 20  ager1.4.6.14 {. 
6980: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
6990: 33 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20 53  3' AS three;.  S
69a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
69b0: 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a 64 6f 5f 74  .} {1 t3.1}.do_t
69c0: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
69d0: 72 31 2e 34 2e 36 2e 31 35 20 7b 20 66 69 6c 65  r1.4.6.15 { file
69e0: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
69f0: 6c 65 6e 61 6d 65 20 7d 20 20 7b 30 7d 0a 0a 64  lename }  {0}..d
6a00: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
6a10: 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64  e..testvfs tv -d
6a20: 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74  efault 1.tv sect
6a30: 6f 72 73 69 7a 65 20 35 31 32 0a 74 76 20 73 63  orsize 512.tv sc
6a40: 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75  ript copy_on_jou
6a50: 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66  rnal_delete.tv f
6a60: 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70 72  ilter xDelete.pr
6a70: 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e  oc copy_on_journ
6a80: 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f  al_delete {metho
6a90: 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d  d filename args}
6aa0: 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67   {.  if {[string
6ab0: 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20   match *journal 
6ac0: 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c  $filename]} faul
6ad0: 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 72 65 74  tsim_save .  ret
6ae0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a  urn SQLITE_OK.}.
6af0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
6b00: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78  and_reopen.do_ex
6b10: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
6b20: 31 2e 34 2e 37 2e 31 20 7b 0a 20 20 50 52 41 47  1.4.7.1 {.  PRAG
6b30: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
6b40: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 43 52 45 41  = DELETE;.  CREA
6b50: 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52  TE TABLE t1(x PR
6b60: 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
6b70: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
6b80: 20 4f 4e 20 74 31 28 79 29 3b 0a 20 20 49 4e 53   ON t1(y);.  INS
6b90: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6ba0: 45 53 28 27 49 27 2c 20 20 20 27 6f 6e 65 27 29  ES('I',   'one')
6bb0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
6bc0: 74 31 20 56 41 4c 55 45 53 28 27 49 49 27 2c 20  t1 VALUES('II', 
6bd0: 20 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45   'four');.  INSE
6be0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6bf0: 53 28 27 49 49 49 27 2c 20 27 6e 69 6e 65 27 29  S('III', 'nine')
6c00: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49  ;.  BEGIN;.    I
6c10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6c20: 4c 55 45 53 28 27 49 56 27 2c 20 27 73 69 78 74  LUES('IV', 'sixt
6c30: 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  een');.    INSER
6c40: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6c50: 28 27 56 27 20 2c 20 27 74 77 65 6e 74 79 66 69  ('V' , 'twentyfi
6c60: 76 65 27 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a  ve');.  COMMIT;.
6c70: 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20 66 69  } {delete}.tv fi
6c80: 6c 74 65 72 20 7b 7d 0a 64 62 20 63 6c 6f 73 65  lter {}.db close
6c90: 0a 74 76 20 64 65 6c 65 74 65 20 0a 64 6f 5f 74  .tv delete .do_t
6ca0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e 32  est pager1.4.7.2
6cb0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
6cc0: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
6cd0: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
6ce0: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
6cf0: 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69  b-journal -permi
6d00: 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d 2d 2d  ssions r--------
6d10: 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20  }.  catch {file 
6d20: 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e  attributes test.
6d30: 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64  db-journal -read
6d40: 6f 6e 6c 79 20 31 7d 0a 20 20 63 61 74 63 68 73  only 1}.  catchs
6d50: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
6d60: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 75 6e  OM t1 }.} {1 {un
6d70: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
6d80: 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 64 6f 5f  abase file}}.do_
6d90: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e  test pager1.4.7.
6da0: 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  3 {.  db close. 
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 70 65 72 6d 69 73 73  journal -permiss
6de0: 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d 0a  ions rw-rw-rw-}.
6df0: 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74    catch {file at
6e00: 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62  tributes test.db
6e10: 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64 6f 6e  -journal -readon
6e20: 6c 79 20 30 7d 0a 20 20 64 65 6c 65 74 65 5f 66  ly 0}.  delete_f
6e30: 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ile test.db-jour
6e40: 6e 61 6c 0a 20 20 66 69 6c 65 20 65 78 69 73 74  nal.  file exist
6e50: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
6e60: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  l.} {0}.do_test 
6e70: 70 61 67 65 72 31 2e 34 2e 38 2e 31 20 7b 0a 20  pager1.4.8.1 {. 
6e80: 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74   catch {file att
6e90: 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62 20  ributes test.db 
6ea0: 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72 2d 2d  -permissions r--
6eb0: 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63 68 20  ------}.  catch 
6ec0: 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73  {file attributes
6ed0: 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e   test.db -readon
6ee0: 6c 79 20 31 7d 0a 20 20 73 71 6c 69 74 65 33 20  ly 1}.  sqlite3 
6ef0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20  db test.db.  db 
6f00: 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
6f10: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71 6c 69  FROM t1 }.  sqli
6f20: 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20  te3_db_readonly 
6f30: 64 62 20 6d 61 69 6e 0a 7d 20 7b 31 7d 0a 64 6f  db main.} {1}.do
6f40: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 38  _test pager1.4.8
6f50: 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 64  .2 {.  sqlite3_d
6f60: 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 78 79  b_readonly db xy
6f70: 7a 0a 7d 20 7b 2d 31 7d 0a 64 6f 5f 74 65 73 74  z.} {-1}.do_test
6f80: 20 70 61 67 65 72 31 2e 34 2e 38 2e 33 20 7b 0a   pager1.4.8.3 {.
6f90: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74    db close.  cat
6fa0: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6fb0: 74 65 73 20 74 65 73 74 2e 64 62 20 2d 72 65 61  tes test.db -rea
6fc0: 64 6f 6e 6c 79 20 30 7d 0a 20 20 63 61 74 63 68  donly 0}.  catch
6fd0: 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65   {file attribute
6fe0: 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72 6d 69  s test.db -permi
6ff0: 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d  ssions rw-rw-rw-
7000: 7d 20 6d 73 67 0a 20 20 73 71 6c 69 74 65 33 20  } msg.  sqlite3 
7010: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20  db test.db.  db 
7020: 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
7030: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71 6c 69  FROM t1 }.  sqli
7040: 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20  te3_db_readonly 
7050: 64 62 20 6d 61 69 6e 0a 7d 20 7b 30 7d 0a 0a 23  db main.} {0}..#
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
70b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
70c0: 64 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 2d  deal with multi-
70d0: 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a 23 0a  file commits..#.
70e0: 23 20 70 61 67 65 72 31 2d 35 2e 31 2e 2a 3a 20  # pager1-5.1.*: 
70f0: 54 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  The case where a
7100: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 61 6e 6e   multi-file cann
7110: 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ot be committed 
7120: 62 65 63 61 75 73 65 0a 23 20 20 20 20 20 20 20  because.#       
7130: 20 20 20 20 20 20 20 20 61 6e 6f 74 68 65 72 20          another 
7140: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
7150: 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  lding a SHARED l
7160: 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ock on one of th
7170: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
7180: 20 20 66 69 6c 65 73 2e 20 41 66 74 65 72 20 74    files. After t
7190: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69  he SHARED lock i
71a0: 73 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 20 43  s removed, the C
71b0: 4f 4d 4d 49 54 20 73 75 63 63 65 65 64 73 2e 0a  OMMIT succeeds..
71c0: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 32 2e 2a  #.# pager1-5.2.*
71d0: 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  : Multi-file com
71e0: 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e 61  mits with journa
71f0: 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23  l_mode=memory..#
7200: 0a 23 20 70 61 67 65 72 31 2d 35 2e 33 2e 2a 3a  .# pager1-5.3.*:
7210: 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   Multi-file comm
7220: 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  its with journal
7230: 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a  _mode=memory..#.
7240: 23 20 70 61 67 65 72 31 2d 35 2e 34 2e 2a 3a 20  # pager1-5.4.*: 
7250: 43 68 65 63 6b 20 74 68 61 74 20 77 69 74 68 20  Check that with 
7260: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f 72 6d  synchronous=norm
7270: 61 6c 2c 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  al, the master-j
7280: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20  ournal file.#   
7290: 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
72a0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 61 20 6a   is added to a j
72b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
72c0: 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68  diately after th
72d0: 65 20 6c 61 73 74 0a 23 20 20 20 20 20 20 20 20  e last.#        
72e0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 72         journal r
72f0: 65 63 6f 72 64 2e 20 42 75 74 20 77 69 74 68 20  ecord. But with 
7300: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c  synchronous=full
7310: 2c 20 65 78 74 72 61 20 75 6e 75 73 65 64 20 73  , extra unused s
7320: 70 61 63 65 0a 23 20 20 20 20 20 20 20 20 20 20  pace.#          
7330: 20 20 20 20 20 69 73 20 61 6c 6c 6f 63 61 74 65       is allocate
7340: 64 20 62 65 74 77 65 65 6e 20 74 68 65 20 6c 61  d between the la
7350: 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  st journal recor
7360: 64 20 61 6e 64 20 74 68 65 20 0a 23 20 20 20 20  d and the .#    
7370: 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 74 65             maste
7380: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r-journal file n
7390: 61 6d 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ame so that the 
73a0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
73b0: 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ile.#           
73c0: 20 20 20 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f      name does no
73d0: 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 73 61 6d  t lie on the sam
73e0: 65 20 73 65 63 74 6f 72 20 61 73 20 74 68 65 20  e sector as the 
73f0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  last journal fil
7400: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
7410: 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23 20 70 61    record..#.# pa
7420: 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43 68 65 63  ger1-5.5.*: Chec
7430: 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75 72 6e 61  k that in journa
7440: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 6d  l_mode=PERSIST m
7450: 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ode, a journal f
7460: 69 6c 65 20 69 73 0a 23 20 20 20 20 20 20 20 20  ile is.#        
7470: 20 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 64         truncated
7480: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 77   to zero bytes w
7490: 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  hen a multi-file
74a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
74b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
74c0: 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e 73 74   committed (inst
74d0: 65 61 64 20 6f 66 20 74 68 65 20 66 69 72 73 74  ead of the first
74e0: 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
74f0: 20 62 65 69 6e 67 20 7a 65 72 6f 65 64 29 2e 0a   being zeroed)..
7500: 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  #.#.do_test page
7510: 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20 66 61 75  r1-5.1.1 {.  fau
7520: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
7530: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
7540: 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27  l {.    ATTACH '
7550: 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78  test.db2' AS aux
7560: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7570: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
7580: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
7590: 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20  x.t2(a, b);.    
75a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
75b0: 41 4c 55 45 53 28 31 37 2c 20 27 4c 65 6e 69 6e  ALUES(17, 'Lenin
75c0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
75d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 32  NTO t1 VALUES(22
75e0: 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a 20 20 20  , 'Stalin');.   
75f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
7600: 56 41 4c 55 45 53 28 35 33 2c 20 27 4b 68 72 75  VALUES(53, 'Khru
7610: 73 68 63 68 65 76 27 29 3b 0a 20 20 7d 0a 7d 20  shchev');.  }.} 
7620: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
7630: 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  1-5.1.2 {.  exec
7640: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
7650: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
7660: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 34 2c  TO t1 VALUES(64,
7670: 20 27 42 72 65 7a 68 6e 65 76 27 29 3b 0a 20 20   'Brezhnev');.  
7680: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7690: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
76a0: 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   t1;.  }.  sqlit
76b0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
76c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
76d0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c  BEGIN;.      SEL
76e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
76f0: 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74   } db2.} {}.do_t
7700: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 33  est pager1-5.1.3
7710: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f   {.  catchsql CO
7720: 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61 74 61 62  MMIT.} {1 {datab
7730: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
7740: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
7750: 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.4 {.  execsql
7760: 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20 20 65 78   COMMIT db2.  ex
7770: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 65  ecsql COMMIT.  e
7780: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
7790: 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a  * FROM t2 } db2.
77a0: 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32 32 20 53  } {17 Lenin 22 S
77b0: 74 61 6c 69 6e 20 35 33 20 4b 68 72 75 73 68 63  talin 53 Khrushc
77c0: 68 65 76 20 36 34 20 42 72 65 7a 68 6e 65 76 7d  hev 64 Brezhnev}
77d0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
77e0: 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32 20 63 6c  5.1.5 {.  db2 cl
77f0: 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  ose.} {}..do_tes
7800: 74 20 70 61 67 65 72 31 2d 35 2e 32 2e 31 20 7b  t pager1-5.2.1 {
7810: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7820: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
7830: 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20  mode = memory;. 
7840: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
7850: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
7860: 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f  ALUES(84, 'Andro
7870: 70 6f 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  pov');.      INS
7880: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
7890: 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76  ES(84, 'Andropov
78a0: 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ');.    COMMIT;.
78b0: 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d 0a 64    }.} {memory}.d
78c0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
78d0: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
78e0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
78f0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 3b  rnal_mode = off;
7900: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7910: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7920: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
7930: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20 20  bachev');.      
7940: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
7950: 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61  ALUES(85, 'Gorba
7960: 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d  chev');.    COMM
7970: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66 7d 0a  IT;.  }.} {off}.
7980: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7990: 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f  5.4.1 {.  db clo
79a0: 73 65 0a 20 20 74 65 73 74 76 66 73 20 74 76 0a  se.  testvfs tv.
79b0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
79c0: 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20 65  t.db -vfs tv.  e
79d0: 78 65 63 73 71 6c 20 7b 20 41 54 54 41 43 48 20  xecsql { ATTACH 
79e0: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75  'test.db2' AS au
79f0: 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c 74 65 72  x }..  tv filter
7a00: 20 78 44 65 6c 65 74 65 0a 20 20 74 76 20 73 63   xDelete.  tv sc
7a10: 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c  ript max_journal
7a20: 5f 73 69 7a 65 0a 20 20 74 76 20 73 65 63 74 6f  _size.  tv secto
7a30: 72 73 69 7a 65 20 35 31 32 0a 20 20 73 65 74 20  rsize 512.  set 
7a40: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a  ::max_journal 0.
7a50: 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f 75 72 6e    proc max_journ
7a60: 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68 6f 64 20  al_size {method 
7a70: 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20  args} {.    set 
7a80: 73 7a 20 30 0a 20 20 20 20 63 61 74 63 68 20 7b  sz 0.    catch {
7a90: 20 73 65 74 20 73 7a 20 5b 66 69 6c 65 20 73 69   set sz [file si
7aa0: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ze test.db-journ
7ab0: 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20 7b 24 73  al] }.    if {$s
7ac0: 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e  z > $::max_journ
7ad0: 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20  al} {.      set 
7ae0: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 24 73  ::max_journal $s
7af0: 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  z.    }.    retu
7b00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d  rn SQLITE_OK.  }
7b10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7b20: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
7b30: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
7b40: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
7b50: 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a  onous = NORMAL;.
7b60: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
7b70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
7b80: 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62  VALUES(85, 'Gorb
7b90: 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20 20 49  achev');.      I
7ba0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
7bb0: 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63  LUES(85, 'Gorbac
7bc0: 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  hev');.    COMMI
7bd0: 54 3b 0a 20 20 7d 0a 0a 20 20 23 20 54 68 65 20  T;.  }..  # The 
7be0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
7bf0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 77 3a  nal file is now:
7c00: 0a 20 20 23 20 0a 20 20 23 20 20 20 31 29 20 35  .  # .  #   1) 5
7c10: 31 32 20 62 79 74 65 20 68 65 61 64 65 72 20 2b  12 byte header +
7c20: 0a 20 20 23 20 20 20 32 29 20 32 20 2a 20 28 31  .  #   2) 2 * (1
7c30: 30 32 34 2b 38 29 20 62 79 74 65 20 72 65 63 6f  024+8) byte reco
7c40: 72 64 73 20 2b 0a 20 20 23 20 20 20 33 29 20 32  rds +.  #   3) 2
7c50: 30 2b 4e 20 62 79 74 65 73 20 6f 66 20 6d 61 73  0+N bytes of mas
7c60: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
7c70: 74 65 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ter, where N is 
7c80: 74 68 65 20 73 69 7a 65 20 6f 66 20 0a 20 20 23  the size of .  #
7c90: 20 20 20 20 20 20 74 68 65 20 6d 61 73 74 65 72        the master
7ca0: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 65 6e  -journal name en
7cb0: 63 6f 64 65 64 20 61 73 20 75 74 66 2d 38 20 77  coded as utf-8 w
7cc0: 69 74 68 20 6e 6f 20 6e 75 6c 20 74 65 72 6d 2e  ith no nul term.
7cd0: 0a 20 20 23 0a 20 20 73 65 74 20 6d 6a 5f 70 6f  .  #.  set mj_po
7ce0: 69 6e 74 65 72 20 5b 65 78 70 72 20 7b 0a 20 20  inter [expr {.  
7cf0: 20 20 32 30 20 2b 20 5b 73 74 72 69 6e 67 20 6c    20 + [string l
7d00: 65 6e 67 74 68 20 5b 67 65 74 5f 70 77 64 5d 5d  ength [get_pwd]]
7d10: 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   + [string lengt
7d20: 68 20 22 2f 74 65 73 74 2e 64 62 2d 6d 6a 58 58  h "/test.db-mjXX
7d30: 58 58 58 58 39 58 58 22 5d 0a 20 20 7d 5d 0a 20  XXXX9XX"].  }]. 
7d40: 20 65 78 70 72 20 7b 24 3a 3a 6d 61 78 5f 6a 6f   expr {$::max_jo
7d50: 75 72 6e 61 6c 3d 3d 28 35 31 32 2b 32 2a 28 31  urnal==(512+2*(1
7d60: 30 32 34 2b 38 29 2b 24 6d 6a 5f 70 6f 69 6e 74  024+8)+$mj_point
7d70: 65 72 29 7d 0a 7d 20 31 0a 64 6f 5f 74 65 73 74  er)}.} 1.do_test
7d80: 20 70 61 67 65 72 31 2d 35 2e 34 2e 32 20 7b 0a   pager1-5.4.2 {.
7d90: 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72    set ::max_jour
7da0: 6e 61 6c 20 30 0a 20 20 65 78 65 63 73 71 6c 20  nal 0.  execsql 
7db0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e  {.    PRAGMA syn
7dc0: 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b  chronous = full;
7dd0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7de0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
7df0: 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69   WHERE b = 'Leni
7e00: 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  n';.      DELETE
7e10: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 62   FROM t2 WHERE b
7e20: 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20   = 'Lenin';.    
7e30: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 23  COMMIT;.  }..  #
7e40: 20 49 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d   In synchronous=
7e50: 66 75 6c 6c 20 6d 6f 64 65 2c 20 74 68 65 20 6d  full mode, the m
7e60: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
7e70: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 77 72 69  inter is not wri
7e80: 74 74 65 6e 0a 20 20 23 20 64 69 72 65 63 74 6c  tten.  # directl
7e90: 79 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  y after the last
7ea0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a   record in the j
7eb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 73  ournal file. Ins
7ec0: 74 65 61 64 2c 20 69 74 20 69 73 0a 20 20 23 20  tead, it is.  # 
7ed0: 77 72 69 74 74 65 6e 20 73 74 61 72 74 69 6e 67  written starting
7ee0: 20 61 74 20 74 68 65 20 6e 65 78 74 20 28 69 6e   at the next (in
7ef0: 20 74 68 69 73 20 63 61 73 65 20 35 31 32 20 62   this case 512 b
7f00: 79 74 65 29 20 73 65 63 74 6f 72 20 62 6f 75 6e  yte) sector boun
7f10: 64 61 72 79 2e 0a 20 20 23 0a 20 20 73 65 74 20  dary..  #.  set 
7f20: 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72  mj_pointer [expr
7f30: 20 7b 0a 20 20 20 20 32 30 20 2b 20 5b 73 74 72   {.    20 + [str
7f40: 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67 65 74 5f  ing length [get_
7f50: 70 77 64 5d 5d 20 2b 20 5b 73 74 72 69 6e 67 20  pwd]] + [string 
7f60: 6c 65 6e 67 74 68 20 22 2f 74 65 73 74 2e 64 62  length "/test.db
7f70: 2d 6d 6a 58 58 58 58 58 58 39 58 58 22 5d 0a 20  -mjXXXXXX9XX"]. 
7f80: 20 7d 5d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d   }].  expr {$::m
7f90: 61 78 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 28 28 35  ax_journal==(((5
7fa0: 31 32 2b 32 2a 28 31 30 32 34 2b 38 29 2b 35 31  12+2*(1024+8)+51
7fb0: 31 29 2f 35 31 32 29 2a 35 31 32 20 2b 20 24 6d  1)/512)*512 + $m
7fc0: 6a 5f 70 6f 69 6e 74 65 72 29 7d 0a 7d 20 31 0a  j_pointer)}.} 1.
7fd0: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
7fe0: 74 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  te..do_test page
7ff0: 72 31 2d 35 2e 35 2e 31 20 7b 0a 20 20 73 71 6c  r1-5.5.1 {.  sql
8000: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
8010: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
8020: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
8030: 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50  2' AS aux;.    P
8040: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8050: 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
8060: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
8070: 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  3(a, b);.    INS
8080: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
8090: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
80a0: 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
80b0: 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
80c0: 20 20 20 55 50 44 41 54 45 20 74 33 20 53 45 54     UPDATE t3 SET
80d0: 20 62 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28   b = randomblob(
80e0: 31 35 30 30 29 3b 0a 20 20 7d 0a 20 20 65 78 70  1500);.  }.  exp
80f0: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
8100: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20  t.db-journal] > 
8110: 31 35 30 30 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  15000.} {1}.do_t
8120: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 32  est pager1-5.5.2
8130: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
8140: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
8150: 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a 20 20  onous = full;.  
8160: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44    BEGIN;.      D
8170: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
8180: 45 52 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27  ERE b = 'Stalin'
8190: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
81a0: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20 3d  ROM t2 WHERE b =
81b0: 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 43   'Stalin';.    C
81c0: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 66 69 6c  OMMIT;.  }.  fil
81d0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a  e size test.db-j
81e0: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23  ournal.} {0}...#
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
8240: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
8250: 77 6f 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d  work with "PRAGM
8260: 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  A max_page_count
8270: 22 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ".#.do_test page
8280: 72 31 2d 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74  r1-6.1 {.  fault
8290: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
82a0: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
82b0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
82c0: 6f 5f 76 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b  o_vacuum = none;
82d0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f  .    PRAGMA max_
82e0: 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b  page_count = 10;
82f0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8300: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t2(a, b);.    
8310: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
8320: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
8330: 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62 29  E TABLE t4(a, b)
8340: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8350: 4c 45 20 74 35 28 61 2c 20 62 29 3b 0a 20 20 20  LE t5(a, b);.   
8360: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36   CREATE TABLE t6
8370: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
8380: 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c 20 62  TE TABLE t7(a, b
8390: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
83a0: 42 4c 45 20 74 38 28 61 2c 20 62 29 3b 0a 20 20  BLE t8(a, b);.  
83b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
83c0: 39 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  9(a, b);.    CRE
83d0: 41 54 45 20 54 41 42 4c 45 20 74 31 30 28 61 2c  ATE TABLE t10(a,
83e0: 20 62 29 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a   b);.  }.} {10}.
83f0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
8400: 20 70 61 67 65 72 31 2d 36 2e 32 20 7b 0a 20 20   pager1-6.2 {.  
8410: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 31  CREATE TABLE t11
8420: 28 61 2c 20 62 29 0a 7d 20 7b 31 20 7b 64 61 74  (a, b).} {1 {dat
8430: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
8440: 20 66 75 6c 6c 7d 7d 0a 64 6f 5f 65 78 65 63 73   full}}.do_execs
8450: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  ql_test pager1-6
8460: 2e 34 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f  .4 { PRAGMA max_
8470: 70 61 67 65 5f 63 6f 75 6e 74 20 20 20 20 20 20  page_count      
8480: 7d 20 7b 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71  } {10}.do_execsq
8490: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
84a0: 35 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70  5 { PRAGMA max_p
84b0: 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 35 20 7d  age_count = 15 }
84c0: 20 7b 31 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {15}.do_execsql
84d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 36  _test pager1-6.6
84e0: 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
84f0: 74 31 31 28 61 2c 20 62 29 20 20 20 20 20 7d 20  t11(a, b)     } 
8500: 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  {}.do_execsql_te
8510: 73 74 20 70 61 67 65 72 31 2d 36 2e 37 20 7b 0a  st pager1-6.7 {.
8520: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
8530: 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c  ERT INTO t11 VAL
8540: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 50  UES(1, 2);.    P
8550: 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63  RAGMA max_page_c
8560: 6f 75 6e 74 20 3d 20 31 33 3b 0a 7d 20 7b 31 33  ount = 13;.} {13
8570: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
8580: 74 20 70 61 67 65 72 31 2d 36 2e 38 20 7b 0a 20  t pager1-6.8 {. 
8590: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
85a0: 31 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  11 VALUES(3, 4);
85b0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f  .    PRAGMA max_
85c0: 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b  page_count = 10;
85d0: 0a 7d 20 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73  .} {11}.do_execs
85e0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  ql_test pager1-6
85f0: 2e 39 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d  .9 { COMMIT } {}
8600: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
8610: 74 20 70 61 67 65 72 31 2d 36 2e 31 30 20 7b 20  t pager1-6.10 { 
8620: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8630: 63 6f 75 6e 74 20 3d 20 31 30 20 7d 20 7b 31 31  count = 10 } {11
8640: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
8650: 74 20 70 61 67 65 72 31 2d 36 2e 31 31 20 7b 20  t pager1-6.11 { 
8660: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
8670: 31 20 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20  1 }          {1 
8680: 32 20 33 20 34 7d 0a 64 6f 5f 65 78 65 63 73 71  2 3 4}.do_execsq
8690: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
86a0: 31 32 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f  12 { PRAGMA max_
86b0: 70 61 67 65 5f 63 6f 75 6e 74 20 7d 20 20 20 20  page_count }    
86c0: 20 20 7b 31 31 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d    {11}...#------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8710: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
8720: 69 6e 67 20 74 65 73 74 73 20 77 6f 72 6b 20 77  ing tests work w
8730: 69 74 68 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  ith "PRAGMA jour
8740: 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54  nal_mode=TRUNCAT
8750: 45 22 20 61 6e 64 0a 23 20 22 50 52 41 47 4d 41  E" and.# "PRAGMA
8760: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
8770: 43 4c 55 53 49 56 45 22 2e 0a 23 0a 23 20 45 61  CLUSIVE"..#.# Ea
8780: 63 68 20 74 65 73 74 20 69 73 20 73 70 65 63 69  ch test is speci
8790: 66 69 65 64 20 77 69 74 68 20 35 20 76 61 72 69  fied with 5 vari
87a0: 61 62 6c 65 73 2e 20 41 73 20 66 6f 6c 6c 6f 77  ables. As follow
87b0: 73 3a 0a 23 0a 23 20 20 20 24 74 6e 3a 20 20 54  s:.#.#   $tn:  T
87c0: 65 73 74 20 4e 75 6d 62 65 72 2e 20 55 73 65 64  est Number. Used
87d0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
87e0: 5b 64 6f 5f 74 65 73 74 5d 20 74 65 73 74 20 6e  [do_test] test n
87f0: 61 6d 65 73 2e 0a 23 20 20 20 24 73 71 6c 3a 20  ames..#   $sql: 
8800: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 2e 0a  SQL to execute..
8810: 23 20 20 20 24 72 65 73 3a 20 45 78 70 65 63 74  #   $res: Expect
8820: 65 64 20 72 65 73 75 6c 74 20 6f 66 20 65 78 65  ed result of exe
8830: 63 75 74 69 6e 67 20 24 73 71 6c 2e 0a 23 20 20  cuting $sql..#  
8840: 20 24 6a 73 3a 20 20 54 68 65 20 65 78 70 65 63   $js:  The expec
8850: 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ted size of the 
8860: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 6e  journal file, in
8870: 20 62 79 74 65 73 2c 20 61 66 74 65 72 20 65 78   bytes, after ex
8880: 65 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20  ecuting.#       
8890: 20 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74    the SQL script
88a0: 2e 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20 6a  . Or -1 if the j
88b0: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 65 78  ournal is not ex
88c0: 70 65 63 74 65 64 20 74 6f 20 65 78 69 73 74 2e  pected to exist.
88d0: 0a 23 20 20 20 24 77 73 3a 20 20 54 68 65 20 65  .#   $ws:  The e
88e0: 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20  xpected size of 
88f0: 74 68 65 20 57 41 4c 20 66 69 6c 65 2c 20 69 6e  the WAL file, in
8900: 20 62 79 74 65 73 2c 20 61 66 74 65 72 20 65 78   bytes, after ex
8910: 65 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20  ecuting.#       
8920: 20 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74    the SQL script
8930: 2e 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20 57  . Or -1 if the W
8940: 41 4c 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74  AL is not expect
8950: 65 64 20 74 6f 20 65 78 69 73 74 2e 0a 23 0a 69  ed to exist..#.i
8960: 66 20 7b 24 3a 3a 73 71 6c 69 74 65 5f 6f 70 74  f {$::sqlite_opt
8970: 69 6f 6e 73 28 77 61 6c 29 20 26 26 20 5b 77 61  ions(wal) && [wa
8980: 6c 5f 69 73 5f 6f 6b 5d 7d 20 7b 0a 20 20 66 61  l_is_ok]} {.  fa
8990: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
89a0: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
89b0: 63 68 20 7b 74 6e 20 73 71 6c 20 72 65 73 20 6a  ch {tn sql res j
89c0: 73 20 77 73 7d 20 5b 73 75 62 73 74 20 7b 0a 20  s ws} [subst {. 
89d0: 20 0a 20 20 20 20 31 20 20 7b 0a 20 20 20 20 20   .    1  {.     
89e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
89f0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 50 52  (a, b);.      PR
8a00: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
8a10: 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47  =OFF;.      PRAG
8a20: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  MA synchronous=N
8a30: 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41  ORMAL;.      PRA
8a40: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 31 30  GMA page_size=10
8a50: 32 34 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  24;.      PRAGMA
8a60: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
8a70: 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 50  CLUSIVE;.      P
8a80: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8a90: 64 65 3d 54 52 55 4e 43 41 54 45 3b 0a 20 20 20  de=TRUNCATE;.   
8aa0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8ab0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
8ac0: 20 20 20 20 7d 20 7b 65 78 63 6c 75 73 69 76 65      } {exclusive
8ad0: 20 74 72 75 6e 63 61 74 65 7d 20 30 20 2d 31 0a   truncate} 0 -1.
8ae0: 20 20 0a 20 20 20 20 32 20 20 7b 0a 20 20 20 20    .    2  {.    
8af0: 20 20 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54    BEGIN IMMEDIAT
8b00: 45 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  E;.        SELEC
8b10: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
8b20: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
8b30: 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20   {1 2} 0 -1.  . 
8b40: 20 20 20 33 20 20 7b 0a 20 20 20 20 20 20 42 45     3  {.      BE
8b50: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c  GIN;.        SEL
8b60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
8b70: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20       COMMIT;.   
8b80: 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20   } {1 2} 0 -1.  
8b90: 0a 20 20 20 20 34 20 20 7b 20 50 52 41 47 4d 41  .    4  { PRAGMA
8ba0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
8bb0: 57 41 4c 20 7d 20 20 20 20 77 61 6c 20 20 20 20  WAL }    wal    
8bc0: 20 20 20 2d 31 20 2d 31 0a 20 20 20 20 35 20 20     -1 -1.    5  
8bd0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
8be0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 20   VALUES(3, 4) } 
8bf0: 20 7b 7d 20 20 20 20 20 20 20 20 2d 31 20 5b 77   {}        -1 [w
8c00: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31  al_file_size 1 1
8c10: 30 32 34 5d 0a 20 20 20 20 36 20 20 7b 20 50 52  024].    6  { PR
8c20: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
8c30: 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20 65 78 63  e = NORMAL } exc
8c40: 6c 75 73 69 76 65 20 2d 31 20 5b 77 61 6c 5f 66  lusive -1 [wal_f
8c50: 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d  ile_size 1 1024]
8c60: 0a 20 20 20 20 37 20 20 7b 20 49 4e 53 45 52 54  .    7  { INSERT
8c70: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8c80: 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20 20  5, 6); } {}     
8c90: 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f     -1 [wal_file_
8ca0: 73 69 7a 65 20 32 20 31 30 32 34 5d 0a 20 20 0a  size 2 1024].  .
8cb0: 20 20 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20      8  { PRAGMA 
8cc0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54  journal_mode = T
8cd0: 52 55 4e 43 41 54 45 20 7d 20 74 72 75 6e 63 61  RUNCATE } trunca
8ce0: 74 65 20 20 20 20 20 20 20 20 20 20 30 20 2d 31  te          0 -1
8cf0: 0a 20 20 20 20 39 20 20 7b 20 49 4e 53 45 52 54  .    9  { INSERT
8d00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8d10: 37 2c 20 38 29 20 7d 20 20 20 20 7b 7d 20 20 20  7, 8) }    {}   
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 2d               0 -
8d30: 31 0a 20 20 20 20 31 30 20 7b 20 53 45 4c 45 43  1.    10 { SELEC
8d40: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20  T * FROM t1 }   
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 20 32              {1 2
8d60: 20 33 20 34 20 35 20 36 20 37 20 38 7d 20 30 20   3 4 5 6 7 8} 0 
8d70: 2d 31 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20 20 20  -1.  .  }] {.   
8d80: 20 69 66 63 61 70 61 62 6c 65 20 65 6e 61 62 6c   ifcapable enabl
8d90: 65 5f 70 65 72 73 69 73 74 5f 77 61 6c 20 7b 0a  e_persist_wal {.
8da0: 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72        file_contr
8db0: 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 20 64  ol_persist_wal d
8dc0: 62 20 30 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  b 0.    }.    do
8dd0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
8de0: 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20 24  ger1-7.1.$tn.1 $
8df0: 73 71 6c 20 24 72 65 73 0a 20 20 20 20 63 61 74  sql $res.    cat
8e00: 63 68 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b 20  ch { set J -1 ; 
8e10: 73 65 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a 65  set J [file size
8e20: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
8e30: 5d 20 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20  ] }.    catch { 
8e40: 73 65 74 20 57 20 2d 31 20 3b 20 73 65 74 20 57  set W -1 ; set W
8e50: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
8e60: 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20 64  .db-wal] }.    d
8e70: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e  o_test pager1-7.
8e80: 31 2e 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20 24  1.$tn.2 { list $
8e90: 4a 20 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a 73  J $W } [list $js
8ea0: 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f   $ws].  }.}..do_
8eb0: 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e  test pager1-7.2.
8ec0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
8ed0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
8ee0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
8ef0: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
8f00: 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45  mode = EXCLUSIVE
8f10: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8f20: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
8f30: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 52   BEGIN;.      PR
8f40: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
8f50: 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20  e = delete;.    
8f60: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
8f70: 5f 6d 6f 64 65 20 3d 20 74 72 75 6e 63 61 74 65  _mode = truncate
8f80: 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  ;.  }.} {exclusi
8f90: 76 65 20 64 65 6c 65 74 65 20 74 72 75 6e 63 61  ve delete trunca
8fa0: 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  te}.do_test page
8fb0: 72 31 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78 65  r1-7.2.2 {.  exe
8fc0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
8fd0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
8fe0: 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  2) }.  execsql {
8ff0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
9000: 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74 20 7d  mode = persist }
9010: 0a 7d 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64 6f  .} {truncate}.do
9020: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32  _test pager1-7.2
9030: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
9040: 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65 63   COMMIT }.  exec
9050: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
9060: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
9070: 70 65 72 73 69 73 74 3b 0a 20 20 20 20 50 52 41  persist;.    PRA
9080: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  GMA journal_size
9090: 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b 70  _limit;.  }.} {p
90a0: 65 72 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d 2d  ersist -1}..#---
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90f0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
9100: 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 70 61  lowing tests, pa
9110: 67 65 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20 74  ger1-8.*, test t
9120: 68 61 74 20 74 68 65 20 73 70 65 63 69 61 6c 20  hat the special 
9130: 66 69 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a 6d  filenames .# ":m
9140: 65 6d 6f 72 79 3a 22 20 61 6e 64 20 22 22 20 6f  emory:" and "" o
9150: 70 65 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 61  pen temporary da
9160: 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65 61  tabases..#.forea
9170: 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65 7d  ch {tn filename}
9180: 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a 0a   {.  1 :memory:.
9190: 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f 5f    2 "".} {.  do_
91a0: 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74  test pager1-8.$t
91b0: 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73  n.1 {.    faults
91c0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
91d0: 6f 70 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f 73  open.    db clos
91e0: 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  e.    sqlite3 db
91f0: 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 65   $filename.    e
9200: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
9210: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
9220: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 43 52 45  m = 1;.      CRE
9230: 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 29 3b  ATE TABLE x1(x);
9240: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9250: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 43 68  TO x1 VALUES('Ch
9260: 61 72 6c 65 73 27 29 3b 0a 20 20 20 20 20 20 49  arles');.      I
9270: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41  NSERT INTO x1 VA
9280: 4c 55 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a 20  LUES('James');. 
9290: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
92a0: 20 78 31 20 56 41 4c 55 45 53 28 27 4d 61 72 79   x1 VALUES('Mary
92b0: 27 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ');.      SELECT
92c0: 20 2a 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20   * FROM x1;.    
92d0: 7d 0a 20 20 7d 20 7b 43 68 61 72 6c 65 73 20 4a  }.  } {Charles J
92e0: 61 6d 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64 6f  ames Mary}..  do
92f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24  _test pager1-8.$
9300: 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74  tn.2 {.    sqlit
9310: 65 33 20 64 62 32 20 24 66 69 6c 65 6e 61 6d 65  e3 db2 $filename
9320: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
9330: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31  SELECT * FROM x1
9340: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 6e   } db2.  } {1 {n
9350: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 78 31  o such table: x1
9360: 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  }}..  do_execsql
9370: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24  _test pager1-8.$
9380: 74 6e 2e 33 20 7b 0a 20 20 20 20 42 45 47 49 4e  tn.3 {.    BEGIN
9390: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
93a0: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 57  NTO x1 VALUES('W
93b0: 69 6c 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20 20  illiam');.      
93c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
93d0: 41 4c 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a 20  ALUES('Anne');. 
93e0: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d     ROLLBACK;.  }
93f0: 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   {}.}..#--------
9400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9440: 2d 0a 23 20 54 68 65 20 6e 65 78 74 20 62 6c 6f  -.# The next blo
9450: 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 70 61  ck of tests - pa
9460: 67 65 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c 20  ger1-9.* - deal 
9470: 77 69 74 68 20 69 6e 74 65 72 61 63 74 69 6f 6e  with interaction
9480: 73 20 62 65 74 77 65 65 6e 0a 23 20 74 68 65 20  s between.# the 
9490: 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 62 61  pager and the ba
94a0: 63 6b 75 70 20 41 50 49 2e 20 54 65 73 74 20 63  ckup API. Test c
94b0: 61 73 65 73 3a 0a 23 0a 23 20 20 20 70 61 67 65  ases:.#.#   page
94c0: 72 31 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20 74  r1-9.1.*: Test t
94d0: 68 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d  hat a backup com
94e0: 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75  pletes successfu
94f0: 6c 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a  lly even if the.
9500: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
9510: 20 20 73 6f 75 72 63 65 20 64 62 20 69 73 20 77    source db is w
9520: 72 69 74 74 65 6e 20 74 6f 20 64 75 72 69 6e 67  ritten to during
9530: 20 74 68 65 20 62 61 63 6b 75 70 20 6f 70 2e 0a   the backup op..
9540: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e 32  #.#   pager1-9.2
9550: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61 20  .*: Test that a 
9560: 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65 73  backup completes
9570: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65 76   successfully ev
9580: 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20 20  en if the.#     
9590: 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 72              sour
95a0: 63 65 20 64 62 20 69 73 20 77 72 69 74 74 65 6e  ce db is written
95b0: 20 74 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f 6c   to and then rol
95c0: 6c 65 64 20 62 61 63 6b 20 64 75 72 69 6e 67 20  led back during 
95d0: 61 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  a .#            
95e0: 20 20 20 20 20 62 61 63 6b 75 70 20 6f 70 65 72       backup oper
95f0: 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74  ation..#.do_test
9600: 20 70 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b 0a   pager1-9.0.1 {.
9610: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
9620: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
9630: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
9640: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
9650: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
9660: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
9670: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
9680: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
9690: 62 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61  b(a, b, UNIQUE(a
96a0: 2c 20 62 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  , b));.      INS
96b0: 45 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c 55  ERT INTO ab VALU
96c0: 45 53 28 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ES( a_string(200
96d0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
96e0: 20 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54   );.      INSERT
96f0: 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20   INTO ab SELECT 
9700: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
9710: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
9720: 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45  M ab;.      INSE
9730: 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43  RT INTO ab SELEC
9740: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
9750: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
9760: 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e  ROM ab;.      IN
9770: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c  SERT INTO ab SEL
9780: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
9790: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
97a0: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20   FROM ab;.      
97b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53  INSERT INTO ab S
97c0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
97d0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
97e0: 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20  0) FROM ab;.    
97f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
9800: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
9810: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
9820: 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20  300) FROM ab;.  
9830: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9840: 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  ab SELECT a_stri
9850: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
9860: 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a  g(300) FROM ab;.
9870: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9880: 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74  O ab SELECT a_st
9890: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
98a0: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62  ing(300) FROM ab
98b0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
98c0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
98d0: 61 67 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20 20  ager1-9.0.2 {.  
98e0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
98f0: 2e 64 62 32 0a 20 20 64 62 32 20 65 76 61 6c 20  .db2.  db2 eval 
9900: 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73  { PRAGMA cache_s
9910: 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 73 71 6c  ize = 10 }.  sql
9920: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62  ite3_backup B db
9930: 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20  2 main db main. 
9940: 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30   list [B step 10
9950: 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a  000] [B finish].
9960: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53  } {SQLITE_DONE S
9970: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
9980: 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 33 20 7b  t pager1-9.0.3 {
9990: 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54  . db one {SELECT
99a0: 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52   md5sum(a, b) FR
99b0: 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e  OM ab}.} [db2 on
99c0: 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  e {SELECT md5sum
99d0: 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d  (a, b) FROM ab}]
99e0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
99f0: 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  -9.1.1 {.  execs
9a00: 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 53  ql { UPDATE ab S
9a10: 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET a = a_string(
9a20: 32 30 31 29 20 7d 0a 20 20 73 71 6c 69 74 65 33  201) }.  sqlite3
9a30: 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61  _backup B db2 ma
9a40: 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73  in db main.  B s
9a50: 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45  tep 30.} {SQLITE
9a60: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  _OK}.do_test pag
9a70: 65 72 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65 78  er1-9.1.2 {.  ex
9a80: 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61  ecsql { UPDATE a
9a90: 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  b SET b = a_stri
9aa0: 6e 67 28 33 30 31 29 20 7d 0a 20 20 6c 69 73 74  ng(301) }.  list
9ab0: 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20   [B step 10000] 
9ac0: 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51  [B finish].} {SQ
9ad0: 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45  LITE_DONE SQLITE
9ae0: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  _OK}.do_test pag
9af0: 65 72 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62 20  er1-9.1.3 {. db 
9b00: 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73  one {SELECT md5s
9b10: 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62  um(a, b) FROM ab
9b20: 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45  }.} [db2 one {SE
9b30: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
9b40: 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74  ) FROM ab}].do_t
9b50: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 34  est pager1-9.1.4
9b60: 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c   { execsql { SEL
9b70: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
9b80: 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 0a  M ab } } {128}..
9b90: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9ba0: 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.1 {.  execsql
9bb0: 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54   { UPDATE ab SET
9bc0: 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30   a = a_string(20
9bd0: 32 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  2) }.  sqlite3_b
9be0: 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e  ackup B db2 main
9bf0: 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65   db main.  B ste
9c00: 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f  p 30.} {SQLITE_O
9c10: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
9c20: 31 2d 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63  1-9.2.2 {.  exec
9c30: 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e  sql { .    BEGIN
9c40: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 61  ;.      UPDATE a
9c50: 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  b SET b = a_stri
9c60: 6e 67 28 33 30 31 29 3b 0a 20 20 20 20 52 4f 4c  ng(301);.    ROL
9c70: 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69 73  LBACK;.  }.  lis
9c80: 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d  t [B step 10000]
9c90: 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53   [B finish].} {S
9ca0: 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54  QLITE_DONE SQLIT
9cb0: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
9cc0: 67 65 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64 62  ger1-9.2.3 {. db
9cd0: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35   one {SELECT md5
9ce0: 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61  sum(a, b) FROM a
9cf0: 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53  b}.} [db2 one {S
9d00: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
9d10: 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f  b) FROM ab}].do_
9d20: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e  test pager1-9.2.
9d30: 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45  4 { execsql { SE
9d40: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9d50: 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a  OM ab } } {128}.
9d60: 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f  db close.db2 clo
9d70: 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  se..do_test page
9d80: 72 31 2d 39 2e 33 2e 31 20 7b 0a 20 20 74 65 73  r1-9.3.1 {.  tes
9d90: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
9da0: 20 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69   1.  tv sectorsi
9db0: 7a 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73  ze 4096.  faults
9dc0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
9dd0: 6f 70 65 6e 0a 0a 20 20 65 78 65 63 73 71 6c 20  open..  execsql 
9de0: 7b 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69  { PRAGMA page_si
9df0: 7a 65 20 3d 20 31 30 32 34 20 7d 0a 20 20 66 6f  ze = 1024 }.  fo
9e00: 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69  r {set ii 0} {$i
9e10: 69 20 3c 20 34 7d 20 7b 69 6e 63 72 20 69 69 7d  i < 4} {incr ii}
9e20: 20 7b 20 65 78 65 63 73 71 6c 20 22 43 52 45 41   { execsql "CREA
9e30: 54 45 20 54 41 42 4c 45 20 74 24 7b 69 69 7d 28  TE TABLE t${ii}(
9e40: 61 2c 20 62 29 22 20 7d 0a 7d 20 7b 7d 0a 64 6f  a, b)" }.} {}.do
9e50: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33  _test pager1-9.3
9e60: 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .2 {.  sqlite3 d
9e70: 62 32 20 74 65 73 74 2e 64 62 32 0a 0a 20 20 65  b2 test.db2..  e
9e80: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
9e90: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
9ea0: 34 30 39 36 3b 0a 20 20 20 20 50 52 41 47 4d 41  4096;.    PRAGMA
9eb0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f   synchronous = O
9ec0: 46 46 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  FF;.    CREATE T
9ed0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
9ee0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9ef0: 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62  t2(a, b);.  } db
9f00: 32 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  2..  sqlite3_bac
9f10: 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64  kup B db2 main d
9f20: 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20  b main.  B step 
9f30: 33 30 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65  30.  list [B ste
9f40: 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69  p 10000] [B fini
9f50: 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f  sh].} {SQLITE_DO
9f60: 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  NE SQLITE_OK}.do
9f70: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33  _test pager1-9.3
9f80: 2e 33 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65  .3 {.  db2 close
9f90: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76  .  db close.  tv
9fa0: 20 64 65 6c 65 74 65 0a 20 20 66 69 6c 65 20 73   delete.  file s
9fb0: 69 7a 65 20 74 65 73 74 2e 64 62 32 0a 7d 20 5b  ize test.db2.} [
9fc0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
9fd0: 62 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  b]..do_test page
9fe0: 72 31 2d 39 2e 34 2e 31 20 7b 0a 20 20 66 61 75  r1-9.4.1 {.  fau
9ff0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
a000: 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65  _reopen.  sqlite
a010: 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20  3 db2 test.db2. 
a020: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
a030: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
a040: 3d 20 34 30 39 36 3b 0a 20 20 20 20 43 52 45 41  = 4096;.    CREA
a050: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
a060: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
a070: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
a080: 7d 20 64 62 32 0a 20 20 73 71 6c 69 74 65 33 5f  } db2.  sqlite3_
a090: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
a0a0: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74  n db main.  list
a0b0: 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20   [B step 10000] 
a0c0: 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51  [B finish].} {SQ
a0d0: 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45  LITE_DONE SQLITE
a0e0: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  _OK}.do_test pag
a0f0: 65 72 31 2d 39 2e 34 2e 32 20 7b 0a 20 20 6c 69  er1-9.4.2 {.  li
a100: 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  st [file size te
a110: 73 74 2e 64 62 32 5d 20 5b 66 69 6c 65 20 73 69  st.db2] [file si
a120: 7a 65 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 30  ze test.db].} {0
a130: 20 30 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23   0}.db2 close..#
a140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
a190: 20 74 68 61 74 20 72 65 67 61 72 64 6c 65 73 73   that regardless
a1a0: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 72 65   of the value re
a1b0: 74 75 72 6e 65 64 20 62 79 20 78 53 65 63 74 6f  turned by xSecto
a1c0: 72 53 69 7a 65 28 29 2c 20 74 68 65 0a 23 20 6d  rSize(), the.# m
a1d0: 69 6e 69 6d 75 6d 20 65 66 66 65 63 74 69 76 65  inimum effective
a1e0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
a1f0: 35 31 32 20 61 6e 64 20 74 68 65 20 6d 61 78 69  512 and the maxi
a200: 6d 75 6d 20 36 35 35 33 36 20 62 79 74 65 73 2e  mum 65536 bytes.
a210: 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64  .#.testvfs tv -d
a220: 65 66 61 75 6c 74 20 31 0a 66 6f 72 65 61 63 68  efault 1.foreach
a230: 20 73 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20   sectorsize {.  
a240: 20 20 33 32 20 20 20 36 34 20 20 20 31 32 38 20    32   64   128 
a250: 20 20 32 35 36 20 20 20 35 31 32 20 20 20 31 30    256   512   10
a260: 32 34 20 20 20 32 30 34 38 20 0a 20 20 20 20 34  24   2048 .    4
a270: 30 39 36 20 38 31 39 32 20 31 36 33 38 34 20 33  096 8192 16384 3
a280: 32 37 36 38 20 36 35 35 33 36 20 31 33 31 30 37  2768 65536 13107
a290: 32 20 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74  2 262144.} {.  t
a2a0: 76 20 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65  v sectorsize $se
a2b0: 63 74 6f 72 73 69 7a 65 0a 20 20 74 76 20 64 65  ctorsize.  tv de
a2c0: 76 63 68 61 72 20 7b 7d 0a 20 20 73 65 74 20 65  vchar {}.  set e
a2d0: 66 66 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20  ff $sectorsize. 
a2e0: 20 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65   if {$sectorsize
a2f0: 20 3c 20 35 31 32 7d 20 20 20 7b 20 73 65 74 20   < 512}   { set 
a300: 65 66 66 20 35 31 32 20 7d 0a 20 20 69 66 20 7b  eff 512 }.  if {
a310: 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35  $sectorsize > 65
a320: 35 33 36 7d 20 7b 20 73 65 74 20 65 66 66 20 36  536} { set eff 6
a330: 35 35 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73  5536 }..  do_tes
a340: 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63  t pager1-10.$sec
a350: 74 6f 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20  torsize.1 {.    
a360: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
a370: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64  and_reopen.    d
a380: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
a390: 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65  a_string.    exe
a3a0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
a3b0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
a3c0: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
a3d0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
a3e0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20  ze = 1024;.     
a3f0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20   BEGIN;.        
a400: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
a410: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43  a, b);.        C
a420: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
a430: 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52  , b);.        CR
a440: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
a450: 20 62 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49   b);.      COMMI
a460: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c  T;.    }.    fil
a470: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a  e size test.db-j
a480: 6f 75 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72  ournal.  } [expr
a490: 20 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36   $sectorsize > 6
a4a0: 35 35 33 36 20 3f 20 36 35 35 33 36 20 3a 20 24  5536 ? 65536 : $
a4b0: 73 65 63 74 6f 72 73 69 7a 65 5d 0a 0a 20 20 64  sectorsize]..  d
a4c0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30  o_test pager1-10
a4d0: 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 32 20 7b  .$sectorsize.2 {
a4e0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
a4f0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
a500: 4f 20 74 33 20 56 41 4c 55 45 53 28 61 5f 73 74  O t3 VALUES(a_st
a510: 72 69 6e 67 28 33 30 30 29 2c 20 61 5f 73 74 72  ring(300), a_str
a520: 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20 20 20  ing(300));.     
a530: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
a540: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
a550: 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 32 20 2a  ;        /*  2 *
a560: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
a570: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20  NTO t3 SELECT * 
a580: 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20  FROM t3;        
a590: 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49  /*  4 */.      I
a5a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
a5b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20  LECT * FROM t3; 
a5c0: 20 20 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a         /*  8 */.
a5d0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
a5e0: 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52  O t3 SELECT * FR
a5f0: 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a  OM t3;        /*
a600: 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53   16 */.      INS
a610: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
a620: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20  CT * FROM t3;   
a630: 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20       /* 32 */.  
a640: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f    }.  } {}..  do
a650: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e  _test pager1-10.
a660: 24 73 65 63 74 6f 72 73 69 7a 65 2e 33 20 7b 0a  $sectorsize.3 {.
a670: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
a680: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
a690: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
a6a0: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
a6b0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
a6c0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
a6d0: 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76    }.    recursiv
a6e0: 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b  e_select 32 t3 {
a6f0: 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20  db eval "INSERT 
a700: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
a710: 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73  , 2)"}.    execs
a720: 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49  ql {.      COMMI
a730: 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  T;.      SELECT 
a740: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  * FROM t2;.    }
a750: 0a 20 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 64 6f  .  } {1 2}..  do
a760: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e  _test pager1-10.
a770: 24 73 65 63 74 6f 72 73 69 7a 65 2e 34 20 7b 0a  $sectorsize.4 {.
a780: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
a790: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a7a0: 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t6(a, b);.     
a7b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
a7c0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52  (a, b);.      CR
a7d0: 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c  EATE TABLE t5(a,
a7e0: 20 62 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20   b);.      DROP 
a7f0: 54 41 42 4c 45 20 74 36 3b 0a 20 20 20 20 20 20  TABLE t6;.      
a800: 44 52 4f 50 20 54 41 42 4c 45 20 74 37 3b 0a 20  DROP TABLE t7;. 
a810: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
a820: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
a830: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
a840: 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20  ABLE t6(a, b);. 
a850: 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69     }.    recursi
a860: 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20  ve_select 32 t3 
a870: 7b 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54  {db eval "INSERT
a880: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
a890: 31 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63  1, 2)"}.    exec
a8a0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d  sql {.      COMM
a8b0: 49 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  IT;.      SELECT
a8c0: 20 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20   * FROM t5;.    
a8d0: 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d  }.  } {1 2}.  .}
a8e0: 0a 64 62 20 63 6c 6f 73 65 0a 0a 74 76 20 73 65  .db close..tv se
a8f0: 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 64 6f  ctorsize 4096.do
a900: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e  _test pager1.10.
a910: 78 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  x.1 {.  faultsim
a920: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
a930: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
a940: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
a950: 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20  acuum = none;.  
a960: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
a970: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43  ze = 1024;.    C
a980: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
a990: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65  );.  }.  for {se
a9a0: 74 20 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20 7b  t i 0} {$i<30} {
a9b0: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78  incr i} {.    ex
a9c0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
a9d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 7a 65  NTO t1 VALUES(ze
a9e0: 72 6f 62 6c 6f 62 28 39 30 30 29 29 20 7d 0a 20  roblob(900)) }. 
a9f0: 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
aa00: 65 73 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d  est.db.} {32768}
aa10: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
aa20: 31 30 2e 78 2e 32 20 7b 0a 20 20 65 78 65 63 73  10.x.2 {.  execs
aa30: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
aa40: 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20  TABLE t2(x);.   
aa50: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a   DROP TABLE t2;.
aa60: 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20    }.  file size 
aa70: 74 65 73 74 2e 64 62 0a 7d 20 7b 33 33 37 39 32  test.db.} {33792
aa80: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
aa90: 2e 31 30 2e 78 2e 33 20 7b 0a 20 20 65 78 65 63  .10.x.3 {.  exec
aaa0: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
aab0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
aac0: 45 20 74 32 28 78 29 3b 0a 20 20 7d 0a 20 20 72  E t2(x);.  }.  r
aad0: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
aae0: 33 30 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20  30 t1.  execsql 
aaf0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
ab00: 4c 45 20 74 33 28 78 29 3b 0a 20 20 20 20 43 4f  LE t3(x);.    CO
ab10: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  MMIT;.  }.} {}..
ab20: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
ab30: 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d  te..testvfs tv -
ab40: 64 65 66 61 75 6c 74 20 31 0a 66 61 75 6c 74 73  default 1.faults
ab50: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
ab60: 6f 70 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73  open.db func a_s
ab70: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 64  tring a_string.d
ab80: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
ab90: 61 67 65 72 31 2d 31 31 2e 31 20 7b 0a 20 20 50  ager1-11.1 {.  P
aba0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
abb0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 50  de = DELETE;.  P
abc0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
abd0: 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a   = 10;.  BEGIN;.
abe0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
abf0: 20 7a 7a 28 74 6f 70 20 50 52 49 4d 41 52 59 20   zz(top PRIMARY 
ac00: 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  KEY);.    INSERT
ac10: 20 49 4e 54 4f 20 7a 7a 20 56 41 4c 55 45 53 28   INTO zz VALUES(
ac20: 61 5f 73 74 72 69 6e 67 28 32 32 32 29 29 3b 0a  a_string(222));.
ac30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ac40: 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  zz SELECT a_stri
ac50: 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d  ng((SELECT 222+m
ac60: 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a  ax(rowid) FROM z
ac70: 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20  z)) FROM zz;.   
ac80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20   INSERT INTO zz 
ac90: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
aca0: 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28  (SELECT 222+max(
acb0: 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29  rowid) FROM zz))
acc0: 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e   FROM zz;.    IN
acd0: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c  SERT INTO zz SEL
ace0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45  ECT a_string((SE
acf0: 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77  LECT 222+max(row
ad00: 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52  id) FROM zz)) FR
ad10: 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52  OM zz;.    INSER
ad20: 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54  T INTO zz SELECT
ad30: 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43   a_string((SELEC
ad40: 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29  T 222+max(rowid)
ad50: 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20   FROM zz)) FROM 
ad60: 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  zz;.    INSERT I
ad70: 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f  NTO zz SELECT a_
ad80: 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32  string((SELECT 2
ad90: 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52  22+max(rowid) FR
ada0: 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b  OM zz)) FROM zz;
adb0: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 42 45 47  .  COMMIT;.  BEG
adc0: 49 4e 3b 0a 20 20 20 20 55 50 44 41 54 45 20 7a  IN;.    UPDATE z
add0: 7a 20 53 45 54 20 74 6f 70 20 3d 20 61 5f 73 74  z SET top = a_st
ade0: 72 69 6e 67 28 33 34 35 29 3b 0a 7d 20 7b 64 65  ring(345);.} {de
adf0: 6c 65 74 65 7d 0a 0a 70 72 6f 63 20 6c 6f 63 6b  lete}..proc lock
ae00: 6f 75 74 20 7b 6d 65 74 68 6f 64 20 61 72 67 73  out {method args
ae10: 7d 20 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54  } { return SQLIT
ae20: 45 5f 49 4f 45 52 52 20 7d 0a 74 76 20 73 63 72  E_IOERR }.tv scr
ae30: 69 70 74 20 6c 6f 63 6b 6f 75 74 0a 74 76 20 66  ipt lockout.tv f
ae40: 69 6c 74 65 72 20 7b 78 57 72 69 74 65 20 78 54  ilter {xWrite xT
ae50: 72 75 6e 63 61 74 65 20 78 53 79 6e 63 7d 0a 64  runcate xSync}.d
ae60: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
ae70: 70 61 67 65 72 31 2d 31 31 2e 32 20 7b 20 43 4f  pager1-11.2 { CO
ae80: 4d 4d 49 54 20 7d 20 7b 31 20 7b 64 69 73 6b 20  MMIT } {1 {disk 
ae90: 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a 74 76 20  I/O error}}..tv 
aea0: 73 63 72 69 70 74 20 7b 7d 0a 64 6f 5f 74 65 73  script {}.do_tes
aeb0: 74 20 70 61 67 65 72 31 2d 31 31 2e 33 20 7b 0a  t pager1-11.3 {.
aec0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
aed0: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
aee0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
aef0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e  rnal_mode = TRUN
af00: 43 41 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41  CATE;.    PRAGMA
af10: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
af20: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 74 72 75  ;.  } db2.} {tru
af30: 6e 63 61 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65 73  ncate ok}.do_tes
af40: 74 20 70 61 67 65 72 31 2d 31 31 2e 34 20 7b 0a  t pager1-11.4 {.
af50: 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 66 69    db2 close.  fi
af60: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
af70: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
af80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
af90: 70 61 67 65 72 31 2d 31 31 2e 35 20 7b 20 53 45  pager1-11.5 { SE
afa0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
afb0: 4f 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62 20  OM zz } {32}.db 
afc0: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
afd0: 20 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    .#------------
afe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
b020: 54 65 73 74 20 22 50 52 41 47 4d 41 20 70 61 67  Test "PRAGMA pag
b030: 65 5f 73 69 7a 65 22 0a 23 0a 74 65 73 74 76 66  e_size".#.testvf
b040: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
b050: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 31 30  tv sectorsize 10
b060: 32 34 0a 66 6f 72 65 61 63 68 20 70 61 67 65 73  24.foreach pages
b070: 69 7a 65 20 7b 0a 20 20 20 20 35 31 32 20 20 20  ize {.    512   
b080: 31 30 32 34 20 20 20 32 30 34 38 20 34 30 39 36  1024   2048 4096
b090: 20 38 31 39 32 20 31 36 33 38 34 20 33 32 37 36   8192 16384 3276
b0a0: 38 20 0a 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69  8 .} {.  faultsi
b0b0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
b0c0: 70 65 6e 0a 0a 20 20 23 20 54 68 65 20 73 65 63  pen..  # The sec
b0d0: 74 6f 72 2d 73 69 7a 65 20 28 61 63 63 6f 72 64  tor-size (accord
b0e0: 69 6e 67 20 74 6f 20 74 68 65 20 56 46 53 29 20  ing to the VFS) 
b0f0: 69 73 20 31 30 32 34 20 62 79 74 65 73 2e 20 53  is 1024 bytes. S
b100: 6f 20 69 66 20 74 68 65 0a 20 20 23 20 70 61 67  o if the.  # pag
b110: 65 2d 73 69 7a 65 20 72 65 71 75 65 73 74 65 64  e-size requested
b120: 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 70   using "PRAGMA p
b130: 61 67 65 5f 73 69 7a 65 22 20 69 73 20 67 72 65  age_size" is gre
b140: 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ater than the.  
b150: 23 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76  # compile time v
b160: 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 4d  alue of SQLITE_M
b170: 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 74 68  AX_PAGE_SIZE, th
b180: 65 6e 20 74 68 65 20 65 66 66 65 63 74 69 76 65  en the effective
b190: 20 0a 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20   .  # page-size 
b1a0: 72 65 6d 61 69 6e 73 20 31 30 32 34 20 62 79 74  remains 1024 byt
b1b0: 65 73 2e 0a 20 20 23 0a 20 20 73 65 74 20 65 66  es..  #.  set ef
b1c0: 66 20 24 70 61 67 65 73 69 7a 65 0a 20 20 69 66  f $pagesize.  if
b1d0: 20 7b 24 65 66 66 20 3e 20 24 3a 3a 53 51 4c 49   {$eff > $::SQLI
b1e0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
b1f0: 7d 20 7b 20 73 65 74 20 65 66 66 20 31 30 32 34  } { set eff 1024
b200: 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   }..  do_test pa
b210: 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a  ger1-12.$pagesiz
b220: 65 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  e.1 {.    sqlite
b230: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
b240: 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20    execsql ".    
b250: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
b260: 7a 65 20 3d 20 24 70 61 67 65 73 69 7a 65 3b 0a  ze = $pagesize;.
b270: 20 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45        CREATE VIE
b280: 57 20 76 20 41 53 20 53 45 4c 45 43 54 20 2a 20  W v AS SELECT * 
b290: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
b2a0: 65 72 3b 0a 20 20 20 20 22 20 64 62 32 0a 20 20  er;.    " db2.  
b2b0: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
b2c0: 2e 64 62 0a 20 20 7d 20 24 65 66 66 0a 20 20 64  .db.  } $eff.  d
b2d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32  o_test pager1-12
b2e0: 2e 24 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20  .$pagesize.2 {. 
b2f0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74     sqlite3 db2 t
b300: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
b310: 71 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45  ql { .      SELE
b320: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
b330: 20 76 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41   v;.      PRAGMA
b340: 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b   main.page_size;
b350: 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b  .    } db2.  } [
b360: 6c 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20 64  list 1 $eff].  d
b370: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32  o_test pager1-12
b380: 2e 24 70 61 67 65 73 69 7a 65 2e 33 20 7b 0a 20  .$pagesize.3 {. 
b390: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
b3a0: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
b3b0: 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20  (*) FROM v;.    
b3c0: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61    PRAGMA main.pa
b3d0: 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  ge_size;.    }. 
b3e0: 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 66 66 5d   } [list 1 $eff]
b3f0: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 64  .  db2 close.}.d
b400: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
b410: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
b420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
b460: 54 65 73 74 20 73 70 65 63 61 6c 20 22 50 52 41  Test specal "PRA
b470: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
b480: 3d 50 45 52 53 49 53 54 22 20 74 65 73 74 20 63  =PERSIST" test c
b490: 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31  ases..#.# pager1
b4a0: 2d 31 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65  -13.1.*: This te
b4b0: 73 74 73 20 61 20 73 70 65 63 69 61 6c 20 63 61  sts a special ca
b4c0: 73 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  se encountered i
b4d0: 6e 20 70 65 72 73 69 73 74 65 6e 74 20 0a 23 20  n persistent .# 
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
b4f0: 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 49 66 20  ournal mode: If 
b500: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 73 73 6f  the journal asso
b510: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 74 72  ciated with a tr
b520: 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20  ansaction.#     
b530: 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
b540: 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6a  aller than the j
b550: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 62 65 63  ournal file (bec
b560: 61 75 73 65 20 61 20 70 72 65 76 69 6f 75 73 20  ause a previous 
b570: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b580: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65    transaction le
b590: 66 74 20 61 20 76 65 72 79 20 6c 61 72 67 65 20  ft a very large 
b5a0: 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  non-hot journal 
b5b0: 66 69 6c 65 20 69 6e 20 74 68 65 0a 23 20 20 20  file in the.#   
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
b5d0: 65 2d 73 79 73 74 65 6d 29 2c 20 74 68 65 6e 20  e-system), then 
b5e0: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 62 65  SQLite has to be
b5f0: 20 63 61 72 65 66 75 6c 20 74 68 61 74 20 74 68   careful that th
b600: 65 72 65 20 69 73 0a 23 20 20 20 20 20 20 20 20  ere is.#        
b610: 20 20 20 20 20 20 20 20 6e 6f 74 20 61 20 6a 6f          not a jo
b620: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6c 65 66  urnal-header lef
b630: 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
b640: 65 76 69 6f 75 73 20 74 72 61 6e 73 61 63 74 69  evious transacti
b650: 6f 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  on.#            
b660: 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 20      immediately 
b670: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6a 6f  following the jo
b680: 75 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6a 75  urnal content ju
b690: 73 74 20 77 72 69 74 74 65 6e 2e 0a 23 20 20 20  st written..#   
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20               If 
b6b0: 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
b6c0: 65 20 70 72 6f 63 65 73 73 20 63 72 61 73 68 65  e process crashe
b6d0: 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a 6f  s so that the jo
b6e0: 75 72 6e 61 6c 0a 23 20 20 20 20 20 20 20 20 20  urnal.#         
b6f0: 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20 61         becomes a
b700: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
b710: 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
b720: 62 61 63 6b 20 62 79 20 61 6e 6f 74 68 65 72 0a  back by another.
b730: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
b740: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 72 65 20   process, there 
b750: 69 73 20 61 20 64 61 6e 67 65 72 20 74 68 61 74  is a danger that
b760: 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65   the other proce
b770: 73 73 20 6d 61 79 20 72 6f 6c 6c 0a 23 20 20 20  ss may roll.#   
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61 63               bac
b790: 6b 20 74 68 65 20 61 62 6f 72 74 65 64 20 74 72  k the aborted tr
b7a0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
b7b0: 63 6f 6e 74 69 6e 75 65 20 63 6f 70 79 69 6e 67  continue copying
b7c0: 20 64 61 74 61 0a 23 20 20 20 20 20 20 20 20 20   data.#         
b7d0: 20 20 20 20 20 20 20 66 72 6f 6d 20 61 6e 20 6f         from an o
b7e0: 6c 64 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  lder transaction
b7f0: 20 66 72 6f 6d 20 74 68 65 20 72 65 6d 61 69 6e   from the remain
b800: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
b810: 61 6c 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20  al..#           
b820: 20 20 20 20 20 53 65 65 20 74 68 65 20 73 79 6e       See the syn
b830: 63 4a 6f 75 72 6e 61 6c 28 29 20 66 75 6e 63 74  cJournal() funct
b840: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ion for details.
b850: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 32  .#.# pager1-13.2
b860: 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73  .*: Same test as
b870: 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 54   the previous. T
b880: 68 69 73 20 74 69 6d 65 2c 20 74 68 72 6f 77 20  his time, throw 
b890: 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 0a 23 20  an index into.# 
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
b8b0: 68 65 20 6d 69 78 20 74 6f 20 6d 61 6b 65 20 74  he mix to make t
b8c0: 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
b8d0: 63 6b 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74  ck more likely t
b8e0: 6f 20 63 61 74 63 68 0a 23 20 20 20 20 20 20 20  o catch.#       
b8f0: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 73 2e           errors.
b900: 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64  .#.testvfs tv -d
b910: 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69  efault 1.tv scri
b920: 70 74 20 78 53 79 6e 63 43 62 0a 74 76 20 66 69  pt xSyncCb.tv fi
b930: 6c 74 65 72 20 78 53 79 6e 63 0a 70 72 6f 63 20  lter xSync.proc 
b940: 78 53 79 6e 63 43 62 20 7b 6d 65 74 68 6f 64 20  xSyncCb {method 
b950: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
b960: 0a 20 20 73 65 74 20 74 20 5b 66 69 6c 65 20 74  .  set t [file t
b970: 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20  ail $filename]. 
b980: 20 69 66 20 7b 24 74 20 3d 3d 20 22 74 65 73 74   if {$t == "test
b990: 2e 64 62 22 7d 20 66 61 75 6c 74 73 69 6d 5f 73  .db"} faultsim_s
b9a0: 61 76 65 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ave.  return SQL
b9b0: 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69  ITE_OK.}.faultsi
b9c0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
b9d0: 70 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74  pen.db func a_st
b9e0: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 23  ring a_string..#
b9f0: 20 54 68 65 20 55 50 44 41 54 45 20 73 74 61 74   The UPDATE stat
ba00: 65 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  ement at the end
ba10: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 63 61   of this test ca
ba20: 73 65 20 63 72 65 61 74 65 73 20 61 20 72 65 61  se creates a rea
ba30: 6c 6c 79 20 62 69 67 0a 23 20 6a 6f 75 72 6e 61  lly big.# journa
ba40: 6c 2e 20 53 69 6e 63 65 20 74 68 65 20 63 61 63  l. Since the cac
ba50: 68 65 2d 73 69 7a 65 20 69 73 20 6f 6e 6c 79 20  he-size is only 
ba60: 31 30 20 70 61 67 65 73 2c 20 74 68 65 20 6a 6f  10 pages, the jo
ba70: 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 0a  urnal contains .
ba80: 23 20 66 72 65 71 75 65 6e 74 20 6a 6f 75 72 6e  # frequent journ
ba90: 61 6c 20 68 65 61 64 65 72 73 2e 0a 23 0a 64 6f  al headers..#.do
baa0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
bab0: 67 65 72 31 2d 31 33 2e 31 2e 31 20 7b 0a 20 20  ger1-13.1.1 {.  
bac0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
bad0: 20 3d 20 31 30 32 34 3b 0a 20 20 50 52 41 47 4d   = 1024;.  PRAGM
bae0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
baf0: 20 50 45 52 53 49 53 54 3b 0a 20 20 50 52 41 47   PERSIST;.  PRAG
bb00: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
bb10: 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  10;.  BEGIN;.   
bb20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
bb30: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
bb40: 52 59 20 4b 45 59 2c 20 62 20 42 4c 4f 42 29 3b  RY KEY, b BLOB);
bb50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
bb60: 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c   t1 VALUES(NULL,
bb70: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 29 3b   a_string(400));
bb80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
bb90: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
bba0: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
bbb0: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
bbc0: 20 2f 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 49   /*   2 */.    I
bbd0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
bbe0: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
bbf0: 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31  ing(400) FROM t1
bc00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20  ;          /*   
bc10: 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  4 */.    INSERT 
bc20: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e  INTO t1 SELECT N
bc30: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  ULL, a_string(40
bc40: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
bc50: 20 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20       /*   8 */. 
bc60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
bc70: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  1 SELECT NULL, a
bc80: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
bc90: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f  M t1;          /
bca0: 2a 20 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53  *  16 */.    INS
bcb0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
bcc0: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
bcd0: 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(400) FROM t1; 
bce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32 20           /*  32 
bcf0: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
bd00: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
bd10: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  L, a_string(400)
bd20: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
bd30: 20 20 20 2f 2a 20 20 36 34 20 2a 2f 0a 20 20 20     /*  64 */.   
bd40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
bd50: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
bd60: 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20  tring(400) FROM 
bd70: 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t1;          /* 
bd80: 31 32 38 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b  128 */.  COMMIT;
bd90: 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54  .  UPDATE t1 SET
bda0: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34 30   b = a_string(40
bdb0: 30 29 3b 0a 7d 20 7b 70 65 72 73 69 73 74 7d 0a  0);.} {persist}.
bdc0: 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74  .if {$::tcl_plat
bdd0: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d  form(platform)!=
bde0: 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 52  "windows"} {.# R
bdf0: 75 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  un transactions 
be00: 6f 66 20 69 6e 63 72 65 61 73 69 6e 67 20 73 69  of increasing si
be10: 7a 65 73 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c  zes. Eventually,
be20: 20 6f 6e 65 20 28 6f 72 20 6d 6f 72 65 20 74 68   one (or more th
be30: 61 6e 20 6f 6e 65 29 0a 23 20 6f 66 20 74 68 65  an one).# of the
be40: 73 65 20 77 69 6c 6c 20 77 72 69 74 65 20 6a 75  se will write ju
be50: 73 74 20 65 6e 6f 75 67 68 20 63 6f 6e 74 65 6e  st enough conten
be60: 74 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  t that one of th
be70: 65 20 6f 6c 64 20 68 65 61 64 65 72 73 20 63 72  e old headers cr
be80: 65 61 74 65 64 20 0a 23 20 62 79 20 74 68 65 20  eated .# by the 
be90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74  transaction in t
bea0: 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 6c  he block above l
beb0: 69 65 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ies immediately 
bec0: 61 66 74 65 72 20 74 68 65 20 63 6f 6e 74 65 6e  after the conten
bed0: 74 0a 23 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62  t.# journalled b
bee0: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  y the current tr
bef0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72  ansaction..#.for
bf00: 20 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e   {set nUp 1} {$n
bf10: 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70  Up<64} {incr nUp
bf20: 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  } {.  do_execsql
bf30: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
bf40: 31 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20  1.2.$nUp.1 { .  
bf50: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
bf60: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39  b = a_string(399
bf70: 29 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55  ) WHERE a <= $nU
bf80: 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78  p.  } {}.  do_ex
bf90: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
bfa0: 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 32 20  1-13.1.2.$nUp.2 
bfb0: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
bfc0: 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20  ty_check } {ok} 
bfd0: 0a 0a 20 20 23 20 54 72 79 20 74 6f 20 61 63 63  ..  # Try to acc
bfe0: 65 73 73 20 74 68 65 20 73 6e 61 70 73 68 6f 74  ess the snapshot
bff0: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
c000: 74 65 6d 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74  tem..  #.  sqlit
c010: 65 33 20 64 62 32 20 73 76 5f 74 65 73 74 2e 64  e3 db2 sv_test.d
c020: 62 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  b.  do_test page
c030: 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 33  r1-13.1.2.$nUp.3
c040: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
c050: 20 53 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67   SELECT sum(leng
c060: 74 68 28 62 29 29 20 46 52 4f 4d 20 74 31 20 7d  th(b)) FROM t1 }
c070: 20 64 62 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b   db2.  } [expr {
c080: 31 32 38 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d  128*400 - ($nUp-
c090: 31 29 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70  1)}].  do_test p
c0a0: 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55  ager1-13.1.2.$nU
c0b0: 70 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71  p.4 {.    execsq
c0c0: 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  l { PRAGMA integ
c0d0: 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32  rity_check } db2
c0e0: 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20  .  } {ok}.  db2 
c0f0: 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a 69 66 20 7b 24  close.}.}..if {$
c100: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70  ::tcl_platform(p
c110: 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69 6e 64 6f  latform)!="windo
c120: 77 73 22 7d 20 7b 0a 23 20 53 61 6d 65 20 74 65  ws"} {.# Same te
c130: 73 74 20 61 73 20 61 62 6f 76 65 2e 20 42 75 74  st as above. But
c140: 20 74 68 69 73 20 74 69 6d 65 20 77 69 74 68 20   this time with 
c150: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20  an index on the 
c160: 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63  table..#.do_exec
c170: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
c180: 31 33 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41 54  13.2.1 {.  CREAT
c190: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
c1a0: 28 62 29 3b 0a 20 20 55 50 44 41 54 45 20 74 31  (b);.  UPDATE t1
c1b0: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
c1c0: 67 28 34 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72  g(400);.} {}.for
c1d0: 20 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e   {set nUp 1} {$n
c1e0: 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70  Up<64} {incr nUp
c1f0: 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  } {.  do_execsql
c200: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
c210: 32 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20  2.2.$nUp.1 { .  
c220: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
c230: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39  b = a_string(399
c240: 29 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55  ) WHERE a <= $nU
c250: 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78  p.  } {}.  do_ex
c260: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
c270: 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20  1-13.2.2.$nUp.2 
c280: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
c290: 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20  ty_check } {ok} 
c2a0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 73  .  sqlite3 db2 s
c2b0: 76 5f 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74  v_test.db.  do_t
c2c0: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
c2d0: 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65  2.$nUp.3 {.    e
c2e0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
c2f0: 73 75 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46  sum(length(b)) F
c300: 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d  ROM t1 } db2.  }
c310: 20 5b 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20   [expr {128*400 
c320: 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64  - ($nUp-1)}].  d
c330: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  o_test pager1-13
c340: 2e 32 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20  .2.2.$nUp.4 {.  
c350: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
c360: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
c370: 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b  ck } db2.  } {ok
c380: 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a  }.  db2 close.}.
c390: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  }..db close.tv d
c3a0: 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  elete..#--------
c3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3f0: 2d 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c 20  -.# Test specal 
c400: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
c410: 6d 6f 64 65 3d 4f 46 46 22 20 74 65 73 74 20 63  mode=OFF" test c
c420: 61 73 65 73 2e 0a 23 0a 66 61 75 6c 74 73 69 6d  ases..#.faultsim
c430: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
c440: 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  en.do_execsql_te
c450: 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 31  st pager1-14.1.1
c460: 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72   {.  PRAGMA jour
c470: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a  nal_mode = OFF;.
c480: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
c490: 31 28 61 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e  1(a, b);.  BEGIN
c4a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c4b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
c4c0: 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53  );.  COMMIT;.  S
c4d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
c4e0: 0a 7d 20 7b 6f 66 66 20 31 20 32 7d 0a 64 6f 5f  .} {off 1 2}.do_
c4f0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61  catchsql_test pa
c500: 67 65 72 31 2d 31 34 2e 31 2e 32 20 7b 0a 20 20  ger1-14.1.2 {.  
c510: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
c520: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
c530: 28 33 2c 20 34 29 3b 0a 20 20 52 4f 4c 4c 42 41  (3, 4);.  ROLLBA
c540: 43 4b 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f  CK;.} {0 {}}.do_
c550: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c560: 65 72 31 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 53  er1-14.1.3 {.  S
c570: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
c580: 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 63 61 74 63  .} {1 2}.do_catc
c590: 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  hsql_test pager1
c5a0: 2d 31 34 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49  -14.1.4 {.  BEGI
c5b0: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
c5c0: 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20  TO t1(rowid, a, 
c5d0: 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62  b) SELECT a+3, b
c5e0: 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  , b FROM t1;.   
c5f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
c600: 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 53 45 4c  rowid, a, b) SEL
c610: 45 43 54 20 61 2b 33 2c 20 62 2c 20 62 20 46 52  ECT a+3, b, b FR
c620: 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49  OM t1;.} {1 {PRI
c630: 4d 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65  MARY KEY must be
c640: 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65   unique}}.do_exe
c650: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c660: 2d 31 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d  -14.1.5 {.  COMM
c670: 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  IT;.  SELECT * F
c680: 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20 32  ROM t1;.} {1 2 2
c690: 20 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   2}..#----------
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a  ---------------.
c6e0: 23 20 54 65 73 74 20 6f 70 65 6e 69 6e 67 20 61  # Test opening a
c6f0: 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70  nd closing the p
c700: 61 67 65 72 20 73 75 62 2d 73 79 73 74 65 6d 20  ager sub-system 
c710: 77 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 76  with different v
c720: 61 6c 75 65 73 0a 23 20 66 6f 72 20 74 68 65 20  alues.# for the 
c730: 73 71 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73  sqlite3_vfs.szOs
c740: 46 69 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a 23  File variable..#
c750: 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65  .faultsim_delete
c760: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65  _and_reopen.do_e
c770: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
c780: 72 31 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45 41  r1-15.0 {.  CREA
c790: 54 45 20 54 41 42 4c 45 20 74 78 28 79 2c 20 7a  TE TABLE tx(y, z
c7a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
c7b0: 20 74 78 20 56 41 4c 55 45 53 28 27 41 79 75 74   tx VALUES('Ayut
c7c0: 74 68 61 79 61 27 2c 20 27 42 65 69 6a 69 6e 67  thaya', 'Beijing
c7d0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
c7e0: 4f 20 74 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e  O tx VALUES('Lon
c7f0: 64 6f 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a  don', 'Tokyo');.
c800: 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f  } {}.db close.fo
c810: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c  r {set i 0} {$i<
c820: 35 31 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20  513} {incr i 3} 
c830: 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d  {.  testvfs tv -
c840: 64 65 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66  default 1 -szosf
c850: 69 6c 65 20 24 69 0a 20 20 73 71 6c 69 74 65 33  ile $i.  sqlite3
c860: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f   db test.db.  do
c870: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
c880: 67 65 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20  ger1-15.$i.1 {. 
c890: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
c8a0: 20 74 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68   tx;.  } {Ayutth
c8b0: 61 79 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64  aya Beijing Lond
c8c0: 6f 6e 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63  on Tokyo}.  db c
c8d0: 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65  lose.  tv delete
c8e0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
c930: 20 43 68 65 63 6b 20 74 68 61 74 20 69 74 20 69   Check that it i
c940: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
c950: 6f 20 6f 70 65 6e 20 61 20 64 61 74 61 62 61 73  o open a databas
c960: 65 20 66 69 6c 65 20 69 66 20 74 68 65 20 66 75  e file if the fu
c970: 6c 6c 20 70 61 74 68 0a 23 20 74 6f 20 74 68 65  ll path.# to the
c980: 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72   associated jour
c990: 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
c9a0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 73 71 6c   longer than sql
c9b0: 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
c9c0: 61 6d 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74  ame..#.testvfs t
c9d0: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20  v -default 1.tv 
c9e0: 73 63 72 69 70 74 20 78 4f 70 65 6e 43 62 0a 74  script xOpenCb.t
c9f0: 76 20 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70  v filter xOpen.p
ca00: 72 6f 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74  roc xOpenCb {met
ca10: 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67  hod filename arg
ca20: 73 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c  s} {.  set ::fil
ca30: 65 5f 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65  e_len [string le
ca40: 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a  ngth $filename].
ca50: 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  }.sqlite3 db tes
ca60: 74 2e 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76  t.db.db close.tv
ca70: 20 64 65 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65   delete..for {se
ca80: 74 20 69 69 20 5b 65 78 70 72 20 24 3a 3a 66 69  t ii [expr $::fi
ca90: 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20  le_len-5]} {$ii 
caa0: 3c 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f  < [expr $::file_
cab0: 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69  len+20]} {incr i
cac0: 69 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74  i} {.  testvfs t
cad0: 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 6d 78  v -default 1 -mx
cae0: 70 61 74 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20  pathname $ii..  
caf0: 23 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  # The length of 
cb00: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f  the full path to
cb10: 20 66 69 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a   file "test.db-j
cb20: 6f 75 72 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66  ournal" is ($::f
cb30: 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20  ile_len+8)..  # 
cb40: 49 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65  If the configure
cb50: 64 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  d sqlite3_vfs.mx
cb60: 50 61 74 68 6e 61 6d 65 20 76 61 6c 75 65 20 67  Pathname value g
cb70: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
cb80: 71 75 61 6c 20 74 6f 0a 20 20 23 20 74 68 69 73  qual to.  # this
cb90: 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  , then the file 
cba0: 63 61 6e 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f  can be opened. O
cbb0: 74 68 65 72 77 69 73 65 2c 20 69 74 20 63 61 6e  therwise, it can
cbc0: 6e 6f 74 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24  not..  #.  if {$
cbd0: 69 69 20 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66  ii >= [expr $::f
cbe0: 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20  ile_len+8]} {.  
cbf0: 20 20 73 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d    set res {0 {}}
cc00: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
cc10: 73 65 74 20 72 65 73 20 7b 31 20 7b 75 6e 61 62  set res {1 {unab
cc20: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
cc30: 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a  ase file}}.  }..
cc40: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
cc50: 2d 31 36 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20  -16.1.$ii {.    
cc60: 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71  list [catch { sq
cc70: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
cc80: 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d   } msg] $msg.  }
cc90: 20 24 72 65 73 0a 0a 20 20 63 61 74 63 68 20 7b   $res..  catch {
cca0: 64 62 20 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64  db close}.  tv d
ccb0: 65 6c 65 74 65 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  elete.}...#-----
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd00: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20  ----.# Test the 
cd10: 70 61 67 65 72 73 20 72 65 73 70 6f 6e 73 65 20  pagers response 
cd20: 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  to the b-tree la
cd30: 79 65 72 20 72 65 71 75 65 73 74 69 6e 67 20 69  yer requesting i
cd40: 6c 6c 65 67 61 6c 20 70 61 67 65 20 0a 23 20 6e  llegal page .# n
cd50: 75 6d 62 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20  umbers:.#.#   + 
cd60: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65  The locking page
cd70: 2c 0a 23 20 20 20 2b 20 50 61 67 65 20 30 2c 0a  ,.#   + Page 0,.
cd80: 23 20 20 20 2b 20 41 20 70 61 67 65 20 77 69 74  #   + A page wit
cd90: 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  h a page number 
cda0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 28 32 5e  greater than (2^
cdb0: 33 31 2d 31 29 2e 0a 23 0a 23 20 54 68 65 73 65  31-1)..#.# These
cdc0: 20 74 65 73 74 73 20 77 69 6c 6c 20 6e 6f 74 20   tests will not 
cdd0: 77 6f 72 6b 20 69 66 20 53 51 4c 49 54 45 5f 44  work if SQLITE_D
cde0: 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
cdf0: 45 41 44 20 69 73 20 64 65 66 69 6e 65 64 2e 20  EAD is defined. 
ce00: 49 6e 0a 23 20 74 68 61 74 20 63 61 73 65 20 49  In.# that case I
ce10: 4f 20 65 72 72 6f 72 73 20 61 72 65 20 73 6f 6d  O errors are som
ce20: 65 74 69 6d 65 73 20 72 65 70 6f 72 74 65 64 20  etimes reported 
ce30: 69 6e 73 74 65 61 64 20 6f 66 20 53 51 4c 49 54  instead of SQLIT
ce40: 45 5f 43 4f 52 52 55 50 54 2e 0a 23 0a 69 66 63  E_CORRUPT..#.ifc
ce50: 61 70 61 62 6c 65 20 21 64 69 72 65 63 74 5f 72  apable !direct_r
ce60: 65 61 64 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61  ead {.do_test pa
ce70: 67 65 72 31 2d 31 38 2e 31 20 7b 0a 20 20 66 61  ger1-18.1 {.  fa
ce80: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
ce90: 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
cea0: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
ceb0: 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
cec0: 20 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67   .    PRAGMA pag
ced0: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
cee0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
cef0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
cf00: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
cf10: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30  UES(a_string(500
cf20: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
cf30: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
cf40: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
cf50: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
cf60: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
cf70: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
cf80: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
cf90: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
cfa0: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
cfb0: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
cfc0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
cfd0: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
cfe0: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
cff0: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
d000: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
d010: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
d020: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
d030: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
d040: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
d050: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
d060: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
d070: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
d080: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
d090: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
d0a0: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
d0b0: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
d0c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
d0d0: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
d0e0: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
d0f0: 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  1;.  }.} {}.do_t
d100: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 32 20  est pager1-18.2 
d110: 7b 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62  {.  set root [db
d120: 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f   one "SELECT roo
d130: 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74  tpage FROM sqlit
d140: 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 73 65 74  e_master"].  set
d150: 20 6c 6f 63 6b 69 6e 67 70 61 67 65 20 5b 65 78   lockingpage [ex
d160: 70 72 20 28 30 78 31 30 30 30 30 2f 31 30 32 34  pr (0x10000/1024
d170: 29 20 2b 20 31 5d 0a 20 20 65 78 65 63 73 71 6c  ) + 1].  execsql
d180: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72   {.    PRAGMA wr
d190: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
d1a0: 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73 71  1;.    UPDATE sq
d1b0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54 20  lite_master SET 
d1c0: 72 6f 6f 74 70 61 67 65 20 3d 20 24 6c 6f 63 6b  rootpage = $lock
d1d0: 69 6e 67 70 61 67 65 3b 0a 20 20 7d 0a 20 20 73  ingpage;.  }.  s
d1e0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
d1f0: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  db.  catchsql { 
d200: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
d210: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20  FROM t1 } db2.} 
d220: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
d230: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
d240: 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65  rmed}}.db2 close
d250: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
d260: 31 38 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  18.3.1 {.  execs
d270: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
d280: 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20  TABLE t2(x);.   
d290: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
d2a0: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
d2b0: 35 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65  5000));.  }.  se
d2c0: 74 20 70 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66  t pgno [expr ([f
d2d0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
d2e0: 5d 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20 20 68  ] / 1024)-2].  h
d2f0: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
d300: 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d  db [expr ($pgno-
d310: 31 29 2a 31 30 32 34 5d 20 30 30 30 30 30 30 30  1)*1024] 0000000
d320: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  0.  sqlite3 db2 
d330: 74 65 73 74 2e 64 62 0a 20 20 23 20 65 76 65 6e  test.db.  # even
d340: 20 74 68 6f 75 67 68 20 78 20 69 73 20 6d 61 6c   though x is mal
d350: 66 6f 72 6d 65 64 2c 20 62 65 63 61 75 73 65 20  formed, because 
d360: 74 79 70 65 6f 66 28 29 20 64 6f 65 73 0a 20 20  typeof() does.  
d370: 23 20 6e 6f 74 20 6c 6f 61 64 20 74 68 65 20 63  # not load the c
d380: 6f 6e 74 65 6e 74 20 6f 66 20 78 2c 20 74 68 65  ontent of x, the
d390: 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 6e 6f   error is not no
d3a0: 74 69 63 65 64 2e 0a 20 20 63 61 74 63 68 73 71  ticed..  catchsq
d3b0: 6c 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f  l { SELECT typeo
d3c0: 66 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64  f(x) FROM t2 } d
d3d0: 62 32 0a 7d 20 7b 30 20 74 65 78 74 7d 0a 64 6f  b2.} {0 text}.do
d3e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e  _test pager1-18.
d3f0: 33 2e 32 20 7b 0a 20 20 23 20 69 6e 20 74 68 69  3.2 {.  # in thi
d400: 73 20 63 61 73 65 2c 20 74 68 65 20 76 61 6c 75  s case, the valu
d410: 65 20 6f 66 20 78 20 69 73 20 6c 6f 61 64 65 64  e of x is loaded
d420: 20 61 6e 64 20 73 6f 20 74 68 65 20 65 72 72 6f   and so the erro
d430: 72 20 69 73 0a 20 20 23 20 64 65 74 65 63 74 65  r is.  # detecte
d440: 64 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  d.  catchsql { S
d450: 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 7c 7c  ELECT length(x||
d460: 27 27 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  '') FROM t2 } db
d470: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
d480: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
d490: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63  alformed}}.db2 c
d4a0: 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67  lose.do_test pag
d4b0: 65 72 31 2d 31 38 2e 33 2e 33 20 7b 0a 20 20 65  er1-18.3.3 {.  e
d4c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
d4d0: 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  ETE FROM t2;.   
d4e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
d4f0: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
d500: 62 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20  b(5000));.  }.  
d510: 73 65 74 20 70 67 6e 6f 20 5b 65 78 70 72 20 28  set pgno [expr (
d520: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
d530: 64 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20  db] / 1024)-2]. 
d540: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
d550: 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e  t.db [expr ($pgn
d560: 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30 30 30 30  o-1)*1024] 00000
d570: 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62  000.  sqlite3 db
d580: 32 20 74 65 73 74 2e 64 62 0a 20 20 23 20 65 76  2 test.db.  # ev
d590: 65 6e 20 74 68 6f 75 67 68 20 78 20 69 73 20 6d  en though x is m
d5a0: 61 6c 66 6f 72 6d 65 64 2c 20 62 65 63 61 75 73  alformed, becaus
d5b0: 65 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74  e length() and t
d5c0: 79 70 65 6f 66 28 29 20 64 6f 0a 20 20 23 20 6e  ypeof() do.  # n
d5d0: 6f 74 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74  ot load the cont
d5e0: 65 6e 74 20 6f 66 20 78 2c 20 74 68 65 20 65 72  ent of x, the er
d5f0: 72 6f 72 20 69 73 20 6e 6f 74 20 6e 6f 74 69 63  ror is not notic
d600: 65 64 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  ed..  catchsql {
d610: 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78   SELECT length(x
d620: 29 2c 20 74 79 70 65 6f 66 28 78 29 20 46 52 4f  ), typeof(x) FRO
d630: 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 30 20  M t2 } db2.} {0 
d640: 7b 35 30 30 30 20 62 6c 6f 62 7d 7d 0a 64 6f 5f  {5000 blob}}.do_
d650: 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 33  test pager1-18.3
d660: 2e 34 20 7b 0a 20 20 23 20 69 6e 20 74 68 69 73  .4 {.  # in this
d670: 20 63 61 73 65 2c 20 74 68 65 20 76 61 6c 75 65   case, the value
d680: 20 6f 66 20 78 20 69 73 20 6c 6f 61 64 65 64 20   of x is loaded 
d690: 61 6e 64 20 73 6f 20 74 68 65 20 65 72 72 6f 72  and so the error
d6a0: 20 69 73 0a 20 20 23 20 64 65 74 65 63 74 65 64   is.  # detected
d6b0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d6c0: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 7c 7c 27  LECT length(x||'
d6d0: 27 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32  ') FROM t2 } db2
d6e0: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
d6f0: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
d700: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c  lformed}}.db2 cl
d710: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ose.do_test page
d720: 72 31 2d 31 38 2e 34 20 7b 0a 20 20 68 65 78 69  r1-18.4 {.  hexi
d730: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
d740: 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a  [expr ($pgno-1)*
d750: 31 30 32 34 5d 20 39 30 30 30 30 30 30 30 0a 20  1024] 90000000. 
d760: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
d770: 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20  t.db.  catchsql 
d780: 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28  { SELECT length(
d790: 78 7c 7c 27 27 29 20 46 52 4f 4d 20 74 32 20 7d  x||'') FROM t2 }
d7a0: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
d7b0: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d7c0: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
d7d0: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
d7e0: 70 61 67 65 72 31 2d 31 38 2e 35 20 7b 0a 20 20  pager1-18.5 {.  
d7f0: 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20 20  sqlite3 db "".  
d800: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
d810: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
d820: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
d830: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
d840: 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61      PRAGMA writa
d850: 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a  ble_schema = 1;.
d860: 20 20 20 20 55 50 44 41 54 45 20 73 71 6c 69 74      UPDATE sqlit
d870: 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f  e_master SET roo
d880: 74 70 61 67 65 3d 35 20 57 48 45 52 45 20 74 62  tpage=5 WHERE tb
d890: 6c 5f 6e 61 6d 65 20 3d 20 27 74 31 27 3b 0a 20  l_name = 't1';. 
d8a0: 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62     PRAGMA writab
d8b0: 6c 65 5f 73 63 68 65 6d 61 20 3d 20 30 3b 0a 20  le_schema = 0;. 
d8c0: 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74     ALTER TABLE t
d8d0: 31 20 52 45 4e 41 4d 45 20 54 4f 20 78 31 3b 0a  1 RENAME TO x1;.
d8e0: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b    }.  catchsql {
d8f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
d900: 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 }.} {1 {databa
d910: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
d920: 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 20   malformed}}.db 
d930: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70  close..do_test p
d940: 61 67 65 72 31 2d 31 38 2e 36 20 7b 0a 20 20 66  ager1-18.6 {.  f
d950: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
d960: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
d970: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
d980: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
d990: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
d9a0: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
d9b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d9c0: 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52  t1(x);.    INSER
d9d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
d9e0: 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b  (a_string(800));
d9f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
da00: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
da10: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 7d 0a 0a  ing(800));.  }..
da20: 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f    set root [db o
da30: 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 70  ne "SELECT rootp
da40: 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  age FROM sqlite_
da50: 6d 61 73 74 65 72 22 5d 0a 20 20 64 62 20 63 6c  master"].  db cl
da60: 6f 73 65 0a 0a 20 20 68 65 78 69 6f 5f 77 72 69  ose..  hexio_wri
da70: 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72  te test.db [expr
da80: 20 28 24 72 6f 6f 74 2d 31 29 2a 31 30 32 34 20   ($root-1)*1024 
da90: 2b 20 38 5d 20 30 30 30 30 30 30 30 30 0a 20 20  + 8] 00000000.  
daa0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
dab0: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  db.  catchsql { 
dac0: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29  SELECT length(x)
dad0: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20   FROM t1 }.} {1 
dae0: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
daf0: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
db00: 64 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  d}}.}..do_test p
db10: 61 67 65 72 31 2d 31 39 2e 31 20 7b 0a 20 20 73  ager1-19.1 {.  s
db20: 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20 20 64  qlite3 db "".  d
db30: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
db40: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
db50: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
db60: 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b  page_size = 512;
db70: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
db80: 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20  _vacuum = 1;.   
db90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
dba0: 28 61 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c  (aa, ab, ac, ad,
dbb0: 20 61 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c   ae, af, ag, ah,
dbc0: 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c   ai, aj, ak, al,
dbd0: 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20   am, an,.       
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61 2c               ba,
dbf0: 20 62 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c   bb, bc, bd, be,
dc00: 20 62 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c   bf, bg, bh, bi,
dc10: 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c   bj, bk, bl, bm,
dc20: 20 62 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   bn,.           
dc30: 20 20 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c           ca, cb,
dc40: 20 63 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c   cc, cd, ce, cf,
dc50: 20 63 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c   cg, ch, ci, cj,
dc60: 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c   ck, cl, cm, cn,
dc70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dc80: 20 20 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c       da, db, dc,
dc90: 20 64 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c   dd, de, df, dg,
dca0: 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c   dh, di, dj, dk,
dcb0: 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20   dl, dm, dn,.   
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 65 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c   ea, eb, ec, ed,
dce0: 20 65 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c   ee, ef, eg, eh,
dcf0: 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c   ei, ej, ek, el,
dd00: 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20   em, en,.       
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 2c               fa,
dd20: 20 66 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c   fb, fc, fd, fe,
dd30: 20 66 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c   ff, fg, fh, fi,
dd40: 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c   fj, fk, fl, fm,
dd50: 20 66 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   fn,.           
dd60: 20 20 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c           ga, gb,
dd70: 20 67 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c   gc, gd, ge, gf,
dd80: 20 67 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c   gg, gh, gi, gj,
dd90: 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c   gk, gl, gm, gn,
dda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ddb0: 20 20 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c       ha, hb, hc,
ddc0: 20 68 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c   hd, he, hf, hg,
ddd0: 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c   hh, hi, hj, hk,
dde0: 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20   hl, hm, hn,.   
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 69 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c   ia, ib, ic, id,
de10: 20 69 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c   ie, if, ig, ih,
de20: 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c   ii, ij, ik, il,
de30: 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20   im, ix,.       
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c               ja,
de50: 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c   jb, jc, jd, je,
de60: 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c   jf, jg, jh, ji,
de70: 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c   jj, jk, jl, jm,
de80: 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   jn,.           
de90: 20 20 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c           ka, kb,
dea0: 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c   kc, kd, ke, kf,
deb0: 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c   kg, kh, ki, kj,
dec0: 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c   kk, kl, km, kn,
ded0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dee0: 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c       la, lb, lc,
def0: 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c   ld, le, lf, lg,
df00: 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c   lh, li, lj, lk,
df10: 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20   ll, lm, ln,.   
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c   ma, mb, mc, md,
df40: 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c   me, mf, mg, mh,
df50: 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c   mi, mj, mk, ml,
df60: 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20   mm, mn.    );. 
df70: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
df80: 74 32 28 61 61 2c 20 61 62 2c 20 61 63 2c 20 61  t2(aa, ab, ac, a
df90: 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c 20 61  d, ae, af, ag, a
dfa0: 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61  h, ai, aj, ak, a
dfb0: 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20  l, am, an,.     
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
dfd0: 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c 20 62  a, bb, bc, bd, b
dfe0: 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c 20 62  e, bf, bg, bh, b
dff0: 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62  i, bj, bk, bl, b
e000: 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, bn,.         
e010: 20 20 20 20 20 20 20 20 20 20 20 63 61 2c 20 63             ca, c
e020: 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c 20 63  b, cc, cd, ce, c
e030: 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c 20 63  f, cg, ch, ci, c
e040: 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63  j, ck, cl, cm, c
e050: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e060: 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c 20 64         da, db, d
e070: 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c 20 64  c, dd, de, df, d
e080: 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64  g, dh, di, dj, d
e090: 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20  k, dl, dm, dn,. 
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c 20 65     ea, eb, ec, e
e0c0: 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c 20 65  d, ee, ef, eg, e
e0d0: 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65  h, ei, ej, ek, e
e0e0: 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20  l, em, en,.     
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
e100: 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c 20 66  a, fb, fc, fd, f
e110: 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c 20 66  e, ff, fg, fh, f
e120: 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66  i, fj, fk, fl, f
e130: 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, fn,.         
e140: 20 20 20 20 20 20 20 20 20 20 20 67 61 2c 20 67             ga, g
e150: 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c 20 67  b, gc, gd, ge, g
e160: 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c 20 67  f, gg, gh, gi, g
e170: 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67  j, gk, gl, gm, g
e180: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e190: 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c 20 68         ha, hb, h
e1a0: 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c 20 68  c, hd, he, hf, h
e1b0: 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68  g, hh, hi, hj, h
e1c0: 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20  k, hl, hm, hn,. 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c 20 69     ia, ib, ic, i
e1f0: 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c 20 69  d, ie, if, ig, i
e200: 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69  h, ii, ij, ik, i
e210: 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20  l, im, ix,.     
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
e230: 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a  a, jb, jc, jd, j
e240: 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a  e, jf, jg, jh, j
e250: 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a  i, jj, jk, jl, j
e260: 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, jn,.         
e270: 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c 20 6b             ka, k
e280: 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b  b, kc, kd, ke, k
e290: 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b  f, kg, kh, ki, k
e2a0: 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b  j, kk, kl, km, k
e2b0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e2c0: 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c         la, lb, l
e2d0: 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c  c, ld, le, lf, l
e2e0: 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c  g, lh, li, lj, l
e2f0: 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20  k, ll, lm, ln,. 
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d     ma, mb, mc, m
e320: 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d  d, me, mf, mg, m
e330: 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d  h, mi, mj, mk, m
e340: 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b  l, mm, mn.    );
e350: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
e360: 20 74 31 28 61 61 29 20 56 41 4c 55 45 53 28 20   t1(aa) VALUES( 
e370: 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30 30 29  a_string(100000)
e380: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
e390: 4e 54 4f 20 74 32 28 61 61 29 20 56 41 4c 55 45  NTO t2(aa) VALUE
e3a0: 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30 30 30  S( a_string(1000
e3b0: 30 30 29 20 29 3b 0a 20 20 20 20 56 41 43 55 55  00) );.    VACUU
e3c0: 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d  M;.  }.} {}..#--
e3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e410: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 61  -------.# Test a
e420: 20 63 6f 75 70 6c 65 20 6f 66 20 73 70 65 63 69   couple of speci
e430: 61 6c 20 63 61 73 65 73 20 74 68 61 74 20 63 6f  al cases that co
e440: 6d 65 20 75 70 20 77 68 69 6c 65 20 63 6f 6d 6d  me up while comm
e450: 69 74 74 69 6e 67 20 0a 23 20 74 72 61 6e 73 61  itting .# transa
e460: 63 74 69 6f 6e 73 3a 0a 23 0a 23 20 20 20 70 61  ctions:.#.#   pa
e470: 67 65 72 31 2d 32 30 2e 31 2e 2a 3a 20 43 6f 6d  ger1-20.1.*: Com
e480: 6d 69 74 74 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  mitting an in-me
e490: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 72  mory database tr
e4a0: 61 6e 73 61 63 74 69 6f 6e 20 77 68 65 6e 20 74  ansaction when t
e4b0: 68 65 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  he .#           
e4c0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
e4d0: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
e4e0: 69 66 69 65 64 20 61 74 20 61 6c 6c 2e 0a 23 0a  ified at all..#.
e4f0: 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e 32 2e  #   pager1-20.2.
e500: 2a 3a 20 41 73 20 61 62 6f 76 65 2c 20 62 75 74  *: As above, but
e510: 20 77 69 74 68 20 61 20 6e 6f 72 6d 61 6c 20 64   with a normal d
e520: 62 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  b in exclusive-l
e530: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 23 0a 23  ocking mode..#.#
e540: 20 20 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 2a     pager1-20.3.*
e550: 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  : Committing a t
e560: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 57 41  ransaction in WA
e570: 4c 20 6d 6f 64 65 20 77 68 65 72 65 20 74 68 65  L mode where the
e580: 20 64 61 74 61 62 61 73 65 20 68 61 73 0a 23 20   database has.# 
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20   been modified, 
e5b0: 62 75 74 20 61 6c 6c 20 64 69 72 74 79 20 70 61  but all dirty pa
e5c0: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 66 6c  ges have been fl
e5d0: 75 73 68 65 64 20 74 6f 20 0a 23 20 20 20 20 20  ushed to .#     
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
e5f0: 6b 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d  k before the com
e600: 6d 69 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  mit..#.do_test p
e610: 61 67 65 72 31 2d 32 30 2e 31 2e 31 20 7b 0a 20  ager1-20.1.1 {. 
e620: 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65   catch {db close
e630: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a  }.  sqlite3 db :
e640: 6d 65 6d 6f 72 79 3a 0a 20 20 65 78 65 63 73 71  memory:.  execsq
e650: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
e660: 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68  ABLE one(two, th
e670: 72 65 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ree);.    INSERT
e680: 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53   INTO one VALUES
e690: 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a  ('a', 'b');.  }.
e6a0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
e6b0: 65 72 31 2d 32 30 2e 31 2e 32 20 7b 0a 20 20 65  er1-20.1.2 {.  e
e6c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
e6d0: 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  IN EXCLUSIVE;.  
e6e0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
e6f0: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {}..do_test page
e700: 72 31 2d 32 30 2e 32 2e 31 20 7b 0a 20 20 66 61  r1-20.2.1 {.  fa
e710: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
e720: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
e730: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
e740: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65  locking_mode = e
e750: 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 50 52  xclusive;.    PR
e760: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
e770: 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20  e = persist;.   
e780: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e   CREATE TABLE on
e790: 65 28 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20  e(two, three);. 
e7a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f     INSERT INTO o
e7b0: 6e 65 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  ne VALUES('a', '
e7c0: 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c  b');.  }.} {excl
e7d0: 75 73 69 76 65 20 70 65 72 73 69 73 74 7d 0a 64  usive persist}.d
e7e0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30  o_test pager1-20
e7f0: 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.2 {.  execsql
e800: 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43   {.    BEGIN EXC
e810: 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d  LUSIVE;.    COMM
e820: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66  IT;.  }.} {}..if
e830: 20 7b 24 3a 3a 73 71 6c 69 74 65 5f 6f 70 74 69   {$::sqlite_opti
e840: 6f 6e 73 28 77 61 6c 29 20 26 26 20 5b 77 61 6c  ons(wal) && [wal
e850: 5f 69 73 5f 6f 6b 5d 7d 20 7b 0a 20 20 64 6f 5f  _is_ok]} {.  do_
e860: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33  test pager1-20.3
e870: 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  .1 {.    faultsi
e880: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
e890: 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20  pen.    db func 
e8a0: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
e8b0: 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  g.    execsql {.
e8c0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
e8d0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
e8e0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
e8f0: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20  al_mode = wal;. 
e900: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
e910: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e920: 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 20 20   t1(x);.        
e930: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
e940: 79 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  y);.        INSE
e950: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
e960: 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29  S(a_string(800))
e970: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
e980: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
e990: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
e9a0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
e9b0: 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 20  *   2 */.       
e9c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
e9d0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
e9e0: 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  800) FROM t1;   
e9f0: 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a        /*   4 */.
ea00: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
ea10: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
ea20: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
ea30: 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   t1;         /* 
ea40: 20 20 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 49    8 */.        I
ea50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
ea60: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
ea70: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
ea80: 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20      /*  16 */.  
ea90: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
eaa0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
eab0: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
eac0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 33  1;         /*  3
ead0: 32 20 2a 2f 0a 20 20 20 20 20 20 43 4f 4d 4d 49  2 */.      COMMI
eae0: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61  T;.    }.  } {wa
eaf0: 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  l}.  do_test pag
eb00: 65 72 31 2d 32 30 2e 33 2e 32 20 7b 0a 20 20 20  er1-20.3.2 {.   
eb10: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
eb20: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
eb30: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
eb40: 55 45 53 28 27 78 78 78 78 27 29 3b 0a 20 20 20  UES('xxxx');.   
eb50: 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65   }.    recursive
eb60: 5f 73 65 6c 65 63 74 20 33 32 20 74 31 0a 20 20  _select 32 t1.  
eb70: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
eb80: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .  } {}.}..#----
eb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebd0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
ebe0: 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  t a WAL database
ebf0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e   may not be open
ec00: 65 64 20 69 66 3a 0a 23 0a 23 20 20 20 70 61 67  ed if:.#.#   pag
ec10: 65 72 31 2d 32 31 2e 31 2e 2a 3a 20 54 68 65 20  er1-21.1.*: The 
ec20: 56 46 53 20 68 61 73 20 61 6e 20 69 56 65 72 73  VFS has an iVers
ec30: 69 6f 6e 20 6c 65 73 73 20 74 68 61 6e 20 32 2c  ion less than 2,
ec40: 20 6f 72 0a 23 20 20 20 70 61 67 65 72 31 2d 32   or.#   pager1-2
ec50: 31 2e 32 2e 2a 3a 20 54 68 65 20 56 46 53 20 64  1.2.*: The VFS d
ec60: 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20  oes not provide 
ec70: 78 53 68 6d 58 58 58 28 29 20 6d 65 74 68 6f 64  xShmXXX() method
ec80: 73 2e 0a 23 0a 69 66 20 7b 24 3a 3a 73 71 6c 69  s..#.if {$::sqli
ec90: 74 65 5f 6f 70 74 69 6f 6e 73 28 77 61 6c 29 20  te_options(wal) 
eca0: 26 26 20 5b 77 61 6c 5f 69 73 5f 6f 6b 5d 7d 20  && [wal_is_ok]} 
ecb0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  {.  do_test page
ecc0: 72 31 2d 32 31 2e 30 20 7b 0a 20 20 20 20 66 61  r1-21.0 {.    fa
ecd0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
ece0: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 65 78 65  d_reopen.    exe
ecf0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
ed00: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
ed10: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52   = WAL;.      CR
ed20: 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20  EATE TABLE ko(c 
ed30: 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62  DEFAULT 'abc', b
ed40: 20 44 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b   DEFAULT 'def');
ed50: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
ed60: 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41  TO ko DEFAULT VA
ed70: 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  LUES;.    }.  } 
ed80: 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20  {wal}.  do_test 
ed90: 70 61 67 65 72 31 2d 32 31 2e 31 20 7b 0a 20 20  pager1-21.1 {.  
eda0: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 6e 6f    testvfs tv -no
edb0: 73 68 6d 20 31 0a 20 20 20 20 73 71 6c 69 74 65  shm 1.    sqlite
edc0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76  3 db2 test.db -v
edd0: 66 73 20 74 76 0a 20 20 20 20 63 61 74 63 68 73  fs tv.    catchs
ede0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
edf0: 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20 20 7d 20  OM ko } db2.  } 
ee00: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70  {1 {unable to op
ee10: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
ee20: 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20  }}.  db2 close. 
ee30: 20 74 76 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f   tv delete.  do_
ee40: 74 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e 32  test pager1-21.2
ee50: 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74   {.    testvfs t
ee60: 76 20 2d 69 76 65 72 73 69 6f 6e 20 31 0a 20 20  v -iversion 1.  
ee70: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
ee80: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20  st.db -vfs tv.  
ee90: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
eea0: 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20  ECT * FROM ko } 
eeb0: 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75 6e 61 62  db2.  } {1 {unab
eec0: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
eed0: 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 64 62 32  ase file}}.  db2
eee0: 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65   close.  tv dele
eef0: 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  te.}..#---------
ef00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef40: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20 22  .# Test that a "
ef50: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
ef60: 70 6f 69 6e 74 22 3a 0a 23 0a 23 20 20 20 70 61  point":.#.#   pa
ef70: 67 65 72 31 2d 32 32 2e 31 2e 2a 3a 20 69 73 20  ger1-22.1.*: is 
ef80: 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61 20 6e 6f 6e  a no-op on a non
ef90: 2d 57 41 4c 20 64 62 2c 20 61 6e 64 0a 23 20 20  -WAL db, and.#  
efa0: 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 2a 3a 20   pager1-22.2.*: 
efb0: 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 78  does not cause x
efc0: 53 79 6e 63 20 63 61 6c 6c 73 20 77 69 74 68 20  Sync calls with 
efd0: 61 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f 66  a synchronous=of
efe0: 66 20 64 62 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  f db..#.do_test 
eff0: 70 61 67 65 72 31 2d 32 32 2e 31 2e 31 20 7b 0a  pager1-22.1.1 {.
f000: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
f010: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
f020: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
f030: 41 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20 44  ATE TABLE ko(c D
f040: 45 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62 20  EFAULT 'abc', b 
f050: 44 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b 0a  DEFAULT 'def');.
f060: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f070: 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45  ko DEFAULT VALUE
f080: 53 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  S;.  }.  execsql
f090: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
f0a0: 65 63 6b 70 6f 69 6e 74 20 7d 0a 7d 20 7b 30 20  eckpoint }.} {0 
f0b0: 2d 31 20 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 70  -1 -1}.do_test p
f0c0: 61 67 65 72 31 2d 32 32 2e 32 2e 31 20 7b 0a 20  ager1-22.2.1 {. 
f0d0: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
f0e0: 61 75 6c 74 20 31 0a 20 20 74 76 20 66 69 6c 74  ault 1.  tv filt
f0f0: 65 72 20 78 53 79 6e 63 0a 20 20 74 76 20 73 63  er xSync.  tv sc
f100: 72 69 70 74 20 78 53 79 6e 63 43 62 0a 20 20 70  ript xSyncCb.  p
f110: 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 61 72 67  roc xSyncCb {arg
f120: 73 7d 20 7b 69 6e 63 72 20 3a 3a 73 79 6e 63 63  s} {incr ::syncc
f130: 6f 75 6e 74 7d 0a 20 20 73 71 6c 69 74 65 33 20  ount}.  sqlite3 
f140: 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20  db test.db..  # 
f150: 53 77 69 74 63 68 20 74 68 65 20 64 62 20 74 6f  Switch the db to
f160: 20 57 41 4c 20 6d 6f 64 65 2e 20 41 6e 64 20 74   WAL mode. And t
f170: 68 65 6e 20 65 78 65 63 75 74 65 20 61 20 53 45  hen execute a SE
f180: 4c 45 43 54 20 74 6f 20 6d 61 6b 65 20 73 75 72  LECT to make sur
f190: 65 0a 20 20 23 20 74 68 61 74 20 74 68 65 20 57  e.  # that the W
f1a0: 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  AL file is open.
f1b0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
f1c0: 6d 61 79 20 63 68 61 6e 67 65 20 74 68 65 20 73  may change the s
f1d0: 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 23 20 73  ynchronous.  # s
f1e0: 65 74 74 69 6e 67 20 69 66 20 44 45 46 41 55 4c  etting if DEFAUL
f1f0: 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45  T_WAL_SAFETYLEVE
f200: 4c 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20  L is defined..  
f210: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
f220: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f230: 57 41 4c 20 3b 20 53 45 4c 45 43 54 20 2a 20 46  WAL ; SELECT * F
f240: 52 4f 4d 20 6b 6f 20 7d 0a 0a 20 20 23 20 53 65  ROM ko }..  # Se
f250: 74 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46  t synchronous=OF
f260: 46 2e 20 49 6e 73 65 72 74 20 73 6f 6d 65 20 64  F. Insert some d
f270: 61 74 61 20 61 6e 64 20 72 75 6e 20 61 20 63 68  ata and run a ch
f280: 65 63 6b 70 6f 69 6e 74 2e 20 53 69 6e 63 65 0a  eckpoint. Since.
f290: 20 20 23 20 73 79 6e 63 3d 6f 66 66 2c 20 74 68    # sync=off, th
f2a0: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61  is should not ca
f2b0: 75 73 65 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f  use any calls to
f2c0: 20 74 68 65 20 78 53 79 6e 63 28 29 20 6d 65 74   the xSync() met
f2d0: 68 6f 64 2e 0a 20 20 73 65 74 20 3a 3a 73 79 6e  hod..  set ::syn
f2e0: 63 63 6f 75 6e 74 20 30 0a 20 20 65 78 65 63 73  ccount 0.  execs
f2f0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
f300: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6f 66  synchronous = of
f310: 66 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  f;.    INSERT IN
f320: 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41  TO ko DEFAULT VA
f330: 4c 55 45 53 3b 0a 20 20 20 20 50 52 41 47 4d 41  LUES;.    PRAGMA
f340: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b   wal_checkpoint;
f350: 0a 20 20 7d 0a 20 20 73 65 74 20 73 79 6e 63 63  .  }.  set syncc
f360: 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d  ount.} {0}..#---
f370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3b0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66  ------.# Tests f
f3c0: 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a 6f 75 72  or changing jour
f3d0: 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20  nal mode..#.#   
f3e0: 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a 3a 20 54  pager1-23.1.*: T
f3f0: 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 63 68  est that when ch
f400: 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50 45 52 53  anging from PERS
f410: 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 6d 6f  IST to DELETE mo
f420: 64 65 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20  de,.#           
f430: 20 20 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e         the journ
f440: 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  al file is delet
f450: 65 64 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  ed..#.#   pager1
f460: 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65  -23.2.*: Same te
f470: 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74  st as above, but
f480: 20 77 68 69 6c 65 20 61 20 73 68 61 72 65 64 20   while a shared 
f490: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20  lock is held.#  
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f4c0: 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65  file..#.#   page
f4d0: 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d 65 20  r1-23.3.*: Same 
f4e0: 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62  test as above, b
f4f0: 75 74 20 77 68 69 6c 65 20 61 20 72 65 73 65 72  ut while a reser
f500: 76 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ved lock is held
f510: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
f520: 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
f530: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20  ase file..#.#   
f540: 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a 3a 20 41  pager1-23.4.*: A
f550: 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20 77 68 69  nd, for fun, whi
f560: 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  le holding an ex
f570: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 23 0a  clusive lock..#.
f580: 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  #   pager1-23.5.
f590: 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 76 61  *: Try to set va
f5a0: 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20  rious different 
f5b0: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 77 69  journal modes wi
f5c0: 74 68 20 61 6e 0a 23 20 20 20 20 20 20 20 20 20  th an.#         
f5d0: 20 20 20 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f           in-memo
f5e0: 72 79 20 64 61 74 61 62 61 73 65 20 28 6f 6e 6c  ry database (onl
f5f0: 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20 4f 46 46  y MEMORY and OFF
f600: 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a 23   should work)..#
f610: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 36  .#   pager1-23.6
f620: 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 6c  .*: Try to set l
f630: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
f640: 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  al on an in-memo
f650: 72 79 20 64 61 74 61 62 61 73 65 0a 23 20 20 20  ry database.#   
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f670: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 2d 20 69  doesn't work - i
f680: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
f690: 65 73 20 61 6c 77 61 79 73 20 75 73 65 0a 23 20  es always use.# 
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
f6c0: 63 6c 75 73 69 76 65 29 2e 0a 23 0a 64 6f 5f 74  clusive)..#.do_t
f6d0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  est pager1-23.1.
f6e0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
f6f0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
f700: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f710: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f720: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
f730: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
f740: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20   t1(a, b);.  }. 
f750: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
f760: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
f770: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
f780: 31 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65  1-23.1.2 {.  exe
f790: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
f7a0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
f7b0: 45 54 45 20 7d 0a 20 20 66 69 6c 65 20 65 78 69  ETE }.  file exi
f7c0: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
f7d0: 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65  nal.} {0}..do_te
f7e0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 31  st pager1-23.2.1
f7f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
f800: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
f810: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
f820: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
f830: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 43 61 6e  O t1 VALUES('Can
f840: 62 65 72 72 61 27 2c 20 27 41 43 54 27 29 3b 0a  berra', 'ACT');.
f850: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
f860: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
f870: 20 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c   } {.    db eval
f880: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f890: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
f8a0: 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  }.  }.  execsql 
f8b0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
f8c0: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
f8d0: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
f8e0: 31 2d 32 33 2e 32 2e 32 20 7b 0a 20 20 66 69 6c  1-23.2.2 {.  fil
f8f0: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
f900: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a  -journal.} {0}..
f910: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f920: 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.3.1 {.  execsq
f930: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
f940: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
f950: 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52  RSIST;.    INSER
f960: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
f970: 28 27 44 61 72 77 69 6e 27 2c 20 27 4e 54 27 29  ('Darwin', 'NT')
f980: 3b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45  ;.    BEGIN IMME
f990: 44 49 41 54 45 3b 0a 20 20 7d 0a 20 20 64 62 20  DIATE;.  }.  db 
f9a0: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
f9b0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
f9c0: 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
f9d0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
f9e0: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
f9f0: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
fa00: 31 2d 32 33 2e 33 2e 32 20 7b 0a 20 20 66 69 6c  1-23.3.2 {.  fil
fa10: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
fa20: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
fa30: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
fa40: 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.3 {.  execsql
fa50: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
fa60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fa70: 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
fa80: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
fa90: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
faa0: 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  IST;.    INSERT 
fab0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
fac0: 41 64 65 6c 61 69 64 65 27 2c 20 27 53 41 27 29  Adelaide', 'SA')
fad0: 3b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c  ;.    BEGIN EXCL
fae0: 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 64 62 20  USIVE;.  }.  db 
faf0: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
fb00: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
fb10: 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
fb20: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
fb30: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
fb40: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
fb50: 31 2d 32 33 2e 34 2e 32 20 7b 0a 20 20 66 69 6c  1-23.4.2 {.  fil
fb60: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
fb70: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
fb80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
fb90: 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.3 {.  execsql
fba0: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
fbb0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fbc0: 35 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  5.1 {.  faultsim
fbd0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
fbe0: 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  en.  sqlite3 db 
fbf0: 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66 6f  :memory:.} {}.fo
fc00: 72 65 61 63 68 20 7b 74 6e 20 6d 6f 64 65 20 70  reach {tn mode p
fc10: 6f 73 73 69 62 6c 65 7d 20 7b 0a 20 20 32 20 20  ossible} {.  2  
fc20: 6f 66 66 20 20 20 20 20 20 31 0a 20 20 33 20 20  off      1.  3  
fc30: 6d 65 6d 6f 72 79 20 20 20 31 0a 20 20 34 20 20  memory   1.  4  
fc40: 70 65 72 73 69 73 74 20 20 30 0a 20 20 35 20 20  persist  0.  5  
fc50: 64 65 6c 65 74 65 20 20 20 30 0a 20 20 36 20 20  delete   0.  6  
fc60: 77 61 6c 20 20 20 20 20 20 30 0a 20 20 37 20 20  wal      0.  7  
fc70: 74 72 75 6e 63 61 74 65 20 30 0a 7d 20 7b 0a 20  truncate 0.} {. 
fc80: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
fc90: 32 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  23.5.$tn.1 {.   
fca0: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
fcb0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
fcc0: 6f 66 66 22 0a 20 20 20 20 65 78 65 63 73 71 6c  off".    execsql
fcd0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
fce0: 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20  _mode = $mode". 
fcf0: 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65   } [if $possible
fd00: 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c   {list $mode} {l
fd10: 69 73 74 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f 74  ist off}].  do_t
fd20: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  est pager1-23.5.
fd30: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  $tn.2 {.    exec
fd40: 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  sql "PRAGMA jour
fd50: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72  nal_mode = memor
fd60: 79 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  y".    execsql "
fd70: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
fd80: 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d  ode = $mode".  }
fd90: 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b   [if $possible {
fda0: 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73  list $mode} {lis
fdb0: 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f  t memory}].}.do_
fdc0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
fdd0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
fde0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
fdf0: 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d 20  ode = normal}.} 
fe00: 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74  {exclusive}.do_t
fe10: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  est pager1-23.6.
fe20: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  2 {.  execsql {P
fe30: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
fe40: 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 7d 0a  de = exclusive}.
fe50: 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f  } {exclusive}.do
fe60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fe70: 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.3 {.  execsql 
fe80: 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  {PRAGMA locking_
fe90: 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  mode}.} {exclusi
fea0: 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ve}.do_test page
feb0: 72 31 2d 32 33 2e 36 2e 34 20 7b 0a 20 20 65 78  r1-23.6.4 {.  ex
fec0: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6d 61  ecsql {PRAGMA ma
fed0: 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d  in.locking_mode}
fee0: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 0a  .} {exclusive}..
fef0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
ff00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
ff40: 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
ff50: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
ff60: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
ff70: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
ff80: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
ff90: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
ffa0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
ffb0: 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41  = 10;.    PRAGMA
ffc0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46   auto_vacuum = F
ffd0: 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ULL;.    CREATE 
ffe0: 54 41 42 4c 45 20 78 31 28 78 2c 20 79 2c 20 7a  TABLE x1(x, y, z
fff0: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c  , PRIMARY KEY(y,
10000 20 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   z));.    CREATE
10010 20 54 41 42 4c 45 20 78 32 28 78 2c 20 79 2c 20   TABLE x2(x, y, 
10020 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79  z, PRIMARY KEY(y
10030 2c 20 7a 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  , z));.    INSER
10040 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53  T INTO x2 VALUES
10050 28 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20  (a_string(400), 
10060 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
10070 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20  _string(600));. 
10080 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
10090 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
100a0 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(600), a_string
100b0 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
100c0 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  500) FROM x2;.  
100d0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
100e0 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
100f0 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
10100 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34  600), a_string(4
10110 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
10120 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
10130 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10140 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35  400), a_string(5
10150 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
10160 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
10170 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
10180 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36  ELECT a_string(6
10190 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  00), a_string(40
101a0 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
101b0 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
101c0 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
101d0 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
101e0 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
101f0 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ), a_string(400)
10200 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
10210 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
10220 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30  ECT a_string(400
10230 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ), a_string(500)
10240 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10250 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
10260 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
10270 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
10280 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
10290 61 67 65 72 31 2d 32 34 2e 31 2e 32 20 7b 0a 20  ager1-24.1.2 {. 
102a0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
102b0 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
102c0 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45  TE FROM x1 WHERE
102d0 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 7d 0a 20   rowid<32;.  }. 
102e0 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63   recursive_selec
102f0 74 20 36 34 20 78 32 0a 7d 20 7b 7d 0a 64 6f 5f  t 64 x2.} {}.do_
10300 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
10310 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
10320 20 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78   .      UPDATE x
10330 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69  1 SET z = a_stri
10340 6e 67 28 33 30 30 29 20 57 48 45 52 45 20 72 6f  ng(300) WHERE ro
10350 77 69 64 3e 34 30 3b 0a 20 20 20 20 43 4f 4d 4d  wid>40;.    COMM
10360 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  IT;.    PRAGMA i
10370 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
10380 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
10390 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d  (*) FROM x1;.  }
103a0 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74  .} {ok 33}..do_t
103b0 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e  est pager1-24.1.
103c0 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
103d0 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
103e0 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x1;.    INSERT I
103f0 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20  NTO x1 SELECT * 
10400 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 42 45 47  FROM x2;.    BEG
10410 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
10420 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72   FROM x1 WHERE r
10430 6f 77 69 64 3c 33 32 3b 0a 20 20 20 20 20 20 55  owid<32;.      U
10440 50 44 41 54 45 20 78 31 20 53 45 54 20 7a 20 3d  PDATE x1 SET z =
10450 20 61 5f 73 74 72 69 6e 67 28 32 39 39 29 20 57   a_string(299) W
10460 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20  HERE rowid>40;. 
10470 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73   }.  recursive_s
10480 65 6c 65 63 74 20 36 34 20 78 32 20 7b 64 62 20  elect 64 x2 {db 
10490 65 76 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20 20 65  eval COMMIT}.  e
104a0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
104b0 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
104c0 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  eck;.    SELECT 
104d0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31  count(*) FROM x1
104e0 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a  ;.  }.} {ok 33}.
104f0 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
10500 32 34 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  24.1.5 {.  execs
10510 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
10520 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53  FROM x1;.    INS
10530 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
10540 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
10550 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65  }.  recursive_se
10560 6c 65 63 74 20 36 34 20 78 32 20 7b 20 64 62 20  lect 64 x2 { db 
10570 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42  eval {CREATE TAB
10580 4c 45 20 78 33 28 78 2c 20 79 2c 20 7a 29 7d 20  LE x3(x, y, z)} 
10590 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
105a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 33 20 7d  LECT * FROM x3 }
105b0 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
105c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10600 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  -.#.do_test page
10610 72 31 2d 32 35 2d 31 20 7b 0a 20 20 66 61 75 6c  r1-25-1 {.  faul
10620 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
10630 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
10640 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
10650 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62      SAVEPOINT ab
10660 63 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  c;.        CREAT
10670 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
10680 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ;.      ROLLBACK
10690 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d   TO abc;.    COM
106a0 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c  MIT;.  }.  db cl
106b0 6f 73 65 0a 7d 20 7b 7d 0a 62 72 65 61 6b 70 6f  ose.} {}.breakpo
106c0 69 6e 74 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  int.do_test page
106d0 72 31 2d 32 35 2d 32 20 7b 0a 20 20 66 61 75 6c  r1-25-2 {.  faul
106e0 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
106f0 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
10700 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54   {.    SAVEPOINT
10710 20 61 62 63 3b 0a 20 20 20 20 20 20 43 52 45 41   abc;.      CREA
10720 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
10730 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  );.    ROLLBACK 
10740 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d  TO abc;.    COMM
10750 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f  IT;.  }.  db clo
10760 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  se.} {}..#------
10770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107b0 2d 2d 2d 0a 23 20 53 65 63 74 6f 72 2d 73 69 7a  ---.# Sector-siz
107c0 65 20 74 65 73 74 73 2e 0a 23 0a 64 6f 5f 74 65  e tests..#.do_te
107d0 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b  st pager1-26.1 {
107e0 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
107f0 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65  efault 1.  tv se
10800 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 20 20  ctorsize 4096.  
10810 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
10820 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
10830 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
10840 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
10850 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
10860 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
10870 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10880 74 62 6c 28 61 20 50 52 49 4d 41 52 59 20 4b 45  tbl(a PRIMARY KE
10890 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20  Y, b UNIQUE);.  
108a0 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
108b0 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56  NSERT INTO tbl V
108c0 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32  ALUES(a_string(2
108d0 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
108e0 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
108f0 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
10900 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
10910 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
10920 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
10930 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
10940 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
10950 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10960 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
10970 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
10980 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10990 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
109a0 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  0) FROM tbl;.   
109b0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
109c0 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
109d0 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
109e0 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
109f0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
10a00 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
10a10 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
10a20 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
10a30 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
10a40 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
10a50 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
10a60 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10a70 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45   tbl;.      INSE
10a80 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
10a90 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
10aa0 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
10ab0 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 43 4f 4d  ROM tbl;.    COM
10ac0 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  MIT;.  }.} {}.do
10ad0 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
10ae0 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20 55 50  ger1-26.1 {.  UP
10af0 44 41 54 45 20 74 62 6c 20 53 45 54 20 62 20 3d  DATE tbl SET b =
10b00 20 61 5f 73 74 72 69 6e 67 28 35 35 30 29 3b 0a   a_string(550);.
10b10 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  } {}.db close.tv
10b20 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d   delete..#------
10b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b70 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ---.#.do_test pa
10b80 67 65 72 31 2e 32 37 2e 31 20 7b 0a 20 20 66 61  ger1.27.1 {.  fa
10b90 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
10ba0 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74  d_reopen.  sqlit
10bb0 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
10bc0 74 73 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20  ts db.  execsql 
10bd0 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
10be0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10bf0 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20  t1(a, b);.  }.  
10c00 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
10c10 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65  fcounts db.  exe
10c20 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d  csql COMMIT.} {}
10c30 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
10c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
10c80 65 73 74 20 74 68 61 74 20 61 74 74 65 6d 70 74  est that attempt
10c90 69 6e 67 20 74 6f 20 6f 70 65 6e 20 61 20 77 72  ing to open a wr
10ca0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
10cb0 77 69 74 68 20 0a 23 20 6c 6f 63 6b 69 6e 67 5f  with .# locking_
10cc0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 69  mode=exclusive i
10cd0 6e 20 57 41 4c 20 6d 6f 64 65 20 66 61 69 6c 73  n WAL mode fails
10ce0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   if there are ot
10cf0 68 65 72 20 63 6c 69 65 6e 74 73 20 6f 6e 20 0a  her clients on .
10d00 23 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  # the same datab
10d10 61 73 65 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64  ase..#.catch { d
10d20 62 20 63 6c 6f 73 65 20 7d 0a 69 66 20 7b 24 3a  b close }.if {$:
10d30 3a 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 28  :sqlite_options(
10d40 77 61 6c 29 20 26 26 20 5b 77 61 6c 5f 69 73 5f  wal) && [wal_is_
10d50 6f 6b 5d 7d 20 7b 0a 20 20 64 6f 5f 6d 75 6c 74  ok]} {.  do_mult
10d60 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20  iclient_test tn 
10d70 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  {.    do_test pa
10d80 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a  ger1-28.$tn.1 {.
10d90 20 20 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20        sql1 { .  
10da0 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
10db0 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
10dc0 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
10dd0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
10de0 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
10df0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61  NTO t1 VALUES('a
10e00 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 20 20 7d  ', 'b');.      }
10e10 0a 20 20 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 20  .    } {wal}.   
10e20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10e30 32 38 2e 24 74 6e 2e 32 20 7b 20 73 71 6c 32 20  28.$tn.2 { sql2 
10e40 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
10e50 74 31 20 7d 20 7d 20 7b 61 20 62 7d 0a 0a 20 20  t1 } } {a b}..  
10e60 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10e70 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31  -28.$tn.3 { sql1
10e80 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
10e90 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
10ea0 20 7d 20 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d   } } {exclusive}
10eb0 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
10ec0 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 0a  er1-28.$tn.4 { .
10ed0 20 20 20 20 20 20 63 73 71 6c 31 20 7b 20 42 45        csql1 { BE
10ee0 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  GIN; INSERT INTO
10ef0 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20   t1 VALUES('c', 
10f00 27 64 27 29 3b 20 7d 0a 20 20 20 20 7d 20 7b 31  'd'); }.    } {1
10f10 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
10f20 63 6b 65 64 7d 7d 0a 20 20 20 20 63 6f 64 65 32  cked}}.    code2
10f30 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 3b 20 73   { db2 close ; s
10f40 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
10f50 64 62 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  db }.    do_test
10f60 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34   pager1-28.$tn.4
10f70 20 7b 20 0a 20 20 20 20 20 20 73 71 6c 31 20 7b   { .      sql1 {
10f80 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
10f90 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29  VALUES('c', 'd')
10fa0 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 7d  ; COMMIT }.    }
10fb0 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d   {}.  }.}..#----
10fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11000 2d 2d 2d 2d 2d 0a 23 20 4e 6f 72 6d 61 6c 6c 79  -----.# Normally
11010 2c 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20  , when changing 
11020 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  from journal_mod
11030 65 3d 50 45 52 53 49 53 54 20 74 6f 20 44 45 4c  e=PERSIST to DEL
11040 45 54 45 20 74 68 65 20 70 61 67 65 72 0a 23 20  ETE the pager.# 
11050 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 6c 65  attempts to dele
11060 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
11070 69 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ile. However, if
11080 20 69 74 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   it cannot obtai
11090 6e 20 61 0a 23 20 52 45 53 45 52 56 45 44 20 6c  n a.# RESERVED l
110a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
110b0 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 73  ase file, this s
110c0 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  tep is skipped..
110d0 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74  #.do_multiclient
110e0 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f 5f  _test tn {.  do_
110f0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11100 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20  tn.1 {.    sql1 
11110 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
11120 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
11130 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 43 52  ERSIST;.      CR
11140 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
11150 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
11160 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
11170 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
11180 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a  }.  } {persist}.
11190 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
111a0 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 66 69 6c 65  -28.$tn.2 { file
111b0 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
111c0 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f  journal } 1.  do
111d0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
111e0 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20 50  $tn.3 { sql1 { P
111f0 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
11200 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20  de = DELETE } } 
11210 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74  delete.  do_test
11220 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34   pager1-28.$tn.4
11230 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
11240 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
11250 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   0..  do_test pa
11260 67 65 72 31 2d 32 38 2e 24 74 6e 2e 35 20 7b 0a  ger1-28.$tn.5 {.
11270 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20      sql1 { .    
11280 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
11290 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
112a0 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
112b0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27  TO t1 VALUES('c'
112c0 2c 20 27 64 27 29 3b 0a 20 20 20 20 7d 0a 20 20  , 'd');.    }.  
112d0 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f  } {persist}.  do
112e0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
112f0 24 74 6e 2e 36 20 7b 20 66 69 6c 65 20 65 78 69  $tn.6 { file exi
11300 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
11310 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  nal } 1.  do_tes
11320 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11330 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42  7 {.    sql2 { B
11340 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54  EGIN; INSERT INT
11350 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65 27 2c  O t1 VALUES('e',
11360 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a   'f'); }.  } {}.
11370 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11380 2d 32 38 2e 24 74 6e 2e 38 20 20 7b 20 66 69 6c  -28.$tn.8  { fil
11390 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
113a0 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64  -journal } 1.  d
113b0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
113c0 2e 24 74 6e 2e 39 20 20 7b 20 73 71 6c 31 20 7b  .$tn.9  { sql1 {
113d0 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
113e0 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20  mode = DELETE } 
113f0 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65  } delete.  do_te
11400 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11410 2e 31 30 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .10 { file exist
11420 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
11430 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 1..  do_test
11440 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
11450 31 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20  1 { sql2 COMMIT 
11460 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
11470 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 32 20  ager1-28.$tn.12 
11480 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
11490 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
114a0 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  0..  do_test pag
114b0 65 72 31 2d 32 38 2d 24 74 6e 2e 31 33 20 7b 0a  er1-28-$tn.13 {.
114c0 20 20 20 20 63 6f 64 65 31 20 7b 20 73 65 74 20      code1 { set 
114d0 63 68 61 6e 6e 65 6c 20 5b 64 62 20 69 6e 63 72  channel [db incr
114e0 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c 79 20 74  blob -readonly t
114f0 31 20 61 20 32 5d 20 7d 0a 20 20 20 20 73 71 6c  1 a 2] }.    sql
11500 31 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  1 {.      PRAGMA
11510 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
11520 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 49  PERSIST;.      I
11530 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11540 4c 55 45 53 28 27 67 27 2c 20 27 68 27 29 3b 0a  LUES('g', 'h');.
11550 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69      }.  } {persi
11560 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  st}.  do_test pa
11570 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 34 20 7b  ger1-28.$tn.14 {
11580 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
11590 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
115a0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
115b0 31 2d 32 38 2e 24 74 6e 2e 31 35 20 7b 0a 20 20  1-28.$tn.15 {.  
115c0 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20    sql2 { BEGIN; 
115d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
115e0 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29 3b  ALUES('e', 'f');
115f0 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
11600 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
11610 6e 2e 31 36 20 7b 20 73 71 6c 31 20 7b 20 50 52  n.16 { sql1 { PR
11620 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
11630 65 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20 64  e = DELETE } } d
11640 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20  elete.  do_test 
11650 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 37  pager1-28.$tn.17
11660 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
11670 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
11680 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   1..  do_test pa
11690 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 37 20 7b  ger1-28.$tn.17 {
116a0 20 63 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20   csql2 { COMMIT 
116b0 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  } } {1 {database
116c0 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
116d0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
116e0 2d 24 74 6e 2e 31 38 20 7b 20 63 6f 64 65 31 20  -$tn.18 { code1 
116f0 7b 20 72 65 61 64 20 24 63 68 61 6e 6e 65 6c 20  { read $channel 
11700 7d 20 7d 20 63 0a 20 20 64 6f 5f 74 65 73 74 20  } } c.  do_test 
11710 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 39  pager1-28-$tn.19
11720 20 7b 20 63 6f 64 65 31 20 7b 20 63 6c 6f 73 65   { code1 { close
11730 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 7b 7d   $channel } } {}
11740 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11750 31 2d 32 38 2e 24 74 6e 2e 32 30 20 7b 20 73 71  1-28.$tn.20 { sq
11760 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20  l2 { COMMIT } } 
11770 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  {}.}..do_test pa
11780 67 65 72 31 2d 32 39 2e 31 20 7b 0a 20 20 66 61  ger1-29.1 {.  fa
11790 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
117a0 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
117b0 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
117c0 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
117d0 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  ;.    PRAGMA aut
117e0 6f 5f 76 61 63 75 75 6d 20 3d 20 66 75 6c 6c 3b  o_vacuum = full;
117f0 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
11800 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
11810 76 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ve;.    CREATE T
11820 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
11830 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11840 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
11850 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20    }.  file size 
11860 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20  test.db.} [expr 
11870 31 30 32 34 2a 33 5d 0a 64 6f 5f 74 65 73 74 20  1024*3].do_test 
11880 70 61 67 65 72 31 2d 32 39 2e 32 20 7b 0a 20 20  pager1-29.2 {.  
11890 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
118a0 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
118b0 20 34 30 39 36 3b 0a 20 20 20 20 56 41 43 55 55   4096;.    VACUU
118c0 4d 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  M;.  }.  file si
118d0 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78  ze test.db.} [ex
118e0 70 72 20 34 30 39 36 2a 33 5d 0a 0a 23 2d 2d 2d  pr 4096*3]..#---
118f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11930 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
11940 61 74 20 69 66 20 61 6e 20 65 6d 70 74 79 20 64  at if an empty d
11950 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73 69  atabase file (si
11960 7a 65 20 30 20 62 79 74 65 73 29 20 69 73 20 6f  ze 0 bytes) is o
11970 70 65 6e 65 64 20 69 6e 20 0a 23 20 65 78 63 6c  pened in .# excl
11980 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
11990 64 65 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  de, any journal 
119a0 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
119b0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79  from the file-sy
119c0 73 74 65 6d 0a 23 20 77 69 74 68 6f 75 74 20 62  stem.# without b
119d0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
119e0 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 52  . And that the R
119f0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 62 74  ESERVED lock obt
11a00 61 69 6e 65 64 20 77 68 69 6c 65 0a 23 20 64 6f  ained while.# do
11a10 69 6e 67 20 74 68 69 73 20 69 73 20 6e 6f 74 20  ing this is not 
11a20 72 65 6c 65 61 73 65 64 2e 0a 23 0a 64 6f 5f 74  released..#.do_t
11a30 65 73 74 20 70 61 67 65 72 31 2d 33 30 2e 31 20  est pager1-30.1 
11a40 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64  {.  db close.  d
11a50 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73 74 2e  elete_file test.
11a60 64 62 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65  db.  delete_file
11a70 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
11a80 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20  .  set fd [open 
11a90 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
11aa0 77 5d 0a 20 20 73 65 65 6b 20 24 66 64 20 5b 65  w].  seek $fd [e
11ab0 78 70 72 20 35 31 32 2b 31 30 33 32 2a 32 5d 0a  xpr 512+1032*2].
11ac0 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
11ad0 65 20 24 66 64 20 78 0a 20 20 63 6c 6f 73 65 20  e $fd x.  close 
11ae0 24 66 64 0a 0a 20 20 73 71 6c 69 74 65 33 20 64  $fd..  sqlite3 d
11af0 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
11b00 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
11b10 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
11b20 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 53 45 4c  CLUSIVE;.    SEL
11b30 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
11b40 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
11b50 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
11b60 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b  _status;.  }.} {
11b70 65 78 63 6c 75 73 69 76 65 20 30 20 6d 61 69 6e  exclusive 0 main
11b80 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63   reserved temp c
11b90 6c 6f 73 65 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  losed}..#-------
11ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11be0 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  --.# Test that i
11bf0 66 20 74 68 65 20 22 70 61 67 65 2d 73 69 7a 65  f the "page-size
11c00 22 20 66 69 65 6c 64 20 69 6e 20 61 20 6a 6f 75  " field in a jou
11c10 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 30  rnal-header is 0
11c20 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20  , the journal.# 
11c30 66 69 6c 65 20 63 61 6e 20 73 74 69 6c 6c 20 62  file can still b
11c40 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
11c50 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
11c60 66 6f 72 20 62 61 63 6b 77 61 72 64 20 63 6f 6d  for backward com
11c70 70 61 74 69 62 69 6c 69 74 79 20 2d 0a 23 20 76  patibility -.# v
11c80 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
11c90 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38  e prior to 3.5.8
11ca0 20 61 6c 77 61 79 73 20 73 65 74 20 74 68 69 73   always set this
11cb0 20 66 69 65 6c 64 20 74 6f 20 7a 65 72 6f 2e 0a   field to zero..
11cc0 23 0a 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66  #.if {$tcl_platf
11cd0 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22  orm(platform)=="
11ce0 75 6e 69 78 22 7d 20 7b 0a 64 6f 5f 74 65 73 74  unix"} {.do_test
11cf0 20 70 61 67 65 72 31 2d 33 31 2e 31 20 7b 0a 20   pager1-31.1 {. 
11d00 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
11d10 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
11d20 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
11d30 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
11d40 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  10;.    PRAGMA p
11d50 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
11d60 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
11d70 45 20 74 31 28 78 2c 20 79 2c 20 55 4e 49 51 55  E t1(x, y, UNIQU
11d80 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 49 4e  E(x, y));.    IN
11d90 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11da0 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  UES(randomblob(1
11db0 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
11dc0 28 31 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  (1500));.    INS
11dd0 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11de0 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
11df0 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
11e00 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
11e10 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11e20 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
11e30 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11e40 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
11e50 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
11e60 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
11e70 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
11e80 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11e90 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
11ea0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
11eb0 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
11ec0 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11ed0 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
11ee0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11ef0 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
11f00 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
11f10 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
11f20 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
11f30 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
11f40 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11f50 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
11f60 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
11f70 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11f80 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
11f90 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11fa0 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
11fb0 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
11fc0 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
11fd0 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
11fe0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
11ff0 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
12000 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
12010 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
12020 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
12030 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
12040 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
12050 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
12060 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
12070 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
12080 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   t1;.    BEGIN;.
12090 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
120a0 53 45 54 20 79 20 3d 20 72 61 6e 64 6f 6d 62 6c  SET y = randombl
120b0 6f 62 28 31 34 39 39 29 3b 0a 20 20 7d 0a 20 20  ob(1499);.  }.  
120c0 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64  copy_file test.d
120d0 62 20 74 65 73 74 2e 64 62 32 0a 20 20 63 6f 70  b test.db2.  cop
120e0 79 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a  y_file test.db-j
120f0 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d  ournal test.db2-
12100 6a 6f 75 72 6e 61 6c 0a 20 20 0a 20 20 68 65 78  journal.  .  hex
12110 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
12120 32 2d 6a 6f 75 72 6e 61 6c 20 32 34 20 30 30 30  2-journal 24 000
12130 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
12140 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65  db2 test.db2.  e
12150 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
12160 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
12170 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 7d 0a 0a  } db2.} {ok}.}..
12180 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
12190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
121d0 74 20 74 68 61 74 20 61 20 64 61 74 61 62 61 73  t that a databas
121e0 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 22 70  e file can be "p
121f0 72 65 2d 68 69 6e 74 65 64 22 20 74 6f 20 61 20  re-hinted" to a 
12200 63 65 72 74 61 69 6e 20 73 69 7a 65 20 61 6e 64  certain size and
12210 20 74 68 61 74 0a 23 20 73 75 62 73 65 71 75 65   that.# subseque
12220 6e 74 20 73 70 69 6c 6c 69 6e 67 20 6f 66 20 74  nt spilling of t
12230 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 64  he pager cache d
12240 6f 65 73 20 6e 6f 74 20 72 65 73 75 6c 74 20 69  oes not result i
12250 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 23  n the database.#
12260 20 66 69 6c 65 20 62 65 69 6e 67 20 73 68 72 75   file being shru
12270 6e 6b 2e 0a 23 0a 63 61 74 63 68 20 7b 64 62 20  nk..#.catch {db 
12280 63 6c 6f 73 65 7d 0a 66 6f 72 63 65 64 65 6c 65  close}.forcedele
12290 74 65 20 74 65 73 74 2e 64 62 0a 0a 64 6f 5f 74  te test.db..do_t
122a0 65 73 74 20 70 61 67 65 72 31 2d 33 32 2e 31 20  est pager1-32.1 
122b0 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  {.  sqlite3 db t
122c0 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
122d0 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
122e0 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20  BLE t1(x, y);.  
122f0 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  }.  db close.  s
12300 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
12310 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
12320 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
12330 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
12340 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(1, randomblob
12350 28 31 30 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20  (10000));.  }.  
12360 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75  file_control_chu
12370 6e 6b 73 69 7a 65 5f 74 65 73 74 20 64 62 20 6d  nksize_test db m
12380 61 69 6e 20 31 30 32 34 0a 20 20 66 69 6c 65 5f  ain 1024.  file_
12390 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74  control_sizehint
123a0 5f 74 65 73 74 20 64 62 20 6d 61 69 6e 20 32 30  _test db main 20
123b0 39 37 31 35 32 30 3b 20 23 20 32 30 4d 42 0a 20  971520; # 20MB. 
123c0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
123d0 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
123e0 20 3d 20 31 30 3b 0a 20 20 20 20 49 4e 53 45 52   = 10;.    INSER
123f0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
12400 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (1, randomblob(1
12410 30 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  0000));.    INSE
12420 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
12430 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  S(2, randomblob(
12440 31 30 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  10000));.    INS
12450 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
12460 43 54 20 78 2b 32 2c 20 72 61 6e 64 6f 6d 62 6c  CT x+2, randombl
12470 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74  ob(10000) from t
12480 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
12490 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 34  TO t1 SELECT x+4
124a0 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
124b0 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20  00) from t1;.   
124c0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
124d0 53 45 4c 45 43 54 20 78 2b 38 2c 20 72 61 6e 64  SELECT x+8, rand
124e0 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72  omblob(10000) fr
124f0 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  om t1;.    INSER
12500 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
12510 20 78 2b 31 36 2c 20 72 61 6e 64 6f 6d 62 6c 6f   x+16, randomblo
12520 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31  b(10000) from t1
12530 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
12540 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
12550 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
12560 20 64 62 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65   db close.  file
12570 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
12580 7b 32 30 39 37 31 35 32 30 7d 0a 0a 23 20 43 6c  {20971520}..# Cl
12590 65 61 6e 75 70 20 32 30 4d 42 20 66 69 6c 65 20  eanup 20MB file 
125a0 6c 65 66 74 20 62 79 20 74 68 65 20 70 72 65 76  left by the prev
125b0 69 6f 75 73 20 74 65 73 74 2e 0a 66 6f 72 63 65  ious test..force
125c0 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 0a  delete test.db..
125d0 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.