/ Hex Artifact Content
Login

Artifact eb6d64d2e148dc4bfc6420605bee3717e2d5f10c:


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 2e 31 20 7b 0a 20 20 65 78 65 63  -18.3.1 {.  exec
d190: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
d1a0: 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20   TABLE t2(x);.  
d1b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
d1c0: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
d1d0: 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73  (5000));.  }.  s
d1e0: 65 74 20 70 67 6e 6f 20 5b 65 78 70 72 20 28 5b  et pgno [expr ([
d1f0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
d200: 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20 20  b] / 1024)-2].  
d210: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
d220: 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f  .db [expr ($pgno
d230: 2d 31 29 2a 31 30 32 34 5d 20 30 30 30 30 30 30  -1)*1024] 000000
d240: 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  00.  sqlite3 db2
d250: 20 74 65 73 74 2e 64 62 0a 20 20 23 20 65 76 65   test.db.  # eve
d260: 6e 20 74 68 6f 75 67 68 20 78 20 69 73 20 6d 61  n though x is ma
d270: 6c 66 6f 72 6d 65 64 2c 20 62 65 63 61 75 73 65  lformed, because
d280: 20 74 79 70 65 6f 66 28 29 20 64 6f 65 73 0a 20   typeof() does. 
d290: 20 23 20 6e 6f 74 20 6c 6f 61 64 20 74 68 65 20   # not load the 
d2a0: 63 6f 6e 74 65 6e 74 20 6f 66 20 78 2c 20 74 68  content of x, th
d2b0: 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 6e  e error is not n
d2c0: 6f 74 69 63 65 64 2e 0a 20 20 63 61 74 63 68 73  oticed..  catchs
d2d0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65  ql { SELECT type
d2e0: 6f 66 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20  of(x) FROM t2 } 
d2f0: 64 62 32 0a 7d 20 7b 30 20 74 65 78 74 7d 0a 64  db2.} {0 text}.d
d300: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38  o_test pager1-18
d310: 2e 33 2e 32 20 7b 0a 20 20 23 20 69 6e 20 74 68  .3.2 {.  # in th
d320: 69 73 20 63 61 73 65 2c 20 74 68 65 20 76 61 6c  is case, the val
d330: 75 65 20 6f 66 20 78 20 69 73 20 6c 6f 61 64 65  ue of x is loade
d340: 64 20 61 6e 64 20 73 6f 20 74 68 65 20 65 72 72  d and so the err
d350: 6f 72 20 69 73 0a 20 20 23 20 64 65 74 65 63 74  or is.  # detect
d360: 65 64 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  ed.  catchsql { 
d370: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 7c  SELECT length(x|
d380: 7c 27 27 29 20 46 52 4f 4d 20 74 32 20 7d 20 64  |'') FROM t2 } d
d390: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
d3a0: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
d3b0: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20  malformed}}.db2 
d3c0: 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61  close.do_test pa
d3d0: 67 65 72 31 2d 31 38 2e 33 2e 33 20 7b 0a 20 20  ger1-18.3.3 {.  
d3e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
d3f0: 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20  LETE FROM t2;.  
d400: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
d410: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
d420: 6f 62 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a 20  ob(5000));.  }. 
d430: 20 73 65 74 20 70 67 6e 6f 20 5b 65 78 70 72 20   set pgno [expr 
d440: 28 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74  ([file size test
d450: 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d 0a  .db] / 1024)-2].
d460: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
d470: 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67  st.db [expr ($pg
d480: 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30 30 30  no-1)*1024] 0000
d490: 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64  0000.  sqlite3 d
d4a0: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 23 20 65  b2 test.db.  # e
d4b0: 76 65 6e 20 74 68 6f 75 67 68 20 78 20 69 73 20  ven though x is 
d4c0: 6d 61 6c 66 6f 72 6d 65 64 2c 20 62 65 63 61 75  malformed, becau
d4d0: 73 65 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20  se length() and 
d4e0: 74 79 70 65 6f 66 28 29 20 64 6f 0a 20 20 23 20  typeof() do.  # 
d4f0: 6e 6f 74 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e  not load the con
d500: 74 65 6e 74 20 6f 66 20 78 2c 20 74 68 65 20 65  tent of x, the e
d510: 72 72 6f 72 20 69 73 20 6e 6f 74 20 6e 6f 74 69  rror is not noti
d520: 63 65 64 2e 0a 20 20 63 61 74 63 68 73 71 6c 20  ced..  catchsql 
d530: 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28  { SELECT length(
d540: 78 29 2c 20 74 79 70 65 6f 66 28 78 29 20 46 52  x), typeof(x) FR
d550: 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 30  OM t2 } db2.} {0
d560: 20 7b 35 30 30 30 20 62 6c 6f 62 7d 7d 0a 64 6f   {5000 blob}}.do
d570: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e  _test pager1-18.
d580: 33 2e 34 20 7b 0a 20 20 23 20 69 6e 20 74 68 69  3.4 {.  # in thi
d590: 73 20 63 61 73 65 2c 20 74 68 65 20 76 61 6c 75  s case, the valu
d5a0: 65 20 6f 66 20 78 20 69 73 20 6c 6f 61 64 65 64  e of x is loaded
d5b0: 20 61 6e 64 20 73 6f 20 74 68 65 20 65 72 72 6f   and so the erro
d5c0: 72 20 69 73 0a 20 20 23 20 64 65 74 65 63 74 65  r is.  # detecte
d5d0: 64 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  d.  catchsql { S
d5e0: 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 7c 7c  ELECT length(x||
d5f0: 27 27 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  '') FROM t2 } db
d600: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
d610: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
d620: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63  alformed}}.db2 c
d630: 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67  lose.do_test pag
d640: 65 72 31 2d 31 38 2e 34 20 7b 0a 20 20 68 65 78  er1-18.4 {.  hex
d650: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
d660: 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29   [expr ($pgno-1)
d670: 2a 31 30 32 34 5d 20 39 30 30 30 30 30 30 30 0a  *1024] 90000000.
d680: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
d690: 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c  st.db.  catchsql
d6a0: 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68   { SELECT length
d6b0: 28 78 7c 7c 27 27 29 20 46 52 4f 4d 20 74 32 20  (x||'') FROM t2 
d6c0: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
d6d0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
d6e0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64  is malformed}}.d
d6f0: 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  b2 close.do_test
d700: 20 70 61 67 65 72 31 2d 31 38 2e 35 20 7b 0a 20   pager1-18.5 {. 
d710: 20 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20   sqlite3 db "". 
d720: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
d730: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
d740: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
d750: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
d760: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 74  .    PRAGMA writ
d770: 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b  able_schema = 1;
d780: 0a 20 20 20 20 55 50 44 41 54 45 20 73 71 6c 69  .    UPDATE sqli
d790: 74 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72 6f  te_master SET ro
d7a0: 6f 74 70 61 67 65 3d 35 20 57 48 45 52 45 20 74  otpage=5 WHERE t
d7b0: 62 6c 5f 6e 61 6d 65 20 3d 20 27 74 31 27 3b 0a  bl_name = 't1';.
d7c0: 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61      PRAGMA writa
d7d0: 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 30 3b 0a  ble_schema = 0;.
d7e0: 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20      ALTER TABLE 
d7f0: 74 31 20 52 45 4e 41 4d 45 20 54 4f 20 78 31 3b  t1 RENAME TO x1;
d800: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
d810: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
d820: 78 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62  x1 }.} {1 {datab
d830: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d840: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
d850: 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20   close..do_test 
d860: 70 61 67 65 72 31 2d 31 38 2e 36 20 7b 0a 20 20  pager1-18.6 {.  
d870: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
d880: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
d890: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
d8a0: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
d8b0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
d8c0: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
d8d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
d8e0: 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45   t1(x);.    INSE
d8f0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
d900: 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29  S(a_string(800))
d910: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d920: 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74  O t1 VALUES(a_st
d930: 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 7d 0a  ring(800));.  }.
d940: 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20  .  set root [db 
d950: 6f 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74  one "SELECT root
d960: 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  page FROM sqlite
d970: 5f 6d 61 73 74 65 72 22 5d 0a 20 20 64 62 20 63  _master"].  db c
d980: 6c 6f 73 65 0a 0a 20 20 68 65 78 69 6f 5f 77 72  lose..  hexio_wr
d990: 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ite test.db [exp
d9a0: 72 20 28 24 72 6f 6f 74 2d 31 29 2a 31 30 32 34  r ($root-1)*1024
d9b0: 20 2b 20 38 5d 20 30 30 30 30 30 30 30 30 0a 20   + 8] 00000000. 
d9c0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
d9d0: 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  .db.  catchsql {
d9e0: 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78   SELECT length(x
d9f0: 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  ) FROM t1 }.} {1
da00: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
da10: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
da20: 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  ed}}.}..do_test 
da30: 70 61 67 65 72 31 2d 31 39 2e 31 20 7b 0a 20 20  pager1-19.1 {.  
da40: 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20 20  sqlite3 db "".  
da50: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
da60: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
da70: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
da80: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32   page_size = 512
da90: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  ;.    PRAGMA aut
daa0: 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20  o_vacuum = 1;.  
dab0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
dac0: 31 28 61 61 2c 20 61 62 2c 20 61 63 2c 20 61 64  1(aa, ab, ac, ad
dad0: 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c 20 61 68  , ae, af, ag, ah
dae0: 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c  , ai, aj, ak, al
daf0: 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20  , am, an,.      
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61                ba
db10: 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c 20 62 65  , bb, bc, bd, be
db20: 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c 20 62 69  , bf, bg, bh, bi
db30: 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d  , bj, bk, bl, bm
db40: 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , bn,.          
db50: 20 20 20 20 20 20 20 20 20 20 63 61 2c 20 63 62            ca, cb
db60: 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c 20 63 66  , cc, cd, ce, cf
db70: 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a  , cg, ch, ci, cj
db80: 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e  , ck, cl, cm, cn
db90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dba0: 20 20 20 20 20 20 64 61 2c 20 64 62 2c 20 64 63        da, db, dc
dbb0: 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c 20 64 67  , dd, de, df, dg
dbc0: 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b  , dh, di, dj, dk
dbd0: 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20  , dl, dm, dn,.  
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 20 65 61 2c 20 65 62 2c 20 65 63 2c 20 65 64    ea, eb, ec, ed
dc00: 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c 20 65 68  , ee, ef, eg, eh
dc10: 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c  , ei, ej, ek, el
dc20: 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20  , em, en,.      
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
dc40: 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c 20 66 65  , fb, fc, fd, fe
dc50: 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c 20 66 69  , ff, fg, fh, fi
dc60: 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d  , fj, fk, fl, fm
dc70: 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , fn,.          
dc80: 20 20 20 20 20 20 20 20 20 20 67 61 2c 20 67 62            ga, gb
dc90: 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c 20 67 66  , gc, gd, ge, gf
dca0: 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a  , gg, gh, gi, gj
dcb0: 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e  , gk, gl, gm, gn
dcc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dcd0: 20 20 20 20 20 20 68 61 2c 20 68 62 2c 20 68 63        ha, hb, hc
dce0: 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c 20 68 67  , hd, he, hf, hg
dcf0: 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b  , hh, hi, hj, hk
dd00: 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20  , hl, hm, hn,.  
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 69 61 2c 20 69 62 2c 20 69 63 2c 20 69 64    ia, ib, ic, id
dd30: 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c 20 69 68  , ie, if, ig, ih
dd40: 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c  , ii, ij, ik, il
dd50: 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20  , im, ix,.      
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 61                ja
dd70: 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65  , jb, jc, jd, je
dd80: 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69  , jf, jg, jh, ji
dd90: 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d  , jj, jk, jl, jm
dda0: 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , jn,.          
ddb0: 20 20 20 20 20 20 20 20 20 20 6b 61 2c 20 6b 62            ka, kb
ddc0: 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66  , kc, kd, ke, kf
ddd0: 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a  , kg, kh, ki, kj
dde0: 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e  , kk, kl, km, kn
ddf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
de00: 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63        la, lb, lc
de10: 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67  , ld, le, lf, lg
de20: 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b  , lh, li, lj, lk
de30: 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20  , ll, lm, ln,.  
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64    ma, mb, mc, md
de60: 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68  , me, mf, mg, mh
de70: 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c  , mi, mj, mk, ml
de80: 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a  , mm, mn.    );.
de90: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
dea0: 20 74 32 28 61 61 2c 20 61 62 2c 20 61 63 2c 20   t2(aa, ab, ac, 
deb0: 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c 20  ad, ae, af, ag, 
dec0: 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20  ah, ai, aj, ak, 
ded0: 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20  al, am, an,.    
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
def0: 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c 20  ba, bb, bc, bd, 
df00: 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c 20  be, bf, bg, bh, 
df10: 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20  bi, bj, bk, bl, 
df20: 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20 20  bm, bn,.        
df30: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 2c 20              ca, 
df40: 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c 20  cb, cc, cd, ce, 
df50: 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c 20  cf, cg, ch, ci, 
df60: 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20  cj, ck, cl, cm, 
df70: 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  cn,.            
df80: 20 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c 20          da, db, 
df90: 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c 20  dc, dd, de, df, 
dfa0: 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20  dg, dh, di, dj, 
dfb0: 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a  dk, dl, dm, dn,.
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c 20      ea, eb, ec, 
dfe0: 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c 20  ed, ee, ef, eg, 
dff0: 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20  eh, ei, ej, ek, 
e000: 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20  el, em, en,.    
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c 20  fa, fb, fc, fd, 
e030: 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c 20  fe, ff, fg, fh, 
e040: 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20  fi, fj, fk, fl, 
e050: 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20 20  fm, fn,.        
e060: 20 20 20 20 20 20 20 20 20 20 20 20 67 61 2c 20              ga, 
e070: 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c 20  gb, gc, gd, ge, 
e080: 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c 20  gf, gg, gh, gi, 
e090: 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20  gj, gk, gl, gm, 
e0a0: 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gn,.            
e0b0: 20 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c 20          ha, hb, 
e0c0: 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c 20  hc, hd, he, hf, 
e0d0: 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20  hg, hh, hi, hj, 
e0e0: 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a  hk, hl, hm, hn,.
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c 20      ia, ib, ic, 
e110: 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c 20  id, ie, if, ig, 
e120: 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20  ih, ii, ij, ik, 
e130: 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20  il, im, ix,.    
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20  ja, jb, jc, jd, 
e160: 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20  je, jf, jg, jh, 
e170: 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20  ji, jj, jk, jl, 
e180: 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20  jm, jn,.        
e190: 20 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c 20              ka, 
e1a0: 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20  kb, kc, kd, ke, 
e1b0: 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20  kf, kg, kh, ki, 
e1c0: 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20  kj, kk, kl, km, 
e1d0: 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  kn,.            
e1e0: 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20          la, lb, 
e1f0: 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20  lc, ld, le, lf, 
e200: 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20  lg, lh, li, lj, 
e210: 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a  lk, ll, lm, ln,.
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20      ma, mb, mc, 
e240: 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20  md, me, mf, mg, 
e250: 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20  mh, mi, mj, mk, 
e260: 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29  ml, mm, mn.    )
e270: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
e280: 4f 20 74 31 28 61 61 29 20 56 41 4c 55 45 53 28  O t1(aa) VALUES(
e290: 20 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30 30   a_string(100000
e2a0: 29 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ) );.    INSERT 
e2b0: 49 4e 54 4f 20 74 32 28 61 61 29 20 56 41 4c 55  INTO t2(aa) VALU
e2c0: 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30 30  ES( a_string(100
e2d0: 30 30 30 29 20 29 3b 0a 20 20 20 20 56 41 43 55  000) );.    VACU
e2e0: 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d  UM;.  }.} {}..#-
e2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e330: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
e340: 61 20 63 6f 75 70 6c 65 20 6f 66 20 73 70 65 63  a couple of spec
e350: 69 61 6c 20 63 61 73 65 73 20 74 68 61 74 20 63  ial cases that c
e360: 6f 6d 65 20 75 70 20 77 68 69 6c 65 20 63 6f 6d  ome up while com
e370: 6d 69 74 74 69 6e 67 20 0a 23 20 74 72 61 6e 73  mitting .# trans
e380: 61 63 74 69 6f 6e 73 3a 0a 23 0a 23 20 20 20 70  actions:.#.#   p
e390: 61 67 65 72 31 2d 32 30 2e 31 2e 2a 3a 20 43 6f  ager1-20.1.*: Co
e3a0: 6d 6d 69 74 74 69 6e 67 20 61 6e 20 69 6e 2d 6d  mmitting an in-m
e3b0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
e3c0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 68 65 6e 20  ransaction when 
e3d0: 74 68 65 20 0a 23 20 20 20 20 20 20 20 20 20 20  the .#          
e3e0: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
e3f0: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f   has not been mo
e400: 64 69 66 69 65 64 20 61 74 20 61 6c 6c 2e 0a 23  dified at all..#
e410: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e 32  .#   pager1-20.2
e420: 2e 2a 3a 20 41 73 20 61 62 6f 76 65 2c 20 62 75  .*: As above, bu
e430: 74 20 77 69 74 68 20 61 20 6e 6f 72 6d 61 6c 20  t with a normal 
e440: 64 62 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  db in exclusive-
e450: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 23 0a  locking mode..#.
e460: 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e 33 2e  #   pager1-20.3.
e470: 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61 20  *: Committing a 
e480: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 57  transaction in W
e490: 41 4c 20 6d 6f 64 65 20 77 68 65 72 65 20 74 68  AL mode where th
e4a0: 65 20 64 61 74 61 62 61 73 65 20 68 61 73 0a 23  e database has.#
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c    been modified,
e4d0: 20 62 75 74 20 61 6c 6c 20 64 69 72 74 79 20 70   but all dirty p
e4e0: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 66  ages have been f
e4f0: 6c 75 73 68 65 64 20 74 6f 20 0a 23 20 20 20 20  lushed to .#    
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
e510: 73 6b 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f  sk before the co
e520: 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  mmit..#.do_test 
e530: 70 61 67 65 72 31 2d 32 30 2e 31 2e 31 20 7b 0a  pager1-20.1.1 {.
e540: 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73    catch {db clos
e550: 65 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  e}.  sqlite3 db 
e560: 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78 65 63 73  :memory:.  execs
e570: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
e580: 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74  TABLE one(two, t
e590: 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53 45 52  hree);.    INSER
e5a0: 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45  T INTO one VALUE
e5b0: 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d  S('a', 'b');.  }
e5c0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
e5d0: 67 65 72 31 2d 32 30 2e 31 2e 32 20 7b 0a 20 20  ger1-20.1.2 {.  
e5e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
e5f0: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20  GIN EXCLUSIVE;. 
e600: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
e610: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67   {}..do_test pag
e620: 65 72 31 2d 32 30 2e 32 2e 31 20 7b 0a 20 20 66  er1-20.2.1 {.  f
e630: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
e640: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
e650: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
e660: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20   locking_mode = 
e670: 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 50  exclusive;.    P
e680: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
e690: 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20  de = persist;.  
e6a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f    CREATE TABLE o
e6b0: 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a  ne(two, three);.
e6c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e6d0: 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27 2c 20  one VALUES('a', 
e6e0: 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63  'b');.  }.} {exc
e6f0: 6c 75 73 69 76 65 20 70 65 72 73 69 73 74 7d 0a  lusive persist}.
e700: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
e710: 30 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  0.2.2 {.  execsq
e720: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45 58  l {.    BEGIN EX
e730: 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d  CLUSIVE;.    COM
e740: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69  MIT;.  }.} {}..i
e750: 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20  fcapable wal {. 
e760: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
e770: 32 30 2e 33 2e 31 20 7b 0a 20 20 20 20 66 61 75  20.3.1 {.    fau
e780: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
e790: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66  _reopen.    db f
e7a0: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
e7b0: 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71  tring.    execsq
e7c0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
e7d0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
e7e0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
e7f0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61  ournal_mode = wa
e800: 6c 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  l;.      BEGIN;.
e810: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
e820: 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
e830: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e840: 20 74 32 28 79 29 3b 0a 20 20 20 20 20 20 20 20   t2(y);.        
e850: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
e860: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38  ALUES(a_string(8
e870: 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  00));.        IN
e880: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
e890: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
e8a0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
e8b0: 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a 20 20 20     /*   2 */.   
e8c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
e8d0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
e8e0: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
e8f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34  ;         /*   4
e900: 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45   */.        INSE
e910: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
e920: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  T a_string(800) 
e930: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
e940: 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20 20   /*   8 */.     
e950: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e960: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
e970: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
e980: 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36 20 2a          /*  16 *
e990: 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  /.        INSERT
e9a0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
e9b0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
e9c0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
e9d0: 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 20 20 43  *  32 */.      C
e9e0: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  OMMIT;.    }.  }
e9f0: 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74   {wal}.  do_test
ea00: 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 32 20 7b   pager1-20.3.2 {
ea10: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
ea20: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
ea30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
ea40: 20 56 41 4c 55 45 53 28 27 78 78 78 78 27 29 3b   VALUES('xxxx');
ea50: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72  .    }.    recur
ea60: 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74  sive_select 32 t
ea70: 31 0a 20 20 20 20 65 78 65 63 73 71 6c 20 43 4f  1.    execsql CO
ea80: 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23  MMIT.  } {}.}..#
ea90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ead0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
eae0: 20 74 68 61 74 20 61 20 57 41 4c 20 64 61 74 61   that a WAL data
eaf0: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
eb00: 6f 70 65 6e 65 64 20 69 66 3a 0a 23 0a 23 20 20  opened if:.#.#  
eb10: 20 70 61 67 65 72 31 2d 32 31 2e 31 2e 2a 3a 20   pager1-21.1.*: 
eb20: 54 68 65 20 56 46 53 20 68 61 73 20 61 6e 20 69  The VFS has an i
eb30: 56 65 72 73 69 6f 6e 20 6c 65 73 73 20 74 68 61  Version less tha
eb40: 6e 20 32 2c 20 6f 72 0a 23 20 20 20 70 61 67 65  n 2, or.#   page
eb50: 72 31 2d 32 31 2e 32 2e 2a 3a 20 54 68 65 20 56  r1-21.2.*: The V
eb60: 46 53 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76  FS does not prov
eb70: 69 64 65 20 78 53 68 6d 58 58 58 28 29 20 6d 65  ide xShmXXX() me
eb80: 74 68 6f 64 73 2e 0a 23 0a 69 66 63 61 70 61 62  thods..#.ifcapab
eb90: 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 74 65  le wal {.  do_te
eba0: 73 74 20 70 61 67 65 72 31 2d 32 31 2e 30 20 7b  st pager1-21.0 {
ebb0: 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65  .    faultsim_de
ebc0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
ebd0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
ebe0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
ebf0: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
ec00: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
ec10: 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54 20 27  E ko(c DEFAULT '
ec20: 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c 54 20  abc', b DEFAULT 
ec30: 27 64 65 66 27 29 3b 0a 20 20 20 20 20 20 49 4e  'def');.      IN
ec40: 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46  SERT INTO ko DEF
ec50: 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20  AULT VALUES;.   
ec60: 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64   }.  } {wal}.  d
ec70: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 31  o_test pager1-21
ec80: 2e 31 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73  .1 {.    testvfs
ec90: 20 74 76 20 2d 6e 6f 73 68 6d 20 31 0a 20 20 20   tv -noshm 1.   
eca0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
ecb0: 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20 20  t.db -vfs tv.   
ecc0: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
ecd0: 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64  CT * FROM ko } d
ece0: 62 32 0a 20 20 7d 20 7b 31 20 7b 75 6e 61 62 6c  b2.  } {1 {unabl
ecf0: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
ed00: 73 65 20 66 69 6c 65 7d 7d 0a 20 20 64 62 32 20  se file}}.  db2 
ed10: 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74  close.  tv delet
ed20: 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  e.  do_test page
ed30: 72 31 2d 32 31 2e 32 20 7b 0a 20 20 20 20 74 65  r1-21.2 {.    te
ed40: 73 74 76 66 73 20 74 76 20 2d 69 76 65 72 73 69  stvfs tv -iversi
ed50: 6f 6e 20 31 0a 20 20 20 20 73 71 6c 69 74 65 33  on 1.    sqlite3
ed60: 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76 66   db2 test.db -vf
ed70: 73 20 74 76 0a 20 20 20 20 63 61 74 63 68 73 71  s tv.    catchsq
ed80: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
ed90: 4d 20 6b 6f 20 7d 20 64 62 32 0a 20 20 7d 20 7b  M ko } db2.  } {
eda0: 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  1 {unable to ope
edb0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d  n database file}
edc0: 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20  }.  db2 close.  
edd0: 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d  tv delete.}..#--
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 2d  ----------------
ee10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee20: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
ee30: 68 61 74 20 61 20 22 50 52 41 47 4d 41 20 77 61  hat a "PRAGMA wa
ee40: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 3a 0a 23  l_checkpoint":.#
ee50: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32 2e 31  .#   pager1-22.1
ee60: 2e 2a 3a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f  .*: is a no-op o
ee70: 6e 20 61 20 6e 6f 6e 2d 57 41 4c 20 64 62 2c 20  n a non-WAL db, 
ee80: 61 6e 64 0a 23 20 20 20 70 61 67 65 72 31 2d 32  and.#   pager1-2
ee90: 32 2e 32 2e 2a 3a 20 64 6f 65 73 20 6e 6f 74 20  2.2.*: does not 
eea0: 63 61 75 73 65 20 78 53 79 6e 63 20 63 61 6c 6c  cause xSync call
eeb0: 73 20 77 69 74 68 20 61 20 73 79 6e 63 68 72 6f  s with a synchro
eec0: 6e 6f 75 73 3d 6f 66 66 20 64 62 2e 0a 23 0a 69  nous=off db..#.i
eed0: 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20  fcapable wal {. 
eee0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
eef0: 32 32 2e 31 2e 31 20 7b 0a 20 20 20 20 66 61 75  22.1.1 {.    fau
ef00: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
ef10: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 65 78 65 63  _reopen.    exec
ef20: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
ef30: 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20 44 45  TE TABLE ko(c DE
ef40: 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62 20 44  FAULT 'abc', b D
ef50: 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b 0a 20  EFAULT 'def');. 
ef60: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
ef70: 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55   ko DEFAULT VALU
ef80: 45 53 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  ES;.    }.    ex
ef90: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
efa0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
efb0: 20 20 7d 20 7b 30 20 2d 31 20 2d 31 7d 0a 20 20    } {0 -1 -1}.  
efc0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
efd0: 32 2e 32 2e 31 20 7b 0a 20 20 20 20 74 65 73 74  2.2.1 {.    test
efe0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
eff0: 31 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20  1.    tv filter 
f000: 78 53 79 6e 63 0a 20 20 20 20 74 76 20 73 63 72  xSync.    tv scr
f010: 69 70 74 20 78 53 79 6e 63 43 62 0a 20 20 20 20  ipt xSyncCb.    
f020: 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 61 72  proc xSyncCb {ar
f030: 67 73 7d 20 7b 69 6e 63 72 20 3a 3a 73 79 6e 63  gs} {incr ::sync
f040: 63 6f 75 6e 74 7d 0a 20 20 20 20 73 65 74 20 3a  count}.    set :
f050: 3a 73 79 6e 63 63 6f 75 6e 74 20 30 0a 20 20 20  :synccount 0.   
f060: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
f070: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
f080: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 73  {.      PRAGMA s
f090: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6f 66 66  ynchronous = off
f0a0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
f0b0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
f0c0: 4c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  L;.      INSERT 
f0d0: 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20  INTO ko DEFAULT 
f0e0: 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20 20  VALUES;.    }.  
f0f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
f100: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
f110: 74 20 7d 0a 20 20 20 20 73 65 74 20 73 79 6e 63  t }.    set sync
f120: 63 6f 75 6e 74 0a 20 20 7d 20 7b 30 7d 0a 20 20  count.  } {0}.  
f130: 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65  db close.  tv de
f140: 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lete.}..#-------
f150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f190: 2d 2d 0a 23 20 54 65 73 74 73 20 66 6f 72 20 63  --.# Tests for c
f1a0: 68 61 6e 67 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  hanging journal 
f1b0: 6d 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61 67 65  mode..#.#   page
f1c0: 72 31 2d 32 33 2e 31 2e 2a 3a 20 54 65 73 74 20  r1-23.1.*: Test 
f1d0: 74 68 61 74 20 77 68 65 6e 20 63 68 61 6e 67 69  that when changi
f1e0: 6e 67 20 66 72 6f 6d 20 50 45 52 53 49 53 54 20  ng from PERSIST 
f1f0: 74 6f 20 44 45 4c 45 54 45 20 6d 6f 64 65 2c 0a  to DELETE mode,.
f200: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
f210: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
f220: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ile is deleted..
f230: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e  #.#   pager1-23.
f240: 32 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61  2.*: Same test a
f250: 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77 68 69  s above, but whi
f260: 6c 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  le a shared lock
f270: 20 69 73 20 68 65 6c 64 0a 23 20 20 20 20 20 20   is held.#      
f280: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20 74              on t
f290: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f2a0: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
f2b0: 33 2e 33 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74  3.3.*: Same test
f2c0: 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77   as above, but w
f2d0: 68 69 6c 65 20 61 20 72 65 73 65 72 76 65 64 20  hile a reserved 
f2e0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20  lock is held.#  
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f310: 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65  file..#.#   page
f320: 72 31 2d 32 33 2e 34 2e 2a 3a 20 41 6e 64 2c 20  r1-23.4.*: And, 
f330: 66 6f 72 20 66 75 6e 2c 20 77 68 69 6c 65 20 68  for fun, while h
f340: 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  olding an exclus
f350: 69 76 65 20 6c 6f 63 6b 2e 0a 23 0a 23 20 20 20  ive lock..#.#   
f360: 70 61 67 65 72 31 2d 32 33 2e 35 2e 2a 3a 20 54  pager1-23.5.*: T
f370: 72 79 20 74 6f 20 73 65 74 20 76 61 72 69 6f 75  ry to set variou
f380: 73 20 64 69 66 66 65 72 65 6e 74 20 6a 6f 75 72  s different jour
f390: 6e 61 6c 20 6d 6f 64 65 73 20 77 69 74 68 20 61  nal modes with a
f3a0: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
f3b0: 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 64       in-memory d
f3c0: 61 74 61 62 61 73 65 20 28 6f 6e 6c 79 20 4d 45  atabase (only ME
f3d0: 4d 4f 52 59 20 61 6e 64 20 4f 46 46 20 73 68 6f  MORY and OFF sho
f3e0: 75 6c 64 20 77 6f 72 6b 29 2e 0a 23 0a 23 20 20  uld work)..#.#  
f3f0: 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 2a 3a 20   pager1-23.6.*: 
f400: 54 72 79 20 74 6f 20 73 65 74 20 6c 6f 63 6b 69  Try to set locki
f410: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 6f  ng_mode=normal o
f420: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
f430: 61 74 61 62 61 73 65 0a 23 20 20 20 20 20 20 20  atabase.#       
f440: 20 20 20 20 20 20 20 20 20 20 20 28 64 6f 65 73             (does
f450: 6e 27 74 20 77 6f 72 6b 20 2d 20 69 6e 2d 6d 65  n't work - in-me
f460: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 20 61  mory databases a
f470: 6c 77 61 79 73 20 75 73 65 0a 23 20 20 20 20 20  lways use.#     
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63               loc
f490: 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
f4a0: 69 76 65 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ive)..#.do_test 
f4b0: 70 61 67 65 72 31 2d 32 33 2e 31 2e 31 20 7b 0a  pager1-23.1.1 {.
f4c0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
f4d0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
f4e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
f4f0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f500: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
f510: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
f520: 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 66 69 6c  a, b);.  }.  fil
f530: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
f540: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64  -journal.} {1}.d
f550: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f560: 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
f570: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f580: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
f590: 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20  }.  file exists 
f5a0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
f5b0: 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  } {0}..do_test p
f5c0: 61 67 65 72 31 2d 32 33 2e 32 2e 31 20 7b 0a 20  ager1-23.2.1 {. 
f5d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
f5e0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f5f0: 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
f600: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
f610: 20 56 41 4c 55 45 53 28 27 43 61 6e 62 65 72 72   VALUES('Canberr
f620: 61 27 2c 20 27 41 43 54 27 29 3b 0a 20 20 7d 0a  a', 'ACT');.  }.
f630: 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45    db eval { SELE
f640: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b  CT * FROM t1 } {
f650: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 50  .    db eval { P
f660: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f670: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20  de = DELETE }.  
f680: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  }.  execsql { PR
f690: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f6a0: 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64  e }.} {delete}.d
f6b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f6c0: 2e 32 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65 78  .2.2 {.  file ex
f6d0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
f6e0: 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74  rnal.} {0}..do_t
f6f0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e  est pager1-23.3.
f700: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
f710: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
f720: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
f730: 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  T;.    INSERT IN
f740: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 44 61  TO t1 VALUES('Da
f750: 72 77 69 6e 27 2c 20 27 4e 54 27 29 3b 0a 20 20  rwin', 'NT');.  
f760: 20 20 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54    BEGIN IMMEDIAT
f770: 45 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c  E;.  }.  db eval
f780: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f790: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
f7a0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  }.  execsql { PR
f7b0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f7c0: 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64  e }.} {delete}.d
f7d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f7e0: 2e 33 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65 78  .3.2 {.  file ex
f7f0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
f800: 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  rnal.} {0}.do_te
f810: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 33  st pager1-23.3.3
f820: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   {.  execsql COM
f830: 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  MIT.} {}..do_tes
f840: 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 31 20  t pager1-23.4.1 
f850: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
f860: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
f870: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
f880: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
f890: 20 74 31 20 56 41 4c 55 45 53 28 27 41 64 65 6c   t1 VALUES('Adel
f8a0: 61 69 64 65 27 2c 20 27 53 41 27 29 3b 0a 20 20  aide', 'SA');.  
f8b0: 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56    BEGIN EXCLUSIV
f8c0: 45 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c  E;.  }.  db eval
f8d0: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f8e0: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
f8f0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  }.  execsql { PR
f900: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f910: 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64  e }.} {delete}.d
f920: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f930: 2e 34 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65 78  .4.2 {.  file ex
f940: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
f950: 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  rnal.} {0}.do_te
f960: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 33  st pager1-23.4.3
f970: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   {.  execsql COM
f980: 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  MIT.} {}..do_tes
f990: 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 31 20  t pager1-23.5.1 
f9a0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
f9b0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
f9c0: 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d   sqlite3 db :mem
f9d0: 6f 72 79 3a 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63  ory:.} {}.foreac
f9e0: 68 20 7b 74 6e 20 6d 6f 64 65 20 70 6f 73 73 69  h {tn mode possi
f9f0: 62 6c 65 7d 20 7b 0a 20 20 32 20 20 6f 66 66 20  ble} {.  2  off 
fa00: 20 20 20 20 20 31 0a 20 20 33 20 20 6d 65 6d 6f       1.  3  memo
fa10: 72 79 20 20 20 31 0a 20 20 34 20 20 70 65 72 73  ry   1.  4  pers
fa20: 69 73 74 20 20 30 0a 20 20 35 20 20 64 65 6c 65  ist  0.  5  dele
fa30: 74 65 20 20 20 30 0a 20 20 36 20 20 77 61 6c 20  te   0.  6  wal 
fa40: 20 20 20 20 20 30 0a 20 20 37 20 20 74 72 75 6e       0.  7  trun
fa50: 63 61 74 65 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f  cate 0.} {.  do_
fa60: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35  test pager1-23.5
fa70: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78 65  .$tn.1 {.    exe
fa80: 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75  csql "PRAGMA jou
fa90: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 22  rnal_mode = off"
faa0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52  .    execsql "PR
fab0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
fac0: 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b  e = $mode".  } [
fad0: 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69  if $possible {li
fae0: 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20  st $mode} {list 
faf0: 6f 66 66 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20  off}].  do_test 
fb00: 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e  pager1-23.5.$tn.
fb10: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
fb20: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
fb30: 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 22 0a 20  mode = memory". 
fb40: 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47     execsql "PRAG
fb50: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
fb60: 3d 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66  = $mode".  } [if
fb70: 20 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74   $possible {list
fb80: 20 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6d 65   $mode} {list me
fb90: 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f 74 65 73 74  mory}].}.do_test
fba0: 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 31 20 7b   pager1-23.6.1 {
fbb0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47  .  execsql {PRAG
fbc0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
fbd0: 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d 20 7b 65 78 63  = normal}.} {exc
fbe0: 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20  lusive}.do_test 
fbf0: 70 61 67 65 72 31 2d 32 33 2e 36 2e 32 20 7b 0a  pager1-23.6.2 {.
fc00: 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d    execsql {PRAGM
fc10: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
fc20: 20 65 78 63 6c 75 73 69 76 65 7d 0a 7d 20 7b 65   exclusive}.} {e
fc30: 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73  xclusive}.do_tes
fc40: 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 33 20  t pager1-23.6.3 
fc50: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41  {.  execsql {PRA
fc60: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
fc70: 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a  }.} {exclusive}.
fc80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
fc90: 33 2e 36 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  3.6.4 {.  execsq
fca0: 6c 20 7b 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6c  l {PRAGMA main.l
fcb0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b  ocking_mode}.} {
fcc0: 65 78 63 6c 75 73 69 76 65 7d 0a 0a 23 2d 2d 2d  exclusive}..#---
fcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd10: 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74  ------.#.do_test
fd20: 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 31 20 7b   pager1-24.1.1 {
fd30: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
fd40: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
fd50: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
fd60: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
fd70: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
fd80: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
fd90: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  ;.    PRAGMA aut
fda0: 6f 5f 76 61 63 75 75 6d 20 3d 20 46 55 4c 4c 3b  o_vacuum = FULL;
fdb0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
fdc0: 45 20 78 31 28 78 2c 20 79 2c 20 7a 2c 20 50 52  E x1(x, y, z, PR
fdd0: 49 4d 41 52 59 20 4b 45 59 28 79 2c 20 7a 29 29  IMARY KEY(y, z))
fde0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
fdf0: 4c 45 20 78 32 28 78 2c 20 79 2c 20 7a 2c 20 50  LE x2(x, y, z, P
fe00: 52 49 4d 41 52 59 20 4b 45 59 28 79 2c 20 7a 29  RIMARY KEY(y, z)
fe10: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
fe20: 54 4f 20 78 32 20 56 41 4c 55 45 53 28 61 5f 73  TO x2 VALUES(a_s
fe30: 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74  tring(400), a_st
fe40: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
fe50: 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20 20 49  ing(600));.    I
fe60: 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
fe70: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36 30  LECT a_string(60
fe80: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  0), a_string(400
fe90: 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ), a_string(500)
fea0: 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
feb0: 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
fec0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
fed0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
fee0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
fef0: 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
ff00: 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45  ERT INTO x2 SELE
ff10: 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  CT a_string(400)
ff20: 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  , a_string(500),
ff30: 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
ff40: 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45  ROM x2;.    INSE
ff50: 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43  RT INTO x2 SELEC
ff60: 54 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c  T a_string(600),
ff70: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20   a_string(400), 
ff80: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46 52  a_string(500) FR
ff90: 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52  OM x2;.    INSER
ffa0: 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54  T INTO x2 SELECT
ffb0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
ffc0: 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61  a_string(600), a
ffd0: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
ffe0: 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x2;.    INSERT
fff0: 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20   INTO x2 SELECT 
10000 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61  a_string(400), a
10010 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
10020 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10030 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x2;.    INSERT 
10040 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a  INTO x1 SELECT *
10050 20 46 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a 7d 20   FROM x2;.  }.} 
10060 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
10070 31 2d 32 34 2e 31 2e 32 20 7b 0a 20 20 65 78 65  1-24.1.2 {.  exe
10080 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
10090 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
100a0 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72 6f 77  ROM x1 WHERE row
100b0 69 64 3c 33 32 3b 0a 20 20 7d 0a 20 20 72 65 63  id<32;.  }.  rec
100c0 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34  ursive_select 64
100d0 20 78 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74   x2.} {}.do_test
100e0 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 33 20 7b   pager1-24.1.3 {
100f0 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
10100 20 20 20 20 55 50 44 41 54 45 20 78 31 20 53 45      UPDATE x1 SE
10110 54 20 7a 20 3d 20 61 5f 73 74 72 69 6e 67 28 33  T z = a_string(3
10120 30 30 29 20 57 48 45 52 45 20 72 6f 77 69 64 3e  00) WHERE rowid>
10130 34 30 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  40;.    COMMIT;.
10140 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
10150 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20  rity_check;.    
10160 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
10170 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM x1;.  }.} {
10180 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20  ok 33}..do_test 
10190 70 61 67 65 72 31 2d 32 34 2e 31 2e 34 20 7b 0a  pager1-24.1.4 {.
101a0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
101b0 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a  DELETE FROM x1;.
101c0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
101d0 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  x1 SELECT * FROM
101e0 20 78 32 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   x2;.    BEGIN;.
101f0 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
10200 4d 20 78 31 20 57 48 45 52 45 20 72 6f 77 69 64  M x1 WHERE rowid
10210 3c 33 32 3b 0a 20 20 20 20 20 20 55 50 44 41 54  <32;.      UPDAT
10220 45 20 78 31 20 53 45 54 20 7a 20 3d 20 61 5f 73  E x1 SET z = a_s
10230 74 72 69 6e 67 28 32 39 39 29 20 57 48 45 52 45  tring(299) WHERE
10240 20 72 6f 77 69 64 3e 34 30 3b 0a 20 20 7d 0a 20   rowid>40;.  }. 
10250 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63   recursive_selec
10260 74 20 36 34 20 78 32 20 7b 64 62 20 65 76 61 6c  t 64 x2 {db eval
10270 20 43 4f 4d 4d 49 54 7d 0a 20 20 65 78 65 63 73   COMMIT}.  execs
10280 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
10290 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
102a0 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
102b0 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20  t(*) FROM x1;.  
102c0 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f  }.} {ok 33}..do_
102d0 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
102e0 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
102f0 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
10300 20 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x1;.    INSERT 
10310 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a  INTO x1 SELECT *
10320 20 46 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a 20 20   FROM x2;.  }.  
10330 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
10340 20 36 34 20 78 32 20 7b 20 64 62 20 65 76 61 6c   64 x2 { db eval
10350 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 78   {CREATE TABLE x
10360 33 28 78 2c 20 79 2c 20 7a 29 7d 20 7d 0a 20 20  3(x, y, z)} }.  
10370 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
10380 20 2a 20 46 52 4f 4d 20 78 33 20 7d 0a 7d 20 7b   * FROM x3 }.} {
10390 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
103a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a  -------------.#.
103e0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
103f0 35 2d 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  5-1 {.  faultsim
10400 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
10410 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
10420 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
10430 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20  SAVEPOINT abc;. 
10440 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
10450 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
10460 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
10470 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  abc;.    COMMIT;
10480 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
10490 7d 20 7b 7d 0a 62 72 65 61 6b 70 6f 69 6e 74 0a  } {}.breakpoint.
104a0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
104b0 35 2d 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  5-2 {.  faultsim
104c0 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
104d0 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
104e0 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62 63     SAVEPOINT abc
104f0 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
10500 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
10510 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61     ROLLBACK TO a
10520 62 63 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  bc;.    COMMIT;.
10530 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d    }.  db close.}
10540 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
10550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10590 23 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 74 65  # Sector-size te
105a0 73 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  sts..#.do_test p
105b0 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20 74  ager1-26.1 {.  t
105c0 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
105d0 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74 6f 72  lt 1.  tv sector
105e0 73 69 7a 65 20 34 30 39 36 0a 20 20 66 61 75 6c  size 4096.  faul
105f0 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
10600 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
10610 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
10620 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
10630 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
10640 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 43  ize = 512;.    C
10650 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c 28  REATE TABLE tbl(
10660 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
10670 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 42 45   UNIQUE);.    BE
10680 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
10690 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45  T INTO tbl VALUE
106a0 53 28 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  S(a_string(25), 
106b0 61 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a  a_string(600));.
106c0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
106d0 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
106e0 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
106f0 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
10700 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
10710 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
10720 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
10730 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10740 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45   tbl;.      INSE
10750 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
10760 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
10770 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
10780 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49  ROM tbl;.      I
10790 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
107a0 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
107b0 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
107c0 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
107d0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
107e0 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
107f0 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
10800 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
10810 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10820 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
10830 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
10840 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
10850 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
10860 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61  NTO tbl SELECT a
10870 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
10880 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
10890 74 62 6c 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  tbl;.    COMMIT;
108a0 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65  .  }.} {}.do_exe
108b0 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
108c0 2d 32 36 2e 31 20 7b 0a 20 20 55 50 44 41 54 45  -26.1 {.  UPDATE
108d0 20 74 62 6c 20 53 45 54 20 62 20 3d 20 61 5f 73   tbl SET b = a_s
108e0 74 72 69 6e 67 28 35 35 30 29 3b 0a 7d 20 7b 7d  tring(550);.} {}
108f0 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
10900 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete..#----------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10950 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
10960 2e 32 37 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  .27.1 {.  faults
10970 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
10980 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 5f 70  open.  sqlite3_p
10990 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 64  ager_refcounts d
109a0 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
109b0 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43    BEGIN;.      C
109c0 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
109d0 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , b);.  }.  sqli
109e0 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  te3_pager_refcou
109f0 6e 74 73 20 64 62 0a 20 20 65 78 65 63 73 71 6c  nts db.  execsql
10a00 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d   COMMIT.} {}..#-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a50 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
10a60 74 68 61 74 20 61 74 74 65 6d 70 74 69 6e 67 20  that attempting 
10a70 74 6f 20 6f 70 65 6e 20 61 20 77 72 69 74 65 2d  to open a write-
10a80 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68  transaction with
10a90 20 0a 23 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   .# locking_mode
10aa0 3d 65 78 63 6c 75 73 69 76 65 20 69 6e 20 57 41  =exclusive in WA
10ab0 4c 20 6d 6f 64 65 20 66 61 69 6c 73 20 69 66 20  L mode fails if 
10ac0 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
10ad0 63 6c 69 65 6e 74 73 20 6f 6e 20 0a 23 20 74 68  clients on .# th
10ae0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
10af0 0a 23 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c  .#.catch { db cl
10b00 6f 73 65 20 7d 0a 69 66 63 61 70 61 62 6c 65 20  ose }.ifcapable 
10b10 77 61 6c 20 7b 0a 20 20 64 6f 5f 6d 75 6c 74 69  wal {.  do_multi
10b20 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b  client_test tn {
10b30 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
10b40 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a 20  er1-28.$tn.1 {. 
10b50 20 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20       sql1 { .   
10b60 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
10b70 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
10b80 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
10b90 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
10ba0 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
10bb0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27  TO t1 VALUES('a'
10bc0 2c 20 27 62 27 29 3b 0a 20 20 20 20 20 20 7d 0a  , 'b');.      }.
10bd0 20 20 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 20 20      } {wal}.    
10be0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10bf0 38 2e 24 74 6e 2e 32 20 7b 20 73 71 6c 32 20 7b  8.$tn.2 { sql2 {
10c00 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
10c10 31 20 7d 20 7d 20 7b 61 20 62 7d 0a 0a 20 20 20  1 } } {a b}..   
10c20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10c30 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20  28.$tn.3 { sql1 
10c40 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67  { PRAGMA locking
10c50 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
10c60 7d 20 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a  } } {exclusive}.
10c70 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
10c80 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 0a 20  r1-28.$tn.4 { . 
10c90 20 20 20 20 20 63 73 71 6c 31 20 7b 20 42 45 47       csql1 { BEG
10ca0 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  IN; INSERT INTO 
10cb0 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27  t1 VALUES('c', '
10cc0 64 27 29 3b 20 7d 0a 20 20 20 20 7d 20 7b 31 20  d'); }.    } {1 
10cd0 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
10ce0 6b 65 64 7d 7d 0a 20 20 20 20 63 6f 64 65 32 20  ked}}.    code2 
10cf0 7b 20 64 62 32 20 63 6c 6f 73 65 20 3b 20 73 71  { db2 close ; sq
10d00 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
10d10 62 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  b }.    do_test 
10d20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20  pager1-28.$tn.4 
10d30 7b 20 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 20  { .      sql1 { 
10d40 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
10d50 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b  ALUES('c', 'd');
10d60 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 7d 20   COMMIT }.    } 
10d70 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  {}.  }.}..#-----
10d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dc0 2d 2d 2d 2d 0a 23 20 4e 6f 72 6d 61 6c 6c 79 2c  ----.# Normally,
10dd0 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20 66   when changing f
10de0 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  rom journal_mode
10df0 3d 50 45 52 53 49 53 54 20 74 6f 20 44 45 4c 45  =PERSIST to DELE
10e00 54 45 20 74 68 65 20 70 61 67 65 72 0a 23 20 61  TE the pager.# a
10e10 74 74 65 6d 70 74 73 20 74 6f 20 64 65 6c 65 74  ttempts to delet
10e20 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
10e30 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  le. However, if 
10e40 69 74 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  it cannot obtain
10e50 20 61 0a 23 20 52 45 53 45 52 56 45 44 20 6c 6f   a.# RESERVED lo
10e60 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
10e70 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 73 74  se file, this st
10e80 65 70 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 23  ep is skipped..#
10e90 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f  .do_multiclient_
10ea0 74 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74  test tn {.  do_t
10eb0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
10ec0 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b  n.1 {.    sql1 {
10ed0 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a   .      PRAGMA j
10ee0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
10ef0 52 53 49 53 54 3b 0a 20 20 20 20 20 20 43 52 45  RSIST;.      CRE
10f00 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
10f10 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
10f20 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
10f30 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 7d  'a', 'b');.    }
10f40 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20  .  } {persist}. 
10f50 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10f60 32 38 2e 24 74 6e 2e 32 20 7b 20 66 69 6c 65 20  28.$tn.2 { file 
10f70 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
10f80 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f  ournal } 1.  do_
10f90 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10fa0 74 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20 50 52  tn.3 { sql1 { PR
10fb0 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
10fc0 65 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20 64  e = DELETE } } d
10fd0 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20  elete.  do_test 
10fe0 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20  pager1-28.$tn.4 
10ff0 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
11000 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
11010 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  0..  do_test pag
11020 65 72 31 2d 32 38 2e 24 74 6e 2e 35 20 7b 0a 20  er1-28.$tn.5 {. 
11030 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20     sql1 { .     
11040 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
11050 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
11060 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
11070 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c  O t1 VALUES('c',
11080 20 27 64 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   'd');.    }.  }
11090 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f   {persist}.  do_
110a0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
110b0 74 6e 2e 36 20 7b 20 66 69 6c 65 20 65 78 69 73  tn.6 { file exis
110c0 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
110d0 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74  al } 1.  do_test
110e0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 37   pager1-28.$tn.7
110f0 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45   {.    sql2 { BE
11100 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  GIN; INSERT INTO
11110 20 74 31 20 56 41 4c 55 45 53 28 27 65 27 2c 20   t1 VALUES('e', 
11120 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20  'f'); }.  } {}. 
11130 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11140 32 38 2e 24 74 6e 2e 38 20 20 7b 20 66 69 6c 65  28.$tn.8  { file
11150 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
11160 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f  journal } 1.  do
11170 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11180 24 74 6e 2e 39 20 20 7b 20 73 71 6c 31 20 7b 20  $tn.9  { sql1 { 
11190 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
111a0 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d  ode = DELETE } }
111b0 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73   delete.  do_tes
111c0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
111d0 31 30 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  10 { file exists
111e0 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
111f0 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74 20   } 1..  do_test 
11200 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 31  pager1-28.$tn.11
11210 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d   { sql2 COMMIT }
11220 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
11230 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 32 20 7b  ger1-28.$tn.12 {
11240 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
11250 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30  t.db-journal } 0
11260 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
11270 72 31 2d 32 38 2d 24 74 6e 2e 31 33 20 7b 0a 20  r1-28-$tn.13 {. 
11280 20 20 20 63 6f 64 65 31 20 7b 20 73 65 74 20 63     code1 { set c
11290 68 61 6e 6e 65 6c 20 5b 64 62 20 69 6e 63 72 62  hannel [db incrb
112a0 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c 79 20 74 31  lob -readonly t1
112b0 20 61 20 32 5d 20 7d 0a 20 20 20 20 73 71 6c 31   a 2] }.    sql1
112c0 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
112d0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
112e0 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 49 4e  ERSIST;.      IN
112f0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11300 55 45 53 28 27 67 27 2c 20 27 68 27 29 3b 0a 20  UES('g', 'h');. 
11310 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73     }.  } {persis
11320 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  t}.  do_test pag
11330 65 72 31 2d 32 38 2e 24 74 6e 2e 31 34 20 7b 20  er1-28.$tn.14 { 
11340 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
11350 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a  .db-journal } 1.
11360 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11370 2d 32 38 2e 24 74 6e 2e 31 35 20 7b 0a 20 20 20  -28.$tn.15 {.   
11380 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49   sql2 { BEGIN; I
11390 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
113a0 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29 3b 20  LUES('e', 'f'); 
113b0 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
113c0 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
113d0 2e 31 36 20 7b 20 73 71 6c 31 20 7b 20 50 52 41  .16 { sql1 { PRA
113e0 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
113f0 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20 64 65   = DELETE } } de
11400 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70  lete.  do_test p
11410 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 37 20  ager1-28.$tn.17 
11420 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
11430 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
11440 31 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  1..  do_test pag
11450 65 72 31 2d 32 38 2e 24 74 6e 2e 31 37 20 7b 20  er1-28.$tn.17 { 
11460 63 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d  csql2 { COMMIT }
11470 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
11480 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
11490 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d  _test pager1-28-
114a0 24 74 6e 2e 31 38 20 7b 20 63 6f 64 65 31 20 7b  $tn.18 { code1 {
114b0 20 72 65 61 64 20 24 63 68 61 6e 6e 65 6c 20 7d   read $channel }
114c0 20 7d 20 63 0a 20 20 64 6f 5f 74 65 73 74 20 70   } c.  do_test p
114d0 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 39 20  ager1-28-$tn.19 
114e0 7b 20 63 6f 64 65 31 20 7b 20 63 6c 6f 73 65 20  { code1 { close 
114f0 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 7b 7d 0a  $channel } } {}.
11500 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11510 2d 32 38 2e 24 74 6e 2e 32 30 20 7b 20 73 71 6c  -28.$tn.20 { sql
11520 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b  2 { COMMIT } } {
11530 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  }.}..do_test pag
11540 65 72 31 2d 32 39 2e 31 20 7b 0a 20 20 66 61 75  er1-29.1 {.  fau
11550 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
11560 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
11570 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
11580 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
11590 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
115a0 5f 76 61 63 75 75 6d 20 3d 20 66 75 6c 6c 3b 0a  _vacuum = full;.
115b0 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
115c0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
115d0 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  e;.    CREATE TA
115e0 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
115f0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11600 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
11610 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
11620 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 31  est.db.} [expr 1
11630 30 32 34 2a 33 5d 0a 64 6f 5f 74 65 73 74 20 70  024*3].do_test p
11640 61 67 65 72 31 2d 32 39 2e 32 20 7b 0a 20 20 65  ager1-29.2 {.  e
11650 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
11660 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
11670 34 30 39 36 3b 0a 20 20 20 20 56 41 43 55 55 4d  4096;.    VACUUM
11680 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a  ;.  }.  file siz
11690 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70  e test.db.} [exp
116a0 72 20 34 30 39 36 2a 33 5d 0a 0a 23 2d 2d 2d 2d  r 4096*3]..#----
116b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116f0 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
11700 74 20 69 66 20 61 6e 20 65 6d 70 74 79 20 64 61  t if an empty da
11710 74 61 62 61 73 65 20 66 69 6c 65 20 28 73 69 7a  tabase file (siz
11720 65 20 30 20 62 79 74 65 73 29 20 69 73 20 6f 70  e 0 bytes) is op
11730 65 6e 65 64 20 69 6e 20 0a 23 20 65 78 63 6c 75  ened in .# exclu
11740 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
11750 65 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66  e, any journal f
11760 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 66  ile is deleted f
11770 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73  rom the file-sys
11780 74 65 6d 0a 23 20 77 69 74 68 6f 75 74 20 62 65  tem.# without be
11790 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ing rolled back.
117a0 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 52 45   And that the RE
117b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 62 74 61  SERVED lock obta
117c0 69 6e 65 64 20 77 68 69 6c 65 0a 23 20 64 6f 69  ined while.# doi
117d0 6e 67 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  ng this is not r
117e0 65 6c 65 61 73 65 64 2e 0a 23 0a 64 6f 5f 74 65  eleased..#.do_te
117f0 73 74 20 70 61 67 65 72 31 2d 33 30 2e 31 20 7b  st pager1-30.1 {
11800 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 65  .  db close.  de
11810 6c 65 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64  lete_file test.d
11820 62 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20  b.  delete_file 
11830 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
11840 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74    set fd [open t
11850 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77  est.db-journal w
11860 5d 0a 20 20 73 65 65 6b 20 24 66 64 20 5b 65 78  ].  seek $fd [ex
11870 70 72 20 35 31 32 2b 31 30 33 32 2a 32 5d 0a 20  pr 512+1032*2]. 
11880 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
11890 20 24 66 64 20 78 0a 20 20 63 6c 6f 73 65 20 24   $fd x.  close $
118a0 66 64 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62  fd..  sqlite3 db
118b0 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
118c0 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
118d0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
118e0 4c 55 53 49 56 45 3b 0a 20 20 20 20 53 45 4c 45  LUSIVE;.    SELE
118f0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
11900 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
11910 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
11920 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 65  status;.  }.} {e
11930 78 63 6c 75 73 69 76 65 20 30 20 6d 61 69 6e 20  xclusive 0 main 
11940 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63 6c  reserved temp cl
11950 6f 73 65 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  osed}..#--------
11960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119a0 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 66  -.# Test that if
119b0 20 74 68 65 20 22 70 61 67 65 2d 73 69 7a 65 22   the "page-size"
119c0 20 66 69 65 6c 64 20 69 6e 20 61 20 6a 6f 75 72   field in a jour
119d0 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 30 2c  nal-header is 0,
119e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 66   the journal.# f
119f0 69 6c 65 20 63 61 6e 20 73 74 69 6c 6c 20 62 65  ile can still be
11a00 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
11a10 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 66  is is required f
11a20 6f 72 20 62 61 63 6b 77 61 72 64 20 63 6f 6d 70  or backward comp
11a30 61 74 69 62 69 6c 69 74 79 20 2d 0a 23 20 76 65  atibility -.# ve
11a40 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
11a50 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20   prior to 3.5.8 
11a60 61 6c 77 61 79 73 20 73 65 74 20 74 68 69 73 20  always set this 
11a70 66 69 65 6c 64 20 74 6f 20 7a 65 72 6f 2e 0a 23  field to zero..#
11a80 0a 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f  .if {$tcl_platfo
11a90 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75  rm(platform)=="u
11aa0 6e 69 78 22 7d 20 7b 0a 64 6f 5f 74 65 73 74 20  nix"} {.do_test 
11ab0 70 61 67 65 72 31 2d 33 31 2e 31 20 7b 0a 20 20  pager1-31.1 {.  
11ac0 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
11ad0 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
11ae0 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
11af0 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
11b00 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61  0;.    PRAGMA pa
11b10 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
11b20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
11b30 20 74 31 28 78 2c 20 79 2c 20 55 4e 49 51 55 45   t1(x, y, UNIQUE
11b40 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 49 4e 53  (x, y));.    INS
11b50 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
11b60 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ES(randomblob(15
11b70 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
11b80 31 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  1500));.    INSE
11b90 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
11ba0 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
11bb0 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
11bc0 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
11bd0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11be0 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
11bf0 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
11c00 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
11c10 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
11c20 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
11c30 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
11c40 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
11c50 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
11c60 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
11c70 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
11c80 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
11c90 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
11ca0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11cb0 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
11cc0 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
11cd0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
11ce0 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
11cf0 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
11d00 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
11d10 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
11d20 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
11d30 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
11d40 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
11d50 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
11d60 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
11d70 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11d80 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
11d90 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
11da0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
11db0 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
11dc0 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
11dd0 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
11de0 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
11df0 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
11e00 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11e10 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
11e20 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
11e30 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
11e40 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  t1;.    BEGIN;. 
11e50 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
11e60 45 54 20 79 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f  ET y = randomblo
11e70 62 28 31 34 39 39 29 3b 0a 20 20 7d 0a 20 20 63  b(1499);.  }.  c
11e80 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64 62  opy_file test.db
11e90 20 74 65 73 74 2e 64 62 32 0a 20 20 63 6f 70 79   test.db2.  copy
11ea0 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f  _file test.db-jo
11eb0 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a  urnal test.db2-j
11ec0 6f 75 72 6e 61 6c 0a 20 20 0a 20 20 68 65 78 69  ournal.  .  hexi
11ed0 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 32  o_write test.db2
11ee0 2d 6a 6f 75 72 6e 61 6c 20 32 34 20 30 30 30 30  -journal 24 0000
11ef0 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64  0000.  sqlite3 d
11f00 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78  b2 test.db2.  ex
11f10 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69  ecsql { PRAGMA i
11f20 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
11f30 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 23   db2.} {ok}.}..#
11f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
11f90 20 74 68 61 74 20 61 20 64 61 74 61 62 61 73 65   that a database
11fa0 20 66 69 6c 65 20 63 61 6e 20 62 65 20 22 70 72   file can be "pr
11fb0 65 2d 68 69 6e 74 65 64 22 20 74 6f 20 61 20 63  e-hinted" to a c
11fc0 65 72 74 61 69 6e 20 73 69 7a 65 20 61 6e 64 20  ertain size and 
11fd0 74 68 61 74 0a 23 20 73 75 62 73 65 71 75 65 6e  that.# subsequen
11fe0 74 20 73 70 69 6c 6c 69 6e 67 20 6f 66 20 74 68  t spilling of th
11ff0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 64 6f  e pager cache do
12000 65 73 20 6e 6f 74 20 72 65 73 75 6c 74 20 69 6e  es not result in
12010 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 23 20   the database.# 
12020 66 69 6c 65 20 62 65 69 6e 67 20 73 68 72 75 6e  file being shrun
12030 6b 2e 0a 23 0a 63 61 74 63 68 20 7b 64 62 20 63  k..#.catch {db c
12040 6c 6f 73 65 7d 0a 66 6f 72 63 65 64 65 6c 65 74  lose}.forcedelet
12050 65 20 74 65 73 74 2e 64 62 0a 0a 64 6f 5f 74 65  e test.db..do_te
12060 73 74 20 70 61 67 65 72 31 2d 33 32 2e 31 20 7b  st pager1-32.1 {
12070 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
12080 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
12090 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
120a0 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 7d  LE t1(x, y);.  }
120b0 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71  .  db close.  sq
120c0 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
120d0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
120e0 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
120f0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
12100 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  S(1, randomblob(
12110 31 30 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 66  10000));.  }.  f
12120 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
12130 6b 73 69 7a 65 5f 74 65 73 74 20 64 62 20 6d 61  ksize_test db ma
12140 69 6e 20 31 30 32 34 0a 20 20 66 69 6c 65 5f 63  in 1024.  file_c
12150 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f  ontrol_sizehint_
12160 74 65 73 74 20 64 62 20 6d 61 69 6e 20 32 30 39  test db main 209
12170 37 31 35 32 30 3b 20 23 20 32 30 4d 42 0a 20 20  71520; # 20MB.  
12180 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
12190 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
121a0 3d 20 31 30 3b 0a 20 20 20 20 49 4e 53 45 52 54  = 10;.    INSERT
121b0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
121c0 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  1, randomblob(10
121d0 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  000));.    INSER
121e0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
121f0 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (2, randomblob(1
12200 30 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  0000));.    INSE
12210 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
12220 54 20 78 2b 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f  T x+2, randomblo
12230 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31  b(10000) from t1
12240 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12250 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 34 2c  O t1 SELECT x+4,
12260 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
12270 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20  0) from t1;.    
12280 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12290 45 4c 45 43 54 20 78 2b 38 2c 20 72 61 6e 64 6f  ELECT x+8, rando
122a0 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f  mblob(10000) fro
122b0 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  m t1;.    INSERT
122c0 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
122d0 78 2b 31 36 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  x+16, randomblob
122e0 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b  (10000) from t1;
122f0 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
12300 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
12310 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
12320 64 62 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20  db close.  file 
12330 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b  size test.db.} {
12340 32 30 39 37 31 35 32 30 7d 0a 0a 23 20 43 6c 65  20971520}..# Cle
12350 61 6e 75 70 20 32 30 4d 42 20 66 69 6c 65 20 6c  anup 20MB file l
12360 65 66 74 20 62 79 20 74 68 65 20 70 72 65 76 69  eft by the previ
12370 6f 75 73 20 74 65 73 74 2e 0a 66 6f 72 63 65 64  ous test..forced
12380 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 0a 66  elete test.db..f
12390 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.