/ Hex Artifact Content
Login

Artifact 20a99956dbe336cbe98cdcab9c03bb137a21d820:


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 69 66 20 7b 21 5b 66 6f 72 63 65 64  wd].if {![forced
4460: 5f 70 72 6f 78 79 5f 6c 6f 63 6b 69 6e 67 5d 7d  _proxy_locking]}
4470: 20 7b 0a 20 20 23 20 70 72 6f 78 79 20 6c 6f 63   {.  # proxy loc
4480: 6b 69 6e 67 20 75 73 65 73 20 63 61 6e 27 74 20  king uses can't 
4490: 64 65 61 6c 20 77 69 74 68 20 61 75 74 6f 20 70  deal with auto p
44a0: 72 6f 78 79 20 66 69 6c 65 20 70 61 74 68 73 20  roxy file paths 
44b0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 4d 41 58 50  longer than MAXP
44c0: 41 54 48 4c 45 4e 0a 66 6f 72 65 61 63 68 20 7b  ATHLEN.foreach {
44d0: 74 6e 31 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b  tn1 tcl} {.  1 {
44e0: 20 73 65 74 20 70 72 65 66 69 78 20 22 74 65 73   set prefix "tes
44f0: 74 2e 64 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20  t.db" }.  2 { . 
4500: 20 20 20 23 20 54 68 69 73 20 74 65 73 74 20 64     # This test d
4510: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e  epends on the un
4520: 64 65 72 6c 79 69 6e 67 20 56 46 53 20 62 65 69  derlying VFS bei
4530: 6e 67 20 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ng able to open 
4540: 70 61 74 68 73 0a 20 20 20 20 23 20 35 31 32 20  paths.    # 512 
4550: 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
4560: 20 54 68 65 20 69 64 65 61 20 69 73 20 74 6f 20   The idea is to 
4570: 63 72 65 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75  create a hot-jou
4580: 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 0a 20  rnal file that. 
4590: 20 20 20 23 20 63 6f 6e 74 61 69 6e 73 20 61 20     # contains a 
45a0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
45b0: 6f 69 6e 74 65 72 20 73 6f 20 6c 61 72 67 65 20  ointer so large 
45c0: 74 68 61 74 20 69 74 20 63 6f 75 6c 64 20 63 6f  that it could co
45d0: 6e 74 61 69 6e 0a 20 20 20 20 23 20 61 20 76 61  ntain.    # a va
45e0: 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 20  lid page record 
45f0: 28 69 66 20 74 68 65 20 66 69 6c 65 20 70 61 67  (if the file pag
4600: 65 2d 73 69 7a 65 20 69 73 20 35 31 32 20 62 79  e-size is 512 by
4610: 74 65 73 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20  tes). So as to. 
4620: 20 20 20 23 20 6d 61 6b 65 20 73 75 72 65 20 53     # make sure S
4630: 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 67 65  QLite doesn't ge
4640: 74 20 63 6f 6e 66 75 73 65 64 20 62 79 20 74 68  t confused by th
4650: 69 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65  is..    #.    se
4660: 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72  t nPadding [expr
4670: 20 35 31 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c   511 - $::mj_fil
4680: 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20  ename_length].  
4690: 20 20 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66    if {$tcl_platf
46a0: 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22  orm(platform)=="
46b0: 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20  windows"} {.    
46c0: 20 20 23 20 54 42 44 20 6e 65 65 64 20 74 6f 20    # TBD need to 
46d0: 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 74  figure out how t
46e0: 6f 20 64 6f 20 74 68 69 73 20 63 6f 72 72 65 63  o do this correc
46f0: 74 6c 79 20 66 6f 72 20 57 69 6e 64 6f 77 73 21  tly for Windows!
4700: 21 21 0a 20 20 20 20 20 20 73 65 74 20 6e 50 61  !!.      set nPa
4710: 64 64 69 6e 67 20 5b 65 78 70 72 20 32 35 35 20  dding [expr 255 
4720: 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  - $::mj_filename
4730: 5f 6c 65 6e 67 74 68 5d 0a 20 20 20 20 7d 0a 0a  _length].    }..
4740: 20 20 20 20 23 20 57 65 20 63 61 6e 6e 6f 74 20      # We cannot 
4750: 6a 75 73 74 20 63 72 65 61 74 65 20 61 20 72 65  just create a re
4760: 61 6c 6c 79 20 6c 6f 6e 67 20 64 61 74 61 62 61  ally long databa
4770: 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20  se file name to 
4780: 6f 70 65 6e 2c 20 61 73 0a 20 20 20 20 23 20 4c  open, as.    # L
4790: 69 6e 75 78 20 6c 69 6d 69 74 73 20 61 20 73 69  inux limits a si
47a0: 6e 67 6c 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  ngle component o
47b0: 66 20 61 20 70 61 74 68 20 74 6f 20 32 35 35 20  f a path to 255 
47c0: 62 79 74 65 73 20 62 79 20 64 65 66 61 75 6c 74  bytes by default
47d0: 0a 20 20 20 20 23 20 28 61 6e 64 20 70 72 65 73  .    # (and pres
47e0: 75 6d 61 62 6c 79 20 6f 74 68 65 72 20 73 79 73  umably other sys
47f0: 74 65 6d 73 20 68 61 76 65 20 6c 69 6d 69 74 73  tems have limits
4800: 20 74 6f 6f 29 2e 20 53 6f 20 63 72 65 61 74 65   too). So create
4810: 20 61 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20   a directory.   
4820: 20 23 20 68 69 65 72 61 72 63 68 79 20 74 6f 20   # hierarchy to 
4830: 77 6f 72 6b 20 69 6e 2e 0a 20 20 20 20 23 0a 20  work in..    #. 
4840: 20 20 20 73 65 74 20 64 69 72 6e 61 6d 65 20 22     set dirname "
4850: 64 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  d123456789012345
4860: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 2f  678901234567890/
4870: 22 0a 20 20 20 20 73 65 74 20 6e 44 69 72 20 5b  ".    set nDir [
4880: 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20 2f  expr $nPadding /
4890: 20 33 32 5d 0a 20 20 20 20 69 66 20 7b 20 24 6e   32].    if { $n
48a0: 44 69 72 20 7d 20 7b 0a 20 20 20 20 20 20 73 65  Dir } {.      se
48b0: 74 20 70 20 5b 73 74 72 69 6e 67 20 72 65 70 65  t p [string repe
48c0: 61 74 20 24 64 69 72 6e 61 6d 65 20 24 6e 44 69  at $dirname $nDi
48d0: 72 5d 0a 20 20 20 20 20 20 66 69 6c 65 20 6d 6b  r].      file mk
48e0: 64 69 72 20 24 70 0a 20 20 20 20 20 20 63 64 20  dir $p.      cd 
48f0: 24 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65  $p.    }..    se
4900: 74 20 70 61 64 64 69 6e 67 20 5b 73 74 72 69 6e  t padding [strin
4910: 67 20 72 65 70 65 61 74 20 78 20 5b 65 78 70 72  g repeat x [expr
4920: 20 24 6e 50 61 64 64 69 6e 67 20 25 33 32 5d 5d   $nPadding %32]]
4930: 0a 20 20 20 20 73 65 74 20 70 72 65 66 69 78 20  .    set prefix 
4940: 22 74 65 73 74 2e 64 62 24 7b 70 61 64 64 69 6e  "test.db${paddin
4950: 67 7d 22 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 76  g}".  }.} {.  ev
4960: 61 6c 20 24 74 63 6c 0a 20 20 66 6f 72 65 61 63  al $tcl.  foreac
4970: 68 20 7b 74 6e 32 20 73 71 6c 7d 20 7b 0a 20 20  h {tn2 sql} {.  
4980: 20 20 6f 20 7b 20 0a 20 20 20 20 20 20 50 52 41    o { .      PRA
4990: 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f  GMA main.synchro
49a0: 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20  nous=OFF;.      
49b0: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
49c0: 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20  ronous=OFF;.    
49d0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
49e0: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
49f0: 20 20 20 20 7d 0a 20 20 20 20 6f 35 31 32 20 7b      }.    o512 {
4a00: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d   .      PRAGMA m
4a10: 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ain.synchronous=
4a20: 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  OFF;.      PRAGM
4a30: 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75  A aux.synchronou
4a40: 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  s=OFF;.      PRA
4a50: 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69  GMA main.page_si
4a60: 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20  ze = 512;.      
4a70: 50 52 41 47 4d 41 20 61 75 78 2e 70 61 67 65 5f  PRAGMA aux.page_
4a80: 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20  size = 512;.    
4a90: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
4aa0: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
4ab0: 20 20 20 20 7d 0a 20 20 20 20 6e 20 7b 20 0a 20      }.    n { . 
4ac0: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
4ad0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52  .synchronous=NOR
4ae0: 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  MAL;.      PRAGM
4af0: 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75  A aux.synchronou
4b00: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
4b10: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
4b20: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
4b30: 20 20 7d 0a 20 20 20 20 66 20 7b 20 0a 20 20 20    }.    f { .   
4b40: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73     PRAGMA main.s
4b50: 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b  ynchronous=FULL;
4b60: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
4b70: 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  x.synchronous=FU
4b80: 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  LL;.      PRAGMA
4b90: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
4ba0: 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20  DELETE;.    }.  
4bb0: 7d 20 7b 0a 0a 20 20 20 20 73 65 74 20 74 6e 20  } {..    set tn 
4bc0: 22 24 7b 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a  "${tn1}.${tn2}".
4bd0: 20 20 0a 20 20 20 20 23 20 53 65 74 20 75 70 20    .    # Set up 
4be0: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
4bf0: 68 61 76 65 20 74 77 6f 20 64 61 74 61 62 61 73  have two databas
4c00: 65 73 2c 20 74 65 73 74 2e 64 62 20 28 6d 61 69  es, test.db (mai
4c10: 6e 29 20 61 6e 64 20 0a 20 20 20 20 23 20 74 65  n) and .    # te
4c20: 73 74 2e 64 62 32 20 28 61 75 78 29 2e 20 54 68  st.db2 (aux). Th
4c30: 65 6e 20 72 75 6e 20 61 20 6d 75 6c 74 69 2d 66  en run a multi-f
4c40: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ile transaction 
4c50: 6f 6e 20 74 68 65 6d 2e 20 54 68 65 0a 20 20 20  on them. The.   
4c60: 20 23 20 56 46 53 20 77 69 6c 6c 20 73 6e 61 70   # VFS will snap
4c70: 73 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79  shot the file-sy
4c80: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
4c90: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
4ca0: 6e 61 6c 0a 20 20 20 20 23 20 66 69 6c 65 20 69  nal.    # file i
4cb0: 73 20 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d  s deleted to com
4cc0: 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
4cd0: 69 6f 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20 74  ion..    #.    t
4ce0: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
4cf0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
4d00: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a  er1-4.4.$tn.1 {.
4d10: 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64        faultsim_d
4d20: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
4d30: 20 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65   $prefix.      e
4d40: 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20  xecsql ".       
4d50: 20 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69   ATTACH '${prefi
4d60: 78 7d 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20  x}2' AS aux;.   
4d70: 20 20 20 20 20 24 73 71 6c 0a 20 20 20 20 20 20       $sql.      
4d80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
4d90: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45  (x);.        CRE
4da0: 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 62 28  ATE TABLE aux.b(
4db0: 78 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  x);.        INSE
4dc0: 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53  RT INTO a VALUES
4dd0: 28 27 64 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a  ('double-you');.
4de0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4df0: 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 77 68  NTO a VALUES('wh
4e00: 79 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  y');.        INS
4e10: 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45  ERT INTO a VALUE
4e20: 53 28 27 7a 65 64 27 29 3b 0a 20 20 20 20 20 20  S('zed');.      
4e30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
4e40: 56 41 4c 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20  VALUES('won');. 
4e50: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4e60: 54 4f 20 62 20 56 41 4c 55 45 53 28 27 74 6f 6f  TO b VALUES('too
4e70: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
4e80: 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53  RT INTO b VALUES
4e90: 28 27 66 72 65 65 27 29 3b 0a 20 20 20 20 20 20  ('free');.      
4ea0: 22 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  ".      execsql 
4eb0: 7b 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b  {.        BEGIN;
4ec0: 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52  .          INSER
4ed0: 54 20 49 4e 54 4f 20 61 20 53 45 4c 45 43 54 20  T INTO a SELECT 
4ee0: 2a 20 46 52 4f 4d 20 62 20 57 48 45 52 45 20 72  * FROM b WHERE r
4ef0: 6f 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20  owid<=3;.       
4f00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62     INSERT INTO b
4f10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
4f20: 20 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b   WHERE rowid<=3;
4f30: 0a 20 20 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  .        COMMIT;
4f40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b  .      }.    } {
4f50: 7d 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20  }.    tv filter 
4f60: 7b 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 43 68  {}.    .    # Ch
4f70: 65 63 6b 20 74 68 61 74 20 74 68 65 20 74 72 61  eck that the tra
4f80: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
4f90: 6d 69 74 74 65 64 20 73 75 63 63 65 73 73 66 75  mitted successfu
4fa0: 6c 6c 79 2e 0a 20 20 20 20 23 0a 20 20 20 20 64  lly..    #.    d
4fb0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
4fc0: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 32 20  ager1-4.4.$tn.2 
4fd0: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
4fe0: 20 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64   FROM a.    } {d
4ff0: 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65  ouble-you why ze
5000: 64 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a  d won too free}.
5010: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
5020: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
5030: 74 6e 2e 33 20 7b 0a 20 20 20 20 20 20 53 45 4c  tn.3 {.      SEL
5040: 45 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20  ECT * FROM b.   
5050: 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65   } {won too free
5060: 20 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20   double-you why 
5070: 7a 65 64 7d 0a 20 20 20 20 0a 20 20 20 20 23 20  zed}.    .    # 
5080: 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  Restore the file
5090: 2d 73 79 73 74 65 6d 20 61 6e 64 20 72 65 6f 70  -system and reop
50a0: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 73  en the databases
50b0: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 69 74 20  . Check that it 
50c0: 6e 6f 77 0a 20 20 20 20 23 20 61 70 70 65 61 72  now.    # appear
50d0: 73 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  s that the trans
50e0: 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63  action was not c
50f0: 6f 6d 6d 69 74 74 65 64 20 28 62 65 63 61 75 73  ommitted (becaus
5100: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
5110: 6d 0a 20 20 20 20 23 20 77 61 73 20 72 65 73 74  m.    # was rest
5120: 6f 72 65 64 20 74 6f 20 74 68 65 20 73 74 61 74  ored to the stat
5130: 65 20 77 68 65 72 65 20 69 74 20 68 61 64 20 6e  e where it had n
5140: 6f 74 20 62 65 65 6e 29 2e 0a 20 20 20 20 23 0a  ot been)..    #.
5150: 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
5160: 72 31 2d 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20  r1-4.4.$tn.4 {. 
5170: 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65       faultsim_re
5180: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5190: 20 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65   $prefix.      e
51a0: 78 65 63 73 71 6c 20 22 41 54 54 41 43 48 20 27  xecsql "ATTACH '
51b0: 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61  ${prefix}2' AS a
51c0: 75 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20  ux".    } {}.   
51d0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
51e0: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
51f0: 35 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  5 {SELECT * FROM
5200: 20 61 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20   a} {double-you 
5210: 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 64 6f 5f  why zed}.    do_
5220: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
5230: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53  er1-4.4.$tn.6 {S
5240: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20  ELECT * FROM b} 
5250: 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20  {won too free}. 
5260: 20 20 20 0a 20 20 20 20 23 20 52 65 73 74 6f 72     .    # Restor
5270: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
5280: 6d 20 61 67 61 69 6e 2e 20 54 68 69 73 20 74 69  m again. This ti
5290: 6d 65 2c 20 62 65 66 6f 72 65 20 72 65 6f 70 65  me, before reope
52a0: 6e 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ning the databas
52b0: 65 73 2c 0a 20 20 20 20 23 20 64 65 6c 65 74 65  es,.    # delete
52c0: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
52d0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74 68  nal file from th
52e0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 49  e file-system. I
52f0: 74 20 6e 6f 77 20 61 70 70 65 61 72 73 20 74 68  t now appears th
5300: 61 74 0a 20 20 20 20 23 20 74 68 65 20 74 72 61  at.    # the tra
5310: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
5320: 6d 69 74 74 65 64 20 28 6e 6f 20 6d 61 73 74 65  mitted (no maste
5330: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 3d  r-journal file =
5340: 3d 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  = no rollback)..
5350: 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73      #.    do_tes
5360: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
5370: 2e 37 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74  .7 {.      fault
5380: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5390: 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20  reopen $prefix. 
53a0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 20 5b       foreach f [
53b0: 67 6c 6f 62 20 24 7b 70 72 65 66 69 78 7d 2d 6d  glob ${prefix}-m
53c0: 6a 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74  j*] { forcedelet
53d0: 65 20 24 66 20 7d 0a 20 20 20 20 20 20 65 78 65  e $f }.      exe
53e0: 63 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b  csql "ATTACH '${
53f0: 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78  prefix}2' AS aux
5400: 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64  ".    } {}.    d
5410: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5420: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20  ager1-4.4.$tn.8 
5430: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
5440: 20 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64   FROM a.    } {d
5450: 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65  ouble-you why ze
5460: 64 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a  d won too free}.
5470: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
5480: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
5490: 74 6e 2e 39 20 7b 0a 20 20 20 20 20 20 53 45 4c  tn.9 {.      SEL
54a0: 45 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20  ECT * FROM b.   
54b0: 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65   } {won too free
54c0: 20 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20   double-you why 
54d0: 7a 65 64 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24  zed}.  }..  cd $
54e0: 70 77 64 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74  pwd.}.db close.t
54f0: 76 20 64 65 6c 65 74 65 0a 66 6f 72 63 65 64 65  v delete.forcede
5500: 6c 65 74 65 20 24 64 69 72 6e 61 6d 65 0a 7d 0a  lete $dirname.}.
5510: 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56 46 53  ..# Set up a VFS
5520: 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20   to make a copy 
5530: 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
5540: 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 64  em just before d
5550: 65 6c 65 74 69 6e 67 20 61 0a 23 20 6a 6f 75 72  eleting a.# jour
5560: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 63 6f 6d 6d  nal file to comm
5570: 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
5580: 2e 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  . The transactio
5590: 6e 20 6d 6f 64 69 66 69 65 73 20 65 78 61 63 74  n modifies exact
55a0: 6c 79 0a 23 20 74 77 6f 20 64 61 74 61 62 61 73  ly.# two databas
55b0: 65 20 70 61 67 65 73 20 28 61 6e 64 20 70 61 67  e pages (and pag
55c0: 65 20 31 20 2d 20 74 68 65 20 63 68 61 6e 67 65  e 1 - the change
55d0: 20 63 6f 75 6e 74 65 72 29 2e 0a 23 0a 74 65 73   counter)..#.tes
55e0: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
55f0: 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65   1.tv sectorsize
5600: 20 35 31 32 0a 74 76 20 73 63 72 69 70 74 20 63   512.tv script c
5610: 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64  opy_on_journal_d
5620: 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20  elete.tv filter 
5630: 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70  xDelete.proc cop
5640: 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c  y_on_journal_del
5650: 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65  ete {method file
5660: 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69  name args} {.  i
5670: 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
5680: 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e   *journal $filen
5690: 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73  ame]} faultsim_s
56a0: 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53 51  ave .  return SQ
56b0: 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73  LITE_OK.}.faults
56c0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
56d0: 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  open.do_execsql_
56e0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
56f0: 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75  1 {.  PRAGMA jou
5700: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
5710: 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 70 61 67  TE;.  PRAGMA pag
5720: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
5730: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
5740: 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45  (a, b);.  CREATE
5750: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
5760: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
5770: 31 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49  1 VALUES('I', 'I
5780: 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  I');.  INSERT IN
5790: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 49 49  TO t2 VALUES('II
57a0: 49 27 2c 20 27 49 56 27 29 3b 0a 20 20 42 45 47  I', 'IV');.  BEG
57b0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
57c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
57d0: 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
57e0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33  INTO t2 VALUES(3
57f0: 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a  , 4);.  COMMIT;.
5800: 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20 66 69  } {delete}.tv fi
5810: 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65 63 6b  lter {}..# Check
5820: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
5830: 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 3a 0a   was committed:.
5840: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
5850: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32 20 7b  t pager1.4.5.2 {
5860: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5870: 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20   t1;.  SELECT * 
5880: 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49  FROM t2;.} {I II
5890: 20 31 20 32 20 49 49 49 20 49 56 20 33 20 34 7d   1 2 III IV 3 4}
58a0: 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f 75 72  ..# Now try four
58b0: 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70 61 67   tests:.#.#  pag
58c0: 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73 74 6f  er1-4.5.3: Resto
58d0: 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  re the file-syst
58e0: 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74  em. Check that t
58f0: 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
5900: 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20 20 20  tion .#         
5910: 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c 65 64         is rolled
5920: 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65   back..#.#  page
5930: 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74 6f 72  r1-4.5.4: Restor
5940: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
5950: 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20 66  m. Corrupt the f
5960: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74  irst record in t
5970: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
5980: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65      journal. Che
5990: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
59a0: 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c 65 64  on is not rolled
59b0: 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65   back..#.#  page
59c0: 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74 6f 72  r1-4.5.5: Restor
59d0: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
59e0: 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20 73  m. Corrupt the s
59f0: 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69 6e 20  econd record in 
5a00: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
5a10: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68       journal. Ch
5a20: 65 63 6b 20 74 68 61 74 20 74 68 65 20 66 69 72  eck that the fir
5a30: 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  st record in the
5a40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5a50: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5a60: 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 62    played back, b
5a70: 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63 6f 6e  ut not the secon
5a80: 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34  d..#.#  pager1-4
5a90: 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20 74 68  .5.6: Restore th
5aa0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
5ab0: 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64  ry to open the d
5ac0: 61 74 61 62 61 73 65 20 77 69 74 68 20 61 0a 23  atabase with a.#
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ae0: 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65 63 74  readonly connect
5af0: 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ion. This should
5b00: 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65 61 64   fail, as a read
5b10: 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20 20 20  -only.#         
5b20: 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
5b30: 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20 62 61  n cannot roll ba
5b40: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
5b50: 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d  file..#.faultsim
5b60: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5b70: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
5b80: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 33  est pager1.4.5.3
5b90: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
5ba0: 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20  OM t1;.  SELECT 
5bb0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20  * FROM t2;.} {I 
5bc0: 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75 6c 74  II III IV}.fault
5bd0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5be0: 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69  reopen.hexio_wri
5bf0: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
5c00: 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 2b 31  al [expr 512+4+1
5c10: 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32 33 34  024 - 202] 01234
5c20: 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f 5f 65  56789ABCDEF.do_e
5c30: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
5c40: 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53 45 4c  r1.4.5.4 {.  SEL
5c50: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
5c60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5c70: 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 20 49  2;.} {I II 1 2 I
5c80: 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75 6c 74  II IV 3 4}.fault
5c90: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5ca0: 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69  reopen.hexio_wri
5cb0: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
5cc0: 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 2b 31  al [expr 512+4+1
5cd0: 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d 20 32  024+4+4+1024 - 2
5ce0: 30 32 5d 20 30 31 32 33 34 35 36 37 38 39 41 42  02] 0123456789AB
5cf0: 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  CDEF.do_execsql_
5d00: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
5d10: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  5 {.  SELECT * F
5d20: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
5d30: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49   * FROM t2;.} {I
5d40: 20 49 49 20 49 49 49 20 49 56 20 33 20 34 7d 0a   II III IV 3 4}.
5d50: 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72  .faultsim_restor
5d60: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20  e_and_reopen.db 
5d70: 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62  close.sqlite3 db
5d80: 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e   test.db -readon
5d90: 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73 71 6c  ly 1.do_catchsql
5da0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5db0: 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .6 {.  SELECT * 
5dc0: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
5dd0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
5de0: 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  1 {disk I/O erro
5df0: 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20  r}}.db close..# 
5e00: 53 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69 6c  Snapshot the fil
5e10: 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65  e-system just be
5e20: 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69 6c 65 20  fore multi-file 
5e30: 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20 74 68 65  commit. Save the
5e40: 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68 65 20 6d   name.# of the m
5e50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5e60: 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66 69 6c 65  le in $::mj_file
5e70: 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63 72 69 70  name..#.tv scrip
5e80: 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c  t copy_on_mj_del
5e90: 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78 44  ete.tv filter xD
5ea0: 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f  elete.proc copy_
5eb0: 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d 65  on_mj_delete {me
5ec0: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
5ed0: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
5ee0: 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 5b  ing match *mj* [
5ef0: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e  file tail $filen
5f00: 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73 65  ame]]} { .    se
5f10: 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20  t ::mj_filename 
5f20: 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 66 61  $filename.    fa
5f30: 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d  ultsim_save .  }
5f40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5f50: 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61  _OK.}.do_test pa
5f60: 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a 20 20 66  ger1.4.6.1 {.  f
5f70: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
5f80: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
5f90: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
5fa0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
5fb0: 44 45 4c 45 54 45 3b 0a 20 20 20 20 41 54 54 41  DELETE;.    ATTA
5fc0: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
5fd0: 20 74 77 6f 3b 0a 20 20 20 20 43 52 45 41 54 45   two;.    CREATE
5fe0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
5ff0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6000: 45 20 74 77 6f 2e 74 32 28 61 2c 20 62 29 3b 0a  E two.t2(a, b);.
6010: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6020: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 74 31  t1 VALUES(1, 't1
6030: 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  .1');.    INSERT
6040: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
6050: 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20 20 20 20  1, 't2.1');.    
6060: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
6070: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 27  ATE t1 SET b = '
6080: 74 31 2e 32 27 3b 0a 20 20 20 20 20 20 55 50 44  t1.2';.      UPD
6090: 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27  ATE t2 SET b = '
60a0: 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f 4d 4d 49  t2.2';.    COMMI
60b0: 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66 69 6c 74  T;.  }.  tv filt
60c0: 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c 6f 73 65  er {}.  db close
60d0: 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f  .} {}..faultsim_
60e0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
60f0: 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  en.do_execsql_te
6100: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 32 20  st pager1.4.6.2 
6110: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6120: 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20 7b  t1 }           {
6130: 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20  1 t1.1}.do_test 
6140: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
6150: 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73  .6.3 { file exis
6160: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  ts $::mj_filenam
6170: 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73  e } {1}.do_execs
6180: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
6190: 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41 43 48 20  .6.4 {.  ATTACH 
61a0: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74 77  'test.db2' AS tw
61b0: 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  o;.  SELECT * FR
61c0: 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31  OM t2;.} {1 t2.1
61d0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
61e0: 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65 20 65 78  .4.6.5 { file ex
61f0: 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  ists $::mj_filen
6200: 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61 75 6c 74  ame } {0}..fault
6210: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
6220: 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65 0a  reopen.db close.
6230: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
6240: 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20 3a 3a 6d  .6.8 {.  set ::m
6250: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24 3a 3a 6d  j_filename1 $::m
6260: 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20 74 76 20  j_filename.  tv 
6270: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20  filter xDelete. 
6280: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
6290: 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b  .db2.  execsql {
62a0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
62b0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
62c0: 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74  E;.    ATTACH 't
62d0: 65 73 74 2e 64 62 33 27 20 41 53 20 74 68 72 65  est.db3' AS thre
62e0: 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  e;.    CREATE TA
62f0: 42 4c 45 20 74 68 72 65 65 2e 74 33 28 61 2c 20  BLE three.t3(a, 
6300: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
6310: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c  NTO t3 VALUES(1,
6320: 20 27 74 33 2e 31 27 29 3b 0a 20 20 20 20 42 45   't3.1');.    BE
6330: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
6340: 45 20 74 32 20 53 45 54 20 62 20 3d 20 27 74 32  E t2 SET b = 't2
6350: 2e 33 27 3b 0a 20 20 20 20 20 20 55 50 44 41 54  .3';.      UPDAT
6360: 45 20 74 33 20 53 45 54 20 62 20 3d 20 27 74 33  E t3 SET b = 't3
6370: 2e 33 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  .3';.    COMMIT;
6380: 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a  .  }.  expr {$::
6390: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 21 3d 20  mj_filename1 != 
63a0: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 7d 0a  $::mj_filename}.
63b0: 7d 20 7b 31 7d 0a 66 61 75 6c 74 73 69 6d 5f 72  } {1}.faultsim_r
63c0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
63d0: 6e 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 0a  n.tv filter {}..
63e0: 23 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  # The file-syste
63f0: 6d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 3a 0a  m now contains:.
6400: 23 0a 23 20 20 20 2a 20 74 68 72 65 65 20 64 61  #.#   * three da
6410: 74 61 62 61 73 65 73 0a 23 20 20 20 2a 20 74 68  tabases.#   * th
6420: 72 65 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ree hot-journal 
6430: 66 69 6c 65 73 0a 23 20 20 20 2a 20 74 77 6f 20  files.#   * two 
6440: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
6450: 69 6c 65 73 2e 0a 23 0a 23 20 54 68 65 20 68 6f  iles..#.# The ho
6460: 74 2d 6a 6f 75 72 6e 61 6c 73 20 61 73 73 6f 63  t-journals assoc
6470: 69 61 74 65 64 20 77 69 74 68 20 74 65 73 74 2e  iated with test.
6480: 64 62 32 20 61 6e 64 20 74 65 73 74 2e 64 62 33  db2 and test.db3
6490: 20 70 6f 69 6e 74 20 74 6f 0a 23 20 6d 61 73 74   point to.# mast
64a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a  er journal $::mj
64b0: 5f 66 69 6c 65 6e 61 6d 65 2e 20 54 68 65 20 68  _filename. The h
64c0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
64d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
64e0: 23 20 74 65 73 74 2e 64 62 20 70 6f 69 6e 74 73  # test.db points
64f0: 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
6500: 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  al $::mj_filenam
6510: 65 31 2e 20 53 6f 20 72 65 61 64 69 6e 67 20 66  e1. So reading f
6520: 72 6f 6d 0a 23 20 74 65 73 74 2e 64 62 20 73 68  rom.# test.db sh
6530: 6f 75 6c 64 20 64 65 6c 65 74 65 20 24 3a 3a 6d  ould delete $::m
6540: 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64  j_filename1..#.d
6550: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
6560: 36 2e 39 20 7b 0a 20 20 6c 73 6f 72 74 20 5b 67  6.9 {.  lsort [g
6570: 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d 0a 7d 20  lob test.db*].} 
6580: 5b 6c 73 6f 72 74 20 5b 6c 69 73 74 20 20 20 20  [lsort [list    
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e         \.  test.
65c0: 64 62 20 74 65 73 74 2e 64 62 32 20 74 65 73 74  db test.db2 test
65d0: 2e 64 62 33 20 20 20 20 20 20 20 20 20 20 20 20  .db3            
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 2d 6a 6f    \.  test.db-jo
6600: 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a  urnal test.db2-j
6610: 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 33 2d  ournal test.db3-
6620: 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20 5c 0a 20  journal      \. 
6630: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d   [file tail $::m
6640: 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b 66 69 6c  j_filename] [fil
6650: 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c  e tail $::mj_fil
6660: 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23 20 54 68  ename1].]]..# Th
6670: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
6680: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31   $::mj_filename1
6690: 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
66a0: 72 73 20 74 6f 20 74 65 73 74 2e 64 62 20 61 6e  rs to test.db an
66b0: 64 20 0a 23 20 74 65 73 74 2e 64 62 32 2e 20 48  d .# test.db2. H
66c0: 6f 77 65 76 65 72 20 74 68 65 20 68 6f 74 2d 6a  owever the hot-j
66d0: 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61 74 65  ournal associate
66e0: 64 20 77 69 74 68 20 74 65 73 74 2e 64 62 32 20  d with test.db2 
66f0: 70 6f 69 6e 74 73 20 74 6f 0a 23 20 61 20 64 69  points to.# a di
6700: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 2d 6a  fferent master-j
6710: 6f 75 72 6e 61 6c 2e 20 54 68 65 72 65 66 6f 72  ournal. Therefor
6720: 65 2c 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  e, reading from 
6730: 74 65 73 74 2e 64 62 20 6f 6e 6c 79 20 73 68 6f  test.db only sho
6740: 75 6c 64 0a 23 20 62 65 20 65 6e 6f 75 67 68 20  uld.# be enough 
6750: 74 6f 20 63 61 75 73 65 20 53 51 4c 69 74 65 20  to cause SQLite 
6760: 74 6f 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f  to delete $::mj_
6770: 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f  filename1..#.do_
6780: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
6790: 65 72 31 2e 34 2e 36 2e 31 30 20 7b 20 66 69 6c  er1.4.6.10 { fil
67a0: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
67b0: 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64  ilename  } {1}.d
67c0: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
67d0: 61 67 65 72 31 2e 34 2e 36 2e 31 31 20 7b 20 66  ager1.4.6.11 { f
67e0: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
67f0: 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 31 7d  _filename1 } {1}
6800: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6810: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b   pager1.4.6.12 {
6820: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6830: 31 20 7d 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f  1 } {1 t1.1}.do_
6840: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
6850: 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c  er1.4.6.13 { fil
6860: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
6870: 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64  ilename  } {1}.d
6880: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
6890: 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b 20 66  ager1.4.6.14 { f
68a0: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
68b0: 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 30 7d  _filename1 } {0}
68c0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
68d0: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20  t pager1.4.6.12 
68e0: 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74  {.  ATTACH 'test
68f0: 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20  .db2' AS two;.  
6900: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
6910: 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f  ;.} {1 t2.1}.do_
6920: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
6930: 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c  er1.4.6.13 { fil
6940: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
6950: 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 31 7d 0a 64  ilename }  {1}.d
6960: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
6970: 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b 0a 20  ager1.4.6.14 {. 
6980: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
6990: 33 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20 53  3' AS three;.  S
69a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
69b0: 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a 64 6f 5f 74  .} {1 t3.1}.do_t
69c0: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
69d0: 72 31 2e 34 2e 36 2e 31 35 20 7b 20 66 69 6c 65  r1.4.6.15 { file
69e0: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
69f0: 6c 65 6e 61 6d 65 20 7d 20 20 7b 30 7d 0a 0a 64  lename }  {0}..d
6a00: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
6a10: 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64  e..testvfs tv -d
6a20: 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74  efault 1.tv sect
6a30: 6f 72 73 69 7a 65 20 35 31 32 0a 74 76 20 73 63  orsize 512.tv sc
6a40: 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75  ript copy_on_jou
6a50: 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66  rnal_delete.tv f
6a60: 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70 72  ilter xDelete.pr
6a70: 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e  oc copy_on_journ
6a80: 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f  al_delete {metho
6a90: 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d  d filename args}
6aa0: 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67   {.  if {[string
6ab0: 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20   match *journal 
6ac0: 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c  $filename]} faul
6ad0: 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 72 65 74  tsim_save .  ret
6ae0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a  urn SQLITE_OK.}.
6af0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
6b00: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78  and_reopen.do_ex
6b10: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
6b20: 31 2e 34 2e 37 2e 31 20 7b 0a 20 20 50 52 41 47  1.4.7.1 {.  PRAG
6b30: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
6b40: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 43 52 45 41  = DELETE;.  CREA
6b50: 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52  TE TABLE t1(x PR
6b60: 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
6b70: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
6b80: 20 4f 4e 20 74 31 28 79 29 3b 0a 20 20 49 4e 53   ON t1(y);.  INS
6b90: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6ba0: 45 53 28 27 49 27 2c 20 20 20 27 6f 6e 65 27 29  ES('I',   'one')
6bb0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
6bc0: 74 31 20 56 41 4c 55 45 53 28 27 49 49 27 2c 20  t1 VALUES('II', 
6bd0: 20 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45   'four');.  INSE
6be0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6bf0: 53 28 27 49 49 49 27 2c 20 27 6e 69 6e 65 27 29  S('III', 'nine')
6c00: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49  ;.  BEGIN;.    I
6c10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6c20: 4c 55 45 53 28 27 49 56 27 2c 20 27 73 69 78 74  LUES('IV', 'sixt
6c30: 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  een');.    INSER
6c40: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6c50: 28 27 56 27 20 2c 20 27 74 77 65 6e 74 79 66 69  ('V' , 'twentyfi
6c60: 76 65 27 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a  ve');.  COMMIT;.
6c70: 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20 66 69  } {delete}.tv fi
6c80: 6c 74 65 72 20 7b 7d 0a 64 62 20 63 6c 6f 73 65  lter {}.db close
6c90: 0a 74 76 20 64 65 6c 65 74 65 20 0a 64 6f 5f 74  .tv delete .do_t
6ca0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e 32  est pager1.4.7.2
6cb0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
6cc0: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
6cd0: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
6ce0: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
6cf0: 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69  b-journal -permi
6d00: 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d 2d 2d  ssions r--------
6d10: 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20  }.  catch {file 
6d20: 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e  attributes test.
6d30: 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64  db-journal -read
6d40: 6f 6e 6c 79 20 31 7d 0a 20 20 63 61 74 63 68 73  only 1}.  catchs
6d50: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
6d60: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 75 6e  OM t1 }.} {1 {un
6d70: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
6d80: 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 64 6f 5f  abase file}}.do_
6d90: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e  test pager1.4.7.
6da0: 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  3 {.  db close. 
6db0: 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74   catch {file att
6dc0: 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62 2d  ributes test.db-
6dd0: 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69 73 73  journal -permiss
6de0: 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d 0a  ions rw-rw-rw-}.
6df0: 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74    catch {file at
6e00: 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62  tributes test.db
6e10: 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64 6f 6e  -journal -readon
6e20: 6c 79 20 30 7d 0a 20 20 64 65 6c 65 74 65 5f 66  ly 0}.  delete_f
6e30: 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ile test.db-jour
6e40: 6e 61 6c 0a 20 20 66 69 6c 65 20 65 78 69 73 74  nal.  file exist
6e50: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
6e60: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  l.} {0}.do_test 
6e70: 70 61 67 65 72 31 2e 34 2e 38 2e 31 20 7b 0a 20  pager1.4.8.1 {. 
6e80: 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74   catch {file att
6e90: 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62 20  ributes test.db 
6ea0: 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72 2d 2d  -permissions r--
6eb0: 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63 68 20  ------}.  catch 
6ec0: 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73  {file attributes
6ed0: 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e   test.db -readon
6ee0: 6c 79 20 31 7d 0a 20 20 73 71 6c 69 74 65 33 20  ly 1}.  sqlite3 
6ef0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20  db test.db.  db 
6f00: 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
6f10: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71 6c 69  FROM t1 }.  sqli
6f20: 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20  te3_db_readonly 
6f30: 64 62 20 6d 61 69 6e 0a 7d 20 7b 31 7d 0a 64 6f  db main.} {1}.do
6f40: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 38  _test pager1.4.8
6f50: 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 64  .2 {.  sqlite3_d
6f60: 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 78 79  b_readonly db xy
6f70: 7a 0a 7d 20 7b 2d 31 7d 0a 64 6f 5f 74 65 73 74  z.} {-1}.do_test
6f80: 20 70 61 67 65 72 31 2e 34 2e 38 2e 33 20 7b 0a   pager1.4.8.3 {.
6f90: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74    db close.  cat
6fa0: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6fb0: 74 65 73 20 74 65 73 74 2e 64 62 20 2d 72 65 61  tes test.db -rea
6fc0: 64 6f 6e 6c 79 20 30 7d 0a 20 20 63 61 74 63 68  donly 0}.  catch
6fd0: 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65   {file attribute
6fe0: 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72 6d 69  s test.db -permi
6ff0: 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d  ssions rw-rw-rw-
7000: 7d 20 6d 73 67 0a 20 20 73 71 6c 69 74 65 33 20  } msg.  sqlite3 
7010: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20  db test.db.  db 
7020: 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
7030: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71 6c 69  FROM t1 }.  sqli
7040: 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20  te3_db_readonly 
7050: 64 62 20 6d 61 69 6e 0a 7d 20 7b 30 7d 0a 0a 23  db main.} {0}..#
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
70b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
70c0: 64 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 2d  deal with multi-
70d0: 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a 23 0a  file commits..#.
70e0: 23 20 70 61 67 65 72 31 2d 35 2e 31 2e 2a 3a 20  # pager1-5.1.*: 
70f0: 54 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  The case where a
7100: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 61 6e 6e   multi-file cann
7110: 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ot be committed 
7120: 62 65 63 61 75 73 65 0a 23 20 20 20 20 20 20 20  because.#       
7130: 20 20 20 20 20 20 20 20 61 6e 6f 74 68 65 72 20          another 
7140: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
7150: 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  lding a SHARED l
7160: 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ock on one of th
7170: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
7180: 20 20 66 69 6c 65 73 2e 20 41 66 74 65 72 20 74    files. After t
7190: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69  he SHARED lock i
71a0: 73 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 20 43  s removed, the C
71b0: 4f 4d 4d 49 54 20 73 75 63 63 65 65 64 73 2e 0a  OMMIT succeeds..
71c0: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 32 2e 2a  #.# pager1-5.2.*
71d0: 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  : Multi-file com
71e0: 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e 61  mits with journa
71f0: 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23  l_mode=memory..#
7200: 0a 23 20 70 61 67 65 72 31 2d 35 2e 33 2e 2a 3a  .# pager1-5.3.*:
7210: 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   Multi-file comm
7220: 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  its with journal
7230: 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a  _mode=memory..#.
7240: 23 20 70 61 67 65 72 31 2d 35 2e 34 2e 2a 3a 20  # pager1-5.4.*: 
7250: 43 68 65 63 6b 20 74 68 61 74 20 77 69 74 68 20  Check that with 
7260: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f 72 6d  synchronous=norm
7270: 61 6c 2c 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  al, the master-j
7280: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20  ournal file.#   
7290: 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
72a0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 61 20 6a   is added to a j
72b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
72c0: 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68  diately after th
72d0: 65 20 6c 61 73 74 0a 23 20 20 20 20 20 20 20 20  e last.#        
72e0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 72         journal r
72f0: 65 63 6f 72 64 2e 20 42 75 74 20 77 69 74 68 20  ecord. But with 
7300: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c  synchronous=full
7310: 2c 20 65 78 74 72 61 20 75 6e 75 73 65 64 20 73  , extra unused s
7320: 70 61 63 65 0a 23 20 20 20 20 20 20 20 20 20 20  pace.#          
7330: 20 20 20 20 20 69 73 20 61 6c 6c 6f 63 61 74 65       is allocate
7340: 64 20 62 65 74 77 65 65 6e 20 74 68 65 20 6c 61  d between the la
7350: 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  st journal recor
7360: 64 20 61 6e 64 20 74 68 65 20 0a 23 20 20 20 20  d and the .#    
7370: 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 74 65             maste
7380: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r-journal file n
7390: 61 6d 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ame so that the 
73a0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
73b0: 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ile.#           
73c0: 20 20 20 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f      name does no
73d0: 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 73 61 6d  t lie on the sam
73e0: 65 20 73 65 63 74 6f 72 20 61 73 20 74 68 65 20  e sector as the 
73f0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  last journal fil
7400: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
7410: 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23 20 70 61    record..#.# pa
7420: 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43 68 65 63  ger1-5.5.*: Chec
7430: 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75 72 6e 61  k that in journa
7440: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 6d  l_mode=PERSIST m
7450: 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ode, a journal f
7460: 69 6c 65 20 69 73 0a 23 20 20 20 20 20 20 20 20  ile is.#        
7470: 20 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 64         truncated
7480: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 77   to zero bytes w
7490: 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  hen a multi-file
74a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
74b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
74c0: 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e 73 74   committed (inst
74d0: 65 61 64 20 6f 66 20 74 68 65 20 66 69 72 73 74  ead of the first
74e0: 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
74f0: 20 62 65 69 6e 67 20 7a 65 72 6f 65 64 29 2e 0a   being zeroed)..
7500: 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  #.#.do_test page
7510: 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20 66 61 75  r1-5.1.1 {.  fau
7520: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
7530: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
7540: 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27  l {.    ATTACH '
7550: 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78  test.db2' AS aux
7560: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7570: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
7580: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
7590: 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20  x.t2(a, b);.    
75a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
75b0: 41 4c 55 45 53 28 31 37 2c 20 27 4c 65 6e 69 6e  ALUES(17, 'Lenin
75c0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
75d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 32  NTO t1 VALUES(22
75e0: 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a 20 20 20  , 'Stalin');.   
75f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
7600: 56 41 4c 55 45 53 28 35 33 2c 20 27 4b 68 72 75  VALUES(53, 'Khru
7610: 73 68 63 68 65 76 27 29 3b 0a 20 20 7d 0a 7d 20  shchev');.  }.} 
7620: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
7630: 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  1-5.1.2 {.  exec
7640: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
7650: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
7660: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 34 2c  TO t1 VALUES(64,
7670: 20 27 42 72 65 7a 68 6e 65 76 27 29 3b 0a 20 20   'Brezhnev');.  
7680: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7690: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
76a0: 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   t1;.  }.  sqlit
76b0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
76c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
76d0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c  BEGIN;.      SEL
76e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
76f0: 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74   } db2.} {}.do_t
7700: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 33  est pager1-5.1.3
7710: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f   {.  catchsql CO
7720: 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61 74 61 62  MMIT.} {1 {datab
7730: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
7740: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
7750: 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.4 {.  execsql
7760: 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20 20 65 78   COMMIT db2.  ex
7770: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 65  ecsql COMMIT.  e
7780: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
7790: 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a  * FROM t2 } db2.
77a0: 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32 32 20 53  } {17 Lenin 22 S
77b0: 74 61 6c 69 6e 20 35 33 20 4b 68 72 75 73 68 63  talin 53 Khrushc
77c0: 68 65 76 20 36 34 20 42 72 65 7a 68 6e 65 76 7d  hev 64 Brezhnev}
77d0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
77e0: 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32 20 63 6c  5.1.5 {.  db2 cl
77f0: 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  ose.} {}..do_tes
7800: 74 20 70 61 67 65 72 31 2d 35 2e 32 2e 31 20 7b  t pager1-5.2.1 {
7810: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7820: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
7830: 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20  mode = memory;. 
7840: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
7850: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
7860: 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f  ALUES(84, 'Andro
7870: 70 6f 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  pov');.      INS
7880: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
7890: 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76  ES(84, 'Andropov
78a0: 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ');.    COMMIT;.
78b0: 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d 0a 64    }.} {memory}.d
78c0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
78d0: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
78e0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
78f0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 3b  rnal_mode = off;
7900: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7910: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7920: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
7930: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20 20  bachev');.      
7940: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
7950: 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61  ALUES(85, 'Gorba
7960: 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d  chev');.    COMM
7970: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66 7d 0a  IT;.  }.} {off}.
7980: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7990: 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f  5.4.1 {.  db clo
79a0: 73 65 0a 20 20 74 65 73 74 76 66 73 20 74 76 0a  se.  testvfs tv.
79b0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
79c0: 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20 65  t.db -vfs tv.  e
79d0: 78 65 63 73 71 6c 20 7b 20 41 54 54 41 43 48 20  xecsql { ATTACH 
79e0: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75  'test.db2' AS au
79f0: 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c 74 65 72  x }..  tv filter
7a00: 20 78 44 65 6c 65 74 65 0a 20 20 74 76 20 73 63   xDelete.  tv sc
7a10: 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c  ript max_journal
7a20: 5f 73 69 7a 65 0a 20 20 74 76 20 73 65 63 74 6f  _size.  tv secto
7a30: 72 73 69 7a 65 20 35 31 32 0a 20 20 73 65 74 20  rsize 512.  set 
7a40: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a  ::max_journal 0.
7a50: 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f 75 72 6e    proc max_journ
7a60: 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68 6f 64 20  al_size {method 
7a70: 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20  args} {.    set 
7a80: 73 7a 20 30 0a 20 20 20 20 63 61 74 63 68 20 7b  sz 0.    catch {
7a90: 20 73 65 74 20 73 7a 20 5b 66 69 6c 65 20 73 69   set sz [file si
7aa0: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ze test.db-journ
7ab0: 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20 7b 24 73  al] }.    if {$s
7ac0: 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e  z > $::max_journ
7ad0: 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20  al} {.      set 
7ae0: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 24 73  ::max_journal $s
7af0: 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  z.    }.    retu
7b00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d  rn SQLITE_OK.  }
7b10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7b20: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
7b30: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
7b40: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
7b50: 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a  onous = NORMAL;.
7b60: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
7b70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
7b80: 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62  VALUES(85, 'Gorb
7b90: 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20 20 49  achev');.      I
7ba0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
7bb0: 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63  LUES(85, 'Gorbac
7bc0: 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  hev');.    COMMI
7bd0: 54 3b 0a 20 20 7d 0a 0a 20 20 23 20 54 68 65 20  T;.  }..  # The 
7be0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
7bf0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 77 3a  nal file is now:
7c00: 0a 20 20 23 20 0a 20 20 23 20 20 20 31 29 20 35  .  # .  #   1) 5
7c10: 31 32 20 62 79 74 65 20 68 65 61 64 65 72 20 2b  12 byte header +
7c20: 0a 20 20 23 20 20 20 32 29 20 32 20 2a 20 28 31  .  #   2) 2 * (1
7c30: 30 32 34 2b 38 29 20 62 79 74 65 20 72 65 63 6f  024+8) byte reco
7c40: 72 64 73 20 2b 0a 20 20 23 20 20 20 33 29 20 32  rds +.  #   3) 2
7c50: 30 2b 4e 20 62 79 74 65 73 20 6f 66 20 6d 61 73  0+N bytes of mas
7c60: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
7c70: 74 65 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ter, where N is 
7c80: 74 68 65 20 73 69 7a 65 20 6f 66 20 0a 20 20 23  the size of .  #
7c90: 20 20 20 20 20 20 74 68 65 20 6d 61 73 74 65 72        the master
7ca0: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 65 6e  -journal name en
7cb0: 63 6f 64 65 64 20 61 73 20 75 74 66 2d 38 20 77  coded as utf-8 w
7cc0: 69 74 68 20 6e 6f 20 6e 75 6c 20 74 65 72 6d 2e  ith no nul term.
7cd0: 0a 20 20 23 0a 20 20 73 65 74 20 6d 6a 5f 70 6f  .  #.  set mj_po
7ce0: 69 6e 74 65 72 20 5b 65 78 70 72 20 7b 0a 20 20  inter [expr {.  
7cf0: 20 20 32 30 20 2b 20 5b 73 74 72 69 6e 67 20 6c    20 + [string l
7d00: 65 6e 67 74 68 20 5b 67 65 74 5f 70 77 64 5d 5d  ength [get_pwd]]
7d10: 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   + [string lengt
7d20: 68 20 22 2f 74 65 73 74 2e 64 62 2d 6d 6a 58 58  h "/test.db-mjXX
7d30: 58 58 58 58 39 58 58 22 5d 0a 20 20 7d 5d 0a 20  XXXX9XX"].  }]. 
7d40: 20 65 78 70 72 20 7b 24 3a 3a 6d 61 78 5f 6a 6f   expr {$::max_jo
7d50: 75 72 6e 61 6c 3d 3d 28 35 31 32 2b 32 2a 28 31  urnal==(512+2*(1
7d60: 30 32 34 2b 38 29 2b 24 6d 6a 5f 70 6f 69 6e 74  024+8)+$mj_point
7d70: 65 72 29 7d 0a 7d 20 31 0a 64 6f 5f 74 65 73 74  er)}.} 1.do_test
7d80: 20 70 61 67 65 72 31 2d 35 2e 34 2e 32 20 7b 0a   pager1-5.4.2 {.
7d90: 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72    set ::max_jour
7da0: 6e 61 6c 20 30 0a 20 20 65 78 65 63 73 71 6c 20  nal 0.  execsql 
7db0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e  {.    PRAGMA syn
7dc0: 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b  chronous = full;
7dd0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7de0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
7df0: 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69   WHERE b = 'Leni
7e00: 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  n';.      DELETE
7e10: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 62   FROM t2 WHERE b
7e20: 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20   = 'Lenin';.    
7e30: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 23  COMMIT;.  }..  #
7e40: 20 49 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d   In synchronous=
7e50: 66 75 6c 6c 20 6d 6f 64 65 2c 20 74 68 65 20 6d  full mode, the m
7e60: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
7e70: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 77 72 69  inter is not wri
7e80: 74 74 65 6e 0a 20 20 23 20 64 69 72 65 63 74 6c  tten.  # directl
7e90: 79 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  y after the last
7ea0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a   record in the j
7eb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 73  ournal file. Ins
7ec0: 74 65 61 64 2c 20 69 74 20 69 73 0a 20 20 23 20  tead, it is.  # 
7ed0: 77 72 69 74 74 65 6e 20 73 74 61 72 74 69 6e 67  written starting
7ee0: 20 61 74 20 74 68 65 20 6e 65 78 74 20 28 69 6e   at the next (in
7ef0: 20 74 68 69 73 20 63 61 73 65 20 35 31 32 20 62   this case 512 b
7f00: 79 74 65 29 20 73 65 63 74 6f 72 20 62 6f 75 6e  yte) sector boun
7f10: 64 61 72 79 2e 0a 20 20 23 0a 20 20 73 65 74 20  dary..  #.  set 
7f20: 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72  mj_pointer [expr
7f30: 20 7b 0a 20 20 20 20 32 30 20 2b 20 5b 73 74 72   {.    20 + [str
7f40: 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67 65 74 5f  ing length [get_
7f50: 70 77 64 5d 5d 20 2b 20 5b 73 74 72 69 6e 67 20  pwd]] + [string 
7f60: 6c 65 6e 67 74 68 20 22 2f 74 65 73 74 2e 64 62  length "/test.db
7f70: 2d 6d 6a 58 58 58 58 58 58 39 58 58 22 5d 0a 20  -mjXXXXXX9XX"]. 
7f80: 20 7d 5d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d   }].  expr {$::m
7f90: 61 78 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 28 28 35  ax_journal==(((5
7fa0: 31 32 2b 32 2a 28 31 30 32 34 2b 38 29 2b 35 31  12+2*(1024+8)+51
7fb0: 31 29 2f 35 31 32 29 2a 35 31 32 20 2b 20 24 6d  1)/512)*512 + $m
7fc0: 6a 5f 70 6f 69 6e 74 65 72 29 7d 0a 7d 20 31 0a  j_pointer)}.} 1.
7fd0: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
7fe0: 74 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  te..do_test page
7ff0: 72 31 2d 35 2e 35 2e 31 20 7b 0a 20 20 73 71 6c  r1-5.5.1 {.  sql
8000: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
8010: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
8020: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
8030: 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50  2' AS aux;.    P
8040: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8050: 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
8060: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
8070: 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  3(a, b);.    INS
8080: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
8090: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
80a0: 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
80b0: 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
80c0: 20 20 20 55 50 44 41 54 45 20 74 33 20 53 45 54     UPDATE t3 SET
80d0: 20 62 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28   b = randomblob(
80e0: 31 35 30 30 29 3b 0a 20 20 7d 0a 20 20 65 78 70  1500);.  }.  exp
80f0: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
8100: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20  t.db-journal] > 
8110: 31 35 30 30 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  15000.} {1}.do_t
8120: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 32  est pager1-5.5.2
8130: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
8140: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
8150: 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a 20 20  onous = full;.  
8160: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44    BEGIN;.      D
8170: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
8180: 45 52 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27  ERE b = 'Stalin'
8190: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
81a0: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20 3d  ROM t2 WHERE b =
81b0: 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 43   'Stalin';.    C
81c0: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 66 69 6c  OMMIT;.  }.  fil
81d0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a  e size test.db-j
81e0: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23  ournal.} {0}...#
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
8240: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
8250: 77 6f 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d  work with "PRAGM
8260: 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  A max_page_count
8270: 22 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ".#.do_test page
8280: 72 31 2d 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74  r1-6.1 {.  fault
8290: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
82a0: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
82b0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
82c0: 6f 5f 76 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b  o_vacuum = none;
82d0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f  .    PRAGMA max_
82e0: 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b  page_count = 10;
82f0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8300: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t2(a, b);.    
8310: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
8320: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
8330: 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62 29  E TABLE t4(a, b)
8340: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8350: 4c 45 20 74 35 28 61 2c 20 62 29 3b 0a 20 20 20  LE t5(a, b);.   
8360: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36   CREATE TABLE t6
8370: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
8380: 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c 20 62  TE TABLE t7(a, b
8390: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
83a0: 42 4c 45 20 74 38 28 61 2c 20 62 29 3b 0a 20 20  BLE t8(a, b);.  
83b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
83c0: 39 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  9(a, b);.    CRE
83d0: 41 54 45 20 54 41 42 4c 45 20 74 31 30 28 61 2c  ATE TABLE t10(a,
83e0: 20 62 29 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a   b);.  }.} {10}.
83f0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
8400: 20 70 61 67 65 72 31 2d 36 2e 32 20 7b 0a 20 20   pager1-6.2 {.  
8410: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 31  CREATE TABLE t11
8420: 28 61 2c 20 62 29 0a 7d 20 7b 31 20 7b 64 61 74  (a, b).} {1 {dat
8430: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
8440: 20 66 75 6c 6c 7d 7d 0a 64 6f 5f 65 78 65 63 73   full}}.do_execs
8450: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  ql_test pager1-6
8460: 2e 34 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f  .4 { PRAGMA max_
8470: 70 61 67 65 5f 63 6f 75 6e 74 20 20 20 20 20 20  page_count      
8480: 7d 20 7b 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71  } {10}.do_execsq
8490: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
84a0: 35 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70  5 { PRAGMA max_p
84b0: 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 35 20 7d  age_count = 15 }
84c0: 20 7b 31 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {15}.do_execsql
84d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 36  _test pager1-6.6
84e0: 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
84f0: 74 31 31 28 61 2c 20 62 29 20 20 20 20 20 7d 20  t11(a, b)     } 
8500: 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  {}.do_execsql_te
8510: 73 74 20 70 61 67 65 72 31 2d 36 2e 37 20 7b 0a  st pager1-6.7 {.
8520: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
8530: 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c  ERT INTO t11 VAL
8540: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 50  UES(1, 2);.    P
8550: 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63  RAGMA max_page_c
8560: 6f 75 6e 74 20 3d 20 31 33 3b 0a 7d 20 7b 31 33  ount = 13;.} {13
8570: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
8580: 74 20 70 61 67 65 72 31 2d 36 2e 38 20 7b 0a 20  t pager1-6.8 {. 
8590: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
85a0: 31 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  11 VALUES(3, 4);
85b0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f  .    PRAGMA max_
85c0: 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b  page_count = 10;
85d0: 0a 7d 20 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73  .} {11}.do_execs
85e0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  ql_test pager1-6
85f0: 2e 39 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d  .9 { COMMIT } {}
8600: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
8610: 74 20 70 61 67 65 72 31 2d 36 2e 31 30 20 7b 20  t pager1-6.10 { 
8620: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8630: 63 6f 75 6e 74 20 3d 20 31 30 20 7d 20 7b 31 31  count = 10 } {11
8640: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
8650: 74 20 70 61 67 65 72 31 2d 36 2e 31 31 20 7b 20  t pager1-6.11 { 
8660: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
8670: 31 20 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20  1 }          {1 
8680: 32 20 33 20 34 7d 0a 64 6f 5f 65 78 65 63 73 71  2 3 4}.do_execsq
8690: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
86a0: 31 32 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f  12 { PRAGMA max_
86b0: 70 61 67 65 5f 63 6f 75 6e 74 20 7d 20 20 20 20  page_count }    
86c0: 20 20 7b 31 31 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d    {11}...#------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8710: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
8720: 69 6e 67 20 74 65 73 74 73 20 77 6f 72 6b 20 77  ing tests work w
8730: 69 74 68 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  ith "PRAGMA jour
8740: 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54  nal_mode=TRUNCAT
8750: 45 22 20 61 6e 64 0a 23 20 22 50 52 41 47 4d 41  E" and.# "PRAGMA
8760: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
8770: 43 4c 55 53 49 56 45 22 2e 0a 23 0a 23 20 45 61  CLUSIVE"..#.# Ea
8780: 63 68 20 74 65 73 74 20 69 73 20 73 70 65 63 69  ch test is speci
8790: 66 69 65 64 20 77 69 74 68 20 35 20 76 61 72 69  fied with 5 vari
87a0: 61 62 6c 65 73 2e 20 41 73 20 66 6f 6c 6c 6f 77  ables. As follow
87b0: 73 3a 0a 23 0a 23 20 20 20 24 74 6e 3a 20 20 54  s:.#.#   $tn:  T
87c0: 65 73 74 20 4e 75 6d 62 65 72 2e 20 55 73 65 64  est Number. Used
87d0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
87e0: 5b 64 6f 5f 74 65 73 74 5d 20 74 65 73 74 20 6e  [do_test] test n
87f0: 61 6d 65 73 2e 0a 23 20 20 20 24 73 71 6c 3a 20  ames..#   $sql: 
8800: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 2e 0a  SQL to execute..
8810: 23 20 20 20 24 72 65 73 3a 20 45 78 70 65 63 74  #   $res: Expect
8820: 65 64 20 72 65 73 75 6c 74 20 6f 66 20 65 78 65  ed result of exe
8830: 63 75 74 69 6e 67 20 24 73 71 6c 2e 0a 23 20 20  cuting $sql..#  
8840: 20 24 6a 73 3a 20 20 54 68 65 20 65 78 70 65 63   $js:  The expec
8850: 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ted size of the 
8860: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 6e  journal file, in
8870: 20 62 79 74 65 73 2c 20 61 66 74 65 72 20 65 78   bytes, after ex
8880: 65 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20  ecuting.#       
8890: 20 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74    the SQL script
88a0: 2e 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20 6a  . Or -1 if the j
88b0: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 65 78  ournal is not ex
88c0: 70 65 63 74 65 64 20 74 6f 20 65 78 69 73 74 2e  pected to exist.
88d0: 0a 23 20 20 20 24 77 73 3a 20 20 54 68 65 20 65  .#   $ws:  The e
88e0: 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20  xpected size of 
88f0: 74 68 65 20 57 41 4c 20 66 69 6c 65 2c 20 69 6e  the WAL file, in
8900: 20 62 79 74 65 73 2c 20 61 66 74 65 72 20 65 78   bytes, after ex
8910: 65 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20  ecuting.#       
8920: 20 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74    the SQL script
8930: 2e 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20 57  . Or -1 if the W
8940: 41 4c 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74  AL is not expect
8950: 65 64 20 74 6f 20 65 78 69 73 74 2e 0a 23 0a 69  ed to exist..#.i
8960: 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20  fcapable wal {. 
8970: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
8980: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f  _and_reopen.  fo
8990: 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72 65  reach {tn sql re
89a0: 73 20 6a 73 20 77 73 7d 20 5b 73 75 62 73 74 20  s js ws} [subst 
89b0: 7b 0a 20 20 0a 20 20 20 20 31 20 20 7b 0a 20 20  {.  .    1  {.  
89c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
89d0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
89e0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
89f0: 75 75 6d 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  uum=OFF;.      P
8a00: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
8a10: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
8a20: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
8a30: 3d 31 30 32 34 3b 0a 20 20 20 20 20 20 50 52 41  =1024;.      PRA
8a40: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
8a50: 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  =EXCLUSIVE;.    
8a60: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
8a70: 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 3b 0a  _mode=TRUNCATE;.
8a80: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
8a90: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
8aa0: 29 3b 0a 20 20 20 20 7d 20 7b 65 78 63 6c 75 73  );.    } {exclus
8ab0: 69 76 65 20 74 72 75 6e 63 61 74 65 7d 20 30 20  ive truncate} 0 
8ac0: 2d 31 0a 20 20 0a 20 20 20 20 32 20 20 7b 0a 20  -1.  .    2  {. 
8ad0: 20 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45 44       BEGIN IMMED
8ae0: 49 41 54 45 3b 0a 20 20 20 20 20 20 20 20 53 45  IATE;.        SE
8af0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
8b00: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
8b10: 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20    } {1 2} 0 -1. 
8b20: 20 0a 20 20 20 20 33 20 20 7b 0a 20 20 20 20 20   .    3  {.     
8b30: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20   BEGIN;.        
8b40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
8b50: 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ;.      COMMIT;.
8b60: 20 20 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31      } {1 2} 0 -1
8b70: 0a 20 20 0a 20 20 20 20 34 20 20 7b 20 50 52 41  .  .    4  { PRA
8b80: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8b90: 20 3d 20 57 41 4c 20 7d 20 20 20 20 77 61 6c 20   = WAL }    wal 
8ba0: 20 20 20 20 20 20 2d 31 20 2d 31 0a 20 20 20 20        -1 -1.    
8bb0: 35 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  5  { INSERT INTO
8bc0: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
8bd0: 20 7d 20 20 7b 7d 20 20 20 20 20 20 20 20 2d 31   }  {}        -1
8be0: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
8bf0: 31 20 31 30 32 34 5d 0a 20 20 20 20 36 20 20 7b  1 1024].    6  {
8c00: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
8c10: 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20  mode = NORMAL } 
8c20: 65 78 63 6c 75 73 69 76 65 20 2d 31 20 5b 77 61  exclusive -1 [wa
8c30: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30  l_file_size 1 10
8c40: 32 34 5d 0a 20 20 20 20 37 20 20 7b 20 49 4e 53  24].    7  { INS
8c50: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8c60: 45 53 28 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20  ES(5, 6); } {}  
8c70: 20 20 20 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69        -1 [wal_fi
8c80: 6c 65 5f 73 69 7a 65 20 32 20 31 30 32 34 5d 0a  le_size 2 1024].
8c90: 20 20 0a 20 20 20 20 38 20 20 7b 20 50 52 41 47    .    8  { PRAG
8ca0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
8cb0: 3d 20 54 52 55 4e 43 41 54 45 20 7d 20 74 72 75  = TRUNCATE } tru
8cc0: 6e 63 61 74 65 20 20 20 20 20 20 20 20 20 20 30  ncate          0
8cd0: 20 2d 31 0a 20 20 20 20 39 20 20 7b 20 49 4e 53   -1.    9  { INS
8ce0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8cf0: 45 53 28 37 2c 20 38 29 20 7d 20 20 20 20 7b 7d  ES(7, 8) }    {}
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d10: 30 20 2d 31 0a 20 20 20 20 31 30 20 7b 20 53 45  0 -1.    10 { SE
8d20: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
8d40: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 7d  1 2 3 4 5 6 7 8}
8d50: 20 30 20 2d 31 0a 20 20 0a 20 20 7d 5d 20 7b 0a   0 -1.  .  }] {.
8d60: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
8d70: 65 73 74 20 70 61 67 65 72 31 2d 37 2e 31 2e 24  est pager1-7.1.$
8d80: 74 6e 2e 31 20 24 73 71 6c 20 24 72 65 73 0a 20  tn.1 $sql $res. 
8d90: 20 20 20 63 61 74 63 68 20 7b 20 73 65 74 20 4a     catch { set J
8da0: 20 2d 31 20 3b 20 73 65 74 20 4a 20 5b 66 69 6c   -1 ; set J [fil
8db0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a  e size test.db-j
8dc0: 6f 75 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 63 61  ournal] }.    ca
8dd0: 74 63 68 20 7b 20 73 65 74 20 57 20 2d 31 20 3b  tch { set W -1 ;
8de0: 20 73 65 74 20 57 20 5b 66 69 6c 65 20 73 69 7a   set W [file siz
8df0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d  e test.db-wal] }
8e00: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
8e10: 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 32 20 7b 20  er1-7.1.$tn.2 { 
8e20: 6c 69 73 74 20 24 4a 20 24 57 20 7d 20 5b 6c 69  list $J $W } [li
8e30: 73 74 20 24 6a 73 20 24 77 73 5d 0a 20 20 7d 0a  st $js $ws].  }.
8e40: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
8e50: 31 2d 37 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c  1-7.2.1 {.  faul
8e60: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
8e70: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
8e80: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f   {.    PRAGMA lo
8e90: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43  cking_mode = EXC
8ea0: 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 52 45 41  LUSIVE;.    CREA
8eb0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
8ec0: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
8ed0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
8ee0: 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65  al_mode = delete
8ef0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
8f00: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 74 72  ournal_mode = tr
8f10: 75 6e 63 61 74 65 3b 0a 20 20 7d 0a 7d 20 7b 65  uncate;.  }.} {e
8f20: 78 63 6c 75 73 69 76 65 20 64 65 6c 65 74 65 20  xclusive delete 
8f30: 74 72 75 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73  truncate}.do_tes
8f40: 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 32 20 7b  t pager1-7.2.2 {
8f50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
8f60: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8f70: 45 53 28 31 2c 20 32 29 20 7d 0a 20 20 65 78 65  ES(1, 2) }.  exe
8f80: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
8f90: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72  urnal_mode = per
8fa0: 73 69 73 74 20 7d 0a 7d 20 7b 74 72 75 6e 63 61  sist }.} {trunca
8fb0: 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  te}.do_test page
8fc0: 72 31 2d 37 2e 32 2e 33 20 7b 0a 20 20 65 78 65  r1-7.2.3 {.  exe
8fd0: 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a  csql { COMMIT }.
8fe0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
8ff0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
9000: 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20  ode = persist;. 
9010: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
9020: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 3b 0a 20 20  l_size_limit;.  
9030: 7d 0a 7d 20 7b 70 65 72 73 69 73 74 20 2d 31 7d  }.} {persist -1}
9040: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
9050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
9090: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
90a0: 74 73 2c 20 70 61 67 65 72 31 2d 38 2e 2a 2c 20  ts, pager1-8.*, 
90b0: 74 65 73 74 20 74 68 61 74 20 74 68 65 20 73 70  test that the sp
90c0: 65 63 69 61 6c 20 66 69 6c 65 6e 61 6d 65 73 20  ecial filenames 
90d0: 0a 23 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 61 6e  .# ":memory:" an
90e0: 64 20 22 22 20 6f 70 65 6e 20 74 65 6d 70 6f 72  d "" open tempor
90f0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 23  ary databases..#
9100: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 66 69 6c  .foreach {tn fil
9110: 65 6e 61 6d 65 7d 20 7b 0a 20 20 31 20 3a 6d 65  ename} {.  1 :me
9120: 6d 6f 72 79 3a 0a 20 20 32 20 22 22 0a 7d 20 7b  mory:.  2 "".} {
9130: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
9140: 31 2d 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  1-8.$tn.1 {.    
9150: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
9160: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64  and_reopen.    d
9170: 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69  b close.    sqli
9180: 74 65 33 20 64 62 20 24 66 69 6c 65 6e 61 6d 65  te3 db $filename
9190: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
91a0: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f       PRAGMA auto
91b0: 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20  _vacuum = 1;.   
91c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
91d0: 78 31 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53  x1(x);.      INS
91e0: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
91f0: 45 53 28 27 43 68 61 72 6c 65 73 27 29 3b 0a 20  ES('Charles');. 
9200: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9210: 20 78 31 20 56 41 4c 55 45 53 28 27 4a 61 6d 65   x1 VALUES('Jame
9220: 73 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  s');.      INSER
9230: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
9240: 28 27 4d 61 72 79 27 29 3b 0a 20 20 20 20 20 20  ('Mary');.      
9250: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31  SELECT * FROM x1
9260: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 43 68 61  ;.    }.  } {Cha
9270: 72 6c 65 73 20 4a 61 6d 65 73 20 4d 61 72 79 7d  rles James Mary}
9280: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
9290: 72 31 2d 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  r1-8.$tn.2 {.   
92a0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 24 66 69   sqlite3 db2 $fi
92b0: 6c 65 6e 61 6d 65 0a 20 20 20 20 63 61 74 63 68  lename.    catch
92c0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
92d0: 52 4f 4d 20 78 31 20 7d 20 64 62 32 0a 20 20 7d  ROM x1 } db2.  }
92e0: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62   {1 {no such tab
92f0: 6c 65 3a 20 78 31 7d 7d 0a 0a 20 20 64 6f 5f 65  le: x1}}..  do_e
9300: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
9310: 72 31 2d 38 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  r1-8.$tn.3 {.   
9320: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
9330: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
9340: 55 45 53 28 27 57 69 6c 6c 69 61 6d 27 29 3b 0a  UES('William');.
9350: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9360: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 41 6e 6e  O x1 VALUES('Ann
9370: 65 27 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  e');.    ROLLBAC
9380: 4b 3b 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d  K;.  } {}.}..#--
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 6e 65  -------.# The ne
93e0: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74  xt block of test
93f0: 73 20 2d 20 70 61 67 65 72 31 2d 39 2e 2a 20 2d  s - pager1-9.* -
9400: 20 64 65 61 6c 20 77 69 74 68 20 69 6e 74 65 72   deal with inter
9410: 61 63 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  actions between.
9420: 23 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  # the pager and 
9430: 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 2e 20  the backup API. 
9440: 54 65 73 74 20 63 61 73 65 73 3a 0a 23 0a 23 20  Test cases:.#.# 
9450: 20 20 70 61 67 65 72 31 2d 39 2e 31 2e 2a 3a 20    pager1-9.1.*: 
9460: 54 65 73 74 20 74 68 61 74 20 61 20 62 61 63 6b  Test that a back
9470: 75 70 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63  up completes suc
9480: 63 65 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69  cessfully even i
9490: 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  f the.#         
94a0: 20 20 20 20 20 20 20 20 73 6f 75 72 63 65 20 64          source d
94b0: 62 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  b is written to 
94c0: 64 75 72 69 6e 67 20 74 68 65 20 62 61 63 6b 75  during the backu
94d0: 70 20 6f 70 2e 0a 23 0a 23 20 20 20 70 61 67 65  p op..#.#   page
94e0: 72 31 2d 39 2e 32 2e 2a 3a 20 54 65 73 74 20 74  r1-9.2.*: Test t
94f0: 68 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d  hat a backup com
9500: 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75  pletes successfu
9510: 6c 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a  lly even if the.
9520: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
9530: 20 20 73 6f 75 72 63 65 20 64 62 20 69 73 20 77    source db is w
9540: 72 69 74 74 65 6e 20 74 6f 20 61 6e 64 20 74 68  ritten to and th
9550: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 64  en rolled back d
9560: 75 72 69 6e 67 20 61 20 0a 23 20 20 20 20 20 20  uring a .#      
9570: 20 20 20 20 20 20 20 20 20 20 20 62 61 63 6b 75             backu
9580: 70 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64  p operation..#.d
9590: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
95a0: 30 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  0.1 {.  faultsim
95b0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
95c0: 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  en.  db func a_s
95d0: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
95e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
95f0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
9600: 20 3d 20 31 30 3b 0a 20 20 20 20 42 45 47 49 4e   = 10;.    BEGIN
9610: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
9620: 41 42 4c 45 20 61 62 28 61 2c 20 62 2c 20 55 4e  ABLE ab(a, b, UN
9630: 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20  IQUE(a, b));.   
9640: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
9650: 62 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69  b VALUES( a_stri
9660: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
9670: 67 28 33 30 30 29 20 29 3b 0a 20 20 20 20 20 20  g(300) );.      
9680: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53  INSERT INTO ab S
9690: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
96a0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
96b0: 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20  0) FROM ab;.    
96c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
96d0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
96e0: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
96f0: 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20  300) FROM ab;.  
9700: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9710: 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  ab SELECT a_stri
9720: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
9730: 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a  g(300) FROM ab;.
9740: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9750: 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74  O ab SELECT a_st
9760: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
9770: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62  ing(300) FROM ab
9780: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9790: 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f  NTO ab SELECT a_
97a0: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
97b0: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
97c0: 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ab;.      INSERT
97d0: 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20   INTO ab SELECT 
97e0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
97f0: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
9800: 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45  M ab;.      INSE
9810: 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43  RT INTO ab SELEC
9820: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
9830: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
9840: 52 4f 4d 20 61 62 3b 0a 20 20 20 20 43 4f 4d 4d  ROM ab;.    COMM
9850: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  IT;.  }.} {}.do_
9860: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e  test pager1-9.0.
9870: 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  2 {.  sqlite3 db
9880: 32 20 74 65 73 74 2e 64 62 32 0a 20 20 64 62 32  2 test.db2.  db2
9890: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 63   eval { PRAGMA c
98a0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d  ache_size = 10 }
98b0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
98c0: 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20  p B db2 main db 
98d0: 6d 61 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73  main.  list [B s
98e0: 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69  tep 10000] [B fi
98f0: 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f  nish].} {SQLITE_
9900: 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a  DONE SQLITE_OK}.
9910: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9920: 2e 30 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b  .0.3 {. db one {
9930: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c  SELECT md5sum(a,
9940: 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b   b) FROM ab}.} [
9950: 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20  db2 one {SELECT 
9960: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9970: 4d 20 61 62 7d 5d 0a 0a 64 6f 5f 74 65 73 74 20  M ab}]..do_test 
9980: 70 61 67 65 72 31 2d 39 2e 31 2e 31 20 7b 0a 20  pager1-9.1.1 {. 
9990: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
99a0: 45 20 61 62 20 53 45 54 20 61 20 3d 20 61 5f 73  E ab SET a = a_s
99b0: 74 72 69 6e 67 28 32 30 31 29 20 7d 0a 20 20 73  tring(201) }.  s
99c0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20  qlite3_backup B 
99d0: 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e  db2 main db main
99e0: 0a 20 20 42 20 73 74 65 70 20 33 30 0a 7d 20 7b  .  B step 30.} {
99f0: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
9a00: 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 32 20  st pager1-9.1.2 
9a10: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50  {.  execsql { UP
9a20: 44 41 54 45 20 61 62 20 53 45 54 20 62 20 3d 20  DATE ab SET b = 
9a30: 61 5f 73 74 72 69 6e 67 28 33 30 31 29 20 7d 0a  a_string(301) }.
9a40: 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31    list [B step 1
9a50: 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d  0000] [B finish]
9a60: 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .} {SQLITE_DONE 
9a70: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
9a80: 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 33 20  st pager1-9.1.3 
9a90: 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  {. db one {SELEC
9aa0: 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46  T md5sum(a, b) F
9ab0: 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f  ROM ab}.} [db2 o
9ac0: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
9ad0: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
9ae0: 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ].do_test pager1
9af0: 2d 39 2e 31 2e 34 20 7b 20 65 78 65 63 73 71 6c  -9.1.4 { execsql
9b00: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
9b10: 2a 29 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b  *) FROM ab } } {
9b20: 31 32 38 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  128}..do_test pa
9b30: 67 65 72 31 2d 39 2e 32 2e 31 20 7b 0a 20 20 65  ger1-9.2.1 {.  e
9b40: 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20  xecsql { UPDATE 
9b50: 61 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72  ab SET a = a_str
9b60: 69 6e 67 28 32 30 32 29 20 7d 0a 20 20 73 71 6c  ing(202) }.  sql
9b70: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62  ite3_backup B db
9b80: 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20  2 main db main. 
9b90: 20 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51   B step 30.} {SQ
9ba0: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9bb0: 20 70 61 67 65 72 31 2d 39 2e 32 2e 32 20 7b 0a   pager1-9.2.2 {.
9bc0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
9bd0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
9be0: 44 41 54 45 20 61 62 20 53 45 54 20 62 20 3d 20  DATE ab SET b = 
9bf0: 61 5f 73 74 72 69 6e 67 28 33 30 31 29 3b 0a 20  a_string(301);. 
9c00: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d     ROLLBACK;.  }
9c10: 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20  .  list [B step 
9c20: 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68  10000] [B finish
9c30: 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45  ].} {SQLITE_DONE
9c40: 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74   SQLITE_OK}.do_t
9c50: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 33  est pager1-9.2.3
9c60: 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45   {. db one {SELE
9c70: 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20  CT md5sum(a, b) 
9c80: 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20  FROM ab}.} [db2 
9c90: 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73  one {SELECT md5s
9ca0: 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62  um(a, b) FROM ab
9cb0: 7d 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }].do_test pager
9cc0: 31 2d 39 2e 32 2e 34 20 7b 20 65 78 65 63 73 71  1-9.2.4 { execsq
9cd0: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
9ce0: 28 2a 29 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20  (*) FROM ab } } 
9cf0: 7b 31 32 38 7d 0a 64 62 20 63 6c 6f 73 65 0a 64  {128}.db close.d
9d00: 62 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73  b2 close..do_tes
9d10: 74 20 70 61 67 65 72 31 2d 39 2e 33 2e 31 20 7b  t pager1-9.3.1 {
9d20: 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
9d30: 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65  efault 1.  tv se
9d40: 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 20 20  ctorsize 4096.  
9d50: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
9d60: 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 65 78  and_reopen..  ex
9d70: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 70  ecsql { PRAGMA p
9d80: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 20  age_size = 1024 
9d90: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20  }.  for {set ii 
9da0: 30 7d 20 7b 24 69 69 20 3c 20 34 7d 20 7b 69 6e  0} {$ii < 4} {in
9db0: 63 72 20 69 69 7d 20 7b 20 65 78 65 63 73 71 6c  cr ii} { execsql
9dc0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   "CREATE TABLE t
9dd0: 24 7b 69 69 7d 28 61 2c 20 62 29 22 20 7d 0a 7d  ${ii}(a, b)" }.}
9de0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65   {}.do_test page
9df0: 72 31 2d 39 2e 33 2e 32 20 7b 0a 20 20 73 71 6c  r1-9.3.2 {.  sql
9e00: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
9e10: 32 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  2..  execsql {. 
9e20: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
9e30: 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  ize = 4096;.    
9e40: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
9e50: 75 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20 43 52  us = OFF;.    CR
9e60: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
9e70: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
9e80: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
9e90: 20 20 7d 20 64 62 32 0a 0a 20 20 73 71 6c 69 74    } db2..  sqlit
9ea0: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
9eb0: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42  main db main.  B
9ec0: 20 73 74 65 70 20 33 30 0a 20 20 6c 69 73 74 20   step 30.  list 
9ed0: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
9ee0: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
9ef0: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
9f00: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9f10: 72 31 2d 39 2e 33 2e 33 20 7b 0a 20 20 64 62 32  r1-9.3.3 {.  db2
9f20: 20 63 6c 6f 73 65 0a 20 20 64 62 20 63 6c 6f 73   close.  db clos
9f30: 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 20 20  e.  tv delete.  
9f40: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
9f50: 62 32 0a 7d 20 5b 66 69 6c 65 20 73 69 7a 65 20  b2.} [file size 
9f60: 74 65 73 74 2e 64 62 5d 0a 0a 64 6f 5f 74 65 73  test.db]..do_tes
9f70: 74 20 70 61 67 65 72 31 2d 39 2e 34 2e 31 20 7b  t pager1-9.4.1 {
9f80: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
9f90: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
9fa0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
9fb0: 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b  .db2.  execsql {
9fc0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
9fd0: 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20  _size = 4096;.  
9fe0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9ff0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
a000: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
a010: 62 29 3b 0a 20 20 7d 20 64 62 32 0a 20 20 73 71  b);.  } db2.  sq
a020: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
a030: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
a040: 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31    list [B step 1
a050: 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d  0000] [B finish]
a060: 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .} {SQLITE_DONE 
a070: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
a080: 73 74 20 70 61 67 65 72 31 2d 39 2e 34 2e 32 20  st pager1-9.4.2 
a090: 7b 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73  {.  list [file s
a0a0: 69 7a 65 20 74 65 73 74 2e 64 62 32 5d 20 5b 66  ize test.db2] [f
a0b0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
a0c0: 5d 0a 7d 20 7b 30 20 30 7d 0a 64 62 32 20 63 6c  ].} {0 0}.db2 cl
a0d0: 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ose..#----------
a0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
a120: 23 20 54 65 73 74 20 74 68 61 74 20 72 65 67 61  # Test that rega
a130: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
a140: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
a150: 78 53 65 63 74 6f 72 53 69 7a 65 28 29 2c 20 74  xSectorSize(), t
a160: 68 65 0a 23 20 6d 69 6e 69 6d 75 6d 20 65 66 66  he.# minimum eff
a170: 65 63 74 69 76 65 20 73 65 63 74 6f 72 2d 73 69  ective sector-si
a180: 7a 65 20 69 73 20 35 31 32 20 61 6e 64 20 74 68  ze is 512 and th
a190: 65 20 6d 61 78 69 6d 75 6d 20 36 35 35 33 36 20  e maximum 65536 
a1a0: 62 79 74 65 73 2e 0a 23 0a 74 65 73 74 76 66 73  bytes..#.testvfs
a1b0: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 66   tv -default 1.f
a1c0: 6f 72 65 61 63 68 20 73 65 63 74 6f 72 73 69 7a  oreach sectorsiz
a1d0: 65 20 7b 0a 20 20 20 20 33 32 20 20 20 36 34 20  e {.    32   64 
a1e0: 20 20 31 32 38 20 20 20 32 35 36 20 20 20 35 31    128   256   51
a1f0: 32 20 20 20 31 30 32 34 20 20 20 32 30 34 38 20  2   1024   2048 
a200: 0a 20 20 20 20 34 30 39 36 20 38 31 39 32 20 31  .    4096 8192 1
a210: 36 33 38 34 20 33 32 37 36 38 20 36 35 35 33 36  6384 32768 65536
a220: 20 31 33 31 30 37 32 20 32 36 32 31 34 34 0a 7d   131072 262144.}
a230: 20 7b 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69   {.  tv sectorsi
a240: 7a 65 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20  ze $sectorsize. 
a250: 20 74 76 20 64 65 76 63 68 61 72 20 7b 7d 0a 20   tv devchar {}. 
a260: 20 73 65 74 20 65 66 66 20 24 73 65 63 74 6f 72   set eff $sector
a270: 73 69 7a 65 0a 20 20 69 66 20 7b 24 73 65 63 74  size.  if {$sect
a280: 6f 72 73 69 7a 65 20 3c 20 35 31 32 7d 20 20 20  orsize < 512}   
a290: 7b 20 73 65 74 20 65 66 66 20 35 31 32 20 7d 0a  { set eff 512 }.
a2a0: 20 20 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a    if {$sectorsiz
a2b0: 65 20 3e 20 36 35 35 33 36 7d 20 7b 20 73 65 74  e > 65536} { set
a2c0: 20 65 66 66 20 36 35 35 33 36 20 7d 0a 0a 20 20   eff 65536 }..  
a2d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
a2e0: 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 31 20  0.$sectorsize.1 
a2f0: 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64  {.    faultsim_d
a300: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
a310: 0a 20 20 20 20 64 62 20 66 75 6e 63 20 61 5f 73  .    db func a_s
a320: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
a330: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
a340: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
a350: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
a360: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70  ;.      PRAGMA p
a370: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
a380: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
a390: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
a3a0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
a3b0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a3c0: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t2(a, b);.    
a3d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a3e0: 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t3(a, b);.     
a3f0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20   COMMIT;.    }. 
a400: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
a410: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d  t.db-journal.  }
a420: 20 5b 65 78 70 72 20 24 73 65 63 74 6f 72 73 69   [expr $sectorsi
a430: 7a 65 20 3e 20 36 35 35 33 36 20 3f 20 36 35 35  ze > 65536 ? 655
a440: 33 36 20 3a 20 24 73 65 63 74 6f 72 73 69 7a 65  36 : $sectorsize
a450: 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  ]..  do_test pag
a460: 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69  er1-10.$sectorsi
a470: 7a 65 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  ze.2 {.    execs
a480: 71 6c 20 7b 20 0a 20 20 20 20 20 20 49 4e 53 45  ql { .      INSE
a490: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
a4a0: 53 28 61 5f 73 74 72 69 6e 67 28 33 30 30 29 2c  S(a_string(300),
a4b0: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b   a_string(300));
a4c0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
a4d0: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46  TO t3 SELECT * F
a4e0: 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f  ROM t3;        /
a4f0: 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  2 */.      IN
a500: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
a510: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20  ECT * FROM t3;  
a520: 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20        /*  4 */. 
a530: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
a540: 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t3 SELECT * FRO
a550: 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20  M t3;        /* 
a560: 20 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   8 */.      INSE
a570: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
a580: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20  T * FROM t3;    
a590: 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20      /* 16 */.   
a5a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a5b0: 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  3 SELECT * FROM 
a5c0: 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 33 32  t3;        /* 32
a5d0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d   */.    }.  } {}
a5e0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
a5f0: 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a  r1-10.$sectorsiz
a600: 65 2e 33 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f  e.3 {.    db clo
a610: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  se.    sqlite3 d
a620: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  b test.db.    ex
a630: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 50  ecsql { .      P
a640: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
a650: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 42 45 47   = 10;.      BEG
a660: 49 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  IN;.    }.    re
a670: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33  cursive_select 3
a680: 32 20 74 33 20 7b 64 62 20 65 76 61 6c 20 22 49  2 t3 {db eval "I
a690: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
a6a0: 4c 55 45 53 28 31 2c 20 32 29 22 7d 0a 20 20 20  LUES(1, 2)"}.   
a6b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
a6c0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53   COMMIT;.      S
a6d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
a6e0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d  .    }.  } {1 2}
a6f0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
a700: 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a  r1-10.$sectorsiz
a710: 65 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71  e.4 {.    execsq
a720: 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
a730: 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b   TABLE t6(a, b);
a740: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
a750: 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a 20 20  BLE t7(a, b);.  
a760: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a770: 20 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t5(a, b);.     
a780: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 36 3b 0a   DROP TABLE t6;.
a790: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
a7a0: 20 74 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   t7;.    }.    e
a7b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42  xecsql {.      B
a7c0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52  EGIN;.        CR
a7d0: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c  EATE TABLE t6(a,
a7e0: 20 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   b);.    }.    r
a7f0: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
a800: 33 32 20 74 33 20 7b 64 62 20 65 76 61 6c 20 22  32 t3 {db eval "
a810: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
a820: 41 4c 55 45 53 28 31 2c 20 32 29 22 7d 0a 20 20  ALUES(1, 2)"}.  
a830: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a840: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20    COMMIT;.      
a850: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35  SELECT * FROM t5
a860: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32  ;.    }.  } {1 2
a870: 7d 0a 20 20 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a  }.  .}.db close.
a880: 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34  .tv sectorsize 4
a890: 30 39 36 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  096.do_test page
a8a0: 72 31 2e 31 30 2e 78 2e 31 20 7b 0a 20 20 66 61  r1.10.x.1 {.  fa
a8b0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
a8c0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
a8d0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
a8e0: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6e 6f  auto_vacuum = no
a8f0: 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  ne;.    PRAGMA p
a900: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
a910: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
a920: 45 20 74 31 28 78 29 3b 0a 20 20 7d 0a 20 20 66  E t1(x);.  }.  f
a930: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
a940: 3c 33 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  <30} {incr i} {.
a950: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
a960: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
a970: 55 45 53 28 7a 65 72 6f 62 6c 6f 62 28 39 30 30  UES(zeroblob(900
a980: 29 29 20 7d 0a 20 20 7d 0a 20 20 66 69 6c 65 20  )) }.  }.  file 
a990: 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b  size test.db.} {
a9a0: 33 32 37 36 38 7d 0a 64 6f 5f 74 65 73 74 20 70  32768}.do_test p
a9b0: 61 67 65 72 31 2e 31 30 2e 78 2e 32 20 7b 0a 20  ager1.10.x.2 {. 
a9c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
a9d0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
a9e0: 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c  );.    DROP TABL
a9f0: 45 20 74 32 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  E t2;.  }.  file
aa00: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
aa10: 7b 33 33 37 39 32 7d 0a 64 6f 5f 74 65 73 74 20  {33792}.do_test 
aa20: 70 61 67 65 72 31 2e 31 30 2e 78 2e 33 20 7b 0a  pager1.10.x.3 {.
aa30: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
aa40: 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54  BEGIN;.    CREAT
aa50: 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20  E TABLE t2(x);. 
aa60: 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73   }.  recursive_s
aa70: 65 6c 65 63 74 20 33 30 20 74 31 0a 20 20 65 78  elect 30 t1.  ex
aa80: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
aa90: 54 45 20 54 41 42 4c 45 20 74 33 28 78 29 3b 0a  TE TABLE t3(x);.
aaa0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
aab0: 7d 20 7b 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74  } {}..db close.t
aac0: 76 20 64 65 6c 65 74 65 0a 0a 74 65 73 74 76 66  v delete..testvf
aad0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
aae0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
aaf0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75  and_reopen.db fu
ab00: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
ab10: 72 69 6e 67 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ring.do_execsql_
ab20: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 31  test pager1-11.1
ab30: 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72   {.  PRAGMA jour
ab40: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
ab50: 45 3b 0a 20 20 50 52 41 47 4d 41 20 63 61 63 68  E;.  PRAGMA cach
ab60: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42  e_size = 10;.  B
ab70: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
ab80: 20 54 41 42 4c 45 20 7a 7a 28 74 6f 70 20 50 52   TABLE zz(top PR
ab90: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
aba0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 56  INSERT INTO zz V
abb0: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32  ALUES(a_string(2
abc0: 32 32 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  22));.    INSERT
abd0: 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20   INTO zz SELECT 
abe0: 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54  a_string((SELECT
abf0: 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20   222+max(rowid) 
ac00: 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a  FROM zz)) FROM z
ac10: 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  z;.    INSERT IN
ac20: 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73  TO zz SELECT a_s
ac30: 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32  tring((SELECT 22
ac40: 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f  2+max(rowid) FRO
ac50: 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a  M zz)) FROM zz;.
ac60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ac70: 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  zz SELECT a_stri
ac80: 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d  ng((SELECT 222+m
ac90: 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a  ax(rowid) FROM z
aca0: 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20  z)) FROM zz;.   
acb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20   INSERT INTO zz 
acc0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
acd0: 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28  (SELECT 222+max(
ace0: 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29  rowid) FROM zz))
acf0: 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e   FROM zz;.    IN
ad00: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c  SERT INTO zz SEL
ad10: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45  ECT a_string((SE
ad20: 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77  LECT 222+max(row
ad30: 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52  id) FROM zz)) FR
ad40: 4f 4d 20 7a 7a 3b 0a 20 20 43 4f 4d 4d 49 54 3b  OM zz;.  COMMIT;
ad50: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 55 50  .  BEGIN;.    UP
ad60: 44 41 54 45 20 7a 7a 20 53 45 54 20 74 6f 70 20  DATE zz SET top 
ad70: 3d 20 61 5f 73 74 72 69 6e 67 28 33 34 35 29 3b  = a_string(345);
ad80: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 0a 70 72 6f  .} {delete}..pro
ad90: 63 20 6c 6f 63 6b 6f 75 74 20 7b 6d 65 74 68 6f  c lockout {metho
ada0: 64 20 61 72 67 73 7d 20 7b 20 72 65 74 75 72 6e  d args} { return
adb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7d 0a   SQLITE_IOERR }.
adc0: 74 76 20 73 63 72 69 70 74 20 6c 6f 63 6b 6f 75  tv script lockou
add0: 74 0a 74 76 20 66 69 6c 74 65 72 20 7b 78 57 72  t.tv filter {xWr
ade0: 69 74 65 20 78 54 72 75 6e 63 61 74 65 20 78 53  ite xTruncate xS
adf0: 79 6e 63 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  ync}.do_catchsql
ae00: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e  _test pager1-11.
ae10: 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 31 20  2 { COMMIT } {1 
ae20: 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d  {disk I/O error}
ae30: 7d 0a 0a 74 76 20 73 63 72 69 70 74 20 7b 7d 0a  }..tv script {}.
ae40: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
ae50: 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  1.3 {.  sqlite3 
ae60: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78  db2 test.db.  ex
ae70: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
ae80: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
ae90: 3d 20 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20  = TRUNCATE;.    
aea0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
aeb0: 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 64 62 32 0a  _check;.  } db2.
aec0: 7d 20 7b 74 72 75 6e 63 61 74 65 20 6f 6b 7d 0a  } {truncate ok}.
aed0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
aee0: 31 2e 34 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73  1.4 {.  db2 clos
aef0: 65 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20  e.  file exists 
af00: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
af10: 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {0}.do_execsql
af20: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e  _test pager1-11.
af30: 35 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  5 { SELECT count
af40: 28 2a 29 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b 33  (*) FROM zz } {3
af50: 32 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  2}.db close.tv d
af60: 65 6c 65 74 65 0a 20 20 0a 23 2d 2d 2d 2d 2d 2d  elete.  .#------
af70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
afa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
afb0: 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50 52 41 47  ---.# Test "PRAG
afc0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a 23 0a  MA page_size".#.
afd0: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
afe0: 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73  ult 1.tv sectors
aff0: 69 7a 65 20 31 30 32 34 0a 66 6f 72 65 61 63 68  ize 1024.foreach
b000: 20 70 61 67 65 73 69 7a 65 20 7b 0a 20 20 20 20   pagesize {.    
b010: 35 31 32 20 20 20 31 30 32 34 20 20 20 32 30 34  512   1024   204
b020: 38 20 34 30 39 36 20 38 31 39 32 20 31 36 33 38  8 4096 8192 1638
b030: 34 20 33 32 37 36 38 20 0a 7d 20 7b 0a 20 20 66  4 32768 .} {.  f
b040: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
b050: 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 23 20 54  nd_reopen..  # T
b060: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 28  he sector-size (
b070: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
b080: 20 56 46 53 29 20 69 73 20 31 30 32 34 20 62 79   VFS) is 1024 by
b090: 74 65 73 2e 20 53 6f 20 69 66 20 74 68 65 0a 20  tes. So if the. 
b0a0: 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72 65 71   # page-size req
b0b0: 75 65 73 74 65 64 20 75 73 69 6e 67 20 22 50 52  uested using "PR
b0c0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 20  AGMA page_size" 
b0d0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
b0e0: 74 68 65 0a 20 20 23 20 63 6f 6d 70 69 6c 65 20  the.  # compile 
b0f0: 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51  time value of SQ
b100: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
b110: 5a 45 2c 20 74 68 65 6e 20 74 68 65 20 65 66 66  ZE, then the eff
b120: 65 63 74 69 76 65 20 0a 20 20 23 20 70 61 67 65  ective .  # page
b130: 2d 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 31 30  -size remains 10
b140: 32 34 20 62 79 74 65 73 2e 0a 20 20 23 0a 20 20  24 bytes..  #.  
b150: 73 65 74 20 65 66 66 20 24 70 61 67 65 73 69 7a  set eff $pagesiz
b160: 65 0a 20 20 69 66 20 7b 24 65 66 66 20 3e 20 24  e.  if {$eff > $
b170: 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  ::SQLITE_MAX_PAG
b180: 45 5f 53 49 5a 45 7d 20 7b 20 73 65 74 20 65 66  E_SIZE} { set ef
b190: 66 20 31 30 32 34 20 7d 0a 0a 20 20 64 6f 5f 74  f 1024 }..  do_t
b1a0: 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70  est pager1-12.$p
b1b0: 61 67 65 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20  agesize.1 {.    
b1c0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
b1d0: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
b1e0: 22 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70  ".      PRAGMA p
b1f0: 61 67 65 5f 73 69 7a 65 20 3d 20 24 70 61 67 65  age_size = $page
b200: 73 69 7a 65 3b 0a 20 20 20 20 20 20 43 52 45 41  size;.      CREA
b210: 54 45 20 56 49 45 57 20 76 20 41 53 20 53 45 4c  TE VIEW v AS SEL
b220: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
b230: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 22 20  e_master;.    " 
b240: 64 62 32 0a 20 20 20 20 66 69 6c 65 20 73 69 7a  db2.    file siz
b250: 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 24 65  e test.db.  } $e
b260: 66 66 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  ff.  do_test pag
b270: 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65  er1-12.$pagesize
b280: 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .2 {.    sqlite3
b290: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20   db2 test.db.   
b2a0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
b2b0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
b2c0: 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20  ) FROM v;.      
b2d0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65  PRAGMA main.page
b2e0: 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 20 64 62 32  _size;.    } db2
b2f0: 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 66  .  } [list 1 $ef
b300: 66 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  f].  do_test pag
b310: 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65  er1-12.$pagesize
b320: 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .3 {.    execsql
b330: 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54   { .      SELECT
b340: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76   count(*) FROM v
b350: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d  ;.      PRAGMA m
b360: 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20  ain.page_size;. 
b370: 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 31     }.  } [list 1
b380: 20 24 65 66 66 5d 0a 20 20 64 62 32 20 63 6c 6f   $eff].  db2 clo
b390: 73 65 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  se.}.db close.tv
b3a0: 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d   delete..#------
b3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3f0: 2d 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63 61  ---.# Test speca
b400: 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  l "PRAGMA journa
b410: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
b420: 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20  test cases..#.# 
b430: 70 61 67 65 72 31 2d 31 33 2e 31 2e 2a 3a 20 54  pager1-13.1.*: T
b440: 68 69 73 20 74 65 73 74 73 20 61 20 73 70 65 63  his tests a spec
b450: 69 61 6c 20 63 61 73 65 20 65 6e 63 6f 75 6e 74  ial case encount
b460: 65 72 65 64 20 69 6e 20 70 65 72 73 69 73 74 65  ered in persiste
b470: 6e 74 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  nt .#           
b480: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64       journal mod
b490: 65 3a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  e: If the journa
b4a0: 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  l associated wit
b4b0: 68 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  h a transaction.
b4c0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
b4d0: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
b4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b4f0: 65 20 28 62 65 63 61 75 73 65 20 61 20 70 72 65  e (because a pre
b500: 76 69 6f 75 73 20 0a 23 20 20 20 20 20 20 20 20  vious .#        
b510: 20 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74          transact
b520: 69 6f 6e 20 6c 65 66 74 20 61 20 76 65 72 79 20  ion left a very 
b530: 6c 61 72 67 65 20 6e 6f 6e 2d 68 6f 74 20 6a 6f  large non-hot jo
b540: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68  urnal file in th
b550: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
b560: 20 20 20 66 69 6c 65 2d 73 79 73 74 65 6d 29 2c     file-system),
b570: 20 74 68 65 6e 20 53 51 4c 69 74 65 20 68 61 73   then SQLite has
b580: 20 74 6f 20 62 65 20 63 61 72 65 66 75 6c 20 74   to be careful t
b590: 68 61 74 20 74 68 65 72 65 20 69 73 0a 23 20 20  hat there is.#  
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f                no
b5b0: 74 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  t a journal-head
b5c0: 65 72 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  er left over fro
b5d0: 6d 20 61 20 70 72 65 76 69 6f 75 73 20 74 72 61  m a previous tra
b5e0: 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20  nsaction.#      
b5f0: 20 20 20 20 20 20 20 20 20 20 69 6d 6d 65 64 69            immedi
b600: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
b610: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  the journal cont
b620: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
b630: 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  ..#             
b640: 20 20 20 49 66 20 74 68 65 72 65 20 69 73 2c 20     If there is, 
b650: 61 6e 64 20 74 68 65 20 70 72 6f 63 65 73 73 20  and the process 
b660: 63 72 61 73 68 65 73 20 73 6f 20 74 68 61 74 20  crashes so that 
b670: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 20 20  the journal.#   
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63               bec
b690: 6f 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  omes a hot-journ
b6a0: 61 6c 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72  al and must be r
b6b0: 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 61 6e  olled back by an
b6c0: 6f 74 68 65 72 0a 23 20 20 20 20 20 20 20 20 20  other.#         
b6d0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 2c 20         process, 
b6e0: 74 68 65 72 65 20 69 73 20 61 20 64 61 6e 67 65  there is a dange
b6f0: 72 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  r that the other
b700: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 72 6f 6c   process may rol
b710: 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  l.#             
b720: 20 20 20 62 61 63 6b 20 74 68 65 20 61 62 6f 72     back the abor
b730: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ted transaction,
b740: 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 63   then continue c
b750: 6f 70 79 69 6e 67 20 64 61 74 61 0a 23 20 20 20  opying data.#   
b760: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
b770: 6d 20 61 6e 20 6f 6c 64 65 72 20 74 72 61 6e 73  m an older trans
b780: 61 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  action from the 
b790: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
b7a0: 20 6a 6f 75 72 6e 61 6c 2e 0a 23 20 20 20 20 20   journal..#     
b7b0: 20 20 20 20 20 20 20 20 20 20 20 53 65 65 20 74             See t
b7c0: 68 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  he syncJournal()
b7d0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65   function for de
b7e0: 74 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65 72  tails..#.# pager
b7f0: 31 2d 31 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74  1-13.2.*: Same t
b800: 65 73 74 20 61 73 20 74 68 65 20 70 72 65 76 69  est as the previ
b810: 6f 75 73 2e 20 54 68 69 73 20 74 69 6d 65 2c 20  ous. This time, 
b820: 74 68 72 6f 77 20 61 6e 20 69 6e 64 65 78 20 69  throw an index i
b830: 6e 74 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20  nto.#           
b840: 20 20 20 20 20 74 68 65 20 6d 69 78 20 74 6f 20       the mix to 
b850: 6d 61 6b 65 20 74 68 65 20 69 6e 74 65 67 72 69  make the integri
b860: 74 79 2d 63 68 65 63 6b 20 6d 6f 72 65 20 6c 69  ty-check more li
b870: 6b 65 6c 79 20 74 6f 20 63 61 74 63 68 0a 23 20  kely to catch.# 
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
b890: 72 72 6f 72 73 2e 0a 23 0a 74 65 73 74 76 66 73  rrors..#.testvfs
b8a0: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74   tv -default 1.t
b8b0: 76 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62  v script xSyncCb
b8c0: 0a 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e 63  .tv filter xSync
b8d0: 0a 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 6d  .proc xSyncCb {m
b8e0: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
b8f0: 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 74 20 5b  rgs} {.  set t [
b900: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e  file tail $filen
b910: 61 6d 65 5d 0a 20 20 69 66 20 7b 24 74 20 3d 3d  ame].  if {$t ==
b920: 20 22 74 65 73 74 2e 64 62 22 7d 20 66 61 75 6c   "test.db"} faul
b930: 74 73 69 6d 5f 73 61 76 65 0a 20 20 72 65 74 75  tsim_save.  retu
b940: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66  rn SQLITE_OK.}.f
b950: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
b960: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e  nd_reopen.db fun
b970: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
b980: 69 6e 67 0a 0a 23 20 54 68 65 20 55 50 44 41 54  ing..# The UPDAT
b990: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 74 20 74  E statement at t
b9a0: 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 74  he end of this t
b9b0: 65 73 74 20 63 61 73 65 20 63 72 65 61 74 65 73  est case creates
b9c0: 20 61 20 72 65 61 6c 6c 79 20 62 69 67 0a 23 20   a really big.# 
b9d0: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 74  journal. Since t
b9e0: 68 65 20 63 61 63 68 65 2d 73 69 7a 65 20 69 73  he cache-size is
b9f0: 20 6f 6e 6c 79 20 31 30 20 70 61 67 65 73 2c 20   only 10 pages, 
ba00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  the journal cont
ba10: 61 69 6e 73 20 0a 23 20 66 72 65 71 75 65 6e 74  ains .# frequent
ba20: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
ba30: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
ba40: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e  est pager1-13.1.
ba50: 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61 67  1 {.  PRAGMA pag
ba60: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
ba70: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
ba80: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
ba90: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
baa0: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49  ize = 10;.  BEGI
bab0: 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  N;.    CREATE TA
bac0: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
bad0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
bae0: 42 4c 4f 42 29 3b 0a 20 20 20 20 49 4e 53 45 52  BLOB);.    INSER
baf0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
bb00: 28 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28  (NULL, a_string(
bb10: 34 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  400));.    INSER
bb20: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
bb30: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
bb40: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  400) FROM t1;   
bb50: 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f         /*   2 */
bb60: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
bb70: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
bb80: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
bb90: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
bba0: 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 49   /*   4 */.    I
bbb0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
bbc0: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
bbd0: 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31  ing(400) FROM t1
bbe0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20  ;          /*   
bbf0: 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  8 */.    INSERT 
bc00: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e  INTO t1 SELECT N
bc10: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  ULL, a_string(40
bc20: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
bc30: 20 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20       /*  16 */. 
bc40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
bc50: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  1 SELECT NULL, a
bc60: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
bc70: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f  M t1;          /
bc80: 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53  *  32 */.    INS
bc90: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
bca0: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
bcb0: 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(400) FROM t1; 
bcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 36 34 20           /*  64 
bcd0: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
bce0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
bcf0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  L, a_string(400)
bd00: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
bd10: 20 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 43     /* 128 */.  C
bd20: 4f 4d 4d 49 54 3b 0a 20 20 55 50 44 41 54 45 20  OMMIT;.  UPDATE 
bd30: 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  t1 SET b = a_str
bd40: 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 70 65 72  ing(400);.} {per
bd50: 73 69 73 74 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63  sist}..if {$::tc
bd60: 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
bd70: 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d  orm)!="windows"}
bd80: 20 7b 0a 23 20 52 75 6e 20 74 72 61 6e 73 61 63   {.# Run transac
bd90: 74 69 6f 6e 73 20 6f 66 20 69 6e 63 72 65 61 73  tions of increas
bda0: 69 6e 67 20 73 69 7a 65 73 2e 20 45 76 65 6e 74  ing sizes. Event
bdb0: 75 61 6c 6c 79 2c 20 6f 6e 65 20 28 6f 72 20 6d  ually, one (or m
bdc0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 29 0a 23 20  ore than one).# 
bdd0: 6f 66 20 74 68 65 73 65 20 77 69 6c 6c 20 77 72  of these will wr
bde0: 69 74 65 20 6a 75 73 74 20 65 6e 6f 75 67 68 20  ite just enough 
bdf0: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 6f 6e 65  content that one
be00: 20 6f 66 20 74 68 65 20 6f 6c 64 20 68 65 61 64   of the old head
be10: 65 72 73 20 63 72 65 61 74 65 64 20 0a 23 20 62  ers created .# b
be20: 79 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  y the transactio
be30: 6e 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  n in the block a
be40: 62 6f 76 65 20 6c 69 65 73 20 69 6d 6d 65 64 69  bove lies immedi
be50: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
be60: 63 6f 6e 74 65 6e 74 0a 23 20 6a 6f 75 72 6e 61  content.# journa
be70: 6c 6c 65 64 20 62 79 20 74 68 65 20 63 75 72 72  lled by the curr
be80: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
be90: 0a 23 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70 20  .#.for {set nUp 
bea0: 31 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e  1} {$nUp<64} {in
beb0: 63 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65  cr nUp} {.  do_e
bec0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
bed0: 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 31  r1-13.1.2.$nUp.1
bee0: 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 74   { .    UPDATE t
bef0: 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  1 SET b = a_stri
bf00: 6e 67 28 33 39 39 29 20 57 48 45 52 45 20 61 20  ng(399) WHERE a 
bf10: 3c 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20  <= $nUp.  } {}. 
bf20: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
bf30: 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24   pager1-13.1.2.$
bf40: 6e 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20 69  nUp.2 { PRAGMA i
bf50: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
bf60: 20 7b 6f 6b 7d 20 0a 0a 20 20 23 20 54 72 79 20   {ok} ..  # Try 
bf70: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 73 6e  to access the sn
bf80: 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 66 69  apshot of the fi
bf90: 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 23 0a 20  le-system..  #. 
bfa0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f   sqlite3 db2 sv_
bfb0: 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73  test.db.  do_tes
bfc0: 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e  t pager1-13.1.2.
bfd0: 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65  $nUp.3 {.    exe
bfe0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75  csql { SELECT su
bff0: 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f  m(length(b)) FRO
c000: 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b  M t1 } db2.  } [
c010: 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20  expr {128*400 - 
c020: 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f  ($nUp-1)}].  do_
c030: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31  test pager1-13.1
c040: 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20  .2.$nUp.4 {.    
c050: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
c060: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
c070: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a   } db2.  } {ok}.
c080: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a    db2 close.}.}.
c090: 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74  .if {$::tcl_plat
c0a0: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d  form(platform)!=
c0b0: 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 53  "windows"} {.# S
c0c0: 61 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76  ame test as abov
c0d0: 65 2e 20 42 75 74 20 74 68 69 73 20 74 69 6d 65  e. But this time
c0e0: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 6f   with an index o
c0f0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a 64  n the table..#.d
c100: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
c110: 61 67 65 72 31 2d 31 33 2e 32 2e 31 20 7b 0a 20  ager1-13.2.1 {. 
c120: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
c130: 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 55 50 44   ON t1(b);.  UPD
c140: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61  ATE t1 SET b = a
c150: 5f 73 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20  _string(400);.} 
c160: 7b 7d 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70 20  {}.for {set nUp 
c170: 31 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e  1} {$nUp<64} {in
c180: 63 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65  cr nUp} {.  do_e
c190: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
c1a0: 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 31  r1-13.2.2.$nUp.1
c1b0: 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 74   { .    UPDATE t
c1c0: 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  1 SET b = a_stri
c1d0: 6e 67 28 33 39 39 29 20 57 48 45 52 45 20 61 20  ng(399) WHERE a 
c1e0: 3c 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20  <= $nUp.  } {}. 
c1f0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
c200: 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24   pager1-13.2.2.$
c210: 6e 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20 69  nUp.2 { PRAGMA i
c220: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
c230: 20 7b 6f 6b 7d 20 0a 20 20 73 71 6c 69 74 65 33   {ok} .  sqlite3
c240: 20 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a   db2 sv_test.db.
c250: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
c260: 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 33 20 7b  -13.2.2.$nUp.3 {
c270: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
c280: 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68  ELECT sum(length
c290: 28 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64  (b)) FROM t1 } d
c2a0: 62 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32  b2.  } [expr {12
c2b0: 38 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29  8*400 - ($nUp-1)
c2c0: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }].  do_test pag
c2d0: 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e  er1-13.2.2.$nUp.
c2e0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
c2f0: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
c300: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20  ty_check } db2. 
c310: 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c   } {ok}.  db2 cl
c320: 6f 73 65 0a 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73  ose.}.}..db clos
c330: 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d  e.tv delete..#--
c340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c380: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73  -------.# Test s
c390: 70 65 63 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f  pecal "PRAGMA jo
c3a0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 20  urnal_mode=OFF" 
c3b0: 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 66 61  test cases..#.fa
c3c0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
c3d0: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63  d_reopen.do_exec
c3e0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
c3f0: 31 34 2e 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d  14.1.1 {.  PRAGM
c400: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
c410: 20 4f 46 46 3b 0a 20 20 43 52 45 41 54 45 20 54   OFF;.  CREATE T
c420: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
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 31 2c 20 32 29 3b 0a 20 20 43 4f 4d 4d 49  S(1, 2);.  COMMI
c460: 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  T;.  SELECT * FR
c470: 4f 4d 20 74 31 3b 0a 7d 20 7b 6f 66 66 20 31 20  OM t1;.} {off 1 
c480: 32 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  2}.do_catchsql_t
c490: 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e  est pager1-14.1.
c4a0: 32 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  2 {.  BEGIN;.   
c4b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
c4c0: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
c4d0: 52 4f 4c 4c 42 41 43 4b 3b 0a 7d 20 7b 30 20 7b  ROLLBACK;.} {0 {
c4e0: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
c4f0: 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 33  st pager1-14.1.3
c500: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
c510: 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 7d 0a 64  OM t1;.} {1 2}.d
c520: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
c530: 70 61 67 65 72 31 2d 31 34 2e 31 2e 34 20 7b 0a  pager1-14.1.4 {.
c540: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
c550: 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77 69  ERT INTO t1(rowi
c560: 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54 20  d, a, b) SELECT 
c570: 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20 74  a+3, b, b FROM t
c580: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
c590: 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20  TO t1(rowid, a, 
c5a0: 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62  b) SELECT a+3, b
c5b0: 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b  , b FROM t1;.} {
c5c0: 31 20 7b 50 52 49 4d 41 52 59 20 4b 45 59 20 6d  1 {PRIMARY KEY m
c5d0: 75 73 74 20 62 65 20 75 6e 69 71 75 65 7d 7d 0a  ust be unique}}.
c5e0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
c5f0: 70 61 67 65 72 31 2d 31 34 2e 31 2e 35 20 7b 0a  pager1-14.1.5 {.
c600: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45    COMMIT;.  SELE
c610: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  CT * FROM t1;.} 
c620: 7b 31 20 32 20 32 20 32 7d 0a 0a 23 2d 2d 2d 2d  {1 2 2 2}..#----
c630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c670: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 6f 70 65  -----.# Test ope
c680: 6e 69 6e 67 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ning and closing
c690: 20 74 68 65 20 70 61 67 65 72 20 73 75 62 2d 73   the pager sub-s
c6a0: 79 73 74 65 6d 20 77 69 74 68 20 64 69 66 66 65  ystem with diffe
c6b0: 72 65 6e 74 20 76 61 6c 75 65 73 0a 23 20 66 6f  rent values.# fo
c6c0: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  r the sqlite3_vf
c6d0: 73 2e 73 7a 4f 73 46 69 6c 65 20 76 61 72 69 61  s.szOsFile varia
c6e0: 62 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f  ble..#.faultsim_
c6f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
c700: 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  n.do_execsql_tes
c710: 74 20 70 61 67 65 72 31 2d 31 35 2e 30 20 7b 0a  t pager1-15.0 {.
c720: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
c730: 78 28 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45 52  x(y, z);.  INSER
c740: 54 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53  T INTO tx VALUES
c750: 28 27 41 79 75 74 74 68 61 79 61 27 2c 20 27 42  ('Ayutthaya', 'B
c760: 65 69 6a 69 6e 67 27 29 3b 0a 20 20 49 4e 53 45  eijing');.  INSE
c770: 52 54 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45  RT INTO tx VALUE
c780: 53 28 27 4c 6f 6e 64 6f 6e 27 2c 20 27 54 6f 6b  S('London', 'Tok
c790: 79 6f 27 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c  yo');.} {}.db cl
c7a0: 6f 73 65 0a 66 6f 72 20 7b 73 65 74 20 69 20 30  ose.for {set i 0
c7b0: 7d 20 7b 24 69 3c 35 31 33 7d 20 7b 69 6e 63 72  } {$i<513} {incr
c7c0: 20 69 20 33 7d 20 7b 0a 20 20 74 65 73 74 76 66   i 3} {.  testvf
c7d0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20  s tv -default 1 
c7e0: 2d 73 7a 6f 73 66 69 6c 65 20 24 69 0a 20 20 73  -szosfile $i.  s
c7f0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
c800: 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  b.  do_execsql_t
c810: 65 73 74 20 70 61 67 65 72 31 2d 31 35 2e 24 69  est pager1-15.$i
c820: 2e 31 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .1 {.    SELECT 
c830: 2a 20 46 52 4f 4d 20 74 78 3b 0a 20 20 7d 20 7b  * FROM tx;.  } {
c840: 41 79 75 74 74 68 61 79 61 20 42 65 69 6a 69 6e  Ayutthaya Beijin
c850: 67 20 4c 6f 6e 64 6f 6e 20 54 6f 6b 79 6f 7d 0a  g London Tokyo}.
c860: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20    db close.  tv 
c870: 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  delete.}..#-----
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8c0: 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61  ----.# Check tha
c8d0: 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  t it is not poss
c8e0: 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 64  ible to open a d
c8f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
c900: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 0a 23 20  the full path.# 
c910: 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  to the associate
c920: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  d journal file w
c930: 69 6c 6c 20 62 65 20 6c 6f 6e 67 65 72 20 74 68  ill be longer th
c940: 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  an sqlite3_vfs.m
c950: 78 50 61 74 68 6e 61 6d 65 2e 0a 23 0a 74 65 73  xPathname..#.tes
c960: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
c970: 20 31 0a 74 76 20 73 63 72 69 70 74 20 78 4f 70   1.tv script xOp
c980: 65 6e 43 62 0a 74 76 20 66 69 6c 74 65 72 20 78  enCb.tv filter x
c990: 4f 70 65 6e 0a 70 72 6f 63 20 78 4f 70 65 6e 43  Open.proc xOpenC
c9a0: 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61  b {method filena
c9b0: 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74  me args} {.  set
c9c0: 20 3a 3a 66 69 6c 65 5f 6c 65 6e 20 5b 73 74 72   ::file_len [str
c9d0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65  ing length $file
c9e0: 6e 61 6d 65 5d 0a 7d 0a 73 71 6c 69 74 65 33 20  name].}.sqlite3 
c9f0: 64 62 20 74 65 73 74 2e 64 62 0a 64 62 20 63 6c  db test.db.db cl
ca00: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 66  ose.tv delete..f
ca10: 6f 72 20 7b 73 65 74 20 69 69 20 5b 65 78 70 72  or {set ii [expr
ca20: 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2d 35 5d 7d   $::file_len-5]}
ca30: 20 7b 24 69 69 20 3c 20 5b 65 78 70 72 20 24 3a   {$ii < [expr $:
ca40: 3a 66 69 6c 65 5f 6c 65 6e 2b 32 30 5d 7d 20 7b  :file_len+20]} {
ca50: 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 74 65 73  incr ii} {.  tes
ca60: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
ca70: 20 31 20 2d 6d 78 70 61 74 68 6e 61 6d 65 20 24   1 -mxpathname $
ca80: 69 69 0a 0a 20 20 23 20 54 68 65 20 6c 65 6e 67  ii..  # The leng
ca90: 74 68 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 70  th of the full p
caa0: 61 74 68 20 74 6f 20 66 69 6c 65 20 22 74 65 73  ath to file "tes
cab0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 22 20 69 73  t.db-journal" is
cac0: 20 28 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 29   ($::file_len+8)
cad0: 2e 0a 20 20 23 20 49 66 20 74 68 65 20 63 6f 6e  ..  # If the con
cae0: 66 69 67 75 72 65 64 20 73 71 6c 69 74 65 33 5f  figured sqlite3_
caf0: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 76  vfs.mxPathname v
cb00: 61 6c 75 65 20 67 72 65 61 74 65 72 20 74 68 61  alue greater tha
cb10: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20  n or equal to.  
cb20: 23 20 74 68 69 73 2c 20 74 68 65 6e 20 74 68 65  # this, then the
cb30: 20 66 69 6c 65 20 63 61 6e 20 62 65 20 6f 70 65   file can be ope
cb40: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
cb50: 69 74 20 63 61 6e 6e 6f 74 2e 0a 20 20 23 0a 20  it cannot..  #. 
cb60: 20 69 66 20 7b 24 69 69 20 3e 3d 20 5b 65 78 70   if {$ii >= [exp
cb70: 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 5d  r $::file_len+8]
cb80: 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20  } {.    set res 
cb90: 7b 30 20 7b 7d 7d 0a 20 20 7d 20 65 6c 73 65 20  {0 {}}.  } else 
cba0: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 31  {.    set res {1
cbb0: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
cbc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
cbd0: 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  .  }..  do_test 
cbe0: 70 61 67 65 72 31 2d 31 36 2e 31 2e 24 69 69 20  pager1-16.1.$ii 
cbf0: 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63  {.    list [catc
cc00: 68 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74  h { sqlite3 db t
cc10: 65 73 74 2e 64 62 20 7d 20 6d 73 67 5d 20 24 6d  est.db } msg] $m
cc20: 73 67 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20 63  sg.  } $res..  c
cc30: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
cc40: 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 0a    tv delete.}...
cc50: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
cca0: 74 20 74 68 65 20 70 61 67 65 72 73 20 72 65 73  t the pagers res
ccb0: 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 62 2d 74  ponse to the b-t
ccc0: 72 65 65 20 6c 61 79 65 72 20 72 65 71 75 65 73  ree layer reques
ccd0: 74 69 6e 67 20 69 6c 6c 65 67 61 6c 20 70 61 67  ting illegal pag
cce0: 65 20 0a 23 20 6e 75 6d 62 65 72 73 3a 0a 23 0a  e .# numbers:.#.
ccf0: 23 20 20 20 2b 20 54 68 65 20 6c 6f 63 6b 69 6e  #   + The lockin
cd00: 67 20 70 61 67 65 2c 0a 23 20 20 20 2b 20 50 61  g page,.#   + Pa
cd10: 67 65 20 30 2c 0a 23 20 20 20 2b 20 41 20 70 61  ge 0,.#   + A pa
cd20: 67 65 20 77 69 74 68 20 61 20 70 61 67 65 20 6e  ge with a page n
cd30: 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
cd40: 61 6e 20 28 32 5e 33 31 2d 31 29 2e 0a 23 0a 23  an (2^31-1)..#.#
cd50: 20 54 68 65 73 65 20 74 65 73 74 73 20 77 69 6c   These tests wil
cd60: 6c 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 53 51  l not work if SQ
cd70: 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
cd80: 46 4c 4f 57 5f 52 45 41 44 20 69 73 20 64 65 66  FLOW_READ is def
cd90: 69 6e 65 64 2e 20 49 6e 0a 23 20 74 68 61 74 20  ined. In.# that 
cda0: 63 61 73 65 20 49 4f 20 65 72 72 6f 72 73 20 61  case IO errors a
cdb0: 72 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 70  re sometimes rep
cdc0: 6f 72 74 65 64 20 69 6e 73 74 65 61 64 20 6f 66  orted instead of
cdd0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
cde0: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 21 64 69  .#.ifcapable !di
cdf0: 72 65 63 74 5f 72 65 61 64 20 7b 0a 64 6f 5f 74  rect_read {.do_t
ce00: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 31 20  est pager1-18.1 
ce10: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
ce20: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
ce30: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
ce40: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
ce50: 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  csql { .    PRAG
ce60: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
ce70: 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20  024;.    CREATE 
ce80: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
ce90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cea0: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
ceb0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
cec0: 67 28 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  g(200));.    INS
ced0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
cee0: 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  CT a_string(500)
cef0: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20  , a_string(200) 
cf00: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
cf10: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
cf20: 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  CT a_string(500)
cf30: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20  , a_string(200) 
cf40: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
cf50: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
cf60: 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  CT a_string(500)
cf70: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20  , a_string(200) 
cf80: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
cf90: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
cfa0: 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  CT a_string(500)
cfb0: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20  , a_string(200) 
cfc0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
cfd0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
cfe0: 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  CT a_string(500)
cff0: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20  , a_string(200) 
d000: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
d010: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
d020: 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  CT a_string(500)
d030: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20  , a_string(200) 
d040: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
d050: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
d060: 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  CT a_string(500)
d070: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20  , a_string(200) 
d080: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
d090: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
d0a0: 2d 31 38 2e 32 20 7b 0a 20 20 73 65 74 20 72 6f  -18.2 {.  set ro
d0b0: 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45  ot [db one "SELE
d0c0: 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
d0d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d   sqlite_master"]
d0e0: 0a 20 20 73 65 74 20 6c 6f 63 6b 69 6e 67 70 61  .  set lockingpa
d0f0: 67 65 20 5b 65 78 70 72 20 28 30 78 31 30 30 30  ge [expr (0x1000
d100: 30 2f 31 30 32 34 29 20 2b 20 31 5d 0a 20 20 65  0/1024) + 1].  e
d110: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
d120: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
d130: 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50 44  ema = 1;.    UPD
d140: 41 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ATE sqlite_maste
d150: 72 20 53 45 54 20 72 6f 6f 74 70 61 67 65 20 3d  r SET rootpage =
d160: 20 24 6c 6f 63 6b 69 6e 67 70 61 67 65 3b 0a 20   $lockingpage;. 
d170: 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   }.  sqlite3 db2
d180: 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68   test.db.  catch
d190: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
d1a0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 20  nt(*) FROM t1 } 
d1b0: 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  db2.} {1 {databa
d1c0: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
d1d0: 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32   malformed}}.db2
d1e0: 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70   close.do_test p
d1f0: 61 67 65 72 31 2d 31 38 2e 33 20 7b 0a 20 20 65  ager1-18.3 {.  e
d200: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
d210: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b  ATE TABLE t2(x);
d220: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d230: 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t2 VALUES(a_str
d240: 69 6e 67 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a  ing(5000));.  }.
d250: 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78 70 72    set pgno [expr
d260: 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73   ([file size tes
d270: 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d  t.db] / 1024)-2]
d280: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
d290: 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70  est.db [expr ($p
d2a0: 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30 30  gno-1)*1024] 000
d2b0: 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
d2c0: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61  db2 test.db.  ca
d2d0: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
d2e0: 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20 74  length(x) FROM t
d2f0: 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61  2 } db2.} {1 {da
d300: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
d310: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
d320: 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65  .db2 close.do_te
d330: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 34 20 7b  st pager1-18.4 {
d340: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
d350: 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70  est.db [expr ($p
d360: 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 39 30 30  gno-1)*1024] 900
d370: 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
d380: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61  db2 test.db.  ca
d390: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
d3a0: 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20 74  length(x) FROM t
d3b0: 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61  2 } db2.} {1 {da
d3c0: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
d3d0: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
d3e0: 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65  .db2 close.do_te
d3f0: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 35 20 7b  st pager1-18.5 {
d400: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22 22  .  sqlite3 db ""
d410: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
d420: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
d430: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
d440: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
d450: 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72  );.    PRAGMA wr
d460: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
d470: 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73 71  1;.    UPDATE sq
d480: 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54 20  lite_master SET 
d490: 72 6f 6f 74 70 61 67 65 3d 35 20 57 48 45 52 45  rootpage=5 WHERE
d4a0: 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74 31 27   tbl_name = 't1'
d4b0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72 69  ;.    PRAGMA wri
d4c0: 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 30  table_schema = 0
d4d0: 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c  ;.    ALTER TABL
d4e0: 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20 78  E t1 RENAME TO x
d4f0: 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71  1;.  }.  catchsq
d500: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
d510: 4d 20 78 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74  M x1 }.} {1 {dat
d520: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
d530: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
d540: 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73  db close..do_tes
d550: 74 20 70 61 67 65 72 31 2d 31 38 2e 36 20 7b 0a  t pager1-18.6 {.
d560: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
d570: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
d580: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
d590: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
d5a0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
d5b0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
d5c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
d5d0: 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e  LE t1(x);.    IN
d5e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
d5f0: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30  UES(a_string(800
d600: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
d610: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
d620: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
d630: 7d 0a 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b 64  }..  set root [d
d640: 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72 6f  b one "SELECT ro
d650: 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69  otpage FROM sqli
d660: 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 64 62  te_master"].  db
d670: 20 63 6c 6f 73 65 0a 0a 20 20 68 65 78 69 6f 5f   close..  hexio_
d680: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65  write test.db [e
d690: 78 70 72 20 28 24 72 6f 6f 74 2d 31 29 2a 31 30  xpr ($root-1)*10
d6a0: 32 34 20 2b 20 38 5d 20 30 30 30 30 30 30 30 30  24 + 8] 00000000
d6b0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
d6c0: 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c  st.db.  catchsql
d6d0: 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68   { SELECT length
d6e0: 28 78 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  (x) FROM t1 }.} 
d6f0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
d700: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
d710: 72 6d 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73  rmed}}.}..do_tes
d720: 74 20 70 61 67 65 72 31 2d 31 39 2e 31 20 7b 0a  t pager1-19.1 {.
d730: 20 20 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a    sqlite3 db "".
d740: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
d750: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
d760: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
d770: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35  MA page_size = 5
d780: 31 32 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  12;.    PRAGMA a
d790: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a  uto_vacuum = 1;.
d7a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
d7b0: 20 74 31 28 61 61 2c 20 61 62 2c 20 61 63 2c 20   t1(aa, ab, ac, 
d7c0: 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c 20  ad, ae, af, ag, 
d7d0: 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20  ah, ai, aj, ak, 
d7e0: 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20  al, am, an,.    
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c 20  ba, bb, bc, bd, 
d810: 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c 20  be, bf, bg, bh, 
d820: 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20  bi, bj, bk, bl, 
d830: 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20 20  bm, bn,.        
d840: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 2c 20              ca, 
d850: 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c 20  cb, cc, cd, ce, 
d860: 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c 20  cf, cg, ch, ci, 
d870: 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20  cj, ck, cl, cm, 
d880: 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  cn,.            
d890: 20 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c 20          da, db, 
d8a0: 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c 20  dc, dd, de, df, 
d8b0: 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20  dg, dh, di, dj, 
d8c0: 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a  dk, dl, dm, dn,.
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c 20      ea, eb, ec, 
d8f0: 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c 20  ed, ee, ef, eg, 
d900: 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20  eh, ei, ej, ek, 
d910: 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20  el, em, en,.    
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c 20  fa, fb, fc, fd, 
d940: 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c 20  fe, ff, fg, fh, 
d950: 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20  fi, fj, fk, fl, 
d960: 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20 20  fm, fn,.        
d970: 20 20 20 20 20 20 20 20 20 20 20 20 67 61 2c 20              ga, 
d980: 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c 20  gb, gc, gd, ge, 
d990: 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c 20  gf, gg, gh, gi, 
d9a0: 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20  gj, gk, gl, gm, 
d9b0: 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gn,.            
d9c0: 20 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c 20          ha, hb, 
d9d0: 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c 20  hc, hd, he, hf, 
d9e0: 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20  hg, hh, hi, hj, 
d9f0: 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a  hk, hl, hm, hn,.
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c 20      ia, ib, ic, 
da20: 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c 20  id, ie, if, ig, 
da30: 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20  ih, ii, ij, ik, 
da40: 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20  il, im, ix,.    
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20  ja, jb, jc, jd, 
da70: 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20  je, jf, jg, jh, 
da80: 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20  ji, jj, jk, jl, 
da90: 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20  jm, jn,.        
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c 20              ka, 
dab0: 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20  kb, kc, kd, ke, 
dac0: 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20  kf, kg, kh, ki, 
dad0: 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20  kj, kk, kl, km, 
dae0: 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  kn,.            
daf0: 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20          la, lb, 
db00: 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20  lc, ld, le, lf, 
db10: 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20  lg, lh, li, lj, 
db20: 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a  lk, ll, lm, ln,.
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20      ma, mb, mc, 
db50: 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20  md, me, mf, mg, 
db60: 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20  mh, mi, mj, mk, 
db70: 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29  ml, mm, mn.    )
db80: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
db90: 4c 45 20 74 32 28 61 61 2c 20 61 62 2c 20 61 63  LE t2(aa, ab, ac
dba0: 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67  , ad, ae, af, ag
dbb0: 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b  , ah, ai, aj, ak
dbc0: 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20  , al, am, an,.  
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64    ba, bb, bc, bd
dbf0: 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68  , be, bf, bg, bh
dc00: 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c  , bi, bj, bk, bl
dc10: 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20  , bm, bn,.      
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
dc30: 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65  , cb, cc, cd, ce
dc40: 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69  , cf, cg, ch, ci
dc50: 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d  , cj, ck, cl, cm
dc60: 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , cn,.          
dc70: 20 20 20 20 20 20 20 20 20 20 64 61 2c 20 64 62            da, db
dc80: 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66  , dc, dd, de, df
dc90: 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a  , dg, dh, di, dj
dca0: 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e  , dk, dl, dm, dn
dcb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dcc0: 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63        ea, eb, ec
dcd0: 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67  , ed, ee, ef, eg
dce0: 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b  , eh, ei, ej, ek
dcf0: 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20  , el, em, en,.  
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64    fa, fb, fc, fd
dd20: 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68  , fe, ff, fg, fh
dd30: 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c  , fi, fj, fk, fl
dd40: 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20  , fm, fn,.      
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 61                ga
dd60: 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65  , gb, gc, gd, ge
dd70: 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69  , gf, gg, gh, gi
dd80: 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d  , gj, gk, gl, gm
dd90: 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , gn,.          
dda0: 20 20 20 20 20 20 20 20 20 20 68 61 2c 20 68 62            ha, hb
ddb0: 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66  , hc, hd, he, hf
ddc0: 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a  , hg, hh, hi, hj
ddd0: 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e  , hk, hl, hm, hn
dde0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ddf0: 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63        ia, ib, ic
de00: 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67  , id, ie, if, ig
de10: 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b  , ih, ii, ij, ik
de20: 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20  , il, im, ix,.  
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64    ja, jb, jc, jd
de50: 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68  , je, jf, jg, jh
de60: 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c  , ji, jj, jk, jl
de70: 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20  , jm, jn,.      
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 61                ka
de90: 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65  , kb, kc, kd, ke
dea0: 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69  , kf, kg, kh, ki
deb0: 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d  , kj, kk, kl, km
dec0: 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , kn,.          
ded0: 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62            la, lb
dee0: 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66  , lc, ld, le, lf
def0: 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a  , lg, lh, li, lj
df00: 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e  , lk, ll, lm, ln
df10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
df20: 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63        ma, mb, mc
df30: 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67  , md, me, mf, mg
df40: 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b  , mh, mi, mj, mk
df50: 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20  , ml, mm, mn.   
df60: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
df70: 4e 54 4f 20 74 31 28 61 61 29 20 56 41 4c 55 45  NTO t1(aa) VALUE
df80: 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30 30 30  S( a_string(1000
df90: 30 30 29 20 29 3b 0a 20 20 20 20 49 4e 53 45 52  00) );.    INSER
dfa0: 54 20 49 4e 54 4f 20 74 32 28 61 61 29 20 56 41  T INTO t2(aa) VA
dfb0: 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31  LUES( a_string(1
dfc0: 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20 56 41  00000) );.    VA
dfd0: 43 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  CUUM;.  }.} {}..
dfe0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
dff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
e030: 74 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 73 70  t a couple of sp
e040: 65 63 69 61 6c 20 63 61 73 65 73 20 74 68 61 74  ecial cases that
e050: 20 63 6f 6d 65 20 75 70 20 77 68 69 6c 65 20 63   come up while c
e060: 6f 6d 6d 69 74 74 69 6e 67 20 0a 23 20 74 72 61  ommitting .# tra
e070: 6e 73 61 63 74 69 6f 6e 73 3a 0a 23 0a 23 20 20  nsactions:.#.#  
e080: 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 2a 3a 20   pager1-20.1.*: 
e090: 43 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 20 69 6e  Committing an in
e0a0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e0b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68 65   transaction whe
e0c0: 6e 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20  n the .#        
e0d0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
e0e0: 73 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  se has not been 
e0f0: 6d 6f 64 69 66 69 65 64 20 61 74 20 61 6c 6c 2e  modified at all.
e100: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30  .#.#   pager1-20
e110: 2e 32 2e 2a 3a 20 41 73 20 61 62 6f 76 65 2c 20  .2.*: As above, 
e120: 62 75 74 20 77 69 74 68 20 61 20 6e 6f 72 6d 61  but with a norma
e130: 6c 20 64 62 20 69 6e 20 65 78 63 6c 75 73 69 76  l db in exclusiv
e140: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  e-locking mode..
e150: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e  #.#   pager1-20.
e160: 33 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20  3.*: Committing 
e170: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
e180: 20 57 41 4c 20 6d 6f 64 65 20 77 68 65 72 65 20   WAL mode where 
e190: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
e1a0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
e1b0: 20 20 20 20 62 65 65 6e 20 6d 6f 64 69 66 69 65      been modifie
e1c0: 64 2c 20 62 75 74 20 61 6c 6c 20 64 69 72 74 79  d, but all dirty
e1d0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
e1e0: 20 66 6c 75 73 68 65 64 20 74 6f 20 0a 23 20 20   flushed to .#  
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 64 69 73 6b 20 62 65 66 6f 72 65 20 74 68 65 20  disk before the 
e210: 63 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74 65 73  commit..#.do_tes
e220: 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 31 20  t pager1-20.1.1 
e230: 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c  {.  catch {db cl
e240: 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  ose}.  sqlite3 d
e250: 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78 65  b :memory:.  exe
e260: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
e270: 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c  E TABLE one(two,
e280: 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53   three);.    INS
e290: 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c  ERT INTO one VAL
e2a0: 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
e2b0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
e2c0: 70 61 67 65 72 31 2d 32 30 2e 31 2e 32 20 7b 0a  pager1-20.1.2 {.
e2d0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
e2e0: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b  BEGIN EXCLUSIVE;
e2f0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
e300: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  .} {}..do_test p
e310: 61 67 65 72 31 2d 32 30 2e 32 2e 31 20 7b 0a 20  ager1-20.2.1 {. 
e320: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
e330: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
e340: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
e350: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
e360: 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20  = exclusive;.   
e370: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
e380: 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a  mode = persist;.
e390: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e3a0: 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29   one(two, three)
e3b0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
e3c0: 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27  O one VALUES('a'
e3d0: 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 65  , 'b');.  }.} {e
e3e0: 78 63 6c 75 73 69 76 65 20 70 65 72 73 69 73 74  xclusive persist
e3f0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
e400: 2d 32 30 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63  -20.2.2 {.  exec
e410: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20  sql {.    BEGIN 
e420: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43  EXCLUSIVE;.    C
e430: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
e440: 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b  .ifcapable wal {
e450: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
e460: 31 2d 32 30 2e 33 2e 31 20 7b 0a 20 20 20 20 66  1-20.3.1 {.    f
e470: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
e480: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62  nd_reopen.    db
e490: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
e4a0: 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63  _string.    exec
e4b0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
e4c0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
e4d0: 31 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  10;.      PRAGMA
e4e0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
e4f0: 77 61 6c 3b 0a 20 20 20 20 20 20 42 45 47 49 4e  wal;.      BEGIN
e500: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
e510: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
e520: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
e530: 4c 45 20 74 32 28 79 29 3b 0a 20 20 20 20 20 20  LE t2(y);.      
e540: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
e550: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
e560: 28 38 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20  (800));.        
e570: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
e580: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38  ELECT a_string(8
e590: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
e5a0: 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a 20       /*   2 */. 
e5b0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
e5c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
e5d0: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
e5e0: 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20  t1;         /*  
e5f0: 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e   4 */.        IN
e600: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
e610: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
e620: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
e630: 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20     /*   8 */.   
e640: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
e650: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
e660: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
e670: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36  ;         /*  16
e680: 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45   */.        INSE
e690: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
e6a0: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  T a_string(800) 
e6b0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
e6c0: 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 20   /*  32 */.     
e6d0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20   COMMIT;.    }. 
e6e0: 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65   } {wal}.  do_te
e6f0: 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 32  st pager1-20.3.2
e700: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
e710: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
e720: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e730: 74 32 20 56 41 4c 55 45 53 28 27 78 78 78 78 27  t2 VALUES('xxxx'
e740: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63  );.    }.    rec
e750: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32  ursive_select 32
e760: 20 74 31 0a 20 20 20 20 65 78 65 63 73 71 6c 20   t1.    execsql 
e770: 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 7d 0a  COMMIT.  } {}.}.
e780: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
e790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
e7d0: 73 74 20 74 68 61 74 20 61 20 57 41 4c 20 64 61  st that a WAL da
e7e0: 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62  tabase may not b
e7f0: 65 20 6f 70 65 6e 65 64 20 69 66 3a 0a 23 0a 23  e opened if:.#.#
e800: 20 20 20 70 61 67 65 72 31 2d 32 31 2e 31 2e 2a     pager1-21.1.*
e810: 3a 20 54 68 65 20 56 46 53 20 68 61 73 20 61 6e  : The VFS has an
e820: 20 69 56 65 72 73 69 6f 6e 20 6c 65 73 73 20 74   iVersion less t
e830: 68 61 6e 20 32 2c 20 6f 72 0a 23 20 20 20 70 61  han 2, or.#   pa
e840: 67 65 72 31 2d 32 31 2e 32 2e 2a 3a 20 54 68 65  ger1-21.2.*: The
e850: 20 56 46 53 20 64 6f 65 73 20 6e 6f 74 20 70 72   VFS does not pr
e860: 6f 76 69 64 65 20 78 53 68 6d 58 58 58 28 29 20  ovide xShmXXX() 
e870: 6d 65 74 68 6f 64 73 2e 0a 23 0a 69 66 63 61 70  methods..#.ifcap
e880: 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f  able wal {.  do_
e890: 74 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e 30  test pager1-21.0
e8a0: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
e8b0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
e8c0: 6e 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  n.    execsql {.
e8d0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
e8e0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
e8f0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
e900: 42 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54  BLE ko(c DEFAULT
e910: 20 27 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c   'abc', b DEFAUL
e920: 54 20 27 64 65 66 27 29 3b 0a 20 20 20 20 20 20  T 'def');.      
e930: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44  INSERT INTO ko D
e940: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20  EFAULT VALUES;. 
e950: 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20     }.  } {wal}. 
e960: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
e970: 32 31 2e 31 20 7b 0a 20 20 20 20 74 65 73 74 76  21.1 {.    testv
e980: 66 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31 0a 20  fs tv -noshm 1. 
e990: 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74     sqlite3 db2 t
e9a0: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20  est.db -vfs tv. 
e9b0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45     catchsql { SE
e9c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d  LECT * FROM ko }
e9d0: 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75 6e 61   db2.  } {1 {una
e9e0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
e9f0: 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 64 62  base file}}.  db
ea00: 32 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c  2 close.  tv del
ea10: 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ete.  do_test pa
ea20: 67 65 72 31 2d 32 31 2e 32 20 7b 0a 20 20 20 20  ger1-21.2 {.    
ea30: 74 65 73 74 76 66 73 20 74 76 20 2d 69 76 65 72  testvfs tv -iver
ea40: 73 69 6f 6e 20 31 0a 20 20 20 20 73 71 6c 69 74  sion 1.    sqlit
ea50: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d  e3 db2 test.db -
ea60: 76 66 73 20 74 76 0a 20 20 20 20 63 61 74 63 68  vfs tv.    catch
ea70: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
ea80: 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20 20 7d  ROM ko } db2.  }
ea90: 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f   {1 {unable to o
eaa0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
eab0: 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  e}}.  db2 close.
eac0: 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23    tv delete.}..#
ead0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
eb20: 20 74 68 61 74 20 61 20 22 50 52 41 47 4d 41 20   that a "PRAGMA 
eb30: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 3a  wal_checkpoint":
eb40: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32  .#.#   pager1-22
eb50: 2e 31 2e 2a 3a 20 69 73 20 61 20 6e 6f 2d 6f 70  .1.*: is a no-op
eb60: 20 6f 6e 20 61 20 6e 6f 6e 2d 57 41 4c 20 64 62   on a non-WAL db
eb70: 2c 20 61 6e 64 0a 23 20 20 20 70 61 67 65 72 31  , and.#   pager1
eb80: 2d 32 32 2e 32 2e 2a 3a 20 64 6f 65 73 20 6e 6f  -22.2.*: does no
eb90: 74 20 63 61 75 73 65 20 78 53 79 6e 63 20 63 61  t cause xSync ca
eba0: 6c 6c 73 20 77 69 74 68 20 61 20 73 79 6e 63 68  lls with a synch
ebb0: 72 6f 6e 6f 75 73 3d 6f 66 66 20 64 62 2e 0a 23  ronous=off db..#
ebc0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
ebd0: 32 32 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  22.1.1 {.  fault
ebe0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
ebf0: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
ec00: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
ec10: 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54 20  LE ko(c DEFAULT 
ec20: 27 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c 54  'abc', b DEFAULT
ec30: 20 27 64 65 66 27 29 3b 0a 20 20 20 20 49 4e 53   'def');.    INS
ec40: 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41  ERT INTO ko DEFA
ec50: 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 7d 0a  ULT VALUES;.  }.
ec60: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
ec70: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
ec80: 74 20 7d 0a 7d 20 7b 30 20 2d 31 20 2d 31 7d 0a  t }.} {0 -1 -1}.
ec90: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
eca0: 32 2e 32 2e 31 20 7b 0a 20 20 74 65 73 74 76 66  2.2.1 {.  testvf
ecb0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
ecc0: 20 20 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e    tv filter xSyn
ecd0: 63 0a 20 20 74 76 20 73 63 72 69 70 74 20 78 53  c.  tv script xS
ece0: 79 6e 63 43 62 0a 20 20 70 72 6f 63 20 78 53 79  yncCb.  proc xSy
ecf0: 6e 63 43 62 20 7b 61 72 67 73 7d 20 7b 69 6e 63  ncCb {args} {inc
ed00: 72 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 7d 0a 20  r ::synccount}. 
ed10: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
ed20: 2e 64 62 0a 0a 20 20 23 20 53 77 69 74 63 68 20  .db..  # Switch 
ed30: 74 68 65 20 64 62 20 74 6f 20 57 41 4c 20 6d 6f  the db to WAL mo
ed40: 64 65 2e 20 41 6e 64 20 74 68 65 6e 20 65 78 65  de. And then exe
ed50: 63 75 74 65 20 61 20 53 45 4c 45 43 54 20 74 6f  cute a SELECT to
ed60: 20 6d 61 6b 65 20 73 75 72 65 0a 20 20 23 20 74   make sure.  # t
ed70: 68 61 74 20 74 68 65 20 57 41 4c 20 66 69 6c 65  hat the WAL file
ed80: 20 69 73 20 6f 70 65 6e 2e 20 4e 6f 74 65 20 74   is open. Note t
ed90: 68 61 74 20 74 68 69 73 20 6d 61 79 20 63 68 61  hat this may cha
eda0: 6e 67 65 20 74 68 65 20 73 79 6e 63 68 72 6f 6e  nge the synchron
edb0: 6f 75 73 0a 20 20 23 20 73 65 74 74 69 6e 67 20  ous.  # setting 
edc0: 69 66 20 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  if DEFAULT_WAL_S
edd0: 41 46 45 54 59 4c 45 56 45 4c 20 69 73 20 64 65  AFETYLEVEL is de
ede0: 66 69 6e 65 64 2e 0a 20 20 65 78 65 63 73 71 6c  fined..  execsql
edf0: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
ee00: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 3b 20 53  l_mode = WAL ; S
ee10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20  ELECT * FROM ko 
ee20: 7d 0a 0a 20 20 23 20 53 65 74 20 73 79 6e 63 68  }..  # Set synch
ee30: 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 49 6e 73 65  ronous=OFF. Inse
ee40: 72 74 20 73 6f 6d 65 20 64 61 74 61 20 61 6e 64  rt some data and
ee50: 20 72 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e   run a checkpoin
ee60: 74 2e 20 53 69 6e 63 65 0a 20 20 23 20 73 79 6e  t. Since.  # syn
ee70: 63 3d 6f 66 66 2c 20 74 68 69 73 20 73 68 6f 75  c=off, this shou
ee80: 6c 64 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  ld not cause any
ee90: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 78 53   calls to the xS
eea0: 79 6e 63 28 29 20 6d 65 74 68 6f 64 2e 0a 20 20  ync() method..  
eeb0: 73 65 74 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 20  set ::synccount 
eec0: 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  0.  execsql {.  
eed0: 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
eee0: 6e 6f 75 73 20 3d 20 6f 66 66 3b 0a 20 20 20 20  nous = off;.    
eef0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44  INSERT INTO ko D
ef00: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20  EFAULT VALUES;. 
ef10: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
ef20: 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20 20  eckpoint;.  }.  
ef30: 73 65 74 20 73 79 6e 63 63 6f 75 6e 74 0a 7d 20  set synccount.} 
ef40: 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {0}..#----------
ef50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ef90: 23 20 54 65 73 74 73 20 66 6f 72 20 63 68 61 6e  # Tests for chan
efa0: 67 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  ging journal mod
efb0: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
efc0: 32 33 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61  23.1.*: Test tha
efd0: 74 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20  t when changing 
efe0: 66 72 6f 6d 20 50 45 52 53 49 53 54 20 74 6f 20  from PERSIST to 
eff0: 44 45 4c 45 54 45 20 6d 6f 64 65 2c 0a 23 20 20  DELETE mode,.#  
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f020: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23   is deleted..#.#
f030: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 2a     pager1-23.2.*
f040: 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 61  : Same test as a
f050: 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c 65 20  bove, but while 
f060: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  a shared lock is
f070: 20 68 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20   held.#         
f080: 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20           on the 
f090: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23  database file..#
f0a0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 33  .#   pager1-23.3
f0b0: 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73  .*: Same test as
f0c0: 20 61 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c   above, but whil
f0d0: 65 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  e a reserved loc
f0e0: 6b 20 69 73 20 68 65 6c 64 0a 23 20 20 20 20 20  k is held.#     
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20               on 
f100: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f110: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
f120: 32 33 2e 34 2e 2a 3a 20 41 6e 64 2c 20 66 6f 72  23.4.*: And, for
f130: 20 66 75 6e 2c 20 77 68 69 6c 65 20 68 6f 6c 64   fun, while hold
f140: 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ing an exclusive
f150: 20 6c 6f 63 6b 2e 0a 23 0a 23 20 20 20 70 61 67   lock..#.#   pag
f160: 65 72 31 2d 32 33 2e 35 2e 2a 3a 20 54 72 79 20  er1-23.5.*: Try 
f170: 74 6f 20 73 65 74 20 76 61 72 69 6f 75 73 20 64  to set various d
f180: 69 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c  ifferent journal
f190: 20 6d 6f 64 65 73 20 77 69 74 68 20 61 6e 0a 23   modes with an.#
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61    in-memory data
f1c0: 62 61 73 65 20 28 6f 6e 6c 79 20 4d 45 4d 4f 52  base (only MEMOR
f1d0: 59 20 61 6e 64 20 4f 46 46 20 73 68 6f 75 6c 64  Y and OFF should
f1e0: 20 77 6f 72 6b 29 2e 0a 23 0a 23 20 20 20 70 61   work)..#.#   pa
f1f0: 67 65 72 31 2d 32 33 2e 36 2e 2a 3a 20 54 72 79  ger1-23.6.*: Try
f200: 20 74 6f 20 73 65 74 20 6c 6f 63 6b 69 6e 67 5f   to set locking_
f210: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 6f 6e 20 61  mode=normal on a
f220: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
f230: 62 61 73 65 0a 23 20 20 20 20 20 20 20 20 20 20  base.#          
f240: 20 20 20 20 20 20 20 20 28 64 6f 65 73 6e 27 74          (doesn't
f250: 20 77 6f 72 6b 20 2d 20 69 6e 2d 6d 65 6d 6f 72   work - in-memor
f260: 79 20 64 61 74 61 62 61 73 65 73 20 61 6c 77 61  y databases alwa
f270: 79 73 20 75 73 65 0a 23 20 20 20 20 20 20 20 20  ys use.#        
f280: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 69 6e            lockin
f290: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
f2a0: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  )..#.do_test pag
f2b0: 65 72 31 2d 32 33 2e 31 2e 31 20 7b 0a 20 20 66  er1-23.1.1 {.  f
f2c0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
f2d0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
f2e0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
f2f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f300: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45  PERSIST;.    CRE
f310: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
f320: 62 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 65  b);.  }.  file e
f330: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
f340: 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  urnal.} {1}.do_t
f350: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  est pager1-23.1.
f360: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
f370: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f380: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f390: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
f3a0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
f3b0: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  0}..do_test page
f3c0: 72 31 2d 32 33 2e 32 2e 31 20 7b 0a 20 20 65 78  r1-23.2.1 {.  ex
f3d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
f3e0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f3f0: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49  = PERSIST;.    I
f400: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
f410: 4c 55 45 53 28 27 43 61 6e 62 65 72 72 61 27 2c  LUES('Canberra',
f420: 20 27 41 43 54 27 29 3b 0a 20 20 7d 0a 20 20 64   'ACT');.  }.  d
f430: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
f440: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 0a 20 20  * FROM t1 } {.  
f450: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
f460: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f470: 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 7d 0a 20  = DELETE }.  }. 
f480: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f490: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f4a0: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f4b0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e  est pager1-23.2.
f4c0: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f4d0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f4e0: 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74  l.} {0}..do_test
f4f0: 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 31 20 7b   pager1-23.3.1 {
f500: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f510: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f520: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
f530: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f540: 74 31 20 56 41 4c 55 45 53 28 27 44 61 72 77 69  t1 VALUES('Darwi
f550: 6e 27 2c 20 27 4e 54 27 29 3b 0a 20 20 20 20 42  n', 'NT');.    B
f560: 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a  EGIN IMMEDIATE;.
f570: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
f580: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f590: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f5a0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f5b0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f5c0: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f5d0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e  est pager1-23.3.
f5e0: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f5f0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f600: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  l.} {0}.do_test 
f610: 70 61 67 65 72 31 2d 32 33 2e 33 2e 33 20 7b 0a  pager1-23.3.3 {.
f620: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
f630: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  .} {}..do_test p
f640: 61 67 65 72 31 2d 32 33 2e 34 2e 31 20 7b 0a 20  ager1-23.4.1 {. 
f650: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    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 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
f680: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
f690: 20 56 41 4c 55 45 53 28 27 41 64 65 6c 61 69 64   VALUES('Adelaid
f6a0: 65 27 2c 20 27 53 41 27 29 3b 0a 20 20 20 20 42  e', 'SA');.    B
f6b0: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a  EGIN EXCLUSIVE;.
f6c0: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
f6d0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f6e0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f6f0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f700: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f710: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f720: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e  est pager1-23.4.
f730: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f740: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f750: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  l.} {0}.do_test 
f760: 70 61 67 65 72 31 2d 32 33 2e 34 2e 33 20 7b 0a  pager1-23.4.3 {.
f770: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
f780: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  .} {}..do_test p
f790: 61 67 65 72 31 2d 32 33 2e 35 2e 31 20 7b 0a 20  ager1-23.5.1 {. 
f7a0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
f7b0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71  _and_reopen.  sq
f7c0: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
f7d0: 3a 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b  :.} {}.foreach {
f7e0: 74 6e 20 6d 6f 64 65 20 70 6f 73 73 69 62 6c 65  tn mode possible
f7f0: 7d 20 7b 0a 20 20 32 20 20 6f 66 66 20 20 20 20  } {.  2  off    
f800: 20 20 31 0a 20 20 33 20 20 6d 65 6d 6f 72 79 20    1.  3  memory 
f810: 20 20 31 0a 20 20 34 20 20 70 65 72 73 69 73 74    1.  4  persist
f820: 20 20 30 0a 20 20 35 20 20 64 65 6c 65 74 65 20    0.  5  delete 
f830: 20 20 30 0a 20 20 36 20 20 77 61 6c 20 20 20 20    0.  6  wal    
f840: 20 20 30 0a 20 20 37 20 20 74 72 75 6e 63 61 74    0.  7  truncat
f850: 65 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  e 0.} {.  do_tes
f860: 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74  t pager1-23.5.$t
f870: 6e 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.1 {.    execsq
f880: 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  l "PRAGMA journa
f890: 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 22 0a 20 20  l_mode = off".  
f8a0: 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
f8b0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f8c0: 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20   $mode".  } [if 
f8d0: 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20  $possible {list 
f8e0: 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6f 66 66  $mode} {list off
f8f0: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }].  do_test pag
f900: 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 32 20 7b  er1-23.5.$tn.2 {
f910: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52  .    execsql "PR
f920: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f930: 65 20 3d 20 6d 65 6d 6f 72 79 22 0a 20 20 20 20  e = memory".    
f940: 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20  execsql "PRAGMA 
f950: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24  journal_mode = $
f960: 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70  mode".  } [if $p
f970: 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d  ossible {list $m
f980: 6f 64 65 7d 20 7b 6c 69 73 74 20 6d 65 6d 6f 72  ode} {list memor
f990: 79 7d 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61  y}].}.do_test pa
f9a0: 67 65 72 31 2d 32 33 2e 36 2e 31 20 7b 0a 20 20  ger1-23.6.1 {.  
f9b0: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
f9c0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e  locking_mode = n
f9d0: 6f 72 6d 61 6c 7d 0a 7d 20 7b 65 78 63 6c 75 73  ormal}.} {exclus
f9e0: 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ive}.do_test pag
f9f0: 65 72 31 2d 32 33 2e 36 2e 32 20 7b 0a 20 20 65  er1-23.6.2 {.  e
fa00: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c  xecsql {PRAGMA l
fa10: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78  ocking_mode = ex
fa20: 63 6c 75 73 69 76 65 7d 0a 7d 20 7b 65 78 63 6c  clusive}.} {excl
fa30: 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70  usive}.do_test p
fa40: 61 67 65 72 31 2d 32 33 2e 36 2e 33 20 7b 0a 20  ager1-23.6.3 {. 
fa50: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
fa60: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d   locking_mode}.}
fa70: 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f   {exclusive}.do_
fa80: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
fa90: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
faa0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6c 6f 63 6b  PRAGMA main.lock
fab0: 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63  ing_mode}.} {exc
fac0: 6c 75 73 69 76 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  lusive}..#------
fad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
faf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb10: 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ---.#.do_test pa
fb20: 67 65 72 31 2d 32 34 2e 31 2e 31 20 7b 0a 20 20  ger1-24.1.1 {.  
fb30: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
fb40: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
fb50: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
fb60: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
fb70: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
fb80: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
fb90: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
fba0: 61 63 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20  acuum = FULL;.  
fbb0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
fbc0: 31 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41  1(x, y, z, PRIMA
fbd0: 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20  RY KEY(y, z));. 
fbe0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
fbf0: 78 32 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d  x2(x, y, z, PRIM
fc00: 41 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a  ARY KEY(y, z));.
fc10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
fc20: 78 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  x2 VALUES(a_stri
fc30: 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(400), a_strin
fc40: 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(500), a_string
fc50: 28 36 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (600));.    INSE
fc60: 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43  RT INTO x2 SELEC
fc70: 54 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c  T a_string(600),
fc80: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20   a_string(400), 
fc90: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46 52  a_string(500) FR
fca0: 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52  OM x2;.    INSER
fcb0: 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54  T INTO x2 SELECT
fcc0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
fcd0: 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61  a_string(600), a
fce0: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
fcf0: 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x2;.    INSERT
fd00: 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20   INTO x2 SELECT 
fd10: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61  a_string(400), a
fd20: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
fd30: 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
fd40: 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x2;.    INSERT 
fd50: 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61  INTO x2 SELECT a
fd60: 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f  _string(600), a_
fd70: 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73  string(400), a_s
fd80: 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20  tring(500) FROM 
fd90: 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x2;.    INSERT I
fda0: 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f  NTO x2 SELECT a_
fdb0: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
fdc0: 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74  tring(600), a_st
fdd0: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 78  ring(400) FROM x
fde0: 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  2;.    INSERT IN
fdf0: 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73  TO x2 SELECT a_s
fe00: 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74  tring(400), a_st
fe10: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
fe20: 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 78 32  ing(600) FROM x2
fe30: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fe40: 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O x1 SELECT * FR
fe50: 4f 4d 20 78 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM x2;.  }.} {}.
fe60: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
fe70: 34 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  4.1.2 {.  execsq
fe80: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
fe90: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
fea0: 20 78 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c   x1 WHERE rowid<
feb0: 33 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73  32;.  }.  recurs
fec0: 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32  ive_select 64 x2
fed0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
fee0: 67 65 72 31 2d 32 34 2e 31 2e 33 20 7b 0a 20 20  ger1-24.1.3 {.  
fef0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
ff00: 20 55 50 44 41 54 45 20 78 31 20 53 45 54 20 7a   UPDATE x1 SET z
ff10: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29   = a_string(300)
ff20: 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b   WHERE rowid>40;
ff30: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20  .    COMMIT;.   
ff40: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
ff50: 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c  y_check;.    SEL
ff60: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
ff70: 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20  M x1;.  }.} {ok 
ff80: 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  33}..do_test pag
ff90: 65 72 31 2d 32 34 2e 31 2e 34 20 7b 0a 20 20 65  er1-24.1.4 {.  e
ffa0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
ffb0: 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20  ETE FROM x1;.   
ffc0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
ffd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32  SELECT * FROM x2
ffe0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
fff0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78     DELETE FROM x
10000 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c 33 32  1 WHERE rowid<32
10010 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78  ;.      UPDATE x
10020 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69  1 SET z = a_stri
10030 6e 67 28 32 39 39 29 20 57 48 45 52 45 20 72 6f  ng(299) WHERE ro
10040 77 69 64 3e 34 30 3b 0a 20 20 7d 0a 20 20 72 65  wid>40;.  }.  re
10050 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36  cursive_select 6
10060 34 20 78 32 20 7b 64 62 20 65 76 61 6c 20 43 4f  4 x2 {db eval CO
10070 4d 4d 49 54 7d 0a 20 20 65 78 65 63 73 71 6c 20  MMIT}.  execsql 
10080 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  {.    PRAGMA int
10090 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
100a0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
100b0 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d  ) FROM x1;.  }.}
100c0 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73   {ok 33}..do_tes
100d0 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 35 20  t pager1-24.1.5 
100e0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
100f0 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31    DELETE FROM x1
10100 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10110 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O x1 SELECT * FR
10120 4f 4d 20 78 32 3b 0a 20 20 7d 0a 20 20 72 65 63  OM x2;.  }.  rec
10130 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34  ursive_select 64
10140 20 78 32 20 7b 20 64 62 20 65 76 61 6c 20 7b 43   x2 { db eval {C
10150 52 45 41 54 45 20 54 41 42 4c 45 20 78 33 28 78  REATE TABLE x3(x
10160 2c 20 79 2c 20 7a 29 7d 20 7d 0a 20 20 65 78 65  , y, z)} }.  exe
10170 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
10180 46 52 4f 4d 20 78 33 20 7d 0a 7d 20 7b 7d 0a 0a  FROM x3 }.} {}..
10190 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
101a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
101e0 74 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 31  test pager1-25-1
101f0 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
10200 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
10210 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
10220 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56  BEGIN;.      SAV
10230 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20  EPOINT abc;.    
10240 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
10250 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
10260 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63   ROLLBACK TO abc
10270 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
10280 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b  }.  db close.} {
10290 7d 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 64 6f 5f  }.breakpoint.do_
102a0 74 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 32  test pager1-25-2
102b0 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
102c0 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
102d0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
102e0 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20  SAVEPOINT abc;. 
102f0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
10300 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
10310 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b  ROLLBACK TO abc;
10320 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
10330 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d  .  db close.} {}
10340 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
10350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53  ------------.# S
10390 65 63 74 6f 72 2d 73 69 7a 65 20 74 65 73 74 73  ector-size tests
103a0 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
103b0 72 31 2d 32 36 2e 31 20 7b 0a 20 20 74 65 73 74  r1-26.1 {.  test
103c0 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
103d0 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  1.  tv sectorsiz
103e0 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69  e 4096.  faultsi
103f0 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
10400 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
10410 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
10420 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
10430 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
10440 20 3d 20 35 31 32 3b 0a 20 20 20 20 43 52 45 41   = 512;.    CREA
10450 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 20 50  TE TABLE tbl(a P
10460 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e  RIMARY KEY, b UN
10470 49 51 55 45 29 3b 0a 20 20 20 20 42 45 47 49 4e  IQUE);.    BEGIN
10480 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
10490 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 61  NTO tbl VALUES(a
104a0 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
104b0 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20  tring(600));.   
104c0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
104d0 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
104e0 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
104f0 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
10500 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
10510 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
10520 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
10530 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
10540 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
10550 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
10560 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
10570 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10580 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45   tbl;.      INSE
10590 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
105a0 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
105b0 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
105c0 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49  ROM tbl;.      I
105d0 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
105e0 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
105f0 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
10600 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
10610 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
10620 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
10630 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
10640 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
10650 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10660 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
10670 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
10680 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
10690 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
106a0 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71  }.} {}.do_execsq
106b0 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 36  l_test pager1-26
106c0 2e 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74 62  .1 {.  UPDATE tb
106d0 6c 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  l SET b = a_stri
106e0 6e 67 28 35 35 30 29 3b 0a 7d 20 7b 7d 0a 64 62  ng(550);.} {}.db
106f0 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
10700 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
10710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64  ------------.#.d
10750 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 32 37  o_test pager1.27
10760 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
10770 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
10780 6e 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  n.  sqlite3_page
10790 72 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20  r_refcounts db. 
107a0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
107b0 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
107c0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
107d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
107e0 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
107f0 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20 43 4f   db.  execsql CO
10800 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  MMIT.} {}..#----
10810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10850 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
10860 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  t attempting to 
10870 6f 70 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61  open a write-tra
10880 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 20 0a 23  nsaction with .#
10890 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
108a0 63 6c 75 73 69 76 65 20 69 6e 20 57 41 4c 20 6d  clusive in WAL m
108b0 6f 64 65 20 66 61 69 6c 73 20 69 66 20 74 68 65  ode fails if the
108c0 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6c 69  re are other cli
108d0 65 6e 74 73 20 6f 6e 20 0a 23 20 74 68 65 20 73  ents on .# the s
108e0 61 6d 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a  ame database..#.
108f0 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
10900 20 7d 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c   }.ifcapable wal
10910 20 7b 0a 20 20 64 6f 5f 6d 75 6c 74 69 63 6c 69   {.  do_multicli
10920 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20  ent_test tn {.  
10930 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10940 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  -28.$tn.1 {.    
10950 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20    sql1 { .      
10960 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
10970 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
10980 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
10990 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
109a0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
109b0 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t1 VALUES('a', '
109c0 62 27 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b');.      }.   
109d0 20 7d 20 7b 77 61 6c 7d 0a 20 20 20 20 64 6f 5f   } {wal}.    do_
109e0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
109f0 74 6e 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45  tn.2 { sql2 { SE
10a00 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
10a10 20 7d 20 7b 61 20 62 7d 0a 0a 20 20 20 20 64 6f   } {a b}..    do
10a20 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10a30 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20 50  $tn.3 { sql1 { P
10a40 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
10a50 64 65 3d 65 78 63 6c 75 73 69 76 65 20 7d 20 7d  de=exclusive } }
10a60 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 20 20 20   {exclusive}.   
10a70 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10a80 32 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20  28.$tn.4 { .    
10a90 20 20 63 73 71 6c 31 20 7b 20 42 45 47 49 4e 3b    csql1 { BEGIN;
10aa0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
10ab0 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29  VALUES('c', 'd')
10ac0 3b 20 7d 0a 20 20 20 20 7d 20 7b 31 20 7b 64 61  ; }.    } {1 {da
10ad0 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
10ae0 7d 7d 0a 20 20 20 20 63 6f 64 65 32 20 7b 20 64  }}.    code2 { d
10af0 62 32 20 63 6c 6f 73 65 20 3b 20 73 71 6c 69 74  b2 close ; sqlit
10b00 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 7d  e3 db2 test.db }
10b10 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
10b20 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 0a  er1-28.$tn.4 { .
10b30 20 20 20 20 20 20 73 71 6c 31 20 7b 20 49 4e 53        sql1 { INS
10b40 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
10b50 45 53 28 27 63 27 2c 20 27 64 27 29 3b 20 43 4f  ES('c', 'd'); CO
10b60 4d 4d 49 54 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a  MMIT }.    } {}.
10b70 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d    }.}..#--------
10b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bc0 2d 0a 23 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68  -.# Normally, wh
10bd0 65 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d  en changing from
10be0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
10bf0 52 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20  RSIST to DELETE 
10c00 74 68 65 20 70 61 67 65 72 0a 23 20 61 74 74 65  the pager.# atte
10c10 6d 70 74 73 20 74 6f 20 64 65 6c 65 74 65 20 74  mpts to delete t
10c20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
10c30 20 48 6f 77 65 76 65 72 2c 20 69 66 20 69 74 20   However, if it 
10c40 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 20 61 0a  cannot obtain a.
10c50 23 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  # RESERVED lock 
10c60 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
10c70 66 69 6c 65 2c 20 74 68 69 73 20 73 74 65 70 20  file, this step 
10c80 69 73 20 73 6b 69 70 70 65 64 2e 0a 23 0a 64 6f  is skipped..#.do
10c90 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73  _multiclient_tes
10ca0 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74  t tn {.  do_test
10cb0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
10cc0 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20   {.    sql1 { . 
10cd0 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
10ce0 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
10cf0 53 54 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  ST;.      CREATE
10d00 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
10d10 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10d20 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27  TO t1 VALUES('a'
10d30 2c 20 27 62 27 29 3b 0a 20 20 20 20 7d 0a 20 20  , 'b');.    }.  
10d40 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f  } {persist}.  do
10d50 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10d60 24 74 6e 2e 32 20 7b 20 66 69 6c 65 20 65 78 69  $tn.2 { file exi
10d70 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
10d80 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  nal } 1.  do_tes
10d90 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10da0 33 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d  3 { sql1 { PRAGM
10db0 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
10dc0 20 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65   DELETE } } dele
10dd0 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  te.  do_test pag
10de0 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 66  er1-28.$tn.4 { f
10df0 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
10e00 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a  db-journal } 0..
10e10 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10e20 2d 32 38 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20  -28.$tn.5 {.    
10e30 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52  sql1 { .      PR
10e40 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
10e50 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
10e60 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10e70 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64  1 VALUES('c', 'd
10e80 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70  ');.    }.  } {p
10e90 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73  ersist}.  do_tes
10ea0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10eb0 36 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  6 { file exists 
10ec0 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
10ed0 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } 1.  do_test pa
10ee0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 37 20 7b 0a  ger1-28.$tn.7 {.
10ef0 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
10f00 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  ; INSERT INTO t1
10f10 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27   VALUES('e', 'f'
10f20 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  ); }.  } {}.  do
10f30 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10f40 24 74 6e 2e 38 20 20 7b 20 66 69 6c 65 20 65 78  $tn.8  { file ex
10f50 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
10f60 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65  rnal } 1.  do_te
10f70 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
10f80 2e 39 20 20 7b 20 73 71 6c 31 20 7b 20 50 52 41  .9  { sql1 { PRA
10f90 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
10fa0 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20 64 65   = DELETE } } de
10fb0 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70  lete.  do_test p
10fc0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 30 20  ager1-28.$tn.10 
10fd0 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
10fe0 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
10ff0 31 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  1..  do_test pag
11000 65 72 31 2d 32 38 2e 24 74 6e 2e 31 31 20 7b 20  er1-28.$tn.11 { 
11010 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d  sql2 COMMIT } {}
11020 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11030 31 2d 32 38 2e 24 74 6e 2e 31 32 20 7b 20 66 69  1-28.$tn.12 { fi
11040 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
11050 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20  b-journal } 0.. 
11060 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11070 32 38 2d 24 74 6e 2e 31 33 20 7b 0a 20 20 20 20  28-$tn.13 {.    
11080 63 6f 64 65 31 20 7b 20 73 65 74 20 63 68 61 6e  code1 { set chan
11090 6e 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62  nel [db incrblob
110a0 20 2d 72 65 61 64 6f 6e 6c 79 20 74 31 20 61 20   -readonly t1 a 
110b0 32 5d 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 0a  2] }.    sql1 {.
110c0 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
110d0 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
110e0 49 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  IST;.      INSER
110f0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
11100 28 27 67 27 2c 20 27 68 27 29 3b 0a 20 20 20 20  ('g', 'h');.    
11110 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a  }.  } {persist}.
11120 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11130 2d 32 38 2e 24 74 6e 2e 31 34 20 7b 20 66 69 6c  -28.$tn.14 { fil
11140 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
11150 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64  -journal } 1.  d
11160 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11170 2e 24 74 6e 2e 31 35 20 7b 0a 20 20 20 20 73 71  .$tn.15 {.    sq
11180 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45  l2 { BEGIN; INSE
11190 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
111a0 53 28 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20  S('e', 'f'); }. 
111b0 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
111c0 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 36  pager1-28.$tn.16
111d0 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41   { sql1 { PRAGMA
111e0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
111f0 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74  DELETE } } delet
11200 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  e.  do_test page
11210 72 31 2d 32 38 2e 24 74 6e 2e 31 37 20 7b 20 66  r1-28.$tn.17 { f
11220 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
11230 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a  db-journal } 1..
11240 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11250 2d 32 38 2e 24 74 6e 2e 31 37 20 7b 20 63 73 71  -28.$tn.17 { csq
11260 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20  l2 { COMMIT } } 
11270 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
11280 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
11290 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e  st pager1-28-$tn
112a0 2e 31 38 20 7b 20 63 6f 64 65 31 20 7b 20 72 65  .18 { code1 { re
112b0 61 64 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20  ad $channel } } 
112c0 63 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  c.  do_test page
112d0 72 31 2d 32 38 2d 24 74 6e 2e 31 39 20 7b 20 63  r1-28-$tn.19 { c
112e0 6f 64 65 31 20 7b 20 63 6c 6f 73 65 20 24 63 68  ode1 { close $ch
112f0 61 6e 6e 65 6c 20 7d 20 7d 20 7b 7d 0a 20 20 64  annel } } {}.  d
11300 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11310 2e 24 74 6e 2e 32 30 20 7b 20 73 71 6c 32 20 7b  .$tn.20 { sql2 {
11320 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 7d   COMMIT } } {}.}
11330 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
11340 2d 32 39 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  -29.1 {.  faults
11350 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
11360 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
11370 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
11380 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
11390 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
113a0 63 75 75 6d 20 3d 20 66 75 6c 6c 3b 0a 20 20 20  cuum = full;.   
113b0 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
113c0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 3b 0a  mode=exclusive;.
113d0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
113e0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
113f0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11400 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a  LUES(1, 2);.  }.
11410 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
11420 2e 64 62 0a 7d 20 5b 65 78 70 72 20 31 30 32 34  .db.} [expr 1024
11430 2a 33 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  *3].do_test page
11440 72 31 2d 32 39 2e 32 20 7b 0a 20 20 65 78 65 63  r1-29.2 {.  exec
11450 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
11460 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39   page_size = 409
11470 36 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20  6;.    VACUUM;. 
11480 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
11490 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 34  est.db.} [expr 4
114a0 30 39 36 2a 33 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  096*3]..#-------
114b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114f0 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  --.# Test that i
11500 66 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62  f an empty datab
11510 61 73 65 20 66 69 6c 65 20 28 73 69 7a 65 20 30  ase file (size 0
11520 20 62 79 74 65 73 29 20 69 73 20 6f 70 65 6e 65   bytes) is opene
11530 64 20 69 6e 20 0a 23 20 65 78 63 6c 75 73 69 76  d in .# exclusiv
11540 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
11550 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11560 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   is deleted from
11570 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
11580 0a 23 20 77 69 74 68 6f 75 74 20 62 65 69 6e 67  .# without being
11590 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 41 6e   rolled back. An
115a0 64 20 74 68 61 74 20 74 68 65 20 52 45 53 45 52  d that the RESER
115b0 56 45 44 20 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  VED lock obtaine
115c0 64 20 77 68 69 6c 65 0a 23 20 64 6f 69 6e 67 20  d while.# doing 
115d0 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 6c 65  this is not rele
115e0 61 73 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ased..#.do_test 
115f0 70 61 67 65 72 31 2d 33 30 2e 31 20 7b 0a 20 20  pager1-30.1 {.  
11600 64 62 20 63 6c 6f 73 65 0a 20 20 64 65 6c 65 74  db close.  delet
11610 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 0a 20  e_file test.db. 
11620 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73   delete_file tes
11630 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73  t.db-journal.  s
11640 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74  et fd [open test
11650 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20  .db-journal w]. 
11660 20 73 65 65 6b 20 24 66 64 20 5b 65 78 70 72 20   seek $fd [expr 
11670 35 31 32 2b 31 30 33 32 2a 32 5d 0a 20 20 70 75  512+1032*2].  pu
11680 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66  ts -nonewline $f
11690 64 20 78 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  d x.  close $fd.
116a0 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
116b0 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
116c0 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  {.    PRAGMA loc
116d0 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
116e0 49 56 45 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  IVE;.    SELECT 
116f0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
11700 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20  lite_master;.   
11710 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
11720 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c  tus;.  }.} {excl
11730 75 73 69 76 65 20 30 20 6d 61 69 6e 20 72 65 73  usive 0 main res
11740 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73 65  erved temp close
11750 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  d}..#-----------
11760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
117a0 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
117b0 65 20 22 70 61 67 65 2d 73 69 7a 65 22 20 66 69  e "page-size" fi
117c0 65 6c 64 20 69 6e 20 61 20 6a 6f 75 72 6e 61 6c  eld in a journal
117d0 2d 68 65 61 64 65 72 20 69 73 20 30 2c 20 74 68  -header is 0, th
117e0 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 66 69 6c 65  e journal.# file
117f0 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 72 6f   can still be ro
11800 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
11810 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
11820 62 61 63 6b 77 61 72 64 20 63 6f 6d 70 61 74 69  backward compati
11830 62 69 6c 69 74 79 20 2d 0a 23 20 76 65 72 73 69  bility -.# versi
11840 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
11850 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 61 6c 77  ior to 3.5.8 alw
11860 61 79 73 20 73 65 74 20 74 68 69 73 20 66 69 65  ays set this fie
11870 6c 64 20 74 6f 20 7a 65 72 6f 2e 0a 23 0a 69 66  ld to zero..#.if
11880 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   {$tcl_platform(
11890 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78  platform)=="unix
118a0 22 7d 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67  "} {.do_test pag
118b0 65 72 31 2d 33 31 2e 31 20 7b 0a 20 20 66 61 75  er1-31.1 {.  fau
118c0 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
118d0 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
118e0 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
118f0 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
11900 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
11910 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
11920 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
11930 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
11940 20 79 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   y));.    INSERT
11950 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
11960 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
11970 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
11980 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
11990 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
119a0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
119b0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
119c0 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
119d0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
119e0 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
119f0 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11a00 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
11a10 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11a20 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
11a30 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
11a40 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
11a50 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
11a60 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
11a70 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11a80 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
11a90 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
11aa0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11ab0 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
11ac0 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11ad0 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
11ae0 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
11af0 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
11b00 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
11b10 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
11b20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
11b30 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11b40 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
11b50 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
11b60 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
11b70 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11b80 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
11b90 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11ba0 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
11bb0 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
11bc0 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
11bd0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
11be0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11bf0 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
11c00 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
11c10 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
11c20 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11c30 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
11c40 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
11c50 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
11c60 79 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  y = randomblob(1
11c70 34 39 39 29 3b 0a 20 20 7d 0a 20 20 63 6f 70 79  499);.  }.  copy
11c80 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 20 74 65  _file test.db te
11c90 73 74 2e 64 62 32 0a 20 20 63 6f 70 79 5f 66 69  st.db2.  copy_fi
11ca0 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  le test.db-journ
11cb0 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72  al test.db2-jour
11cc0 6e 61 6c 0a 20 20 0a 20 20 68 65 78 69 6f 5f 77  nal.  .  hexio_w
11cd0 72 69 74 65 20 74 65 73 74 2e 64 62 32 2d 6a 6f  rite test.db2-jo
11ce0 75 72 6e 61 6c 20 32 34 20 30 30 30 30 30 30 30  urnal 24 0000000
11cf0 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  0.  sqlite3 db2 
11d00 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73  test.db2.  execs
11d10 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  ql { PRAGMA inte
11d20 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62  grity_check } db
11d30 32 0a 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 23 2d 2d 2d  2.} {ok}.}..#---
11d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d80 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
11d90 61 74 20 61 20 64 61 74 61 62 61 73 65 20 66 69  at a database fi
11da0 6c 65 20 63 61 6e 20 62 65 20 22 70 72 65 2d 68  le can be "pre-h
11db0 69 6e 74 65 64 22 20 74 6f 20 61 20 63 65 72 74  inted" to a cert
11dc0 61 69 6e 20 73 69 7a 65 20 61 6e 64 20 74 68 61  ain size and tha
11dd0 74 0a 23 20 73 75 62 73 65 71 75 65 6e 74 20 73  t.# subsequent s
11de0 70 69 6c 6c 69 6e 67 20 6f 66 20 74 68 65 20 70  pilling of the p
11df0 61 67 65 72 20 63 61 63 68 65 20 64 6f 65 73 20  ager cache does 
11e00 6e 6f 74 20 72 65 73 75 6c 74 20 69 6e 20 74 68  not result in th
11e10 65 20 64 61 74 61 62 61 73 65 0a 23 20 66 69 6c  e database.# fil
11e20 65 20 62 65 69 6e 67 20 73 68 72 75 6e 6b 2e 0a  e being shrunk..
11e30 23 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73  #.catch {db clos
11e40 65 7d 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  e}.forcedelete t
11e50 65 73 74 2e 64 62 0a 0a 64 6f 5f 74 65 73 74 20  est.db..do_test 
11e60 70 61 67 65 72 31 2d 33 32 2e 31 20 7b 0a 20 20  pager1-32.1 {.  
11e70 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
11e80 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
11e90 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
11ea0 74 31 28 78 2c 20 79 29 3b 0a 20 20 7d 0a 20 20  t1(x, y);.  }.  
11eb0 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  db close.  sqlit
11ec0 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
11ed0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
11ee0 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
11ef0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
11f00 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
11f10 30 30 29 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  00));.  }.  file
11f20 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69  _control_chunksi
11f30 7a 65 5f 74 65 73 74 20 64 62 20 6d 61 69 6e 20  ze_test db main 
11f40 31 30 32 34 0a 20 20 66 69 6c 65 5f 63 6f 6e 74  1024.  file_cont
11f50 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73  rol_sizehint_tes
11f60 74 20 64 62 20 6d 61 69 6e 20 32 30 39 37 31 35  t db main 209715
11f70 32 30 3b 20 23 20 32 30 4d 42 0a 20 20 65 78 65  20; # 20MB.  exe
11f80 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
11f90 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
11fa0 30 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  0;.    INSERT IN
11fb0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
11fc0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30  randomblob(10000
11fd0 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
11fe0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
11ff0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
12000 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
12010 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78  INTO t1 SELECT x
12020 2b 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  +2, randomblob(1
12030 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20  0000) from t1;. 
12040 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
12050 31 20 53 45 4c 45 43 54 20 78 2b 34 2c 20 72 61  1 SELECT x+4, ra
12060 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20  ndomblob(10000) 
12070 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53  from t1;.    INS
12080 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
12090 43 54 20 78 2b 38 2c 20 72 61 6e 64 6f 6d 62 6c  CT x+8, randombl
120a0 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74  ob(10000) from t
120b0 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
120c0 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 31  TO t1 SELECT x+1
120d0 36 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  6, randomblob(10
120e0 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20  000) from t1;.  
120f0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
12100 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43  ) FROM t1;.    C
12110 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20  OMMIT;.  }.  db 
12120 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 73 69 7a  close.  file siz
12130 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 32 30 39  e test.db.} {209
12140 37 31 35 32 30 7d 0a 0a 23 20 43 6c 65 61 6e 75  71520}..# Cleanu
12150 70 20 32 30 4d 42 20 66 69 6c 65 20 6c 65 66 74  p 20MB file left
12160 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
12170 20 74 65 73 74 2e 0a 66 6f 72 63 65 64 65 6c 65   test..forcedele
12180 74 65 20 74 65 73 74 2e 64 62 0a 0a 66 69 6e 69  te test.db..fini
12190 73 68 5f 74 65 73 74 0a                          sh_test.