/ Hex Artifact Content
Login

Artifact cf8f40cf77b5c4f762b1e8492390d61b46a81623:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e 6f 74 20  n.tcl..# Do not 
0210: 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 20  use a codec for 
0220: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0230: 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 62  le, as the datab
0240: 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d 61  ase file is.# ma
0250: 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 74  nipulated direct
0260: 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 72  ly using tcl scr
0270: 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 20  ipts (using the 
0280: 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 6f  [hexio_write] co
0290: 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f 74  mmand)..#.do_not
02a0: 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 20  _use_codec..#.# 
02b0: 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 74  pager1-1.*: Test
02c0: 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 6c   inter-process l
02d0: 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 20  ocking (clients 
02e0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
02f0: 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 65  esses)..#.# page
0300: 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e 74  r1-2.*: Test int
0310: 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b 69  ra-process locki
0320: 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c 69  ng (multiple cli
0330: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ents in this pro
0340: 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 72  cess)..#.# pager
0350: 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e 74  1-3.*: Savepoint
0360: 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a   related tests..
0370: 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a 20  #.# pager1-4.*: 
0380: 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c 61  Hot-journal rela
0390: 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 70  ted tests..#.# p
03a0: 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 73  ager1-5.*: Cases
03b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c 74   related to mult
03c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
03d0: 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a 20  #.# pager1-6.*: 
03e0: 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f  Cases related to
03f0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
0400: 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 67  e_count".#.# pag
0410: 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 73  er1-7.*: Cases s
0420: 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47  pecific to "PRAG
0430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0440: 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 61  TRUNCATE".#.# pa
0450: 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 20  ger1-8.*: Cases 
0460: 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  using temporary 
0470: 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
0480: 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  tabases..#.# pag
0490: 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 72  er1-9.*: Tests r
04a0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  elated to the ba
04b0: 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 61  ckup API..#.# pa
04c0: 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 20  ger1-10.*: Test 
04d0: 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 64  that the assumed
04e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
04f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d 69  tor-size is limi
0500: 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ted to.#        
0510: 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 20        64KB..#.# 
0520: 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 73  pager1-12.*: Tes
0530: 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 52  ts involving "PR
0540: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
0550: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a 3a  #.# pager1-13.*:
0560: 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 20   Cases specific 
0570: 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  to "PRAGMA journ
0580: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
0590: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e 2a  .#.# pager1-14.*
05a0: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
05b0: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
05c0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 0a  nal_mode=OFF".#.
05d0: 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 56  # pager1-15.*: V
05e0: 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76  arying sqlite3_v
05f0: 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 20  fs.szOsFile.#.# 
0600: 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 72  pager1-16.*: Var
0610: 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ying sqlite3_vfs
0620: 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 20  .mxPathname.#.# 
0630: 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 73  pager1-17.*: Tes
0640: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 50  ts related to "P
0650: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
0660: 6f 63 6b 22 0a 23 20 20 20 20 20 20 20 20 20 20  ock".#          
0670: 20 20 20 20 28 54 68 65 20 6f 6d 69 74 5f 72 65      (The omit_re
0680: 61 64 6c 6f 63 6b 20 70 72 61 67 6d 61 20 68 61  adlock pragma ha
0690: 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 61  s been removed a
06a0: 6e 64 20 73 6f 20 68 61 76 65 0a 23 20 20 20 20  nd so have.#    
06b0: 20 20 20 20 20 20 20 20 20 20 74 68 65 73 65 20            these 
06c0: 74 65 73 74 73 2e 29 0a 23 0a 23 20 70 61 67 65  tests.).#.# page
06d0: 72 31 2d 31 38 2e 2a 3a 20 54 65 73 74 20 74 68  r1-18.*: Test th
06e0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  at the pager lay
06f0: 65 72 20 72 65 73 70 6f 6e 64 73 20 63 6f 72 72  er responds corr
0700: 65 63 74 6c 79 20 69 66 20 74 68 65 20 62 2d 74  ectly if the b-t
0710: 72 65 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ree.#           
0720: 20 20 20 72 65 71 75 65 73 74 73 20 61 6e 20 69     requests an i
0730: 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
0740: 65 72 20 28 64 75 65 20 74 6f 20 64 62 20 63 6f  er (due to db co
0750: 72 72 75 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72  rruption)..#..pr
0760: 6f 63 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  oc recursive_sel
0770: 65 63 74 20 7b 69 64 20 74 61 62 6c 65 20 7b 73  ect {id table {s
0780: 63 72 69 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73  cript {}}} {.  s
0790: 65 74 20 63 6e 74 20 30 0a 20 20 64 62 20 65 76  et cnt 0.  db ev
07a0: 61 6c 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64  al "SELECT rowid
07b0: 2c 20 2a 20 46 52 4f 4d 20 24 74 61 62 6c 65 20  , * FROM $table 
07c0: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 28 24  WHERE rowid = ($
07d0: 69 64 2d 31 29 22 20 7b 0a 20 20 20 20 72 65 63  id-1)" {.    rec
07e0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 24 72  ursive_select $r
07f0: 6f 77 69 64 20 24 74 61 62 6c 65 20 24 73 63 72  owid $table $scr
0800: 69 70 74 0a 20 20 20 20 69 6e 63 72 20 63 6e 74  ipt.    incr cnt
0810: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d  .  }.  if {$cnt=
0820: 3d 30 7d 20 7b 20 65 76 61 6c 20 24 73 63 72 69  =0} { eval $scri
0830: 70 74 20 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74  pt }.}..set a_st
0840: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70  ring_counter 1.p
0850: 72 6f 63 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d  roc a_string {n}
0860: 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74   {.  global a_st
0870: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69  ring_counter.  i
0880: 6e 63 72 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75  ncr a_string_cou
0890: 6e 74 65 72 0a 20 20 73 74 72 69 6e 67 20 72 61  nter.  string ra
08a0: 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70 65  nge [string repe
08b0: 61 74 20 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63  at "${a_string_c
08c0: 6f 75 6e 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20  ounter}." $n] 1 
08d0: 24 6e 0a 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73  $n.}.db func a_s
08e0: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a  tring a_string..
08f0: 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
0900: 65 73 74 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72  est tn {..  # Cr
0910: 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  eate and populat
0920: 65 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  e a database tab
0930: 6c 65 20 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74  le using connect
0940: 69 6f 6e 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20  ion [db]. Check 
0950: 0a 20 20 23 20 74 68 61 74 20 63 6f 6e 6e 65 63  .  # that connec
0960: 74 69 6f 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20  tions [db2] and 
0970: 5b 64 62 33 5d 20 63 61 6e 20 73 65 65 20 74 68  [db3] can see th
0980: 65 20 73 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e  e schema and con
0990: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
09a0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
09b0: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   {.    sql1 {.  
09c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
09d0: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
09e0: 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  Y, b);.      CRE
09f0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
0a00: 74 31 28 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  t1(b);.      INS
0a10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0a20: 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e  ES(1, 'one'); IN
0a30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0a40: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
0a50: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
0a60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a70: 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  .2 { sql2 { SELE
0a80: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a90: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20   {1 one 2 two}. 
0aa0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
0ab0: 24 74 6e 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53  $tn.3 { sql3 { S
0ac0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0ad0: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
0ae0: 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 74 72  }..  # Open a tr
0af0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 64  ansaction and ad
0b00: 64 20 61 20 72 6f 77 20 75 73 69 6e 67 20 5b 64  d a row using [d
0b10: 62 5d 2e 20 54 68 69 73 20 70 75 74 73 20 5b 64  b]. This puts [d
0b20: 62 5d 20 69 6e 0a 20 20 23 20 52 45 53 45 52 56  b] in.  # RESERV
0b30: 45 44 20 73 74 61 74 65 2e 20 43 68 65 63 6b 20  ED state. Check 
0b40: 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  that connections
0b50: 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d   [db2] and [db3]
0b60: 20 63 61 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72   can still.  # r
0b70: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
0b80: 20 63 6f 6e 74 65 6e 74 20 61 73 20 69 74 20 77   content as it w
0b90: 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  as before the tr
0ba0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20  ansaction was.  
0bb0: 23 20 6f 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73  # opened. [db] s
0bc0: 68 6f 75 6c 64 20 73 65 65 20 74 68 65 20 69 6e  hould see the in
0bd0: 73 65 72 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a  serted row..  #.
0be0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0bf0: 2d 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c  -$tn.4 {.    sql
0c00: 31 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  1 {.      BEGIN;
0c10: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
0c20: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
0c30: 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20  , 'three');.    
0c40: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0c50: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 35 20  st pager1-$tn.5 
0c60: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0c70: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c80: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0c90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0ca0: 2e 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  .7 { sql1 { SELE
0cb0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0cc0: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20   {1 one 2 two 3 
0cd0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d  three}..  # [db]
0ce0: 20 73 74 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70   still has an op
0cf0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
0d00: 74 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61 74  tion. Check that
0d10: 20 74 68 69 73 20 70 72 65 76 65 6e 74 73 0a 20   this prevents. 
0d20: 20 23 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   # other connect
0d30: 69 6f 6e 73 20 28 73 70 65 63 69 66 69 63 61 6c  ions (specifical
0d40: 6c 79 20 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77  ly [db2]) from w
0d50: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
0d60: 74 61 62 61 73 65 2e 0a 20 20 23 0a 20 20 23 20  tabase..  #.  # 
0d70: 45 76 65 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70  Even if [db2] op
0d80: 65 6e 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ens a transactio
0d90: 6e 20 66 69 72 73 74 2c 20 69 74 20 6d 61 79 20  n first, it may 
0da0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
0db0: 0a 20 20 23 20 64 61 74 61 62 61 73 65 2e 20 41  .  # database. A
0dc0: 66 74 65 72 20 74 68 65 20 61 74 74 65 6d 70 74  fter the attempt
0dd0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64 62   to write the db
0de0: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
0df0: 63 74 69 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32  ction, .  # [db2
0e00: 5d 20 69 73 20 6c 65 66 74 20 77 69 74 68 20 61  ] is left with a
0e10: 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
0e20: 6f 6e 2c 20 62 75 74 20 6e 6f 74 20 61 20 72 65  on, but not a re
0e30: 61 64 2d 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74  ad-lock on.  # t
0e40: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
0e50: 2e 20 53 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74  . So it does not
0e60: 20 70 72 65 76 65 6e 74 20 5b 64 62 5d 20 66 72   prevent [db] fr
0e70: 6f 6d 20 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20  om committing.. 
0e80: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
0e90: 65 72 31 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20  er1-$tn.8 { .   
0ea0: 20 63 73 71 6c 32 20 7b 20 55 50 44 41 54 45 20   csql2 { UPDATE 
0eb0: 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31  t1 SET a = a + 1
0ec0: 30 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61  0 }.  } {1 {data
0ed0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
0ee0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
0ef0: 31 2d 24 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63  1-$tn.9 { .    c
0f00: 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 42 45  sql2 { .      BE
0f10: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
0f20: 45 20 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b  E t1 SET a = a +
0f30: 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   10;.    }.  } {
0f40: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
0f50: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
0f60: 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74  e [db] commit it
0f70: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  s transactions. 
0f80: 43 68 65 63 6b 20 74 68 65 20 6f 74 68 65 72 20  Check the other 
0f90: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a  connections can.
0fa0: 20 20 23 20 6e 6f 77 20 73 65 65 20 74 68 65 20    # now see the 
0fb0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 63 6f 6e  new database con
0fc0: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
0fd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
0fe0: 30 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49  0 { sql1 { COMMI
0ff0: 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  T } } {}.  do_te
1000: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 31  st pager1-$tn.11
1010: 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54   { sql1 { SELECT
1020: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1030: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1040: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1050: 61 67 65 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73  ager1-$tn.12 { s
1060: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
1070: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1080: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1090: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10a0: 31 2d 24 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20  1-$tn.13 { sql3 
10b0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
10c0: 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20  t1 } } {1 one 2 
10d0: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20  two 3 three}..  
10e0: 23 20 43 68 65 63 6b 20 74 68 61 74 2c 20 61 73  # Check that, as
10f0: 20 6e 6f 74 65 64 20 61 62 6f 76 65 2c 20 5b 64   noted above, [d
1100: 62 32 5d 20 72 65 61 6c 6c 79 20 64 69 64 20 6b  b2] really did k
1110: 65 65 70 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  eep an open tran
1120: 73 61 63 74 69 6f 6e 0a 20 20 23 20 61 66 74 65  saction.  # afte
1130: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
1140: 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62   write the datab
1150: 61 73 65 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a  ase failed..  #.
1160: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1170: 2d 24 74 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63  -$tn.14 { .    c
1180: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a  sql2 { BEGIN } .
1190: 20 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73    } {1 {cannot s
11a0: 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
11b0: 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  on within a tran
11c0: 73 61 63 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74  saction}}.  do_t
11d0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
11e0: 35 20 7b 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42  5 { sql2 { ROLLB
11f0: 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20  ACK } } {}..  # 
1200: 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20  Have [db2] open 
1210: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
1220: 64 20 74 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f  d take a read-lo
1230: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1240: 73 65 2e 0a 20 20 23 20 43 68 65 63 6b 20 74 68  se..  # Check th
1250: 61 74 20 74 68 69 73 20 70 72 65 76 65 6e 74 73  at this prevents
1260: 20 5b 64 62 5d 20 66 72 6f 6d 20 77 72 69 74 69   [db] from writi
1270: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1280: 73 65 20 28 6f 75 74 73 69 64 65 0a 20 20 23 20  se (outside.  # 
1290: 6f 66 20 61 6e 79 20 74 72 61 6e 73 61 63 74 69  of any transacti
12a0: 6f 6e 29 2e 20 41 66 74 65 72 20 74 68 69 73 20  on). After this 
12b0: 66 61 69 6c 73 2c 20 63 68 65 63 6b 20 74 68 61  fails, check tha
12c0: 74 20 5b 64 62 33 5d 20 63 61 6e 20 72 65 61 64  t [db3] can read
12d0: 0a 20 20 23 20 74 68 65 20 64 62 20 28 73 68 6f  .  # the db (sho
12e0: 77 69 6e 67 20 74 68 61 74 20 5b 64 62 5d 20 64  wing that [db] d
12f0: 69 64 20 6e 6f 74 20 74 61 6b 65 20 61 20 50 45  id not take a PE
1300: 4e 44 49 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29  NDING lock etc.)
1310: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
1320: 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a  ager1-$tn.15 { .
1330: 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
1340: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1350: 74 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65  t1; }.  } {1 one
1360: 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a   2 two 3 three}.
1370: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1380: 2d 24 74 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63  -$tn.16 { .    c
1390: 73 71 6c 31 20 7b 20 55 50 44 41 54 45 20 74 31  sql1 { UPDATE t1
13a0: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20   SET a = a + 10 
13b0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
13c0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
13d0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
13e0: 24 74 6e 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20  $tn.17 { sql3 { 
13f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1400: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
1410: 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20  o 3 three}..  # 
1420: 54 68 69 73 20 74 69 6d 65 2c 20 68 61 76 65 20  This time, have 
1430: 5b 64 62 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e  [db] open a tran
1440: 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 77  saction before w
1450: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1460: 61 73 65 2e 0a 20 20 23 20 54 68 69 73 20 77 6f  ase..  # This wo
1470: 72 6b 73 20 2d 20 5b 64 62 5d 20 67 65 74 73 20  rks - [db] gets 
1480: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1490: 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 63  which does not c
14a0: 6f 6e 66 6c 69 63 74 20 77 69 74 68 0a 20 20 23  onflict with.  #
14b0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
14c0: 20 5b 64 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e   [db2] is holdin
14d0: 67 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  g..  #.  do_test
14e0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b   pager1-$tn.18 {
14f0: 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20   .    sql1 { .  
1500: 20 20 20 20 42 45 47 49 4e 3b 20 20 0a 20 20 20      BEGIN;  .   
1510: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
1520: 20 61 20 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20   a = a + 10; .  
1530: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
1540: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d  test pager1-$tn-
1550: 31 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b  19 { .    sql1 {
1560: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
1570: 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e  tus } .  } {main
1580: 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63   reserved temp c
1590: 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74  losed}.  do_test
15a0: 20 70 61 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b   pager1-$tn-20 {
15b0: 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 50 52 41   .    sql2 { PRA
15c0: 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20  GMA lock_status 
15d0: 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61  } .  } {main sha
15e0: 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d  red temp closed}
15f0: 0a 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74  ..  # Check that
1600: 20 61 6c 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   all connections
1610: 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20   can still read 
1620: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 4f 6e  the database. On
1630: 6c 79 20 5b 64 62 5d 20 73 65 65 73 0a 20 20 23  ly [db] sees.  #
1640: 20 74 68 65 20 75 70 64 61 74 65 64 20 63 6f 6e   the updated con
1650: 74 65 6e 74 20 28 61 73 20 74 68 65 20 74 72 61  tent (as the tra
1660: 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1670: 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1680: 79 65 74 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  yet)..  #.  do_t
1690: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
16a0: 31 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  1 { sql1 { SELEC
16b0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
16c0: 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31  {11 one 12 two 1
16d0: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
16e0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 32  st pager1-$tn.22
16f0: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1700: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1710: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1720: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1730: 61 67 65 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73  ager1-$tn.23 { s
1740: 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql3 { SELECT * F
1750: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1760: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1770: 0a 0a 20 20 23 20 42 65 63 61 75 73 65 20 5b 64  ..  # Because [d
1780: 62 32 5d 20 73 74 69 6c 6c 20 68 61 73 20 74 68  b2] still has th
1790: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b  e SHARED lock, [
17a0: 64 62 5d 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  db] is unable to
17b0: 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 23 20   commit the.  # 
17c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
17d0: 69 74 20 74 72 69 65 73 2c 20 61 6e 20 65 72 72  it tries, an err
17e0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  or is returned a
17f0: 6e 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  nd the connectio
1800: 6e 20 0a 20 20 23 20 75 70 67 72 61 64 65 73 20  n .  # upgrades 
1810: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
1820: 6b 2e 0a 20 20 23 0a 20 20 23 20 4f 6e 63 65 20  k..  #.  # Once 
1830: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 5b 64  this happens, [d
1840: 62 5d 20 63 61 6e 20 72 65 61 64 20 74 68 65 20  b] can read the 
1850: 64 61 74 61 62 61 73 65 20 61 6e 64 20 73 65 65  database and see
1860: 20 74 68 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74   the new content
1870: 2c 0a 20 20 23 20 5b 64 62 32 5d 20 28 73 74 69  ,.  # [db2] (sti
1880: 6c 6c 20 68 6f 6c 64 69 6e 67 20 53 48 41 52 45  ll holding SHARE
1890: 44 29 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61  D) can still rea
18a0: 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e  d the old conten
18b0: 74 2c 20 62 75 74 20 5b 64 62 33 5d 0a 20 20 23  t, but [db3].  #
18c0: 20 28 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e   (not holding an
18d0: 79 20 6c 6f 63 6b 29 20 69 73 20 70 72 65 76 65  y lock) is preve
18e0: 6e 74 65 64 20 62 79 20 5b 64 62 5d 27 73 20 50  nted by [db]'s P
18f0: 45 4e 44 49 4e 47 20 66 72 6f 6d 20 72 65 61 64  ENDING from read
1900: 69 6e 67 0a 20 20 23 20 74 68 65 20 64 61 74 61  ing.  # the data
1910: 62 61 73 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  base..  #.  do_t
1920: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1930: 34 20 7b 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d  4 { csql1 { COMM
1940: 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  IT } } {1 {datab
1950: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
1960: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1970: 2d 24 74 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73  -$tn-25 { .    s
1980: 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63  ql1 { PRAGMA loc
1990: 6b 5f 73 74 61 74 75 73 20 7d 20 0a 20 20 7d 20  k_status } .  } 
19a0: 7b 6d 61 69 6e 20 70 65 6e 64 69 6e 67 20 74 65  {main pending te
19b0: 6d 70 20 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f  mp closed}.  do_
19c0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
19d0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  26 { sql1 { SELE
19e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
19f0: 7d 20 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f  } {11 one 12 two
1a00: 20 31 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   13 three}.  do_
1a10: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1a20: 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  27 { sql2 { SELE
1a30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
1a40: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
1a50: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1a60: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1a70: 7b 20 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54  { csql3 { SELECT
1a80: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1a90: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1aa0: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
1ab0: 65 20 5b 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69  e [db2] commit i
1ac0: 74 73 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ts read transact
1ad0: 69 6f 6e 2c 20 72 65 6c 65 61 73 69 6e 67 20 74  ion, releasing t
1ae0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69  he SHARED lock i
1af0: 74 0a 20 20 23 20 69 73 20 68 6f 6c 64 69 6e 67  t.  # is holding
1b00: 2e 20 4e 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b  . Now, neither [
1b10: 64 62 32 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d  db2] nor [db3] m
1b20: 61 79 20 72 65 61 64 20 74 68 65 20 64 61 74 61  ay read the data
1b30: 62 61 73 65 20 28 61 73 20 5b 64 62 5d 0a 20 20  base (as [db].  
1b40: 23 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  # is still holdi
1b50: 6e 67 20 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20  ng a PENDING).. 
1b60: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
1b70: 65 72 31 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c  er1-$tn.29 { sql
1b80: 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b  2 { COMMIT } } {
1b90: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1ba0: 72 31 2d 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c  r1-$tn.30 { csql
1bb0: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
1bc0: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1bd0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1be0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1bf0: 72 31 2d 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c  r1-$tn.31 { csql
1c00: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
1c10: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1c20: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1c30: 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 69 73 20 6e  }..  # [db] is n
1c40: 6f 77 20 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69  ow able to commi
1c50: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1c60: 6e 2e 20 4f 6e 63 65 20 74 68 65 20 74 72 61 6e  n. Once the tran
1c70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 20 20 23 20  saction is .  # 
1c80: 63 6f 6d 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74  committed, all t
1c90: 68 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  hree connections
1ca0: 20 63 61 6e 20 72 65 61 64 20 74 68 65 20 6e 65   can read the ne
1cb0: 77 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20  w content..  #. 
1cc0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1cd0: 24 74 6e 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20  $tn.25 { sql1 { 
1ce0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
1cf0: 3d 20 61 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20  = a+10 } } {}.  
1d00: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1d10: 74 6e 2e 32 36 20 7b 20 73 71 6c 31 20 7b 20 43  tn.26 { sql1 { C
1d20: 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64  OMMIT } } {}.  d
1d30: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1d40: 6e 2e 32 37 20 7b 20 73 71 6c 31 20 7b 20 53 45  n.27 { sql1 { SE
1d50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1d60: 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77   } {21 one 22 tw
1d70: 6f 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f  o 23 three}.  do
1d80: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1d90: 2e 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c  .27 { sql2 { SEL
1da0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
1db0: 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f  } {21 one 22 two
1dc0: 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   23 three}.  do_
1dd0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1de0: 32 38 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  28 { sql3 { SELE
1df0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
1e00: 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20   {21 one 22 two 
1e10: 32 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 49  23 three}..  # I
1e20: 6e 73 74 61 6c 6c 20 61 20 62 75 73 79 2d 68 61  nstall a busy-ha
1e30: 6e 64 6c 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63  ndler for connec
1e40: 74 69 6f 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20  tion [db]..  #. 
1e50: 20 73 65 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69   set ::nbusy [li
1e60: 73 74 5d 0a 20 20 70 72 6f 63 20 62 75 73 79 20  st].  proc busy 
1e70: 7b 6e 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  {n} {.    lappen
1e80: 64 20 3a 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20  d ::nbusy $n.   
1e90: 20 69 66 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c   if {$n>5} { sql
1ea0: 32 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72  2 COMMIT }.    r
1eb0: 65 74 75 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62  eturn 0.  }.  db
1ec0: 20 62 75 73 79 20 62 75 73 79 0a 0a 20 20 64 6f   busy busy..  do
1ed0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1ee0: 2e 32 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20  .29 { .    sql1 
1ef0: 7b 20 42 45 47 49 4e 20 3b 20 49 4e 53 45 52 54  { BEGIN ; INSERT
1f00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1f10: 27 78 27 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d  'x', 'y') } .  }
1f20: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
1f30: 67 65 72 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20  ger1-$tn.30 { . 
1f40: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 20     sql2 { BEGIN 
1f50: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1f60: 74 31 20 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e  t1 } .  } {21 on
1f70: 65 20 32 32 20 74 77 6f 20 32 33 20 74 68 72 65  e 22 two 23 thre
1f80: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  e}.  do_test pag
1f90: 65 72 31 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c  er1-$tn.31 { sql
1fa0: 31 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20  1 COMMIT } {}.  
1fb0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1fc0: 74 6e 2e 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62  tn.32 { set ::nb
1fd0: 75 73 79 20 7d 20 7b 30 20 31 20 32 20 33 20 34  usy } {0 1 2 3 4
1fe0: 20 35 20 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   5 6}.}..#------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 0a 23 20 53 61 76 65 70 6f 69 6e 74 20  ---.# Savepoint 
2040: 72 65 6c 61 74 65 64 20 74 65 73 74 20 63 61 73  related test cas
2050: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 33  es..#.# pager1-3
2060: 2e 31 2e 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20  .1.2.*: Force a 
2070: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
2080: 63 6b 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ck to cause the 
2090: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20  database file.# 
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 74 6f 20 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67  to grow..#.# pag
20c0: 65 72 31 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65  er1-3.1.3.*: Use
20d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
20e0: 65 64 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ed in synchronou
20f0: 73 3d 6f 66 66 20 6d 6f 64 65 20 61 73 20 70 61  s=off mode as pa
2100: 72 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  rt.#            
2110: 20 20 20 20 20 6f 66 20 61 20 73 61 76 65 70 6f       of a savepo
2120: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20  int rollback..# 
2130: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
2140: 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  3.1.1 {.  faults
2150: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
2160: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
2170: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2180: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
2190: 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  EY, b);.    CREA
21a0: 54 45 20 54 41 42 4c 45 20 63 6f 75 6e 74 65 72  TE TABLE counter
21b0: 28 0a 20 20 20 20 20 20 69 20 43 48 45 43 4b 20  (.      i CHECK 
21c0: 28 69 3c 35 29 2c 20 0a 20 20 20 20 20 20 75 20  (i<5), .      u 
21d0: 43 48 45 43 4b 20 28 75 3c 31 30 29 0a 20 20 20  CHECK (u<10).   
21e0: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
21f0: 4e 54 4f 20 63 6f 75 6e 74 65 72 20 56 41 4c 55  NTO counter VALU
2200: 45 53 28 30 2c 20 30 29 3b 0a 20 20 20 20 43 52  ES(0, 0);.    CR
2210: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31  EATE TRIGGER tr1
2220: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
2230: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
2240: 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72 20 53  UPDATE counter S
2250: 45 54 20 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20  ET i = i+1;.    
2260: 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20  END;.    CREATE 
2270: 54 52 49 47 47 45 52 20 74 72 32 20 41 46 54 45  TRIGGER tr2 AFTE
2280: 52 20 55 50 44 41 54 45 20 4f 4e 20 74 31 20 42  R UPDATE ON t1 B
2290: 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54  EGIN.      UPDAT
22a0: 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20 75 20  E counter SET u 
22b0: 3d 20 75 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a  = u+1;.    END;.
22c0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
22d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f  SELECT * FROM co
22e0: 75 6e 74 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a  unter }.} {0 0}.
22f0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2300: 20 70 61 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a   pager1-3.1.2 {.
2310: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
2320: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49  ize = 10;.  BEGI
2330: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
2340: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
2350: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2360: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2370: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
2380: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2390: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
23a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
23b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
23c0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
23d0: 46 52 4f 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20  FROM counter;.} 
23e0: 7b 33 20 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71  {3 0}.do_catchsq
23f0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2400: 31 2e 33 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  1.3 {.    INSERT
2410: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2420: 61 2b 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  a+3, randomblob(
2430: 31 35 30 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20  1500) FROM t1.} 
2440: 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66  {1 {constraint f
2450: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73  ailed}}.do_execs
2460: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2470: 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .4 { SELECT * FR
2480: 4f 4d 20 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20  OM counter } {3 
2490: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
24a0: 73 74 20 70 61 67 65 72 31 2d 33 2e 35 20 7b 20  st pager1-3.5 { 
24b0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
24c0: 20 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78   } {1 2 3}.do_ex
24d0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
24e0: 31 2d 33 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d  1-3.6 { COMMIT }
24f0: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e   {}..foreach {tn
2500: 20 73 71 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20   sql tcl} {.  7 
2510: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2520: 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b  onous = NORMAL ;
2530: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
2540: 72 65 20 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74  re = 0 } {.    t
2550: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
2560: 6c 74 20 31 0a 20 20 20 20 74 76 20 64 65 76 63  lt 1.    tv devc
2570: 68 61 72 20 73 61 66 65 5f 61 70 70 65 6e 64 0a  har safe_append.
2580: 20 20 7d 0a 20 20 38 20 20 7b 20 50 52 41 47 4d    }.  8  { PRAGM
2590: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
25a0: 4e 4f 52 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20  NORMAL ; PRAGMA 
25b0: 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d  temp_store = 2 }
25c0: 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74   {.    testvfs t
25d0: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20  v -default 1.   
25e0: 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71 75   tv devchar sequ
25f0: 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20  ential.  }.  9  
2600: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2610: 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20  nous = FULL } { 
2620: 7d 0a 20 20 31 30 20 7b 20 50 52 41 47 4d 41 20  }.  10 { PRAGMA 
2630: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f  synchronous = NO
2640: 52 4d 41 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20  RMAL } { }.  11 
2650: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2660: 6e 6f 75 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d  nous = OFF } { }
2670: 0a 20 20 31 32 20 7b 20 50 52 41 47 4d 41 20 73  .  12 { PRAGMA s
2680: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c  ynchronous = FUL
2690: 4c 20 3b 20 50 52 41 47 4d 41 20 66 75 6c 6c 66  L ; PRAGMA fullf
26a0: 73 79 6e 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20  sync = 1 } { }. 
26b0: 20 31 33 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   13 { PRAGMA syn
26c0: 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20  chronous = FULL 
26d0: 7d 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20  } {.    testvfs 
26e0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
26f0: 20 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71    tv devchar seq
2700: 75 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34  uential.  }.  14
2710: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
2720: 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49  g_mode = EXCLUSI
2730: 56 45 20 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20  VE } {.  }.} {. 
2740: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
2750: 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76  3.$tn.1 {.    ev
2760: 61 6c 20 24 74 63 6c 0a 20 20 20 20 66 61 75 6c  al $tcl.    faul
2770: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
2780: 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75  reopen.    db fu
2790: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
27a0: 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c  ring.    execsql
27b0: 20 24 73 71 6c 0a 20 20 20 20 65 78 65 63 73 71   $sql.    execsq
27c0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
27d0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32   auto_vacuum = 2
27e0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63  ;.      PRAGMA c
27f0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
2800: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
2810: 4c 45 20 7a 28 78 20 49 4e 54 45 47 45 52 20 50  LE z(x INTEGER P
2820: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
2830: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
2840: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2850: 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20   z VALUES(NULL, 
2860: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
2870: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2880: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
2890: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
28a0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
28b0: 20 20 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45    2.        INSE
28c0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
28d0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
28e0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
28f0: 20 2d 2d 20 20 20 34 0a 20 20 20 20 20 20 20 20   --   4.        
2900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2910: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2920: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2930: 20 20 20 20 20 2d 2d 20 20 20 38 0a 20 20 20 20       --   8.    
2940: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2950: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2960: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2970: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a  M z;     --  16.
2980: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2990: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
29a0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
29b0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
29c0: 20 33 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45   32.        INSE
29d0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
29e0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
29f0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
2a00: 20 2d 2d 20 20 36 34 0a 20 20 20 20 20 20 20 20   --  64.        
2a10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2a20: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2a30: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2a40: 20 20 20 20 20 2d 2d 20 31 32 38 0a 20 20 20 20       -- 128.    
2a50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2a60: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2a70: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2a80: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a  M z;     -- 256.
2a90: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
2aa0: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
2ab0: 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61  { PRAGMA auto_va
2ac0: 63 75 75 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20  cuum }.  } {2}. 
2ad0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2ae0: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20   pager1-3.$tn.2 
2af0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
2b00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
2b10: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
2b20: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
2b30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2b40: 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61  z VALUES(NULL, a
2b50: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
2b60: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
2b70: 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41  ne;.        UPDA
2b80: 54 45 20 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c  TE z SET y = NUL
2b90: 4c 20 57 48 45 52 45 20 78 3e 32 35 36 3b 0a 20  L WHERE x>256;. 
2ba0: 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e         PRAGMA in
2bb0: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
2bc0: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
2bd0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a   count(*) FROM z
2be0: 20 57 48 45 52 45 20 78 20 3c 20 31 30 30 3b 0a   WHERE x < 100;.
2bf0: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
2c00: 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49  O one;.    COMMI
2c10: 54 3b 0a 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64  T;.  } {99}..  d
2c20: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
2c30: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a  ager1-3.$tn.3 {.
2c40: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2c50: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
2c60: 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20 7a          UPDATE z
2c70: 20 53 45 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20   SET y = y||x;. 
2c80: 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
2c90: 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   one;.    COMMIT
2ca0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
2cb0: 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20  nt(*) FROM z;.  
2cc0: 7d 20 7b 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78  } {258}..  do_ex
2cd0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
2ce0: 31 2d 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20  1-3.$tn.4 {.    
2cf0: 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20  SAVEPOINT one;. 
2d00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2d10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2d20: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
2d30: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  .  } {}.  do_exe
2d40: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
2d50: 2d 33 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53  -3.$tn.5 {.    S
2d60: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2d70: 52 4f 4d 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41  ROM z;.    RELEA
2d80: 53 45 20 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47  SE one;.    PRAG
2d90: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2da0: 63 6b 3b 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d  ck;.  } {258 ok}
2db0: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
2dc0: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e  est pager1-3.$tn
2dd0: 2e 36 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49  .6 {.    SAVEPOI
2de0: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45  NT one;.    RELE
2df0: 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a  ASE one;.  } {}.
2e00: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61  .  db close.  ca
2e10: 74 63 68 20 7b 20 74 76 20 64 65 6c 65 74 65 20  tch { tv delete 
2e20: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2e70: 23 20 48 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  # Hot journal ro
2e80: 6c 6c 62 61 63 6b 20 72 65 6c 61 74 65 64 20 74  llback related t
2e90: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70  est cases..#.# p
2ea0: 61 67 65 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73  ager1.4.1.*: Tes
2eb0: 74 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  t that the pager
2ec0: 20 6d 6f 64 75 6c 65 20 64 65 6c 65 74 65 73 20   module deletes 
2ed0: 76 65 72 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c  very small inval
2ee0: 69 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  id.#            
2ef0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73     journal files
2f00: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 32  ..#.# pager1.4.2
2f10: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66  .*: Test that if
2f20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2f30: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 74 20 74  nal pointer at t
2f40: 68 65 20 65 6e 64 20 6f 66 20 61 0a 23 20 20 20  he end of a.#   
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 74 2d              hot-
2f60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 70 70  journal file app
2f70: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
2f80: 70 74 20 28 63 68 65 63 6b 73 75 6d 20 64 6f 65  pt (checksum doe
2f90: 73 20 6e 6f 74 0a 23 20 20 20 20 20 20 20 20 20  s not.#         
2fa0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 29 20 74        compute) t
2fb0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f  he associated jo
2fc0: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
2fd0: 62 61 63 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20  back (and no.#  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 41 63               xAc
2ff0: 63 65 73 73 28 29 20 63 61 6c 6c 20 74 6f 20 63  cess() call to c
3000: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 70 72 65  heck for the pre
3010: 73 65 6e 63 65 20 6f 66 20 61 6e 79 20 6d 61 73  sence of any mas
3020: 74 65 72 20 0a 23 20 20 20 20 20 20 20 20 20 20  ter .#          
3030: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
3040: 65 20 69 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20  e is made)..#.# 
3050: 70 61 67 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65  pager1.4.3.*: Te
3060: 73 74 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  st that the cont
3070: 65 6e 74 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  ents of a hot-jo
3080: 75 72 6e 61 6c 20 61 72 65 20 69 67 6e 6f 72 65  urnal are ignore
3090: 64 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20  d if the.#      
30a0: 20 20 20 20 20 20 20 20 20 70 61 67 65 2d 73 69           page-si
30b0: 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a  ze or sector-siz
30c0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
30d0: 20 68 65 61 64 65 72 20 61 70 70 65 61 72 20 74   header appear t
30e0: 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  o.#             
30f0: 20 20 62 65 20 69 6e 76 61 6c 69 64 20 28 74 6f    be invalid (to
3100: 6f 20 6c 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61  o large, too sma
3110: 6c 6c 20 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65  ll or not a powe
3120: 72 20 6f 66 20 32 29 2e 0a 23 0a 23 20 70 61 67  r of 2)..#.# pag
3130: 65 72 31 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20  er1.4.4.*: Test 
3140: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3150: 62 61 63 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  back of journal 
3160: 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 73 74  file with a mast
3170: 65 72 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  er.#            
3180: 20 20 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74     journal point
3190: 65 72 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  er generated in 
31a0: 76 61 72 69 6f 75 73 20 22 50 52 41 47 4d 41 20  various "PRAGMA 
31b0: 73 79 6e 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20  synchronous".#  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64               mod
31d0: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34  es..#.# pager1.4
31e0: 2e 35 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .5.*: Test that 
31f0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3200: 62 61 63 6b 20 73 74 6f 70 73 20 69 66 20 69 74  back stops if it
3210: 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 0a 23 20   encounters a.# 
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
3230: 75 72 6e 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72  urnal-record for
3240: 20 77 68 69 63 68 20 74 68 65 20 63 68 65 63 6b   which the check
3250: 73 75 6d 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70  sum fails..#.# p
3260: 61 67 65 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73  ager1.4.6.*: Tes
3270: 74 20 74 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c  t that when roll
3280: 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
3290: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74  ournal that cont
32a0: 61 69 6e 73 20 61 0a 23 20 20 20 20 20 20 20 20  ains a.#        
32b0: 20 20 20 20 20 20 20 6d 61 73 74 65 72 20 6a 6f         master jo
32c0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74  urnal pointer, t
32d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
32e0: 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65  l file is delete
32f0: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
3300: 20 20 61 66 74 65 72 20 61 6c 6c 20 74 68 65 20    after all the 
3310: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61  hot-journals tha
3320: 74 20 72 65 66 65 72 20 74 6f 20 69 74 20 61 72  t refer to it ar
3330: 65 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70  e deleted..#.# p
3340: 61 67 65 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73  ager1.4.7.*: Tes
3350: 74 20 74 68 61 74 20 69 66 20 61 20 68 6f 74 2d  t that if a hot-
3360: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
3370: 73 74 73 20 62 75 74 20 61 20 63 6c 69 65 6e 74  sts but a client
3380: 20 63 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20   can.#          
3390: 20 20 20 20 20 6f 70 65 6e 20 69 74 20 66 6f 72       open it for
33a0: 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74   reading only, t
33b0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
33c0: 6f 74 20 62 65 20 61 63 63 65 73 73 65 64 20 61  ot be accessed a
33d0: 6e 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  nd.#            
33e0: 20 20 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50     SQLITE_CANTOP
33f0: 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EN is returned..
3400: 23 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  # .do_test pager
3410: 31 2e 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c  1.4.1.1 {.  faul
3420: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
3430: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
3440: 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54   { .    CREATE T
3450: 41 42 4c 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20  ABLE x(y, z);.  
3460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20    INSERT INTO x 
3470: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
3480: 7d 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  }.  set fd [open
3490: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34a0: 20 77 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65   w].  puts -none
34b0: 77 6c 69 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f  wline $fd "hello
34c0: 77 6f 72 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24  world".  close $
34d0: 66 64 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73  fd.  file exists
34e0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34f0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {1}.do_test p
3500: 61 67 65 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78  ager1.4.1.2 { ex
3510: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
3520: 20 46 52 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32   FROM x } } {1 2
3530: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
3540: 2e 34 2e 31 2e 33 20 7b 20 66 69 6c 65 20 65 78  .4.1.3 { file ex
3550: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
3560: 72 6e 61 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65  rnal } {0}..# Se
3570: 74 20 75 70 20 61 20 5b 74 65 73 74 76 66 73 5d  t up a [testvfs]
3580: 20 74 6f 20 73 6e 61 70 73 68 6f 74 20 74 68 65   to snapshot the
3590: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73   file-system jus
35a0: 74 20 62 65 66 6f 72 65 20 53 51 4c 69 74 65 0a  t before SQLite.
35b0: 23 20 64 65 6c 65 74 65 73 20 74 68 65 20 6d 61  # deletes the ma
35c0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20  ster-journal to 
35d0: 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66  commit a multi-f
35e0: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ile transaction.
35f0: 0a 23 0a 23 20 49 6e 20 73 75 62 73 65 71 75 65  .#.# In subseque
3600: 6e 74 20 74 65 73 74 20 63 61 73 65 73 2c 20 69  nt test cases, i
3610: 6e 76 6f 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69  nvoking [faultsi
3620: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3630: 6f 70 65 6e 5d 20 73 65 74 73 0a 23 20 75 70 20  open] sets.# up 
3640: 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
3650: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64  to contain two d
3660: 61 74 61 62 61 73 65 73 2c 20 74 77 6f 20 68 6f  atabases, two ho
3670: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t-journal files 
3680: 61 6e 64 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a  and.# a master-j
3690: 6f 75 72 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73  ournal..#.do_tes
36a0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b  t pager1.4.2.1 {
36b0: 0a 20 20 74 65 73 74 76 66 73 20 74 73 74 76 66  .  testvfs tstvf
36c0: 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74  s -default 1.  t
36d0: 73 74 76 66 73 20 66 69 6c 74 65 72 20 78 44 65  stvfs filter xDe
36e0: 6c 65 74 65 0a 20 20 74 73 74 76 66 73 20 73 63  lete.  tstvfs sc
36f0: 72 69 70 74 20 78 44 65 6c 65 74 65 43 61 6c 6c  ript xDeleteCall
3700: 62 61 63 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c  back.  proc xDel
3710: 65 74 65 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74  eteCallback {met
3720: 68 6f 64 20 66 69 6c 65 20 61 72 67 73 7d 20 7b  hod file args} {
3730: 0a 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b 66  .    set file [f
3740: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a  ile tail $file].
3750: 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67      if { [string
3760: 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c   match *mj* $fil
3770: 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f  e] } { faultsim_
3780: 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75  save }.  }.  fau
3790: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
37a0: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
37b0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
37c0: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
37d0: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
37e0: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
37f0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
3800: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
3810: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
3820: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3830: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e  .    PRAGMA aux.
3840: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3850: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3860: 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62  E t1(a UNIQUE, b
3870: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52   UNIQUE);.    CR
3880: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
3890: 32 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  2(a UNIQUE, b UN
38a0: 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52  IQUE);.    INSER
38b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
38c0: 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20  (a_string(200), 
38d0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a  a_string(300));.
38e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
38f0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3900: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3910: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3920: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3930: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3940: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3950: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3960: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3970: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
3980: 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   t1;.    BEGIN;.
3990: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
39a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
39b0: 72 69 6e 67 28 32 30 31 29 2c 20 61 5f 73 74 72  ring(201), a_str
39c0: 69 6e 67 28 33 30 31 29 20 46 52 4f 4d 20 74 31  ing(301) FROM t1
39d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
39e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
39f0: 73 74 72 69 6e 67 28 32 30 32 29 2c 20 61 5f 73  string(202), a_s
3a00: 74 72 69 6e 67 28 33 30 32 29 20 46 52 4f 4d 20  tring(302) FROM 
3a10: 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t1;.      INSERT
3a20: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3a30: 61 5f 73 74 72 69 6e 67 28 32 30 33 29 2c 20 61  a_string(203), a
3a40: 5f 73 74 72 69 6e 67 28 33 30 33 29 20 46 52 4f  _string(303) FRO
3a50: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
3a60: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
3a70: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 34 29 2c  T a_string(204),
3a80: 20 61 5f 73 74 72 69 6e 67 28 33 30 34 29 20 46   a_string(304) F
3a90: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 45  ROM t1;.      RE
3aa0: 50 4c 41 43 45 20 49 4e 54 4f 20 74 32 20 53 45  PLACE INTO t2 SE
3ab0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
3ac0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
3ad0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73 74    db close.  tst
3ae0: 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a  vfs delete.} {}.
3af0: 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74  .if {$::tcl_plat
3b00: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d  form(platform)!=
3b10: 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 64 6f 5f  "windows"} {.do_
3b20: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3b30: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
3b40: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3b50: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3b60: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3b70: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3b80: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3b90: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3ba0: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
3bb0: 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75  r1.4.2.3 {.  fau
3bc0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
3bd0: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
3be0: 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e  ch f [glob test.
3bf0: 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64  db-mj*] { forced
3c00: 65 6c 65 74 65 20 24 66 20 7d 0a 20 20 65 78 65  elete $f }.  exe
3c10: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3c20: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3c30: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3c40: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3c50: 20 20 7d 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f    }.} {64 ok}.do
3c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32  _test pager1.4.2
3c70: 2e 34 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .4 {.  faultsim_
3c80: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
3c90: 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  en.  hexio_write
3ca0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3cb0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
3cc0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
3cd0: 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20  l]-20] 123456.  
3ce0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3cf0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
3d00: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
3d10: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
3d20: 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a  k;.  }.} {4 ok}.
3d30: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
3d40: 2e 32 2e 35 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.5 {.  faultsi
3d50: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3d60: 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69  open.  hexio_wri
3d70: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
3d80: 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  al [expr [file s
3d90: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
3da0: 6e 61 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a  nal]-20] 123456.
3db0: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
3dc0: 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b  b test.db-mj*] {
3dd0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 66 20   forcedelete $f 
3de0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3df0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3e00: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3e10: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3e20: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3e30: 6f 6b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  ok}.}..do_test p
3e40: 61 67 65 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20  ager1.4.3.1 {.  
3e50: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3e60: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3e70: 66 73 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a  fs filter xSync.
3e80: 20 20 74 73 74 76 66 73 20 73 63 72 69 70 74 20    tstvfs script 
3e90: 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20  xSyncCallback.  
3ea0: 70 72 6f 63 20 78 53 79 6e 63 43 61 6c 6c 62 61  proc xSyncCallba
3eb0: 63 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20  ck {method file 
3ec0: 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20  args} {.    set 
3ed0: 66 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  file [file tail 
3ee0: 24 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20  $file].    if { 
3ef0: 30 3d 3d 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  0==[string match
3f00: 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d   *journal $file]
3f10: 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61   } { faultsim_sa
3f20: 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74  ve }.  }.  fault
3f30: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
3f40: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3f50: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
3f60: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
3f70: 54 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  TE;.    CREATE T
3f80: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
3f90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3fa0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
3fb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3fc0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
3fd0: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
3fe0: 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a    tstvfs delete.
3ff0: 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  } {}..foreach {t
4000: 6e 20 6f 66 73 74 20 76 61 6c 75 65 20 72 65 73  n ofst value res
4010: 75 6c 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ult} {.         
4020: 20 32 20 20 20 32 30 20 20 20 20 33 31 20 20 20   2   20    31   
4030: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
4040: 20 20 20 20 20 20 20 20 33 20 20 20 32 30 20 20          3   20  
4050: 20 20 33 32 20 20 20 20 20 20 20 7b 31 20 32 20    32       {1 2 
4060: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 34  3 4}.          4
4070: 20 20 20 32 30 20 20 20 20 33 33 20 20 20 20 20     20    33     
4080: 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20    {1 2 3 4}.    
4090: 20 20 20 20 20 20 35 20 20 20 32 30 20 20 20 20        5   20    
40a0: 36 35 35 33 36 20 20 20 20 7b 31 20 32 20 33 20  65536    {1 2 3 
40b0: 34 7d 0a 20 20 20 20 20 20 20 20 20 20 36 20 20  4}.          6  
40c0: 20 32 30 20 20 20 20 31 33 31 30 37 32 20 20 20   20    131072   
40d0: 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 20 20 20  {1 2 3 4}..     
40e0: 20 20 20 20 20 37 20 20 20 32 34 20 20 20 20 35       7   24    5
40f0: 31 31 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  11      {1 2 3 4
4100: 7d 0a 20 20 20 20 20 20 20 20 20 20 38 20 20 20  }.          8   
4110: 32 34 20 20 20 20 35 31 33 20 20 20 20 20 20 7b  24    513      {
4120: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4130: 20 20 20 39 20 20 20 32 34 20 20 20 20 31 33 31     9   24    131
4140: 30 37 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  072   {1 2 3 4}.
4150: 0a 20 20 20 20 20 20 20 20 20 31 30 20 20 20 33  .         10   3
4160: 32 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31  2    65536    {1
4170: 20 32 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   2}.} {.  do_tes
4180: 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e  t pager1.4.3.$tn
4190: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
41a0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
41b0: 65 6e 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69  en.    hexio_wri
41c0: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
41d0: 61 6c 20 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74  al $ofst [format
41e0: 20 25 2e 38 78 20 24 76 61 6c 75 65 5d 0a 20 20   %.8x $value].  
41f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
4200: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
4210: 20 7d 20 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20   } $result.}.db 
4220: 63 6c 6f 73 65 0a 0a 23 20 53 65 74 20 75 70 20  close..# Set up 
4230: 61 20 56 46 53 20 74 68 61 74 20 73 6e 61 70 73  a VFS that snaps
4240: 68 6f 74 73 20 74 68 65 20 66 69 6c 65 2d 73 79  hots the file-sy
4250: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
4260: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
4270: 6c 0a 23 20 66 69 6c 65 20 69 73 20 64 65 6c 65  l.# file is dele
4280: 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20  ted to commit a 
4290: 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
42a0: 61 63 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63  action. Specific
42b0: 61 6c 6c 79 2c 20 74 68 65 0a 23 20 66 69 6c 65  ally, the.# file
42c0: 2d 73 79 73 74 65 6d 20 69 73 20 73 61 76 65 64  -system is saved
42d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
42e0: 20 78 44 65 6c 65 74 65 28 29 20 63 61 6c 6c 20   xDelete() call 
42f0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 0a 23  to remove the .#
4300: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4310: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69  file from the fi
4320: 6c 65 2d 73 79 73 74 65 6d 2e 0a 23 0a 74 65 73  le-system..#.tes
4330: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
4340: 20 31 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70   1.tv script cop
4350: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73  y_on_mj_delete.s
4360: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
4370: 5f 6c 65 6e 67 74 68 20 30 0a 70 72 6f 63 20 63  _length 0.proc c
4380: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
4390: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
43a0: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
43b0: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d  [string match *m
43c0: 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  j* [file tail $f
43d0: 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20  ilename]]} { .  
43e0: 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e    set ::mj_filen
43f0: 61 6d 65 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69  ame_length [stri
4400: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e  ng length $filen
4410: 61 6d 65 5d 0a 20 20 20 20 66 61 75 6c 74 73 69  ame].    faultsi
4420: 6d 5f 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65  m_save .  }.  re
4430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
4440: 0a 0a 73 65 74 20 70 77 64 20 5b 67 65 74 5f 70  ..set pwd [get_p
4450: 77 64 5d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 31  wd].foreach {tn1
4460: 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b 20 73 65   tcl} {.  1 { se
4470: 74 20 70 72 65 66 69 78 20 22 74 65 73 74 2e 64  t prefix "test.d
4480: 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20 20 20 20  b" }.  2 { .    
4490: 23 20 54 68 69 73 20 74 65 73 74 20 64 65 70 65  # This test depe
44a0: 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e 64 65 72  nds on the under
44b0: 6c 79 69 6e 67 20 56 46 53 20 62 65 69 6e 67 20  lying VFS being 
44c0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 70 61 74  able to open pat
44d0: 68 73 0a 20 20 20 20 23 20 35 31 32 20 62 79 74  hs.    # 512 byt
44e0: 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
44f0: 65 20 69 64 65 61 20 69 73 20 74 6f 20 63 72 65  e idea is to cre
4500: 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ate a hot-journa
4510: 6c 20 66 69 6c 65 20 74 68 61 74 0a 20 20 20 20  l file that.    
4520: 23 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  # contains a mas
4530: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
4540: 74 65 72 20 73 6f 20 6c 61 72 67 65 20 74 68 61  ter so large tha
4550: 74 20 69 74 20 63 6f 75 6c 64 20 63 6f 6e 74 61  t it could conta
4560: 69 6e 0a 20 20 20 20 23 20 61 20 76 61 6c 69 64  in.    # a valid
4570: 20 70 61 67 65 20 72 65 63 6f 72 64 20 28 69 66   page record (if
4580: 20 74 68 65 20 66 69 6c 65 20 70 61 67 65 2d 73   the file page-s
4590: 69 7a 65 20 69 73 20 35 31 32 20 62 79 74 65 73  ize is 512 bytes
45a0: 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20 20 20 20  ). So as to.    
45b0: 23 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  # make sure SQLi
45c0: 74 65 20 64 6f 65 73 6e 27 74 20 67 65 74 20 63  te doesn't get c
45d0: 6f 6e 66 75 73 65 64 20 62 79 20 74 68 69 73 2e  onfused by this.
45e0: 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20 6e  .    #.    set n
45f0: 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20 35 31  Padding [expr 51
4600: 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  1 - $::mj_filena
4610: 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20 20 20 69  me_length].    i
4620: 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  f {$tcl_platform
4630: 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 77 69 6e  (platform)=="win
4640: 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20 20 20 23  dows"} {.      #
4650: 20 54 42 44 20 6e 65 65 64 20 74 6f 20 66 69 67   TBD need to fig
4660: 75 72 65 20 6f 75 74 20 68 6f 77 20 74 6f 20 64  ure out how to d
4670: 6f 20 74 68 69 73 20 63 6f 72 72 65 63 74 6c 79  o this correctly
4680: 20 66 6f 72 20 57 69 6e 64 6f 77 73 21 21 21 0a   for Windows!!!.
4690: 20 20 20 20 20 20 73 65 74 20 6e 50 61 64 64 69        set nPaddi
46a0: 6e 67 20 5b 65 78 70 72 20 32 35 35 20 2d 20 24  ng [expr 255 - $
46b0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65  ::mj_filename_le
46c0: 6e 67 74 68 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  ngth].    }..   
46d0: 20 23 20 57 65 20 63 61 6e 6e 6f 74 20 6a 75 73   # We cannot jus
46e0: 74 20 63 72 65 61 74 65 20 61 20 72 65 61 6c 6c  t create a reall
46f0: 79 20 6c 6f 6e 67 20 64 61 74 61 62 61 73 65 20  y long database 
4700: 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f 70 65  file name to ope
4710: 6e 2c 20 61 73 0a 20 20 20 20 23 20 4c 69 6e 75  n, as.    # Linu
4720: 78 20 6c 69 6d 69 74 73 20 61 20 73 69 6e 67 6c  x limits a singl
4730: 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 61  e component of a
4740: 20 70 61 74 68 20 74 6f 20 32 35 35 20 62 79 74   path to 255 byt
4750: 65 73 20 62 79 20 64 65 66 61 75 6c 74 0a 20 20  es by default.  
4760: 20 20 23 20 28 61 6e 64 20 70 72 65 73 75 6d 61    # (and presuma
4770: 62 6c 79 20 6f 74 68 65 72 20 73 79 73 74 65 6d  bly other system
4780: 73 20 68 61 76 65 20 6c 69 6d 69 74 73 20 74 6f  s have limits to
4790: 6f 29 2e 20 53 6f 20 63 72 65 61 74 65 20 61 20  o). So create a 
47a0: 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 23 20  directory.    # 
47b0: 68 69 65 72 61 72 63 68 79 20 74 6f 20 77 6f 72  hierarchy to wor
47c0: 6b 20 69 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20  k in..    #.    
47d0: 73 65 74 20 64 69 72 6e 61 6d 65 20 22 64 31 32  set dirname "d12
47e0: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
47f0: 39 30 31 32 33 34 35 36 37 38 39 30 2f 22 0a 20  901234567890/". 
4800: 20 20 20 73 65 74 20 6e 44 69 72 20 5b 65 78 70     set nDir [exp
4810: 72 20 24 6e 50 61 64 64 69 6e 67 20 2f 20 33 32  r $nPadding / 32
4820: 5d 0a 20 20 20 20 69 66 20 7b 20 24 6e 44 69 72  ].    if { $nDir
4830: 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 70   } {.      set p
4840: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
4850: 24 64 69 72 6e 61 6d 65 20 24 6e 44 69 72 5d 0a  $dirname $nDir].
4860: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
4870: 20 24 70 0a 20 20 20 20 20 20 63 64 20 24 70 0a   $p.      cd $p.
4880: 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 70      }..    set p
4890: 61 64 64 69 6e 67 20 5b 73 74 72 69 6e 67 20 72  adding [string r
48a0: 65 70 65 61 74 20 78 20 5b 65 78 70 72 20 24 6e  epeat x [expr $n
48b0: 50 61 64 64 69 6e 67 20 25 33 32 5d 5d 0a 20 20  Padding %32]].  
48c0: 20 20 73 65 74 20 70 72 65 66 69 78 20 22 74 65    set prefix "te
48d0: 73 74 2e 64 62 24 7b 70 61 64 64 69 6e 67 7d 22  st.db${padding}"
48e0: 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 76 61 6c 20  .  }.} {.  eval 
48f0: 24 74 63 6c 0a 20 20 66 6f 72 65 61 63 68 20 7b  $tcl.  foreach {
4900: 74 6e 32 20 73 71 6c 7d 20 7b 0a 20 20 20 20 6f  tn2 sql} {.    o
4910: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
4920: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
4930: 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  s=OFF;.      PRA
4940: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
4950: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  ous=OFF;.      P
4960: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4970: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4980: 20 7d 0a 20 20 20 20 6f 35 31 32 20 7b 20 0a 20   }.    o512 { . 
4990: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
49a0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46  .synchronous=OFF
49b0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
49c0: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  ux.synchronous=O
49d0: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
49e0: 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 20   main.page_size 
49f0: 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50 52 41  = 512;.      PRA
4a00: 47 4d 41 20 61 75 78 2e 70 61 67 65 5f 73 69 7a  GMA aux.page_siz
4a10: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50  e = 512;.      P
4a20: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4a30: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4a40: 20 7d 0a 20 20 20 20 6e 20 7b 20 0a 20 20 20 20   }.    n { .    
4a50: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
4a60: 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
4a70: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
4a80: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  ux.synchronous=N
4a90: 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41  ORMAL;.      PRA
4aa0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
4ab0: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d   = DELETE;.    }
4ac0: 0a 20 20 20 20 66 20 7b 20 0a 20 20 20 20 20 20  .    f { .      
4ad0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63  PRAGMA main.sync
4ae0: 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20  hronous=FULL;.  
4af0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
4b00: 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b  ynchronous=FULL;
4b10: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
4b20: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
4b30: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  ETE;.    }.  } {
4b40: 0a 0a 20 20 20 20 73 65 74 20 74 6e 20 22 24 7b  ..    set tn "${
4b50: 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a 20 20 0a  tn1}.${tn2}".  .
4b60: 20 20 20 20 23 20 53 65 74 20 75 70 20 61 20 63      # Set up a c
4b70: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 68 61 76  onnection to hav
4b80: 65 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c  e two databases,
4b90: 20 74 65 73 74 2e 64 62 20 28 6d 61 69 6e 29 20   test.db (main) 
4ba0: 61 6e 64 20 0a 20 20 20 20 23 20 74 65 73 74 2e  and .    # test.
4bb0: 64 62 32 20 28 61 75 78 29 2e 20 54 68 65 6e 20  db2 (aux). Then 
4bc0: 72 75 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  run a multi-file
4bd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
4be0: 74 68 65 6d 2e 20 54 68 65 0a 20 20 20 20 23 20  them. The.    # 
4bf0: 56 46 53 20 77 69 6c 6c 20 73 6e 61 70 73 68 6f  VFS will snapsho
4c00: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
4c10: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  m just before th
4c20: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
4c30: 0a 20 20 20 20 23 20 66 69 6c 65 20 69 73 20 64  .    # file is d
4c40: 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74  eleted to commit
4c50: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4c60: 2e 0a 20 20 20 20 23 0a 20 20 20 20 74 76 20 66  ..    #.    tv f
4c70: 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20  ilter xDelete.  
4c80: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
4c90: 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  -4.4.$tn.1 {.   
4ca0: 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65     faultsim_dele
4cb0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70  te_and_reopen $p
4cc0: 72 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63  refix.      exec
4cd0: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 41 54  sql ".        AT
4ce0: 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32  TACH '${prefix}2
4cf0: 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20  ' AS aux;.      
4d00: 20 20 24 73 71 6c 0a 20 20 20 20 20 20 20 20 43    $sql.        C
4d10: 52 45 41 54 45 20 54 41 42 4c 45 20 61 28 78 29  REATE TABLE a(x)
4d20: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
4d30: 20 54 41 42 4c 45 20 61 75 78 2e 62 28 78 29 3b   TABLE aux.b(x);
4d40: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4d50: 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 64  INTO a VALUES('d
4d60: 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a 20 20 20  ouble-you');.   
4d70: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4d80: 20 61 20 56 41 4c 55 45 53 28 27 77 68 79 27 29   a VALUES('why')
4d90: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
4da0: 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27   INTO a VALUES('
4db0: 7a 65 64 27 29 3b 0a 20 20 20 20 20 20 20 20 49  zed');.        I
4dc0: 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c  NSERT INTO b VAL
4dd0: 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20 20 20 20  UES('won');.    
4de0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4df0: 62 20 56 41 4c 55 45 53 28 27 74 6f 6f 27 29 3b  b VALUES('too');
4e00: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4e10: 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 66  INTO b VALUES('f
4e20: 72 65 65 27 29 3b 0a 20 20 20 20 20 20 22 0a 20  ree');.      ". 
4e30: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20       execsql {. 
4e40: 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20         BEGIN;.  
4e50: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4e60: 4e 54 4f 20 61 20 53 45 4c 45 43 54 20 2a 20 46  NTO a SELECT * F
4e70: 52 4f 4d 20 62 20 57 48 45 52 45 20 72 6f 77 69  ROM b WHERE rowi
4e80: 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 20 20  d<=3;.          
4e90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 53 45  INSERT INTO b SE
4ea0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 20 57 48  LECT * FROM a WH
4eb0: 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20  ERE rowid<=3;.  
4ec0: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
4ed0: 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20      }.    } {}. 
4ee0: 20 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a     tv filter {}.
4ef0: 20 20 20 20 0a 20 20 20 20 23 20 43 68 65 63 6b      .    # Check
4f00: 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
4f10: 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
4f20: 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ted successfully
4f30: 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 65  ..    #.    do_e
4f40: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
4f50: 72 31 2d 34 2e 34 2e 24 74 6e 2e 32 20 7b 0a 20  r1-4.4.$tn.2 {. 
4f60: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
4f70: 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62  OM a.    } {doub
4f80: 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77  le-you why zed w
4f90: 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20  on too free}.   
4fa0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
4fb0: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
4fc0: 33 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  3 {.      SELECT
4fd0: 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20   * FROM b.    } 
4fe0: 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f  {won too free do
4ff0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
5000: 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52 65 73  }.    .    # Res
5010: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
5020: 73 74 65 6d 20 61 6e 64 20 72 65 6f 70 65 6e 20  stem and reopen 
5030: 74 68 65 20 64 61 74 61 62 61 73 65 73 2e 20 43  the databases. C
5040: 68 65 63 6b 20 74 68 61 74 20 69 74 20 6e 6f 77  heck that it now
5050: 0a 20 20 20 20 23 20 61 70 70 65 61 72 73 20 74  .    # appears t
5060: 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
5070: 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d  ion was not comm
5080: 69 74 74 65 64 20 28 62 65 63 61 75 73 65 20 74  itted (because t
5090: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 20  he file-system. 
50a0: 20 20 20 23 20 77 61 73 20 72 65 73 74 6f 72 65     # was restore
50b0: 64 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 77  d to the state w
50c0: 68 65 72 65 20 69 74 20 68 61 64 20 6e 6f 74 20  here it had not 
50d0: 62 65 65 6e 29 2e 0a 20 20 20 20 23 0a 20 20 20  been)..    #.   
50e0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
50f0: 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20  4.4.$tn.4 {.    
5100: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
5110: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70  re_and_reopen $p
5120: 72 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63  refix.      exec
5130: 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70  sql "ATTACH '${p
5140: 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22  refix}2' AS aux"
5150: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
5160: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5170: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35 20 7b  ger1-4.4.$tn.5 {
5180: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 7d  SELECT * FROM a}
5190: 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79   {double-you why
51a0: 20 7a 65 64 7d 0a 20 20 20 20 64 6f 5f 65 78 65   zed}.    do_exe
51b0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
51c0: 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45 4c 45  -4.4.$tn.6 {SELE
51d0: 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b 77 6f  CT * FROM b} {wo
51e0: 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20  n too free}.    
51f0: 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74  .    # Restore t
5200: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61  he file-system a
5210: 67 61 69 6e 2e 20 54 68 69 73 20 74 69 6d 65 2c  gain. This time,
5220: 20 62 65 66 6f 72 65 20 72 65 6f 70 65 6e 69 6e   before reopenin
5230: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2c  g the databases,
5240: 0a 20 20 20 20 23 20 64 65 6c 65 74 65 20 74 68  .    # delete th
5250: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
5260: 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66   file from the f
5270: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 49 74 20 6e  ile-system. It n
5280: 6f 77 20 61 70 70 65 61 72 73 20 74 68 61 74 0a  ow appears that.
5290: 20 20 20 20 23 20 74 68 65 20 74 72 61 6e 73 61      # the transa
52a0: 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
52b0: 74 65 64 20 28 6e 6f 20 6d 61 73 74 65 72 2d 6a  ted (no master-j
52c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 3d 3d 20 6e  ournal file == n
52d0: 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 20  o rollback)..   
52e0: 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70   #.    do_test p
52f0: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 37 20  ager1-4.4.$tn.7 
5300: 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d  {.      faultsim
5310: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5320: 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20  pen $prefix.    
5330: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
5340: 62 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a 2a 5d  b ${prefix}-mj*]
5350: 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24   { forcedelete $
5360: 66 20 7d 0a 20 20 20 20 20 20 65 78 65 63 73 71  f }.      execsq
5370: 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70 72 65  l "ATTACH '${pre
5380: 66 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a 20  fix}2' AS aux". 
5390: 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f 65     } {}.    do_e
53a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
53b0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b 0a 20  r1-4.4.$tn.8 {. 
53c0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
53d0: 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62  OM a.    } {doub
53e0: 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77  le-you why zed w
53f0: 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20  on too free}.   
5400: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
5410: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5420: 39 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  9 {.      SELECT
5430: 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20   * FROM b.    } 
5440: 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f  {won too free do
5450: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
5460: 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70 77 64  }.  }..  cd $pwd
5470: 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  .}.db close.tv d
5480: 65 6c 65 74 65 0a 66 6f 72 63 65 64 65 6c 65 74  elete.forcedelet
5490: 65 20 24 64 69 72 6e 61 6d 65 0a 0a 0a 23 20 53  e $dirname...# S
54a0: 65 74 20 75 70 20 61 20 56 46 53 20 74 6f 20 6d  et up a VFS to m
54b0: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
54c0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75  e file-system ju
54d0: 73 74 20 62 65 66 6f 72 65 20 64 65 6c 65 74 69  st before deleti
54e0: 6e 67 20 61 0a 23 20 6a 6f 75 72 6e 61 6c 20 66  ng a.# journal f
54f0: 69 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20  ile to commit a 
5500: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
5510: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 6f 64   transaction mod
5520: 69 66 69 65 73 20 65 78 61 63 74 6c 79 0a 23 20  ifies exactly.# 
5530: 74 77 6f 20 64 61 74 61 62 61 73 65 20 70 61 67  two database pag
5540: 65 73 20 28 61 6e 64 20 70 61 67 65 20 31 20 2d  es (and page 1 -
5550: 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
5560: 74 65 72 29 2e 0a 23 0a 74 65 73 74 76 66 73 20  ter)..#.testvfs 
5570: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76  tv -default 1.tv
5580: 20 73 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a   sectorsize 512.
5590: 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f  tv script copy_o
55a0: 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65  n_journal_delete
55b0: 0a 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65  .tv filter xDele
55c0: 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f  te.proc copy_on_
55d0: 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b  journal_delete {
55e0: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
55f0: 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73  args} {.  if {[s
5600: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75  tring match *jou
5610: 72 6e 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d  rnal $filename]}
5620: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a   faultsim_save .
5630: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5640: 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65  OK.}.faultsim_de
5650: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
5660: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5670: 70 61 67 65 72 31 2e 34 2e 35 2e 31 20 7b 0a 20  pager1.4.5.1 {. 
5680: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
5690: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
56a0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
56b0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 43 52 45 41  e = 1024;.  CREA
56c0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
56d0: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
56e0: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 49 4e  E t2(a, b);.  IN
56f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5700: 55 45 53 28 27 49 27 2c 20 27 49 49 27 29 3b 0a  UES('I', 'II');.
5710: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
5720: 20 56 41 4c 55 45 53 28 27 49 49 49 27 2c 20 27   VALUES('III', '
5730: 49 56 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  IV');.  BEGIN;. 
5740: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5750: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
5760: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5770: 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t2 VALUES(3, 4);
5780: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65  .  COMMIT;.} {de
5790: 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65 72 20  lete}.tv filter 
57a0: 7b 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68 65 20  {}..# Check the 
57b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
57c0: 63 6f 6d 6d 69 74 74 65 64 3a 0a 23 0a 64 6f 5f  committed:.#.do_
57d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
57e0: 65 72 31 2e 34 2e 35 2e 32 20 7b 0a 20 20 53 45  er1.4.5.2 {.  SE
57f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
5800: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5810: 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 20  t2;.} {I II 1 2 
5820: 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 23 20 4e  III IV 3 4}..# N
5830: 6f 77 20 74 72 79 20 66 6f 75 72 20 74 65 73 74  ow try four test
5840: 73 3a 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34  s:.#.#  pager1-4
5850: 2e 35 2e 33 3a 20 52 65 73 74 6f 72 65 20 74 68  .5.3: Restore th
5860: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43  e file-system. C
5870: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 77 68  heck that the wh
5880: 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ole transaction 
5890: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
58a0: 20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b    is rolled back
58b0: 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e  ..#.#  pager1-4.
58c0: 35 2e 34 3a 20 52 65 73 74 6f 72 65 20 74 68 65  5.4: Restore the
58d0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f   file-system. Co
58e0: 72 72 75 70 74 20 74 68 65 20 66 69 72 73 74 20  rrupt the first 
58f0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 0a 23 20  record in the.# 
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
5910: 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74 68  ournal. Check th
5920: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
5930: 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b   not rolled back
5940: 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e  ..#.#  pager1-4.
5950: 35 2e 35 3a 20 52 65 73 74 6f 72 65 20 74 68 65  5.5: Restore the
5960: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f   file-system. Co
5970: 72 72 75 70 74 20 74 68 65 20 73 65 63 6f 6e 64  rrupt the second
5980: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 0a 23   record in the.#
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74  journal. Check t
59b0: 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 65  hat the first re
59c0: 63 6f 72 64 20 69 6e 20 74 68 65 20 74 72 61 6e  cord in the tran
59d0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 20 20  saction is .#   
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 61               pla
59f0: 79 65 64 20 62 61 63 6b 2c 20 62 75 74 20 6e 6f  yed back, but no
5a00: 74 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 23 0a  t the second..#.
5a10: 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e 36 3a  #  pager1-4.5.6:
5a20: 20 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c   Restore the fil
5a30: 65 2d 73 79 73 74 65 6d 2e 20 54 72 79 20 74 6f  e-system. Try to
5a40: 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
5a50: 73 65 20 77 69 74 68 20 61 0a 23 20 20 20 20 20  se with a.#     
5a60: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 6f             reado
5a70: 6e 6c 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  nly connection. 
5a80: 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c  This should fail
5a90: 2c 20 61 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  , as a read-only
5aa0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5ab0: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e    connection can
5ac0: 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68  not roll back th
5ad0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5ae0: 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .#.faultsim_rest
5af0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ore_and_reopen.d
5b00: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5b10: 61 67 65 72 31 2e 34 2e 35 2e 33 20 7b 0a 20 20  ager1.4.5.3 {.  
5b20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5b30: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5b40: 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49 49  M t2;.} {I II II
5b50: 49 20 49 56 7d 0a 66 61 75 6c 74 73 69 6d 5f 72  I IV}.faultsim_r
5b60: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
5b70: 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65  n.hexio_write te
5b80: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
5b90: 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34 20 2d  xpr 512+4+1024 -
5ba0: 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39   202] 0123456789
5bb0: 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71  ABCDEF.do_execsq
5bc0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5bd0: 35 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.4 {.  SELECT *
5be0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5bf0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5c00: 7b 49 20 49 49 20 31 20 32 20 49 49 49 20 49 56  {I II 1 2 III IV
5c10: 20 33 20 34 7d 0a 66 61 75 6c 74 73 69 6d 5f 72   3 4}.faultsim_r
5c20: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
5c30: 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65  n.hexio_write te
5c40: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
5c50: 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34 2b 34  xpr 512+4+1024+4
5c60: 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30  +4+1024 - 202] 0
5c70: 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0a  123456789ABCDEF.
5c80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5c90: 70 61 67 65 72 31 2e 34 2e 35 2e 35 20 7b 0a 20  pager1.4.5.5 {. 
5ca0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5cb0: 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  1;.  SELECT * FR
5cc0: 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49  OM t2;.} {I II I
5cd0: 49 49 20 49 56 20 33 20 34 7d 0a 0a 66 61 75 6c  II IV 3 4}..faul
5ce0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5cf0: 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65  _reopen.db close
5d00: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
5d10: 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a  .db -readonly 1.
5d20: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
5d30: 20 70 61 67 65 72 31 2e 34 2e 35 2e 36 20 7b 0a   pager1.4.5.6 {.
5d40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5d50: 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  t1;.  SELECT * F
5d60: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b 64 69  ROM t2;.} {1 {di
5d70: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 64  sk I/O error}}.d
5d80: 62 20 63 6c 6f 73 65 0a 0a 23 20 53 6e 61 70 73  b close..# Snaps
5d90: 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hot the file-sys
5da0: 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20  tem just before 
5db0: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
5dc0: 74 2e 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65  t. Save the name
5dd0: 0a 23 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  .# of the master
5de0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
5df0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e   $::mj_filename.
5e00: 0a 23 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70  .#.tv script cop
5e10: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 74  y_on_mj_delete.t
5e20: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
5e30: 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a  .proc copy_on_mj
5e40: 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20  _delete {method 
5e50: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
5e60: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  .  if {[string m
5e70: 61 74 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20  atch *mj* [file 
5e80: 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d  tail $filename]]
5e90: 7d 20 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d  } { .    set ::m
5ea0: 6a 5f 66 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65  j_filename $file
5eb0: 6e 61 6d 65 0a 20 20 20 20 66 61 75 6c 74 73 69  name.    faultsi
5ec0: 6d 5f 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65  m_save .  }.  re
5ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
5ee0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
5ef0: 34 2e 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  4.6.1 {.  faults
5f00: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
5f10: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
5f20: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
5f30: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
5f40: 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74  E;.    ATTACH 't
5f50: 65 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b  est.db2' AS two;
5f60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5f70: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
5f80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f  CREATE TABLE two
5f90: 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49  .t2(a, b);.    I
5fa0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
5fb0: 4c 55 45 53 28 31 2c 20 27 74 31 2e 31 27 29 3b  LUES(1, 't1.1');
5fc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5fd0: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 27 74   t2 VALUES(1, 't
5fe0: 32 2e 31 27 29 3b 0a 20 20 20 20 42 45 47 49 4e  2.1');.    BEGIN
5ff0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
6000: 31 20 53 45 54 20 62 20 3d 20 27 74 31 2e 32 27  1 SET b = 't1.2'
6010: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
6020: 32 20 53 45 54 20 62 20 3d 20 27 74 32 2e 32 27  2 SET b = 't2.2'
6030: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
6040: 7d 0a 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d  }.  tv filter {}
6050: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d  .  db close.} {}
6060: 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f  ..faultsim_resto
6070: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  re_and_reopen.do
6080: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
6090: 67 65 72 31 2e 34 2e 36 2e 32 20 7b 20 53 45 4c  ger1.4.6.2 { SEL
60a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
60b0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 74 31 2e            {1 t1.
60c0: 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20  1}.do_test      
60d0: 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 33 20     pager1.4.6.3 
60e0: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
60f0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b  :mj_filename } {
6100: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
6110: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 34 20  st pager1.4.6.4 
6120: 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74  {.  ATTACH 'test
6130: 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20  .db2' AS two;.  
6140: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
6150: 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f  ;.} {1 t2.1}.do_
6160: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6170: 35 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  5 { file exists 
6180: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d  $::mj_filename }
6190: 20 7b 30 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72   {0}..faultsim_r
61a0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
61b0: 6e 0a 64 62 20 63 6c 6f 73 65 0a 64 6f 5f 74 65  n.db close.do_te
61c0: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 38 20  st pager1.4.6.8 
61d0: 7b 0a 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c  {.  set ::mj_fil
61e0: 65 6e 61 6d 65 31 20 24 3a 3a 6d 6a 5f 66 69 6c  ename1 $::mj_fil
61f0: 65 6e 61 6d 65 0a 20 20 74 76 20 66 69 6c 74 65  ename.  tv filte
6200: 72 20 78 44 65 6c 65 74 65 0a 20 20 73 71 6c 69  r xDelete.  sqli
6210: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 32 0a  te3 db test.db2.
6220: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6230: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
6240: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
6250: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
6260: 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20  b3' AS three;.  
6270: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
6280: 68 72 65 65 2e 74 33 28 61 2c 20 62 29 3b 0a 20  hree.t3(a, b);. 
6290: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
62a0: 33 20 56 41 4c 55 45 53 28 31 2c 20 27 74 33 2e  3 VALUES(1, 't3.
62b0: 31 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  1');.    BEGIN;.
62c0: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 32 20        UPDATE t2 
62d0: 53 45 54 20 62 20 3d 20 27 74 32 2e 33 27 3b 0a  SET b = 't2.3';.
62e0: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 33 20        UPDATE t3 
62f0: 53 45 54 20 62 20 3d 20 27 74 33 2e 33 27 3b 0a  SET b = 't3.3';.
6300: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
6310: 20 20 65 78 70 72 20 7b 24 3a 3a 6d 6a 5f 66 69    expr {$::mj_fi
6320: 6c 65 6e 61 6d 65 31 20 21 3d 20 24 3a 3a 6d 6a  lename1 != $::mj
6330: 5f 66 69 6c 65 6e 61 6d 65 7d 0a 7d 20 7b 31 7d  _filename}.} {1}
6340: 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72  .faultsim_restor
6350: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 74 76 20  e_and_reopen.tv 
6360: 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 54 68 65  filter {}..# The
6370: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6e 6f 77   file-system now
6380: 20 63 6f 6e 74 61 69 6e 73 3a 0a 23 0a 23 20 20   contains:.#.#  
6390: 20 2a 20 74 68 72 65 65 20 64 61 74 61 62 61 73   * three databas
63a0: 65 73 0a 23 20 20 20 2a 20 74 68 72 65 65 20 68  es.#   * three h
63b0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ot-journal files
63c0: 0a 23 20 20 20 2a 20 74 77 6f 20 6d 61 73 74 65  .#   * two maste
63d0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r-journal files.
63e0: 0a 23 0a 23 20 54 68 65 20 68 6f 74 2d 6a 6f 75  .#.# The hot-jou
63f0: 72 6e 61 6c 73 20 61 73 73 6f 63 69 61 74 65 64  rnals associated
6400: 20 77 69 74 68 20 74 65 73 74 2e 64 62 32 20 61   with test.db2 a
6410: 6e 64 20 74 65 73 74 2e 64 62 33 20 70 6f 69 6e  nd test.db3 poin
6420: 74 20 74 6f 0a 23 20 6d 61 73 74 65 72 20 6a 6f  t to.# master jo
6430: 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65  urnal $::mj_file
6440: 6e 61 6d 65 2e 20 54 68 65 20 68 6f 74 2d 6a 6f  name. The hot-jo
6450: 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f 63  urnal file assoc
6460: 69 61 74 65 64 20 77 69 74 68 0a 23 20 74 65 73  iated with.# tes
6470: 74 2e 64 62 20 70 6f 69 6e 74 73 20 74 6f 20 6d  t.db points to m
6480: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a  aster journal $:
6490: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 20 53  :mj_filename1. S
64a0: 6f 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 0a 23  o reading from.#
64b0: 20 74 65 73 74 2e 64 62 20 73 68 6f 75 6c 64 20   test.db should 
64c0: 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c  delete $::mj_fil
64d0: 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73  ename1..#.do_tes
64e0: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 39 20 7b  t pager1.4.6.9 {
64f0: 0a 20 20 6c 73 6f 72 74 20 5b 67 6c 6f 62 20 74  .  lsort [glob t
6500: 65 73 74 2e 64 62 2a 5d 0a 7d 20 5b 6c 73 6f 72  est.db*].} [lsor
6510: 74 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20  t [list         
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6540: 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 20 74 65    \.  test.db te
6550: 73 74 2e 64 62 32 20 74 65 73 74 2e 64 62 33 20  st.db2 test.db3 
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
6580: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
6590: 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61   test.db2-journa
65a0: 6c 20 74 65 73 74 2e 64 62 33 2d 6a 6f 75 72 6e  l test.db3-journ
65b0: 61 6c 20 20 20 20 20 20 5c 0a 20 20 5b 66 69 6c  al      \.  [fil
65c0: 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c  e tail $::mj_fil
65d0: 65 6e 61 6d 65 5d 20 5b 66 69 6c 65 20 74 61 69  ename] [file tai
65e0: 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  l $::mj_filename
65f0: 31 5d 0a 5d 5d 0a 0a 23 20 54 68 65 20 6d 61 73  1].]]..# The mas
6600: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d  ter-journal $::m
6610: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 63 6f 6e 74  j_filename1 cont
6620: 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
6630: 20 74 65 73 74 2e 64 62 20 61 6e 64 20 0a 23 20   test.db and .# 
6640: 74 65 73 74 2e 64 62 32 2e 20 48 6f 77 65 76 65  test.db2. Howeve
6650: 72 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  r the hot-journa
6660: 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  l associated wit
6670: 68 20 74 65 73 74 2e 64 62 32 20 70 6f 69 6e 74  h test.db2 point
6680: 73 20 74 6f 0a 23 20 61 20 64 69 66 66 65 72 65  s to.# a differe
6690: 6e 74 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  nt master-journa
66a0: 6c 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 72 65  l. Therefore, re
66b0: 61 64 69 6e 67 20 66 72 6f 6d 20 74 65 73 74 2e  ading from test.
66c0: 64 62 20 6f 6e 6c 79 20 73 68 6f 75 6c 64 0a 23  db only should.#
66d0: 20 62 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 61   be enough to ca
66e0: 75 73 65 20 53 51 4c 69 74 65 20 74 6f 20 64 65  use SQLite to de
66f0: 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  lete $::mj_filen
6700: 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ame1..#.do_test 
6710: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
6720: 2e 36 2e 31 30 20 7b 20 66 69 6c 65 20 65 78 69  .6.10 { file exi
6730: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6740: 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  me  } {1}.do_tes
6750: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
6760: 2e 34 2e 36 2e 31 31 20 7b 20 66 69 6c 65 20 65  .4.6.11 { file e
6770: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6780: 6e 61 6d 65 31 20 7d 20 7b 31 7d 0a 64 6f 5f 65  name1 } {1}.do_e
6790: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
67a0: 72 31 2e 34 2e 36 2e 31 32 20 7b 20 53 45 4c 45  r1.4.6.12 { SELE
67b0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b  CT * FROM t1 } {
67c0: 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20  1 t1.1}.do_test 
67d0: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
67e0: 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69  .6.13 { file exi
67f0: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6800: 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  me  } {1}.do_tes
6810: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
6820: 2e 34 2e 36 2e 31 34 20 7b 20 66 69 6c 65 20 65  .4.6.14 { file e
6830: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6840: 6e 61 6d 65 31 20 7d 20 7b 30 7d 0a 0a 64 6f 5f  name1 } {0}..do_
6850: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
6860: 65 72 31 2e 34 2e 36 2e 31 32 20 7b 0a 20 20 41  er1.4.6.12 {.  A
6870: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
6880: 20 41 53 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43   AS two;.  SELEC
6890: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
68a0: 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20  1 t2.1}.do_test 
68b0: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
68c0: 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69  .6.13 { file exi
68d0: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
68e0: 6d 65 20 7d 20 20 7b 31 7d 0a 64 6f 5f 65 78 65  me }  {1}.do_exe
68f0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
6900: 2e 34 2e 36 2e 31 34 20 7b 0a 20 20 41 54 54 41  .4.6.14 {.  ATTA
6910: 43 48 20 27 74 65 73 74 2e 64 62 33 27 20 41 53  CH 'test.db3' AS
6920: 20 74 68 72 65 65 3b 0a 20 20 53 45 4c 45 43 54   three;.  SELECT
6930: 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 31   * FROM t3;.} {1
6940: 20 74 33 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20   t3.1}.do_test  
6950: 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e         pager1.4.
6960: 36 2e 31 35 20 7b 20 66 69 6c 65 20 65 78 69 73  6.15 { file exis
6970: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  ts $::mj_filenam
6980: 65 20 7d 20 20 7b 30 7d 0a 0a 64 62 20 63 6c 6f  e }  {0}..db clo
6990: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74 65  se.tv delete..te
69a0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
69b0: 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a  t 1.tv sectorsiz
69c0: 65 20 35 31 32 0a 74 76 20 73 63 72 69 70 74 20  e 512.tv script 
69d0: 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f  copy_on_journal_
69e0: 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72  delete.tv filter
69f0: 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f   xDelete.proc co
6a00: 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65  py_on_journal_de
6a10: 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c  lete {method fil
6a20: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
6a30: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
6a40: 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65  h *journal $file
6a50: 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f  name]} faultsim_
6a60: 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53  save .  return S
6a70: 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74  QLITE_OK.}.fault
6a80: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
6a90: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
6aa0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37  _test pager1.4.7
6ab0: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f  .1 {.  PRAGMA jo
6ac0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
6ad0: 45 54 45 3b 0a 20 20 43 52 45 41 54 45 20 54 41  ETE;.  CREATE TA
6ae0: 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59  BLE t1(x PRIMARY
6af0: 20 4b 45 59 2c 20 79 29 3b 0a 20 20 43 52 45 41   KEY, y);.  CREA
6b00: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
6b10: 31 28 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  1(y);.  INSERT I
6b20: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49  NTO t1 VALUES('I
6b30: 27 2c 20 20 20 27 6f 6e 65 27 29 3b 0a 20 20 49  ',   'one');.  I
6b40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6b50: 4c 55 45 53 28 27 49 49 27 2c 20 20 27 66 6f 75  LUES('II',  'fou
6b60: 72 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  r');.  INSERT IN
6b70: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 49  TO t1 VALUES('II
6b80: 49 27 2c 20 27 6e 69 6e 65 27 29 3b 0a 20 20 42  I', 'nine');.  B
6b90: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
6ba0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6bb0: 27 49 56 27 2c 20 27 73 69 78 74 65 65 6e 27 29  'IV', 'sixteen')
6bc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6bd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 56 27 20  O t1 VALUES('V' 
6be0: 2c 20 27 74 77 65 6e 74 79 66 69 76 65 27 29 3b  , 'twentyfive');
6bf0: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65  .  COMMIT;.} {de
6c00: 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65 72 20  lete}.tv filter 
6c10: 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  {}.db close.tv d
6c20: 65 6c 65 74 65 20 0a 64 6f 5f 74 65 73 74 20 70  elete .do_test p
6c30: 61 67 65 72 31 2e 34 2e 37 2e 32 20 7b 0a 20 20  ager1.4.7.2 {.  
6c40: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
6c50: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 63 61  _and_reopen.  ca
6c60: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
6c70: 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  utes test.db-jou
6c80: 72 6e 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e  rnal -permission
6c90: 73 20 72 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63  s r--------}.  c
6ca0: 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69  atch {file attri
6cb0: 62 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f  butes test.db-jo
6cc0: 75 72 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20  urnal -readonly 
6cd0: 31 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  1}.  catchsql { 
6ce0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
6cf0: 20 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20   }.} {1 {unable 
6d00: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
6d10: 20 66 69 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20   file}}.do_test 
6d20: 70 61 67 65 72 31 2e 34 2e 37 2e 33 20 7b 0a 20  pager1.4.7.3 {. 
6d30: 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63   db close.  catc
6d40: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
6d50: 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  es test.db-journ
6d60: 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20  al -permissions 
6d70: 72 77 2d 72 77 2d 72 77 2d 7d 0a 20 20 63 61 74  rw-rw-rw-}.  cat
6d80: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6d90: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
6da0: 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 30 7d  nal -readonly 0}
6db0: 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74  .  delete_file t
6dc0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20  est.db-journal. 
6dd0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
6de0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
6df0: 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  0}.do_test pager
6e00: 31 2e 34 2e 38 2e 31 20 7b 0a 20 20 63 61 74 63  1.4.8.1 {.  catc
6e10: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
6e20: 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72 6d  es test.db -perm
6e30: 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d 2d  issions r-------
6e40: 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65  -}.  catch {file
6e50: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
6e60: 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20 31 7d  .db -readonly 1}
6e70: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
6e80: 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c 20  st.db.  db eval 
6e90: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6ea0: 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 64  t1 }.  sqlite3_d
6eb0: 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 6d 61  b_readonly db ma
6ec0: 69 6e 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  in.} {1}.do_test
6ed0: 20 70 61 67 65 72 31 2e 34 2e 38 2e 32 20 7b 0a   pager1.4.8.2 {.
6ee0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61    sqlite3_db_rea
6ef0: 64 6f 6e 6c 79 20 64 62 20 78 79 7a 0a 7d 20 7b  donly db xyz.} {
6f00: 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  -1}.do_test page
6f10: 72 31 2e 34 2e 38 2e 33 20 7b 0a 20 20 64 62 20  r1.4.8.3 {.  db 
6f20: 63 6c 6f 73 65 0a 20 20 63 61 74 63 68 20 7b 66  close.  catch {f
6f30: 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74  ile attributes t
6f40: 65 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79  est.db -readonly
6f50: 20 30 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c   0}.  catch {fil
6f60: 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73  e attributes tes
6f70: 74 2e 64 62 20 2d 70 65 72 6d 69 73 73 69 6f 6e  t.db -permission
6f80: 73 20 72 77 2d 72 77 2d 72 77 2d 7d 20 6d 73 67  s rw-rw-rw-} msg
6f90: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
6fa0: 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c 20  st.db.  db eval 
6fb0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6fc0: 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 64  t1 }.  sqlite3_d
6fd0: 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 6d 61  b_readonly db ma
6fe0: 69 6e 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d  in.} {0}..#-----
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7030: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
7040: 77 69 6e 67 20 74 65 73 74 73 20 64 65 61 6c 20  wing tests deal 
7050: 77 69 74 68 20 6d 75 6c 74 69 2d 66 69 6c 65 20  with multi-file 
7060: 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20 70 61 67  commits..#.# pag
7070: 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68 65 20 63  er1-5.1.*: The c
7080: 61 73 65 20 77 68 65 72 65 20 61 20 6d 75 6c 74  ase where a mult
7090: 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  i-file cannot be
70a0: 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 63 61 75   committed becau
70b0: 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  se.#            
70c0: 20 20 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65     another conne
70d0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
70e0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
70f0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a 23 20 20  n one of the.#  
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
7110: 65 73 2e 20 41 66 74 65 72 20 74 68 65 20 53 48  es. After the SH
7120: 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 6d  ARED lock is rem
7130: 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d 4d 49 54  oved, the COMMIT
7140: 20 73 75 63 63 65 65 64 73 2e 0a 23 0a 23 20 70   succeeds..#.# p
7150: 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20 4d 75 6c  ager1-5.2.*: Mul
7160: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20  ti-file commits 
7170: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
7180: 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61  e=memory..#.# pa
7190: 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d 75 6c 74  ger1-5.3.*: Mult
71a0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20 77  i-file commits w
71b0: 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
71c0: 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61 67  =memory..#.# pag
71d0: 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68 65 63 6b  er1-5.4.*: Check
71e0: 20 74 68 61 74 20 77 69 74 68 20 73 79 6e 63 68   that with synch
71f0: 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c 2c 20 74  ronous=normal, t
7200: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
7210: 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20  l file.#        
7220: 20 20 20 20 20 20 20 6e 61 6d 65 20 69 73 20 61         name is a
7230: 64 64 65 64 20 74 6f 20 61 20 6a 6f 75 72 6e 61  dded to a journa
7240: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
7250: 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  ly after the las
7260: 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  t.#             
7270: 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64    journal record
7280: 2e 20 42 75 74 20 77 69 74 68 20 73 79 6e 63 68  . But with synch
7290: 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20 65 78 74  ronous=full, ext
72a0: 72 61 20 75 6e 75 73 65 64 20 73 70 61 63 65 0a  ra unused space.
72b0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
72c0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 74  is allocated bet
72d0: 77 65 65 6e 20 74 68 65 20 6c 61 73 74 20 6a 6f  ween the last jo
72e0: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 61 6e 64  urnal record and
72f0: 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20 20   the .#         
7300: 20 20 20 20 20 20 6d 61 73 74 65 72 2d 6a 6f 75        master-jou
7310: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 73  rnal file name s
7320: 6f 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65  o that the maste
7330: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23  r-journal file.#
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
7350: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 6c 69 65  ame does not lie
7360: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63   on the same sec
7370: 74 6f 72 20 61 73 20 74 68 65 20 6c 61 73 74 20  tor as the last 
7380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20  journal file.#  
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 63               rec
73a0: 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  ord..#.# pager1-
73b0: 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61  5.5.*: Check tha
73c0: 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  t in journal_mod
73d0: 65 3d 50 45 52 53 49 53 54 20 6d 6f 64 65 2c 20  e=PERSIST mode, 
73e0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
73f0: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
7400: 20 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a    truncated to z
7410: 65 72 6f 20 62 79 74 65 73 20 77 68 65 6e 20 61  ero bytes when a
7420: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
7430: 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 20 20  saction is .#   
7440: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d              comm
7450: 69 74 74 65 64 20 28 69 6e 73 74 65 61 64 20 6f  itted (instead o
7460: 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  f the first coup
7470: 6c 65 20 6f 66 20 62 79 74 65 73 20 62 65 69 6e  le of bytes bein
7480: 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a 23 0a 64  g zeroed)..#.#.d
7490: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
74a0: 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
74b0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
74c0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
74d0: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
74e0: 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20  db2' AS aux;.   
74f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
7500: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
7510: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28  TE TABLE aux.t2(
7520: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
7530: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
7540: 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29 3b 0a 20  (17, 'Lenin');. 
7550: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7560: 31 20 56 41 4c 55 45 53 28 32 32 2c 20 27 53 74  1 VALUES(22, 'St
7570: 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  alin');.    INSE
7580: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7590: 53 28 35 33 2c 20 27 4b 68 72 75 73 68 63 68 65  S(53, 'Khrushche
75a0: 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  v');.  }.} {}.do
75b0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
75c0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
75d0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
75e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
75f0: 20 56 41 4c 55 45 53 28 36 34 2c 20 27 42 72 65   VALUES(64, 'Bre
7600: 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20 20 20 49  zhnev');.      I
7610: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
7620: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
7630: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
7640: 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65  2 test.db2.  exe
7650: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
7660: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
7670: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 64 62   FROM t2;.  } db
7680: 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  2.} {}.do_test p
7690: 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b 0a 20 20  ager1-5.1.3 {.  
76a0: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
76b0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
76c0: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65  s locked}}.do_te
76d0: 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 34 20  st pager1-5.1.4 
76e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
76f0: 49 54 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c  IT db2.  execsql
7700: 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63 73 71   COMMIT.  execsq
7710: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
7720: 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 37  M t2 } db2.} {17
7730: 20 4c 65 6e 69 6e 20 32 32 20 53 74 61 6c 69 6e   Lenin 22 Stalin
7740: 20 35 33 20 4b 68 72 75 73 68 63 68 65 76 20 36   53 Khrushchev 6
7750: 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64 6f 5f 74  4 Brezhnev}.do_t
7760: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 35  est pager1-5.1.5
7770: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d   {.  db2 close.}
7780: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67   {}..do_test pag
7790: 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20 20 65 78  er1-5.2.1 {.  ex
77a0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
77b0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
77c0: 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20 20 42 45  = memory;.    BE
77d0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
77e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
77f0: 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29  (84, 'Andropov')
7800: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
7810: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38 34  NTO t2 VALUES(84
7820: 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a 20  , 'Andropov');. 
7830: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
7840: 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f 74 65 73   {memory}.do_tes
7850: 74 20 70 61 67 65 72 31 2d 35 2e 33 2e 31 20 7b  t pager1-5.3.1 {
7860: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7870: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
7880: 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20 20 20 20  mode = off;.    
7890: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
78a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
78b0: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
78c0: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
78d0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
78e0: 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27  (85, 'Gorbachev'
78f0: 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  );.    COMMIT;. 
7900: 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64 6f 5f 74   }.} {off}..do_t
7910: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 31  est pager1-5.4.1
7920: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
7930: 74 65 73 74 76 66 73 20 74 76 0a 20 20 73 71 6c  testvfs tv.  sql
7940: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20  ite3 db test.db 
7950: 2d 76 66 73 20 74 76 0a 20 20 65 78 65 63 73 71  -vfs tv.  execsq
7960: 6c 20 7b 20 41 54 54 41 43 48 20 27 74 65 73 74  l { ATTACH 'test
7970: 2e 64 62 32 27 20 41 53 20 61 75 78 20 7d 0a 0a  .db2' AS aux }..
7980: 20 20 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c    tv filter xDel
7990: 65 74 65 0a 20 20 74 76 20 73 63 72 69 70 74 20  ete.  tv script 
79a0: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  max_journal_size
79b0: 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65  .  tv sectorsize
79c0: 20 35 31 32 0a 20 20 73 65 74 20 3a 3a 6d 61 78   512.  set ::max
79d0: 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 70 72 6f  _journal 0.  pro
79e0: 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69  c max_journal_si
79f0: 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d  ze {method args}
7a00: 20 7b 0a 20 20 20 20 73 65 74 20 73 7a 20 30 0a   {.    set sz 0.
7a10: 20 20 20 20 63 61 74 63 68 20 7b 20 73 65 74 20      catch { set 
7a20: 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  sz [file size te
7a30: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d  st.db-journal] }
7a40: 0a 20 20 20 20 69 66 20 7b 24 73 7a 20 3e 20 24  .    if {$sz > $
7a50: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 7d 20 7b  ::max_journal} {
7a60: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 61 78  .      set ::max
7a70: 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a 20 20 20  _journal $sz.   
7a80: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
7a90: 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 65 78  LITE_OK.  }.  ex
7aa0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
7ab0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7ac0: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50 52  = DELETE;.    PR
7ad0: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
7ae0: 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 42   = NORMAL;.    B
7af0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
7b00: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7b10: 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76  S(85, 'Gorbachev
7b20: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
7b30: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
7b40: 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27 29  85, 'Gorbachev')
7b50: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
7b60: 7d 0a 0a 20 20 23 20 54 68 65 20 73 69 7a 65 20  }..  # The size 
7b70: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
7b80: 69 6c 65 20 69 73 20 6e 6f 77 3a 0a 20 20 23 20  ile is now:.  # 
7b90: 0a 20 20 23 20 20 20 31 29 20 35 31 32 20 62 79  .  #   1) 512 by
7ba0: 74 65 20 68 65 61 64 65 72 20 2b 0a 20 20 23 20  te header +.  # 
7bb0: 20 20 32 29 20 32 20 2a 20 28 31 30 32 34 2b 38    2) 2 * (1024+8
7bc0: 29 20 62 79 74 65 20 72 65 63 6f 72 64 73 20 2b  ) byte records +
7bd0: 0a 20 20 23 20 20 20 33 29 20 32 30 2b 4e 20 62  .  #   3) 20+N b
7be0: 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 2d 6a  ytes of master-j
7bf0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
7c00: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 73  where N is the s
7c10: 69 7a 65 20 6f 66 20 0a 20 20 23 20 20 20 20 20  ize of .  #     
7c20: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
7c30: 6e 61 6c 20 6e 61 6d 65 20 65 6e 63 6f 64 65 64  nal name encoded
7c40: 20 61 73 20 75 74 66 2d 38 20 77 69 74 68 20 6e   as utf-8 with n
7c50: 6f 20 6e 75 6c 20 74 65 72 6d 2e 0a 20 20 23 0a  o nul term..  #.
7c60: 20 20 73 65 74 20 6d 6a 5f 70 6f 69 6e 74 65 72    set mj_pointer
7c70: 20 5b 65 78 70 72 20 7b 0a 20 20 20 20 32 30 20   [expr {.    20 
7c80: 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  + [string length
7c90: 20 5b 67 65 74 5f 70 77 64 5d 5d 20 2b 20 5b 73   [get_pwd]] + [s
7ca0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 22 2f 74  tring length "/t
7cb0: 65 73 74 2e 64 62 2d 6d 6a 58 58 58 58 58 58 39  est.db-mjXXXXXX9
7cc0: 58 58 22 5d 0a 20 20 7d 5d 0a 20 20 65 78 70 72  XX"].  }].  expr
7cd0: 20 7b 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c   {$::max_journal
7ce0: 3d 3d 28 35 31 32 2b 32 2a 28 31 30 32 34 2b 38  ==(512+2*(1024+8
7cf0: 29 2b 24 6d 6a 5f 70 6f 69 6e 74 65 72 29 7d 0a  )+$mj_pointer)}.
7d00: 7d 20 31 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  } 1.do_test page
7d10: 72 31 2d 35 2e 34 2e 32 20 7b 0a 20 20 73 65 74  r1-5.4.2 {.  set
7d20: 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30   ::max_journal 0
7d30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7d40: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
7d50: 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20  ous = full;.    
7d60: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c  BEGIN;.      DEL
7d70: 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
7d80: 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20  E b = 'Lenin';. 
7d90: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
7da0: 20 74 32 20 57 48 45 52 45 20 62 20 3d 20 27 4c   t2 WHERE b = 'L
7db0: 65 6e 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49  enin';.    COMMI
7dc0: 54 3b 0a 20 20 7d 0a 0a 20 20 23 20 49 6e 20 73  T;.  }..  # In s
7dd0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c 20  ynchronous=full 
7de0: 6d 6f 64 65 2c 20 74 68 65 20 6d 61 73 74 65 72  mode, the master
7df0: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
7e00: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 0a   is not written.
7e10: 20 20 23 20 64 69 72 65 63 74 6c 79 20 61 66 74    # directly aft
7e20: 65 72 20 74 68 65 20 6c 61 73 74 20 72 65 63 6f  er the last reco
7e30: 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  rd in the journa
7e40: 6c 20 66 69 6c 65 2e 20 49 6e 73 74 65 61 64 2c  l file. Instead,
7e50: 20 69 74 20 69 73 0a 20 20 23 20 77 72 69 74 74   it is.  # writt
7e60: 65 6e 20 73 74 61 72 74 69 6e 67 20 61 74 20 74  en starting at t
7e70: 68 65 20 6e 65 78 74 20 28 69 6e 20 74 68 69 73  he next (in this
7e80: 20 63 61 73 65 20 35 31 32 20 62 79 74 65 29 20   case 512 byte) 
7e90: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 2e  sector boundary.
7ea0: 0a 20 20 23 0a 20 20 73 65 74 20 6d 6a 5f 70 6f  .  #.  set mj_po
7eb0: 69 6e 74 65 72 20 5b 65 78 70 72 20 7b 0a 20 20  inter [expr {.  
7ec0: 20 20 32 30 20 2b 20 5b 73 74 72 69 6e 67 20 6c    20 + [string l
7ed0: 65 6e 67 74 68 20 5b 67 65 74 5f 70 77 64 5d 5d  ength [get_pwd]]
7ee0: 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   + [string lengt
7ef0: 68 20 22 2f 74 65 73 74 2e 64 62 2d 6d 6a 58 58  h "/test.db-mjXX
7f00: 58 58 58 58 39 58 58 22 5d 0a 20 20 7d 5d 0a 20  XXXX9XX"].  }]. 
7f10: 20 65 78 70 72 20 7b 24 3a 3a 6d 61 78 5f 6a 6f   expr {$::max_jo
7f20: 75 72 6e 61 6c 3d 3d 28 28 28 35 31 32 2b 32 2a  urnal==(((512+2*
7f30: 28 31 30 32 34 2b 38 29 2b 35 31 31 29 2f 35 31  (1024+8)+511)/51
7f40: 32 29 2a 35 31 32 20 2b 20 24 6d 6a 5f 70 6f 69  2)*512 + $mj_poi
7f50: 6e 74 65 72 29 7d 0a 7d 20 31 0a 64 62 20 63 6c  nter)}.} 1.db cl
7f60: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 64  ose.tv delete..d
7f70: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7f80: 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  5.1 {.  sqlite3 
7f90: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
7fa0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54 54 41  csql { .    ATTA
7fb0: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
7fc0: 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47 4d 41   aux;.    PRAGMA
7fd0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
7fe0: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45  PERSIST;.    CRE
7ff0: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
8000: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
8010: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61  NTO t3 SELECT ra
8020: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
8030: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
8040: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 55 50   FROM t1;.    UP
8050: 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d 20  DATE t3 SET b = 
8060: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
8070: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 5b 66 69  ;.  }.  expr [fi
8080: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
8090: 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35 30 30 30  journal] > 15000
80a0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {1}.do_test p
80b0: 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b 0a 20 20  ager1-5.5.2 {.  
80c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
80d0: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
80e0: 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47   = full;.    BEG
80f0: 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
8100: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
8110: 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20 20   = 'Stalin';.   
8120: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
8130: 32 20 57 48 45 52 45 20 62 20 3d 20 27 53 74 61  2 WHERE b = 'Sta
8140: 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  lin';.    COMMIT
8150: 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a  ;.  }.  file siz
8160: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
8170: 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  l.} {0}...#-----
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81c0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
81d0: 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72 6b 20  wing tests work 
81e0: 77 69 74 68 20 22 50 52 41 47 4d 41 20 6d 61 78  with "PRAGMA max
81f0: 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a 23 0a 64  _page_count".#.d
8200: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  o_test pager1-6.
8210: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
8220: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
8230: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
8240: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
8250: 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20  uum = none;.    
8260: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8270: 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20 20 20 20  count = 10;.    
8280: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
8290: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
82a0: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29  E TABLE t3(a, b)
82b0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
82c0: 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20 20 20  LE t4(a, b);.   
82d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
82e0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
82f0: 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62  TE TABLE t6(a, b
8300: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
8310: 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a 20 20  BLE t7(a, b);.  
8320: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
8330: 38 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  8(a, b);.    CRE
8340: 41 54 45 20 54 41 42 4c 45 20 74 39 28 61 2c 20  ATE TABLE t9(a, 
8350: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
8360: 41 42 4c 45 20 74 31 30 28 61 2c 20 62 29 3b 0a  ABLE t10(a, b);.
8370: 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f 5f 63 61    }.} {10}.do_ca
8380: 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65  tchsql_test page
8390: 72 31 2d 36 2e 32 20 7b 0a 20 20 43 52 45 41 54  r1-6.2 {.  CREAT
83a0: 45 20 54 41 42 4c 45 20 74 31 31 28 61 2c 20 62  E TABLE t11(a, b
83b0: 29 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  ).} {1 {database
83c0: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
83d0: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
83e0: 73 74 20 70 61 67 65 72 31 2d 36 2e 34 20 7b 20  st pager1-6.4 { 
83f0: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8400: 63 6f 75 6e 74 20 20 20 20 20 20 7d 20 7b 31 30  count      } {10
8410: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
8420: 74 20 70 61 67 65 72 31 2d 36 2e 35 20 7b 20 50  t pager1-6.5 { P
8430: 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63  RAGMA max_page_c
8440: 6f 75 6e 74 20 3d 20 31 35 20 7d 20 7b 31 35 7d  ount = 15 } {15}
8450: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8460: 20 70 61 67 65 72 31 2d 36 2e 36 20 7b 20 43 52   pager1-6.6 { CR
8470: 45 41 54 45 20 54 41 42 4c 45 20 74 31 31 28 61  EATE TABLE t11(a
8480: 2c 20 62 29 20 20 20 20 20 7d 20 7b 7d 0a 64 6f  , b)     } {}.do
8490: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
84a0: 67 65 72 31 2d 36 2e 37 20 7b 0a 20 20 42 45 47  ger1-6.7 {.  BEG
84b0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
84c0: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 31  NTO t11 VALUES(1
84d0: 2c 20 32 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  , 2);.    PRAGMA
84e0: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
84f0: 3d 20 31 33 3b 0a 7d 20 7b 31 33 7d 0a 64 6f 5f  = 13;.} {13}.do_
8500: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
8510: 65 72 31 2d 36 2e 38 20 7b 0a 20 20 20 20 49 4e  er1-6.8 {.    IN
8520: 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41  SERT INTO t11 VA
8530: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20  LUES(3, 4);.    
8540: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8550: 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 7d 20 7b 31  count = 10;.} {1
8560: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
8570: 73 74 20 70 61 67 65 72 31 2d 36 2e 39 20 7b 20  st pager1-6.9 { 
8580: 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a 64 6f 5f  COMMIT } {}..do_
8590: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
85a0: 65 72 31 2d 36 2e 31 30 20 7b 20 50 52 41 47 4d  er1-6.10 { PRAGM
85b0: 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  A max_page_count
85c0: 20 3d 20 31 30 20 7d 20 7b 31 31 7d 0a 64 6f 5f   = 10 } {11}.do_
85d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
85e0: 65 72 31 2d 36 2e 31 31 20 7b 20 53 45 4c 45 43  er1-6.11 { SELEC
85f0: 54 20 2a 20 46 52 4f 4d 20 74 31 31 20 7d 20 20  T * FROM t11 }  
8600: 20 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34          {1 2 3 4
8610: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
8620: 74 20 70 61 67 65 72 31 2d 36 2e 31 32 20 7b 20  t pager1-6.12 { 
8630: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8640: 63 6f 75 6e 74 20 7d 20 20 20 20 20 20 7b 31 31  count }      {11
8650: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
8660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
86a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
86b0: 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22  ests work with "
86c0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
86d0: 6f 64 65 3d 54 52 55 4e 43 41 54 45 22 20 61 6e  ode=TRUNCATE" an
86e0: 64 0a 23 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b  d.# "PRAGMA lock
86f0: 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
8700: 56 45 22 2e 0a 23 0a 23 20 45 61 63 68 20 74 65  VE"..#.# Each te
8710: 73 74 20 69 73 20 73 70 65 63 69 66 69 65 64 20  st is specified 
8720: 77 69 74 68 20 35 20 76 61 72 69 61 62 6c 65 73  with 5 variables
8730: 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a  . As follows:.#.
8740: 23 20 20 20 24 74 6e 3a 20 20 54 65 73 74 20 4e  #   $tn:  Test N
8750: 75 6d 62 65 72 2e 20 55 73 65 64 20 61 73 20 70  umber. Used as p
8760: 61 72 74 20 6f 66 20 74 68 65 20 5b 64 6f 5f 74  art of the [do_t
8770: 65 73 74 5d 20 74 65 73 74 20 6e 61 6d 65 73 2e  est] test names.
8780: 0a 23 20 20 20 24 73 71 6c 3a 20 53 51 4c 20 74  .#   $sql: SQL t
8790: 6f 20 65 78 65 63 75 74 65 2e 0a 23 20 20 20 24  o execute..#   $
87a0: 72 65 73 3a 20 45 78 70 65 63 74 65 64 20 72 65  res: Expected re
87b0: 73 75 6c 74 20 6f 66 20 65 78 65 63 75 74 69 6e  sult of executin
87c0: 67 20 24 73 71 6c 2e 0a 23 20 20 20 24 6a 73 3a  g $sql..#   $js:
87d0: 20 20 54 68 65 20 65 78 70 65 63 74 65 64 20 73    The expected s
87e0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
87f0: 61 6c 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65  al file, in byte
8800: 73 2c 20 61 66 74 65 72 20 65 78 65 63 75 74 69  s, after executi
8810: 6e 67 0a 23 20 20 20 20 20 20 20 20 20 74 68 65  ng.#         the
8820: 20 53 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20   SQL script. Or 
8830: 2d 31 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  -1 if the journa
8840: 6c 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65  l is not expecte
8850: 64 20 74 6f 20 65 78 69 73 74 2e 0a 23 20 20 20  d to exist..#   
8860: 24 77 73 3a 20 20 54 68 65 20 65 78 70 65 63 74  $ws:  The expect
8870: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57  ed size of the W
8880: 41 4c 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65  AL file, in byte
8890: 73 2c 20 61 66 74 65 72 20 65 78 65 63 75 74 69  s, after executi
88a0: 6e 67 0a 23 20 20 20 20 20 20 20 20 20 74 68 65  ng.#         the
88b0: 20 53 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20   SQL script. Or 
88c0: 2d 31 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  -1 if the WAL is
88d0: 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f   not expected to
88e0: 20 65 78 69 73 74 2e 0a 23 0a 69 66 63 61 70 61   exist..#.ifcapa
88f0: 62 6c 65 20 77 61 6c 20 7b 0a 20 20 66 61 75 6c  ble wal {.  faul
8900: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
8910: 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61 63 68  reopen.  foreach
8920: 20 7b 74 6e 20 73 71 6c 20 72 65 73 20 6a 73 20   {tn sql res js 
8930: 77 73 7d 20 5b 73 75 62 73 74 20 7b 0a 20 20 0a  ws} [subst {.  .
8940: 20 20 20 20 31 20 20 7b 0a 20 20 20 20 20 20 43      1  {.      C
8950: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
8960: 2c 20 62 29 3b 0a 20 20 20 20 20 20 50 52 41 47  , b);.      PRAG
8970: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f  MA auto_vacuum=O
8980: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
8990: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
89a0: 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  MAL;.      PRAGM
89b0: 41 20 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34  A page_size=1024
89c0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c  ;.      PRAGMA l
89d0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
89e0: 55 53 49 56 45 3b 0a 20 20 20 20 20 20 50 52 41  USIVE;.      PRA
89f0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8a00: 3d 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 20  =TRUNCATE;.     
8a10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8a20: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
8a30: 20 20 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 74    } {exclusive t
8a40: 72 75 6e 63 61 74 65 7d 20 30 20 2d 31 0a 20 20  runcate} 0 -1.  
8a50: 0a 20 20 20 20 32 20 20 7b 0a 20 20 20 20 20 20  .    2  {.      
8a60: 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b  BEGIN IMMEDIATE;
8a70: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
8a80: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  * FROM t1;.     
8a90: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b   COMMIT;.    } {
8aa0: 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20  1 2} 0 -1.  .   
8ab0: 20 33 20 20 7b 0a 20 20 20 20 20 20 42 45 47 49   3  {.      BEGI
8ac0: 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  N;.        SELEC
8ad0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
8ae0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
8af0: 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20   {1 2} 0 -1.  . 
8b00: 20 20 20 34 20 20 7b 20 50 52 41 47 4d 41 20 6a     4  { PRAGMA j
8b10: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
8b20: 4c 20 7d 20 20 20 20 77 61 6c 20 20 20 20 20 20  L }    wal      
8b30: 20 2d 31 20 2d 31 0a 20 20 20 20 35 20 20 7b 20   -1 -1.    5  { 
8b40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
8b50: 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 20 20 7b  ALUES(3, 4) }  {
8b60: 7d 20 20 20 20 20 20 20 20 2d 31 20 5b 77 61 6c  }        -1 [wal
8b70: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32  _file_size 1 102
8b80: 34 5d 0a 20 20 20 20 36 20 20 7b 20 50 52 41 47  4].    6  { PRAG
8b90: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
8ba0: 3d 20 4e 4f 52 4d 41 4c 20 7d 20 65 78 63 6c 75  = NORMAL } exclu
8bb0: 73 69 76 65 20 2d 31 20 5b 77 61 6c 5f 66 69 6c  sive -1 [wal_fil
8bc0: 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a 20  e_size 1 1024]. 
8bd0: 20 20 20 37 20 20 7b 20 49 4e 53 45 52 54 20 49     7  { INSERT I
8be0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
8bf0: 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20 20 20 20   6); } {}       
8c00: 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69   -1 [wal_file_si
8c10: 7a 65 20 32 20 31 30 32 34 5d 0a 20 20 0a 20 20  ze 2 1024].  .  
8c20: 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f    8  { PRAGMA jo
8c30: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55  urnal_mode = TRU
8c40: 4e 43 41 54 45 20 7d 20 74 72 75 6e 63 61 74 65  NCATE } truncate
8c50: 20 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20            0 -1. 
8c60: 20 20 20 39 20 20 7b 20 49 4e 53 45 52 54 20 49     9  { INSERT I
8c70: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c  NTO t1 VALUES(7,
8c80: 20 38 29 20 7d 20 20 20 20 7b 7d 20 20 20 20 20   8) }    {}     
8c90: 20 20 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a             0 -1.
8ca0: 20 20 20 20 31 30 20 7b 20 53 45 4c 45 43 54 20      10 { SELECT 
8cb0: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20 20  * FROM t1 }     
8cc0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33            {1 2 3
8cd0: 20 34 20 35 20 36 20 37 20 38 7d 20 30 20 2d 31   4 5 6 7 8} 0 -1
8ce0: 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 64  .  .  }] {.    d
8cf0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
8d00: 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20  ager1-7.1.$tn.1 
8d10: 24 73 71 6c 20 24 72 65 73 0a 20 20 20 20 63 61  $sql $res.    ca
8d20: 74 63 68 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b  tch { set J -1 ;
8d30: 20 73 65 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a   set J [file siz
8d40: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
8d50: 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63 68 20 7b  l] }.    catch {
8d60: 20 73 65 74 20 57 20 2d 31 20 3b 20 73 65 74 20   set W -1 ; set 
8d70: 57 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  W [file size tes
8d80: 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20  t.db-wal] }.    
8d90: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37  do_test pager1-7
8da0: 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20  .1.$tn.2 { list 
8db0: 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a  $J $W } [list $j
8dc0: 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f  s $ws].  }.}..do
8dd0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32  _test pager1-7.2
8de0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
8df0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
8e00: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
8e10: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
8e20: 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56  _mode = EXCLUSIV
8e30: 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  E;.    CREATE TA
8e40: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
8e50: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50    BEGIN;.      P
8e60: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8e70: 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20  de = delete;.   
8e80: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
8e90: 6c 5f 6d 6f 64 65 20 3d 20 74 72 75 6e 63 61 74  l_mode = truncat
8ea0: 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73  e;.  }.} {exclus
8eb0: 69 76 65 20 64 65 6c 65 74 65 20 74 72 75 6e 63  ive delete trunc
8ec0: 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ate}.do_test pag
8ed0: 65 72 31 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78  er1-7.2.2 {.  ex
8ee0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
8ef0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
8f00: 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   2) }.  execsql 
8f10: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
8f20: 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74 20  _mode = persist 
8f30: 7d 0a 7d 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64  }.} {truncate}.d
8f40: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e  o_test pager1-7.
8f50: 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
8f60: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65  { COMMIT }.  exe
8f70: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
8f80: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
8f90: 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 50 52   persist;.    PR
8fa0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a  AGMA journal_siz
8fb0: 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b  e_limit;.  }.} {
8fc0: 70 65 72 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d  persist -1}..#--
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9010: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
9020: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 70  llowing tests, p
9030: 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20  ager1-8.*, test 
9040: 74 68 61 74 20 74 68 65 20 73 70 65 63 69 61 6c  that the special
9050: 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a   filenames .# ":
9060: 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20 22 22 20  memory:" and "" 
9070: 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72 79 20 64  open temporary d
9080: 61 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65  atabases..#.fore
9090: 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65  ach {tn filename
90a0: 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a  } {.  1 :memory:
90b0: 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f  .  2 "".} {.  do
90c0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24  _test pager1-8.$
90d0: 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74  tn.1 {.    fault
90e0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
90f0: 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f  eopen.    db clo
9100: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  se.    sqlite3 d
9110: 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  b $filename.    
9120: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
9130: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
9140: 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 43 52  um = 1;.      CR
9150: 45 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 29  EATE TABLE x1(x)
9160: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9170: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 43  NTO x1 VALUES('C
9180: 68 61 72 6c 65 73 27 29 3b 0a 20 20 20 20 20 20  harles');.      
9190: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
91a0: 41 4c 55 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a  ALUES('James');.
91b0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
91c0: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 4d 61 72  O x1 VALUES('Mar
91d0: 79 27 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  y');.      SELEC
91e0: 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20  T * FROM x1;.   
91f0: 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c 65 73 20   }.  } {Charles 
9200: 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64  James Mary}..  d
9210: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e  o_test pager1-8.
9220: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69  $tn.2 {.    sqli
9230: 74 65 33 20 64 62 32 20 24 66 69 6c 65 6e 61 6d  te3 db2 $filenam
9240: 65 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  e.    catchsql {
9250: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
9260: 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b  1 } db2.  } {1 {
9270: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 78  no such table: x
9280: 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71  1}}..  do_execsq
9290: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e  l_test pager1-8.
92a0: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42 45 47 49  $tn.3 {.    BEGI
92b0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
92c0: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27  INTO x1 VALUES('
92d0: 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20  William');.     
92e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
92f0: 56 41 4c 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a  VALUES('Anne');.
9300: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
9310: 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  } {}.}..#-------
9320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9360: 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20 62 6c  --.# The next bl
9370: 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 70  ock of tests - p
9380: 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c  ager1-9.* - deal
9390: 20 77 69 74 68 20 69 6e 74 65 72 61 63 74 69 6f   with interactio
93a0: 6e 73 20 62 65 74 77 65 65 6e 0a 23 20 74 68 65  ns between.# the
93b0: 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 62   pager and the b
93c0: 61 63 6b 75 70 20 41 50 49 2e 20 54 65 73 74 20  ackup API. Test 
93d0: 63 61 73 65 73 3a 0a 23 0a 23 20 20 20 70 61 67  cases:.#.#   pag
93e0: 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20  er1-9.1.*: Test 
93f0: 74 68 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f  that a backup co
9400: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
9410: 75 6c 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65  ully even if the
9420: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
9430: 20 20 20 73 6f 75 72 63 65 20 64 62 20 69 73 20     source db is 
9440: 77 72 69 74 74 65 6e 20 74 6f 20 64 75 72 69 6e  written to durin
9450: 67 20 74 68 65 20 62 61 63 6b 75 70 20 6f 70 2e  g the backup op.
9460: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e  .#.#   pager1-9.
9470: 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61  2.*: Test that a
9480: 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65   backup complete
9490: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65  s successfully e
94a0: 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20  ven if the.#    
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
94c0: 72 63 65 20 64 62 20 69 73 20 77 72 69 74 74 65  rce db is writte
94d0: 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f  n to and then ro
94e0: 6c 6c 65 64 20 62 61 63 6b 20 64 75 72 69 6e 67  lled back during
94f0: 20 61 20 0a 23 20 20 20 20 20 20 20 20 20 20 20   a .#           
9500: 20 20 20 20 20 20 62 61 63 6b 75 70 20 6f 70 65        backup ope
9510: 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73  ration..#.do_tes
9520: 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b  t pager1-9.0.1 {
9530: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
9540: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
9550: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
9560: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
9570: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
9580: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
9590: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
95a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
95b0: 61 62 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28  ab(a, b, UNIQUE(
95c0: 61 2c 20 62 29 29 3b 0a 20 20 20 20 20 20 49 4e  a, b));.      IN
95d0: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c  SERT INTO ab VAL
95e0: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 32 30  UES( a_string(20
95f0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
9600: 29 20 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ) );.      INSER
9610: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
9620: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
9630: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
9640: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
9650: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
9660: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
9670: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
9680: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
9690: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
96a0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
96b0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
96c0: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
96d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
96e0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
96f0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9700: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
9710: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
9720: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
9730: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
9740: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
9750: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9760: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
9770: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
9780: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
9790: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
97a0: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
97b0: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
97c0: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
97d0: 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  b;.    COMMIT;. 
97e0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
97f0: 70 61 67 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20  pager1-9.0.2 {. 
9800: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
9810: 74 2e 64 62 32 0a 20 20 64 62 32 20 65 76 61 6c  t.db2.  db2 eval
9820: 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f   { PRAGMA cache_
9830: 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 73 71  size = 10 }.  sq
9840: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
9850: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
9860: 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31    list [B step 1
9870: 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d  0000] [B finish]
9880: 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .} {SQLITE_DONE 
9890: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
98a0: 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 33 20  st pager1-9.0.3 
98b0: 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  {. db one {SELEC
98c0: 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46  T md5sum(a, b) F
98d0: 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f  ROM ab}.} [db2 o
98e0: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
98f0: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
9900: 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  ]..do_test pager
9910: 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63  1-9.1.1 {.  exec
9920: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20  sql { UPDATE ab 
9930: 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67  SET a = a_string
9940: 28 32 30 31 29 20 7d 0a 20 20 73 71 6c 69 74 65  (201) }.  sqlite
9950: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d  3_backup B db2 m
9960: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20  ain db main.  B 
9970: 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54  step 30.} {SQLIT
9980: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
9990: 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65  ger1-9.1.2 {.  e
99a0: 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20  xecsql { UPDATE 
99b0: 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  ab SET b = a_str
99c0: 69 6e 67 28 33 30 31 29 20 7d 0a 20 20 6c 69 73  ing(301) }.  lis
99d0: 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d  t [B step 10000]
99e0: 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53   [B finish].} {S
99f0: 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54  QLITE_DONE SQLIT
9a00: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
9a10: 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62  ger1-9.1.3 {. db
9a20: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35   one {SELECT md5
9a30: 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61  sum(a, b) FROM a
9a40: 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53  b}.} [db2 one {S
9a50: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
9a60: 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f  b) FROM ab}].do_
9a70: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e  test pager1-9.1.
9a80: 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45  4 { execsql { SE
9a90: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9aa0: 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a  OM ab } } {128}.
9ab0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9ac0: 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  9.2.1 {.  execsq
9ad0: 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45  l { UPDATE ab SE
9ae0: 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32  T a = a_string(2
9af0: 30 32 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  02) }.  sqlite3_
9b00: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
9b10: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74  n db main.  B st
9b20: 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f  ep 30.} {SQLITE_
9b30: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9b40: 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65  r1-9.2.2 {.  exe
9b50: 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49  csql { .    BEGI
9b60: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
9b70: 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  ab SET b = a_str
9b80: 69 6e 67 28 33 30 31 29 3b 0a 20 20 20 20 52 4f  ing(301);.    RO
9b90: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69  LLBACK;.  }.  li
9ba0: 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30  st [B step 10000
9bb0: 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b  ] [B finish].} {
9bc0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49  SQLITE_DONE SQLI
9bd0: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70  TE_OK}.do_test p
9be0: 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64  ager1-9.2.3 {. d
9bf0: 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64  b one {SELECT md
9c00: 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20  5sum(a, b) FROM 
9c10: 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b  ab}.} [db2 one {
9c20: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c  SELECT md5sum(a,
9c30: 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f   b) FROM ab}].do
9c40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32  _test pager1-9.2
9c50: 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53  .4 { execsql { S
9c60: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
9c70: 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d  ROM ab } } {128}
9c80: 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c  .db close.db2 cl
9c90: 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  ose..do_test pag
9ca0: 65 72 31 2d 39 2e 33 2e 31 20 7b 0a 20 20 74 65  er1-9.3.1 {.  te
9cb0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
9cc0: 74 20 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73  t 1.  tv sectors
9cd0: 69 7a 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74  ize 4096.  fault
9ce0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
9cf0: 65 6f 70 65 6e 0a 0a 20 20 65 78 65 63 73 71 6c  eopen..  execsql
9d00: 20 7b 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73   { PRAGMA page_s
9d10: 69 7a 65 20 3d 20 31 30 32 34 20 7d 0a 20 20 66  ize = 1024 }.  f
9d20: 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24  or {set ii 0} {$
9d30: 69 69 20 3c 20 34 7d 20 7b 69 6e 63 72 20 69 69  ii < 4} {incr ii
9d40: 7d 20 7b 20 65 78 65 63 73 71 6c 20 22 43 52 45  } { execsql "CRE
9d50: 41 54 45 20 54 41 42 4c 45 20 74 24 7b 69 69 7d  ATE TABLE t${ii}
9d60: 28 61 2c 20 62 29 22 20 7d 0a 7d 20 7b 7d 0a 64  (a, b)" }.} {}.d
9d70: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9d80: 33 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  3.2 {.  sqlite3 
9d90: 64 62 32 20 74 65 73 74 2e 64 62 32 0a 0a 20 20  db2 test.db2..  
9da0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
9db0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
9dc0: 20 34 30 39 36 3b 0a 20 20 20 20 50 52 41 47 4d   4096;.    PRAGM
9dd0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
9de0: 4f 46 46 3b 0a 20 20 20 20 43 52 45 41 54 45 20  OFF;.    CREATE 
9df0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
9e00: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9e10: 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64   t2(a, b);.  } d
9e20: 62 32 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  b2..  sqlite3_ba
9e30: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
9e40: 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70  db main.  B step
9e50: 20 33 30 0a 20 20 6c 69 73 74 20 5b 42 20 73 74   30.  list [B st
9e60: 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e  ep 10000] [B fin
9e70: 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  ish].} {SQLITE_D
9e80: 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  ONE SQLITE_OK}.d
9e90: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9ea0: 33 2e 33 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73  3.3 {.  db2 clos
9eb0: 65 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  e.  db close.  t
9ec0: 76 20 64 65 6c 65 74 65 0a 20 20 66 69 6c 65 20  v delete.  file 
9ed0: 73 69 7a 65 20 74 65 73 74 2e 64 62 32 0a 7d 20  size test.db2.} 
9ee0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
9ef0: 64 62 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  db]..do_test pag
9f00: 65 72 31 2d 39 2e 34 2e 31 20 7b 0a 20 20 66 61  er1-9.4.1 {.  fa
9f10: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
9f20: 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74  d_reopen.  sqlit
9f30: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
9f40: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
9f50: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
9f60: 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 43 52 45   = 4096;.    CRE
9f70: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
9f80: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
9f90: 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20  ABLE t2(a, b);. 
9fa0: 20 7d 20 64 62 32 0a 20 20 73 71 6c 69 74 65 33   } db2.  sqlite3
9fb0: 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61  _backup B db2 ma
9fc0: 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73  in db main.  lis
9fd0: 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d  t [B step 10000]
9fe0: 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53   [B finish].} {S
9ff0: 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54  QLITE_DONE SQLIT
a000: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
a010: 67 65 72 31 2d 39 2e 34 2e 32 20 7b 0a 20 20 6c  ger1-9.4.2 {.  l
a020: 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  ist [file size t
a030: 65 73 74 2e 64 62 32 5d 20 5b 66 69 6c 65 20 73  est.db2] [file s
a040: 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b  ize test.db].} {
a050: 30 20 30 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a  0 0}.db2 close..
a060: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
a070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
a0b0: 74 20 74 68 61 74 20 72 65 67 61 72 64 6c 65 73  t that regardles
a0c0: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 72  s of the value r
a0d0: 65 74 75 72 6e 65 64 20 62 79 20 78 53 65 63 74  eturned by xSect
a0e0: 6f 72 53 69 7a 65 28 29 2c 20 74 68 65 0a 23 20  orSize(), the.# 
a0f0: 6d 69 6e 69 6d 75 6d 20 65 66 66 65 63 74 69 76  minimum effectiv
a100: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
a110: 20 35 31 32 20 61 6e 64 20 74 68 65 20 6d 61 78   512 and the max
a120: 69 6d 75 6d 20 36 35 35 33 36 20 62 79 74 65 73  imum 65536 bytes
a130: 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d  ..#.testvfs tv -
a140: 64 65 66 61 75 6c 74 20 31 0a 66 6f 72 65 61 63  default 1.foreac
a150: 68 20 73 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20  h sectorsize {. 
a160: 20 20 20 33 32 20 20 20 36 34 20 20 20 31 32 38     32   64   128
a170: 20 20 20 32 35 36 20 20 20 35 31 32 20 20 20 31     256   512   1
a180: 30 32 34 20 20 20 32 30 34 38 20 0a 20 20 20 20  024   2048 .    
a190: 34 30 39 36 20 38 31 39 32 20 31 36 33 38 34 20  4096 8192 16384 
a1a0: 33 32 37 36 38 20 36 35 35 33 36 20 31 33 31 30  32768 65536 1310
a1b0: 37 32 20 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20  72 262144.} {.  
a1c0: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 24 73  tv sectorsize $s
a1d0: 65 63 74 6f 72 73 69 7a 65 0a 20 20 74 76 20 64  ectorsize.  tv d
a1e0: 65 76 63 68 61 72 20 7b 7d 0a 20 20 73 65 74 20  evchar {}.  set 
a1f0: 65 66 66 20 24 73 65 63 74 6f 72 73 69 7a 65 0a  eff $sectorsize.
a200: 20 20 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a    if {$sectorsiz
a210: 65 20 3c 20 35 31 32 7d 20 20 20 7b 20 73 65 74  e < 512}   { set
a220: 20 65 66 66 20 35 31 32 20 7d 0a 20 20 69 66 20   eff 512 }.  if 
a230: 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36  {$sectorsize > 6
a240: 35 35 33 36 7d 20 7b 20 73 65 74 20 65 66 66 20  5536} { set eff 
a250: 36 35 35 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65  65536 }..  do_te
a260: 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65  st pager1-10.$se
a270: 63 74 6f 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20  ctorsize.1 {.   
a280: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
a290: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
a2a0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
a2b0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78   a_string.    ex
a2c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
a2d0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
a2e0: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
a2f0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
a300: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
a310: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
a320: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
a330: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20  (a, b);.        
a340: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
a350: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43  a, b);.        C
a360: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
a370: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d  , b);.      COMM
a380: 49 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69  IT;.    }.    fi
a390: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
a3a0: 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70  journal.  } [exp
a3b0: 72 20 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20  r $sectorsize > 
a3c0: 36 35 35 33 36 20 3f 20 36 35 35 33 36 20 3a 20  65536 ? 65536 : 
a3d0: 24 73 65 63 74 6f 72 73 69 7a 65 5d 0a 0a 20 20  $sectorsize]..  
a3e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
a3f0: 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 32 20  0.$sectorsize.2 
a400: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
a410: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
a420: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 61 5f 73  TO t3 VALUES(a_s
a430: 74 72 69 6e 67 28 33 30 30 29 2c 20 61 5f 73 74  tring(300), a_st
a440: 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20 20  ring(300));.    
a450: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
a460: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
a470: 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 32 20  3;        /*  2 
a480: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
a490: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a  INTO t3 SELECT *
a4a0: 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20   FROM t3;       
a4b0: 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20   /*  4 */.      
a4c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
a4d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
a4e0: 20 20 20 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f          /*  8 */
a4f0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
a500: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46  TO t3 SELECT * F
a510: 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f  ROM t3;        /
a520: 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e  * 16 */.      IN
a530: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
a540: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20  ECT * FROM t3;  
a550: 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20        /* 32 */. 
a560: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64     }.  } {}..  d
a570: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30  o_test pager1-10
a580: 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 33 20 7b  .$sectorsize.3 {
a590: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
a5a0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
a5b0: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
a5c0: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
a5d0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
a5e0: 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  ;.      BEGIN;. 
a5f0: 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69     }.    recursi
a600: 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20  ve_select 32 t3 
a610: 7b 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54  {db eval "INSERT
a620: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
a630: 31 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63  1, 2)"}.    exec
a640: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d  sql {.      COMM
a650: 49 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  IT;.      SELECT
a660: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
a670: 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 64  }.  } {1 2}..  d
a680: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30  o_test pager1-10
a690: 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 34 20 7b  .$sectorsize.4 {
a6a0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
a6b0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a6c0: 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t6(a, b);.    
a6d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a6e0: 37 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43  7(a, b);.      C
a6f0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61  REATE TABLE t5(a
a700: 2c 20 62 29 3b 0a 20 20 20 20 20 20 44 52 4f 50  , b);.      DROP
a710: 20 54 41 42 4c 45 20 74 36 3b 0a 20 20 20 20 20   TABLE t6;.     
a720: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 37 3b 0a   DROP TABLE t7;.
a730: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
a740: 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  l {.      BEGIN;
a750: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
a760: 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a  TABLE t6(a, b);.
a770: 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73      }.    recurs
a780: 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33  ive_select 32 t3
a790: 20 7b 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52   {db eval "INSER
a7a0: 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53  T INTO t5 VALUES
a7b0: 28 31 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65  (1, 2)"}.    exe
a7c0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d  csql {.      COM
a7d0: 4d 49 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  MIT;.      SELEC
a7e0: 54 20 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20  T * FROM t5;.   
a7f0: 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 0a   }.  } {1 2}.  .
a800: 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 74 76 20 73  }.db close..tv s
a810: 65 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 64  ectorsize 4096.d
a820: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30  o_test pager1.10
a830: 2e 78 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .x.1 {.  faultsi
a840: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
a850: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
a860: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
a870: 76 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20  vacuum = none;. 
a880: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
a890: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
a8a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
a8b0: 78 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73  x);.  }.  for {s
a8c0: 65 74 20 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20  et i 0} {$i<30} 
a8d0: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
a8e0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
a8f0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 7a  INTO t1 VALUES(z
a900: 65 72 6f 62 6c 6f 62 28 39 30 30 29 29 20 7d 0a  eroblob(900)) }.
a910: 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20    }.  file size 
a920: 74 65 73 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38  test.db.} {32768
a930: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
a940: 2e 31 30 2e 78 2e 32 20 7b 0a 20 20 65 78 65 63  .10.x.2 {.  exec
a950: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
a960: 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20   TABLE t2(x);.  
a970: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b    DROP TABLE t2;
a980: 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65  .  }.  file size
a990: 20 74 65 73 74 2e 64 62 0a 7d 20 7b 33 33 37 39   test.db.} {3379
a9a0: 32 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  2}.do_test pager
a9b0: 31 2e 31 30 2e 78 2e 33 20 7b 0a 20 20 65 78 65  1.10.x.3 {.  exe
a9c0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
a9d0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
a9e0: 4c 45 20 74 32 28 78 29 3b 0a 20 20 7d 0a 20 20  LE t2(x);.  }.  
a9f0: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
aa00: 20 33 30 20 74 31 0a 20 20 65 78 65 63 73 71 6c   30 t1.  execsql
aa10: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
aa20: 42 4c 45 20 74 33 28 78 29 3b 0a 20 20 20 20 43  BLE t3(x);.    C
aa30: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
aa40: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
aa50: 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20  ete..testvfs tv 
aa60: 2d 64 65 66 61 75 6c 74 20 31 0a 66 61 75 6c 74  -default 1.fault
aa70: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
aa80: 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f  eopen.db func a_
aa90: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
aaa0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
aab0: 70 61 67 65 72 31 2d 31 31 2e 31 20 7b 0a 20 20  pager1-11.1 {.  
aac0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
aad0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
aae0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
aaf0: 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b  e = 10;.  BEGIN;
ab00: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
ab10: 45 20 7a 7a 28 74 6f 70 20 50 52 49 4d 41 52 59  E zz(top PRIMARY
ab20: 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52   KEY);.    INSER
ab30: 54 20 49 4e 54 4f 20 7a 7a 20 56 41 4c 55 45 53  T INTO zz VALUES
ab40: 28 61 5f 73 74 72 69 6e 67 28 32 32 32 29 29 3b  (a_string(222));
ab50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ab60: 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72   zz SELECT a_str
ab70: 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b  ing((SELECT 222+
ab80: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
ab90: 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20  zz)) FROM zz;.  
aba0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
abb0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
abc0: 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78  ((SELECT 222+max
abd0: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29  (rowid) FROM zz)
abe0: 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49  ) FROM zz;.    I
abf0: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
ac00: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
ac10: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
ac20: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
ac30: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
ac40: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
ac50: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
ac60: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
ac70: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
ac80: 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   zz;.    INSERT 
ac90: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
aca0: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
acb0: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
acc0: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
acd0: 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 42 45  ;.  COMMIT;.  BE
ace0: 47 49 4e 3b 0a 20 20 20 20 55 50 44 41 54 45 20  GIN;.    UPDATE 
acf0: 7a 7a 20 53 45 54 20 74 6f 70 20 3d 20 61 5f 73  zz SET top = a_s
ad00: 74 72 69 6e 67 28 33 34 35 29 3b 0a 7d 20 7b 64  tring(345);.} {d
ad10: 65 6c 65 74 65 7d 0a 0a 70 72 6f 63 20 6c 6f 63  elete}..proc loc
ad20: 6b 6f 75 74 20 7b 6d 65 74 68 6f 64 20 61 72 67  kout {method arg
ad30: 73 7d 20 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  s} { return SQLI
ad40: 54 45 5f 49 4f 45 52 52 20 7d 0a 74 76 20 73 63  TE_IOERR }.tv sc
ad50: 72 69 70 74 20 6c 6f 63 6b 6f 75 74 0a 74 76 20  ript lockout.tv 
ad60: 66 69 6c 74 65 72 20 7b 78 57 72 69 74 65 20 78  filter {xWrite x
ad70: 54 72 75 6e 63 61 74 65 20 78 53 79 6e 63 7d 0a  Truncate xSync}.
ad80: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
ad90: 20 70 61 67 65 72 31 2d 31 31 2e 32 20 7b 20 43   pager1-11.2 { C
ada0: 4f 4d 4d 49 54 20 7d 20 7b 31 20 7b 64 69 73 6b  OMMIT } {1 {disk
adb0: 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a 74 76   I/O error}}..tv
adc0: 20 73 63 72 69 70 74 20 7b 7d 0a 64 6f 5f 74 65   script {}.do_te
add0: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 33 20 7b  st pager1-11.3 {
ade0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
adf0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
ae00: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
ae10: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55  urnal_mode = TRU
ae20: 4e 43 41 54 45 3b 0a 20 20 20 20 50 52 41 47 4d  NCATE;.    PRAGM
ae30: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
ae40: 6b 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 74 72  k;.  } db2.} {tr
ae50: 75 6e 63 61 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65  uncate ok}.do_te
ae60: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 34 20 7b  st pager1-11.4 {
ae70: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 66  .  db2 close.  f
ae80: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
ae90: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
aea0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
aeb0: 20 70 61 67 65 72 31 2d 31 31 2e 35 20 7b 20 53   pager1-11.5 { S
aec0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
aed0: 52 4f 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62  ROM zz } {32}.db
aee0: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
aef0: 0a 20 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  .#-----------
af00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
af40: 20 54 65 73 74 20 22 50 52 41 47 4d 41 20 70 61   Test "PRAGMA pa
af50: 67 65 5f 73 69 7a 65 22 0a 23 0a 74 65 73 74 76  ge_size".#.testv
af60: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
af70: 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 31  .tv sectorsize 1
af80: 30 32 34 0a 66 6f 72 65 61 63 68 20 70 61 67 65  024.foreach page
af90: 73 69 7a 65 20 7b 0a 20 20 20 20 35 31 32 20 20  size {.    512  
afa0: 20 31 30 32 34 20 20 20 32 30 34 38 20 34 30 39   1024   2048 409
afb0: 36 20 38 31 39 32 20 31 36 33 38 34 20 33 32 37  6 8192 16384 327
afc0: 36 38 20 0a 7d 20 7b 0a 20 20 66 61 75 6c 74 73  68 .} {.  faults
afd0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
afe0: 6f 70 65 6e 0a 0a 20 20 23 20 54 68 65 20 73 65  open..  # The se
aff0: 63 74 6f 72 2d 73 69 7a 65 20 28 61 63 63 6f 72  ctor-size (accor
b000: 64 69 6e 67 20 74 6f 20 74 68 65 20 56 46 53 29  ding to the VFS)
b010: 20 69 73 20 31 30 32 34 20 62 79 74 65 73 2e 20   is 1024 bytes. 
b020: 53 6f 20 69 66 20 74 68 65 0a 20 20 23 20 70 61  So if the.  # pa
b030: 67 65 2d 73 69 7a 65 20 72 65 71 75 65 73 74 65  ge-size requeste
b040: 64 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20  d using "PRAGMA 
b050: 70 61 67 65 5f 73 69 7a 65 22 20 69 73 20 67 72  page_size" is gr
b060: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
b070: 20 23 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20   # compile time 
b080: 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f  value of SQLITE_
b090: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 74  MAX_PAGE_SIZE, t
b0a0: 68 65 6e 20 74 68 65 20 65 66 66 65 63 74 69 76  hen the effectiv
b0b0: 65 20 0a 20 20 23 20 70 61 67 65 2d 73 69 7a 65  e .  # page-size
b0c0: 20 72 65 6d 61 69 6e 73 20 31 30 32 34 20 62 79   remains 1024 by
b0d0: 74 65 73 2e 0a 20 20 23 0a 20 20 73 65 74 20 65  tes..  #.  set e
b0e0: 66 66 20 24 70 61 67 65 73 69 7a 65 0a 20 20 69  ff $pagesize.  i
b0f0: 66 20 7b 24 65 66 66 20 3e 20 24 3a 3a 53 51 4c  f {$eff > $::SQL
b100: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
b110: 45 7d 20 7b 20 73 65 74 20 65 66 66 20 31 30 32  E} { set eff 102
b120: 34 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70  4 }..  do_test p
b130: 61 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69  ager1-12.$pagesi
b140: 7a 65 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74  ze.1 {.    sqlit
b150: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
b160: 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20     execsql ".   
b170: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
b180: 69 7a 65 20 3d 20 24 70 61 67 65 73 69 7a 65 3b  ize = $pagesize;
b190: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 56 49  .      CREATE VI
b1a0: 45 57 20 76 20 41 53 20 53 45 4c 45 43 54 20 2a  EW v AS SELECT *
b1b0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
b1c0: 74 65 72 3b 0a 20 20 20 20 22 20 64 62 32 0a 20  ter;.    " db2. 
b1d0: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
b1e0: 74 2e 64 62 0a 20 20 7d 20 24 65 66 66 0a 20 20  t.db.  } $eff.  
b1f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
b200: 32 2e 24 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a  2.$pagesize.2 {.
b210: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20      sqlite3 db2 
b220: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63  test.db.    exec
b230: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c  sql { .      SEL
b240: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
b250: 4d 20 76 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  M v;.      PRAGM
b260: 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65  A main.page_size
b270: 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20  ;.    } db2.  } 
b280: 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20  [list 1 $eff].  
b290: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
b2a0: 32 2e 24 70 61 67 65 73 69 7a 65 2e 33 20 7b 0a  2.$pagesize.3 {.
b2b0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
b2c0: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
b2d0: 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20  t(*) FROM v;.   
b2e0: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70     PRAGMA main.p
b2f0: 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 0a  age_size;.    }.
b300: 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 66 66    } [list 1 $eff
b310: 5d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a  ].  db2 close.}.
b320: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
b330: 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  te..#-----------
b340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
b380: 20 54 65 73 74 20 73 70 65 63 61 6c 20 22 50 52   Test specal "PR
b390: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
b3a0: 65 3d 50 45 52 53 49 53 54 22 20 74 65 73 74 20  e=PERSIST" test 
b3b0: 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65 72  cases..#.# pager
b3c0: 31 2d 31 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74  1-13.1.*: This t
b3d0: 65 73 74 73 20 61 20 73 70 65 63 69 61 6c 20 63  ests a special c
b3e0: 61 73 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ase encountered 
b3f0: 69 6e 20 70 65 72 73 69 73 74 65 6e 74 20 0a 23  in persistent .#
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 49 66  journal mode: If
b420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 73 73   the journal ass
b430: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 74  ociated with a t
b440: 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20  ransaction.#    
b450: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
b460: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
b470: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 62 65  journal file (be
b480: 63 61 75 73 65 20 61 20 70 72 65 76 69 6f 75 73  cause a previous
b490: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
b4a0: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c     transaction l
b4b0: 65 66 74 20 61 20 76 65 72 79 20 6c 61 72 67 65  eft a very large
b4c0: 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c   non-hot journal
b4d0: 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 23 20 20   file in the.#  
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
b4f0: 6c 65 2d 73 79 73 74 65 6d 29 2c 20 74 68 65 6e  le-system), then
b500: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 62   SQLite has to b
b510: 65 20 63 61 72 65 66 75 6c 20 74 68 61 74 20 74  e careful that t
b520: 68 65 72 65 20 69 73 0a 23 20 20 20 20 20 20 20  here is.#       
b530: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 61 20 6a           not a j
b540: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6c 65  ournal-header le
b550: 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
b560: 72 65 76 69 6f 75 73 20 74 72 61 6e 73 61 63 74  revious transact
b570: 69 6f 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20  ion.#           
b580: 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79       immediately
b590: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6a   following the j
b5a0: 6f 75 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6a  ournal content j
b5b0: 75 73 74 20 77 72 69 74 74 65 6e 2e 0a 23 20 20  ust written..#  
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66                If
b5d0: 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
b5e0: 68 65 20 70 72 6f 63 65 73 73 20 63 72 61 73 68  he process crash
b5f0: 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a  es so that the j
b600: 6f 75 72 6e 61 6c 0a 23 20 20 20 20 20 20 20 20  ournal.#        
b610: 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20          becomes 
b620: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
b630: 64 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  d must be rolled
b640: 20 62 61 63 6b 20 62 79 20 61 6e 6f 74 68 65 72   back by another
b650: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b660: 20 20 70 72 6f 63 65 73 73 2c 20 74 68 65 72 65    process, there
b670: 20 69 73 20 61 20 64 61 6e 67 65 72 20 74 68 61   is a danger tha
b680: 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63  t the other proc
b690: 65 73 73 20 6d 61 79 20 72 6f 6c 6c 0a 23 20 20  ess may roll.#  
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61                ba
b6b0: 63 6b 20 74 68 65 20 61 62 6f 72 74 65 64 20 74  ck the aborted t
b6c0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
b6d0: 20 63 6f 6e 74 69 6e 75 65 20 63 6f 70 79 69 6e   continue copyin
b6e0: 67 20 64 61 74 61 0a 23 20 20 20 20 20 20 20 20  g data.#        
b6f0: 20 20 20 20 20 20 20 20 66 72 6f 6d 20 61 6e 20          from an 
b700: 6f 6c 64 65 72 20 74 72 61 6e 73 61 63 74 69 6f  older transactio
b710: 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 6d 61 69  n from the remai
b720: 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  nder of the jour
b730: 6e 61 6c 2e 0a 23 20 20 20 20 20 20 20 20 20 20  nal..#          
b740: 20 20 20 20 20 20 53 65 65 20 74 68 65 20 73 79        See the sy
b750: 6e 63 4a 6f 75 72 6e 61 6c 28 29 20 66 75 6e 63  ncJournal() func
b760: 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73  tion for details
b770: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e  ..#.# pager1-13.
b780: 32 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61  2.*: Same test a
b790: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20  s the previous. 
b7a0: 54 68 69 73 20 74 69 6d 65 2c 20 74 68 72 6f 77  This time, throw
b7b0: 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 0a 23   an index into.#
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 74 68 65 20 6d 69 78 20 74 6f 20 6d 61 6b 65 20  the mix to make 
b7e0: 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
b7f0: 65 63 6b 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20  eck more likely 
b800: 74 6f 20 63 61 74 63 68 0a 23 20 20 20 20 20 20  to catch.#      
b810: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 73            errors
b820: 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d  ..#.testvfs tv -
b830: 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72  default 1.tv scr
b840: 69 70 74 20 78 53 79 6e 63 43 62 0a 74 76 20 66  ipt xSyncCb.tv f
b850: 69 6c 74 65 72 20 78 53 79 6e 63 0a 70 72 6f 63  ilter xSync.proc
b860: 20 78 53 79 6e 63 43 62 20 7b 6d 65 74 68 6f 64   xSyncCb {method
b870: 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20   filename args} 
b880: 7b 0a 20 20 73 65 74 20 74 20 5b 66 69 6c 65 20  {.  set t [file 
b890: 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 0a  tail $filename].
b8a0: 20 20 69 66 20 7b 24 74 20 3d 3d 20 22 74 65 73    if {$t == "tes
b8b0: 74 2e 64 62 22 7d 20 66 61 75 6c 74 73 69 6d 5f  t.db"} faultsim_
b8c0: 73 61 76 65 0a 20 20 72 65 74 75 72 6e 20 53 51  save.  return SQ
b8d0: 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73  LITE_OK.}.faults
b8e0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
b8f0: 6f 70 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73  open.db func a_s
b900: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a  tring a_string..
b910: 23 20 54 68 65 20 55 50 44 41 54 45 20 73 74 61  # The UPDATE sta
b920: 74 65 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e  tement at the en
b930: 64 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 63  d of this test c
b940: 61 73 65 20 63 72 65 61 74 65 73 20 61 20 72 65  ase creates a re
b950: 61 6c 6c 79 20 62 69 67 0a 23 20 6a 6f 75 72 6e  ally big.# journ
b960: 61 6c 2e 20 53 69 6e 63 65 20 74 68 65 20 63 61  al. Since the ca
b970: 63 68 65 2d 73 69 7a 65 20 69 73 20 6f 6e 6c 79  che-size is only
b980: 20 31 30 20 70 61 67 65 73 2c 20 74 68 65 20 6a   10 pages, the j
b990: 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
b9a0: 0a 23 20 66 72 65 71 75 65 6e 74 20 6a 6f 75 72  .# frequent jour
b9b0: 6e 61 6c 20 68 65 61 64 65 72 73 2e 0a 23 0a 64  nal headers..#.d
b9c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
b9d0: 61 67 65 72 31 2d 31 33 2e 31 2e 31 20 7b 0a 20  ager1-13.1.1 {. 
b9e0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
b9f0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 50 52 41 47  e = 1024;.  PRAG
ba00: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
ba10: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 50 52 41  = PERSIST;.  PRA
ba20: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
ba30: 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20   10;.  BEGIN;.  
ba40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
ba50: 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(a INTEGER PRIM
ba60: 41 52 59 20 4b 45 59 2c 20 62 20 42 4c 4f 42 29  ARY KEY, b BLOB)
ba70: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
ba80: 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O t1 VALUES(NULL
ba90: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 29  , a_string(400))
baa0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
bab0: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
bac0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
bad0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
bae0: 20 20 2f 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20    /*   2 */.    
baf0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
bb00: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
bb10: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
bb20: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
bb30: 20 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54   4 */.    INSERT
bb40: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
bb50: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
bb60: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
bb70: 20 20 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a        /*   8 */.
bb80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bb90: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
bba0: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
bbb0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
bbc0: 2f 2a 20 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e  /*  16 */.    IN
bbd0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
bbe0: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
bbf0: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
bc00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32            /*  32
bc10: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
bc20: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
bc30: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
bc40: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
bc50: 20 20 20 20 2f 2a 20 20 36 34 20 2a 2f 0a 20 20      /*  64 */.  
bc60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
bc70: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
bc80: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
bc90: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
bca0: 20 31 32 38 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54   128 */.  COMMIT
bcb0: 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45  ;.  UPDATE t1 SE
bcc0: 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34  T b = a_string(4
bcd0: 30 30 29 3b 0a 7d 20 7b 70 65 72 73 69 73 74 7d  00);.} {persist}
bce0: 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61  ..if {$::tcl_pla
bcf0: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21  tform(platform)!
bd00: 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20  ="windows"} {.# 
bd10: 52 75 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  Run transactions
bd20: 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67 20 73   of increasing s
bd30: 69 7a 65 73 2e 20 45 76 65 6e 74 75 61 6c 6c 79  izes. Eventually
bd40: 2c 20 6f 6e 65 20 28 6f 72 20 6d 6f 72 65 20 74  , one (or more t
bd50: 68 61 6e 20 6f 6e 65 29 0a 23 20 6f 66 20 74 68  han one).# of th
bd60: 65 73 65 20 77 69 6c 6c 20 77 72 69 74 65 20 6a  ese will write j
bd70: 75 73 74 20 65 6e 6f 75 67 68 20 63 6f 6e 74 65  ust enough conte
bd80: 6e 74 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  nt that one of t
bd90: 68 65 20 6f 6c 64 20 68 65 61 64 65 72 73 20 63  he old headers c
bda0: 72 65 61 74 65 64 20 0a 23 20 62 79 20 74 68 65  reated .# by the
bdb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
bdc0: 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20  the block above 
bdd0: 6c 69 65 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  lies immediately
bde0: 20 61 66 74 65 72 20 74 68 65 20 63 6f 6e 74 65   after the conte
bdf0: 6e 74 0a 23 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  nt.# journalled 
be00: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
be10: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f  ransaction..#.fo
be20: 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24  r {set nUp 1} {$
be30: 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55  nUp<64} {incr nU
be40: 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71  p} {.  do_execsq
be50: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
be60: 2e 31 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20  .1.2.$nUp.1 { . 
be70: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
be80: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39   b = a_string(39
be90: 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e  9) WHERE a <= $n
bea0: 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65  Up.  } {}.  do_e
beb0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
bec0: 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 32  r1-13.1.2.$nUp.2
bed0: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
bee0: 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d  ity_check } {ok}
bef0: 20 0a 0a 20 20 23 20 54 72 79 20 74 6f 20 61 63   ..  # Try to ac
bf00: 63 65 73 73 20 74 68 65 20 73 6e 61 70 73 68 6f  cess the snapsho
bf10: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  t of the file-sy
bf20: 73 74 65 6d 2e 0a 20 20 23 0a 20 20 73 71 6c 69  stem..  #.  sqli
bf30: 74 65 33 20 64 62 32 20 73 76 5f 74 65 73 74 2e  te3 db2 sv_test.
bf40: 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  db.  do_test pag
bf50: 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e  er1-13.1.2.$nUp.
bf60: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
bf70: 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e  { SELECT sum(len
bf80: 67 74 68 28 62 29 29 20 46 52 4f 4d 20 74 31 20  gth(b)) FROM t1 
bf90: 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78 70 72 20  } db2.  } [expr 
bfa0: 7b 31 32 38 2a 34 30 30 20 2d 20 28 24 6e 55 70  {128*400 - ($nUp
bfb0: 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20  -1)}].  do_test 
bfc0: 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e  pager1-13.1.2.$n
bfd0: 55 70 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  Up.4 {.    execs
bfe0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  ql { PRAGMA inte
bff0: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62  grity_check } db
c000: 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32  2.  } {ok}.  db2
c010: 20 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a 69 66 20 7b   close.}.}..if {
c020: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
c030: 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69 6e 64  platform)!="wind
c040: 6f 77 73 22 7d 20 7b 0a 23 20 53 61 6d 65 20 74  ows"} {.# Same t
c050: 65 73 74 20 61 73 20 61 62 6f 76 65 2e 20 42 75  est as above. Bu
c060: 74 20 74 68 69 73 20 74 69 6d 65 20 77 69 74 68  t this time with
c070: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74 68 65   an index on the
c080: 20 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65   table..#.do_exe
c090: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c0a0: 2d 31 33 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41  -13.2.1 {.  CREA
c0b0: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
c0c0: 31 28 62 29 3b 0a 20 20 55 50 44 41 54 45 20 74  1(b);.  UPDATE t
c0d0: 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  1 SET b = a_stri
c0e0: 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f  ng(400);.} {}.fo
c0f0: 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24  r {set nUp 1} {$
c100: 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55  nUp<64} {incr nU
c110: 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71  p} {.  do_execsq
c120: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
c130: 2e 32 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20  .2.2.$nUp.1 { . 
c140: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
c150: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39   b = a_string(39
c160: 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e  9) WHERE a <= $n
c170: 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65  Up.  } {}.  do_e
c180: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
c190: 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 32  r1-13.2.2.$nUp.2
c1a0: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
c1b0: 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d  ity_check } {ok}
c1c0: 20 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20   .  sqlite3 db2 
c1d0: 73 76 5f 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f  sv_test.db.  do_
c1e0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32  test pager1-13.2
c1f0: 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20  .2.$nUp.3 {.    
c200: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
c210: 20 73 75 6d 28 6c 65 6e 67 74 68 28 62 29 29 20   sum(length(b)) 
c220: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20  FROM t1 } db2.  
c230: 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a 34 30 30  } [expr {128*400
c240: 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20   - ($nUp-1)}].  
c250: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
c260: 33 2e 32 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20  3.2.2.$nUp.4 {. 
c270: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41     execsql { PRA
c280: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
c290: 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f  eck } db2.  } {o
c2a0: 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d  k}.  db2 close.}
c2b0: 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  .}..db close.tv 
c2c0: 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  delete..#-------
c2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c310: 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c  --.# Test specal
c320: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
c330: 5f 6d 6f 64 65 3d 4f 46 46 22 20 74 65 73 74 20  _mode=OFF" test 
c340: 63 61 73 65 73 2e 0a 23 0a 66 61 75 6c 74 73 69  cases..#.faultsi
c350: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
c360: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
c370: 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e  est pager1-14.1.
c380: 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75  1 {.  PRAGMA jou
c390: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b  rnal_mode = OFF;
c3a0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
c3b0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 42 45 47 49  t1(a, b);.  BEGI
c3c0: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
c3d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
c3e0: 32 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  2);.  COMMIT;.  
c3f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
c400: 3b 0a 7d 20 7b 6f 66 66 20 31 20 32 7d 0a 64 6f  ;.} {off 1 2}.do
c410: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
c420: 61 67 65 72 31 2d 31 34 2e 31 2e 32 20 7b 0a 20  ager1-14.1.2 {. 
c430: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
c440: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
c450: 53 28 33 2c 20 34 29 3b 0a 20 20 52 4f 4c 4c 42  S(3, 4);.  ROLLB
c460: 41 43 4b 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  ACK;.} {0 {}}.do
c470: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
c480: 67 65 72 31 2d 31 34 2e 31 2e 33 20 7b 0a 20 20  ger1-14.1.3 {.  
c490: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
c4a0: 3b 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 63 61 74  ;.} {1 2}.do_cat
c4b0: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
c4c0: 31 2d 31 34 2e 31 2e 34 20 7b 0a 20 20 42 45 47  1-14.1.4 {.  BEG
c4d0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
c4e0: 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c  NTO t1(rowid, a,
c4f0: 20 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20   b) SELECT a+3, 
c500: 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20  b, b FROM t1;.  
c510: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
c520: 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 53 45  (rowid, a, b) SE
c530: 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62 20 46  LECT a+3, b, b F
c540: 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b 50 52  ROM t1;.} {1 {PR
c550: 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62  IMARY KEY must b
c560: 65 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65 78  e unique}}.do_ex
c570: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
c580: 31 2d 31 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d  1-14.1.5 {.  COM
c590: 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  MIT;.  SELECT * 
c5a0: 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20  FROM t1;.} {1 2 
c5b0: 32 20 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  2 2}..#---------
c5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c600: 0a 23 20 54 65 73 74 20 6f 70 65 6e 69 6e 67 20  .# Test opening 
c610: 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
c620: 70 61 67 65 72 20 73 75 62 2d 73 79 73 74 65 6d  pager sub-system
c630: 20 77 69 74 68 20 64 69 66 66 65 72 65 6e 74 20   with different 
c640: 76 61 6c 75 65 73 0a 23 20 66 6f 72 20 74 68 65  values.# for the
c650: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f   sqlite3_vfs.szO
c660: 73 46 69 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a  sFile variable..
c670: 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74  #.faultsim_delet
c680: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f  e_and_reopen.do_
c690: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c6a0: 65 72 31 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45  er1-15.0 {.  CRE
c6b0: 41 54 45 20 54 41 42 4c 45 20 74 78 28 79 2c 20  ATE TABLE tx(y, 
c6c0: 7a 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  z);.  INSERT INT
c6d0: 4f 20 74 78 20 56 41 4c 55 45 53 28 27 41 79 75  O tx VALUES('Ayu
c6e0: 74 74 68 61 79 61 27 2c 20 27 42 65 69 6a 69 6e  tthaya', 'Beijin
c6f0: 67 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  g');.  INSERT IN
c700: 54 4f 20 74 78 20 56 41 4c 55 45 53 28 27 4c 6f  TO tx VALUES('Lo
c710: 6e 64 6f 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b  ndon', 'Tokyo');
c720: 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66  .} {}.db close.f
c730: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
c740: 3c 35 31 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d  <513} {incr i 3}
c750: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
c760: 2d 64 65 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73  -default 1 -szos
c770: 66 69 6c 65 20 24 69 0a 20 20 73 71 6c 69 74 65  file $i.  sqlite
c780: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
c790: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
c7a0: 61 67 65 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a  ager1-15.$i.1 {.
c7b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
c7c0: 4d 20 74 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74  M tx;.  } {Ayutt
c7d0: 68 61 79 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e  haya Beijing Lon
c7e0: 64 6f 6e 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20  don Tokyo}.  db 
c7f0: 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74  close.  tv delet
c800: 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.}..#----------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c850: 23 20 43 68 65 63 6b 20 74 68 61 74 20 69 74 20  # Check that it 
c860: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
c870: 74 6f 20 6f 70 65 6e 20 61 20 64 61 74 61 62 61  to open a databa
c880: 73 65 20 66 69 6c 65 20 69 66 20 74 68 65 20 66  se file if the f
c890: 75 6c 6c 20 70 61 74 68 0a 23 20 74 6f 20 74 68  ull path.# to th
c8a0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75  e associated jou
c8b0: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
c8c0: 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 73 71  e longer than sq
c8d0: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
c8e0: 6e 61 6d 65 2e 0a 23 0a 74 65 73 74 76 66 73 20  name..#.testvfs 
c8f0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76  tv -default 1.tv
c900: 20 73 63 72 69 70 74 20 78 4f 70 65 6e 43 62 0a   script xOpenCb.
c910: 74 76 20 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a  tv filter xOpen.
c920: 70 72 6f 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65  proc xOpenCb {me
c930: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
c940: 67 73 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 66 69  gs} {.  set ::fi
c950: 6c 65 5f 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c  le_len [string l
c960: 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d  ength $filename]
c970: 0a 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  .}.sqlite3 db te
c980: 73 74 2e 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74  st.db.db close.t
c990: 76 20 64 65 6c 65 74 65 0a 0a 66 6f 72 20 7b 73  v delete..for {s
c9a0: 65 74 20 69 69 20 5b 65 78 70 72 20 24 3a 3a 66  et ii [expr $::f
c9b0: 69 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69  ile_len-5]} {$ii
c9c0: 20 3c 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65   < [expr $::file
c9d0: 5f 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72 20  _len+20]} {incr 
c9e0: 69 69 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 20  ii} {.  testvfs 
c9f0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 6d  tv -default 1 -m
ca00: 78 70 61 74 68 6e 61 6d 65 20 24 69 69 0a 0a 20  xpathname $ii.. 
ca10: 20 23 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66   # The length of
ca20: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74   the full path t
ca30: 6f 20 66 69 6c 65 20 22 74 65 73 74 2e 64 62 2d  o file "test.db-
ca40: 6a 6f 75 72 6e 61 6c 22 20 69 73 20 28 24 3a 3a  journal" is ($::
ca50: 66 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23  file_len+8)..  #
ca60: 20 49 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   If the configur
ca70: 65 64 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  ed sqlite3_vfs.m
ca80: 78 50 61 74 68 6e 61 6d 65 20 76 61 6c 75 65 20  xPathname value 
ca90: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
caa0: 65 71 75 61 6c 20 74 6f 0a 20 20 23 20 74 68 69  equal to.  # thi
cab0: 73 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  s, then the file
cac0: 20 63 61 6e 20 62 65 20 6f 70 65 6e 65 64 2e 20   can be opened. 
cad0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 63 61  Otherwise, it ca
cae0: 6e 6e 6f 74 2e 0a 20 20 23 0a 20 20 69 66 20 7b  nnot..  #.  if {
caf0: 24 69 69 20 3e 3d 20 5b 65 78 70 72 20 24 3a 3a  $ii >= [expr $::
cb00: 66 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20  file_len+8]} {. 
cb10: 20 20 20 73 65 74 20 72 65 73 20 7b 30 20 7b 7d     set res {0 {}
cb20: 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
cb30: 20 73 65 74 20 72 65 73 20 7b 31 20 7b 75 6e 61   set res {1 {una
cb40: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
cb50: 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a  base file}}.  }.
cb60: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
cb70: 31 2d 31 36 2e 31 2e 24 69 69 20 7b 0a 20 20 20  1-16.1.$ii {.   
cb80: 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73   list [catch { s
cb90: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
cba0: 62 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20  b } msg] $msg.  
cbb0: 7d 20 24 72 65 73 0a 0a 20 20 63 61 74 63 68 20  } $res..  catch 
cbc0: 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 74 76 20  {db close}.  tv 
cbd0: 64 65 6c 65 74 65 0a 7d 0a 0a 0a 23 2d 2d 2d 2d  delete.}...#----
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc20: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65  -----.# Test the
cc30: 20 70 61 67 65 72 73 20 72 65 73 70 6f 6e 73 65   pagers response
cc40: 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c   to the b-tree l
cc50: 61 79 65 72 20 72 65 71 75 65 73 74 69 6e 67 20  ayer requesting 
cc60: 69 6c 6c 65 67 61 6c 20 70 61 67 65 20 0a 23 20  illegal page .# 
cc70: 6e 75 6d 62 65 72 73 3a 0a 23 0a 23 20 20 20 2b  numbers:.#.#   +
cc80: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   The locking pag
cc90: 65 2c 0a 23 20 20 20 2b 20 50 61 67 65 20 30 2c  e,.#   + Page 0,
cca0: 0a 23 20 20 20 2b 20 41 20 70 61 67 65 20 77 69  .#   + A page wi
ccb0: 74 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  th a page number
ccc0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 28 32   greater than (2
ccd0: 5e 33 31 2d 31 29 2e 0a 23 0a 23 20 54 68 65 73  ^31-1)..#.# Thes
cce0: 65 20 74 65 73 74 73 20 77 69 6c 6c 20 6e 6f 74  e tests will not
ccf0: 20 77 6f 72 6b 20 69 66 20 53 51 4c 49 54 45 5f   work if SQLITE_
cd00: 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
cd10: 52 45 41 44 20 69 73 20 64 65 66 69 6e 65 64 2e  READ is defined.
cd20: 20 49 6e 0a 23 20 74 68 61 74 20 63 61 73 65 20   In.# that case 
cd30: 49 4f 20 65 72 72 6f 72 73 20 61 72 65 20 73 6f  IO errors are so
cd40: 6d 65 74 69 6d 65 73 20 72 65 70 6f 72 74 65 64  metimes reported
cd50: 20 69 6e 73 74 65 61 64 20 6f 66 20 53 51 4c 49   instead of SQLI
cd60: 54 45 5f 43 4f 52 52 55 50 54 2e 0a 23 0a 69 66  TE_CORRUPT..#.if
cd70: 63 61 70 61 62 6c 65 20 21 64 69 72 65 63 74 5f  capable !direct_
cd80: 72 65 61 64 20 7b 0a 64 6f 5f 74 65 73 74 20 70  read {.do_test p
cd90: 61 67 65 72 31 2d 31 38 2e 31 20 7b 0a 20 20 66  ager1-18.1 {.  f
cda0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
cdb0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
cdc0: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
cdd0: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
cde0: 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61  { .    PRAGMA pa
cdf0: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
ce00: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
ce10: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
ce20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
ce30: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30  LUES(a_string(50
ce40: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30  0), a_string(200
ce50: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
ce60: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
ce70: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
ce80: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
ce90: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
cea0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
ceb0: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
cec0: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
ced0: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
cee0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
cef0: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
cf00: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
cf10: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
cf20: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
cf30: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
cf40: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
cf50: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
cf60: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
cf70: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
cf80: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
cf90: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
cfa0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
cfb0: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
cfc0: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
cfd0: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
cfe0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
cff0: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
d000: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
d010: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  t1;.  }.} {}.do_
d020: 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 32  test pager1-18.2
d030: 20 7b 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b 64   {.  set root [d
d040: 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72 6f  b one "SELECT ro
d050: 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69  otpage FROM sqli
d060: 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 73 65  te_master"].  se
d070: 74 20 6c 6f 63 6b 69 6e 67 70 61 67 65 20 5b 65  t lockingpage [e
d080: 78 70 72 20 28 30 78 31 30 30 30 30 2f 31 30 32  xpr (0x10000/102
d090: 34 29 20 2b 20 31 5d 0a 20 20 65 78 65 63 73 71  4) + 1].  execsq
d0a0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  l {.    PRAGMA w
d0b0: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
d0c0: 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73   1;.    UPDATE s
d0d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54  qlite_master SET
d0e0: 20 72 6f 6f 74 70 61 67 65 20 3d 20 24 6c 6f 63   rootpage = $loc
d0f0: 6b 69 6e 67 70 61 67 65 3b 0a 20 20 7d 0a 20 20  kingpage;.  }.  
d100: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
d110: 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  .db.  catchsql {
d120: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
d130: 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d   FROM t1 } db2.}
d140: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
d150: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
d160: 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73  ormed}}.db2 clos
d170: 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  e.do_test pager1
d180: 2d 31 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -18.3 {.  execsq
d190: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
d1a0: 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20  ABLE t2(x);.    
d1b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
d1c0: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35  ALUES(a_string(5
d1d0: 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74  000));.  }.  set
d1e0: 20 70 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66 69   pgno [expr ([fi
d1f0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
d200: 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20 20 68 65   / 1024)-2].  he
d210: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
d220: 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31  b [expr ($pgno-1
d230: 29 2a 31 30 32 34 5d 20 30 30 30 30 30 30 30 30  )*1024] 00000000
d240: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
d250: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
d260: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
d270: 68 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64  h(x) FROM t2 } d
d280: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
d290: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
d2a0: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20  malformed}}.db2 
d2b0: 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61  close.do_test pa
d2c0: 67 65 72 31 2d 31 38 2e 34 20 7b 0a 20 20 68 65  ger1-18.4 {.  he
d2d0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
d2e0: 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31  b [expr ($pgno-1
d2f0: 29 2a 31 30 32 34 5d 20 39 30 30 30 30 30 30 30  )*1024] 90000000
d300: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
d310: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
d320: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
d330: 68 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64  h(x) FROM t2 } d
d340: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
d350: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
d360: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20  malformed}}.db2 
d370: 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61  close.do_test pa
d380: 67 65 72 31 2d 31 38 2e 35 20 7b 0a 20 20 73 71  ger1-18.5 {.  sq
d390: 6c 69 74 65 33 20 64 62 20 22 22 0a 20 20 65 78  lite3 db "".  ex
d3a0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
d3b0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
d3c0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
d3d0: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
d3e0: 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c    PRAGMA writabl
d3f0: 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  e_schema = 1;.  
d400: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
d410: 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70  master SET rootp
d420: 61 67 65 3d 35 20 57 48 45 52 45 20 74 62 6c 5f  age=5 WHERE tbl_
d430: 6e 61 6d 65 20 3d 20 27 74 31 27 3b 0a 20 20 20  name = 't1';.   
d440: 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
d450: 5f 73 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  _schema = 0;.   
d460: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 31 20   ALTER TABLE t1 
d470: 52 45 4e 41 4d 45 20 54 4f 20 78 31 3b 0a 20 20  RENAME TO x1;.  
d480: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  }.  catchsql { S
d490: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20  ELECT * FROM x1 
d4a0: 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  }.} {1 {database
d4b0: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
d4c0: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 20 63 6c  alformed}}.db cl
d4d0: 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  ose..do_test pag
d4e0: 65 72 31 2d 31 38 2e 36 20 7b 0a 20 20 66 61 75  er1-18.6 {.  fau
d4f0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
d500: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
d510: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
d520: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
d530: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
d540: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
d550: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
d560: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (x);.    INSERT 
d570: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
d580: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
d590: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
d5a0: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
d5b0: 67 28 38 30 30 29 29 3b 0a 20 20 7d 0a 0a 20 20  g(800));.  }..  
d5c0: 73 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e 65  set root [db one
d5d0: 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67   "SELECT rootpag
d5e0: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
d5f0: 73 74 65 72 22 5d 0a 20 20 64 62 20 63 6c 6f 73  ster"].  db clos
d600: 65 0a 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  e..  hexio_write
d610: 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28   test.db [expr (
d620: 24 72 6f 6f 74 2d 31 29 2a 31 30 32 34 20 2b 20  $root-1)*1024 + 
d630: 38 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73 71  8] 00000000.  sq
d640: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
d650: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d660: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46  LECT length(x) F
d670: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 64  ROM t1 }.} {1 {d
d680: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d690: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d6a0: 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  }.}..do_test pag
d6b0: 65 72 31 2d 31 39 2e 31 20 7b 0a 20 20 73 71 6c  er1-19.1 {.  sql
d6c0: 69 74 65 33 20 64 62 20 22 22 0a 20 20 64 62 20  ite3 db "".  db 
d6d0: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
d6e0: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
d6f0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
d700: 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
d710: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
d720: 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43  acuum = 1;.    C
d730: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
d740: 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61  a, ab, ac, ad, a
d750: 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61  e, af, ag, ah, a
d760: 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61  i, aj, ak, al, a
d770: 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, an,.         
d780: 20 20 20 20 20 20 20 20 20 20 20 62 61 2c 20 62             ba, b
d790: 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62  b, bc, bd, be, b
d7a0: 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62  f, bg, bh, bi, b
d7b0: 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62  j, bk, bl, bm, b
d7c0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d7d0: 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63         ca, cb, c
d7e0: 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63  c, cd, ce, cf, c
d7f0: 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63  g, ch, ci, cj, c
d800: 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20  k, cl, cm, cn,. 
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64     da, db, dc, d
d830: 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64  d, de, df, dg, d
d840: 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64  h, di, dj, dk, d
d850: 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20  l, dm, dn,.     
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
d870: 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65  a, eb, ec, ed, e
d880: 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65  e, ef, eg, eh, e
d890: 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65  i, ej, ek, el, e
d8a0: 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, en,.         
d8b0: 20 20 20 20 20 20 20 20 20 20 20 66 61 2c 20 66             fa, f
d8c0: 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66  b, fc, fd, fe, f
d8d0: 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66  f, fg, fh, fi, f
d8e0: 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66  j, fk, fl, fm, f
d8f0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d900: 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67         ga, gb, g
d910: 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67  c, gd, ge, gf, g
d920: 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67  g, gh, gi, gj, g
d930: 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20  k, gl, gm, gn,. 
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68     ha, hb, hc, h
d960: 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68  d, he, hf, hg, h
d970: 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68  h, hi, hj, hk, h
d980: 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20  l, hm, hn,.     
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
d9a0: 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69  a, ib, ic, id, i
d9b0: 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69  e, if, ig, ih, i
d9c0: 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69  i, ij, ik, il, i
d9d0: 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20  m, ix,.         
d9e0: 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a             ja, j
d9f0: 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a  b, jc, jd, je, j
da00: 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a  f, jg, jh, ji, j
da10: 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a  j, jk, jl, jm, j
da20: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
da30: 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b         ka, kb, k
da40: 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b  c, kd, ke, kf, k
da50: 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b  g, kh, ki, kj, k
da60: 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20  k, kl, km, kn,. 
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c     la, lb, lc, l
da90: 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c  d, le, lf, lg, l
daa0: 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c  h, li, lj, lk, l
dab0: 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20  l, lm, ln,.     
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
dad0: 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d  a, mb, mc, md, m
dae0: 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d  e, mf, mg, mh, m
daf0: 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d  i, mj, mk, ml, m
db00: 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20  m, mn.    );.   
db10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
db20: 28 61 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c  (aa, ab, ac, ad,
db30: 20 61 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c   ae, af, ag, ah,
db40: 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c   ai, aj, ak, al,
db50: 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20   am, an,.       
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61 2c               ba,
db70: 20 62 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c   bb, bc, bd, be,
db80: 20 62 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c   bf, bg, bh, bi,
db90: 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c   bj, bk, bl, bm,
dba0: 20 62 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   bn,.           
dbb0: 20 20 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c           ca, cb,
dbc0: 20 63 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c   cc, cd, ce, cf,
dbd0: 20 63 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c   cg, ch, ci, cj,
dbe0: 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c   ck, cl, cm, cn,
dbf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dc00: 20 20 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c       da, db, dc,
dc10: 20 64 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c   dd, de, df, dg,
dc20: 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c   dh, di, dj, dk,
dc30: 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20   dl, dm, dn,.   
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 65 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c   ea, eb, ec, ed,
dc60: 20 65 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c   ee, ef, eg, eh,
dc70: 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c   ei, ej, ek, el,
dc80: 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20   em, en,.       
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 2c               fa,
dca0: 20 66 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c   fb, fc, fd, fe,
dcb0: 20 66 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c   ff, fg, fh, fi,
dcc0: 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c   fj, fk, fl, fm,
dcd0: 20 66 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   fn,.           
dce0: 20 20 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c           ga, gb,
dcf0: 20 67 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c   gc, gd, ge, gf,
dd00: 20 67 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c   gg, gh, gi, gj,
dd10: 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c   gk, gl, gm, gn,
dd20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dd30: 20 20 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c       ha, hb, hc,
dd40: 20 68 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c   hd, he, hf, hg,
dd50: 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c   hh, hi, hj, hk,
dd60: 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20   hl, hm, hn,.   
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 69 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c   ia, ib, ic, id,
dd90: 20 69 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c   ie, if, ig, ih,
dda0: 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c   ii, ij, ik, il,
ddb0: 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20   im, ix,.       
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c               ja,
ddd0: 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c   jb, jc, jd, je,
dde0: 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c   jf, jg, jh, ji,
ddf0: 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c   jj, jk, jl, jm,
de00: 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   jn,.           
de10: 20 20 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c           ka, kb,
de20: 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c   kc, kd, ke, kf,
de30: 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c   kg, kh, ki, kj,
de40: 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c   kk, kl, km, kn,
de50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de60: 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c       la, lb, lc,
de70: 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c   ld, le, lf, lg,
de80: 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c   lh, li, lj, lk,
de90: 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20   ll, lm, ln,.   
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c   ma, mb, mc, md,
dec0: 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c   me, mf, mg, mh,
ded0: 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c   mi, mj, mk, ml,
dee0: 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20   mm, mn.    );. 
def0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
df00: 31 28 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f  1(aa) VALUES( a_
df10: 73 74 72 69 6e 67 28 31 30 30 30 30 30 29 20 29  string(100000) )
df20: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
df30: 4f 20 74 32 28 61 61 29 20 56 41 4c 55 45 53 28  O t2(aa) VALUES(
df40: 20 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30 30   a_string(100000
df50: 29 20 29 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b  ) );.    VACUUM;
df60: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  .  }.} {}..#----
df70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfb0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 61 20 63  -----.# Test a c
dfc0: 6f 75 70 6c 65 20 6f 66 20 73 70 65 63 69 61 6c  ouple of special
dfd0: 20 63 61 73 65 73 20 74 68 61 74 20 63 6f 6d 65   cases that come
dfe0: 20 75 70 20 77 68 69 6c 65 20 63 6f 6d 6d 69 74   up while commit
dff0: 74 69 6e 67 20 0a 23 20 74 72 61 6e 73 61 63 74  ting .# transact
e000: 69 6f 6e 73 3a 0a 23 0a 23 20 20 20 70 61 67 65  ions:.#.#   page
e010: 72 31 2d 32 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69  r1-20.1.*: Commi
e020: 74 74 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  tting an in-memo
e030: 72 79 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ry database tran
e040: 73 61 63 74 69 6f 6e 20 77 68 65 6e 20 74 68 65  saction when the
e050: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
e060: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 68 61       database ha
e070: 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  s not been modif
e080: 69 65 64 20 61 74 20 61 6c 6c 2e 0a 23 0a 23 20  ied at all..#.# 
e090: 20 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 2a 3a    pager1-20.2.*:
e0a0: 20 41 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77   As above, but w
e0b0: 69 74 68 20 61 20 6e 6f 72 6d 61 6c 20 64 62 20  ith a normal db 
e0c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63  in exclusive-loc
e0d0: 6b 69 6e 67 20 6d 6f 64 65 2e 0a 23 0a 23 20 20  king mode..#.#  
e0e0: 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 2a 3a 20   pager1-20.3.*: 
e0f0: 43 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  Committing a tra
e100: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 57 41 4c 20  nsaction in WAL 
e110: 6d 6f 64 65 20 77 68 65 72 65 20 74 68 65 20 64  mode where the d
e120: 61 74 61 62 61 73 65 20 68 61 73 0a 23 20 20 20  atabase has.#   
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
e140: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 62 75  een modified, bu
e150: 74 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  t all dirty page
e160: 73 20 68 61 76 65 20 62 65 65 6e 20 66 6c 75 73  s have been flus
e170: 68 65 64 20 74 6f 20 0a 23 20 20 20 20 20 20 20  hed to .#       
e180: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 20             disk 
e190: 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 6d 69  before the commi
e1a0: 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  t..#.do_test pag
e1b0: 65 72 31 2d 32 30 2e 31 2e 31 20 7b 0a 20 20 63  er1-20.1.1 {.  c
e1c0: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
e1d0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65    sqlite3 db :me
e1e0: 6d 6f 72 79 3a 0a 20 20 65 78 65 63 73 71 6c 20  mory:.  execsql 
e1f0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
e200: 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65  LE one(two, thre
e210: 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  e);.    INSERT I
e220: 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27  NTO one VALUES('
e230: 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20  a', 'b');.  }.} 
e240: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
e250: 31 2d 32 30 2e 31 2e 32 20 7b 0a 20 20 65 78 65  1-20.1.2 {.  exe
e260: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
e270: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20   EXCLUSIVE;.    
e280: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
e290: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
e2a0: 2d 32 30 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c  -20.2.1 {.  faul
e2b0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
e2c0: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
e2d0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f   {.    PRAGMA lo
e2e0: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63  cking_mode = exc
e2f0: 6c 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41 47  lusive;.    PRAG
e300: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
e310: 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 43  = persist;.    C
e320: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28  REATE TABLE one(
e330: 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20  two, three);.   
e340: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65   INSERT INTO one
e350: 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
e360: 29 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73  );.  }.} {exclus
e370: 69 76 65 20 70 65 72 73 69 73 74 7d 0a 64 6f 5f  ive persist}.do_
e380: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 32  test pager1-20.2
e390: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
e3a0: 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55  .    BEGIN EXCLU
e3b0: 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  SIVE;.    COMMIT
e3c0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61  ;.  }.} {}..ifca
e3d0: 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f  pable wal {.  do
e3e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e  _test pager1-20.
e3f0: 33 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73  3.1 {.    faults
e400: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
e410: 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63  open.    db func
e420: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
e430: 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  ng.    execsql {
e440: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61  .      PRAGMA ca
e450: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
e460: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
e470: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a  nal_mode = wal;.
e480: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
e490: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
e4a0: 45 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 20  E t1(x);.       
e4b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
e4c0: 28 79 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  (y);.        INS
e4d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
e4e0: 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29  ES(a_string(800)
e4f0: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
e500: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
e510: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
e520: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
e530: 2f 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 20 20  /*   2 */.      
e540: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
e550: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
e560: 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (800) FROM t1;  
e570: 20 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f         /*   4 */
e580: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
e590: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
e5a0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
e5b0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  M t1;         /*
e5c0: 20 20 20 38 20 2a 2f 0a 20 20 20 20 20 20 20 20     8 */.        
e5d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
e5e0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38  ELECT a_string(8
e5f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
e600: 20 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20       /*  16 */. 
e610: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
e620: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
e630: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
e640: 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20  t1;         /*  
e650: 33 32 20 2a 2f 0a 20 20 20 20 20 20 43 4f 4d 4d  32 */.      COMM
e660: 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77  IT;.    }.  } {w
e670: 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  al}.  do_test pa
e680: 67 65 72 31 2d 32 30 2e 33 2e 32 20 7b 0a 20 20  ger1-20.3.2 {.  
e690: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
e6a0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
e6b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
e6c0: 4c 55 45 53 28 27 78 78 78 78 27 29 3b 0a 20 20  LUES('xxxx');.  
e6d0: 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76    }.    recursiv
e6e0: 65 5f 73 65 6c 65 63 74 20 33 32 20 74 31 0a 20  e_select 32 t1. 
e6f0: 20 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49     execsql COMMI
e700: 54 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d  T.  } {}.}..#---
e710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e750: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
e760: 61 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  at a WAL databas
e770: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  e may not be ope
e780: 6e 65 64 20 69 66 3a 0a 23 0a 23 20 20 20 70 61  ned if:.#.#   pa
e790: 67 65 72 31 2d 32 31 2e 31 2e 2a 3a 20 54 68 65  ger1-21.1.*: The
e7a0: 20 56 46 53 20 68 61 73 20 61 6e 20 69 56 65 72   VFS has an iVer
e7b0: 73 69 6f 6e 20 6c 65 73 73 20 74 68 61 6e 20 32  sion less than 2
e7c0: 2c 20 6f 72 0a 23 20 20 20 70 61 67 65 72 31 2d  , or.#   pager1-
e7d0: 32 31 2e 32 2e 2a 3a 20 54 68 65 20 56 46 53 20  21.2.*: The VFS 
e7e0: 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65  does not provide
e7f0: 20 78 53 68 6d 58 58 58 28 29 20 6d 65 74 68 6f   xShmXXX() metho
e800: 64 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  ds..#.ifcapable 
e810: 77 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  wal {.  do_test 
e820: 70 61 67 65 72 31 2d 32 31 2e 30 20 7b 0a 20 20  pager1-21.0 {.  
e830: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
e840: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20  e_and_reopen.   
e850: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
e860: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
e870: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
e880: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b    CREATE TABLE k
e890: 6f 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63  o(c DEFAULT 'abc
e8a0: 27 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65  ', b DEFAULT 'de
e8b0: 66 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  f');.      INSER
e8c0: 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c  T INTO ko DEFAUL
e8d0: 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a  T VALUES;.    }.
e8e0: 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74    } {wal}.  do_t
e8f0: 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e 31 20  est pager1-21.1 
e900: 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76  {.    testvfs tv
e910: 20 2d 6e 6f 73 68 6d 20 31 0a 20 20 20 20 73 71   -noshm 1.    sq
e920: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
e930: 62 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61  b -vfs tv.    ca
e940: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
e950: 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a  * FROM ko } db2.
e960: 20 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74    } {1 {unable t
e970: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
e980: 66 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f  file}}.  db2 clo
e990: 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 20  se.  tv delete. 
e9a0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
e9b0: 32 31 2e 32 20 7b 0a 20 20 20 20 74 65 73 74 76  21.2 {.    testv
e9c0: 66 73 20 74 76 20 2d 69 76 65 72 73 69 6f 6e 20  fs tv -iversion 
e9d0: 31 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  1.    sqlite3 db
e9e0: 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74  2 test.db -vfs t
e9f0: 76 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  v.    catchsql {
ea00: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b   SELECT * FROM k
ea10: 6f 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b  o } db2.  } {1 {
ea20: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
ea30: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20  atabase file}}. 
ea40: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20   db2 close.  tv 
ea50: 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  delete.}..#-----
ea60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eaa0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
eab0: 20 61 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63   a "PRAGMA wal_c
eac0: 68 65 63 6b 70 6f 69 6e 74 22 3a 0a 23 0a 23 20  heckpoint":.#.# 
ead0: 20 20 70 61 67 65 72 31 2d 32 32 2e 31 2e 2a 3a    pager1-22.1.*:
eae0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61   is a no-op on a
eaf0: 20 6e 6f 6e 2d 57 41 4c 20 64 62 2c 20 61 6e 64   non-WAL db, and
eb00: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32 2e 32  .#   pager1-22.2
eb10: 2e 2a 3a 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  .*: does not cau
eb20: 73 65 20 78 53 79 6e 63 20 63 61 6c 6c 73 20 77  se xSync calls w
eb30: 69 74 68 20 61 20 73 79 6e 63 68 72 6f 6e 6f 75  ith a synchronou
eb40: 73 3d 6f 66 66 20 64 62 2e 0a 23 0a 69 66 63 61  s=off db..#.ifca
eb50: 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f  pable wal {.  do
eb60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e  _test pager1-22.
eb70: 31 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73  1.1 {.    faults
eb80: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
eb90: 6f 70 65 6e 0a 20 20 20 20 65 78 65 63 73 71 6c  open.    execsql
eba0: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
ebb0: 54 41 42 4c 45 20 6b 6f 28 63 20 44 45 46 41 55  TABLE ko(c DEFAU
ebc0: 4c 54 20 27 61 62 63 27 2c 20 62 20 44 45 46 41  LT 'abc', b DEFA
ebd0: 55 4c 54 20 27 64 65 66 27 29 3b 0a 20 20 20 20  ULT 'def');.    
ebe0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f    INSERT INTO ko
ebf0: 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b   DEFAULT VALUES;
ec00: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
ec10: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
ec20: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d  checkpoint }.  }
ec30: 20 7b 30 20 2d 31 20 2d 31 7d 0a 20 20 64 6f 5f   {0 -1 -1}.  do_
ec40: 74 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e 32  test pager1-22.2
ec50: 2e 31 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73  .1 {.    testvfs
ec60: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20   tv -default 1. 
ec70: 20 20 20 74 76 20 66 69 6c 74 65 72 20 78 53 79     tv filter xSy
ec80: 6e 63 0a 20 20 20 20 74 76 20 73 63 72 69 70 74  nc.    tv script
ec90: 20 78 53 79 6e 63 43 62 0a 20 20 20 20 70 72 6f   xSyncCb.    pro
eca0: 63 20 78 53 79 6e 63 43 62 20 7b 61 72 67 73 7d  c xSyncCb {args}
ecb0: 20 7b 69 6e 63 72 20 3a 3a 73 79 6e 63 63 6f 75   {incr ::synccou
ecc0: 6e 74 7d 0a 20 20 20 20 73 65 74 20 3a 3a 73 79  nt}.    set ::sy
ecd0: 6e 63 63 6f 75 6e 74 20 30 0a 20 20 20 20 73 71  nccount 0.    sq
ece0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
ecf0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
ed00: 20 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63       PRAGMA sync
ed10: 68 72 6f 6e 6f 75 73 20 3d 20 6f 66 66 3b 0a 20  hronous = off;. 
ed20: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
ed30: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
ed40: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
ed50: 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c  O ko DEFAULT VAL
ed60: 55 45 53 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  UES;.    }.    e
ed70: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
ed80: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
ed90: 0a 20 20 20 20 73 65 74 20 73 79 6e 63 63 6f 75  .    set synccou
eda0: 6e 74 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 62 20  nt.  } {0}.  db 
edb0: 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74  close.  tv delet
edc0: 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.}..#----------
edd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ede0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ee10: 23 20 54 65 73 74 73 20 66 6f 72 20 63 68 61 6e  # Tests for chan
ee20: 67 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  ging journal mod
ee30: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
ee40: 32 33 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61  23.1.*: Test tha
ee50: 74 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20  t when changing 
ee60: 66 72 6f 6d 20 50 45 52 53 49 53 54 20 74 6f 20  from PERSIST to 
ee70: 44 45 4c 45 54 45 20 6d 6f 64 65 2c 0a 23 20 20  DELETE mode,.#  
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
eea0: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23   is deleted..#.#
eeb0: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 2a     pager1-23.2.*
eec0: 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 61  : Same test as a
eed0: 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c 65 20  bove, but while 
eee0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  a shared lock is
eef0: 20 68 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20   held.#         
ef00: 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20           on the 
ef10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23  database file..#
ef20: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 33  .#   pager1-23.3
ef30: 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73  .*: Same test as
ef40: 20 61 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c   above, but whil
ef50: 65 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  e a reserved loc
ef60: 6b 20 69 73 20 68 65 6c 64 0a 23 20 20 20 20 20  k is held.#     
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20               on 
ef80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ef90: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
efa0: 32 33 2e 34 2e 2a 3a 20 41 6e 64 2c 20 66 6f 72  23.4.*: And, for
efb0: 20 66 75 6e 2c 20 77 68 69 6c 65 20 68 6f 6c 64   fun, while hold
efc0: 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ing an exclusive
efd0: 20 6c 6f 63 6b 2e 0a 23 0a 23 20 20 20 70 61 67   lock..#.#   pag
efe0: 65 72 31 2d 32 33 2e 35 2e 2a 3a 20 54 72 79 20  er1-23.5.*: Try 
eff0: 74 6f 20 73 65 74 20 76 61 72 69 6f 75 73 20 64  to set various d
f000: 69 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c  ifferent journal
f010: 20 6d 6f 64 65 73 20 77 69 74 68 20 61 6e 0a 23   modes with an.#
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61    in-memory data
f040: 62 61 73 65 20 28 6f 6e 6c 79 20 4d 45 4d 4f 52  base (only MEMOR
f050: 59 20 61 6e 64 20 4f 46 46 20 73 68 6f 75 6c 64  Y and OFF should
f060: 20 77 6f 72 6b 29 2e 0a 23 0a 23 20 20 20 70 61   work)..#.#   pa
f070: 67 65 72 31 2d 32 33 2e 36 2e 2a 3a 20 54 72 79  ger1-23.6.*: Try
f080: 20 74 6f 20 73 65 74 20 6c 6f 63 6b 69 6e 67 5f   to set locking_
f090: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 6f 6e 20 61  mode=normal on a
f0a0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
f0b0: 62 61 73 65 0a 23 20 20 20 20 20 20 20 20 20 20  base.#          
f0c0: 20 20 20 20 20 20 20 20 28 64 6f 65 73 6e 27 74          (doesn't
f0d0: 20 77 6f 72 6b 20 2d 20 69 6e 2d 6d 65 6d 6f 72   work - in-memor
f0e0: 79 20 64 61 74 61 62 61 73 65 73 20 61 6c 77 61  y databases alwa
f0f0: 79 73 20 75 73 65 0a 23 20 20 20 20 20 20 20 20  ys use.#        
f100: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 69 6e            lockin
f110: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
f120: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  )..#.do_test pag
f130: 65 72 31 2d 32 33 2e 31 2e 31 20 7b 0a 20 20 66  er1-23.1.1 {.  f
f140: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
f150: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
f160: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
f170: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f180: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45  PERSIST;.    CRE
f190: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
f1a0: 62 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 65  b);.  }.  file e
f1b0: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
f1c0: 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  urnal.} {1}.do_t
f1d0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  est pager1-23.1.
f1e0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
f1f0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f200: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f210: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
f220: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
f230: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  0}..do_test page
f240: 72 31 2d 32 33 2e 32 2e 31 20 7b 0a 20 20 65 78  r1-23.2.1 {.  ex
f250: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
f260: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f270: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49  = PERSIST;.    I
f280: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
f290: 4c 55 45 53 28 27 43 61 6e 62 65 72 72 61 27 2c  LUES('Canberra',
f2a0: 20 27 41 43 54 27 29 3b 0a 20 20 7d 0a 20 20 64   'ACT');.  }.  d
f2b0: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
f2c0: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 0a 20 20  * FROM t1 } {.  
f2d0: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
f2e0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f2f0: 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 7d 0a 20  = DELETE }.  }. 
f300: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f310: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f320: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f330: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e  est pager1-23.2.
f340: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f350: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f360: 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74  l.} {0}..do_test
f370: 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 31 20 7b   pager1-23.3.1 {
f380: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f390: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f3a0: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
f3b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f3c0: 74 31 20 56 41 4c 55 45 53 28 27 44 61 72 77 69  t1 VALUES('Darwi
f3d0: 6e 27 2c 20 27 4e 54 27 29 3b 0a 20 20 20 20 42  n', 'NT');.    B
f3e0: 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a  EGIN IMMEDIATE;.
f3f0: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
f400: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f410: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f420: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f430: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f440: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f450: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e  est pager1-23.3.
f460: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f470: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f480: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  l.} {0}.do_test 
f490: 70 61 67 65 72 31 2d 32 33 2e 33 2e 33 20 7b 0a  pager1-23.3.3 {.
f4a0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
f4b0: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  .} {}..do_test p
f4c0: 61 67 65 72 31 2d 32 33 2e 34 2e 31 20 7b 0a 20  ager1-23.4.1 {. 
f4d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
f4e0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f4f0: 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
f500: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
f510: 20 56 41 4c 55 45 53 28 27 41 64 65 6c 61 69 64   VALUES('Adelaid
f520: 65 27 2c 20 27 53 41 27 29 3b 0a 20 20 20 20 42  e', 'SA');.    B
f530: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a  EGIN EXCLUSIVE;.
f540: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
f550: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f560: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f570: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f580: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f590: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f5a0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e  est pager1-23.4.
f5b0: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f5c0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f5d0: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  l.} {0}.do_test 
f5e0: 70 61 67 65 72 31 2d 32 33 2e 34 2e 33 20 7b 0a  pager1-23.4.3 {.
f5f0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
f600: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  .} {}..do_test p
f610: 61 67 65 72 31 2d 32 33 2e 35 2e 31 20 7b 0a 20  ager1-23.5.1 {. 
f620: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
f630: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71  _and_reopen.  sq
f640: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
f650: 3a 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b  :.} {}.foreach {
f660: 74 6e 20 6d 6f 64 65 20 70 6f 73 73 69 62 6c 65  tn mode possible
f670: 7d 20 7b 0a 20 20 32 20 20 6f 66 66 20 20 20 20  } {.  2  off    
f680: 20 20 31 0a 20 20 33 20 20 6d 65 6d 6f 72 79 20    1.  3  memory 
f690: 20 20 31 0a 20 20 34 20 20 70 65 72 73 69 73 74    1.  4  persist
f6a0: 20 20 30 0a 20 20 35 20 20 64 65 6c 65 74 65 20    0.  5  delete 
f6b0: 20 20 30 0a 20 20 36 20 20 77 61 6c 20 20 20 20    0.  6  wal    
f6c0: 20 20 30 0a 20 20 37 20 20 74 72 75 6e 63 61 74    0.  7  truncat
f6d0: 65 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  e 0.} {.  do_tes
f6e0: 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74  t pager1-23.5.$t
f6f0: 6e 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.1 {.    execsq
f700: 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  l "PRAGMA journa
f710: 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 22 0a 20 20  l_mode = off".  
f720: 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
f730: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f740: 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20   $mode".  } [if 
f750: 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20  $possible {list 
f760: 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6f 66 66  $mode} {list off
f770: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }].  do_test pag
f780: 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 32 20 7b  er1-23.5.$tn.2 {
f790: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52  .    execsql "PR
f7a0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f7b0: 65 20 3d 20 6d 65 6d 6f 72 79 22 0a 20 20 20 20  e = memory".    
f7c0: 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20  execsql "PRAGMA 
f7d0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24  journal_mode = $
f7e0: 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70  mode".  } [if $p
f7f0: 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d  ossible {list $m
f800: 6f 64 65 7d 20 7b 6c 69 73 74 20 6d 65 6d 6f 72  ode} {list memor
f810: 79 7d 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61  y}].}.do_test pa
f820: 67 65 72 31 2d 32 33 2e 36 2e 31 20 7b 0a 20 20  ger1-23.6.1 {.  
f830: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
f840: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e  locking_mode = n
f850: 6f 72 6d 61 6c 7d 0a 7d 20 7b 65 78 63 6c 75 73  ormal}.} {exclus
f860: 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ive}.do_test pag
f870: 65 72 31 2d 32 33 2e 36 2e 32 20 7b 0a 20 20 65  er1-23.6.2 {.  e
f880: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c  xecsql {PRAGMA l
f890: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78  ocking_mode = ex
f8a0: 63 6c 75 73 69 76 65 7d 0a 7d 20 7b 65 78 63 6c  clusive}.} {excl
f8b0: 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70  usive}.do_test p
f8c0: 61 67 65 72 31 2d 32 33 2e 36 2e 33 20 7b 0a 20  ager1-23.6.3 {. 
f8d0: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
f8e0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d   locking_mode}.}
f8f0: 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f   {exclusive}.do_
f900: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
f910: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
f920: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6c 6f 63 6b  PRAGMA main.lock
f930: 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63  ing_mode}.} {exc
f940: 6c 75 73 69 76 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  lusive}..#------
f950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f990: 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ---.#.do_test pa
f9a0: 67 65 72 31 2d 32 34 2e 31 2e 31 20 7b 0a 20 20  ger1-24.1.1 {.  
f9b0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
f9c0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
f9d0: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
f9e0: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
f9f0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
fa00: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
fa10: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
fa20: 61 63 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20  acuum = FULL;.  
fa30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
fa40: 31 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41  1(x, y, z, PRIMA
fa50: 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20  RY KEY(y, z));. 
fa60: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
fa70: 78 32 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d  x2(x, y, z, PRIM
fa80: 41 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a  ARY KEY(y, z));.
fa90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
faa0: 78 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  x2 VALUES(a_stri
fab0: 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(400), a_strin
fac0: 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(500), a_string
fad0: 28 36 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (600));.    INSE
fae0: 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43  RT INTO x2 SELEC
faf0: 54 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c  T a_string(600),
fb00: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20   a_string(400), 
fb10: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46 52  a_string(500) FR
fb20: 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52  OM x2;.    INSER
fb30: 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54  T INTO x2 SELECT
fb40: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
fb50: 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61  a_string(600), a
fb60: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
fb70: 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x2;.    INSERT
fb80: 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20   INTO x2 SELECT 
fb90: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61  a_string(400), a
fba0: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
fbb0: 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
fbc0: 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x2;.    INSERT 
fbd0: 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61  INTO x2 SELECT a
fbe0: 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f  _string(600), a_
fbf0: 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73  string(400), a_s
fc00: 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20  tring(500) FROM 
fc10: 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x2;.    INSERT I
fc20: 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f  NTO x2 SELECT a_
fc30: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
fc40: 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74  tring(600), a_st
fc50: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 78  ring(400) FROM x
fc60: 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  2;.    INSERT IN
fc70: 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73  TO x2 SELECT a_s
fc80: 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74  tring(400), a_st
fc90: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
fca0: 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 78 32  ing(600) FROM x2
fcb0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fcc0: 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O x1 SELECT * FR
fcd0: 4f 4d 20 78 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM x2;.  }.} {}.
fce0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
fcf0: 34 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  4.1.2 {.  execsq
fd00: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
fd10: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
fd20: 20 78 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c   x1 WHERE rowid<
fd30: 33 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73  32;.  }.  recurs
fd40: 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32  ive_select 64 x2
fd50: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
fd60: 67 65 72 31 2d 32 34 2e 31 2e 33 20 7b 0a 20 20  ger1-24.1.3 {.  
fd70: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
fd80: 20 55 50 44 41 54 45 20 78 31 20 53 45 54 20 7a   UPDATE x1 SET z
fd90: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29   = a_string(300)
fda0: 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b   WHERE rowid>40;
fdb0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20  .    COMMIT;.   
fdc0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
fdd0: 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c  y_check;.    SEL
fde0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
fdf0: 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20  M x1;.  }.} {ok 
fe00: 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  33}..do_test pag
fe10: 65 72 31 2d 32 34 2e 31 2e 34 20 7b 0a 20 20 65  er1-24.1.4 {.  e
fe20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
fe30: 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20  ETE FROM x1;.   
fe40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
fe50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32  SELECT * FROM x2
fe60: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
fe70: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78     DELETE FROM x
fe80: 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c 33 32  1 WHERE rowid<32
fe90: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78  ;.      UPDATE x
fea0: 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69  1 SET z = a_stri
feb0: 6e 67 28 32 39 39 29 20 57 48 45 52 45 20 72 6f  ng(299) WHERE ro
fec0: 77 69 64 3e 34 30 3b 0a 20 20 7d 0a 20 20 72 65  wid>40;.  }.  re
fed0: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36  cursive_select 6
fee0: 34 20 78 32 20 7b 64 62 20 65 76 61 6c 20 43 4f  4 x2 {db eval CO
fef0: 4d 4d 49 54 7d 0a 20 20 65 78 65 63 73 71 6c 20  MMIT}.  execsql 
ff00: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  {.    PRAGMA int
ff10: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
ff20: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
ff30: 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d  ) FROM x1;.  }.}
ff40: 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73   {ok 33}..do_tes
ff50: 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 35 20  t pager1-24.1.5 
ff60: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
ff70: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31    DELETE FROM x1
ff80: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
ff90: 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O x1 SELECT * FR
ffa0: 4f 4d 20 78 32 3b 0a 20 20 7d 0a 20 20 72 65 63  OM x2;.  }.  rec
ffb0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34  ursive_select 64
ffc0: 20 78 32 20 7b 20 64 62 20 65 76 61 6c 20 7b 43   x2 { db eval {C
ffd0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 33 28 78  REATE TABLE x3(x
ffe0: 2c 20 79 2c 20 7a 29 7d 20 7d 0a 20 20 65 78 65  , y, z)} }.  exe
fff0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
10000 46 52 4f 4d 20 78 33 20 7d 0a 7d 20 7b 7d 0a 0a  FROM x3 }.} {}..
10010 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
10020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
10060 74 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 31  test pager1-25-1
10070 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
10080 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
10090 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
100a0 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56  BEGIN;.      SAV
100b0 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20  EPOINT abc;.    
100c0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
100d0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
100e0 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63   ROLLBACK TO abc
100f0 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
10100 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b  }.  db close.} {
10110 7d 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 64 6f 5f  }.breakpoint.do_
10120 74 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 32  test pager1-25-2
10130 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
10140 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
10150 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
10160 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20  SAVEPOINT abc;. 
10170 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
10180 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
10190 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b  ROLLBACK TO abc;
101a0 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
101b0 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d  .  db close.} {}
101c0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53  ------------.# S
10210 65 63 74 6f 72 2d 73 69 7a 65 20 74 65 73 74 73  ector-size tests
10220 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
10230 72 31 2d 32 36 2e 31 20 7b 0a 20 20 74 65 73 74  r1-26.1 {.  test
10240 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
10250 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  1.  tv sectorsiz
10260 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69  e 4096.  faultsi
10270 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
10280 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
10290 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
102a0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
102b0 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
102c0 20 3d 20 35 31 32 3b 0a 20 20 20 20 43 52 45 41   = 512;.    CREA
102d0 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 20 50  TE TABLE tbl(a P
102e0 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e  RIMARY KEY, b UN
102f0 49 51 55 45 29 3b 0a 20 20 20 20 42 45 47 49 4e  IQUE);.    BEGIN
10300 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
10310 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 61  NTO tbl VALUES(a
10320 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
10330 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20  tring(600));.   
10340 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10350 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
10360 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
10370 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
10380 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
10390 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
103a0 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
103b0 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
103c0 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
103d0 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
103e0 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
103f0 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10400 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45   tbl;.      INSE
10410 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
10420 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
10430 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
10440 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49  ROM tbl;.      I
10450 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
10460 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
10470 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
10480 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
10490 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
104a0 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
104b0 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
104c0 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
104d0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
104e0 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
104f0 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
10500 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
10510 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
10520 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71  }.} {}.do_execsq
10530 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 36  l_test pager1-26
10540 2e 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74 62  .1 {.  UPDATE tb
10550 6c 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  l SET b = a_stri
10560 6e 67 28 35 35 30 29 3b 0a 7d 20 7b 7d 0a 64 62  ng(550);.} {}.db
10570 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
10580 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
10590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64  ------------.#.d
105d0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 32 37  o_test pager1.27
105e0 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
105f0 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
10600 6e 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  n.  sqlite3_page
10610 72 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20  r_refcounts db. 
10620 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
10630 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
10640 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
10650 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
10660 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
10670 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20 43 4f   db.  execsql CO
10680 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  MMIT.} {}..#----
10690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106d0 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
106e0 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  t attempting to 
106f0 6f 70 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61  open a write-tra
10700 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 20 0a 23  nsaction with .#
10710 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
10720 63 6c 75 73 69 76 65 20 69 6e 20 57 41 4c 20 6d  clusive in WAL m
10730 6f 64 65 20 66 61 69 6c 73 20 69 66 20 74 68 65  ode fails if the
10740 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6c 69  re are other cli
10750 65 6e 74 73 20 6f 6e 20 0a 23 20 74 68 65 20 73  ents on .# the s
10760 61 6d 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a  ame database..#.
10770 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
10780 20 7d 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c   }.ifcapable wal
10790 20 7b 0a 20 20 64 6f 5f 6d 75 6c 74 69 63 6c 69   {.  do_multicli
107a0 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20  ent_test tn {.  
107b0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
107c0 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  -28.$tn.1 {.    
107d0 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20    sql1 { .      
107e0 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
107f0 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
10800 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
10810 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
10820 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10830 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t1 VALUES('a', '
10840 62 27 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b');.      }.   
10850 20 7d 20 7b 77 61 6c 7d 0a 20 20 20 20 64 6f 5f   } {wal}.    do_
10860 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10870 74 6e 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45  tn.2 { sql2 { SE
10880 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
10890 20 7d 20 7b 61 20 62 7d 0a 0a 20 20 20 20 64 6f   } {a b}..    do
108a0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
108b0 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20 50  $tn.3 { sql1 { P
108c0 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
108d0 64 65 3d 65 78 63 6c 75 73 69 76 65 20 7d 20 7d  de=exclusive } }
108e0 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 20 20 20   {exclusive}.   
108f0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10900 32 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20  28.$tn.4 { .    
10910 20 20 63 73 71 6c 31 20 7b 20 42 45 47 49 4e 3b    csql1 { BEGIN;
10920 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
10930 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29  VALUES('c', 'd')
10940 3b 20 7d 0a 20 20 20 20 7d 20 7b 31 20 7b 64 61  ; }.    } {1 {da
10950 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
10960 7d 7d 0a 20 20 20 20 63 6f 64 65 32 20 7b 20 64  }}.    code2 { d
10970 62 32 20 63 6c 6f 73 65 20 3b 20 73 71 6c 69 74  b2 close ; sqlit
10980 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 7d  e3 db2 test.db }
10990 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
109a0 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 0a  er1-28.$tn.4 { .
109b0 20 20 20 20 20 20 73 71 6c 31 20 7b 20 49 4e 53        sql1 { INS
109c0 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
109d0 45 53 28 27 63 27 2c 20 27 64 27 29 3b 20 43 4f  ES('c', 'd'); CO
109e0 4d 4d 49 54 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a  MMIT }.    } {}.
109f0 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d    }.}..#--------
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a40 2d 0a 23 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68  -.# Normally, wh
10a50 65 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d  en changing from
10a60 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
10a70 52 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20  RSIST to DELETE 
10a80 74 68 65 20 70 61 67 65 72 0a 23 20 61 74 74 65  the pager.# atte
10a90 6d 70 74 73 20 74 6f 20 64 65 6c 65 74 65 20 74  mpts to delete t
10aa0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
10ab0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 69 74 20   However, if it 
10ac0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 20 61 0a  cannot obtain a.
10ad0 23 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  # RESERVED lock 
10ae0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
10af0 66 69 6c 65 2c 20 74 68 69 73 20 73 74 65 70 20  file, this step 
10b00 69 73 20 73 6b 69 70 70 65 64 2e 0a 23 0a 64 6f  is skipped..#.do
10b10 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73  _multiclient_tes
10b20 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74  t tn {.  do_test
10b30 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
10b40 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20   {.    sql1 { . 
10b50 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
10b60 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
10b70 53 54 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  ST;.      CREATE
10b80 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
10b90 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10ba0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27  TO t1 VALUES('a'
10bb0 2c 20 27 62 27 29 3b 0a 20 20 20 20 7d 0a 20 20  , 'b');.    }.  
10bc0 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f  } {persist}.  do
10bd0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10be0 24 74 6e 2e 32 20 7b 20 66 69 6c 65 20 65 78 69  $tn.2 { file exi
10bf0 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
10c00 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  nal } 1.  do_tes
10c10 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10c20 33 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d  3 { sql1 { PRAGM
10c30 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
10c40 20 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65   DELETE } } dele
10c50 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  te.  do_test pag
10c60 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 66  er1-28.$tn.4 { f
10c70 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
10c80 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a  db-journal } 0..
10c90 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10ca0 2d 32 38 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20  -28.$tn.5 {.    
10cb0 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52  sql1 { .      PR
10cc0 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
10cd0 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
10ce0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10cf0 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64  1 VALUES('c', 'd
10d00 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70  ');.    }.  } {p
10d10 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73  ersist}.  do_tes
10d20 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10d30 36 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  6 { file exists 
10d40 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
10d50 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } 1.  do_test pa
10d60 67 65 72 31 2d 32 38 2e 24 74 6e 2e 37 20 7b 0a  ger1-28.$tn.7 {.
10d70 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
10d80 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  ; INSERT INTO t1
10d90 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27   VALUES('e', 'f'
10da0 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  ); }.  } {}.  do
10db0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10dc0 24 74 6e 2e 38 20 20 7b 20 66 69 6c 65 20 65 78  $tn.8  { file ex
10dd0 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
10de0 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65  rnal } 1.  do_te
10df0 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
10e00 2e 39 20 20 7b 20 73 71 6c 31 20 7b 20 50 52 41  .9  { sql1 { PRA
10e10 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
10e20 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20 64 65   = DELETE } } de
10e30 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70  lete.  do_test p
10e40 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 30 20  ager1-28.$tn.10 
10e50 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
10e60 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
10e70 31 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  1..  do_test pag
10e80 65 72 31 2d 32 38 2e 24 74 6e 2e 31 31 20 7b 20  er1-28.$tn.11 { 
10e90 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d  sql2 COMMIT } {}
10ea0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10eb0 31 2d 32 38 2e 24 74 6e 2e 31 32 20 7b 20 66 69  1-28.$tn.12 { fi
10ec0 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
10ed0 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20  b-journal } 0.. 
10ee0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10ef0 32 38 2d 24 74 6e 2e 31 33 20 7b 0a 20 20 20 20  28-$tn.13 {.    
10f00 63 6f 64 65 31 20 7b 20 73 65 74 20 63 68 61 6e  code1 { set chan
10f10 6e 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62  nel [db incrblob
10f20 20 2d 72 65 61 64 6f 6e 6c 79 20 74 31 20 61 20   -readonly t1 a 
10f30 32 5d 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 0a  2] }.    sql1 {.
10f40 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
10f50 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
10f60 49 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  IST;.      INSER
10f70 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
10f80 28 27 67 27 2c 20 27 68 27 29 3b 0a 20 20 20 20  ('g', 'h');.    
10f90 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a  }.  } {persist}.
10fa0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10fb0 2d 32 38 2e 24 74 6e 2e 31 34 20 7b 20 66 69 6c  -28.$tn.14 { fil
10fc0 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
10fd0 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64  -journal } 1.  d
10fe0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
10ff0 2e 24 74 6e 2e 31 35 20 7b 0a 20 20 20 20 73 71  .$tn.15 {.    sq
11000 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45  l2 { BEGIN; INSE
11010 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
11020 53 28 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20  S('e', 'f'); }. 
11030 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
11040 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 36  pager1-28.$tn.16
11050 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41   { sql1 { PRAGMA
11060 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
11070 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74  DELETE } } delet
11080 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  e.  do_test page
11090 72 31 2d 32 38 2e 24 74 6e 2e 31 37 20 7b 20 66  r1-28.$tn.17 { f
110a0 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
110b0 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a  db-journal } 1..
110c0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
110d0 2d 32 38 2e 24 74 6e 2e 31 37 20 7b 20 63 73 71  -28.$tn.17 { csq
110e0 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20  l2 { COMMIT } } 
110f0 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
11100 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
11110 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e  st pager1-28-$tn
11120 2e 31 38 20 7b 20 63 6f 64 65 31 20 7b 20 72 65  .18 { code1 { re
11130 61 64 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20  ad $channel } } 
11140 63 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  c.  do_test page
11150 72 31 2d 32 38 2d 24 74 6e 2e 31 39 20 7b 20 63  r1-28-$tn.19 { c
11160 6f 64 65 31 20 7b 20 63 6c 6f 73 65 20 24 63 68  ode1 { close $ch
11170 61 6e 6e 65 6c 20 7d 20 7d 20 7b 7d 0a 20 20 64  annel } } {}.  d
11180 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11190 2e 24 74 6e 2e 32 30 20 7b 20 73 71 6c 32 20 7b  .$tn.20 { sql2 {
111a0 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 7d   COMMIT } } {}.}
111b0 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
111c0 2d 32 39 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  -29.1 {.  faults
111d0 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
111e0 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
111f0 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
11200 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
11210 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
11220 63 75 75 6d 20 3d 20 66 75 6c 6c 3b 0a 20 20 20  cuum = full;.   
11230 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
11240 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 3b 0a  mode=exclusive;.
11250 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
11260 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
11270 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11280 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a  LUES(1, 2);.  }.
11290 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
112a0 2e 64 62 0a 7d 20 5b 65 78 70 72 20 31 30 32 34  .db.} [expr 1024
112b0 2a 33 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  *3].do_test page
112c0 72 31 2d 32 39 2e 32 20 7b 0a 20 20 65 78 65 63  r1-29.2 {.  exec
112d0 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
112e0 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39   page_size = 409
112f0 36 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20  6;.    VACUUM;. 
11300 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
11310 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 34  est.db.} [expr 4
11320 30 39 36 2a 33 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  096*3]..#-------
11330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11370 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  --.# Test that i
11380 66 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62  f an empty datab
11390 61 73 65 20 66 69 6c 65 20 28 73 69 7a 65 20 30  ase file (size 0
113a0 20 62 79 74 65 73 29 20 69 73 20 6f 70 65 6e 65   bytes) is opene
113b0 64 20 69 6e 20 0a 23 20 65 78 63 6c 75 73 69 76  d in .# exclusiv
113c0 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
113d0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
113e0 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   is deleted from
113f0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
11400 0a 23 20 77 69 74 68 6f 75 74 20 62 65 69 6e 67  .# without being
11410 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 41 6e   rolled back. An
11420 64 20 74 68 61 74 20 74 68 65 20 52 45 53 45 52  d that the RESER
11430 56 45 44 20 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  VED lock obtaine
11440 64 20 77 68 69 6c 65 0a 23 20 64 6f 69 6e 67 20  d while.# doing 
11450 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 6c 65  this is not rele
11460 61 73 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ased..#.do_test 
11470 70 61 67 65 72 31 2d 33 30 2e 31 20 7b 0a 20 20  pager1-30.1 {.  
11480 64 62 20 63 6c 6f 73 65 0a 20 20 64 65 6c 65 74  db close.  delet
11490 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 0a 20  e_file test.db. 
114a0 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73   delete_file tes
114b0 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73  t.db-journal.  s
114c0 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74  et fd [open test
114d0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20  .db-journal w]. 
114e0 20 73 65 65 6b 20 24 66 64 20 5b 65 78 70 72 20   seek $fd [expr 
114f0 35 31 32 2b 31 30 33 32 2a 32 5d 0a 20 20 70 75  512+1032*2].  pu
11500 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66  ts -nonewline $f
11510 64 20 78 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  d x.  close $fd.
11520 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
11530 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
11540 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  {.    PRAGMA loc
11550 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
11560 49 56 45 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  IVE;.    SELECT 
11570 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
11580 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20  lite_master;.   
11590 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
115a0 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c  tus;.  }.} {excl
115b0 75 73 69 76 65 20 30 20 6d 61 69 6e 20 72 65 73  usive 0 main res
115c0 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73 65  erved temp close
115d0 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  d}..#-----------
115e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
11620 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
11630 65 20 22 70 61 67 65 2d 73 69 7a 65 22 20 66 69  e "page-size" fi
11640 65 6c 64 20 69 6e 20 61 20 6a 6f 75 72 6e 61 6c  eld in a journal
11650 2d 68 65 61 64 65 72 20 69 73 20 30 2c 20 74 68  -header is 0, th
11660 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 66 69 6c 65  e journal.# file
11670 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 72 6f   can still be ro
11680 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
11690 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
116a0 62 61 63 6b 77 61 72 64 20 63 6f 6d 70 61 74 69  backward compati
116b0 62 69 6c 69 74 79 20 2d 0a 23 20 76 65 72 73 69  bility -.# versi
116c0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
116d0 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 61 6c 77  ior to 3.5.8 alw
116e0 61 79 73 20 73 65 74 20 74 68 69 73 20 66 69 65  ays set this fie
116f0 6c 64 20 74 6f 20 7a 65 72 6f 2e 0a 23 0a 69 66  ld to zero..#.if
11700 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   {$tcl_platform(
11710 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78  platform)=="unix
11720 22 7d 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67  "} {.do_test pag
11730 65 72 31 2d 33 31 2e 31 20 7b 0a 20 20 66 61 75  er1-31.1 {.  fau
11740 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
11750 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
11760 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
11770 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
11780 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
11790 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
117a0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
117b0 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
117c0 20 79 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   y));.    INSERT
117d0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
117e0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
117f0 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
11800 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
11810 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
11820 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
11830 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11840 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
11850 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
11860 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
11870 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11880 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
11890 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
118a0 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
118b0 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
118c0 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
118d0 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
118e0 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
118f0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11900 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
11910 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
11920 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11930 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
11940 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11950 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
11960 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
11970 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
11980 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
11990 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
119a0 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
119b0 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
119c0 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
119d0 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
119e0 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
119f0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11a00 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
11a10 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11a20 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
11a30 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
11a40 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
11a50 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
11a60 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11a70 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
11a80 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
11a90 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
11aa0 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11ab0 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
11ac0 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
11ad0 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
11ae0 79 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  y = randomblob(1
11af0 34 39 39 29 3b 0a 20 20 7d 0a 20 20 63 6f 70 79  499);.  }.  copy
11b00 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 20 74 65  _file test.db te
11b10 73 74 2e 64 62 32 0a 20 20 63 6f 70 79 5f 66 69  st.db2.  copy_fi
11b20 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  le test.db-journ
11b30 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72  al test.db2-jour
11b40 6e 61 6c 0a 20 20 0a 20 20 68 65 78 69 6f 5f 77  nal.  .  hexio_w
11b50 72 69 74 65 20 74 65 73 74 2e 64 62 32 2d 6a 6f  rite test.db2-jo
11b60 75 72 6e 61 6c 20 32 34 20 30 30 30 30 30 30 30  urnal 24 0000000
11b70 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  0.  sqlite3 db2 
11b80 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73  test.db2.  execs
11b90 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  ql { PRAGMA inte
11ba0 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62  grity_check } db
11bb0 32 0a 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 23 2d 2d 2d  2.} {ok}.}..#---
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c00 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
11c10 61 74 20 61 20 64 61 74 61 62 61 73 65 20 66 69  at a database fi
11c20 6c 65 20 63 61 6e 20 62 65 20 22 70 72 65 2d 68  le can be "pre-h
11c30 69 6e 74 65 64 22 20 74 6f 20 61 20 63 65 72 74  inted" to a cert
11c40 61 69 6e 20 73 69 7a 65 20 61 6e 64 20 74 68 61  ain size and tha
11c50 74 0a 23 20 73 75 62 73 65 71 75 65 6e 74 20 73  t.# subsequent s
11c60 70 69 6c 6c 69 6e 67 20 6f 66 20 74 68 65 20 70  pilling of the p
11c70 61 67 65 72 20 63 61 63 68 65 20 64 6f 65 73 20  ager cache does 
11c80 6e 6f 74 20 72 65 73 75 6c 74 20 69 6e 20 74 68  not result in th
11c90 65 20 64 61 74 61 62 61 73 65 0a 23 20 66 69 6c  e database.# fil
11ca0 65 20 62 65 69 6e 67 20 73 68 72 75 6e 6b 2e 0a  e being shrunk..
11cb0 23 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73  #.catch {db clos
11cc0 65 7d 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  e}.forcedelete t
11cd0 65 73 74 2e 64 62 0a 0a 64 6f 5f 74 65 73 74 20  est.db..do_test 
11ce0 70 61 67 65 72 31 2d 33 32 2e 31 20 7b 0a 20 20  pager1-32.1 {.  
11cf0 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
11d00 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
11d10 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
11d20 74 31 28 78 2c 20 79 29 3b 0a 20 20 7d 0a 20 20  t1(x, y);.  }.  
11d30 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  db close.  sqlit
11d40 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
11d50 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
11d60 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
11d70 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
11d80 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
11d90 30 30 29 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  00));.  }.  file
11da0 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69  _control_chunksi
11db0 7a 65 5f 74 65 73 74 20 64 62 20 6d 61 69 6e 20  ze_test db main 
11dc0 31 30 32 34 0a 20 20 66 69 6c 65 5f 63 6f 6e 74  1024.  file_cont
11dd0 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73  rol_sizehint_tes
11de0 74 20 64 62 20 6d 61 69 6e 20 32 30 39 37 31 35  t db main 209715
11df0 32 30 3b 20 23 20 32 30 4d 42 0a 20 20 65 78 65  20; # 20MB.  exe
11e00 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
11e10 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
11e20 30 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  0;.    INSERT IN
11e30 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
11e40 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30  randomblob(10000
11e50 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
11e60 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
11e70 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
11e80 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
11e90 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78  INTO t1 SELECT x
11ea0 2b 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  +2, randomblob(1
11eb0 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20  0000) from t1;. 
11ec0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11ed0 31 20 53 45 4c 45 43 54 20 78 2b 34 2c 20 72 61  1 SELECT x+4, ra
11ee0 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20  ndomblob(10000) 
11ef0 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53  from t1;.    INS
11f00 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11f10 43 54 20 78 2b 38 2c 20 72 61 6e 64 6f 6d 62 6c  CT x+8, randombl
11f20 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74  ob(10000) from t
11f30 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
11f40 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 31  TO t1 SELECT x+1
11f50 36 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  6, randomblob(10
11f60 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20  000) from t1;.  
11f70 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
11f80 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43  ) FROM t1;.    C
11f90 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20  OMMIT;.  }.  db 
11fa0 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 73 69 7a  close.  file siz
11fb0 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 32 30 39  e test.db.} {209
11fc0 37 31 35 32 30 7d 0a 0a 23 20 43 6c 65 61 6e 75  71520}..# Cleanu
11fd0 70 20 32 30 4d 42 20 66 69 6c 65 20 6c 65 66 74  p 20MB file left
11fe0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
11ff0 20 74 65 73 74 2e 0a 66 6f 72 63 65 64 65 6c 65   test..forcedele
12000 74 65 20 74 65 73 74 2e 64 62 0a 0a 66 69 6e 69  te test.db..fini
12010 73 68 5f 74 65 73 74 0a                          sh_test.