/ Hex Artifact Content
Login

Artifact aa819efb5c58cef7afd0504849f3ab27eaa926a3:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e 6f 74 20  n.tcl..# Do not 
0210: 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 20  use a codec for 
0220: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0230: 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 62  le, as the datab
0240: 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d 61  ase file is.# ma
0250: 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 74  nipulated direct
0260: 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 72  ly using tcl scr
0270: 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 20  ipts (using the 
0280: 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 6f  [hexio_write] co
0290: 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f 74  mmand)..#.do_not
02a0: 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 20  _use_codec..#.# 
02b0: 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 74  pager1-1.*: Test
02c0: 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 6c   inter-process l
02d0: 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 20  ocking (clients 
02e0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
02f0: 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 65  esses)..#.# page
0300: 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e 74  r1-2.*: Test int
0310: 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b 69  ra-process locki
0320: 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c 69  ng (multiple cli
0330: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ents in this pro
0340: 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 72  cess)..#.# pager
0350: 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e 74  1-3.*: Savepoint
0360: 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a   related tests..
0370: 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a 20  #.# pager1-4.*: 
0380: 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c 61  Hot-journal rela
0390: 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 70  ted tests..#.# p
03a0: 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 73  ager1-5.*: Cases
03b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c 74   related to mult
03c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
03d0: 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a 20  #.# pager1-6.*: 
03e0: 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f  Cases related to
03f0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
0400: 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 67  e_count".#.# pag
0410: 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 73  er1-7.*: Cases s
0420: 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47  pecific to "PRAG
0430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0440: 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 61  TRUNCATE".#.# pa
0450: 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 20  ger1-8.*: Cases 
0460: 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  using temporary 
0470: 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
0480: 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  tabases..#.# pag
0490: 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 72  er1-9.*: Tests r
04a0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  elated to the ba
04b0: 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 61  ckup API..#.# pa
04c0: 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 20  ger1-10.*: Test 
04d0: 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 64  that the assumed
04e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
04f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d 69  tor-size is limi
0500: 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ted to.#        
0510: 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 20        64KB..#.# 
0520: 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 73  pager1-12.*: Tes
0530: 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 52  ts involving "PR
0540: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
0550: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a 3a  #.# pager1-13.*:
0560: 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 20   Cases specific 
0570: 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  to "PRAGMA journ
0580: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
0590: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e 2a  .#.# pager1-14.*
05a0: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
05b0: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
05c0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 0a  nal_mode=OFF".#.
05d0: 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 56  # pager1-15.*: V
05e0: 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76  arying sqlite3_v
05f0: 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 20  fs.szOsFile.#.# 
0600: 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 72  pager1-16.*: Var
0610: 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ying sqlite3_vfs
0620: 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 20  .mxPathname.#.# 
0630: 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 73  pager1-17.*: Tes
0640: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 50  ts related to "P
0650: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
0660: 6f 63 6b 22 0a 23 20 20 20 20 20 20 20 20 20 20  ock".#          
0670: 20 20 20 20 28 54 68 65 20 6f 6d 69 74 5f 72 65      (The omit_re
0680: 61 64 6c 6f 63 6b 20 70 72 61 67 6d 61 20 68 61  adlock pragma ha
0690: 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 61  s been removed a
06a0: 6e 64 20 73 6f 20 68 61 76 65 0a 23 20 20 20 20  nd so have.#    
06b0: 20 20 20 20 20 20 20 20 20 20 74 68 65 73 65 20            these 
06c0: 74 65 73 74 73 2e 29 0a 23 0a 23 20 70 61 67 65  tests.).#.# page
06d0: 72 31 2d 31 38 2e 2a 3a 20 54 65 73 74 20 74 68  r1-18.*: Test th
06e0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  at the pager lay
06f0: 65 72 20 72 65 73 70 6f 6e 64 73 20 63 6f 72 72  er responds corr
0700: 65 63 74 6c 79 20 69 66 20 74 68 65 20 62 2d 74  ectly if the b-t
0710: 72 65 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ree.#           
0720: 20 20 20 72 65 71 75 65 73 74 73 20 61 6e 20 69     requests an i
0730: 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
0740: 65 72 20 28 64 75 65 20 74 6f 20 64 62 20 63 6f  er (due to db co
0750: 72 72 75 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72  rruption)..#..pr
0760: 6f 63 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  oc recursive_sel
0770: 65 63 74 20 7b 69 64 20 74 61 62 6c 65 20 7b 73  ect {id table {s
0780: 63 72 69 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73  cript {}}} {.  s
0790: 65 74 20 63 6e 74 20 30 0a 20 20 64 62 20 65 76  et cnt 0.  db ev
07a0: 61 6c 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64  al "SELECT rowid
07b0: 2c 20 2a 20 46 52 4f 4d 20 24 74 61 62 6c 65 20  , * FROM $table 
07c0: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 28 24  WHERE rowid = ($
07d0: 69 64 2d 31 29 22 20 7b 0a 20 20 20 20 72 65 63  id-1)" {.    rec
07e0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 24 72  ursive_select $r
07f0: 6f 77 69 64 20 24 74 61 62 6c 65 20 24 73 63 72  owid $table $scr
0800: 69 70 74 0a 20 20 20 20 69 6e 63 72 20 63 6e 74  ipt.    incr cnt
0810: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d  .  }.  if {$cnt=
0820: 3d 30 7d 20 7b 20 65 76 61 6c 20 24 73 63 72 69  =0} { eval $scri
0830: 70 74 20 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74  pt }.}..set a_st
0840: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70  ring_counter 1.p
0850: 72 6f 63 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d  roc a_string {n}
0860: 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74   {.  global a_st
0870: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69  ring_counter.  i
0880: 6e 63 72 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75  ncr a_string_cou
0890: 6e 74 65 72 0a 20 20 73 74 72 69 6e 67 20 72 61  nter.  string ra
08a0: 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70 65  nge [string repe
08b0: 61 74 20 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63  at "${a_string_c
08c0: 6f 75 6e 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20  ounter}." $n] 1 
08d0: 24 6e 0a 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73  $n.}.db func a_s
08e0: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a  tring a_string..
08f0: 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
0900: 65 73 74 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72  est tn {..  # Cr
0910: 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  eate and populat
0920: 65 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  e a database tab
0930: 6c 65 20 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74  le using connect
0940: 69 6f 6e 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20  ion [db]. Check 
0950: 0a 20 20 23 20 74 68 61 74 20 63 6f 6e 6e 65 63  .  # that connec
0960: 74 69 6f 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20  tions [db2] and 
0970: 5b 64 62 33 5d 20 63 61 6e 20 73 65 65 20 74 68  [db3] can see th
0980: 65 20 73 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e  e schema and con
0990: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
09a0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
09b0: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   {.    sql1 {.  
09c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
09d0: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
09e0: 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  Y, b);.      CRE
09f0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
0a00: 74 31 28 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  t1(b);.      INS
0a10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0a20: 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e  ES(1, 'one'); IN
0a30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0a40: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
0a50: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
0a60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a70: 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  .2 { sql2 { SELE
0a80: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a90: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20   {1 one 2 two}. 
0aa0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
0ab0: 24 74 6e 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53  $tn.3 { sql3 { S
0ac0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0ad0: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
0ae0: 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 74 72  }..  # Open a tr
0af0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 64  ansaction and ad
0b00: 64 20 61 20 72 6f 77 20 75 73 69 6e 67 20 5b 64  d a row using [d
0b10: 62 5d 2e 20 54 68 69 73 20 70 75 74 73 20 5b 64  b]. This puts [d
0b20: 62 5d 20 69 6e 0a 20 20 23 20 52 45 53 45 52 56  b] in.  # RESERV
0b30: 45 44 20 73 74 61 74 65 2e 20 43 68 65 63 6b 20  ED state. Check 
0b40: 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  that connections
0b50: 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d   [db2] and [db3]
0b60: 20 63 61 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72   can still.  # r
0b70: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
0b80: 20 63 6f 6e 74 65 6e 74 20 61 73 20 69 74 20 77   content as it w
0b90: 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  as before the tr
0ba0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20  ansaction was.  
0bb0: 23 20 6f 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73  # opened. [db] s
0bc0: 68 6f 75 6c 64 20 73 65 65 20 74 68 65 20 69 6e  hould see the in
0bd0: 73 65 72 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a  serted row..  #.
0be0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0bf0: 2d 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c  -$tn.4 {.    sql
0c00: 31 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  1 {.      BEGIN;
0c10: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
0c20: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
0c30: 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20  , 'three');.    
0c40: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0c50: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 35 20  st pager1-$tn.5 
0c60: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0c70: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c80: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0c90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0ca0: 2e 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  .7 { sql1 { SELE
0cb0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0cc0: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20   {1 one 2 two 3 
0cd0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d  three}..  # [db]
0ce0: 20 73 74 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70   still has an op
0cf0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
0d00: 74 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61 74  tion. Check that
0d10: 20 74 68 69 73 20 70 72 65 76 65 6e 74 73 0a 20   this prevents. 
0d20: 20 23 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   # other connect
0d30: 69 6f 6e 73 20 28 73 70 65 63 69 66 69 63 61 6c  ions (specifical
0d40: 6c 79 20 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77  ly [db2]) from w
0d50: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
0d60: 74 61 62 61 73 65 2e 0a 20 20 23 0a 20 20 23 20  tabase..  #.  # 
0d70: 45 76 65 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70  Even if [db2] op
0d80: 65 6e 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ens a transactio
0d90: 6e 20 66 69 72 73 74 2c 20 69 74 20 6d 61 79 20  n first, it may 
0da0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
0db0: 0a 20 20 23 20 64 61 74 61 62 61 73 65 2e 20 41  .  # database. A
0dc0: 66 74 65 72 20 74 68 65 20 61 74 74 65 6d 70 74  fter the attempt
0dd0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64 62   to write the db
0de0: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
0df0: 63 74 69 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32  ction, .  # [db2
0e00: 5d 20 69 73 20 6c 65 66 74 20 77 69 74 68 20 61  ] is left with a
0e10: 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
0e20: 6f 6e 2c 20 62 75 74 20 6e 6f 74 20 61 20 72 65  on, but not a re
0e30: 61 64 2d 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74  ad-lock on.  # t
0e40: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
0e50: 2e 20 53 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74  . So it does not
0e60: 20 70 72 65 76 65 6e 74 20 5b 64 62 5d 20 66 72   prevent [db] fr
0e70: 6f 6d 20 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20  om committing.. 
0e80: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
0e90: 65 72 31 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20  er1-$tn.8 { .   
0ea0: 20 63 73 71 6c 32 20 7b 20 55 50 44 41 54 45 20   csql2 { UPDATE 
0eb0: 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31  t1 SET a = a + 1
0ec0: 30 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61  0 }.  } {1 {data
0ed0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
0ee0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
0ef0: 31 2d 24 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63  1-$tn.9 { .    c
0f00: 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 42 45  sql2 { .      BE
0f10: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
0f20: 45 20 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b  E t1 SET a = a +
0f30: 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   10;.    }.  } {
0f40: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
0f50: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
0f60: 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74  e [db] commit it
0f70: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  s transactions. 
0f80: 43 68 65 63 6b 20 74 68 65 20 6f 74 68 65 72 20  Check the other 
0f90: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a  connections can.
0fa0: 20 20 23 20 6e 6f 77 20 73 65 65 20 74 68 65 20    # now see the 
0fb0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 63 6f 6e  new database con
0fc0: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
0fd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
0fe0: 30 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49  0 { sql1 { COMMI
0ff0: 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  T } } {}.  do_te
1000: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 31  st pager1-$tn.11
1010: 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54   { sql1 { SELECT
1020: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1030: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1040: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1050: 61 67 65 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73  ager1-$tn.12 { s
1060: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
1070: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1080: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1090: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10a0: 31 2d 24 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20  1-$tn.13 { sql3 
10b0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
10c0: 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20  t1 } } {1 one 2 
10d0: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20  two 3 three}..  
10e0: 23 20 43 68 65 63 6b 20 74 68 61 74 2c 20 61 73  # Check that, as
10f0: 20 6e 6f 74 65 64 20 61 62 6f 76 65 2c 20 5b 64   noted above, [d
1100: 62 32 5d 20 72 65 61 6c 6c 79 20 64 69 64 20 6b  b2] really did k
1110: 65 65 70 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  eep an open tran
1120: 73 61 63 74 69 6f 6e 0a 20 20 23 20 61 66 74 65  saction.  # afte
1130: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
1140: 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62   write the datab
1150: 61 73 65 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a  ase failed..  #.
1160: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1170: 2d 24 74 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63  -$tn.14 { .    c
1180: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a  sql2 { BEGIN } .
1190: 20 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73    } {1 {cannot s
11a0: 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
11b0: 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  on within a tran
11c0: 73 61 63 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74  saction}}.  do_t
11d0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
11e0: 35 20 7b 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42  5 { sql2 { ROLLB
11f0: 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20  ACK } } {}..  # 
1200: 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20  Have [db2] open 
1210: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
1220: 64 20 74 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f  d take a read-lo
1230: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1240: 73 65 2e 0a 20 20 23 20 43 68 65 63 6b 20 74 68  se..  # Check th
1250: 61 74 20 74 68 69 73 20 70 72 65 76 65 6e 74 73  at this prevents
1260: 20 5b 64 62 5d 20 66 72 6f 6d 20 77 72 69 74 69   [db] from writi
1270: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1280: 73 65 20 28 6f 75 74 73 69 64 65 0a 20 20 23 20  se (outside.  # 
1290: 6f 66 20 61 6e 79 20 74 72 61 6e 73 61 63 74 69  of any transacti
12a0: 6f 6e 29 2e 20 41 66 74 65 72 20 74 68 69 73 20  on). After this 
12b0: 66 61 69 6c 73 2c 20 63 68 65 63 6b 20 74 68 61  fails, check tha
12c0: 74 20 5b 64 62 33 5d 20 63 61 6e 20 72 65 61 64  t [db3] can read
12d0: 0a 20 20 23 20 74 68 65 20 64 62 20 28 73 68 6f  .  # the db (sho
12e0: 77 69 6e 67 20 74 68 61 74 20 5b 64 62 5d 20 64  wing that [db] d
12f0: 69 64 20 6e 6f 74 20 74 61 6b 65 20 61 20 50 45  id not take a PE
1300: 4e 44 49 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29  NDING lock etc.)
1310: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
1320: 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a  ager1-$tn.15 { .
1330: 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
1340: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1350: 74 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65  t1; }.  } {1 one
1360: 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a   2 two 3 three}.
1370: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1380: 2d 24 74 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63  -$tn.16 { .    c
1390: 73 71 6c 31 20 7b 20 55 50 44 41 54 45 20 74 31  sql1 { UPDATE t1
13a0: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20   SET a = a + 10 
13b0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
13c0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
13d0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
13e0: 24 74 6e 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20  $tn.17 { sql3 { 
13f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1400: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
1410: 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20  o 3 three}..  # 
1420: 54 68 69 73 20 74 69 6d 65 2c 20 68 61 76 65 20  This time, have 
1430: 5b 64 62 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e  [db] open a tran
1440: 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 77  saction before w
1450: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1460: 61 73 65 2e 0a 20 20 23 20 54 68 69 73 20 77 6f  ase..  # This wo
1470: 72 6b 73 20 2d 20 5b 64 62 5d 20 67 65 74 73 20  rks - [db] gets 
1480: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1490: 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 63  which does not c
14a0: 6f 6e 66 6c 69 63 74 20 77 69 74 68 0a 20 20 23  onflict with.  #
14b0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
14c0: 20 5b 64 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e   [db2] is holdin
14d0: 67 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  g..  #.  do_test
14e0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b   pager1-$tn.18 {
14f0: 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20   .    sql1 { .  
1500: 20 20 20 20 42 45 47 49 4e 3b 20 20 0a 20 20 20      BEGIN;  .   
1510: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
1520: 20 61 20 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20   a = a + 10; .  
1530: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
1540: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d  test pager1-$tn-
1550: 31 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b  19 { .    sql1 {
1560: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
1570: 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e  tus } .  } {main
1580: 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63   reserved temp c
1590: 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74  losed}.  do_test
15a0: 20 70 61 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b   pager1-$tn-20 {
15b0: 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 50 52 41   .    sql2 { PRA
15c0: 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20  GMA lock_status 
15d0: 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61  } .  } {main sha
15e0: 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d  red temp closed}
15f0: 0a 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74  ..  # Check that
1600: 20 61 6c 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   all connections
1610: 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20   can still read 
1620: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 4f 6e  the database. On
1630: 6c 79 20 5b 64 62 5d 20 73 65 65 73 0a 20 20 23  ly [db] sees.  #
1640: 20 74 68 65 20 75 70 64 61 74 65 64 20 63 6f 6e   the updated con
1650: 74 65 6e 74 20 28 61 73 20 74 68 65 20 74 72 61  tent (as the tra
1660: 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1670: 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1680: 79 65 74 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  yet)..  #.  do_t
1690: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
16a0: 31 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  1 { sql1 { SELEC
16b0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
16c0: 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31  {11 one 12 two 1
16d0: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
16e0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 32  st pager1-$tn.22
16f0: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1700: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1710: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1720: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1730: 61 67 65 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73  ager1-$tn.23 { s
1740: 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql3 { SELECT * F
1750: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1760: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1770: 0a 0a 20 20 23 20 42 65 63 61 75 73 65 20 5b 64  ..  # Because [d
1780: 62 32 5d 20 73 74 69 6c 6c 20 68 61 73 20 74 68  b2] still has th
1790: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b  e SHARED lock, [
17a0: 64 62 5d 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  db] is unable to
17b0: 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 23 20   commit the.  # 
17c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
17d0: 69 74 20 74 72 69 65 73 2c 20 61 6e 20 65 72 72  it tries, an err
17e0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  or is returned a
17f0: 6e 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  nd the connectio
1800: 6e 20 0a 20 20 23 20 75 70 67 72 61 64 65 73 20  n .  # upgrades 
1810: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
1820: 6b 2e 0a 20 20 23 0a 20 20 23 20 4f 6e 63 65 20  k..  #.  # Once 
1830: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 5b 64  this happens, [d
1840: 62 5d 20 63 61 6e 20 72 65 61 64 20 74 68 65 20  b] can read the 
1850: 64 61 74 61 62 61 73 65 20 61 6e 64 20 73 65 65  database and see
1860: 20 74 68 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74   the new content
1870: 2c 0a 20 20 23 20 5b 64 62 32 5d 20 28 73 74 69  ,.  # [db2] (sti
1880: 6c 6c 20 68 6f 6c 64 69 6e 67 20 53 48 41 52 45  ll holding SHARE
1890: 44 29 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61  D) can still rea
18a0: 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e  d the old conten
18b0: 74 2c 20 62 75 74 20 5b 64 62 33 5d 0a 20 20 23  t, but [db3].  #
18c0: 20 28 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e   (not holding an
18d0: 79 20 6c 6f 63 6b 29 20 69 73 20 70 72 65 76 65  y lock) is preve
18e0: 6e 74 65 64 20 62 79 20 5b 64 62 5d 27 73 20 50  nted by [db]'s P
18f0: 45 4e 44 49 4e 47 20 66 72 6f 6d 20 72 65 61 64  ENDING from read
1900: 69 6e 67 0a 20 20 23 20 74 68 65 20 64 61 74 61  ing.  # the data
1910: 62 61 73 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  base..  #.  do_t
1920: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1930: 34 20 7b 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d  4 { csql1 { COMM
1940: 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  IT } } {1 {datab
1950: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
1960: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1970: 2d 24 74 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73  -$tn-25 { .    s
1980: 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63  ql1 { PRAGMA loc
1990: 6b 5f 73 74 61 74 75 73 20 7d 20 0a 20 20 7d 20  k_status } .  } 
19a0: 7b 6d 61 69 6e 20 70 65 6e 64 69 6e 67 20 74 65  {main pending te
19b0: 6d 70 20 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f  mp closed}.  do_
19c0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
19d0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  26 { sql1 { SELE
19e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
19f0: 7d 20 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f  } {11 one 12 two
1a00: 20 31 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   13 three}.  do_
1a10: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1a20: 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  27 { sql2 { SELE
1a30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
1a40: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
1a50: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1a60: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1a70: 7b 20 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54  { csql3 { SELECT
1a80: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1a90: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1aa0: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
1ab0: 65 20 5b 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69  e [db2] commit i
1ac0: 74 73 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ts read transact
1ad0: 69 6f 6e 2c 20 72 65 6c 65 61 73 69 6e 67 20 74  ion, releasing t
1ae0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69  he SHARED lock i
1af0: 74 0a 20 20 23 20 69 73 20 68 6f 6c 64 69 6e 67  t.  # is holding
1b00: 2e 20 4e 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b  . Now, neither [
1b10: 64 62 32 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d  db2] nor [db3] m
1b20: 61 79 20 72 65 61 64 20 74 68 65 20 64 61 74 61  ay read the data
1b30: 62 61 73 65 20 28 61 73 20 5b 64 62 5d 0a 20 20  base (as [db].  
1b40: 23 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  # is still holdi
1b50: 6e 67 20 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20  ng a PENDING).. 
1b60: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
1b70: 65 72 31 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c  er1-$tn.29 { sql
1b80: 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b  2 { COMMIT } } {
1b90: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1ba0: 72 31 2d 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c  r1-$tn.30 { csql
1bb0: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
1bc0: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1bd0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1be0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1bf0: 72 31 2d 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c  r1-$tn.31 { csql
1c00: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
1c10: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1c20: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1c30: 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 69 73 20 6e  }..  # [db] is n
1c40: 6f 77 20 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69  ow able to commi
1c50: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1c60: 6e 2e 20 4f 6e 63 65 20 74 68 65 20 74 72 61 6e  n. Once the tran
1c70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 20 20 23 20  saction is .  # 
1c80: 63 6f 6d 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74  committed, all t
1c90: 68 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  hree connections
1ca0: 20 63 61 6e 20 72 65 61 64 20 74 68 65 20 6e 65   can read the ne
1cb0: 77 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20  w content..  #. 
1cc0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1cd0: 24 74 6e 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20  $tn.25 { sql1 { 
1ce0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
1cf0: 3d 20 61 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20  = a+10 } } {}.  
1d00: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1d10: 74 6e 2e 32 36 20 7b 20 73 71 6c 31 20 7b 20 43  tn.26 { sql1 { C
1d20: 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64  OMMIT } } {}.  d
1d30: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1d40: 6e 2e 32 37 20 7b 20 73 71 6c 31 20 7b 20 53 45  n.27 { sql1 { SE
1d50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1d60: 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77   } {21 one 22 tw
1d70: 6f 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f  o 23 three}.  do
1d80: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1d90: 2e 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c  .27 { sql2 { SEL
1da0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
1db0: 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f  } {21 one 22 two
1dc0: 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   23 three}.  do_
1dd0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1de0: 32 38 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  28 { sql3 { SELE
1df0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
1e00: 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20   {21 one 22 two 
1e10: 32 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 49  23 three}..  # I
1e20: 6e 73 74 61 6c 6c 20 61 20 62 75 73 79 2d 68 61  nstall a busy-ha
1e30: 6e 64 6c 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63  ndler for connec
1e40: 74 69 6f 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20  tion [db]..  #. 
1e50: 20 73 65 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69   set ::nbusy [li
1e60: 73 74 5d 0a 20 20 70 72 6f 63 20 62 75 73 79 20  st].  proc busy 
1e70: 7b 6e 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  {n} {.    lappen
1e80: 64 20 3a 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20  d ::nbusy $n.   
1e90: 20 69 66 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c   if {$n>5} { sql
1ea0: 32 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72  2 COMMIT }.    r
1eb0: 65 74 75 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62  eturn 0.  }.  db
1ec0: 20 62 75 73 79 20 62 75 73 79 0a 0a 20 20 64 6f   busy busy..  do
1ed0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1ee0: 2e 32 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20  .29 { .    sql1 
1ef0: 7b 20 42 45 47 49 4e 20 3b 20 49 4e 53 45 52 54  { BEGIN ; INSERT
1f00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1f10: 27 78 27 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d  'x', 'y') } .  }
1f20: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
1f30: 67 65 72 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20  ger1-$tn.30 { . 
1f40: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 20     sql2 { BEGIN 
1f50: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1f60: 74 31 20 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e  t1 } .  } {21 on
1f70: 65 20 32 32 20 74 77 6f 20 32 33 20 74 68 72 65  e 22 two 23 thre
1f80: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  e}.  do_test pag
1f90: 65 72 31 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c  er1-$tn.31 { sql
1fa0: 31 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20  1 COMMIT } {}.  
1fb0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1fc0: 74 6e 2e 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62  tn.32 { set ::nb
1fd0: 75 73 79 20 7d 20 7b 30 20 31 20 32 20 33 20 34  usy } {0 1 2 3 4
1fe0: 20 35 20 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   5 6}.}..#------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 0a 23 20 53 61 76 65 70 6f 69 6e 74 20  ---.# Savepoint 
2040: 72 65 6c 61 74 65 64 20 74 65 73 74 20 63 61 73  related test cas
2050: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 33  es..#.# pager1-3
2060: 2e 31 2e 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20  .1.2.*: Force a 
2070: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
2080: 63 6b 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ck to cause the 
2090: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20  database file.# 
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 74 6f 20 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67  to grow..#.# pag
20c0: 65 72 31 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65  er1-3.1.3.*: Use
20d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
20e0: 65 64 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ed in synchronou
20f0: 73 3d 6f 66 66 20 6d 6f 64 65 20 61 73 20 70 61  s=off mode as pa
2100: 72 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  rt.#            
2110: 20 20 20 20 20 6f 66 20 61 20 73 61 76 65 70 6f       of a savepo
2120: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20  int rollback..# 
2130: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
2140: 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  3.1.1 {.  faults
2150: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
2160: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
2170: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2180: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
2190: 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  EY, b);.    CREA
21a0: 54 45 20 54 41 42 4c 45 20 63 6f 75 6e 74 65 72  TE TABLE counter
21b0: 28 0a 20 20 20 20 20 20 69 20 43 48 45 43 4b 20  (.      i CHECK 
21c0: 28 69 3c 35 29 2c 20 0a 20 20 20 20 20 20 75 20  (i<5), .      u 
21d0: 43 48 45 43 4b 20 28 75 3c 31 30 29 0a 20 20 20  CHECK (u<10).   
21e0: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
21f0: 4e 54 4f 20 63 6f 75 6e 74 65 72 20 56 41 4c 55  NTO counter VALU
2200: 45 53 28 30 2c 20 30 29 3b 0a 20 20 20 20 43 52  ES(0, 0);.    CR
2210: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31  EATE TRIGGER tr1
2220: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
2230: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
2240: 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72 20 53  UPDATE counter S
2250: 45 54 20 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20  ET i = i+1;.    
2260: 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20  END;.    CREATE 
2270: 54 52 49 47 47 45 52 20 74 72 32 20 41 46 54 45  TRIGGER tr2 AFTE
2280: 52 20 55 50 44 41 54 45 20 4f 4e 20 74 31 20 42  R UPDATE ON t1 B
2290: 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54  EGIN.      UPDAT
22a0: 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20 75 20  E counter SET u 
22b0: 3d 20 75 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a  = u+1;.    END;.
22c0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
22d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f  SELECT * FROM co
22e0: 75 6e 74 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a  unter }.} {0 0}.
22f0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2300: 20 70 61 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a   pager1-3.1.2 {.
2310: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
2320: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49  ize = 10;.  BEGI
2330: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
2340: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
2350: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2360: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2370: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
2380: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2390: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
23a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
23b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
23c0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
23d0: 46 52 4f 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20  FROM counter;.} 
23e0: 7b 33 20 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71  {3 0}.do_catchsq
23f0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2400: 31 2e 33 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  1.3 {.    INSERT
2410: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2420: 61 2b 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  a+3, randomblob(
2430: 31 35 30 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20  1500) FROM t1.} 
2440: 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66  {1 {constraint f
2450: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73  ailed}}.do_execs
2460: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2470: 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .4 { SELECT * FR
2480: 4f 4d 20 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20  OM counter } {3 
2490: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
24a0: 73 74 20 70 61 67 65 72 31 2d 33 2e 35 20 7b 20  st pager1-3.5 { 
24b0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
24c0: 20 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78   } {1 2 3}.do_ex
24d0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
24e0: 31 2d 33 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d  1-3.6 { COMMIT }
24f0: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e   {}..foreach {tn
2500: 20 73 71 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20   sql tcl} {.  7 
2510: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2520: 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b  onous = NORMAL ;
2530: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
2540: 72 65 20 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74  re = 0 } {.    t
2550: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
2560: 6c 74 20 31 0a 20 20 20 20 74 76 20 64 65 76 63  lt 1.    tv devc
2570: 68 61 72 20 73 61 66 65 5f 61 70 70 65 6e 64 0a  har safe_append.
2580: 20 20 7d 0a 20 20 38 20 20 7b 20 50 52 41 47 4d    }.  8  { PRAGM
2590: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
25a0: 4e 4f 52 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20  NORMAL ; PRAGMA 
25b0: 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d  temp_store = 2 }
25c0: 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74   {.    testvfs t
25d0: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20  v -default 1.   
25e0: 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71 75   tv devchar sequ
25f0: 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20  ential.  }.  9  
2600: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2610: 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20  nous = FULL } { 
2620: 7d 0a 20 20 31 30 20 7b 20 50 52 41 47 4d 41 20  }.  10 { PRAGMA 
2630: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f  synchronous = NO
2640: 52 4d 41 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20  RMAL } { }.  11 
2650: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2660: 6e 6f 75 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d  nous = OFF } { }
2670: 0a 20 20 31 32 20 7b 20 50 52 41 47 4d 41 20 73  .  12 { PRAGMA s
2680: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c  ynchronous = FUL
2690: 4c 20 3b 20 50 52 41 47 4d 41 20 66 75 6c 6c 66  L ; PRAGMA fullf
26a0: 73 79 6e 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20  sync = 1 } { }. 
26b0: 20 31 33 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   13 { PRAGMA syn
26c0: 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20  chronous = FULL 
26d0: 7d 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20  } {.    testvfs 
26e0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
26f0: 20 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71    tv devchar seq
2700: 75 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34  uential.  }.  14
2710: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
2720: 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49  g_mode = EXCLUSI
2730: 56 45 20 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20  VE } {.  }.} {. 
2740: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
2750: 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76  3.$tn.1 {.    ev
2760: 61 6c 20 24 74 63 6c 0a 20 20 20 20 66 61 75 6c  al $tcl.    faul
2770: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
2780: 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75  reopen.    db fu
2790: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
27a0: 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c  ring.    execsql
27b0: 20 24 73 71 6c 0a 20 20 20 20 65 78 65 63 73 71   $sql.    execsq
27c0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
27d0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32   auto_vacuum = 2
27e0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63  ;.      PRAGMA c
27f0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
2800: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
2810: 4c 45 20 7a 28 78 20 49 4e 54 45 47 45 52 20 50  LE z(x INTEGER P
2820: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
2830: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
2840: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2850: 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20   z VALUES(NULL, 
2860: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
2870: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2880: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
2890: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
28a0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
28b0: 20 20 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45    2.        INSE
28c0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
28d0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
28e0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
28f0: 20 2d 2d 20 20 20 34 0a 20 20 20 20 20 20 20 20   --   4.        
2900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2910: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2920: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2930: 20 20 20 20 20 2d 2d 20 20 20 38 0a 20 20 20 20       --   8.    
2940: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2950: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2960: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2970: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a  M z;     --  16.
2980: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2990: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
29a0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
29b0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
29c0: 20 33 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45   32.        INSE
29d0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
29e0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
29f0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
2a00: 20 2d 2d 20 20 36 34 0a 20 20 20 20 20 20 20 20   --  64.        
2a10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2a20: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2a30: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2a40: 20 20 20 20 20 2d 2d 20 31 32 38 0a 20 20 20 20       -- 128.    
2a50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2a60: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2a70: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2a80: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a  M z;     -- 256.
2a90: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
2aa0: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
2ab0: 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61  { PRAGMA auto_va
2ac0: 63 75 75 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20  cuum }.  } {2}. 
2ad0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2ae0: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20   pager1-3.$tn.2 
2af0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
2b00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
2b10: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
2b20: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
2b30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2b40: 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61  z VALUES(NULL, a
2b50: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
2b60: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
2b70: 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41  ne;.        UPDA
2b80: 54 45 20 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c  TE z SET y = NUL
2b90: 4c 20 57 48 45 52 45 20 78 3e 32 35 36 3b 0a 20  L WHERE x>256;. 
2ba0: 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e         PRAGMA in
2bb0: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
2bc0: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
2bd0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a   count(*) FROM z
2be0: 20 57 48 45 52 45 20 78 20 3c 20 31 30 30 3b 0a   WHERE x < 100;.
2bf0: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
2c00: 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49  O one;.    COMMI
2c10: 54 3b 0a 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64  T;.  } {99}..  d
2c20: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
2c30: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a  ager1-3.$tn.3 {.
2c40: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2c50: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
2c60: 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20 7a          UPDATE z
2c70: 20 53 45 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20   SET y = y||x;. 
2c80: 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
2c90: 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   one;.    COMMIT
2ca0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
2cb0: 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20  nt(*) FROM z;.  
2cc0: 7d 20 7b 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78  } {258}..  do_ex
2cd0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
2ce0: 31 2d 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20  1-3.$tn.4 {.    
2cf0: 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20  SAVEPOINT one;. 
2d00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2d10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2d20: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
2d30: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  .  } {}.  do_exe
2d40: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
2d50: 2d 33 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53  -3.$tn.5 {.    S
2d60: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2d70: 52 4f 4d 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41  ROM z;.    RELEA
2d80: 53 45 20 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47  SE one;.    PRAG
2d90: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2da0: 63 6b 3b 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d  ck;.  } {258 ok}
2db0: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
2dc0: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e  est pager1-3.$tn
2dd0: 2e 36 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49  .6 {.    SAVEPOI
2de0: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45  NT one;.    RELE
2df0: 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a  ASE one;.  } {}.
2e00: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61  .  db close.  ca
2e10: 74 63 68 20 7b 20 74 76 20 64 65 6c 65 74 65 20  tch { tv delete 
2e20: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2e70: 23 20 48 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  # Hot journal ro
2e80: 6c 6c 62 61 63 6b 20 72 65 6c 61 74 65 64 20 74  llback related t
2e90: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70  est cases..#.# p
2ea0: 61 67 65 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73  ager1.4.1.*: Tes
2eb0: 74 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  t that the pager
2ec0: 20 6d 6f 64 75 6c 65 20 64 65 6c 65 74 65 73 20   module deletes 
2ed0: 76 65 72 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c  very small inval
2ee0: 69 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  id.#            
2ef0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73     journal files
2f00: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 32  ..#.# pager1.4.2
2f10: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66  .*: Test that if
2f20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2f30: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 74 20 74  nal pointer at t
2f40: 68 65 20 65 6e 64 20 6f 66 20 61 0a 23 20 20 20  he end of a.#   
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 74 2d              hot-
2f60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 70 70  journal file app
2f70: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
2f80: 70 74 20 28 63 68 65 63 6b 73 75 6d 20 64 6f 65  pt (checksum doe
2f90: 73 20 6e 6f 74 0a 23 20 20 20 20 20 20 20 20 20  s not.#         
2fa0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 29 20 74        compute) t
2fb0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f  he associated jo
2fc0: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
2fd0: 62 61 63 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20  back (and no.#  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 41 63               xAc
2ff0: 63 65 73 73 28 29 20 63 61 6c 6c 20 74 6f 20 63  cess() call to c
3000: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 70 72 65  heck for the pre
3010: 73 65 6e 63 65 20 6f 66 20 61 6e 79 20 6d 61 73  sence of any mas
3020: 74 65 72 20 0a 23 20 20 20 20 20 20 20 20 20 20  ter .#          
3030: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
3040: 65 20 69 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20  e is made)..#.# 
3050: 70 61 67 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65  pager1.4.3.*: Te
3060: 73 74 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  st that the cont
3070: 65 6e 74 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  ents of a hot-jo
3080: 75 72 6e 61 6c 20 61 72 65 20 69 67 6e 6f 72 65  urnal are ignore
3090: 64 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20  d if the.#      
30a0: 20 20 20 20 20 20 20 20 20 70 61 67 65 2d 73 69           page-si
30b0: 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a  ze or sector-siz
30c0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
30d0: 20 68 65 61 64 65 72 20 61 70 70 65 61 72 20 74   header appear t
30e0: 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  o.#             
30f0: 20 20 62 65 20 69 6e 76 61 6c 69 64 20 28 74 6f    be invalid (to
3100: 6f 20 6c 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61  o large, too sma
3110: 6c 6c 20 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65  ll or not a powe
3120: 72 20 6f 66 20 32 29 2e 0a 23 0a 23 20 70 61 67  r of 2)..#.# pag
3130: 65 72 31 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20  er1.4.4.*: Test 
3140: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3150: 62 61 63 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  back of journal 
3160: 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 73 74  file with a mast
3170: 65 72 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  er.#            
3180: 20 20 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74     journal point
3190: 65 72 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  er generated in 
31a0: 76 61 72 69 6f 75 73 20 22 50 52 41 47 4d 41 20  various "PRAGMA 
31b0: 73 79 6e 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20  synchronous".#  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64               mod
31d0: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34  es..#.# pager1.4
31e0: 2e 35 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .5.*: Test that 
31f0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3200: 62 61 63 6b 20 73 74 6f 70 73 20 69 66 20 69 74  back stops if it
3210: 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 0a 23 20   encounters a.# 
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
3230: 75 72 6e 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72  urnal-record for
3240: 20 77 68 69 63 68 20 74 68 65 20 63 68 65 63 6b   which the check
3250: 73 75 6d 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70  sum fails..#.# p
3260: 61 67 65 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73  ager1.4.6.*: Tes
3270: 74 20 74 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c  t that when roll
3280: 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
3290: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74  ournal that cont
32a0: 61 69 6e 73 20 61 0a 23 20 20 20 20 20 20 20 20  ains a.#        
32b0: 20 20 20 20 20 20 20 6d 61 73 74 65 72 20 6a 6f         master jo
32c0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74  urnal pointer, t
32d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
32e0: 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65  l file is delete
32f0: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
3300: 20 20 61 66 74 65 72 20 61 6c 6c 20 74 68 65 20    after all the 
3310: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61  hot-journals tha
3320: 74 20 72 65 66 65 72 20 74 6f 20 69 74 20 61 72  t refer to it ar
3330: 65 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70  e deleted..#.# p
3340: 61 67 65 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73  ager1.4.7.*: Tes
3350: 74 20 74 68 61 74 20 69 66 20 61 20 68 6f 74 2d  t that if a hot-
3360: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
3370: 73 74 73 20 62 75 74 20 61 20 63 6c 69 65 6e 74  sts but a client
3380: 20 63 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20   can.#          
3390: 20 20 20 20 20 6f 70 65 6e 20 69 74 20 66 6f 72       open it for
33a0: 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74   reading only, t
33b0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
33c0: 6f 74 20 62 65 20 61 63 63 65 73 73 65 64 20 61  ot be accessed a
33d0: 6e 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  nd.#            
33e0: 20 20 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50     SQLITE_CANTOP
33f0: 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EN is returned..
3400: 23 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  # .do_test pager
3410: 31 2e 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c  1.4.1.1 {.  faul
3420: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
3430: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
3440: 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54   { .    CREATE T
3450: 41 42 4c 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20  ABLE x(y, z);.  
3460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20    INSERT INTO x 
3470: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
3480: 7d 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  }.  set fd [open
3490: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34a0: 20 77 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65   w].  puts -none
34b0: 77 6c 69 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f  wline $fd "hello
34c0: 77 6f 72 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24  world".  close $
34d0: 66 64 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73  fd.  file exists
34e0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34f0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {1}.do_test p
3500: 61 67 65 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78  ager1.4.1.2 { ex
3510: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
3520: 20 46 52 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32   FROM x } } {1 2
3530: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
3540: 2e 34 2e 31 2e 33 20 7b 20 66 69 6c 65 20 65 78  .4.1.3 { file ex
3550: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
3560: 72 6e 61 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65  rnal } {0}..# Se
3570: 74 20 75 70 20 61 20 5b 74 65 73 74 76 66 73 5d  t up a [testvfs]
3580: 20 74 6f 20 73 6e 61 70 73 68 6f 74 20 74 68 65   to snapshot the
3590: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73   file-system jus
35a0: 74 20 62 65 66 6f 72 65 20 53 51 4c 69 74 65 0a  t before SQLite.
35b0: 23 20 64 65 6c 65 74 65 73 20 74 68 65 20 6d 61  # deletes the ma
35c0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20  ster-journal to 
35d0: 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66  commit a multi-f
35e0: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ile transaction.
35f0: 0a 23 0a 23 20 49 6e 20 73 75 62 73 65 71 75 65  .#.# In subseque
3600: 6e 74 20 74 65 73 74 20 63 61 73 65 73 2c 20 69  nt test cases, i
3610: 6e 76 6f 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69  nvoking [faultsi
3620: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3630: 6f 70 65 6e 5d 20 73 65 74 73 0a 23 20 75 70 20  open] sets.# up 
3640: 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
3650: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64  to contain two d
3660: 61 74 61 62 61 73 65 73 2c 20 74 77 6f 20 68 6f  atabases, two ho
3670: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t-journal files 
3680: 61 6e 64 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a  and.# a master-j
3690: 6f 75 72 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73  ournal..#.do_tes
36a0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b  t pager1.4.2.1 {
36b0: 0a 20 20 74 65 73 74 76 66 73 20 74 73 74 76 66  .  testvfs tstvf
36c0: 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74  s -default 1.  t
36d0: 73 74 76 66 73 20 66 69 6c 74 65 72 20 78 44 65  stvfs filter xDe
36e0: 6c 65 74 65 0a 20 20 74 73 74 76 66 73 20 73 63  lete.  tstvfs sc
36f0: 72 69 70 74 20 78 44 65 6c 65 74 65 43 61 6c 6c  ript xDeleteCall
3700: 62 61 63 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c  back.  proc xDel
3710: 65 74 65 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74  eteCallback {met
3720: 68 6f 64 20 66 69 6c 65 20 61 72 67 73 7d 20 7b  hod file args} {
3730: 0a 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b 66  .    set file [f
3740: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a  ile tail $file].
3750: 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67      if { [string
3760: 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c   match *mj* $fil
3770: 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f  e] } { faultsim_
3780: 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75  save }.  }.  fau
3790: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
37a0: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
37b0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
37c0: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
37d0: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
37e0: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
37f0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
3800: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
3810: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
3820: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3830: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e  .    PRAGMA aux.
3840: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3850: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3860: 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62  E t1(a UNIQUE, b
3870: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52   UNIQUE);.    CR
3880: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
3890: 32 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  2(a UNIQUE, b UN
38a0: 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52  IQUE);.    INSER
38b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
38c0: 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20  (a_string(200), 
38d0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a  a_string(300));.
38e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
38f0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3900: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3910: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3920: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3930: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3940: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3950: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3960: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3970: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
3980: 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   t1;.    BEGIN;.
3990: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
39a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
39b0: 72 69 6e 67 28 32 30 31 29 2c 20 61 5f 73 74 72  ring(201), a_str
39c0: 69 6e 67 28 33 30 31 29 20 46 52 4f 4d 20 74 31  ing(301) FROM t1
39d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
39e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
39f0: 73 74 72 69 6e 67 28 32 30 32 29 2c 20 61 5f 73  string(202), a_s
3a00: 74 72 69 6e 67 28 33 30 32 29 20 46 52 4f 4d 20  tring(302) FROM 
3a10: 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t1;.      INSERT
3a20: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3a30: 61 5f 73 74 72 69 6e 67 28 32 30 33 29 2c 20 61  a_string(203), a
3a40: 5f 73 74 72 69 6e 67 28 33 30 33 29 20 46 52 4f  _string(303) FRO
3a50: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
3a60: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
3a70: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 34 29 2c  T a_string(204),
3a80: 20 61 5f 73 74 72 69 6e 67 28 33 30 34 29 20 46   a_string(304) F
3a90: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 45  ROM t1;.      RE
3aa0: 50 4c 41 43 45 20 49 4e 54 4f 20 74 32 20 53 45  PLACE INTO t2 SE
3ab0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
3ac0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
3ad0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73 74    db close.  tst
3ae0: 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a  vfs delete.} {}.
3af0: 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74  .if {$::tcl_plat
3b00: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d  form(platform)!=
3b10: 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 64 6f 5f  "windows"} {.do_
3b20: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3b30: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
3b40: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3b50: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3b60: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3b70: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3b80: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3b90: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3ba0: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
3bb0: 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75  r1.4.2.3 {.  fau
3bc0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
3bd0: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
3be0: 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e  ch f [glob test.
3bf0: 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64  db-mj*] { forced
3c00: 65 6c 65 74 65 20 24 66 20 7d 0a 20 20 65 78 65  elete $f }.  exe
3c10: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3c20: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3c30: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3c40: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3c50: 20 20 7d 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f    }.} {64 ok}.do
3c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32  _test pager1.4.2
3c70: 2e 34 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .4 {.  faultsim_
3c80: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
3c90: 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  en.  hexio_write
3ca0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3cb0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
3cc0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
3cd0: 6c 5d 2d 33 30 5d 20 31 32 33 34 35 36 0a 20 20  l]-30] 123456.  
3ce0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3cf0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
3d00: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
3d10: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
3d20: 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a  k;.  }.} {4 ok}.
3d30: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
3d40: 2e 32 2e 35 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.5 {.  faultsi
3d50: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3d60: 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69  open.  hexio_wri
3d70: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
3d80: 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  al [expr [file s
3d90: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
3da0: 6e 61 6c 5d 2d 33 30 5d 20 31 32 33 34 35 36 0a  nal]-30] 123456.
3db0: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
3dc0: 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b  b test.db-mj*] {
3dd0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 66 20   forcedelete $f 
3de0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3df0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3e00: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3e10: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3e20: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3e30: 6f 6b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  ok}.}..do_test p
3e40: 61 67 65 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20  ager1.4.3.1 {.  
3e50: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3e60: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3e70: 66 73 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a  fs filter xSync.
3e80: 20 20 74 73 74 76 66 73 20 73 63 72 69 70 74 20    tstvfs script 
3e90: 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20  xSyncCallback.  
3ea0: 70 72 6f 63 20 78 53 79 6e 63 43 61 6c 6c 62 61  proc xSyncCallba
3eb0: 63 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20  ck {method file 
3ec0: 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20  args} {.    set 
3ed0: 66 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  file [file tail 
3ee0: 24 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20  $file].    if { 
3ef0: 30 3d 3d 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  0==[string match
3f00: 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d   *journal $file]
3f10: 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61   } { faultsim_sa
3f20: 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74  ve }.  }.  fault
3f30: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
3f40: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3f50: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
3f60: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
3f70: 54 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  TE;.    CREATE T
3f80: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
3f90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3fa0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
3fb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3fc0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
3fd0: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
3fe0: 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a    tstvfs delete.
3ff0: 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  } {}..foreach {t
4000: 6e 20 6f 66 73 74 20 76 61 6c 75 65 20 72 65 73  n ofst value res
4010: 75 6c 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ult} {.         
4020: 20 32 20 20 20 32 30 20 20 20 20 33 31 20 20 20   2   20    31   
4030: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
4040: 20 20 20 20 20 20 20 20 33 20 20 20 32 30 20 20          3   20  
4050: 20 20 33 32 20 20 20 20 20 20 20 7b 31 20 32 20    32       {1 2 
4060: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 34  3 4}.          4
4070: 20 20 20 32 30 20 20 20 20 33 33 20 20 20 20 20     20    33     
4080: 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20    {1 2 3 4}.    
4090: 20 20 20 20 20 20 35 20 20 20 32 30 20 20 20 20        5   20    
40a0: 36 35 35 33 36 20 20 20 20 7b 31 20 32 20 33 20  65536    {1 2 3 
40b0: 34 7d 0a 20 20 20 20 20 20 20 20 20 20 36 20 20  4}.          6  
40c0: 20 32 30 20 20 20 20 31 33 31 30 37 32 20 20 20   20    131072   
40d0: 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 20 20 20  {1 2 3 4}..     
40e0: 20 20 20 20 20 37 20 20 20 32 34 20 20 20 20 35       7   24    5
40f0: 31 31 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  11      {1 2 3 4
4100: 7d 0a 20 20 20 20 20 20 20 20 20 20 38 20 20 20  }.          8   
4110: 32 34 20 20 20 20 35 31 33 20 20 20 20 20 20 7b  24    513      {
4120: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4130: 20 20 20 39 20 20 20 32 34 20 20 20 20 31 33 31     9   24    131
4140: 30 37 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  072   {1 2 3 4}.
4150: 0a 20 20 20 20 20 20 20 20 20 31 30 20 20 20 33  .         10   3
4160: 32 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31  2    65536    {1
4170: 20 32 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   2}.} {.  do_tes
4180: 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e  t pager1.4.3.$tn
4190: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
41a0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
41b0: 65 6e 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69  en.    hexio_wri
41c0: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
41d0: 61 6c 20 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74  al $ofst [format
41e0: 20 25 2e 38 78 20 24 76 61 6c 75 65 5d 0a 20 20   %.8x $value].  
41f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
4200: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
4210: 20 7d 20 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20   } $result.}.db 
4220: 63 6c 6f 73 65 0a 0a 23 20 53 65 74 20 75 70 20  close..# Set up 
4230: 61 20 56 46 53 20 74 68 61 74 20 73 6e 61 70 73  a VFS that snaps
4240: 68 6f 74 73 20 74 68 65 20 66 69 6c 65 2d 73 79  hots the file-sy
4250: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
4260: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
4270: 6c 0a 23 20 66 69 6c 65 20 69 73 20 64 65 6c 65  l.# file is dele
4280: 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20  ted to commit a 
4290: 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
42a0: 61 63 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63  action. Specific
42b0: 61 6c 6c 79 2c 20 74 68 65 0a 23 20 66 69 6c 65  ally, the.# file
42c0: 2d 73 79 73 74 65 6d 20 69 73 20 73 61 76 65 64  -system is saved
42d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
42e0: 20 78 44 65 6c 65 74 65 28 29 20 63 61 6c 6c 20   xDelete() call 
42f0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 0a 23  to remove the .#
4300: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4310: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69  file from the fi
4320: 6c 65 2d 73 79 73 74 65 6d 2e 0a 23 0a 73 65 74  le-system..#.set
4330: 20 70 77 64 20 5b 67 65 74 5f 70 77 64 5d 0a 74   pwd [get_pwd].t
4340: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
4350: 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 20 63  lt 1.tv script c
4360: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
4370: 0a 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  .set ::mj_filena
4380: 6d 65 5f 6c 65 6e 67 74 68 20 30 0a 70 72 6f 63  me_length 0.proc
4390: 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65   copy_on_mj_dele
43a0: 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  te {method filen
43b0: 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66  ame args} {.  if
43c0: 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
43d0: 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20  *mj* [file tail 
43e0: 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a  $filename]]} { .
43f0: 20 20 20 20 23 0a 20 20 20 20 23 20 4e 4f 54 45      #.    # NOTE
4400: 3a 20 49 73 20 74 68 65 20 66 69 6c 65 20 6e 61  : Is the file na
4410: 6d 65 20 72 65 6c 61 74 69 76 65 3f 20 20 49 66  me relative?  If
4420: 20 73 6f 2c 20 61 64 64 20 74 68 65 20 6c 65 6e   so, add the len
4430: 67 74 68 20 6f 66 20 74 68 65 20 63 75 72 72 65  gth of the curre
4440: 6e 74 0a 20 20 20 20 23 20 20 20 20 20 20 20 64  nt.    #       d
4450: 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 23 0a  irectory..    #.
4460: 20 20 20 20 69 66 20 7b 5b 69 73 5f 72 65 6c 61      if {[is_rela
4470: 74 69 76 65 5f 66 69 6c 65 20 24 66 69 6c 65 6e  tive_file $filen
4480: 61 6d 65 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65  ame]} {.      se
4490: 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f  t ::mj_filename_
44a0: 6c 65 6e 67 74 68 20 5c 0a 20 20 20 20 20 20 20  length \.       
44b0: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
44c0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65  length $filename
44d0: 5d 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  ] + [string leng
44e0: 74 68 20 24 3a 3a 70 77 64 5d 7d 5d 0a 20 20 20  th $::pwd]}].   
44f0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
4500: 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  set ::mj_filenam
4510: 65 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67  e_length [string
4520: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d   length $filenam
4530: 65 5d 0a 20 20 20 20 7d 0a 20 20 20 20 66 61 75  e].    }.    fau
4540: 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d 0a  ltsim_save .  }.
4550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4560: 4f 4b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  OK.}..foreach {t
4570: 6e 31 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b 20  n1 tcl} {.  1 { 
4580: 73 65 74 20 70 72 65 66 69 78 20 22 74 65 73 74  set prefix "test
4590: 2e 64 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20 20  .db" }.  2 { .  
45a0: 20 20 23 20 54 68 69 73 20 74 65 73 74 20 64 65    # This test de
45b0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e 64  pends on the und
45c0: 65 72 6c 79 69 6e 67 20 56 46 53 20 62 65 69 6e  erlying VFS bein
45d0: 67 20 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 70  g able to open p
45e0: 61 74 68 73 0a 20 20 20 20 23 20 35 31 32 20 62  aths.    # 512 b
45f0: 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
4600: 54 68 65 20 69 64 65 61 20 69 73 20 74 6f 20 63  The idea is to c
4610: 72 65 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75 72  reate a hot-jour
4620: 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 0a 20 20  nal file that.  
4630: 20 20 23 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d    # contains a m
4640: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
4650: 69 6e 74 65 72 20 73 6f 20 6c 61 72 67 65 20 74  inter so large t
4660: 68 61 74 20 69 74 20 63 6f 75 6c 64 20 63 6f 6e  hat it could con
4670: 74 61 69 6e 0a 20 20 20 20 23 20 61 20 76 61 6c  tain.    # a val
4680: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 20 28  id page record (
4690: 69 66 20 74 68 65 20 66 69 6c 65 20 70 61 67 65  if the file page
46a0: 2d 73 69 7a 65 20 69 73 20 35 31 32 20 62 79 74  -size is 512 byt
46b0: 65 73 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20 20  es). So as to.  
46c0: 20 20 23 20 6d 61 6b 65 20 73 75 72 65 20 53 51    # make sure SQ
46d0: 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 67 65 74  Lite doesn't get
46e0: 20 63 6f 6e 66 75 73 65 64 20 62 79 20 74 68 69   confused by thi
46f0: 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74  s..    #.    set
4700: 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20   nPadding [expr 
4710: 35 31 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65  511 - $::mj_file
4720: 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20 20  name_length].   
4730: 20 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f   if {$tcl_platfo
4740: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 77  rm(platform)=="w
4750: 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20 20  indows"} {.     
4760: 20 23 20 54 42 44 20 6e 65 65 64 20 74 6f 20 66   # TBD need to f
4770: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 74 6f  igure out how to
4780: 20 64 6f 20 74 68 69 73 20 63 6f 72 72 65 63 74   do this correct
4790: 6c 79 20 66 6f 72 20 57 69 6e 64 6f 77 73 21 21  ly for Windows!!
47a0: 21 0a 20 20 20 20 20 20 73 65 74 20 6e 50 61 64  !.      set nPad
47b0: 64 69 6e 67 20 5b 65 78 70 72 20 32 35 35 20 2d  ding [expr 255 -
47c0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f   $::mj_filename_
47d0: 6c 65 6e 67 74 68 5d 0a 20 20 20 20 7d 0a 0a 20  length].    }.. 
47e0: 20 20 20 23 20 57 65 20 63 61 6e 6e 6f 74 20 6a     # We cannot j
47f0: 75 73 74 20 63 72 65 61 74 65 20 61 20 72 65 61  ust create a rea
4800: 6c 6c 79 20 6c 6f 6e 67 20 64 61 74 61 62 61 73  lly long databas
4810: 65 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f  e file name to o
4820: 70 65 6e 2c 20 61 73 0a 20 20 20 20 23 20 4c 69  pen, as.    # Li
4830: 6e 75 78 20 6c 69 6d 69 74 73 20 61 20 73 69 6e  nux limits a sin
4840: 67 6c 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  gle component of
4850: 20 61 20 70 61 74 68 20 74 6f 20 32 35 35 20 62   a path to 255 b
4860: 79 74 65 73 20 62 79 20 64 65 66 61 75 6c 74 0a  ytes by default.
4870: 20 20 20 20 23 20 28 61 6e 64 20 70 72 65 73 75      # (and presu
4880: 6d 61 62 6c 79 20 6f 74 68 65 72 20 73 79 73 74  mably other syst
4890: 65 6d 73 20 68 61 76 65 20 6c 69 6d 69 74 73 20  ems have limits 
48a0: 74 6f 6f 29 2e 20 53 6f 20 63 72 65 61 74 65 20  too). So create 
48b0: 61 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20  a directory.    
48c0: 23 20 68 69 65 72 61 72 63 68 79 20 74 6f 20 77  # hierarchy to w
48d0: 6f 72 6b 20 69 6e 2e 0a 20 20 20 20 23 0a 20 20  ork in..    #.  
48e0: 20 20 73 65 74 20 64 69 72 6e 61 6d 65 20 22 64    set dirname "d
48f0: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
4900: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 2f 22  78901234567890/"
4910: 0a 20 20 20 20 73 65 74 20 6e 44 69 72 20 5b 65  .    set nDir [e
4920: 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20 2f 20  xpr $nPadding / 
4930: 33 32 5d 0a 20 20 20 20 69 66 20 7b 20 24 6e 44  32].    if { $nD
4940: 69 72 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  ir } {.      set
4950: 20 70 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61   p [string repea
4960: 74 20 24 64 69 72 6e 61 6d 65 20 24 6e 44 69 72  t $dirname $nDir
4970: 5d 0a 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64  ].      file mkd
4980: 69 72 20 24 70 0a 20 20 20 20 20 20 63 64 20 24  ir $p.      cd $
4990: 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74  p.    }..    set
49a0: 20 70 61 64 64 69 6e 67 20 5b 73 74 72 69 6e 67   padding [string
49b0: 20 72 65 70 65 61 74 20 78 20 5b 65 78 70 72 20   repeat x [expr 
49c0: 24 6e 50 61 64 64 69 6e 67 20 25 33 32 5d 5d 0a  $nPadding %32]].
49d0: 20 20 20 20 73 65 74 20 70 72 65 66 69 78 20 22      set prefix "
49e0: 74 65 73 74 2e 64 62 24 7b 70 61 64 64 69 6e 67  test.db${padding
49f0: 7d 22 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 76 61  }".  }.} {.  eva
4a00: 6c 20 24 74 63 6c 0a 20 20 66 6f 72 65 61 63 68  l $tcl.  foreach
4a10: 20 7b 74 6e 32 20 73 71 6c 7d 20 7b 0a 20 20 20   {tn2 sql} {.   
4a20: 20 6f 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47   o { .      PRAG
4a30: 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e  MA main.synchron
4a40: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  ous=OFF;.      P
4a50: 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72  RAGMA aux.synchr
4a60: 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20  onous=OFF;.     
4a70: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
4a80: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
4a90: 20 20 20 7d 0a 20 20 20 20 6f 35 31 32 20 7b 20     }.    o512 { 
4aa0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
4ab0: 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  in.synchronous=O
4ac0: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
4ad0: 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73   aux.synchronous
4ae0: 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47  =OFF;.      PRAG
4af0: 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a  MA main.page_siz
4b00: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50  e = 512;.      P
4b10: 52 41 47 4d 41 20 61 75 78 2e 70 61 67 65 5f 73  RAGMA aux.page_s
4b20: 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20  ize = 512;.     
4b30: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
4b40: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
4b50: 20 20 20 7d 0a 20 20 20 20 6e 20 7b 20 0a 20 20     }.    n { .  
4b60: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
4b70: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
4b80: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
4b90: 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73   aux.synchronous
4ba0: 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50  =NORMAL;.      P
4bb0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4bc0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4bd0: 20 7d 0a 20 20 20 20 66 20 7b 20 0a 20 20 20 20   }.    f { .    
4be0: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
4bf0: 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a  nchronous=FULL;.
4c00: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
4c10: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c  .synchronous=FUL
4c20: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
4c30: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
4c40: 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  ELETE;.    }.  }
4c50: 20 7b 0a 0a 20 20 20 20 73 65 74 20 74 6e 20 22   {..    set tn "
4c60: 24 7b 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a 20  ${tn1}.${tn2}". 
4c70: 20 0a 20 20 20 20 23 20 53 65 74 20 75 70 20 61   .    # Set up a
4c80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 68   connection to h
4c90: 61 76 65 20 74 77 6f 20 64 61 74 61 62 61 73 65  ave two database
4ca0: 73 2c 20 74 65 73 74 2e 64 62 20 28 6d 61 69 6e  s, test.db (main
4cb0: 29 20 61 6e 64 20 0a 20 20 20 20 23 20 74 65 73  ) and .    # tes
4cc0: 74 2e 64 62 32 20 28 61 75 78 29 2e 20 54 68 65  t.db2 (aux). The
4cd0: 6e 20 72 75 6e 20 61 20 6d 75 6c 74 69 2d 66 69  n run a multi-fi
4ce0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  le transaction o
4cf0: 6e 20 74 68 65 6d 2e 20 54 68 65 0a 20 20 20 20  n them. The.    
4d00: 23 20 56 46 53 20 77 69 6c 6c 20 73 6e 61 70 73  # VFS will snaps
4d10: 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hot the file-sys
4d20: 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20  tem just before 
4d30: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
4d40: 61 6c 0a 20 20 20 20 23 20 66 69 6c 65 20 69 73  al.    # file is
4d50: 20 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d   deleted to comm
4d60: 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
4d70: 6f 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20 74 76  on..    #.    tv
4d80: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
4d90: 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
4da0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a 20  r1-4.4.$tn.1 {. 
4db0: 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65       faultsim_de
4dc0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20  lete_and_reopen 
4dd0: 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65 78  $prefix.      ex
4de0: 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  ecsql ".        
4df0: 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69 78  ATTACH '${prefix
4e00: 7d 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20  }2' AS aux;.    
4e10: 20 20 20 20 24 73 71 6c 0a 20 20 20 20 20 20 20      $sql.       
4e20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 28   CREATE TABLE a(
4e30: 78 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  x);.        CREA
4e40: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 62 28 78  TE TABLE aux.b(x
4e50: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
4e60: 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28  T INTO a VALUES(
4e70: 27 64 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a 20  'double-you');. 
4e80: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4e90: 54 4f 20 61 20 56 41 4c 55 45 53 28 27 77 68 79  TO a VALUES('why
4ea0: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
4eb0: 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53  RT INTO a VALUES
4ec0: 28 27 7a 65 64 27 29 3b 0a 20 20 20 20 20 20 20  ('zed');.       
4ed0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56   INSERT INTO b V
4ee0: 41 4c 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20 20  ALUES('won');.  
4ef0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4f00: 4f 20 62 20 56 41 4c 55 45 53 28 27 74 6f 6f 27  O b VALUES('too'
4f10: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
4f20: 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28  T INTO b VALUES(
4f30: 27 66 72 65 65 27 29 3b 0a 20 20 20 20 20 20 22  'free');.      "
4f40: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
4f50: 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  .        BEGIN;.
4f60: 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54            INSERT
4f70: 20 49 4e 54 4f 20 61 20 53 45 4c 45 43 54 20 2a   INTO a SELECT *
4f80: 20 46 52 4f 4d 20 62 20 57 48 45 52 45 20 72 6f   FROM b WHERE ro
4f90: 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20  wid<=3;.        
4fa0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
4fb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 20  SELECT * FROM a 
4fc0: 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a  WHERE rowid<=3;.
4fd0: 20 20 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a          COMMIT;.
4fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d        }.    } {}
4ff0: 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 7b  .    tv filter {
5000: 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 43 68 65  }.    .    # Che
5010: 63 6b 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ck that the tran
5020: 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
5030: 69 74 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  itted successful
5040: 6c 79 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f  ly..    #.    do
5050: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5060: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 32 20 7b  ger1-4.4.$tn.2 {
5070: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
5080: 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f  FROM a.    } {do
5090: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
50a0: 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20   won too free}. 
50b0: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
50c0: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
50d0: 6e 2e 33 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.3 {.      SELE
50e0: 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20  CT * FROM b.    
50f0: 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20  } {won too free 
5100: 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a  double-you why z
5110: 65 64 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52  ed}.    .    # R
5120: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5130: 73 79 73 74 65 6d 20 61 6e 64 20 72 65 6f 70 65  system and reope
5140: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e  n the databases.
5150: 20 43 68 65 63 6b 20 74 68 61 74 20 69 74 20 6e   Check that it n
5160: 6f 77 0a 20 20 20 20 23 20 61 70 70 65 61 72 73  ow.    # appears
5170: 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
5180: 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f  ction was not co
5190: 6d 6d 69 74 74 65 64 20 28 62 65 63 61 75 73 65  mmitted (because
51a0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
51b0: 0a 20 20 20 20 23 20 77 61 73 20 72 65 73 74 6f  .    # was resto
51c0: 72 65 64 20 74 6f 20 74 68 65 20 73 74 61 74 65  red to the state
51d0: 20 77 68 65 72 65 20 69 74 20 68 61 64 20 6e 6f   where it had no
51e0: 74 20 62 65 65 6e 29 2e 0a 20 20 20 20 23 0a 20  t been)..    #. 
51f0: 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72     do_test pager
5200: 31 2d 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20 20  1-4.4.$tn.4 {.  
5210: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
5220: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20  tore_and_reopen 
5230: 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65 78  $prefix.      ex
5240: 65 63 73 71 6c 20 22 41 54 54 41 43 48 20 27 24  ecsql "ATTACH '$
5250: 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75  {prefix}2' AS au
5260: 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20  x".    } {}.    
5270: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5280: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35  pager1-4.4.$tn.5
5290: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
52a0: 61 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77  a} {double-you w
52b0: 68 79 20 7a 65 64 7d 0a 20 20 20 20 64 6f 5f 65  hy zed}.    do_e
52c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
52d0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45  r1-4.4.$tn.6 {SE
52e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b  LECT * FROM b} {
52f0: 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20  won too free}.  
5300: 20 20 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65    .    # Restore
5310: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5320: 20 61 67 61 69 6e 2e 20 54 68 69 73 20 74 69 6d   again. This tim
5330: 65 2c 20 62 65 66 6f 72 65 20 72 65 6f 70 65 6e  e, before reopen
5340: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
5350: 73 2c 0a 20 20 20 20 23 20 64 65 6c 65 74 65 20  s,.    # delete 
5360: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
5370: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65  al file from the
5380: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 49 74   file-system. It
5390: 20 6e 6f 77 20 61 70 70 65 61 72 73 20 74 68 61   now appears tha
53a0: 74 0a 20 20 20 20 23 20 74 68 65 20 74 72 61 6e  t.    # the tran
53b0: 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
53c0: 69 74 74 65 64 20 28 6e 6f 20 6d 61 73 74 65 72  itted (no master
53d0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 3d 3d  -journal file ==
53e0: 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20   no rollback).. 
53f0: 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74     #.    do_test
5400: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5410: 37 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73  7 {.      faults
5420: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5430: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
5440: 20 20 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67      foreach f [g
5450: 6c 6f 62 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a  lob ${prefix}-mj
5460: 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65  *] { forcedelete
5470: 20 24 66 20 7d 0a 20 20 20 20 20 20 65 78 65 63   $f }.      exec
5480: 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70  sql "ATTACH '${p
5490: 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22  refix}2' AS aux"
54a0: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
54b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
54c0: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b  ger1-4.4.$tn.8 {
54d0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
54e0: 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f  FROM a.    } {do
54f0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
5500: 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20   won too free}. 
5510: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
5520: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5530: 6e 2e 39 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.9 {.      SELE
5540: 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20  CT * FROM b.    
5550: 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20  } {won too free 
5560: 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a  double-you why z
5570: 65 64 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70  ed}.  }..  cd $p
5580: 77 64 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  wd.}.db close.tv
5590: 20 64 65 6c 65 74 65 0a 66 6f 72 63 65 64 65 6c   delete.forcedel
55a0: 65 74 65 20 24 64 69 72 6e 61 6d 65 0a 0a 0a 23  ete $dirname...#
55b0: 20 53 65 74 20 75 70 20 61 20 56 46 53 20 74 6f   Set up a VFS to
55c0: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
55d0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
55e0: 6a 75 73 74 20 62 65 66 6f 72 65 20 64 65 6c 65  just before dele
55f0: 74 69 6e 67 20 61 0a 23 20 6a 6f 75 72 6e 61 6c  ting a.# journal
5600: 20 66 69 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20   file to commit 
5610: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  a transaction. T
5620: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  he transaction m
5630: 6f 64 69 66 69 65 73 20 65 78 61 63 74 6c 79 0a  odifies exactly.
5640: 23 20 74 77 6f 20 64 61 74 61 62 61 73 65 20 70  # two database p
5650: 61 67 65 73 20 28 61 6e 64 20 70 61 67 65 20 31  ages (and page 1
5660: 20 2d 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f   - the change co
5670: 75 6e 74 65 72 29 2e 0a 23 0a 74 65 73 74 76 66  unter)..#.testvf
5680: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
5690: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 35 31  tv sectorsize 51
56a0: 32 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70 79  2.tv script copy
56b0: 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65  _on_journal_dele
56c0: 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78 44 65  te.tv filter xDe
56d0: 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f  lete.proc copy_o
56e0: 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65  n_journal_delete
56f0: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
5700: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
5710: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a  [string match *j
5720: 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e 61 6d 65  ournal $filename
5730: 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  ]} faultsim_save
5740: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
5750: 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f  E_OK.}.faultsim_
5760: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
5770: 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  n.do_execsql_tes
5780: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 31 20 7b  t pager1.4.5.1 {
5790: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
57a0: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
57b0: 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73  .  PRAGMA page_s
57c0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 43 52  ize = 1024;.  CR
57d0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
57e0: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   b);.  CREATE TA
57f0: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
5800: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5810: 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27 29  ALUES('I', 'II')
5820: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
5830: 74 32 20 56 41 4c 55 45 53 28 27 49 49 49 27 2c  t2 VALUES('III',
5840: 20 27 49 56 27 29 3b 0a 20 20 42 45 47 49 4e 3b   'IV');.  BEGIN;
5850: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5860: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
5870: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5880: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34  O t2 VALUES(3, 4
5890: 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b  );.  COMMIT;.} {
58a0: 64 65 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65  delete}.tv filte
58b0: 72 20 7b 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68  r {}..# Check th
58c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
58d0: 73 20 63 6f 6d 6d 69 74 74 65 64 3a 0a 23 0a 64  s committed:.#.d
58e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
58f0: 61 67 65 72 31 2e 34 2e 35 2e 32 20 7b 0a 20 20  ager1.4.5.2 {.  
5900: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5910: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5920: 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20  M t2;.} {I II 1 
5930: 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 23  2 III IV 3 4}..#
5940: 20 4e 6f 77 20 74 72 79 20 66 6f 75 72 20 74 65   Now try four te
5950: 73 74 73 3a 0a 23 0a 23 20 20 70 61 67 65 72 31  sts:.#.#  pager1
5960: 2d 34 2e 35 2e 33 3a 20 52 65 73 74 6f 72 65 20  -4.5.3: Restore 
5970: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
5980: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
5990: 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
59a0: 6e 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  n .#            
59b0: 20 20 20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61      is rolled ba
59c0: 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  ck..#.#  pager1-
59d0: 34 2e 35 2e 34 3a 20 52 65 73 74 6f 72 65 20 74  4.5.4: Restore t
59e0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
59f0: 43 6f 72 72 75 70 74 20 74 68 65 20 66 69 72 73  Corrupt the firs
5a00: 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 0a  t record in the.
5a10: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
5a20: 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20   journal. Check 
5a30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5a40: 69 73 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61  is not rolled ba
5a50: 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  ck..#.#  pager1-
5a60: 34 2e 35 2e 35 3a 20 52 65 73 74 6f 72 65 20 74  4.5.5: Restore t
5a70: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
5a80: 43 6f 72 72 75 70 74 20 74 68 65 20 73 65 63 6f  Corrupt the seco
5a90: 6e 64 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  nd record in the
5aa0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5ab0: 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b    journal. Check
5ac0: 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
5ad0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74 72  record in the tr
5ae0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20  ansaction is .# 
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
5b00: 6c 61 79 65 64 20 62 61 63 6b 2c 20 62 75 74 20  layed back, but 
5b10: 6e 6f 74 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a  not the second..
5b20: 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e  #.#  pager1-4.5.
5b30: 36 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20 66  6: Restore the f
5b40: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 72 79 20  ile-system. Try 
5b50: 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
5b60: 62 61 73 65 20 77 69 74 68 20 61 0a 23 20 20 20  base with a.#   
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
5b80: 64 6f 6e 6c 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  donly connection
5b90: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61  . This should fa
5ba0: 69 6c 2c 20 61 73 20 61 20 72 65 61 64 2d 6f 6e  il, as a read-on
5bb0: 6c 79 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ly.#            
5bc0: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63      connection c
5bd0: 61 6e 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  annot roll back 
5be0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
5bf0: 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 72 65  e..#.faultsim_re
5c00: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5c10: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
5c20: 20 70 61 67 65 72 31 2e 34 2e 35 2e 33 20 7b 0a   pager1.4.5.3 {.
5c30: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5c40: 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  t1;.  SELECT * F
5c50: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20  ROM t2;.} {I II 
5c60: 49 49 49 20 49 56 7d 0a 66 61 75 6c 74 73 69 6d  III IV}.faultsim
5c70: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5c80: 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20  pen.hexio_write 
5c90: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
5ca0: 5b 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34  [expr 512+4+1024
5cb0: 20 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37   - 202] 01234567
5cc0: 38 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63  89ABCDEF.do_exec
5cd0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5ce0: 34 2e 35 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  4.5.4 {.  SELECT
5cf0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
5d00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
5d10: 7d 20 7b 49 20 49 49 20 31 20 32 20 49 49 49 20  } {I II 1 2 III 
5d20: 49 56 20 33 20 34 7d 0a 66 61 75 6c 74 73 69 6d  IV 3 4}.faultsim
5d30: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5d40: 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20  pen.hexio_write 
5d50: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
5d60: 5b 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34  [expr 512+4+1024
5d70: 2b 34 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d  +4+4+1024 - 202]
5d80: 20 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45   0123456789ABCDE
5d90: 46 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  F.do_execsql_tes
5da0: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 35 20 7b  t pager1.4.5.5 {
5db0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5dc0: 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20   t1;.  SELECT * 
5dd0: 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49  FROM t2;.} {I II
5de0: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 66 61   III IV 3 4}..fa
5df0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5e00: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f  nd_reopen.db clo
5e10: 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  se.sqlite3 db te
5e20: 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20  st.db -readonly 
5e30: 31 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  1.do_catchsql_te
5e40: 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 36 20  st pager1.4.5.6 
5e50: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
5e60: 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a  M t1;.  SELECT *
5e70: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b   FROM t2;.} {1 {
5e80: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
5e90: 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61   a readonly data
5ea0: 62 61 73 65 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a  base}}.db close.
5eb0: 0a 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20  .# Snapshot the 
5ec0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
5ed0: 20 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69   before multi-fi
5ee0: 6c 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20  le commit. Save 
5ef0: 74 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68  the name.# of th
5f00: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5f10: 20 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66   file in $::mj_f
5f20: 69 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63  ilename..#.tv sc
5f30: 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f  ript copy_on_mj_
5f40: 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72  delete.tv filter
5f50: 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f   xDelete.proc co
5f60: 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20  py_on_mj_delete 
5f70: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65  {method filename
5f80: 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b   args} {.  if {[
5f90: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a  string match *mj
5fa0: 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  * [file tail $fi
5fb0: 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20  lename]]} { .   
5fc0: 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61   set ::mj_filena
5fd0: 6d 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20  me $filename.   
5fe0: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a   faultsim_save .
5ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
6000: 49 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74  ITE_OK.}.do_test
6010: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a   pager1.4.6.1 {.
6020: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
6030: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
6040: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
6050: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
6060: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 41   = DELETE;.    A
6070: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
6080: 20 41 53 20 74 77 6f 3b 0a 20 20 20 20 43 52 45   AS two;.    CRE
6090: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
60a0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
60b0: 41 42 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20 62  ABLE two.t2(a, b
60c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
60d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
60e0: 27 74 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53  't1.1');.    INS
60f0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
6100: 45 53 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20  ES(1, 't2.1');. 
6110: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
6120: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
6130: 3d 20 27 74 31 2e 32 27 3b 0a 20 20 20 20 20 20  = 't1.2';.      
6140: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20  UPDATE t2 SET b 
6150: 3d 20 27 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f  = 't2.2';.    CO
6160: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66  MMIT;.  }.  tv f
6170: 69 6c 74 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c  ilter {}.  db cl
6180: 6f 73 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73  ose.} {}..faults
6190: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
61a0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
61b0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36  _test pager1.4.6
61c0: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .2 { SELECT * FR
61d0: 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20 20  OM t1 }         
61e0: 20 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65    {1 t1.1}.do_te
61f0: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72  st         pager
6200: 31 2e 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65  1.4.6.3 { file e
6210: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6220: 6e 61 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78  name } {1}.do_ex
6230: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
6240: 31 2e 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41  1.4.6.4 {.  ATTA
6250: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
6260: 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a   two;.  SELECT *
6270: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74   FROM t2;.} {1 t
6280: 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  2.1}.do_test pag
6290: 65 72 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65  er1.4.6.5 { file
62a0: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
62b0: 6c 65 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61  lename } {0}..fa
62c0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
62d0: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f  nd_reopen.db clo
62e0: 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  se.do_test pager
62f0: 31 2e 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20  1.4.6.8 {.  set 
6300: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24  ::mj_filename1 $
6310: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20  ::mj_filename.  
6320: 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  tv filter xDelet
6330: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
6340: 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71  est.db2.  execsq
6350: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
6360: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
6370: 4c 45 54 45 3b 0a 20 20 20 20 41 54 54 41 43 48  LETE;.    ATTACH
6380: 20 27 74 65 73 74 2e 64 62 33 27 20 41 53 20 74   'test.db3' AS t
6390: 68 72 65 65 3b 0a 20 20 20 20 43 52 45 41 54 45  hree;.    CREATE
63a0: 20 54 41 42 4c 45 20 74 68 72 65 65 2e 74 33 28   TABLE three.t3(
63b0: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
63c0: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
63d0: 28 31 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20 20  (1, 't3.1');.   
63e0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
63f0: 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20  DATE t2 SET b = 
6400: 27 74 32 2e 33 27 3b 0a 20 20 20 20 20 20 55 50  't2.3';.      UP
6410: 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d 20  DATE t3 SET b = 
6420: 27 74 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d 4d  't3.3';.    COMM
6430: 49 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b  IT;.  }.  expr {
6440: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20  $::mj_filename1 
6450: 21 3d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  != $::mj_filenam
6460: 65 7d 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73 69  e}.} {1}.faultsi
6470: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6480: 6f 70 65 6e 0a 74 76 20 66 69 6c 74 65 72 20 7b  open.tv filter {
6490: 7d 0a 0a 23 20 54 68 65 20 66 69 6c 65 2d 73 79  }..# The file-sy
64a0: 73 74 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  stem now contain
64b0: 73 3a 0a 23 0a 23 20 20 20 2a 20 74 68 72 65 65  s:.#.#   * three
64c0: 20 64 61 74 61 62 61 73 65 73 0a 23 20 20 20 2a   databases.#   *
64d0: 20 74 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72 6e   three hot-journ
64e0: 61 6c 20 66 69 6c 65 73 0a 23 20 20 20 2a 20 74  al files.#   * t
64f0: 77 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  wo master-journa
6500: 6c 20 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68 65  l files..#.# The
6510: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61 73   hot-journals as
6520: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 65  sociated with te
6530: 73 74 2e 64 62 32 20 61 6e 64 20 74 65 73 74 2e  st.db2 and test.
6540: 64 62 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20 6d  db3 point to.# m
6550: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a  aster journal $:
6560: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54 68  :mj_filename. Th
6570: 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  e hot-journal fi
6580: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
6590: 74 68 0a 23 20 74 65 73 74 2e 64 62 20 70 6f 69  th.# test.db poi
65a0: 6e 74 73 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nts to master jo
65b0: 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65  urnal $::mj_file
65c0: 6e 61 6d 65 31 2e 20 53 6f 20 72 65 61 64 69 6e  name1. So readin
65d0: 67 20 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64 62  g from.# test.db
65e0: 20 73 68 6f 75 6c 64 20 64 65 6c 65 74 65 20 24   should delete $
65f0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a  ::mj_filename1..
6600: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
6610: 2e 34 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72 74  .4.6.9 {.  lsort
6620: 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d   [glob test.db*]
6630: 0a 7d 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74 20  .} [lsort [list 
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 65            \.  te
6670: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 20 74  st.db test.db2 t
6680: 65 73 74 2e 64 62 33 20 20 20 20 20 20 20 20 20  est.db3         
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62       \.  test.db
66b0: 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62  -journal test.db
66c0: 32 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64  2-journal test.d
66d0: 62 33 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20  b3-journal      
66e0: 5c 0a 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  \.  [file tail $
66f0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b  ::mj_filename] [
6700: 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f  file tail $::mj_
6710: 66 69 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23  filename1].]]..#
6720: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
6730: 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  nal $::mj_filena
6740: 6d 65 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  me1 contains poi
6750: 6e 74 65 72 73 20 74 6f 20 74 65 73 74 2e 64 62  nters to test.db
6760: 20 61 6e 64 20 0a 23 20 74 65 73 74 2e 64 62 32   and .# test.db2
6770: 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 68 6f  . However the ho
6780: 74 2d 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69  t-journal associ
6790: 61 74 65 64 20 77 69 74 68 20 74 65 73 74 2e 64  ated with test.d
67a0: 62 32 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20 61  b2 points to.# a
67b0: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
67c0: 72 2d 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72 65  r-journal. There
67d0: 66 6f 72 65 2c 20 72 65 61 64 69 6e 67 20 66 72  fore, reading fr
67e0: 6f 6d 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79 20  om test.db only 
67f0: 73 68 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f 75  should.# be enou
6800: 67 68 20 74 6f 20 63 61 75 73 65 20 53 51 4c 69  gh to cause SQLi
6810: 74 65 20 74 6f 20 64 65 6c 65 74 65 20 24 3a 3a  te to delete $::
6820: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a  mj_filename1..#.
6830: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
6840: 70 61 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b 20  pager1.4.6.10 { 
6850: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6860: 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31  j_filename  } {1
6870: 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  }.do_test       
6880: 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 31 20    pager1.4.6.11 
6890: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
68a0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20  :mj_filename1 } 
68b0: 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {1}.do_execsql_t
68c0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31  est pager1.4.6.1
68d0: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
68e0: 4d 20 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d 0a  M t1 } {1 t1.1}.
68f0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
6900: 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20  pager1.4.6.13 { 
6910: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6920: 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31  j_filename  } {1
6930: 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  }.do_test       
6940: 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20    pager1.4.6.14 
6950: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
6960: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20  :mj_filename1 } 
6970: 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {0}..do_execsql_
6980: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6990: 31 32 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74  12 {.  ATTACH 't
69a0: 65 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b  est.db2' AS two;
69b0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
69c0: 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a   t2;.} {1 t2.1}.
69d0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
69e0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20  pager1.4.6.13 { 
69f0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6a00: 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 31  j_filename }  {1
6a10: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
6a20: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20  t pager1.4.6.14 
6a30: 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74  {.  ATTACH 'test
6a40: 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a  .db3' AS three;.
6a50: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6a60: 74 33 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a 64  t3;.} {1 t3.1}.d
6a70: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
6a80: 61 67 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20 66  ager1.4.6.15 { f
6a90: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
6aa0: 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30 7d  _filename }  {0}
6ab0: 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  ..db close.tv de
6ac0: 6c 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76  lete..testvfs tv
6ad0: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
6ae0: 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76  ectorsize 512.tv
6af0: 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f   script copy_on_
6b00: 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74  journal_delete.t
6b10: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
6b20: 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f  .proc copy_on_jo
6b30: 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65  urnal_delete {me
6b40: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
6b50: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
6b60: 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e  ing match *journ
6b70: 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66  al $filename]} f
6b80: 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20  aultsim_save .  
6b90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6ba0: 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .}.faultsim_dele
6bb0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  te_and_reopen.do
6bc0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
6bd0: 67 65 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20 50  ger1.4.7.1 {.  P
6be0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
6bf0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 43  de = DELETE;.  C
6c00: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
6c10: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
6c20: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
6c30: 20 69 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20 20   i1 ON t1(y);.  
6c40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6c50: 41 4c 55 45 53 28 27 49 27 2c 20 20 20 27 6f 6e  ALUES('I',   'on
6c60: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
6c70: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 49  TO t1 VALUES('II
6c80: 27 2c 20 20 27 66 6f 75 72 27 29 3b 0a 20 20 49  ',  'four');.  I
6c90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6ca0: 4c 55 45 53 28 27 49 49 49 27 2c 20 27 6e 69 6e  LUES('III', 'nin
6cb0: 65 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  e');.  BEGIN;.  
6cc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6cd0: 20 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27 73   VALUES('IV', 's
6ce0: 69 78 74 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e  ixteen');.    IN
6cf0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6d00: 55 45 53 28 27 56 27 20 2c 20 27 74 77 65 6e 74  UES('V' , 'twent
6d10: 79 66 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d 49  yfive');.  COMMI
6d20: 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76  T;.} {delete}.tv
6d30: 20 66 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63 6c   filter {}.db cl
6d40: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 20 0a 63  ose.tv delete .c
6d50: 61 74 63 68 20 7b 0a 20 20 74 65 73 74 5f 73 79  atch {.  test_sy
6d60: 73 63 61 6c 6c 20 69 6e 73 74 61 6c 6c 20 66 63  scall install fc
6d70: 68 6d 6f 64 0a 20 20 74 65 73 74 5f 73 79 73 63  hmod.  test_sysc
6d80: 61 6c 6c 20 66 61 75 6c 74 20 31 20 31 0a 7d 0a  all fault 1 1.}.
6d90: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
6da0: 2e 37 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69  .7.2 {.  faultsi
6db0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6dc0: 6f 70 65 6e 0a 20 20 63 61 74 63 68 20 7b 66 69  open.  catch {fi
6dd0: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
6de0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70  st.db-journal -p
6df0: 65 72 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d  ermissions r----
6e00: 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66  ----}.  catch {f
6e10: 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74  ile attributes t
6e20: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d  est.db-journal -
6e30: 72 65 61 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61  readonly 1}.  ca
6e40: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
6e50: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
6e60: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
6e70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
6e80: 0a 63 61 74 63 68 20 7b 0a 20 20 74 65 73 74 5f  .catch {.  test_
6e90: 73 79 73 63 61 6c 6c 20 72 65 73 65 74 0a 20 20  syscall reset.  
6ea0: 74 65 73 74 5f 73 79 73 63 61 6c 6c 20 66 61 75  test_syscall fau
6eb0: 6c 74 20 30 20 30 0a 7d 0a 64 6f 5f 74 65 73 74  lt 0 0.}.do_test
6ec0: 20 70 61 67 65 72 31 2e 34 2e 37 2e 33 20 7b 0a   pager1.4.7.3 {.
6ed0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74    db close.  cat
6ee0: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6ef0: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
6f00: 6e 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73  nal -permissions
6f10: 20 72 77 2d 72 77 2d 72 77 2d 7d 0a 20 20 63 61   rw-rw-rw-}.  ca
6f20: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
6f30: 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  utes test.db-jou
6f40: 72 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 30  rnal -readonly 0
6f50: 7d 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20  }.  delete_file 
6f60: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
6f70: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
6f80: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
6f90: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {0}.do_test page
6fa0: 72 31 2e 34 2e 38 2e 31 20 7b 0a 20 20 63 61 74  r1.4.8.1 {.  cat
6fb0: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6fc0: 74 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72  tes test.db -per
6fd0: 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d  missions r------
6fe0: 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c  --}.  catch {fil
6ff0: 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73  e attributes tes
7000: 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20 31  t.db -readonly 1
7010: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  }.  sqlite3 db t
7020: 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c  est.db.  db eval
7030: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
7040: 20 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f   t1 }.  sqlite3_
7050: 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 6d  db_readonly db m
7060: 61 69 6e 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  ain.} {1}.do_tes
7070: 74 20 70 61 67 65 72 31 2e 34 2e 38 2e 32 20 7b  t pager1.4.8.2 {
7080: 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  .  sqlite3_db_re
7090: 61 64 6f 6e 6c 79 20 64 62 20 78 79 7a 0a 7d 20  adonly db xyz.} 
70a0: 7b 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  {-1}.do_test pag
70b0: 65 72 31 2e 34 2e 38 2e 33 20 7b 0a 20 20 64 62  er1.4.8.3 {.  db
70c0: 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68 20 7b   close.  catch {
70d0: 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20  file attributes 
70e0: 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c  test.db -readonl
70f0: 79 20 30 7d 0a 20 20 63 61 74 63 68 20 7b 66 69  y 0}.  catch {fi
7100: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
7110: 73 74 2e 64 62 20 2d 70 65 72 6d 69 73 73 69 6f  st.db -permissio
7120: 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d 20 6d 73  ns rw-rw-rw-} ms
7130: 67 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  g.  sqlite3 db t
7140: 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c  est.db.  db eval
7150: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
7160: 20 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f   t1 }.  sqlite3_
7170: 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 6d  db_readonly db m
7180: 61 69 6e 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d  ain.} {0}..#----
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71d0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
71e0: 6f 77 69 6e 67 20 74 65 73 74 73 20 64 65 61 6c  owing tests deal
71f0: 20 77 69 74 68 20 6d 75 6c 74 69 2d 66 69 6c 65   with multi-file
7200: 20 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20 70 61   commits..#.# pa
7210: 67 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68 65 20  ger1-5.1.*: The 
7220: 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 75 6c  case where a mul
7230: 74 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  ti-file cannot b
7240: 65 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 63 61  e committed beca
7250: 75 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  use.#           
7260: 20 20 20 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e      another conn
7270: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
7280: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
7290: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a 23 20  on one of the.# 
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
72b0: 6c 65 73 2e 20 41 66 74 65 72 20 74 68 65 20 53  les. After the S
72c0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
72d0: 6d 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d 4d 49  moved, the COMMI
72e0: 54 20 73 75 63 63 65 65 64 73 2e 0a 23 0a 23 20  T succeeds..#.# 
72f0: 70 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20 4d 75  pager1-5.2.*: Mu
7300: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
7310: 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
7320: 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70  de=memory..#.# p
7330: 61 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d 75 6c  ager1-5.3.*: Mul
7340: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20  ti-file commits 
7350: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
7360: 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61  e=memory..#.# pa
7370: 67 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68 65 63  ger1-5.4.*: Chec
7380: 6b 20 74 68 61 74 20 77 69 74 68 20 73 79 6e 63  k that with sync
7390: 68 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c 2c 20  hronous=normal, 
73a0: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
73b0: 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20  al file.#       
73c0: 20 20 20 20 20 20 20 20 6e 61 6d 65 20 69 73 20          name is 
73d0: 61 64 64 65 64 20 74 6f 20 61 20 6a 6f 75 72 6e  added to a journ
73e0: 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  al file immediat
73f0: 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c 61  ely after the la
7400: 73 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  st.#            
7410: 20 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72     journal recor
7420: 64 2e 20 42 75 74 20 77 69 74 68 20 73 79 6e 63  d. But with sync
7430: 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20 65 78  hronous=full, ex
7440: 74 72 61 20 75 6e 75 73 65 64 20 73 70 61 63 65  tra unused space
7450: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
7460: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 65   is allocated be
7470: 74 77 65 65 6e 20 74 68 65 20 6c 61 73 74 20 6a  tween the last j
7480: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 61 6e  ournal record an
7490: 64 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20  d the .#        
74a0: 20 20 20 20 20 20 20 6d 61 73 74 65 72 2d 6a 6f         master-jo
74b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
74c0: 73 6f 20 74 68 61 74 20 74 68 65 20 6d 61 73 74  so that the mast
74d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  er-journal file.
74e0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
74f0: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 6c 69  name does not li
7500: 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  e on the same se
7510: 63 74 6f 72 20 61 73 20 74 68 65 20 6c 61 73 74  ctor as the last
7520: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20   journal file.# 
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
7540: 63 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65 72 31  cord..#.# pager1
7550: 2d 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20 74 68  -5.5.*: Check th
7560: 61 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at in journal_mo
7570: 64 65 3d 50 45 52 53 49 53 54 20 6d 6f 64 65 2c  de=PERSIST mode,
7580: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
7590: 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  is.#            
75a0: 20 20 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20     truncated to 
75b0: 7a 65 72 6f 20 62 79 74 65 73 20 77 68 65 6e 20  zero bytes when 
75c0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
75d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 20  nsaction is .#  
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
75f0: 6d 69 74 74 65 64 20 28 69 6e 73 74 65 61 64 20  mitted (instead 
7600: 6f 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  of the first cou
7610: 70 6c 65 20 6f 66 20 62 79 74 65 73 20 62 65 69  ple of bytes bei
7620: 6e 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a 23 0a  ng zeroed)..#.#.
7630: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
7640: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
7650: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
7660: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
7670: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
7680: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
7690: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
76a0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
76b0: 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32  ATE TABLE aux.t2
76c0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
76d0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
76e0: 53 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29 3b 0a  S(17, 'Lenin');.
76f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7700: 74 31 20 56 41 4c 55 45 53 28 32 32 2c 20 27 53  t1 VALUES(22, 'S
7710: 74 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53  talin');.    INS
7720: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7730: 45 53 28 35 33 2c 20 27 4b 68 72 75 73 68 63 68  ES(53, 'Khrushch
7740: 65 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  ev');.  }.} {}.d
7750: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7760: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
7770: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
7780: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7790: 31 20 56 41 4c 55 45 53 28 36 34 2c 20 27 42 72  1 VALUES(64, 'Br
77a0: 65 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20 20 20  ezhnev');.      
77b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
77c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
77d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  .  }.  sqlite3 d
77e0: 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78  b2 test.db2.  ex
77f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
7800: 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  N;.      SELECT 
7810: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 64  * FROM t2;.  } d
7820: 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  b2.} {}.do_test 
7830: 70 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b 0a 20  pager1-5.1.3 {. 
7840: 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54   catchsql COMMIT
7850: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
7860: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74  is locked}}.do_t
7870: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 34  est pager1-5.1.4
7880: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   {.  execsql COM
7890: 4d 49 54 20 64 62 32 0a 20 20 65 78 65 63 73 71  MIT db2.  execsq
78a0: 6c 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63 73  l COMMIT.  execs
78b0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
78c0: 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t2 } db2.} {1
78d0: 37 20 4c 65 6e 69 6e 20 32 32 20 53 74 61 6c 69  7 Lenin 22 Stali
78e0: 6e 20 35 33 20 4b 68 72 75 73 68 63 68 65 76 20  n 53 Khrushchev 
78f0: 36 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64 6f 5f  64 Brezhnev}.do_
7900: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e  test pager1-5.1.
7910: 35 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  5 {.  db2 close.
7920: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
7930: 67 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20 20 65  ger1-5.2.1 {.  e
7940: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
7950: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
7960: 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20 20 42   = memory;.    B
7970: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
7980: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7990: 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27  S(84, 'Andropov'
79a0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
79b0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38  INTO t2 VALUES(8
79c0: 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a  4, 'Andropov');.
79d0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
79e0: 7d 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f 74 65  } {memory}.do_te
79f0: 73 74 20 70 61 67 65 72 31 2d 35 2e 33 2e 31 20  st pager1-5.3.1 
7a00: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
7a10: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
7a20: 5f 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20 20 20  _mode = off;.   
7a30: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
7a40: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
7a50: 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68  UES(85, 'Gorbach
7a60: 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ev');.      INSE
7a70: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
7a80: 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76  S(85, 'Gorbachev
7a90: 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ');.    COMMIT;.
7aa0: 20 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64 6f 5f    }.} {off}..do_
7ab0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e  test pager1-5.4.
7ac0: 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  1 {.  db close. 
7ad0: 20 74 65 73 74 76 66 73 20 74 76 0a 20 20 73 71   testvfs tv.  sq
7ae0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
7af0: 20 2d 76 66 73 20 74 76 0a 20 20 65 78 65 63 73   -vfs tv.  execs
7b00: 71 6c 20 7b 20 41 54 54 41 43 48 20 27 74 65 73  ql { ATTACH 'tes
7b10: 74 2e 64 62 32 27 20 41 53 20 61 75 78 20 7d 0a  t.db2' AS aux }.
7b20: 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78 44 65  .  tv filter xDe
7b30: 6c 65 74 65 0a 20 20 74 76 20 73 63 72 69 70 74  lete.  tv script
7b40: 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a   max_journal_siz
7b50: 65 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  e.  tv sectorsiz
7b60: 65 20 35 31 32 0a 20 20 73 65 74 20 3a 3a 6d 61  e 512.  set ::ma
7b70: 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 70 72  x_journal 0.  pr
7b80: 6f 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73  oc max_journal_s
7b90: 69 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72 67 73  ize {method args
7ba0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 7a 20 30  } {.    set sz 0
7bb0: 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73 65 74  .    catch { set
7bc0: 20 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74   sz [file size t
7bd0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20  est.db-journal] 
7be0: 7d 0a 20 20 20 20 69 66 20 7b 24 73 7a 20 3e 20  }.    if {$sz > 
7bf0: 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 7d 20  $::max_journal} 
7c00: 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 61  {.      set ::ma
7c10: 78 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a 20 20  x_journal $sz.  
7c20: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
7c30: 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 65  QLITE_OK.  }.  e
7c40: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
7c50: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
7c60: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50   = DELETE;.    P
7c70: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
7c80: 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  s = NORMAL;.    
7c90: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
7ca0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7cb0: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
7cc0: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
7cd0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
7ce0: 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27  (85, 'Gorbachev'
7cf0: 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  );.    COMMIT;. 
7d00: 20 7d 0a 0a 20 20 23 20 54 68 65 20 73 69 7a 65   }..  # The size
7d10: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7d20: 66 69 6c 65 20 69 73 20 6e 6f 77 3a 0a 20 20 23  file is now:.  #
7d30: 20 0a 20 20 23 20 20 20 31 29 20 35 31 32 20 62   .  #   1) 512 b
7d40: 79 74 65 20 68 65 61 64 65 72 20 2b 0a 20 20 23  yte header +.  #
7d50: 20 20 20 32 29 20 32 20 2a 20 28 31 30 32 34 2b     2) 2 * (1024+
7d60: 38 29 20 62 79 74 65 20 72 65 63 6f 72 64 73 20  8) byte records 
7d70: 2b 0a 20 20 23 20 20 20 33 29 20 32 30 2b 4e 20  +.  #   3) 20+N 
7d80: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 2d  bytes of master-
7d90: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
7da0: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
7db0: 73 69 7a 65 20 6f 66 20 0a 20 20 23 20 20 20 20  size of .  #    
7dc0: 20 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75    the master-jou
7dd0: 72 6e 61 6c 20 6e 61 6d 65 20 65 6e 63 6f 64 65  rnal name encode
7de0: 64 20 61 73 20 75 74 66 2d 38 20 77 69 74 68 20  d as utf-8 with 
7df0: 6e 6f 20 6e 75 6c 20 74 65 72 6d 2e 0a 20 20 23  no nul term..  #
7e00: 0a 20 20 73 65 74 20 6d 6a 5f 70 6f 69 6e 74 65  .  set mj_pointe
7e10: 72 20 5b 65 78 70 72 20 7b 0a 20 20 20 20 32 30  r [expr {.    20
7e20: 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   + [string lengt
7e30: 68 20 22 74 65 73 74 2e 64 62 2d 6d 6a 58 58 58  h "test.db-mjXXX
7e40: 58 58 58 39 58 58 22 5d 0a 20 20 7d 5d 0a 20 20  XXX9XX"].  }].  
7e50: 23 0a 20 20 23 20 20 20 4e 4f 54 45 3a 20 46 6f  #.  #   NOTE: Fo
7e60: 72 20 69 74 65 6d 20 33 20 61 62 6f 76 65 2c 20  r item 3 above, 
7e70: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  if the current S
7e80: 51 4c 69 74 65 20 56 46 53 20 6c 61 63 6b 73 20  QLite VFS lacks 
7e90: 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 61  the concept of a
7ea0: 0a 20 20 23 20 20 20 20 20 20 20 20 20 63 75 72  .  #         cur
7eb0: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2c 20  rent directory, 
7ec0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
7ed0: 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74  e current direct
7ee0: 6f 72 79 20 6e 61 6d 65 20 70 6c 75 73 20 31 0a  ory name plus 1.
7ef0: 20 20 23 20 20 20 20 20 20 20 20 20 63 68 61 72    #         char
7f00: 61 63 74 65 72 20 66 6f 72 20 74 68 65 20 64 69  acter for the di
7f10: 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f  rectory separato
7f20: 72 20 63 68 61 72 61 63 74 65 72 20 61 72 65 20  r character are 
7f30: 4e 4f 54 20 63 6f 75 6e 74 65 64 20 61 73 0a 20  NOT counted as. 
7f40: 20 23 20 20 20 20 20 20 20 20 20 70 61 72 74 20   #         part 
7f50: 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 73 69 7a  of the total siz
7f60: 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68  e; otherwise, th
7f70: 65 79 20 61 72 65 2e 0a 20 20 23 0a 20 20 69 66  ey are..  #.  if
7f80: 63 61 70 61 62 6c 65 20 63 75 72 64 69 72 20 7b  capable curdir {
7f90: 0a 20 20 20 20 73 65 74 20 6d 6a 5f 70 6f 69 6e  .    set mj_poin
7fa0: 74 65 72 20 5b 65 78 70 72 20 7b 24 6d 6a 5f 70  ter [expr {$mj_p
7fb0: 6f 69 6e 74 65 72 20 2b 20 5b 73 74 72 69 6e 67  ointer + [string
7fc0: 20 6c 65 6e 67 74 68 20 5b 67 65 74 5f 70 77 64   length [get_pwd
7fd0: 5d 5d 20 2b 20 31 7d 5d 0a 20 20 7d 0a 20 20 65  ]] + 1}].  }.  e
7fe0: 78 70 72 20 7b 24 3a 3a 6d 61 78 5f 6a 6f 75 72  xpr {$::max_jour
7ff0: 6e 61 6c 3d 3d 28 35 31 32 2b 32 2a 28 31 30 32  nal==(512+2*(102
8000: 34 2b 38 29 2b 24 6d 6a 5f 70 6f 69 6e 74 65 72  4+8)+$mj_pointer
8010: 29 7d 0a 7d 20 31 0a 64 6f 5f 74 65 73 74 20 70  )}.} 1.do_test p
8020: 61 67 65 72 31 2d 35 2e 34 2e 32 20 7b 0a 20 20  ager1-5.4.2 {.  
8030: 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61  set ::max_journa
8040: 6c 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  l 0.  execsql {.
8050: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
8060: 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a 20  ronous = full;. 
8070: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
8080: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
8090: 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27  HERE b = 'Lenin'
80a0: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
80b0: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20 3d  ROM t2 WHERE b =
80c0: 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 43 4f   'Lenin';.    CO
80d0: 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 23 20 49  MMIT;.  }..  # I
80e0: 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75  n synchronous=fu
80f0: 6c 6c 20 6d 6f 64 65 2c 20 74 68 65 20 6d 61 73  ll mode, the mas
8100: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
8110: 74 65 72 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ter is not writt
8120: 65 6e 0a 20 20 23 20 64 69 72 65 63 74 6c 79 20  en.  # directly 
8130: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 72  after the last r
8140: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
8150: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 73 74 65  rnal file. Inste
8160: 61 64 2c 20 69 74 20 69 73 0a 20 20 23 20 77 72  ad, it is.  # wr
8170: 69 74 74 65 6e 20 73 74 61 72 74 69 6e 67 20 61  itten starting a
8180: 74 20 74 68 65 20 6e 65 78 74 20 28 69 6e 20 74  t the next (in t
8190: 68 69 73 20 63 61 73 65 20 35 31 32 20 62 79 74  his case 512 byt
81a0: 65 29 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  e) sector bounda
81b0: 72 79 2e 0a 20 20 23 0a 20 20 73 65 74 20 6d 6a  ry..  #.  set mj
81c0: 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b  _pointer [expr {
81d0: 0a 20 20 20 20 32 30 20 2b 20 5b 73 74 72 69 6e  .    20 + [strin
81e0: 67 20 6c 65 6e 67 74 68 20 22 74 65 73 74 2e 64  g length "test.d
81f0: 62 2d 6d 6a 58 58 58 58 58 58 39 58 58 22 5d 0a  b-mjXXXXXX9XX"].
8200: 20 20 7d 5d 0a 20 20 23 0a 20 20 23 20 20 20 4e    }].  #.  #   N
8210: 4f 54 45 3a 20 49 66 20 74 68 65 20 63 75 72 72  OTE: If the curr
8220: 65 6e 74 20 53 51 4c 69 74 65 20 56 46 53 20 6c  ent SQLite VFS l
8230: 61 63 6b 73 20 74 68 65 20 63 6f 6e 63 65 70 74  acks the concept
8240: 20 6f 66 20 61 20 63 75 72 72 65 6e 74 20 64 69   of a current di
8250: 72 65 63 74 6f 72 79 2c 0a 20 20 23 20 20 20 20  rectory,.  #    
8260: 20 20 20 20 20 74 68 65 20 6c 65 6e 67 74 68 20       the length 
8270: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  of the current d
8280: 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 70 6c  irectory name pl
8290: 75 73 20 31 20 63 68 61 72 61 63 74 65 72 20 66  us 1 character f
82a0: 6f 72 20 74 68 65 0a 20 20 23 20 20 20 20 20 20  or the.  #      
82b0: 20 20 20 64 69 72 65 63 74 6f 72 79 20 73 65 70     directory sep
82c0: 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
82d0: 20 61 72 65 20 4e 4f 54 20 63 6f 75 6e 74 65 64   are NOT counted
82e0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
82f0: 74 6f 74 61 6c 0a 20 20 23 20 20 20 20 20 20 20  total.  #       
8300: 20 20 73 69 7a 65 3b 20 6f 74 68 65 72 77 69 73    size; otherwis
8310: 65 2c 20 74 68 65 79 20 61 72 65 2e 0a 20 20 23  e, they are..  #
8320: 0a 20 20 69 66 63 61 70 61 62 6c 65 20 63 75 72  .  ifcapable cur
8330: 64 69 72 20 7b 0a 20 20 20 20 73 65 74 20 6d 6a  dir {.    set mj
8340: 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b  _pointer [expr {
8350: 24 6d 6a 5f 70 6f 69 6e 74 65 72 20 2b 20 5b 73  $mj_pointer + [s
8360: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67 65  tring length [ge
8370: 74 5f 70 77 64 5d 5d 20 2b 20 31 7d 5d 0a 20 20  t_pwd]] + 1}].  
8380: 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 61 78  }.  expr {$::max
8390: 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 28 28 35 31 32  _journal==(((512
83a0: 2b 32 2a 28 31 30 32 34 2b 38 29 2b 35 31 31 29  +2*(1024+8)+511)
83b0: 2f 35 31 32 29 2a 35 31 32 20 2b 20 24 6d 6a 5f  /512)*512 + $mj_
83c0: 70 6f 69 6e 74 65 72 29 7d 0a 7d 20 31 0a 64 62  pointer)}.} 1.db
83d0: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
83e0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
83f0: 2d 35 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74  -5.5.1 {.  sqlit
8400: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
8410: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41  execsql { .    A
8420: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
8430: 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41   AS aux;.    PRA
8440: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8450: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
8460: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
8470: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
8480: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
8490: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
84a0: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
84b0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
84c0: 20 55 50 44 41 54 45 20 74 33 20 53 45 54 20 62   UPDATE t3 SET b
84d0: 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35   = randomblob(15
84e0: 30 30 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20  00);.  }.  expr 
84f0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
8500: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35  db-journal] > 15
8510: 30 30 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  000.} {1}.do_tes
8520: 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b  t pager1-5.5.2 {
8530: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
8540: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
8550: 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20  ous = full;.    
8560: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c  BEGIN;.      DEL
8570: 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
8580: 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a  E b = 'Stalin';.
8590: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
85a0: 4d 20 74 32 20 57 48 45 52 45 20 62 20 3d 20 27  M t2 WHERE b = '
85b0: 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d  Stalin';.    COM
85c0: 4d 49 54 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20  MIT;.  }.  file 
85d0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
85e0: 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d  rnal.} {0}...#--
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8630: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
8640: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f  llowing tests wo
8650: 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41 20  rk with "PRAGMA 
8660: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a  max_page_count".
8670: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
8680: 2d 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  -6.1 {.  faultsi
8690: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
86a0: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
86b0: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
86c0: 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20  size = 4096;.   
86d0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
86e0: 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20  uum = none;.    
86f0: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8700: 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20 20 20 20  count = 10;.    
8710: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
8720: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
8730: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29  E TABLE t3(a, b)
8740: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8750: 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20 20 20  LE t4(a, b);.   
8760: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
8770: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
8780: 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62  TE TABLE t6(a, b
8790: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
87a0: 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a 20 20  BLE t7(a, b);.  
87b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
87c0: 38 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  8(a, b);.    CRE
87d0: 41 54 45 20 54 41 42 4c 45 20 74 39 28 61 2c 20  ATE TABLE t9(a, 
87e0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
87f0: 41 42 4c 45 20 74 31 30 28 61 2c 20 62 29 3b 0a  ABLE t10(a, b);.
8800: 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f 5f 63 61    }.} {10}.do_ca
8810: 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65  tchsql_test page
8820: 72 31 2d 36 2e 32 20 7b 0a 20 20 43 52 45 41 54  r1-6.2 {.  CREAT
8830: 45 20 54 41 42 4c 45 20 74 31 31 28 61 2c 20 62  E TABLE t11(a, b
8840: 29 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  ).} {1 {database
8850: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
8860: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
8870: 73 74 20 70 61 67 65 72 31 2d 36 2e 34 20 7b 20  st pager1-6.4 { 
8880: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8890: 63 6f 75 6e 74 20 20 20 20 20 20 7d 20 7b 31 30  count      } {10
88a0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
88b0: 74 20 70 61 67 65 72 31 2d 36 2e 35 20 7b 20 50  t pager1-6.5 { P
88c0: 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63  RAGMA max_page_c
88d0: 6f 75 6e 74 20 3d 20 31 35 20 7d 20 7b 31 35 7d  ount = 15 } {15}
88e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
88f0: 20 70 61 67 65 72 31 2d 36 2e 36 20 7b 20 43 52   pager1-6.6 { CR
8900: 45 41 54 45 20 54 41 42 4c 45 20 74 31 31 28 61  EATE TABLE t11(a
8910: 2c 20 62 29 20 20 20 20 20 7d 20 7b 7d 0a 64 6f  , b)     } {}.do
8920: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
8930: 67 65 72 31 2d 36 2e 37 20 7b 0a 20 20 42 45 47  ger1-6.7 {.  BEG
8940: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
8950: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 31  NTO t11 VALUES(1
8960: 2c 20 32 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  , 2);.    PRAGMA
8970: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8980: 3d 20 31 33 3b 0a 7d 20 7b 31 33 7d 0a 64 6f 5f  = 13;.} {13}.do_
8990: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
89a0: 65 72 31 2d 36 2e 38 20 7b 0a 20 20 20 20 49 4e  er1-6.8 {.    IN
89b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41  SERT INTO t11 VA
89c0: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20  LUES(3, 4);.    
89d0: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
89e0: 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 7d 20 7b 31  count = 10;.} {1
89f0: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
8a00: 73 74 20 70 61 67 65 72 31 2d 36 2e 39 20 7b 20  st pager1-6.9 { 
8a10: 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a 64 6f 5f  COMMIT } {}..do_
8a20: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
8a30: 65 72 31 2d 36 2e 31 30 20 7b 20 50 52 41 47 4d  er1-6.10 { PRAGM
8a40: 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  A max_page_count
8a50: 20 3d 20 31 30 20 7d 20 7b 31 31 7d 0a 64 6f 5f   = 10 } {11}.do_
8a60: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
8a70: 65 72 31 2d 36 2e 31 31 20 7b 20 53 45 4c 45 43  er1-6.11 { SELEC
8a80: 54 20 2a 20 46 52 4f 4d 20 74 31 31 20 7d 20 20  T * FROM t11 }  
8a90: 20 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34          {1 2 3 4
8aa0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
8ab0: 74 20 70 61 67 65 72 31 2d 36 2e 31 32 20 7b 20  t pager1-6.12 { 
8ac0: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8ad0: 63 6f 75 6e 74 20 7d 20 20 20 20 20 20 7b 31 31  count }      {11
8ae0: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
8af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
8b30: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
8b40: 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22  ests work with "
8b50: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
8b60: 6f 64 65 3d 54 52 55 4e 43 41 54 45 22 20 61 6e  ode=TRUNCATE" an
8b70: 64 0a 23 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b  d.# "PRAGMA lock
8b80: 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
8b90: 56 45 22 2e 0a 23 0a 23 20 45 61 63 68 20 74 65  VE"..#.# Each te
8ba0: 73 74 20 69 73 20 73 70 65 63 69 66 69 65 64 20  st is specified 
8bb0: 77 69 74 68 20 35 20 76 61 72 69 61 62 6c 65 73  with 5 variables
8bc0: 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a  . As follows:.#.
8bd0: 23 20 20 20 24 74 6e 3a 20 20 54 65 73 74 20 4e  #   $tn:  Test N
8be0: 75 6d 62 65 72 2e 20 55 73 65 64 20 61 73 20 70  umber. Used as p
8bf0: 61 72 74 20 6f 66 20 74 68 65 20 5b 64 6f 5f 74  art of the [do_t
8c00: 65 73 74 5d 20 74 65 73 74 20 6e 61 6d 65 73 2e  est] test names.
8c10: 0a 23 20 20 20 24 73 71 6c 3a 20 53 51 4c 20 74  .#   $sql: SQL t
8c20: 6f 20 65 78 65 63 75 74 65 2e 0a 23 20 20 20 24  o execute..#   $
8c30: 72 65 73 3a 20 45 78 70 65 63 74 65 64 20 72 65  res: Expected re
8c40: 73 75 6c 74 20 6f 66 20 65 78 65 63 75 74 69 6e  sult of executin
8c50: 67 20 24 73 71 6c 2e 0a 23 20 20 20 24 6a 73 3a  g $sql..#   $js:
8c60: 20 20 54 68 65 20 65 78 70 65 63 74 65 64 20 73    The expected s
8c70: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
8c80: 61 6c 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65  al file, in byte
8c90: 73 2c 20 61 66 74 65 72 20 65 78 65 63 75 74 69  s, after executi
8ca0: 6e 67 0a 23 20 20 20 20 20 20 20 20 20 74 68 65  ng.#         the
8cb0: 20 53 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20   SQL script. Or 
8cc0: 2d 31 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  -1 if the journa
8cd0: 6c 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65  l is not expecte
8ce0: 64 20 74 6f 20 65 78 69 73 74 2e 0a 23 20 20 20  d to exist..#   
8cf0: 24 77 73 3a 20 20 54 68 65 20 65 78 70 65 63 74  $ws:  The expect
8d00: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57  ed size of the W
8d10: 41 4c 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65  AL file, in byte
8d20: 73 2c 20 61 66 74 65 72 20 65 78 65 63 75 74 69  s, after executi
8d30: 6e 67 0a 23 20 20 20 20 20 20 20 20 20 74 68 65  ng.#         the
8d40: 20 53 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20   SQL script. Or 
8d50: 2d 31 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  -1 if the WAL is
8d60: 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f   not expected to
8d70: 20 65 78 69 73 74 2e 0a 23 0a 69 66 63 61 70 61   exist..#.ifcapa
8d80: 62 6c 65 20 77 61 6c 20 7b 0a 20 20 66 61 75 6c  ble wal {.  faul
8d90: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
8da0: 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61 63 68  reopen.  foreach
8db0: 20 7b 74 6e 20 73 71 6c 20 72 65 73 20 6a 73 20   {tn sql res js 
8dc0: 77 73 7d 20 5b 73 75 62 73 74 20 7b 0a 20 20 0a  ws} [subst {.  .
8dd0: 20 20 20 20 31 20 20 7b 0a 20 20 20 20 20 20 43      1  {.      C
8de0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
8df0: 2c 20 62 29 3b 0a 20 20 20 20 20 20 50 52 41 47  , b);.      PRAG
8e00: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f  MA auto_vacuum=O
8e10: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
8e20: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
8e30: 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  MAL;.      PRAGM
8e40: 41 20 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34  A page_size=1024
8e50: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c  ;.      PRAGMA l
8e60: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
8e70: 55 53 49 56 45 3b 0a 20 20 20 20 20 20 50 52 41  USIVE;.      PRA
8e80: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8e90: 3d 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 20  =TRUNCATE;.     
8ea0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8eb0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
8ec0: 20 20 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 74    } {exclusive t
8ed0: 72 75 6e 63 61 74 65 7d 20 30 20 2d 31 0a 20 20  runcate} 0 -1.  
8ee0: 0a 20 20 20 20 32 20 20 7b 0a 20 20 20 20 20 20  .    2  {.      
8ef0: 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b  BEGIN IMMEDIATE;
8f00: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
8f10: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  * FROM t1;.     
8f20: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b   COMMIT;.    } {
8f30: 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20  1 2} 0 -1.  .   
8f40: 20 33 20 20 7b 0a 20 20 20 20 20 20 42 45 47 49   3  {.      BEGI
8f50: 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  N;.        SELEC
8f60: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
8f70: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
8f80: 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20   {1 2} 0 -1.  . 
8f90: 20 20 20 34 20 20 7b 20 50 52 41 47 4d 41 20 6a     4  { PRAGMA j
8fa0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
8fb0: 4c 20 7d 20 20 20 20 77 61 6c 20 20 20 20 20 20  L }    wal      
8fc0: 20 2d 31 20 2d 31 0a 20 20 20 20 35 20 20 7b 20   -1 -1.    5  { 
8fd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
8fe0: 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 20 20 7b  ALUES(3, 4) }  {
8ff0: 7d 20 20 20 20 20 20 20 20 2d 31 20 5b 77 61 6c  }        -1 [wal
9000: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32  _file_size 1 102
9010: 34 5d 0a 20 20 20 20 36 20 20 7b 20 50 52 41 47  4].    6  { PRAG
9020: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
9030: 3d 20 4e 4f 52 4d 41 4c 20 7d 20 65 78 63 6c 75  = NORMAL } exclu
9040: 73 69 76 65 20 2d 31 20 5b 77 61 6c 5f 66 69 6c  sive -1 [wal_fil
9050: 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a 20  e_size 1 1024]. 
9060: 20 20 20 37 20 20 7b 20 49 4e 53 45 52 54 20 49     7  { INSERT I
9070: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
9080: 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20 20 20 20   6); } {}       
9090: 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69   -1 [wal_file_si
90a0: 7a 65 20 32 20 31 30 32 34 5d 0a 20 20 0a 20 20  ze 2 1024].  .  
90b0: 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f    8  { PRAGMA jo
90c0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55  urnal_mode = TRU
90d0: 4e 43 41 54 45 20 7d 20 74 72 75 6e 63 61 74 65  NCATE } truncate
90e0: 20 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20            0 -1. 
90f0: 20 20 20 39 20 20 7b 20 49 4e 53 45 52 54 20 49     9  { INSERT I
9100: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c  NTO t1 VALUES(7,
9110: 20 38 29 20 7d 20 20 20 20 7b 7d 20 20 20 20 20   8) }    {}     
9120: 20 20 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a             0 -1.
9130: 20 20 20 20 31 30 20 7b 20 53 45 4c 45 43 54 20      10 { SELECT 
9140: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20 20  * FROM t1 }     
9150: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33            {1 2 3
9160: 20 34 20 35 20 36 20 37 20 38 7d 20 30 20 2d 31   4 5 6 7 8} 0 -1
9170: 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 64  .  .  }] {.    d
9180: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
9190: 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20  ager1-7.1.$tn.1 
91a0: 24 73 71 6c 20 24 72 65 73 0a 20 20 20 20 63 61  $sql $res.    ca
91b0: 74 63 68 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b  tch { set J -1 ;
91c0: 20 73 65 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a   set J [file siz
91d0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
91e0: 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63 68 20 7b  l] }.    catch {
91f0: 20 73 65 74 20 57 20 2d 31 20 3b 20 73 65 74 20   set W -1 ; set 
9200: 57 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  W [file size tes
9210: 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20  t.db-wal] }.    
9220: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37  do_test pager1-7
9230: 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20  .1.$tn.2 { list 
9240: 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a  $J $W } [list $j
9250: 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f  s $ws].  }.}..do
9260: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32  _test pager1-7.2
9270: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
9280: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
9290: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
92a0: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
92b0: 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56  _mode = EXCLUSIV
92c0: 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  E;.    CREATE TA
92d0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
92e0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50    BEGIN;.      P
92f0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
9300: 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20  de = delete;.   
9310: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
9320: 6c 5f 6d 6f 64 65 20 3d 20 74 72 75 6e 63 61 74  l_mode = truncat
9330: 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73  e;.  }.} {exclus
9340: 69 76 65 20 64 65 6c 65 74 65 20 74 72 75 6e 63  ive delete trunc
9350: 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ate}.do_test pag
9360: 65 72 31 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78  er1-7.2.2 {.  ex
9370: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
9380: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
9390: 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   2) }.  execsql 
93a0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
93b0: 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74 20  _mode = persist 
93c0: 7d 0a 7d 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64  }.} {truncate}.d
93d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e  o_test pager1-7.
93e0: 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
93f0: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65  { COMMIT }.  exe
9400: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
9410: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
9420: 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 50 52   persist;.    PR
9430: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a  AGMA journal_siz
9440: 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b  e_limit;.  }.} {
9450: 70 65 72 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d  persist -1}..#--
9460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94a0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
94b0: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 70  llowing tests, p
94c0: 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20  ager1-8.*, test 
94d0: 74 68 61 74 20 74 68 65 20 73 70 65 63 69 61 6c  that the special
94e0: 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a   filenames .# ":
94f0: 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20 22 22 20  memory:" and "" 
9500: 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72 79 20 64  open temporary d
9510: 61 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65  atabases..#.fore
9520: 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65  ach {tn filename
9530: 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a  } {.  1 :memory:
9540: 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f  .  2 "".} {.  do
9550: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24  _test pager1-8.$
9560: 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74  tn.1 {.    fault
9570: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
9580: 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f  eopen.    db clo
9590: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  se.    sqlite3 d
95a0: 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  b $filename.    
95b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
95c0: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
95d0: 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 43 52  um = 1;.      CR
95e0: 45 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 29  EATE TABLE x1(x)
95f0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9600: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 43  NTO x1 VALUES('C
9610: 68 61 72 6c 65 73 27 29 3b 0a 20 20 20 20 20 20  harles');.      
9620: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
9630: 41 4c 55 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a  ALUES('James');.
9640: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9650: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 4d 61 72  O x1 VALUES('Mar
9660: 79 27 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  y');.      SELEC
9670: 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20  T * FROM x1;.   
9680: 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c 65 73 20   }.  } {Charles 
9690: 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64  James Mary}..  d
96a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e  o_test pager1-8.
96b0: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69  $tn.2 {.    sqli
96c0: 74 65 33 20 64 62 32 20 24 66 69 6c 65 6e 61 6d  te3 db2 $filenam
96d0: 65 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  e.    catchsql {
96e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
96f0: 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b  1 } db2.  } {1 {
9700: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 78  no such table: x
9710: 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71  1}}..  do_execsq
9720: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e  l_test pager1-8.
9730: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42 45 47 49  $tn.3 {.    BEGI
9740: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
9750: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27  INTO x1 VALUES('
9760: 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20  William');.     
9770: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
9780: 56 41 4c 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a  VALUES('Anne');.
9790: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
97a0: 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  } {}.}..#-------
97b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97f0: 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20 62 6c  --.# The next bl
9800: 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 70  ock of tests - p
9810: 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c  ager1-9.* - deal
9820: 20 77 69 74 68 20 69 6e 74 65 72 61 63 74 69 6f   with interactio
9830: 6e 73 20 62 65 74 77 65 65 6e 0a 23 20 74 68 65  ns between.# the
9840: 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 62   pager and the b
9850: 61 63 6b 75 70 20 41 50 49 2e 20 54 65 73 74 20  ackup API. Test 
9860: 63 61 73 65 73 3a 0a 23 0a 23 20 20 20 70 61 67  cases:.#.#   pag
9870: 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20  er1-9.1.*: Test 
9880: 74 68 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f  that a backup co
9890: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
98a0: 75 6c 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65  ully even if the
98b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
98c0: 20 20 20 73 6f 75 72 63 65 20 64 62 20 69 73 20     source db is 
98d0: 77 72 69 74 74 65 6e 20 74 6f 20 64 75 72 69 6e  written to durin
98e0: 67 20 74 68 65 20 62 61 63 6b 75 70 20 6f 70 2e  g the backup op.
98f0: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e  .#.#   pager1-9.
9900: 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61  2.*: Test that a
9910: 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65   backup complete
9920: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65  s successfully e
9930: 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20  ven if the.#    
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
9950: 72 63 65 20 64 62 20 69 73 20 77 72 69 74 74 65  rce db is writte
9960: 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f  n to and then ro
9970: 6c 6c 65 64 20 62 61 63 6b 20 64 75 72 69 6e 67  lled back during
9980: 20 61 20 0a 23 20 20 20 20 20 20 20 20 20 20 20   a .#           
9990: 20 20 20 20 20 20 62 61 63 6b 75 70 20 6f 70 65        backup ope
99a0: 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73  ration..#.do_tes
99b0: 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b  t pager1-9.0.1 {
99c0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
99d0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
99e0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
99f0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
9a00: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
9a10: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
9a20: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
9a30: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9a40: 61 62 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28  ab(a, b, UNIQUE(
9a50: 61 2c 20 62 29 29 3b 0a 20 20 20 20 20 20 49 4e  a, b));.      IN
9a60: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c  SERT INTO ab VAL
9a70: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 32 30  UES( a_string(20
9a80: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
9a90: 29 20 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ) );.      INSER
9aa0: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
9ab0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
9ac0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
9ad0: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
9ae0: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
9af0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
9b00: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
9b10: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
9b20: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
9b30: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
9b40: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
9b50: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
9b60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
9b70: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
9b80: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9b90: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
9ba0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
9bb0: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
9bc0: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
9bd0: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
9be0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9bf0: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
9c00: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
9c10: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
9c20: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9c30: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
9c40: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
9c50: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
9c60: 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  b;.    COMMIT;. 
9c70: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
9c80: 70 61 67 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20  pager1-9.0.2 {. 
9c90: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
9ca0: 74 2e 64 62 32 0a 20 20 64 62 32 20 65 76 61 6c  t.db2.  db2 eval
9cb0: 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f   { PRAGMA cache_
9cc0: 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 73 71  size = 10 }.  sq
9cd0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
9ce0: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
9cf0: 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31    list [B step 1
9d00: 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d  0000] [B finish]
9d10: 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .} {SQLITE_DONE 
9d20: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
9d30: 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 33 20  st pager1-9.0.3 
9d40: 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  {. db one {SELEC
9d50: 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46  T md5sum(a, b) F
9d60: 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f  ROM ab}.} [db2 o
9d70: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
9d80: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
9d90: 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  ]..do_test pager
9da0: 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63  1-9.1.1 {.  exec
9db0: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20  sql { UPDATE ab 
9dc0: 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67  SET a = a_string
9dd0: 28 32 30 31 29 20 7d 0a 20 20 73 71 6c 69 74 65  (201) }.  sqlite
9de0: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d  3_backup B db2 m
9df0: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20  ain db main.  B 
9e00: 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54  step 30.} {SQLIT
9e10: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
9e20: 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65  ger1-9.1.2 {.  e
9e30: 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20  xecsql { UPDATE 
9e40: 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  ab SET b = a_str
9e50: 69 6e 67 28 33 30 31 29 20 7d 0a 20 20 6c 69 73  ing(301) }.  lis
9e60: 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d  t [B step 10000]
9e70: 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53   [B finish].} {S
9e80: 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54  QLITE_DONE SQLIT
9e90: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
9ea0: 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62  ger1-9.1.3 {. db
9eb0: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35   one {SELECT md5
9ec0: 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61  sum(a, b) FROM a
9ed0: 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53  b}.} [db2 one {S
9ee0: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
9ef0: 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f  b) FROM ab}].do_
9f00: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e  test pager1-9.1.
9f10: 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45  4 { execsql { SE
9f20: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9f30: 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a  OM ab } } {128}.
9f40: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9f50: 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  9.2.1 {.  execsq
9f60: 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45  l { UPDATE ab SE
9f70: 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32  T a = a_string(2
9f80: 30 32 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  02) }.  sqlite3_
9f90: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
9fa0: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74  n db main.  B st
9fb0: 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f  ep 30.} {SQLITE_
9fc0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9fd0: 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65  r1-9.2.2 {.  exe
9fe0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49  csql { .    BEGI
9ff0: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
a000: 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  ab SET b = a_str
a010: 69 6e 67 28 33 30 31 29 3b 0a 20 20 20 20 52 4f  ing(301);.    RO
a020: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69  LLBACK;.  }.  li
a030: 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30  st [B step 10000
a040: 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b  ] [B finish].} {
a050: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49  SQLITE_DONE SQLI
a060: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70  TE_OK}.do_test p
a070: 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64  ager1-9.2.3 {. d
a080: 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64  b one {SELECT md
a090: 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20  5sum(a, b) FROM 
a0a0: 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b  ab}.} [db2 one {
a0b0: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c  SELECT md5sum(a,
a0c0: 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f   b) FROM ab}].do
a0d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32  _test pager1-9.2
a0e0: 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53  .4 { execsql { S
a0f0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
a100: 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d  ROM ab } } {128}
a110: 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c  .db close.db2 cl
a120: 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  ose..do_test pag
a130: 65 72 31 2d 39 2e 33 2e 31 20 7b 0a 20 20 74 65  er1-9.3.1 {.  te
a140: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
a150: 74 20 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73  t 1.  tv sectors
a160: 69 7a 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74  ize 4096.  fault
a170: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
a180: 65 6f 70 65 6e 0a 0a 20 20 65 78 65 63 73 71 6c  eopen..  execsql
a190: 20 7b 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73   { PRAGMA page_s
a1a0: 69 7a 65 20 3d 20 31 30 32 34 20 7d 0a 20 20 66  ize = 1024 }.  f
a1b0: 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24  or {set ii 0} {$
a1c0: 69 69 20 3c 20 34 7d 20 7b 69 6e 63 72 20 69 69  ii < 4} {incr ii
a1d0: 7d 20 7b 20 65 78 65 63 73 71 6c 20 22 43 52 45  } { execsql "CRE
a1e0: 41 54 45 20 54 41 42 4c 45 20 74 24 7b 69 69 7d  ATE TABLE t${ii}
a1f0: 28 61 2c 20 62 29 22 20 7d 0a 7d 20 7b 7d 0a 64  (a, b)" }.} {}.d
a200: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
a210: 33 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  3.2 {.  sqlite3 
a220: 64 62 32 20 74 65 73 74 2e 64 62 32 0a 0a 20 20  db2 test.db2..  
a230: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
a240: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
a250: 20 34 30 39 36 3b 0a 20 20 20 20 50 52 41 47 4d   4096;.    PRAGM
a260: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
a270: 4f 46 46 3b 0a 20 20 20 20 43 52 45 41 54 45 20  OFF;.    CREATE 
a280: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
a290: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a2a0: 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64   t2(a, b);.  } d
a2b0: 62 32 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  b2..  sqlite3_ba
a2c0: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
a2d0: 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70  db main.  B step
a2e0: 20 33 30 0a 20 20 6c 69 73 74 20 5b 42 20 73 74   30.  list [B st
a2f0: 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e  ep 10000] [B fin
a300: 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  ish].} {SQLITE_D
a310: 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  ONE SQLITE_OK}.d
a320: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
a330: 33 2e 33 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73  3.3 {.  db2 clos
a340: 65 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  e.  db close.  t
a350: 76 20 64 65 6c 65 74 65 0a 20 20 66 69 6c 65 5f  v delete.  file_
a360: 70 61 67 65 5f 63 6f 75 6e 74 20 74 65 73 74 2e  page_count test.
a370: 64 62 32 0a 7d 20 5b 66 69 6c 65 5f 70 61 67 65  db2.} [file_page
a380: 5f 63 6f 75 6e 74 20 74 65 73 74 2e 64 62 5d 0a  _count test.db].
a390: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
a3a0: 39 2e 34 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  9.4.1 {.  faults
a3b0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
a3c0: 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64  open.  sqlite3 d
a3d0: 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78  b2 test.db2.  ex
a3e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
a3f0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34  MA page_size = 4
a400: 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54 45 20  096;.    CREATE 
a410: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
a420: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a430: 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64   t2(a, b);.  } d
a440: 62 32 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  b2.  sqlite3_bac
a450: 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64  kup B db2 main d
a460: 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74 20 5b 42  b main.  list [B
a470: 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20   step 10000] [B 
a480: 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54  finish].} {SQLIT
a490: 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b  E_DONE SQLITE_OK
a4a0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
a4b0: 2d 39 2e 34 2e 32 20 7b 0a 20 20 6c 69 73 74 20  -9.4.2 {.  list 
a4c0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
a4d0: 64 62 32 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  db2] [file size 
a4e0: 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 31 30 32 34  test.db].} {1024
a4f0: 20 30 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23   0}.db2 close..#
a500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
a550: 20 74 68 61 74 20 72 65 67 61 72 64 6c 65 73 73   that regardless
a560: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 72 65   of the value re
a570: 74 75 72 6e 65 64 20 62 79 20 78 53 65 63 74 6f  turned by xSecto
a580: 72 53 69 7a 65 28 29 2c 20 74 68 65 0a 23 20 6d  rSize(), the.# m
a590: 69 6e 69 6d 75 6d 20 65 66 66 65 63 74 69 76 65  inimum effective
a5a0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
a5b0: 35 31 32 20 61 6e 64 20 74 68 65 20 6d 61 78 69  512 and the maxi
a5c0: 6d 75 6d 20 36 35 35 33 36 20 62 79 74 65 73 2e  mum 65536 bytes.
a5d0: 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64  .#.testvfs tv -d
a5e0: 65 66 61 75 6c 74 20 31 0a 66 6f 72 65 61 63 68  efault 1.foreach
a5f0: 20 73 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20   sectorsize {.  
a600: 20 20 33 32 20 20 20 36 34 20 20 20 31 32 38 20    32   64   128 
a610: 20 20 32 35 36 20 20 20 35 31 32 20 20 20 31 30    256   512   10
a620: 32 34 20 20 20 32 30 34 38 20 0a 20 20 20 20 34  24   2048 .    4
a630: 30 39 36 20 38 31 39 32 20 31 36 33 38 34 20 33  096 8192 16384 3
a640: 32 37 36 38 20 36 35 35 33 36 20 31 33 31 30 37  2768 65536 13107
a650: 32 20 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74  2 262144.} {.  t
a660: 76 20 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65  v sectorsize $se
a670: 63 74 6f 72 73 69 7a 65 0a 20 20 74 76 20 64 65  ctorsize.  tv de
a680: 76 63 68 61 72 20 7b 7d 0a 20 20 73 65 74 20 65  vchar {}.  set e
a690: 66 66 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20  ff $sectorsize. 
a6a0: 20 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65   if {$sectorsize
a6b0: 20 3c 20 35 31 32 7d 20 20 20 7b 20 73 65 74 20   < 512}   { set 
a6c0: 65 66 66 20 35 31 32 20 7d 0a 20 20 69 66 20 7b  eff 512 }.  if {
a6d0: 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35  $sectorsize > 65
a6e0: 35 33 36 7d 20 7b 20 73 65 74 20 65 66 66 20 36  536} { set eff 6
a6f0: 35 35 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73  5536 }..  do_tes
a700: 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63  t pager1-10.$sec
a710: 74 6f 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20  torsize.1 {.    
a720: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
a730: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64  and_reopen.    d
a740: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
a750: 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65  a_string.    exe
a760: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
a770: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
a780: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
a790: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
a7a0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20  ze = 1024;.     
a7b0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20   BEGIN;.        
a7c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
a7d0: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43  a, b);.        C
a7e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
a7f0: 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52  , b);.        CR
a800: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
a810: 20 62 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49   b);.      COMMI
a820: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c  T;.    }.    fil
a830: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a  e size test.db-j
a840: 6f 75 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72  ournal.  } [expr
a850: 20 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36   $sectorsize > 6
a860: 35 35 33 36 20 3f 20 36 35 35 33 36 20 3a 20 24  5536 ? 65536 : $
a870: 73 65 63 74 6f 72 73 69 7a 65 5d 0a 0a 20 20 64  sectorsize]..  d
a880: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30  o_test pager1-10
a890: 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 32 20 7b  .$sectorsize.2 {
a8a0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
a8b0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
a8c0: 4f 20 74 33 20 56 41 4c 55 45 53 28 61 5f 73 74  O t3 VALUES(a_st
a8d0: 72 69 6e 67 28 33 30 30 29 2c 20 61 5f 73 74 72  ring(300), a_str
a8e0: 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20 20 20  ing(300));.     
a8f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
a900: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
a910: 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 32 20 2a  ;        /*  2 *
a920: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
a930: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20  NTO t3 SELECT * 
a940: 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20  FROM t3;        
a950: 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49  /*  4 */.      I
a960: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
a970: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20  LECT * FROM t3; 
a980: 20 20 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a         /*  8 */.
a990: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
a9a0: 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52  O t3 SELECT * FR
a9b0: 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a  OM t3;        /*
a9c0: 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53   16 */.      INS
a9d0: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
a9e0: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20  CT * FROM t3;   
a9f0: 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20       /* 32 */.  
aa00: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f    }.  } {}..  do
aa10: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e  _test pager1-10.
aa20: 24 73 65 63 74 6f 72 73 69 7a 65 2e 33 20 7b 0a  $sectorsize.3 {.
aa30: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
aa40: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
aa50: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
aa60: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
aa70: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
aa80: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
aa90: 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76    }.    recursiv
aaa0: 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b  e_select 32 t3 {
aab0: 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20  db eval "INSERT 
aac0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
aad0: 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73  , 2)"}.    execs
aae0: 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49  ql {.      COMMI
aaf0: 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  T;.      SELECT 
ab00: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  * FROM t2;.    }
ab10: 0a 20 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 64 6f  .  } {1 2}..  do
ab20: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e  _test pager1-10.
ab30: 24 73 65 63 74 6f 72 73 69 7a 65 2e 34 20 7b 0a  $sectorsize.4 {.
ab40: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
ab50: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
ab60: 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t6(a, b);.     
ab70: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
ab80: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52  (a, b);.      CR
ab90: 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c  EATE TABLE t5(a,
aba0: 20 62 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20   b);.      DROP 
abb0: 54 41 42 4c 45 20 74 36 3b 0a 20 20 20 20 20 20  TABLE t6;.      
abc0: 44 52 4f 50 20 54 41 42 4c 45 20 74 37 3b 0a 20  DROP TABLE t7;. 
abd0: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
abe0: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
abf0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
ac00: 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20  ABLE t6(a, b);. 
ac10: 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69     }.    recursi
ac20: 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20  ve_select 32 t3 
ac30: 7b 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54  {db eval "INSERT
ac40: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
ac50: 31 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63  1, 2)"}.    exec
ac60: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d  sql {.      COMM
ac70: 49 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  IT;.      SELECT
ac80: 20 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20   * FROM t5;.    
ac90: 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d  }.  } {1 2}.  .}
aca0: 0a 64 62 20 63 6c 6f 73 65 0a 0a 74 76 20 73 65  .db close..tv se
acb0: 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 64 6f  ctorsize 4096.do
acc0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e  _test pager1.10.
acd0: 78 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  x.1 {.  faultsim
ace0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
acf0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
ad00: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
ad10: 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20  acuum = none;.  
ad20: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
ad30: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43  ze = 1024;.    C
ad40: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
ad50: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65  );.  }.  for {se
ad60: 74 20 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20 7b  t i 0} {$i<30} {
ad70: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78  incr i} {.    ex
ad80: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
ad90: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 7a 65  NTO t1 VALUES(ze
ada0: 72 6f 62 6c 6f 62 28 39 30 30 29 29 20 7d 0a 20  roblob(900)) }. 
adb0: 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
adc0: 65 73 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d  est.db.} {32768}
add0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
ade0: 31 30 2e 78 2e 32 20 7b 0a 20 20 65 78 65 63 73  10.x.2 {.  execs
adf0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
ae00: 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20  TABLE t2(x);.   
ae10: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a   DROP TABLE t2;.
ae20: 20 20 7d 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65    }.  list [file
ae30: 5f 70 61 67 65 5f 63 6f 75 6e 74 20 74 65 73 74  _page_count test
ae40: 2e 64 62 5d 20 5b 66 69 6c 65 5f 70 61 67 65 5f  .db] [file_page_
ae50: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 7d 20  size test.db].} 
ae60: 7b 33 33 20 31 30 32 34 7d 0a 64 6f 5f 74 65 73  {33 1024}.do_tes
ae70: 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e 33 20  t pager1.10.x.3 
ae80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
ae90: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45    BEGIN;.    CRE
aea0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b  ATE TABLE t2(x);
aeb0: 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65  .  }.  recursive
aec0: 5f 73 65 6c 65 63 74 20 33 30 20 74 31 0a 20 20  _select 30 t1.  
aed0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
aee0: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 78 29  EATE TABLE t3(x)
aef0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
af00: 7d 0a 7d 20 7b 7d 0a 0a 64 62 20 63 6c 6f 73 65  }.} {}..db close
af10: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74 65 73 74  .tv delete..test
af20: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
af30: 31 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74  1.faultsim_delet
af40: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20  e_and_reopen.db 
af50: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
af60: 73 74 72 69 6e 67 0a 64 6f 5f 65 78 65 63 73 71  string.do_execsq
af70: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31  l_test pager1-11
af80: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f  .1 {.  PRAGMA jo
af90: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
afa0: 45 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 63 61  ETE;.  PRAGMA ca
afb0: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
afc0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
afd0: 54 45 20 54 41 42 4c 45 20 7a 7a 28 74 6f 70 20  TE TABLE zz(top 
afe0: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
aff0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
b000: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
b010: 28 32 32 32 29 29 3b 0a 20 20 20 20 49 4e 53 45  (222));.    INSE
b020: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
b030: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
b040: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
b050: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
b060: 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   zz;.    INSERT 
b070: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
b080: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
b090: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
b0a0: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
b0b0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
b0c0: 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74  O zz SELECT a_st
b0d0: 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32  ring((SELECT 222
b0e0: 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d  +max(rowid) FROM
b0f0: 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20   zz)) FROM zz;. 
b100: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
b110: 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  z SELECT a_strin
b120: 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61  g((SELECT 222+ma
b130: 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a  x(rowid) FROM zz
b140: 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20  )) FROM zz;.    
b150: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53  INSERT INTO zz S
b160: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28  ELECT a_string((
b170: 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72  SELECT 222+max(r
b180: 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20  owid) FROM zz)) 
b190: 46 52 4f 4d 20 7a 7a 3b 0a 20 20 43 4f 4d 4d 49  FROM zz;.  COMMI
b1a0: 54 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  T;.  BEGIN;.    
b1b0: 55 50 44 41 54 45 20 7a 7a 20 53 45 54 20 74 6f  UPDATE zz SET to
b1c0: 70 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 34 35  p = a_string(345
b1d0: 29 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 0a 70  );.} {delete}..p
b1e0: 72 6f 63 20 6c 6f 63 6b 6f 75 74 20 7b 6d 65 74  roc lockout {met
b1f0: 68 6f 64 20 61 72 67 73 7d 20 7b 20 72 65 74 75  hod args} { retu
b200: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
b210: 7d 0a 74 76 20 73 63 72 69 70 74 20 6c 6f 63 6b  }.tv script lock
b220: 6f 75 74 0a 74 76 20 66 69 6c 74 65 72 20 7b 78  out.tv filter {x
b230: 57 72 69 74 65 20 78 54 72 75 6e 63 61 74 65 20  Write xTruncate 
b240: 78 53 79 6e 63 7d 0a 64 6f 5f 63 61 74 63 68 73  xSync}.do_catchs
b250: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
b260: 31 2e 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b  1.2 { COMMIT } {
b270: 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  1 {disk I/O erro
b280: 72 7d 7d 0a 0a 74 76 20 73 63 72 69 70 74 20 7b  r}}..tv script {
b290: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
b2a0: 2d 31 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65  -11.3 {.  sqlite
b2b0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
b2c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
b2d0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
b2e0: 65 20 3d 20 54 52 55 4e 43 41 54 45 3b 0a 20 20  e = TRUNCATE;.  
b2f0: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
b300: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 64 62  ty_check;.  } db
b310: 32 0a 7d 20 7b 74 72 75 6e 63 61 74 65 20 6f 6b  2.} {truncate ok
b320: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
b330: 2d 31 31 2e 34 20 7b 0a 20 20 64 62 32 20 63 6c  -11.4 {.  db2 cl
b340: 6f 73 65 0a 20 20 66 69 6c 65 20 65 78 69 73 74  ose.  file exist
b350: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
b360: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73  l.} {0}.do_execs
b370: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
b380: 31 2e 35 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  1.5 { SELECT cou
b390: 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 7a 20 7d 20  nt(*) FROM zz } 
b3a0: 7b 33 32 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  {32}.db close.tv
b3b0: 20 64 65 6c 65 74 65 0a 20 20 0a 23 2d 2d 2d 2d   delete.  .#----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b400: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50 52  -----.# Test "PR
b410: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
b420: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
b430: 66 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f  fault 1.tv secto
b440: 72 73 69 7a 65 20 31 30 32 34 0a 66 6f 72 65 61  rsize 1024.forea
b450: 63 68 20 70 61 67 65 73 69 7a 65 20 7b 0a 20 20  ch pagesize {.  
b460: 20 20 35 31 32 20 20 20 31 30 32 34 20 20 20 32    512   1024   2
b470: 30 34 38 20 34 30 39 36 20 38 31 39 32 20 31 36  048 4096 8192 16
b480: 33 38 34 20 33 32 37 36 38 20 0a 7d 20 7b 0a 20  384 32768 .} {. 
b490: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
b4a0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 23  _and_reopen..  #
b4b0: 20 54 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   The sector-size
b4c0: 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74   (according to t
b4d0: 68 65 20 56 46 53 29 20 69 73 20 31 30 32 34 20  he VFS) is 1024 
b4e0: 62 79 74 65 73 2e 20 53 6f 20 69 66 20 74 68 65  bytes. So if the
b4f0: 0a 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72  .  # page-size r
b500: 65 71 75 65 73 74 65 64 20 75 73 69 6e 67 20 22  equested using "
b510: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
b520: 22 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  " is greater tha
b530: 6e 20 74 68 65 0a 20 20 23 20 63 6f 6d 70 69 6c  n the.  # compil
b540: 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20  e time value of 
b550: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
b560: 53 49 5a 45 2c 20 74 68 65 6e 20 74 68 65 20 65  SIZE, then the e
b570: 66 66 65 63 74 69 76 65 20 0a 20 20 23 20 70 61  ffective .  # pa
b580: 67 65 2d 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge-size remains 
b590: 31 30 32 34 20 62 79 74 65 73 2e 0a 20 20 23 0a  1024 bytes..  #.
b5a0: 20 20 73 65 74 20 65 66 66 20 24 70 61 67 65 73    set eff $pages
b5b0: 69 7a 65 0a 20 20 69 66 20 7b 24 65 66 66 20 3e  ize.  if {$eff >
b5c0: 20 24 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50   $::SQLITE_MAX_P
b5d0: 41 47 45 5f 53 49 5a 45 7d 20 7b 20 73 65 74 20  AGE_SIZE} { set 
b5e0: 65 66 66 20 31 30 32 34 20 7d 0a 0a 20 20 64 6f  eff 1024 }..  do
b5f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e  _test pager1-12.
b600: 24 70 61 67 65 73 69 7a 65 2e 31 20 7b 0a 20 20  $pagesize.1 {.  
b610: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
b620: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
b630: 6c 20 22 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l ".      PRAGMA
b640: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 24 70 61   page_size = $pa
b650: 67 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 43 52  gesize;.      CR
b660: 45 41 54 45 20 56 49 45 57 20 76 20 41 53 20 53  EATE VIEW v AS S
b670: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
b680: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20  ite_master;.    
b690: 22 20 64 62 32 0a 20 20 20 20 66 69 6c 65 5f 70  " db2.    file_p
b6a0: 61 67 65 5f 73 69 7a 65 20 74 65 73 74 2e 64 62  age_size test.db
b6b0: 0a 20 20 7d 20 24 65 66 66 0a 20 20 64 6f 5f 74  .  } $eff.  do_t
b6c0: 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70  est pager1-12.$p
b6d0: 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20  agesize.2 {.    
b6e0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
b6f0: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
b700: 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  { .      SELECT 
b710: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b  count(*) FROM v;
b720: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
b730: 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20  in.page_size;.  
b740: 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69 73    } db2.  } [lis
b750: 74 20 31 20 24 65 66 66 5d 0a 20 20 64 6f 5f 74  t 1 $eff].  do_t
b760: 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70  est pager1-12.$p
b770: 61 67 65 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20  agesize.3 {.    
b780: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
b790: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
b7a0: 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50   FROM v;.      P
b7b0: 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f  RAGMA main.page_
b7c0: 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  size;.    }.  } 
b7d0: 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20  [list 1 $eff].  
b7e0: 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 64 62 20 63  db2 close.}.db c
b7f0: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
b800: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
b810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
b850: 74 20 73 70 65 63 61 6c 20 22 50 52 41 47 4d 41  t specal "PRAGMA
b860: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
b870: 52 53 49 53 54 22 20 74 65 73 74 20 63 61 73 65  RSIST" test case
b880: 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33  s..#.# pager1-13
b890: 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73 74 73  .1.*: This tests
b8a0: 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20   a special case 
b8b0: 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 70  encountered in p
b8c0: 65 72 73 69 73 74 65 6e 74 20 0a 23 20 20 20 20  ersistent .#    
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
b8e0: 6e 61 6c 20 6d 6f 64 65 3a 20 49 66 20 74 68 65  nal mode: If the
b8f0: 20 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61   journal associa
b900: 74 65 64 20 77 69 74 68 20 61 20 74 72 61 6e 73  ted with a trans
b910: 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 20  action.#        
b920: 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
b930: 65 72 20 74 68 61 6e 20 74 68 65 20 6a 6f 75 72  er than the jour
b940: 6e 61 6c 20 66 69 6c 65 20 28 62 65 63 61 75 73  nal file (becaus
b950: 65 20 61 20 70 72 65 76 69 6f 75 73 20 0a 23 20  e a previous .# 
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
b970: 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65 66 74 20  ransaction left 
b980: 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e 6f 6e  a very large non
b990: 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  -hot journal fil
b9a0: 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20  e in the.#      
b9b0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 2d 73            file-s
b9c0: 79 73 74 65 6d 29 2c 20 74 68 65 6e 20 53 51 4c  ystem), then SQL
b9d0: 69 74 65 20 68 61 73 20 74 6f 20 62 65 20 63 61  ite has to be ca
b9e0: 72 65 66 75 6c 20 74 68 61 74 20 74 68 65 72 65  reful that there
b9f0: 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20   is.#           
ba00: 20 20 20 20 20 6e 6f 74 20 61 20 6a 6f 75 72 6e       not a journ
ba10: 61 6c 2d 68 65 61 64 65 72 20 6c 65 66 74 20 6f  al-header left o
ba20: 76 65 72 20 66 72 6f 6d 20 61 20 70 72 65 76 69  ver from a previ
ba30: 6f 75 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ous transaction.
ba40: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
ba50: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
ba60: 6c 6f 77 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lowing the journ
ba70: 61 6c 20 63 6f 6e 74 65 6e 74 20 6a 75 73 74 20  al content just 
ba80: 77 72 69 74 74 65 6e 2e 0a 23 20 20 20 20 20 20  written..#      
ba90: 20 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65            If the
baa0: 72 65 20 69 73 2c 20 61 6e 64 20 74 68 65 20 70  re is, and the p
bab0: 72 6f 63 65 73 73 20 63 72 61 73 68 65 73 20 73  rocess crashes s
bac0: 6f 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  o that the journ
bad0: 61 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  al.#            
bae0: 20 20 20 20 62 65 63 6f 6d 65 73 20 61 20 68 6f      becomes a ho
baf0: 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 75  t-journal and mu
bb00: 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
bb10: 6b 20 62 79 20 61 6e 6f 74 68 65 72 0a 23 20 20  k by another.#  
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
bb30: 6f 63 65 73 73 2c 20 74 68 65 72 65 20 69 73 20  ocess, there is 
bb40: 61 20 64 61 6e 67 65 72 20 74 68 61 74 20 74 68  a danger that th
bb50: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
bb60: 6d 61 79 20 72 6f 6c 6c 0a 23 20 20 20 20 20 20  may roll.#      
bb70: 20 20 20 20 20 20 20 20 20 20 62 61 63 6b 20 74            back t
bb80: 68 65 20 61 62 6f 72 74 65 64 20 74 72 61 6e 73  he aborted trans
bb90: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 6e  action, then con
bba0: 74 69 6e 75 65 20 63 6f 70 79 69 6e 67 20 64 61  tinue copying da
bbb0: 74 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ta.#            
bbc0: 20 20 20 20 66 72 6f 6d 20 61 6e 20 6f 6c 64 65      from an olde
bbd0: 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 72  r transaction fr
bbe0: 6f 6d 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  om the remainder
bbf0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
bc00: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
bc10: 20 20 53 65 65 20 74 68 65 20 73 79 6e 63 4a 6f    See the syncJo
bc20: 75 72 6e 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e  urnal() function
bc30: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 23 0a   for details..#.
bc40: 23 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 2a 3a  # pager1-13.2.*:
bc50: 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 74 68   Same test as th
bc60: 65 20 70 72 65 76 69 6f 75 73 2e 20 54 68 69 73  e previous. This
bc70: 20 74 69 6d 65 2c 20 74 68 72 6f 77 20 61 6e 20   time, throw an 
bc80: 69 6e 64 65 78 20 69 6e 74 6f 0a 23 20 20 20 20  index into.#    
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
bca0: 6d 69 78 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  mix to make the 
bcb0: 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
bcc0: 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63  more likely to c
bcd0: 61 74 63 68 0a 23 20 20 20 20 20 20 20 20 20 20  atch.#          
bce0: 20 20 20 20 20 20 65 72 72 6f 72 73 2e 0a 23 0a        errors..#.
bcf0: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
bd00: 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 20  ult 1.tv script 
bd10: 78 53 79 6e 63 43 62 0a 74 76 20 66 69 6c 74 65  xSyncCb.tv filte
bd20: 72 20 78 53 79 6e 63 0a 70 72 6f 63 20 78 53 79  r xSync.proc xSy
bd30: 6e 63 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c  ncCb {method fil
bd40: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
bd50: 73 65 74 20 74 20 5b 66 69 6c 65 20 74 61 69 6c  set t [file tail
bd60: 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 69 66   $filename].  if
bd70: 20 7b 24 74 20 3d 3d 20 22 74 65 73 74 2e 64 62   {$t == "test.db
bd80: 22 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  "} faultsim_save
bd90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bda0: 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64  _OK.}.faultsim_d
bdb0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
bdc0: 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e  .db func a_strin
bdd0: 67 20 61 5f 73 74 72 69 6e 67 0a 0a 23 20 54 68  g a_string..# Th
bde0: 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  e UPDATE stateme
bdf0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
be00: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 20   this test case 
be10: 63 72 65 61 74 65 73 20 61 20 72 65 61 6c 6c 79  creates a really
be20: 20 62 69 67 0a 23 20 6a 6f 75 72 6e 61 6c 2e 20   big.# journal. 
be30: 53 69 6e 63 65 20 74 68 65 20 63 61 63 68 65 2d  Since the cache-
be40: 73 69 7a 65 20 69 73 20 6f 6e 6c 79 20 31 30 20  size is only 10 
be50: 70 61 67 65 73 2c 20 74 68 65 20 6a 6f 75 72 6e  pages, the journ
be60: 61 6c 20 63 6f 6e 74 61 69 6e 73 20 0a 23 20 66  al contains .# f
be70: 72 65 71 75 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  requent journal 
be80: 68 65 61 64 65 72 73 2e 0a 23 0a 64 6f 5f 65 78  headers..#.do_ex
be90: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
bea0: 31 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 50 52 41  1-13.1.1 {.  PRA
beb0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
bec0: 31 30 32 34 3b 0a 20 20 50 52 41 47 4d 41 20 6a  1024;.  PRAGMA j
bed0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
bee0: 52 53 49 53 54 3b 0a 20 20 50 52 41 47 4d 41 20  RSIST;.  PRAGMA 
bef0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
bf00: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52  .  BEGIN;.    CR
bf10: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
bf20: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
bf30: 4b 45 59 2c 20 62 20 42 4c 4f 42 29 3b 0a 20 20  KEY, b BLOB);.  
bf40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
bf50: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
bf60: 73 74 72 69 6e 67 28 34 30 30 29 29 3b 0a 20 20  string(400));.  
bf70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
bf80: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
bf90: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
bfa0: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
bfb0: 20 20 20 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45     2 */.    INSE
bfc0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
bfd0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
bfe0: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
bff0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a          /*   4 *
c000: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
c010: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
c020: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
c030: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
c040: 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20    /*   8 */.    
c050: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
c060: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
c070: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
c080: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
c090: 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  16 */.    INSERT
c0a0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
c0b0: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
c0c0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
c0d0: 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a        /*  32 */.
c0e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
c0f0: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
c100: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
c110: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
c120: 2f 2a 20 20 36 34 20 2a 2f 0a 20 20 20 20 49 4e  /*  64 */.    IN
c130: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
c140: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
c150: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
c160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 32 38            /* 128
c170: 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20   */.  COMMIT;.  
c180: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
c190: 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 3b  = a_string(400);
c1a0: 0a 7d 20 7b 70 65 72 73 69 73 74 7d 0a 0a 69 66  .} {persist}..if
c1b0: 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
c1c0: 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69  m(platform)!="wi
c1d0: 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 52 75 6e 20  ndows"} {.# Run 
c1e0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66 20  transactions of 
c1f0: 69 6e 63 72 65 61 73 69 6e 67 20 73 69 7a 65 73  increasing sizes
c200: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
c210: 65 20 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20  e (or more than 
c220: 6f 6e 65 29 0a 23 20 6f 66 20 74 68 65 73 65 20  one).# of these 
c230: 77 69 6c 6c 20 77 72 69 74 65 20 6a 75 73 74 20  will write just 
c240: 65 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20 74  enough content t
c250: 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f  hat one of the o
c260: 6c 64 20 68 65 61 64 65 72 73 20 63 72 65 61 74  ld headers creat
c270: 65 64 20 0a 23 20 62 79 20 74 68 65 20 74 72 61  ed .# by the tra
c280: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
c290: 62 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65 73  block above lies
c2a0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
c2b0: 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 23  er the content.#
c2c0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20 74   journalled by t
c2d0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
c2e0: 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b 73  action..#.for {s
c2f0: 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c  et nUp 1} {$nUp<
c300: 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b  64} {incr nUp} {
c310: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
c320: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32  st pager1-13.1.2
c330: 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55  .$nUp.1 { .    U
c340: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d  PDATE t1 SET b =
c350: 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57   a_string(399) W
c360: 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20  HERE a <= $nUp. 
c370: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73   } {}.  do_execs
c380: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c390: 33 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50  3.1.2.$nUp.2 { P
c3a0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
c3b0: 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a 20  check } {ok} .. 
c3c0: 20 23 20 54 72 79 20 74 6f 20 61 63 63 65 73 73   # Try to access
c3d0: 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66   the snapshot of
c3e0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
c3f0: 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33 20  ..  #.  sqlite3 
c400: 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20  db2 sv_test.db. 
c410: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
c420: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a  13.1.2.$nUp.3 {.
c430: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
c440: 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28  LECT sum(length(
c450: 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  b)) FROM t1 } db
c460: 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38  2.  } [expr {128
c470: 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d  *400 - ($nUp-1)}
c480: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
c490: 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 34  r1-13.1.2.$nUp.4
c4a0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
c4b0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
c4c0: 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20  y_check } db2.  
c4d0: 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f  } {ok}.  db2 clo
c4e0: 73 65 0a 7d 0a 7d 0a 0a 69 66 20 7b 24 3a 3a 74  se.}.}..if {$::t
c4f0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74  cl_platform(plat
c500: 66 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22  form)!="windows"
c510: 7d 20 7b 0a 23 20 53 61 6d 65 20 74 65 73 74 20  } {.# Same test 
c520: 61 73 20 61 62 6f 76 65 2e 20 42 75 74 20 74 68  as above. But th
c530: 69 73 20 74 69 6d 65 20 77 69 74 68 20 61 6e 20  is time with an 
c540: 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62  index on the tab
c550: 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  le..#.do_execsql
c560: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
c570: 32 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 49  2.1 {.  CREATE I
c580: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29  NDEX i1 ON t1(b)
c590: 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45  ;.  UPDATE t1 SE
c5a0: 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34  T b = a_string(4
c5b0: 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b 73  00);.} {}.for {s
c5c0: 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c  et nUp 1} {$nUp<
c5d0: 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b  64} {incr nUp} {
c5e0: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
c5f0: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32  st pager1-13.2.2
c600: 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55  .$nUp.1 { .    U
c610: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d  PDATE t1 SET b =
c620: 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57   a_string(399) W
c630: 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20  HERE a <= $nUp. 
c640: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73   } {}.  do_execs
c650: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c660: 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50  3.2.2.$nUp.2 { P
c670: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
c680: 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20 20  check } {ok} .  
c690: 73 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74  sqlite3 db2 sv_t
c6a0: 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74  est.db.  do_test
c6b0: 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24   pager1-13.2.2.$
c6c0: 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  nUp.3 {.    exec
c6d0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d  sql { SELECT sum
c6e0: 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d  (length(b)) FROM
c6f0: 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65   t1 } db2.  } [e
c700: 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28  xpr {128*400 - (
c710: 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74  $nUp-1)}].  do_t
c720: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
c730: 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65  2.$nUp.4 {.    e
c740: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
c750: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
c760: 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20  } db2.  } {ok}. 
c770: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a   db2 close.}.}..
c780: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
c790: 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  te..#-----------
c7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
c7e0: 20 54 65 73 74 20 73 70 65 63 61 6c 20 22 50 52   Test specal "PR
c7f0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
c800: 65 3d 4f 46 46 22 20 74 65 73 74 20 63 61 73 65  e=OFF" test case
c810: 73 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65  s..#.faultsim_de
c820: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
c830: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
c840: 70 61 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b 0a  pager1-14.1.1 {.
c850: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
c860: 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20 43  _mode = OFF;.  C
c870: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
c880: 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  , b);.  BEGIN;. 
c890: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
c8a0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
c8b0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45    COMMIT;.  SELE
c8c0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  CT * FROM t1;.} 
c8d0: 7b 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61 74  {off 1 2}.do_cat
c8e0: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
c8f0: 31 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45 47  1-14.1.2 {.  BEG
c900: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
c910: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
c920: 20 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b 3b   4);.  ROLLBACK;
c930: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78 65  .} {0 {}}.do_exe
c940: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c950: 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45  -14.1.3 {.  SELE
c960: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  CT * FROM t1;.} 
c970: 7b 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73 71  {1 2}.do_catchsq
c980: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34  l_test pager1-14
c990: 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b 0a  .1.4 {.  BEGIN;.
c9a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
c9b0: 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20  t1(rowid, a, b) 
c9c0: 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62  SELECT a+3, b, b
c9d0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
c9e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77  SERT INTO t1(row
c9f0: 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54  id, a, b) SELECT
ca00: 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20   a+3, b, b FROM 
ca10: 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d 41 52  t1;.} {1 {PRIMAR
ca20: 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20 75 6e  Y KEY must be un
ca30: 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  ique}}.do_execsq
ca40: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34  l_test pager1-14
ca50: 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49 54 3b  .1.5 {.  COMMIT;
ca60: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
ca70: 20 74 31 3b 0a 7d 20 7b 31 20 32 20 32 20 32 7d   t1;.} {1 2 2 2}
ca80: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
ca90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
cad0: 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e 64 20  est opening and 
cae0: 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65  closing the page
caf0: 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77 69 74  r sub-system wit
cb00: 68 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c 75  h different valu
cb10: 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73 71 6c  es.# for the sql
cb20: 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69 6c  ite3_vfs.szOsFil
cb30: 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a 66 61  e variable..#.fa
cb40: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
cb50: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63  d_reopen.do_exec
cb60: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
cb70: 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  15.0 {.  CREATE 
cb80: 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29 3b 0a  TABLE tx(y, z);.
cb90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78    INSERT INTO tx
cba0: 20 56 41 4c 55 45 53 28 27 41 79 75 74 74 68 61   VALUES('Ayuttha
cbb0: 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27 29 3b  ya', 'Beijing');
cbc0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
cbd0: 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64 6f 6e  x VALUES('London
cbe0: 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d 20 7b  ', 'Tokyo');.} {
cbf0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 20 7b  }.db close.for {
cc00: 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35 31 33  set i 0} {$i<513
cc10: 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b 0a 20  } {incr i 3} {. 
cc20: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
cc30: 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69 6c 65  ault 1 -szosfile
cc40: 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20 64 62   $i.  sqlite3 db
cc50: 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 65 78   test.db.  do_ex
cc60: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
cc70: 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20 20 20  1-15.$i.1 {.    
cc80: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 78  SELECT * FROM tx
cc90: 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61 79 61  ;.  } {Ayutthaya
cca0: 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f 6e 20   Beijing London 
ccb0: 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c 6f 73  Tokyo}.  db clos
ccc0: 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a  e.  tv delete.}.
ccd0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68  -----------.# Ch
cd20: 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 6e  eck that it is n
cd30: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  ot possible to o
cd40: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
cd50: 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c 6c 20  ile if the full 
cd60: 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20 61 73  path.# to the as
cd70: 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e 61 6c  sociated journal
cd80: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6c 6f   file will be lo
cd90: 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65  nger than sqlite
cda0: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
cdb0: 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d  ..#.testvfs tv -
cdc0: 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72  default 1.tv scr
cdd0: 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76 20 66  ipt xOpenCb.tv f
cde0: 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72 6f 63  ilter xOpen.proc
cdf0: 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68 6f 64   xOpenCb {method
ce00: 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20   filename args} 
ce10: 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c 65 5f 6c  {.  set ::file_l
ce20: 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  en [string lengt
ce30: 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 7d 0a 73  h $filename].}.s
ce40: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
ce50: 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  b.db close.tv de
ce60: 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65 74 20 69  lete..for {set i
ce70: 69 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f  i [expr $::file_
ce80: 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20 3c 20 5b  len-5]} {$ii < [
ce90: 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e  expr $::file_len
cea0: 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69 69 7d 20  +20]} {incr ii} 
ceb0: 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d  {.  testvfs tv -
cec0: 64 65 66 61 75 6c 74 20 31 20 2d 6d 78 70 61 74  default 1 -mxpat
ced0: 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20 23 20 54  hname $ii..  # T
cee0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
cef0: 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 66 69   full path to fi
cf00: 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a 6f 75 72  le "test.db-jour
cf10: 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66 69 6c 65  nal" is ($::file
cf20: 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20 49 66 20  _len+8)..  # If 
cf30: 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 73  the configured s
cf40: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
cf50: 68 6e 61 6d 65 20 76 61 6c 75 65 20 67 72 65 61  hname value grea
cf60: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
cf70: 6c 20 74 6f 0a 20 20 23 20 74 68 69 73 2c 20 74  l to.  # this, t
cf80: 68 65 6e 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hen the file can
cf90: 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65   be opened. Othe
cfa0: 72 77 69 73 65 2c 20 69 74 20 63 61 6e 6e 6f 74  rwise, it cannot
cfb0: 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 69 69 20  ..  #.  if {$ii 
cfc0: 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65  >= [expr $::file
cfd0: 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20 20 20 73  _len+8]} {.    s
cfe0: 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d 0a 20 20  et res {0 {}}.  
cff0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74  } else {.    set
d000: 20 72 65 73 20 7b 31 20 7b 75 6e 61 62 6c 65 20   res {1 {unable 
d010: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
d020: 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a 20 20 64   file}}.  }..  d
d030: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 36  o_test pager1-16
d040: 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20 6c 69 73  .1.$ii {.    lis
d050: 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69 74  t [catch { sqlit
d060: 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d 20  e3 db test.db } 
d070: 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 24 72  msg] $msg.  } $r
d080: 65 73 0a 0a 20 20 63 61 74 63 68 20 7b 64 62 20  es..  catch {db 
d090: 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64 65 6c 65  close}.  tv dele
d0a0: 74 65 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  te.}...#--------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0f0: 2d 0a 23 20 54 65 73 74 20 74 68 65 20 70 61 67  -.# Test the pag
d100: 65 72 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 20  ers response to 
d110: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
d120: 20 72 65 71 75 65 73 74 69 6e 67 20 69 6c 6c 65   requesting ille
d130: 67 61 6c 20 70 61 67 65 20 0a 23 20 6e 75 6d 62  gal page .# numb
d140: 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54 68 65  ers:.#.#   + The
d150: 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c 0a 23   locking page,.#
d160: 20 20 20 2b 20 50 61 67 65 20 30 2c 0a 23 20 20     + Page 0,.#  
d170: 20 2b 20 41 20 70 61 67 65 20 77 69 74 68 20 61   + A page with a
d180: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
d190: 61 74 65 72 20 74 68 61 6e 20 28 32 5e 33 31 2d  ater than (2^31-
d1a0: 31 29 2e 0a 23 0a 23 20 54 68 65 73 65 20 74 65  1)..#.# These te
d1b0: 73 74 73 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  sts will not wor
d1c0: 6b 20 69 66 20 53 51 4c 49 54 45 5f 44 49 52 45  k if SQLITE_DIRE
d1d0: 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
d1e0: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49 6e 0a   is defined. In.
d1f0: 23 20 74 68 61 74 20 63 61 73 65 20 49 4f 20 65  # that case IO e
d200: 72 72 6f 72 73 20 61 72 65 20 73 6f 6d 65 74 69  rrors are someti
d210: 6d 65 73 20 72 65 70 6f 72 74 65 64 20 69 6e 73  mes reported ins
d220: 74 65 61 64 20 6f 66 20 53 51 4c 49 54 45 5f 43  tead of SQLITE_C
d230: 4f 52 52 55 50 54 2e 0a 23 0a 69 66 63 61 70 61  ORRUPT..#.ifcapa
d240: 62 6c 65 20 21 64 69 72 65 63 74 5f 72 65 61 64  ble !direct_read
d250: 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72   {.do_test pager
d260: 31 2d 31 38 2e 31 20 7b 0a 20 20 66 61 75 6c 74  1-18.1 {.  fault
d270: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
d280: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
d290: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
d2a0: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  g.  execsql { . 
d2b0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
d2c0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
d2d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
d2e0: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
d2f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
d300: 28 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20  (a_string(500), 
d310: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 29 3b 0a  a_string(200));.
d320: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d330: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d340: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d350: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d360: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d370: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d380: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d390: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d3a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d3b0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d3c0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d3d0: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d3e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d3f0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d400: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d410: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d420: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d430: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d440: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d450: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d460: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d470: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d480: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d490: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d4a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d4b0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d4c0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d4d0: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d4e0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
d4f0: 20 70 61 67 65 72 31 2d 31 38 2e 32 20 7b 0a 20   pager1-18.2 {. 
d500: 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e   set root [db on
d510: 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61  e "SELECT rootpa
d520: 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ge FROM sqlite_m
d530: 61 73 74 65 72 22 5d 0a 20 20 73 65 74 20 6c 6f  aster"].  set lo
d540: 63 6b 69 6e 67 70 61 67 65 20 5b 65 78 70 72 20  ckingpage [expr 
d550: 28 30 78 31 30 30 30 30 2f 31 30 32 34 29 20 2b  (0x10000/1024) +
d560: 20 31 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   1].  execsql {.
d570: 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61      PRAGMA writa
d580: 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a  ble_schema = 1;.
d590: 20 20 20 20 55 50 44 41 54 45 20 73 71 6c 69 74      UPDATE sqlit
d5a0: 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f  e_master SET roo
d5b0: 74 70 61 67 65 20 3d 20 24 6c 6f 63 6b 69 6e 67  tpage = $locking
d5c0: 70 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  page;.  }.  sqli
d5d0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
d5e0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
d5f0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
d600: 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20  M t1 } db2.} {1 
d610: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
d620: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
d630: 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f  d}}.db2 close.do
d640: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e  _test pager1-18.
d650: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
d660: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
d670: 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 49 4e  LE t2(x);.    IN
d680: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
d690: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30  UES(a_string(500
d6a0: 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 70  0));.  }.  set p
d6b0: 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66 69 6c 65  gno [expr ([file
d6c0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 2f   size test.db] /
d6d0: 20 31 30 32 34 29 2d 32 5d 0a 20 20 68 65 78 69   1024)-2].  hexi
d6e0: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
d6f0: 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a  [expr ($pgno-1)*
d700: 31 30 32 34 5d 20 30 30 30 30 30 30 30 30 0a 20  1024] 00000000. 
d710: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
d720: 74 2e 64 62 0a 20 20 23 20 65 76 65 6e 20 74 68  t.db.  # even th
d730: 6f 75 67 68 20 78 20 69 73 20 6d 61 6c 66 6f 72  ough x is malfor
d740: 6d 65 64 2c 20 62 65 63 61 75 73 65 20 74 79 70  med, because typ
d750: 65 6f 66 28 29 20 64 6f 65 73 0a 20 20 23 20 6e  eof() does.  # n
d760: 6f 74 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74  ot load the cont
d770: 65 6e 74 20 6f 66 20 78 2c 20 74 68 65 20 65 72  ent of x, the er
d780: 72 6f 72 20 69 73 20 6e 6f 74 20 6e 6f 74 69 63  ror is not notic
d790: 65 64 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  ed..  catchsql {
d7a0: 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 78   SELECT typeof(x
d7b0: 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a  ) FROM t2 } db2.
d7c0: 7d 20 7b 30 20 74 65 78 74 7d 0a 64 6f 5f 74 65  } {0 text}.do_te
d7d0: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 33 2e 32  st pager1-18.3.2
d7e0: 20 7b 0a 20 20 23 20 69 6e 20 74 68 69 73 20 63   {.  # in this c
d7f0: 61 73 65 2c 20 74 68 65 20 76 61 6c 75 65 20 6f  ase, the value o
d800: 66 20 78 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  f x is loaded an
d810: 64 20 73 6f 20 74 68 65 20 65 72 72 6f 72 20 69  d so the error i
d820: 73 0a 20 20 23 20 64 65 74 65 63 74 65 64 0a 20  s.  # detected. 
d830: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
d840: 43 54 20 6c 65 6e 67 74 68 28 78 7c 7c 27 27 29  CT length(x||'')
d850: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
d860: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
d870: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
d880: 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73  ormed}}.db2 clos
d890: 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  e.do_test pager1
d8a0: 2d 31 38 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63  -18.3.3 {.  exec
d8b0: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
d8c0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e   FROM t2;.    IN
d8d0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
d8e0: 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 35  UES(randomblob(5
d8f0: 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74  000));.  }.  set
d900: 20 70 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66 69   pgno [expr ([fi
d910: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
d920: 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20 20 68 65   / 1024)-2].  he
d930: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
d940: 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31  b [expr ($pgno-1
d950: 29 2a 31 30 32 34 5d 20 30 30 30 30 30 30 30 30  )*1024] 00000000
d960: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
d970: 65 73 74 2e 64 62 0a 20 20 23 20 65 76 65 6e 20  est.db.  # even 
d980: 74 68 6f 75 67 68 20 78 20 69 73 20 6d 61 6c 66  though x is malf
d990: 6f 72 6d 65 64 2c 20 62 65 63 61 75 73 65 20 6c  ormed, because l
d9a0: 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65  ength() and type
d9b0: 6f 66 28 29 20 64 6f 0a 20 20 23 20 6e 6f 74 20  of() do.  # not 
d9c0: 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  load the content
d9d0: 20 6f 66 20 78 2c 20 74 68 65 20 65 72 72 6f 72   of x, the error
d9e0: 20 69 73 20 6e 6f 74 20 6e 6f 74 69 63 65 64 2e   is not noticed.
d9f0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
da00: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 2c 20  LECT length(x), 
da10: 74 79 70 65 6f 66 28 78 29 20 46 52 4f 4d 20 74  typeof(x) FROM t
da20: 32 20 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 35 30  2 } db2.} {0 {50
da30: 30 30 20 62 6c 6f 62 7d 7d 0a 64 6f 5f 74 65 73  00 blob}}.do_tes
da40: 74 20 70 61 67 65 72 31 2d 31 38 2e 33 2e 34 20  t pager1-18.3.4 
da50: 7b 0a 20 20 23 20 69 6e 20 74 68 69 73 20 63 61  {.  # in this ca
da60: 73 65 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66  se, the value of
da70: 20 78 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64   x is loaded and
da80: 20 73 6f 20 74 68 65 20 65 72 72 6f 72 20 69 73   so the error is
da90: 0a 20 20 23 20 64 65 74 65 63 74 65 64 0a 20 20  .  # detected.  
daa0: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
dab0: 54 20 6c 65 6e 67 74 68 28 78 7c 7c 27 27 29 20  T length(x||'') 
dac0: 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20  FROM t2 } db2.} 
dad0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
dae0: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
daf0: 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65  rmed}}.db2 close
db00: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
db10: 31 38 2e 34 20 7b 0a 20 20 68 65 78 69 6f 5f 77  18.4 {.  hexio_w
db20: 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78  rite test.db [ex
db30: 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32  pr ($pgno-1)*102
db40: 34 5d 20 39 30 30 30 30 30 30 30 0a 20 20 73 71  4] 90000000.  sq
db50: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
db60: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  b.  catchsql { S
db70: 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 7c 7c  ELECT length(x||
db80: 27 27 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  '') FROM t2 } db
db90: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
dba0: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
dbb0: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63  alformed}}.db2 c
dbc0: 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67  lose.do_test pag
dbd0: 65 72 31 2d 31 38 2e 35 20 7b 0a 20 20 73 71 6c  er1-18.5 {.  sql
dbe0: 69 74 65 33 20 64 62 20 22 22 0a 20 20 65 78 65  ite3 db "".  exe
dbf0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
dc00: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
dc10: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
dc20: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  LE t2(a, b);.   
dc30: 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
dc40: 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  _schema = 1;.   
dc50: 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 6d   UPDATE sqlite_m
dc60: 61 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70 61  aster SET rootpa
dc70: 67 65 3d 35 20 57 48 45 52 45 20 74 62 6c 5f 6e  ge=5 WHERE tbl_n
dc80: 61 6d 65 20 3d 20 27 74 31 27 3b 0a 20 20 20 20  ame = 't1';.    
dc90: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
dca0: 73 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  schema = 0;.    
dcb0: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 31 20 52  ALTER TABLE t1 R
dcc0: 45 4e 41 4d 45 20 54 4f 20 78 31 3b 0a 20 20 7d  ENAME TO x1;.  }
dcd0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
dce0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d  LECT * FROM x1 }
dcf0: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
dd00: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
dd10: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 20 63 6c 6f  lformed}}.db clo
dd20: 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  se..do_test page
dd30: 72 31 2d 31 38 2e 36 20 7b 0a 20 20 66 61 75 6c  r1-18.6 {.  faul
dd40: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
dd50: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
dd60: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
dd70: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
dd80: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
dd90: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
dda0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
ddb0: 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
ddc0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
ddd0: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
dde0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ddf0: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
de00: 28 38 30 30 29 29 3b 0a 20 20 7d 0a 0a 20 20 73  (800));.  }..  s
de10: 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20  et root [db one 
de20: 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65  "SELECT rootpage
de30: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
de40: 74 65 72 22 5d 0a 20 20 64 62 20 63 6c 6f 73 65  ter"].  db close
de50: 0a 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ..  hexio_write 
de60: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
de70: 72 6f 6f 74 2d 31 29 2a 31 30 32 34 20 2b 20 38  root-1)*1024 + 8
de80: 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 00000000.  sql
de90: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
dea0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
deb0: 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46 52  ECT length(x) FR
dec0: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 64 61  OM t1 }.} {1 {da
ded0: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
dee0: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
def0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  .}..do_test page
df00: 72 31 2d 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69  r1-19.1 {.  sqli
df10: 74 65 33 20 64 62 20 22 22 0a 20 20 64 62 20 66  te3 db "".  db f
df20: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
df30: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
df40: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
df50: 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  e_size = 512;.  
df60: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
df70: 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52  cuum = 1;.    CR
df80: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 61  EATE TABLE t1(aa
df90: 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61 65  , ab, ac, ad, ae
dfa0: 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61 69  , af, ag, ah, ai
dfb0: 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d  , aj, ak, al, am
dfc0: 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , an,.          
dfd0: 20 20 20 20 20 20 20 20 20 20 62 61 2c 20 62 62            ba, bb
dfe0: 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62 66  , bc, bd, be, bf
dff0: 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a  , bg, bh, bi, bj
e000: 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e  , bk, bl, bm, bn
e010: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e020: 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63 63        ca, cb, cc
e030: 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63 67  , cd, ce, cf, cg
e040: 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b  , ch, ci, cj, ck
e050: 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20  , cl, cm, cn,.  
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64 64    da, db, dc, dd
e080: 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64 68  , de, df, dg, dh
e090: 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c  , di, dj, dk, dl
e0a0: 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20  , dm, dn,.      
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 61                ea
e0c0: 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65 65  , eb, ec, ed, ee
e0d0: 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65 69  , ef, eg, eh, ei
e0e0: 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d  , ej, ek, el, em
e0f0: 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , en,.          
e100: 20 20 20 20 20 20 20 20 20 20 66 61 2c 20 66 62            fa, fb
e110: 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66 66  , fc, fd, fe, ff
e120: 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a  , fg, fh, fi, fj
e130: 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e  , fk, fl, fm, fn
e140: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e150: 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67 63        ga, gb, gc
e160: 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67 67  , gd, ge, gf, gg
e170: 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b  , gh, gi, gj, gk
e180: 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20  , gl, gm, gn,.  
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68 64    ha, hb, hc, hd
e1b0: 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68 68  , he, hf, hg, hh
e1c0: 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c  , hi, hj, hk, hl
e1d0: 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20  , hm, hn,.      
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 61                ia
e1f0: 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69 65  , ib, ic, id, ie
e200: 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69 69  , if, ig, ih, ii
e210: 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d  , ij, ik, il, im
e220: 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20 20  , ix,.          
e230: 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a 62            ja, jb
e240: 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66  , jc, jd, je, jf
e250: 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a  , jg, jh, ji, jj
e260: 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e  , jk, jl, jm, jn
e270: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e280: 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63        ka, kb, kc
e290: 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67  , kd, ke, kf, kg
e2a0: 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b  , kh, ki, kj, kk
e2b0: 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20  , kl, km, kn,.  
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64    la, lb, lc, ld
e2e0: 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68  , le, lf, lg, lh
e2f0: 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c  , li, lj, lk, ll
e300: 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20  , lm, ln,.      
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
e320: 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65  , mb, mc, md, me
e330: 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69  , mf, mg, mh, mi
e340: 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d  , mj, mk, ml, mm
e350: 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20  , mn.    );.    
e360: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
e370: 61 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20  aa, ab, ac, ad, 
e380: 61 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20  ae, af, ag, ah, 
e390: 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20  ai, aj, ak, al, 
e3a0: 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20  am, an,.        
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 61 2c 20              ba, 
e3c0: 62 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20  bb, bc, bd, be, 
e3d0: 62 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20  bf, bg, bh, bi, 
e3e0: 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20  bj, bk, bl, bm, 
e3f0: 62 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  bn,.            
e400: 20 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20          ca, cb, 
e410: 63 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20  cc, cd, ce, cf, 
e420: 63 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20  cg, ch, ci, cj, 
e430: 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a  ck, cl, cm, cn,.
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20      da, db, dc, 
e460: 64 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20  dd, de, df, dg, 
e470: 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20  dh, di, dj, dk, 
e480: 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20  dl, dm, dn,.    
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 65 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20  ea, eb, ec, ed, 
e4b0: 65 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20  ee, ef, eg, eh, 
e4c0: 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20  ei, ej, ek, el, 
e4d0: 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20  em, en,.        
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 2c 20              fa, 
e4f0: 66 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20  fb, fc, fd, fe, 
e500: 66 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20  ff, fg, fh, fi, 
e510: 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20  fj, fk, fl, fm, 
e520: 66 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fn,.            
e530: 20 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20          ga, gb, 
e540: 67 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20  gc, gd, ge, gf, 
e550: 67 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20  gg, gh, gi, gj, 
e560: 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a  gk, gl, gm, gn,.
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20      ha, hb, hc, 
e590: 68 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20  hd, he, hf, hg, 
e5a0: 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20  hh, hi, hj, hk, 
e5b0: 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20  hl, hm, hn,.    
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 69 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20  ia, ib, ic, id, 
e5e0: 69 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20  ie, if, ig, ih, 
e5f0: 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20  ii, ij, ik, il, 
e600: 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20  im, ix,.        
e610: 20 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20              ja, 
e620: 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20  jb, jc, jd, je, 
e630: 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20  jf, jg, jh, ji, 
e640: 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20  jj, jk, jl, jm, 
e650: 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  jn,.            
e660: 20 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20          ka, kb, 
e670: 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20  kc, kd, ke, kf, 
e680: 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20  kg, kh, ki, kj, 
e690: 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a  kk, kl, km, kn,.
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20      la, lb, lc, 
e6c0: 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20  ld, le, lf, lg, 
e6d0: 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20  lh, li, lj, lk, 
e6e0: 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20  ll, lm, ln,.    
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20  ma, mb, mc, md, 
e710: 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20  me, mf, mg, mh, 
e720: 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20  mi, mj, mk, ml, 
e730: 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20  mm, mn.    );.  
e740: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
e750: 28 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f 73  (aa) VALUES( a_s
e760: 74 72 69 6e 67 28 31 30 30 30 30 30 29 20 29 3b  tring(100000) );
e770: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
e780: 20 74 32 28 61 61 29 20 56 41 4c 55 45 53 28 20   t2(aa) VALUES( 
e790: 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30 30 29  a_string(100000)
e7a0: 20 29 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a   );.    VACUUM;.
e7b0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d    }.} {}..#-----
e7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e800: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 61 20 63 6f  ----.# Test a co
e810: 75 70 6c 65 20 6f 66 20 73 70 65 63 69 61 6c 20  uple of special 
e820: 63 61 73 65 73 20 74 68 61 74 20 63 6f 6d 65 20  cases that come 
e830: 75 70 20 77 68 69 6c 65 20 63 6f 6d 6d 69 74 74  up while committ
e840: 69 6e 67 20 0a 23 20 74 72 61 6e 73 61 63 74 69  ing .# transacti
e850: 6f 6e 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72  ons:.#.#   pager
e860: 31 2d 32 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69 74  1-20.1.*: Commit
e870: 74 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ting an in-memor
e880: 79 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  y database trans
e890: 61 63 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  action when the 
e8a0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
e8b0: 20 20 20 20 64 61 74 61 62 61 73 65 20 68 61 73      database has
e8c0: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
e8d0: 65 64 20 61 74 20 61 6c 6c 2e 0a 23 0a 23 20 20  ed at all..#.#  
e8e0: 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 2a 3a 20   pager1-20.2.*: 
e8f0: 41 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77 69  As above, but wi
e900: 74 68 20 61 20 6e 6f 72 6d 61 6c 20 64 62 20 69  th a normal db i
e910: 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b  n exclusive-lock
e920: 69 6e 67 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20  ing mode..#.#   
e930: 70 61 67 65 72 31 2d 32 30 2e 33 2e 2a 3a 20 43  pager1-20.3.*: C
e940: 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
e950: 73 61 63 74 69 6f 6e 20 69 6e 20 57 41 4c 20 6d  saction in WAL m
e960: 6f 64 65 20 77 68 65 72 65 20 74 68 65 20 64 61  ode where the da
e970: 74 61 62 61 73 65 20 68 61 73 0a 23 20 20 20 20  tabase has.#    
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
e990: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 62 75 74  en modified, but
e9a0: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
e9b0: 20 68 61 76 65 20 62 65 65 6e 20 66 6c 75 73 68   have been flush
e9c0: 65 64 20 74 6f 20 0a 23 20 20 20 20 20 20 20 20  ed to .#        
e9d0: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 20 62            disk b
e9e0: 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 6d 69 74  efore the commit
e9f0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
ea00: 72 31 2d 32 30 2e 31 2e 31 20 7b 0a 20 20 63 61  r1-20.1.1 {.  ca
ea10: 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20  tch {db close}. 
ea20: 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d   sqlite3 db :mem
ea30: 6f 72 79 3a 0a 20 20 65 78 65 63 73 71 6c 20 7b  ory:.  execsql {
ea40: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
ea50: 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65  E one(two, three
ea60: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
ea70: 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61  TO one VALUES('a
ea80: 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b  ', 'b');.  }.} {
ea90: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
eaa0: 2d 32 30 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  -20.1.2 {.  exec
eab0: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20  sql {.    BEGIN 
eac0: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43  EXCLUSIVE;.    C
ead0: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
eae0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
eaf0: 32 30 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74  20.2.1 {.  fault
eb00: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
eb10: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
eb20: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  {.    PRAGMA loc
eb30: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c  king_mode = excl
eb40: 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41 47 4d  usive;.    PRAGM
eb50: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
eb60: 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 43 52   persist;.    CR
eb70: 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74  EATE TABLE one(t
eb80: 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20  wo, three);.    
eb90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20  INSERT INTO one 
eba0: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
ebb0: 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  ;.  }.} {exclusi
ebc0: 76 65 20 70 65 72 73 69 73 74 7d 0a 64 6f 5f 74  ve persist}.do_t
ebd0: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 32 2e  est pager1-20.2.
ebe0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
ebf0: 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53      BEGIN EXCLUS
ec00: 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  IVE;.    COMMIT;
ec10: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70  .  }.} {}..ifcap
ec20: 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f  able wal {.  do_
ec30: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33  test pager1-20.3
ec40: 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  .1 {.    faultsi
ec50: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
ec60: 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20  pen.    db func 
ec70: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
ec80: 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  g.    execsql {.
ec90: 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
eca0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
ecb0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
ecc0: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20  al_mode = wal;. 
ecd0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
ece0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
ecf0: 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 20 20   t1(x);.        
ed00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
ed10: 79 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  y);.        INSE
ed20: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
ed30: 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29  S(a_string(800))
ed40: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
ed50: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
ed60: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
ed70: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
ed80: 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 20  *   2 */.       
ed90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
eda0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
edb0: 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  800) FROM t1;   
edc0: 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a        /*   4 */.
edd0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
ede0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
edf0: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
ee00: 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   t1;         /* 
ee10: 20 20 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 49    8 */.        I
ee20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
ee30: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
ee40: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
ee50: 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20      /*  16 */.  
ee60: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
ee70: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
ee80: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
ee90: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 33  1;         /*  3
eea0: 32 20 2a 2f 0a 20 20 20 20 20 20 43 4f 4d 4d 49  2 */.      COMMI
eeb0: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61  T;.    }.  } {wa
eec0: 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  l}.  do_test pag
eed0: 65 72 31 2d 32 30 2e 33 2e 32 20 7b 0a 20 20 20  er1-20.3.2 {.   
eee0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
eef0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
ef00: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
ef10: 55 45 53 28 27 78 78 78 78 27 29 3b 0a 20 20 20  UES('xxxx');.   
ef20: 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65   }.    recursive
ef30: 5f 73 65 6c 65 63 74 20 33 32 20 74 31 0a 20 20  _select 32 t1.  
ef40: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
ef50: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 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 2d  ----------------
ef90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efa0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
efb0: 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  t a WAL database
efc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e   may not be open
efd0: 65 64 20 69 66 3a 0a 23 0a 23 20 20 20 70 61 67  ed if:.#.#   pag
efe0: 65 72 31 2d 32 31 2e 31 2e 2a 3a 20 54 68 65 20  er1-21.1.*: The 
eff0: 56 46 53 20 68 61 73 20 61 6e 20 69 56 65 72 73  VFS has an iVers
f000: 69 6f 6e 20 6c 65 73 73 20 74 68 61 6e 20 32 2c  ion less than 2,
f010: 20 6f 72 0a 23 20 20 20 70 61 67 65 72 31 2d 32   or.#   pager1-2
f020: 31 2e 32 2e 2a 3a 20 54 68 65 20 56 46 53 20 64  1.2.*: The VFS d
f030: 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20  oes not provide 
f040: 78 53 68 6d 58 58 58 28 29 20 6d 65 74 68 6f 64  xShmXXX() method
f050: 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77  s..#.ifcapable w
f060: 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  al {.  do_test p
f070: 61 67 65 72 31 2d 32 31 2e 30 20 7b 0a 20 20 20  ager1-21.0 {.   
f080: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
f090: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
f0a0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
f0b0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f0c0: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20  ode = WAL;.     
f0d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f   CREATE TABLE ko
f0e0: 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27  (c DEFAULT 'abc'
f0f0: 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66  , b DEFAULT 'def
f100: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
f110: 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54   INTO ko DEFAULT
f120: 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20   VALUES;.    }. 
f130: 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65   } {wal}.  do_te
f140: 73 74 20 70 61 67 65 72 31 2d 32 31 2e 31 20 7b  st pager1-21.1 {
f150: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
f160: 2d 6e 6f 73 68 6d 20 31 0a 20 20 20 20 73 71 6c  -noshm 1.    sql
f170: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
f180: 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61 74   -vfs tv.    cat
f190: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
f1a0: 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20   FROM ko } db2. 
f1b0: 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f   } {1 {unable to
f1c0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
f1d0: 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73  ile}}.  db2 clos
f1e0: 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 20 20  e.  tv delete.  
f1f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f200: 31 2e 32 20 7b 0a 20 20 20 20 74 65 73 74 76 66  1.2 {.    testvf
f210: 73 20 74 76 20 2d 69 76 65 72 73 69 6f 6e 20 31  s tv -iversion 1
f220: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
f230: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76   test.db -vfs tv
f240: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
f250: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f  SELECT * FROM ko
f260: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75   } db2.  } {1 {u
f270: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
f280: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20  tabase file}}.  
f290: 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20 64  db2 close.  tv d
f2a0: 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  elete.}..#------
f2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2f0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
f300: 61 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68  a "PRAGMA wal_ch
f310: 65 63 6b 70 6f 69 6e 74 22 3a 0a 23 0a 23 20 20  eckpoint":.#.#  
f320: 20 70 61 67 65 72 31 2d 32 32 2e 31 2e 2a 3a 20   pager1-22.1.*: 
f330: 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61 20  is a no-op on a 
f340: 6e 6f 6e 2d 57 41 4c 20 64 62 2c 20 61 6e 64 0a  non-WAL db, and.
f350: 23 20 20 20 70 61 67 65 72 31 2d 32 32 2e 32 2e  #   pager1-22.2.
f360: 2a 3a 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  *: does not caus
f370: 65 20 78 53 79 6e 63 20 63 61 6c 6c 73 20 77 69  e xSync calls wi
f380: 74 68 20 61 20 73 79 6e 63 68 72 6f 6e 6f 75 73  th a synchronous
f390: 3d 6f 66 66 20 64 62 2e 0a 23 0a 69 66 63 61 70  =off db..#.ifcap
f3a0: 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f  able wal {.  do_
f3b0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e 31  test pager1-22.1
f3c0: 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  .1 {.    faultsi
f3d0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
f3e0: 70 65 6e 0a 20 20 20 20 65 78 65 63 73 71 6c 20  pen.    execsql 
f3f0: 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  {.      CREATE T
f400: 41 42 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c  ABLE ko(c DEFAUL
f410: 54 20 27 61 62 63 27 2c 20 62 20 44 45 46 41 55  T 'abc', b DEFAU
f420: 4c 54 20 27 64 65 66 27 29 3b 0a 20 20 20 20 20  LT 'def');.     
f430: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20   INSERT INTO ko 
f440: 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a  DEFAULT VALUES;.
f450: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
f460: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
f470: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20  heckpoint }.  } 
f480: 7b 30 20 2d 31 20 2d 31 7d 0a 20 20 64 6f 5f 74  {0 -1 -1}.  do_t
f490: 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e 32 2e  est pager1-22.2.
f4a0: 31 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20  1 {.    testvfs 
f4b0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
f4c0: 20 20 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e    tv filter xSyn
f4d0: 63 0a 20 20 20 20 74 76 20 73 63 72 69 70 74 20  c.    tv script 
f4e0: 78 53 79 6e 63 43 62 0a 20 20 20 20 70 72 6f 63  xSyncCb.    proc
f4f0: 20 78 53 79 6e 63 43 62 20 7b 61 72 67 73 7d 20   xSyncCb {args} 
f500: 7b 69 6e 63 72 20 3a 3a 73 79 6e 63 63 6f 75 6e  {incr ::synccoun
f510: 74 7d 0a 20 20 20 20 73 65 74 20 3a 3a 73 79 6e  t}.    set ::syn
f520: 63 63 6f 75 6e 74 20 30 0a 20 20 20 20 73 71 6c  ccount 0.    sql
f530: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
f540: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
f550: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
f560: 72 6f 6e 6f 75 73 20 3d 20 6f 66 66 3b 0a 20 20  ronous = off;.  
f570: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
f580: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
f590: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
f5a0: 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55   ko DEFAULT VALU
f5b0: 45 53 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  ES;.    }.    ex
f5c0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
f5d0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
f5e0: 20 20 20 20 73 65 74 20 73 79 6e 63 63 6f 75 6e      set synccoun
f5f0: 74 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 62 20 63  t.  } {0}.  db c
f600: 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65  lose.  tv delete
f610: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
f620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
f660: 20 54 65 73 74 73 20 66 6f 72 20 63 68 61 6e 67   Tests for chang
f670: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ing journal mode
f680: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
f690: 33 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  3.1.*: Test that
f6a0: 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20 66   when changing f
f6b0: 72 6f 6d 20 50 45 52 53 49 53 54 20 74 6f 20 44  rom PERSIST to D
f6c0: 45 4c 45 54 45 20 6d 6f 64 65 2c 0a 23 20 20 20  ELETE mode,.#   
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
f6e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f6f0: 69 73 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20  is deleted..#.# 
f700: 20 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 2a 3a    pager1-23.2.*:
f710: 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 61 62   Same test as ab
f720: 6f 76 65 2c 20 62 75 74 20 77 68 69 6c 65 20 61  ove, but while a
f730: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
f740: 68 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20 20  held.#          
f750: 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64          on the d
f760: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a  atabase file..#.
f770: 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 33 2e  #   pager1-23.3.
f780: 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20  *: Same test as 
f790: 61 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c 65  above, but while
f7a0: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
f7b0: 20 69 73 20 68 65 6c 64 0a 23 20 20 20 20 20 20   is held.#      
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20 74              on t
f7d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f7e0: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
f7f0: 33 2e 34 2e 2a 3a 20 41 6e 64 2c 20 66 6f 72 20  3.4.*: And, for 
f800: 66 75 6e 2c 20 77 68 69 6c 65 20 68 6f 6c 64 69  fun, while holdi
f810: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
f820: 6c 6f 63 6b 2e 0a 23 0a 23 20 20 20 70 61 67 65  lock..#.#   page
f830: 72 31 2d 32 33 2e 35 2e 2a 3a 20 54 72 79 20 74  r1-23.5.*: Try t
f840: 6f 20 73 65 74 20 76 61 72 69 6f 75 73 20 64 69  o set various di
f850: 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  fferent journal 
f860: 6d 6f 64 65 73 20 77 69 74 68 20 61 6e 0a 23 20  modes with an.# 
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f890: 61 73 65 20 28 6f 6e 6c 79 20 4d 45 4d 4f 52 59  ase (only MEMORY
f8a0: 20 61 6e 64 20 4f 46 46 20 73 68 6f 75 6c 64 20   and OFF should 
f8b0: 77 6f 72 6b 29 2e 0a 23 0a 23 20 20 20 70 61 67  work)..#.#   pag
f8c0: 65 72 31 2d 32 33 2e 36 2e 2a 3a 20 54 72 79 20  er1-23.6.*: Try 
f8d0: 74 6f 20 73 65 74 20 6c 6f 63 6b 69 6e 67 5f 6d  to set locking_m
f8e0: 6f 64 65 3d 6e 6f 72 6d 61 6c 20 6f 6e 20 61 6e  ode=normal on an
f8f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f900: 61 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ase.#           
f910: 20 20 20 20 20 20 20 28 64 6f 65 73 6e 27 74 20         (doesn't 
f920: 77 6f 72 6b 20 2d 20 69 6e 2d 6d 65 6d 6f 72 79  work - in-memory
f930: 20 64 61 74 61 62 61 73 65 73 20 61 6c 77 61 79   databases alway
f940: 73 20 75 73 65 0a 23 20 20 20 20 20 20 20 20 20  s use.#         
f950: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 69 6e 67           locking
f960: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 29  _mode=exclusive)
f970: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
f980: 72 31 2d 32 33 2e 31 2e 31 20 7b 0a 20 20 66 61  r1-23.1.1 {.  fa
f990: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
f9a0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
f9b0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
f9c0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
f9d0: 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45 41  ERSIST;.    CREA
f9e0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
f9f0: 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 65 78  );.  }.  file ex
fa00: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
fa10: 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  rnal.} {1}.do_te
fa20: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 32  st pager1-23.1.2
fa30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
fa40: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
fa50: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20  de = DELETE }.  
fa60: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
fa70: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30  .db-journal.} {0
fa80: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
fa90: 31 2d 32 33 2e 32 2e 31 20 7b 0a 20 20 65 78 65  1-23.2.1 {.  exe
faa0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
fab0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
fac0: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e   PERSIST;.    IN
fad0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
fae0: 55 45 53 28 27 43 61 6e 62 65 72 72 61 27 2c 20  UES('Canberra', 
faf0: 27 41 43 54 27 29 3b 0a 20 20 7d 0a 20 20 64 62  'ACT');.  }.  db
fb00: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a   eval { SELECT *
fb10: 20 46 52 4f 4d 20 74 31 20 7d 20 7b 0a 20 20 20   FROM t1 } {.   
fb20: 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d   db eval { PRAGM
fb30: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
fb40: 20 44 45 4c 45 54 45 20 7d 0a 20 20 7d 0a 20 20   DELETE }.  }.  
fb50: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
fb60: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a   journal_mode }.
fb70: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65  } {delete}.do_te
fb80: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 32  st pager1-23.2.2
fb90: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   {.  file exists
fba0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
fbb0: 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20  .} {0}..do_test 
fbc0: 70 61 67 65 72 31 2d 32 33 2e 33 2e 31 20 7b 0a  pager1-23.3.1 {.
fbd0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
fbe0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
fbf0: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
fc00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
fc10: 31 20 56 41 4c 55 45 53 28 27 44 61 72 77 69 6e  1 VALUES('Darwin
fc20: 27 2c 20 27 4e 54 27 29 3b 0a 20 20 20 20 42 45  ', 'NT');.    BE
fc30: 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20  GIN IMMEDIATE;. 
fc40: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50   }.  db eval { P
fc50: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
fc60: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20  de = DELETE }.  
fc70: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
fc80: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a   journal_mode }.
fc90: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65  } {delete}.do_te
fca0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 32  st pager1-23.3.2
fcb0: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   {.  file exists
fcc0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
fcd0: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {0}.do_test p
fce0: 61 67 65 72 31 2d 32 33 2e 33 2e 33 20 7b 0a 20  ager1-23.3.3 {. 
fcf0: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
fd00: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
fd10: 67 65 72 31 2d 32 33 2e 34 2e 31 20 7b 0a 20 20  ger1-23.4.1 {.  
fd20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
fd30: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
fd40: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
fd50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
fd60: 56 41 4c 55 45 53 28 27 41 64 65 6c 61 69 64 65  VALUES('Adelaide
fd70: 27 2c 20 27 53 41 27 29 3b 0a 20 20 20 20 42 45  ', 'SA');.    BE
fd80: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20  GIN EXCLUSIVE;. 
fd90: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50   }.  db eval { P
fda0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
fdb0: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20  de = DELETE }.  
fdc0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
fdd0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a   journal_mode }.
fde0: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65  } {delete}.do_te
fdf0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 32  st pager1-23.4.2
fe00: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   {.  file exists
fe10: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
fe20: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {0}.do_test p
fe30: 61 67 65 72 31 2d 32 33 2e 34 2e 33 20 7b 0a 20  ager1-23.4.3 {. 
fe40: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
fe50: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
fe60: 67 65 72 31 2d 32 33 2e 35 2e 31 20 7b 0a 20 20  ger1-23.5.1 {.  
fe70: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
fe80: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c  and_reopen.  sql
fe90: 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a  ite3 db :memory:
fea0: 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74  .} {}.foreach {t
feb0: 6e 20 6d 6f 64 65 20 70 6f 73 73 69 62 6c 65 7d  n mode possible}
fec0: 20 7b 0a 20 20 32 20 20 6f 66 66 20 20 20 20 20   {.  2  off     
fed0: 20 31 0a 20 20 33 20 20 6d 65 6d 6f 72 79 20 20   1.  3  memory  
fee0: 20 31 0a 20 20 34 20 20 70 65 72 73 69 73 74 20   1.  4  persist 
fef0: 20 30 0a 20 20 35 20 20 64 65 6c 65 74 65 20 20   0.  5  delete  
ff00: 20 30 0a 20 20 36 20 20 77 61 6c 20 20 20 20 20   0.  6  wal     
ff10: 20 30 0a 20 20 37 20 20 74 72 75 6e 63 61 74 65   0.  7  truncate
ff20: 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74   0.} {.  do_test
ff30: 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74 6e   pager1-23.5.$tn
ff40: 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
ff50: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
ff60: 5f 6d 6f 64 65 20 3d 20 6f 66 66 22 0a 20 20 20  _mode = off".   
ff70: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
ff80: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
ff90: 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24  $mode".  } [if $
ffa0: 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24  possible {list $
ffb0: 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6f 66 66 7d  mode} {list off}
ffc0: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
ffd0: 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 32 20 7b 0a  r1-23.5.$tn.2 {.
ffe0: 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41      execsql "PRA
fff0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
10000 20 3d 20 6d 65 6d 6f 72 79 22 0a 20 20 20 20 65   = memory".    e
10010 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a  xecsql "PRAGMA j
10020 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d  ournal_mode = $m
10030 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f  ode".  } [if $po
10040 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f  ssible {list $mo
10050 64 65 7d 20 7b 6c 69 73 74 20 6d 65 6d 6f 72 79  de} {list memory
10060 7d 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  }].}.do_test pag
10070 65 72 31 2d 32 33 2e 36 2e 31 20 7b 0a 20 20 65  er1-23.6.1 {.  e
10080 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c  xecsql {PRAGMA l
10090 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f  ocking_mode = no
100a0 72 6d 61 6c 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  rmal}.} {exclusi
100b0 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ve}.do_test page
100c0 72 31 2d 32 33 2e 36 2e 32 20 7b 0a 20 20 65 78  r1-23.6.2 {.  ex
100d0 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f  ecsql {PRAGMA lo
100e0 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63  cking_mode = exc
100f0 6c 75 73 69 76 65 7d 0a 7d 20 7b 65 78 63 6c 75  lusive}.} {exclu
10100 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61  sive}.do_test pa
10110 67 65 72 31 2d 32 33 2e 36 2e 33 20 7b 0a 20 20  ger1-23.6.3 {.  
10120 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
10130 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20  locking_mode}.} 
10140 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74  {exclusive}.do_t
10150 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  est pager1-23.6.
10160 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  4 {.  execsql {P
10170 52 41 47 4d 41 20 6d 61 69 6e 2e 6c 6f 63 6b 69  RAGMA main.locki
10180 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c  ng_mode}.} {excl
10190 75 73 69 76 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  usive}..#-------
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 2d 2d 2d 2d 2d 2d  ----------------
101e0 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  --.#.do_test pag
101f0 65 72 31 2d 32 34 2e 31 2e 31 20 7b 0a 20 20 66  er1-24.1.1 {.  f
10200 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
10210 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
10220 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
10230 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
10240 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  {.    PRAGMA cac
10250 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
10260 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
10270 63 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20 20  cuum = FULL;.   
10280 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31   CREATE TABLE x1
10290 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52  (x, y, z, PRIMAR
102a0 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20 20  Y KEY(y, z));.  
102b0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
102c0 32 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41  2(x, y, z, PRIMA
102d0 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20  RY KEY(y, z));. 
102e0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
102f0 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  2 VALUES(a_strin
10300 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(400), a_string
10310 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
10320 36 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  600));.    INSER
10330 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54  T INTO x2 SELECT
10340 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20   a_string(600), 
10350 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61  a_string(400), a
10360 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f  _string(500) FRO
10370 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x2;.    INSERT
10380 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20   INTO x2 SELECT 
10390 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
103a0 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f  _string(600), a_
103b0 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
103c0 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x2;.    INSERT 
103d0 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61  INTO x2 SELECT a
103e0 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f  _string(400), a_
103f0 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
10400 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
10410 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x2;.    INSERT I
10420 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f  NTO x2 SELECT a_
10430 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73  string(600), a_s
10440 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74  tring(400), a_st
10450 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20 78  ring(500) FROM x
10460 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  2;.    INSERT IN
10470 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73  TO x2 SELECT a_s
10480 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
10490 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72  ring(600), a_str
104a0 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 78 32  ing(400) FROM x2
104b0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
104c0 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74  O x2 SELECT a_st
104d0 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72  ring(400), a_str
104e0 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
104f0 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 78 32 3b  ng(600) FROM x2;
10500 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10510 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   x1 SELECT * FRO
10520 4d 20 78 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  M x2;.  }.} {}.d
10530 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34  o_test pager1-24
10540 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
10550 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
10560 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
10570 78 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c 33  x1 WHERE rowid<3
10580 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69  2;.  }.  recursi
10590 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32 0a  ve_select 64 x2.
105a0 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
105b0 65 72 31 2d 32 34 2e 31 2e 33 20 7b 0a 20 20 65  er1-24.1.3 {.  e
105c0 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
105d0 55 50 44 41 54 45 20 78 31 20 53 45 54 20 7a 20  UPDATE x1 SET z 
105e0 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  = a_string(300) 
105f0 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a  WHERE rowid>40;.
10600 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
10610 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
10620 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45  _check;.    SELE
10630 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
10640 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33   x1;.  }.} {ok 3
10650 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  3}..do_test page
10660 72 31 2d 32 34 2e 31 2e 34 20 7b 0a 20 20 65 78  r1-24.1.4 {.  ex
10670 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
10680 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20  TE FROM x1;.    
10690 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53  INSERT INTO x1 S
106a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b  ELECT * FROM x2;
106b0 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
106c0 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31    DELETE FROM x1
106d0 20 57 48 45 52 45 20 72 6f 77 69 64 3c 33 32 3b   WHERE rowid<32;
106e0 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78 31  .      UPDATE x1
106f0 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69 6e   SET z = a_strin
10700 67 28 32 39 39 29 20 57 48 45 52 45 20 72 6f 77  g(299) WHERE row
10710 69 64 3e 34 30 3b 0a 20 20 7d 0a 20 20 72 65 63  id>40;.  }.  rec
10720 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34  ursive_select 64
10730 20 78 32 20 7b 64 62 20 65 76 61 6c 20 43 4f 4d   x2 {db eval COM
10740 4d 49 54 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  MIT}.  execsql {
10750 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
10760 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20  grity_check;.   
10770 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
10780 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20   FROM x1;.  }.} 
10790 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73 74  {ok 33}..do_test
107a0 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 35 20 7b   pager1-24.1.5 {
107b0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
107c0 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 3b   DELETE FROM x1;
107d0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
107e0 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   x1 SELECT * FRO
107f0 4d 20 78 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75  M x2;.  }.  recu
10800 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20  rsive_select 64 
10810 78 32 20 7b 20 64 62 20 65 76 61 6c 20 7b 43 52  x2 { db eval {CR
10820 45 41 54 45 20 54 41 42 4c 45 20 78 33 28 78 2c  EATE TABLE x3(x,
10830 20 79 2c 20 7a 29 7d 20 7d 0a 20 20 65 78 65 63   y, z)} }.  exec
10840 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
10850 52 4f 4d 20 78 33 20 7d 0a 7d 20 7b 7d 0a 0a 23  ROM x3 }.} {}..#
10860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74  ---------.#.do_t
108b0 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 31 20  est pager1-25-1 
108c0 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
108d0 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
108e0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
108f0 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56 45  EGIN;.      SAVE
10900 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20  POINT abc;.     
10910 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10920 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
10930 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b  ROLLBACK TO abc;
10940 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
10950 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d  .  db close.} {}
10960 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 64 6f 5f 74  .breakpoint.do_t
10970 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 32 20  est pager1-25-2 
10980 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
10990 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
109a0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
109b0 41 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20  AVEPOINT abc;.  
109c0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
109d0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 52   t1(a, b);.    R
109e0 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a  OLLBACK TO abc;.
109f0 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
10a00 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a    db close.} {}.
10a10 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 65  -----------.# Se
10a60 63 74 6f 72 2d 73 69 7a 65 20 74 65 73 74 73 2e  ctor-size tests.
10a70 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
10a80 31 2d 32 36 2e 31 20 7b 0a 20 20 74 65 73 74 76  1-26.1 {.  testv
10a90 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
10aa0 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65  .  tv sectorsize
10ab0 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69 6d   4096.  faultsim
10ac0 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
10ad0 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  en.  db func a_s
10ae0 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
10af0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
10b00 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
10b10 3d 20 35 31 32 3b 0a 20 20 20 20 43 52 45 41 54  = 512;.    CREAT
10b20 45 20 54 41 42 4c 45 20 74 62 6c 28 61 20 50 52  E TABLE tbl(a PR
10b30 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49  IMARY KEY, b UNI
10b40 51 55 45 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b  QUE);.    BEGIN;
10b50 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10b60 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 61 5f  TO tbl VALUES(a_
10b70 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
10b80 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20 20  ring(600));.    
10b90 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
10ba0 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
10bb0 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
10bc0 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
10bd0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10be0 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
10bf0 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
10c00 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
10c10 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
10c20 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61  NTO tbl SELECT a
10c30 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
10c40 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
10c50 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  tbl;.      INSER
10c60 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
10c70 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
10c80 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
10c90 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
10ca0 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
10cb0 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
10cc0 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10cd0 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
10ce0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
10cf0 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10d00 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
10d10 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
10d20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10d30 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72  tbl SELECT a_str
10d40 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
10d50 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b  g(600) FROM tbl;
10d60 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
10d70 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  .} {}.do_execsql
10d80 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 36 2e  _test pager1-26.
10d90 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74 62 6c  1 {.  UPDATE tbl
10da0 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
10db0 67 28 35 35 30 29 3b 0a 7d 20 7b 7d 0a 64 62 20  g(550);.} {}.db 
10dc0 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
10dd0 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
10de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f  -----------.#.do
10e20 5f 74 65 73 74 20 70 61 67 65 72 31 2e 32 37 2e  _test pager1.27.
10e30 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
10e40 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
10e50 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  .  sqlite3_pager
10e60 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20 20  _refcounts db.  
10e70 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
10e80 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54  GIN;.      CREAT
10e90 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
10ea0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
10eb0 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20  pager_refcounts 
10ec0 64 62 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d  db.  execsql COM
10ed0 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  MIT.} {}..#-----
10ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f20 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
10f30 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f   attempting to o
10f40 70 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  pen a write-tran
10f50 73 61 63 74 69 6f 6e 20 77 69 74 68 20 0a 23 20  saction with .# 
10f60 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
10f70 6c 75 73 69 76 65 20 69 6e 20 57 41 4c 20 6d 6f  lusive in WAL mo
10f80 64 65 20 66 61 69 6c 73 20 69 66 20 74 68 65 72  de fails if ther
10f90 65 20 61 72 65 20 6f 74 68 65 72 20 63 6c 69 65  e are other clie
10fa0 6e 74 73 20 6f 6e 20 0a 23 20 74 68 65 20 73 61  nts on .# the sa
10fb0 6d 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 63  me database..#.c
10fc0 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20  atch { db close 
10fd0 7d 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20  }.ifcapable wal 
10fe0 7b 0a 20 20 64 6f 5f 6d 75 6c 74 69 63 6c 69 65  {.  do_multiclie
10ff0 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 20  nt_test tn {.   
11000 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11010 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20  28.$tn.1 {.     
11020 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 20   sql1 { .       
11030 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
11040 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
11050 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
11060 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
11070 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11080 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  1 VALUES('a', 'b
11090 27 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ');.      }.    
110a0 7d 20 7b 77 61 6c 7d 0a 20 20 20 20 64 6f 5f 74  } {wal}.    do_t
110b0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
110c0 6e 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c  n.2 { sql2 { SEL
110d0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
110e0 7d 20 7b 61 20 62 7d 0a 0a 20 20 20 20 64 6f 5f  } {a b}..    do_
110f0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11100 74 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20 50 52  tn.3 { sql1 { PR
11110 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
11120 65 3d 65 78 63 6c 75 73 69 76 65 20 7d 20 7d 20  e=exclusive } } 
11130 7b 65 78 63 6c 75 73 69 76 65 7d 0a 20 20 20 20  {exclusive}.    
11140 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11150 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20  8.$tn.4 { .     
11160 20 63 73 71 6c 31 20 7b 20 42 45 47 49 4e 3b 20   csql1 { BEGIN; 
11170 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
11180 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b  ALUES('c', 'd');
11190 20 7d 0a 20 20 20 20 7d 20 7b 31 20 7b 64 61 74   }.    } {1 {dat
111a0 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
111b0 7d 0a 20 20 20 20 63 6f 64 65 32 20 7b 20 64 62  }.    code2 { db
111c0 32 20 63 6c 6f 73 65 20 3b 20 73 71 6c 69 74 65  2 close ; sqlite
111d0 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 7d 0a  3 db2 test.db }.
111e0 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
111f0 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 0a 20  r1-28.$tn.4 { . 
11200 20 20 20 20 20 73 71 6c 31 20 7b 20 49 4e 53 45       sql1 { INSE
11210 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
11220 53 28 27 63 27 2c 20 27 64 27 29 3b 20 43 4f 4d  S('c', 'd'); COM
11230 4d 49 54 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20  MIT }.    } {}. 
11240 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   }.}..#---------
11250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11290 0a 23 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65  .# Normally, whe
112a0 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20  n changing from 
112b0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52  journal_mode=PER
112c0 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 74  SIST to DELETE t
112d0 68 65 20 70 61 67 65 72 0a 23 20 61 74 74 65 6d  he pager.# attem
112e0 70 74 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68  pts to delete th
112f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
11300 48 6f 77 65 76 65 72 2c 20 69 66 20 69 74 20 63  However, if it c
11310 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 20 61 0a 23  annot obtain a.#
11320 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
11330 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
11340 69 6c 65 2c 20 74 68 69 73 20 73 74 65 70 20 69  ile, this step i
11350 73 20 73 6b 69 70 70 65 64 2e 0a 23 0a 64 6f 5f  s skipped..#.do_
11360 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
11370 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20   tn {.  do_test 
11380 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20  pager1-28.$tn.1 
11390 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20  {.    sql1 { .  
113a0 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
113b0 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
113c0 54 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  T;.      CREATE 
113d0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
113e0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
113f0 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c  O t1 VALUES('a',
11400 20 27 62 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   'b');.    }.  }
11410 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f   {persist}.  do_
11420 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11430 74 6e 2e 32 20 7b 20 66 69 6c 65 20 65 78 69 73  tn.2 { file exis
11440 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
11450 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74  al } 1.  do_test
11460 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33   pager1-28.$tn.3
11470 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41   { sql1 { PRAGMA
11480 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
11490 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74  DELETE } } delet
114a0 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  e.  do_test page
114b0 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 66 69  r1-28.$tn.4 { fi
114c0 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
114d0 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20  b-journal } 0.. 
114e0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
114f0 32 38 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 73  28.$tn.5 {.    s
11500 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41  ql1 { .      PRA
11510 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
11520 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
11530 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11540 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27   VALUES('c', 'd'
11550 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65  );.    }.  } {pe
11560 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74  rsist}.  do_test
11570 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 36   pager1-28.$tn.6
11580 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
11590 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
115a0 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   1.  do_test pag
115b0 65 72 31 2d 32 38 2e 24 74 6e 2e 37 20 7b 0a 20  er1-28.$tn.7 {. 
115c0 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b     sql2 { BEGIN;
115d0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
115e0 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29  VALUES('e', 'f')
115f0 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ; }.  } {}.  do_
11600 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11610 74 6e 2e 38 20 20 7b 20 66 69 6c 65 20 65 78 69  tn.8  { file exi
11620 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
11630 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  nal } 1.  do_tes
11640 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11650 39 20 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47  9  { sql1 { PRAG
11660 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
11670 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c  = DELETE } } del
11680 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ete.  do_test pa
11690 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 30 20 7b  ger1-28.$tn.10 {
116a0 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
116b0 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
116c0 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
116d0 72 31 2d 32 38 2e 24 74 6e 2e 31 31 20 7b 20 73  r1-28.$tn.11 { s
116e0 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a  ql2 COMMIT } {}.
116f0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11700 2d 32 38 2e 24 74 6e 2e 31 32 20 7b 20 66 69 6c  -28.$tn.12 { fil
11710 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
11720 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20  -journal } 0..  
11730 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11740 38 2d 24 74 6e 2e 31 33 20 7b 0a 20 20 20 20 63  8-$tn.13 {.    c
11750 6f 64 65 31 20 7b 20 73 65 74 20 63 68 61 6e 6e  ode1 { set chann
11760 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20  el [db incrblob 
11770 2d 72 65 61 64 6f 6e 6c 79 20 74 31 20 61 20 32  -readonly t1 a 2
11780 5d 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20  ] }.    sql1 {. 
11790 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
117a0 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
117b0 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ST;.      INSERT
117c0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
117d0 27 67 27 2c 20 27 68 27 29 3b 0a 20 20 20 20 7d  'g', 'h');.    }
117e0 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20  .  } {persist}. 
117f0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11800 32 38 2e 24 74 6e 2e 31 34 20 7b 20 66 69 6c 65  28.$tn.14 { file
11810 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
11820 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f  journal } 1.  do
11830 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11840 24 74 6e 2e 31 35 20 7b 0a 20 20 20 20 73 71 6c  $tn.15 {.    sql
11850 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52  2 { BEGIN; INSER
11860 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
11870 28 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20  ('e', 'f'); }.  
11880 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
11890 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 36 20  ager1-28.$tn.16 
118a0 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20  { sql1 { PRAGMA 
118b0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
118c0 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65  ELETE } } delete
118d0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
118e0 31 2d 32 38 2e 24 74 6e 2e 31 37 20 7b 20 66 69  1-28.$tn.17 { fi
118f0 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
11900 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20  b-journal } 1.. 
11910 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11920 32 38 2e 24 74 6e 2e 31 37 20 7b 20 63 73 71 6c  28.$tn.17 { csql
11930 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b  2 { COMMIT } } {
11940 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
11950 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ocked}}.  do_tes
11960 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e  t pager1-28-$tn.
11970 31 38 20 7b 20 63 6f 64 65 31 20 7b 20 72 65 61  18 { code1 { rea
11980 64 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 63  d $channel } } c
11990 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
119a0 31 2d 32 38 2d 24 74 6e 2e 31 39 20 7b 20 63 6f  1-28-$tn.19 { co
119b0 64 65 31 20 7b 20 63 6c 6f 73 65 20 24 63 68 61  de1 { close $cha
119c0 6e 6e 65 6c 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f  nnel } } {}.  do
119d0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
119e0 24 74 6e 2e 32 30 20 7b 20 73 71 6c 32 20 7b 20  $tn.20 { sql2 { 
119f0 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 7d 0a  COMMIT } } {}.}.
11a00 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
11a10 32 39 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  29.1 {.  faultsi
11a20 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
11a30 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
11a40 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
11a50 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
11a60 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
11a70 75 75 6d 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20  uum = full;.    
11a80 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
11a90 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 3b 0a 20  ode=exclusive;. 
11aa0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
11ab0 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
11ac0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11ad0 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
11ae0 20 6c 69 73 74 20 5b 66 69 6c 65 5f 70 61 67 65   list [file_page
11af0 5f 63 6f 75 6e 74 20 74 65 73 74 2e 64 62 5d 20  _count test.db] 
11b00 5b 66 69 6c 65 5f 70 61 67 65 5f 73 69 7a 65 20  [file_page_size 
11b10 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 33 20 31 30  test.db].} {3 10
11b20 32 34 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  24}.do_test page
11b30 72 31 2d 32 39 2e 32 20 7b 0a 20 20 65 78 65 63  r1-29.2 {.  exec
11b40 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
11b50 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39   page_size = 409
11b60 36 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20  6;.    VACUUM;. 
11b70 20 7d 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 5f   }.  list [file_
11b80 70 61 67 65 5f 63 6f 75 6e 74 20 74 65 73 74 2e  page_count test.
11b90 64 62 5d 20 5b 66 69 6c 65 5f 70 61 67 65 5f 73  db] [file_page_s
11ba0 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b  ize test.db].} {
11bb0 33 20 34 30 39 36 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  3 4096}..#------
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c00 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
11c10 69 66 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61  if an empty data
11c20 62 61 73 65 20 66 69 6c 65 20 28 73 69 7a 65 20  base file (size 
11c30 30 20 62 79 74 65 73 29 20 69 73 20 6f 70 65 6e  0 bytes) is open
11c40 65 64 20 69 6e 20 0a 23 20 65 78 63 6c 75 73 69  ed in .# exclusi
11c50 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c  ve-locking mode,
11c60 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   any journal fil
11c70 65 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  e is deleted fro
11c80 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  m the file-syste
11c90 6d 0a 23 20 77 69 74 68 6f 75 74 20 62 65 69 6e  m.# without bein
11ca0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 41  g rolled back. A
11cb0 6e 64 20 74 68 61 74 20 74 68 65 20 52 45 53 45  nd that the RESE
11cc0 52 56 45 44 20 6c 6f 63 6b 20 6f 62 74 61 69 6e  RVED lock obtain
11cd0 65 64 20 77 68 69 6c 65 0a 23 20 64 6f 69 6e 67  ed while.# doing
11ce0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 6c   this is not rel
11cf0 65 61 73 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  eased..#.do_test
11d00 20 70 61 67 65 72 31 2d 33 30 2e 31 20 7b 0a 20   pager1-30.1 {. 
11d10 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 65 6c 65   db close.  dele
11d20 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 0a  te_file test.db.
11d30 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65    delete_file te
11d40 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  st.db-journal.  
11d50 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73  set fd [open tes
11d60 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d 0a  t.db-journal w].
11d70 20 20 73 65 65 6b 20 24 66 64 20 5b 65 78 70 72    seek $fd [expr
11d80 20 35 31 32 2b 31 30 33 32 2a 32 5d 0a 20 20 70   512+1032*2].  p
11d90 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
11da0 66 64 20 78 0a 20 20 63 6c 6f 73 65 20 24 66 64  fd x.  close $fd
11db0 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  ..  sqlite3 db t
11dc0 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
11dd0 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f   {.    PRAGMA lo
11de0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
11df0 53 49 56 45 3b 0a 20 20 20 20 53 45 4c 45 43 54  SIVE;.    SELECT
11e00 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73   count(*) FROM s
11e10 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
11e20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74    PRAGMA lock_st
11e30 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63  atus;.  }.} {exc
11e40 6c 75 73 69 76 65 20 30 20 6d 61 69 6e 20 72 65  lusive 0 main re
11e50 73 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73  served temp clos
11e60 65 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ed}..#----------
11e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
11eb0 23 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74  # Test that if t
11ec0 68 65 20 22 70 61 67 65 2d 73 69 7a 65 22 20 66  he "page-size" f
11ed0 69 65 6c 64 20 69 6e 20 61 20 6a 6f 75 72 6e 61  ield in a journa
11ee0 6c 2d 68 65 61 64 65 72 20 69 73 20 30 2c 20 74  l-header is 0, t
11ef0 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 66 69 6c  he journal.# fil
11f00 65 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 72  e can still be r
11f10 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
11f20 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
11f30 20 62 61 63 6b 77 61 72 64 20 63 6f 6d 70 61 74   backward compat
11f40 69 62 69 6c 69 74 79 20 2d 0a 23 20 76 65 72 73  ibility -.# vers
11f50 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
11f60 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 61 6c  rior to 3.5.8 al
11f70 77 61 79 73 20 73 65 74 20 74 68 69 73 20 66 69  ways set this fi
11f80 65 6c 64 20 74 6f 20 7a 65 72 6f 2e 0a 23 0a 69  eld to zero..#.i
11f90 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  f {$tcl_platform
11fa0 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69  (platform)=="uni
11fb0 78 22 7d 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61  x"} {.do_test pa
11fc0 67 65 72 31 2d 33 31 2e 31 20 7b 0a 20 20 66 61  ger1-31.1 {.  fa
11fd0 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
11fe0 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
11ff0 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
12000 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
12010 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
12020 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
12030 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
12040 31 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  1(x, y, UNIQUE(x
12050 2c 20 79 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  , y));.    INSER
12060 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
12070 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30  (randomblob(1500
12080 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
12090 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
120a0 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
120b0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
120c0 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
120d0 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
120e0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
120f0 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
12100 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
12110 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
12120 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12130 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
12140 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
12150 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
12160 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
12170 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
12180 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
12190 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
121a0 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
121b0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
121c0 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
121d0 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
121e0 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
121f0 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
12200 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
12210 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
12220 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12230 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
12240 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
12250 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
12260 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
12270 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
12280 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12290 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
122a0 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
122b0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
122c0 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
122d0 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
122e0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
122f0 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
12300 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
12310 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12320 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
12330 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
12340 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
12350 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
12360 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
12370 20 79 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28   y = randomblob(
12380 31 34 39 39 29 3b 0a 20 20 7d 0a 20 20 63 6f 70  1499);.  }.  cop
12390 79 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 20 74  y_file test.db t
123a0 65 73 74 2e 64 62 32 0a 20 20 63 6f 70 79 5f 66  est.db2.  copy_f
123b0 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ile test.db-jour
123c0 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75  nal test.db2-jou
123d0 72 6e 61 6c 0a 20 20 0a 20 20 68 65 78 69 6f 5f  rnal.  .  hexio_
123e0 77 72 69 74 65 20 74 65 73 74 2e 64 62 32 2d 6a  write test.db2-j
123f0 6f 75 72 6e 61 6c 20 32 34 20 30 30 30 30 30 30  ournal 24 000000
12400 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  00.  sqlite3 db2
12410 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63   test.db2.  exec
12420 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74  sql { PRAGMA int
12430 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64  egrity_check } d
12440 62 32 0a 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 23 2d 2d  b2.} {ok}.}..#--
12450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12490 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
124a0 68 61 74 20 61 20 64 61 74 61 62 61 73 65 20 66  hat a database f
124b0 69 6c 65 20 63 61 6e 20 62 65 20 22 70 72 65 2d  ile can be "pre-
124c0 68 69 6e 74 65 64 22 20 74 6f 20 61 20 63 65 72  hinted" to a cer
124d0 74 61 69 6e 20 73 69 7a 65 20 61 6e 64 20 74 68  tain size and th
124e0 61 74 0a 23 20 73 75 62 73 65 71 75 65 6e 74 20  at.# subsequent 
124f0 73 70 69 6c 6c 69 6e 67 20 6f 66 20 74 68 65 20  spilling of the 
12500 70 61 67 65 72 20 63 61 63 68 65 20 64 6f 65 73  pager cache does
12510 20 6e 6f 74 20 72 65 73 75 6c 74 20 69 6e 20 74   not result in t
12520 68 65 20 64 61 74 61 62 61 73 65 0a 23 20 66 69  he database.# fi
12530 6c 65 20 62 65 69 6e 67 20 73 68 72 75 6e 6b 2e  le being shrunk.
12540 0a 23 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .#.catch {db clo
12550 73 65 7d 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  se}.forcedelete 
12560 74 65 73 74 2e 64 62 0a 0a 64 6f 5f 74 65 73 74  test.db..do_test
12570 20 70 61 67 65 72 31 2d 33 32 2e 31 20 7b 0a 20   pager1-32.1 {. 
12580 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
12590 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
125a0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
125b0 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 7d 0a 20   t1(x, y);.  }. 
125c0 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
125d0 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
125e0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
125f0 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
12600 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
12610 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  1, randomblob(10
12620 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 66 69 6c  000));.  }.  fil
12630 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73  e_control_chunks
12640 69 7a 65 5f 74 65 73 74 20 64 62 20 6d 61 69 6e  ize_test db main
12650 20 31 30 32 34 0a 20 20 66 69 6c 65 5f 63 6f 6e   1024.  file_con
12660 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
12670 73 74 20 64 62 20 6d 61 69 6e 20 32 30 39 37 31  st db main 20971
12680 35 32 30 3b 20 23 20 32 30 4d 42 0a 20 20 65 78  520; # 20MB.  ex
12690 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
126a0 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
126b0 31 30 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  10;.    INSERT I
126c0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
126d0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
126e0 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
126f0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
12700 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
12710 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
12720 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
12730 78 2b 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  x+2, randomblob(
12740 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a  10000) from t1;.
12750 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12760 74 31 20 53 45 4c 45 43 54 20 78 2b 34 2c 20 72  t1 SELECT x+4, r
12770 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29  andomblob(10000)
12780 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e   from t1;.    IN
12790 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
127a0 45 43 54 20 78 2b 38 2c 20 72 61 6e 64 6f 6d 62  ECT x+8, randomb
127b0 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20  lob(10000) from 
127c0 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
127d0 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b  NTO t1 SELECT x+
127e0 31 36 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  16, randomblob(1
127f0 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20  0000) from t1;. 
12800 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
12810 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *) FROM t1;.    
12820 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62  COMMIT;.  }.  db
12830 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 73 69   close.  file si
12840 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 32 30  ze test.db.} {20
12850 39 37 31 35 32 30 7d 0a 0a 23 20 43 6c 65 61 6e  971520}..# Clean
12860 75 70 20 32 30 4d 42 20 66 69 6c 65 20 6c 65 66  up 20MB file lef
12870 74 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  t by the previou
12880 73 20 74 65 73 74 2e 0a 66 6f 72 63 65 64 65 6c  s test..forcedel
12890 65 74 65 20 74 65 73 74 2e 64 62 0a 0a 23 2d 2d  ete test.db..#--
128a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128e0 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
128f0 68 61 74 20 69 66 20 61 20 74 72 61 6e 73 61 63  hat if a transac
12900 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
12910 64 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  d in journal_mod
12920 65 3d 44 45 4c 45 54 45 20 6d 6f 64 65 2c 0a 23  e=DELETE mode,.#
12930 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f   and the call to
12940 20 75 6e 6c 69 6e 6b 28 29 20 72 65 74 75 72 6e   unlink() return
12950 73 20 61 6e 20 45 4e 4f 45 4e 54 20 65 72 72 6f  s an ENOENT erro
12960 72 2c 20 74 68 65 20 43 4f 4d 4d 49 54 20 64 6f  r, the COMMIT do
12970 65 73 20 6e 6f 74 0a 23 20 73 75 63 63 65 65 64  es not.# succeed
12980 2e 0a 23 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70  ..#.if {$::tcl_p
12990 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d  latform(platform
129a0 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 20 20 64  )=="unix"} {.  d
129b0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 33  o_test pager1-33
129c0 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .1 {.    sqlite3
129d0 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20   db test.db.    
129e0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
129f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
12a00 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  x);.      INSERT
12a10 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
12a20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 20 20 49 4e  'one');.      IN
12a30 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
12a40 55 45 53 28 27 74 77 6f 27 29 3b 0a 20 20 20 20  UES('two');.    
12a50 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
12a60 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
12a70 56 41 4c 55 45 53 28 27 74 68 72 65 65 27 29 3b  VALUES('three');
12a80 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
12a90 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
12aa0 66 6f 75 72 27 29 3b 0a 20 20 20 20 7d 0a 20 20  four');.    }.  
12ab0 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 62 61    forcedelete ba
12ac0 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 66 69  k-journal.    fi
12ad0 6c 65 20 72 65 6e 61 6d 65 20 74 65 73 74 2e 64  le rename test.d
12ae0 62 2d 6a 6f 75 72 6e 61 6c 20 62 61 6b 2d 6a 6f  b-journal bak-jo
12af0 75 72 6e 61 6c 0a 0a 20 20 20 20 63 61 74 63 68  urnal..    catch
12b00 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b  sql COMMIT.  } {
12b10 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  1 {disk I/O erro
12b20 72 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70  r}}..  do_test p
12b30 61 67 65 72 31 2d 33 33 2e 32 20 7b 0a 20 20 20  ager1-33.2 {.   
12b40 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 62 61 6b   file rename bak
12b50 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62  -journal test.db
12b60 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 65 78 65  -journal.    exe
12b70 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
12b80 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 6f  FROM t1 }.  } {o
12b90 6e 65 20 74 77 6f 7d 0a 7d 0a 0a 66 69 6e 69 73  ne two}.}..finis
12ba0 68 5f 74 65 73 74 0a                             h_test.