/ Hex Artifact Content
Login

Artifact 30e63afd425fea12285e9ec5fa1fd000808031f1:


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 73 65 74 20 74 65 73 74 70 72  n.tcl.set testpr
0210: 65 66 69 78 20 70 61 67 65 72 31 0a 0a 23 20 44  efix pager1..# D
0220: 6f 20 6e 6f 74 20 75 73 65 20 61 20 63 6f 64 65  o not use a code
0230: 63 20 66 6f 72 20 74 65 73 74 73 20 69 6e 20 74  c for tests in t
0240: 68 69 73 20 66 69 6c 65 2c 20 61 73 20 74 68 65  his file, as the
0250: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
0260: 73 0a 23 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  s.# manipulated 
0270: 64 69 72 65 63 74 6c 79 20 75 73 69 6e 67 20 74  directly using t
0280: 63 6c 20 73 63 72 69 70 74 73 20 28 75 73 69 6e  cl scripts (usin
0290: 67 20 74 68 65 20 5b 68 65 78 69 6f 5f 77 72 69  g the [hexio_wri
02a0: 74 65 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0a 23 0a  te] command)..#.
02b0: 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63 6f 64 65 63  do_not_use_codec
02c0: 0a 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 2e 2a  ..#.# pager1-1.*
02d0: 3a 20 54 65 73 74 20 69 6e 74 65 72 2d 70 72 6f  : Test inter-pro
02e0: 63 65 73 73 20 6c 6f 63 6b 69 6e 67 20 28 63 6c  cess locking (cl
02f0: 69 65 6e 74 73 20 69 6e 20 6d 75 6c 74 69 70 6c  ients in multipl
0300: 65 20 70 72 6f 63 65 73 73 65 73 29 2e 0a 23 0a  e processes)..#.
0310: 23 20 70 61 67 65 72 31 2d 32 2e 2a 3a 20 54 65  # pager1-2.*: Te
0320: 73 74 20 69 6e 74 72 61 2d 70 72 6f 63 65 73 73  st intra-process
0330: 20 6c 6f 63 6b 69 6e 67 20 28 6d 75 6c 74 69 70   locking (multip
0340: 6c 65 20 63 6c 69 65 6e 74 73 20 69 6e 20 74 68  le clients in th
0350: 69 73 20 70 72 6f 63 65 73 73 29 2e 0a 23 0a 23  is process)..#.#
0360: 20 70 61 67 65 72 31 2d 33 2e 2a 3a 20 53 61 76   pager1-3.*: Sav
0370: 65 70 6f 69 6e 74 20 72 65 6c 61 74 65 64 20 74  epoint related t
0380: 65 73 74 73 2e 0a 23 0a 23 20 70 61 67 65 72 31  ests..#.# pager1
0390: 2d 34 2e 2a 3a 20 48 6f 74 2d 6a 6f 75 72 6e 61  -4.*: Hot-journa
03a0: 6c 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e  l related tests.
03b0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 2a 3a  .#.# pager1-5.*:
03c0: 20 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74   Cases related t
03d0: 6f 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  o multi-file com
03e0: 6d 69 74 73 2e 0a 23 0a 23 20 70 61 67 65 72 31  mits..#.# pager1
03f0: 2d 36 2e 2a 3a 20 43 61 73 65 73 20 72 65 6c 61  -6.*: Cases rela
0400: 74 65 64 20 74 6f 20 22 50 52 41 47 4d 41 20 6d  ted to "PRAGMA m
0410: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a 23  ax_page_count".#
0420: 0a 23 20 70 61 67 65 72 31 2d 37 2e 2a 3a 20 43  .# pager1-7.*: C
0430: 61 73 65 73 20 73 70 65 63 69 66 69 63 20 74 6f  ases specific to
0440: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
0450: 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 22 0a  _mode=TRUNCATE".
0460: 23 0a 23 20 70 61 67 65 72 31 2d 38 2e 2a 3a 20  #.# pager1-8.*: 
0470: 43 61 73 65 73 20 75 73 69 6e 67 20 74 65 6d 70  Cases using temp
0480: 6f 72 61 72 79 20 61 6e 64 20 69 6e 2d 6d 65 6d  orary and in-mem
0490: 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 23  ory databases..#
04a0: 0a 23 20 70 61 67 65 72 31 2d 39 2e 2a 3a 20 54  .# pager1-9.*: T
04b0: 65 73 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20  ests related to 
04c0: 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 2e 0a  the backup API..
04d0: 23 0a 23 20 70 61 67 65 72 31 2d 31 30 2e 2a 3a  #.# pager1-10.*:
04e0: 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 61   Test that the a
04f0: 73 73 75 6d 65 64 20 66 69 6c 65 2d 73 79 73 74  ssumed file-syst
0500: 65 6d 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  em sector-size i
0510: 73 20 6c 69 6d 69 74 65 64 20 74 6f 0a 23 20 20  s limited to.#  
0520: 20 20 20 20 20 20 20 20 20 20 20 20 36 34 4b 42              64KB
0530: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 32 2e  ..#.# pager1-12.
0540: 2a 3a 20 54 65 73 74 73 20 69 6e 76 6f 6c 76 69  *: Tests involvi
0550: 6e 67 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f  ng "PRAGMA page_
0560: 73 69 7a 65 22 0a 23 0a 23 20 70 61 67 65 72 31  size".#.# pager1
0570: 2d 31 33 2e 2a 3a 20 43 61 73 65 73 20 73 70 65  -13.*: Cases spe
0580: 63 69 66 69 63 20 74 6f 20 22 50 52 41 47 4d 41  cific to "PRAGMA
0590: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
05a0: 52 53 49 53 54 22 0a 23 0a 23 20 70 61 67 65 72  RSIST".#.# pager
05b0: 31 2d 31 34 2e 2a 3a 20 43 61 73 65 73 20 73 70  1-14.*: Cases sp
05c0: 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47 4d  ecific to "PRAGM
05d0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f  A journal_mode=O
05e0: 46 46 22 0a 23 0a 23 20 70 61 67 65 72 31 2d 31  FF".#.# pager1-1
05f0: 35 2e 2a 3a 20 56 61 72 79 69 6e 67 20 73 71 6c  5.*: Varying sql
0600: 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69 6c  ite3_vfs.szOsFil
0610: 65 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 36 2e  e.#.# pager1-16.
0620: 2a 3a 20 56 61 72 79 69 6e 67 20 73 71 6c 69 74  *: Varying sqlit
0630: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
0640: 65 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 37 2e  e.#.# pager1-17.
0650: 2a 3a 20 54 65 73 74 73 20 72 65 6c 61 74 65 64  *: Tests related
0660: 20 74 6f 20 22 50 52 41 47 4d 41 20 6f 6d 69 74   to "PRAGMA omit
0670: 5f 72 65 61 64 6c 6f 63 6b 22 0a 23 20 20 20 20  _readlock".#    
0680: 20 20 20 20 20 20 20 20 20 20 28 54 68 65 20 6f            (The o
0690: 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 70 72 61  mit_readlock pra
06a0: 67 6d 61 20 68 61 73 20 62 65 65 6e 20 72 65 6d  gma has been rem
06b0: 6f 76 65 64 20 61 6e 64 20 73 6f 20 68 61 76 65  oved and so have
06c0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
06d0: 74 68 65 73 65 20 74 65 73 74 73 2e 29 0a 23 0a  these tests.).#.
06e0: 23 20 70 61 67 65 72 31 2d 31 38 2e 2a 3a 20 54  # pager1-18.*: T
06f0: 65 73 74 20 74 68 61 74 20 74 68 65 20 70 61 67  est that the pag
0700: 65 72 20 6c 61 79 65 72 20 72 65 73 70 6f 6e 64  er layer respond
0710: 73 20 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74  s correctly if t
0720: 68 65 20 62 2d 74 72 65 65 0a 23 20 20 20 20 20  he b-tree.#     
0730: 20 20 20 20 20 20 20 20 20 72 65 71 75 65 73 74           request
0740: 73 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 61 67  s an invalid pag
0750: 65 20 6e 75 6d 62 65 72 20 28 64 75 65 20 74 6f  e number (due to
0760: 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 29 2e   db corruption).
0770: 0a 23 0a 0a 70 72 6f 63 20 72 65 63 75 72 73 69  .#..proc recursi
0780: 76 65 5f 73 65 6c 65 63 74 20 7b 69 64 20 74 61  ve_select {id ta
0790: 62 6c 65 20 7b 73 63 72 69 70 74 20 7b 7d 7d 7d  ble {script {}}}
07a0: 20 7b 0a 20 20 73 65 74 20 63 6e 74 20 30 0a 20   {.  set cnt 0. 
07b0: 20 64 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54   db eval "SELECT
07c0: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 24   rowid, * FROM $
07d0: 74 61 62 6c 65 20 57 48 45 52 45 20 72 6f 77 69  table WHERE rowi
07e0: 64 20 3d 20 28 24 69 64 2d 31 29 22 20 7b 0a 20  d = ($id-1)" {. 
07f0: 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c     recursive_sel
0800: 65 63 74 20 24 72 6f 77 69 64 20 24 74 61 62 6c  ect $rowid $tabl
0810: 65 20 24 73 63 72 69 70 74 0a 20 20 20 20 69 6e  e $script.    in
0820: 63 72 20 63 6e 74 0a 20 20 7d 0a 20 20 69 66 20  cr cnt.  }.  if 
0830: 7b 24 63 6e 74 3d 3d 30 7d 20 7b 20 65 76 61 6c  {$cnt==0} { eval
0840: 20 24 73 63 72 69 70 74 20 7d 0a 7d 0a 0a 73 65   $script }.}..se
0850: 74 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  t a_string_count
0860: 65 72 20 31 0a 70 72 6f 63 20 61 5f 73 74 72 69  er 1.proc a_stri
0870: 6e 67 20 7b 6e 7d 20 7b 0a 20 20 67 6c 6f 62 61  ng {n} {.  globa
0880: 6c 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  l a_string_count
0890: 65 72 0a 20 20 69 6e 63 72 20 61 5f 73 74 72 69  er.  incr a_stri
08a0: 6e 67 5f 63 6f 75 6e 74 65 72 0a 20 20 73 74 72  ng_counter.  str
08b0: 69 6e 67 20 72 61 6e 67 65 20 5b 73 74 72 69 6e  ing range [strin
08c0: 67 20 72 65 70 65 61 74 20 22 24 7b 61 5f 73 74  g repeat "${a_st
08d0: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 7d 2e 22 20  ring_counter}." 
08e0: 24 6e 5d 20 31 20 24 6e 0a 7d 0a 64 62 20 66 75  $n] 1 $n.}.db fu
08f0: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
0900: 72 69 6e 67 0a 0a 64 6f 5f 6d 75 6c 74 69 63 6c  ring..do_multicl
0910: 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 0a  ient_test tn {..
0920: 20 20 23 20 43 72 65 61 74 65 20 61 6e 64 20 70    # Create and p
0930: 6f 70 75 6c 61 74 65 20 61 20 64 61 74 61 62 61  opulate a databa
0940: 73 65 20 74 61 62 6c 65 20 75 73 69 6e 67 20 63  se table using c
0950: 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 2e 20  onnection [db]. 
0960: 43 68 65 63 6b 20 0a 20 20 23 20 74 68 61 74 20  Check .  # that 
0970: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64 62 32  connections [db2
0980: 5d 20 61 6e 64 20 5b 64 62 33 5d 20 63 61 6e 20  ] and [db3] can 
0990: 73 65 65 20 74 68 65 20 73 63 68 65 6d 61 20 61  see the schema a
09a0: 6e 64 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a  nd content..  #.
09b0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
09c0: 2d 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c  -$tn.1 {.    sql
09d0: 31 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  1 {.      CREATE
09e0: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
09f0: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
0a00: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
0a10: 69 31 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20  i1 ON t1(b);.   
0a20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0a30: 31 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65  1 VALUES(1, 'one
0a40: 27 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  '); INSERT INTO 
0a50: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77  t1 VALUES(2, 'tw
0a60: 6f 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  o');.    }.  } {
0a70: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
0a80: 72 31 2d 24 74 6e 2e 32 20 7b 20 73 71 6c 32 20  r1-$tn.2 { sql2 
0a90: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0aa0: 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20  t1 } } {1 one 2 
0ab0: 74 77 6f 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  two}.  do_test p
0ac0: 61 67 65 72 31 2d 24 74 6e 2e 33 20 7b 20 73 71  ager1-$tn.3 { sq
0ad0: 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l3 { SELECT * FR
0ae0: 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65  OM t1 } } {1 one
0af0: 20 32 20 74 77 6f 7d 0a 0a 20 20 23 20 4f 70 65   2 two}..  # Ope
0b00: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
0b10: 61 6e 64 20 61 64 64 20 61 20 72 6f 77 20 75 73  and add a row us
0b20: 69 6e 67 20 5b 64 62 5d 2e 20 54 68 69 73 20 70  ing [db]. This p
0b30: 75 74 73 20 5b 64 62 5d 20 69 6e 0a 20 20 23 20  uts [db] in.  # 
0b40: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
0b50: 43 68 65 63 6b 20 74 68 61 74 20 63 6f 6e 6e 65  Check that conne
0b60: 63 74 69 6f 6e 73 20 5b 64 62 32 5d 20 61 6e 64  ctions [db2] and
0b70: 20 5b 64 62 33 5d 20 63 61 6e 20 73 74 69 6c 6c   [db3] can still
0b80: 0a 20 20 23 20 72 65 61 64 20 74 68 65 20 64 61  .  # read the da
0b90: 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 61  tabase content a
0ba0: 73 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  s it was before 
0bb0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0bc0: 77 61 73 0a 20 20 23 20 6f 70 65 6e 65 64 2e 20  was.  # opened. 
0bd0: 5b 64 62 5d 20 73 68 6f 75 6c 64 20 73 65 65 20  [db] should see 
0be0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 72 6f 77  the inserted row
0bf0: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
0c00: 70 61 67 65 72 31 2d 24 74 6e 2e 34 20 7b 0a 20  pager1-$tn.4 {. 
0c10: 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20     sql1 {.      
0c20: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49  BEGIN;.        I
0c30: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0c40: 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65 27 29  LUES(3, 'three')
0c50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20  ;.    }.  } {}. 
0c60: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
0c70: 24 74 6e 2e 35 20 7b 20 73 71 6c 32 20 7b 20 53  $tn.5 { sql2 { S
0c80: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0c90: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
0ca0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
0cb0: 72 31 2d 24 74 6e 2e 37 20 7b 20 73 71 6c 31 20  r1-$tn.7 { sql1 
0cc0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0cd0: 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20  t1 } } {1 one 2 
0ce0: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20  two 3 three}..  
0cf0: 23 20 5b 64 62 5d 20 73 74 69 6c 6c 20 68 61 73  # [db] still has
0d00: 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
0d10: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 43 68 65 63  ransaction. Chec
0d20: 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 65 76  k that this prev
0d30: 65 6e 74 73 0a 20 20 23 20 6f 74 68 65 72 20 63  ents.  # other c
0d40: 6f 6e 6e 65 63 74 69 6f 6e 73 20 28 73 70 65 63  onnections (spec
0d50: 69 66 69 63 61 6c 6c 79 20 5b 64 62 32 5d 29 20  ifically [db2]) 
0d60: 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f 20  from writing to 
0d70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
0d80: 23 0a 20 20 23 20 45 76 65 6e 20 69 66 20 5b 64  #.  # Even if [d
0d90: 62 32 5d 20 6f 70 65 6e 73 20 61 20 74 72 61 6e  b2] opens a tran
0da0: 73 61 63 74 69 6f 6e 20 66 69 72 73 74 2c 20 69  saction first, i
0db0: 74 20 6d 61 79 20 6e 6f 74 20 77 72 69 74 65 20  t may not write 
0dc0: 74 6f 20 74 68 65 0a 20 20 23 20 64 61 74 61 62  to the.  # datab
0dd0: 61 73 65 2e 20 41 66 74 65 72 20 74 68 65 20 61  ase. After the a
0de0: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
0df0: 74 68 65 20 64 62 20 77 69 74 68 69 6e 20 61 20  the db within a 
0e00: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 0a 20 20  transaction, .  
0e10: 23 20 5b 64 62 32 5d 20 69 73 20 6c 65 66 74 20  # [db2] is left 
0e20: 77 69 74 68 20 61 6e 20 6f 70 65 6e 20 74 72 61  with an open tra
0e30: 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 6f  nsaction, but no
0e40: 74 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  t a read-lock on
0e50: 0a 20 20 23 20 74 68 65 20 6d 61 69 6e 20 64 61  .  # the main da
0e60: 74 61 62 61 73 65 2e 20 53 6f 20 69 74 20 64 6f  tabase. So it do
0e70: 65 73 20 6e 6f 74 20 70 72 65 76 65 6e 74 20 5b  es not prevent [
0e80: 64 62 5d 20 66 72 6f 6d 20 63 6f 6d 6d 69 74 74  db] from committ
0e90: 69 6e 67 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65  ing..  #.  do_te
0ea0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 38 20  st pager1-$tn.8 
0eb0: 7b 20 0a 20 20 20 20 63 73 71 6c 32 20 7b 20 55  { .    csql2 { U
0ec0: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d  PDATE t1 SET a =
0ed0: 20 61 20 2b 20 31 30 20 7d 0a 20 20 7d 20 7b 31   a + 10 }.  } {1
0ee0: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
0ef0: 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  cked}}.  do_test
0f00: 20 70 61 67 65 72 31 2d 24 74 6e 2e 39 20 7b 20   pager1-$tn.9 { 
0f10: 0a 20 20 20 20 63 73 71 6c 32 20 7b 20 0a 20 20  .    csql2 { .  
0f20: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0f30: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
0f40: 20 3d 20 61 20 2b 20 31 30 3b 0a 20 20 20 20 7d   = a + 10;.    }
0f50: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
0f60: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 20  e is locked}}.. 
0f70: 20 23 20 48 61 76 65 20 5b 64 62 5d 20 63 6f 6d   # Have [db] com
0f80: 6d 69 74 20 69 74 73 20 74 72 61 6e 73 61 63 74  mit its transact
0f90: 69 6f 6e 73 2e 20 43 68 65 63 6b 20 74 68 65 20  ions. Check the 
0fa0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
0fb0: 73 20 63 61 6e 0a 20 20 23 20 6e 6f 77 20 73 65  s can.  # now se
0fc0: 65 20 74 68 65 20 6e 65 77 20 64 61 74 61 62 61  e the new databa
0fd0: 73 65 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a  se content..  #.
0fe0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0ff0: 2d 24 74 6e 2e 31 30 20 7b 20 73 71 6c 31 20 7b  -$tn.10 { sql1 {
1000: 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20   COMMIT } } {}. 
1010: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1020: 24 74 6e 2e 31 31 20 7b 20 73 71 6c 31 20 7b 20  $tn.11 { sql1 { 
1030: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1040: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
1050: 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f  o 3 three}.  do_
1060: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1070: 31 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  12 { sql2 { SELE
1080: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
1090: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20   {1 one 2 two 3 
10a0: 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74  three}.  do_test
10b0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 33 20 7b   pager1-$tn.13 {
10c0: 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a   sql3 { SELECT *
10d0: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20   FROM t1 } } {1 
10e0: 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65  one 2 two 3 thre
10f0: 65 7d 0a 0a 20 20 23 20 43 68 65 63 6b 20 74 68  e}..  # Check th
1100: 61 74 2c 20 61 73 20 6e 6f 74 65 64 20 61 62 6f  at, as noted abo
1110: 76 65 2c 20 5b 64 62 32 5d 20 72 65 61 6c 6c 79  ve, [db2] really
1120: 20 64 69 64 20 6b 65 65 70 20 61 6e 20 6f 70 65   did keep an ope
1130: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  n transaction.  
1140: 23 20 61 66 74 65 72 20 74 68 65 20 61 74 74 65  # after the atte
1150: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 68 65  mpt to write the
1160: 20 64 61 74 61 62 61 73 65 20 66 61 69 6c 65 64   database failed
1170: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
1180: 70 61 67 65 72 31 2d 24 74 6e 2e 31 34 20 7b 20  pager1-$tn.14 { 
1190: 0a 20 20 20 20 63 73 71 6c 32 20 7b 20 42 45 47  .    csql2 { BEG
11a0: 49 4e 20 7d 20 0a 20 20 7d 20 7b 31 20 7b 63 61  IN } .  } {1 {ca
11b0: 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72 61  nnot start a tra
11c0: 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20  nsaction within 
11d0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 7d 7d 0a  a transaction}}.
11e0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11f0: 2d 24 74 6e 2e 31 35 20 7b 20 73 71 6c 32 20 7b  -$tn.15 { sql2 {
1200: 20 52 4f 4c 4c 42 41 43 4b 20 7d 20 7d 20 7b 7d   ROLLBACK } } {}
1210: 0a 0a 20 20 23 20 48 61 76 65 20 5b 64 62 32 5d  ..  # Have [db2]
1220: 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74   open a transact
1230: 69 6f 6e 20 61 6e 64 20 74 61 6b 65 20 61 20 72  ion and take a r
1240: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
1250: 64 61 74 61 62 61 73 65 2e 0a 20 20 23 20 43 68  database..  # Ch
1260: 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 70 72  eck that this pr
1270: 65 76 65 6e 74 73 20 5b 64 62 5d 20 66 72 6f 6d  events [db] from
1280: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1290: 64 61 74 61 62 61 73 65 20 28 6f 75 74 73 69 64  database (outsid
12a0: 65 0a 20 20 23 20 6f 66 20 61 6e 79 20 74 72 61  e.  # of any tra
12b0: 6e 73 61 63 74 69 6f 6e 29 2e 20 41 66 74 65 72  nsaction). After
12c0: 20 74 68 69 73 20 66 61 69 6c 73 2c 20 63 68 65   this fails, che
12d0: 63 6b 20 74 68 61 74 20 5b 64 62 33 5d 20 63 61  ck that [db3] ca
12e0: 6e 20 72 65 61 64 0a 20 20 23 20 74 68 65 20 64  n read.  # the d
12f0: 62 20 28 73 68 6f 77 69 6e 67 20 74 68 61 74 20  b (showing that 
1300: 5b 64 62 5d 20 64 69 64 20 6e 6f 74 20 74 61 6b  [db] did not tak
1310: 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
1320: 20 65 74 63 2e 29 0a 20 20 23 0a 20 20 64 6f 5f   etc.).  #.  do_
1330: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1340: 31 35 20 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b  15 { .    sql2 {
1350: 20 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a   BEGIN; SELECT *
1360: 20 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20   FROM t1; }.  } 
1370: 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74  {1 one 2 two 3 t
1380: 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  hree}.  do_test 
1390: 70 61 67 65 72 31 2d 24 74 6e 2e 31 36 20 7b 20  pager1-$tn.16 { 
13a0: 0a 20 20 20 20 63 73 71 6c 31 20 7b 20 55 50 44  .    csql1 { UPD
13b0: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61  ATE t1 SET a = a
13c0: 20 2b 20 31 30 20 7d 0a 20 20 7d 20 7b 31 20 7b   + 10 }.  } {1 {
13d0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
13e0: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ed}}.  do_test p
13f0: 61 67 65 72 31 2d 24 74 6e 2e 31 37 20 7b 20 73  ager1-$tn.17 { s
1400: 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql3 { SELECT * F
1410: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1420: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1430: 0a 0a 20 20 23 20 54 68 69 73 20 74 69 6d 65 2c  ..  # This time,
1440: 20 68 61 76 65 20 5b 64 62 5d 20 6f 70 65 6e 20   have [db] open 
1450: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
1460: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 65  fore writing the
1470: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 23 20 54   database..  # T
1480: 68 69 73 20 77 6f 72 6b 73 20 2d 20 5b 64 62 5d  his works - [db]
1490: 20 67 65 74 73 20 61 20 52 45 53 45 52 56 45 44   gets a RESERVED
14a0: 20 6c 6f 63 6b 20 77 68 69 63 68 20 64 6f 65 73   lock which does
14b0: 20 6e 6f 74 20 63 6f 6e 66 6c 69 63 74 20 77 69   not conflict wi
14c0: 74 68 0a 20 20 23 20 74 68 65 20 53 48 41 52 45  th.  # the SHARE
14d0: 44 20 6c 6f 63 6b 20 5b 64 62 32 5d 20 69 73 20  D lock [db2] is 
14e0: 68 6f 6c 64 69 6e 67 2e 0a 20 20 23 0a 20 20 64  holding..  #.  d
14f0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1500: 6e 2e 31 38 20 7b 20 0a 20 20 20 20 73 71 6c 31  n.18 { .    sql1
1510: 20 7b 20 0a 20 20 20 20 20 20 42 45 47 49 4e 3b   { .      BEGIN;
1520: 20 20 0a 20 20 20 20 20 20 55 50 44 41 54 45 20    .      UPDATE 
1530: 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31  t1 SET a = a + 1
1540: 30 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  0; .    }.  } {}
1550: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1560: 31 2d 24 74 6e 2d 31 39 20 7b 20 0a 20 20 20 20  1-$tn-19 { .    
1570: 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f  sql1 { PRAGMA lo
1580: 63 6b 5f 73 74 61 74 75 73 20 7d 20 0a 20 20 7d  ck_status } .  }
1590: 20 7b 6d 61 69 6e 20 72 65 73 65 72 76 65 64 20   {main reserved 
15a0: 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 20 20 64  temp closed}.  d
15b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
15c0: 6e 2d 32 30 20 7b 20 0a 20 20 20 20 73 71 6c 32  n-20 { .    sql2
15d0: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73   { PRAGMA lock_s
15e0: 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61  tatus } .  } {ma
15f0: 69 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20 63  in shared temp c
1600: 6c 6f 73 65 64 7d 0a 0a 20 20 23 20 43 68 65 63  losed}..  # Chec
1610: 6b 20 74 68 61 74 20 61 6c 6c 20 63 6f 6e 6e 65  k that all conne
1620: 63 74 69 6f 6e 73 20 63 61 6e 20 73 74 69 6c 6c  ctions can still
1630: 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
1640: 73 65 2e 20 4f 6e 6c 79 20 5b 64 62 5d 20 73 65  se. Only [db] se
1650: 65 73 0a 20 20 23 20 74 68 65 20 75 70 64 61 74  es.  # the updat
1660: 65 64 20 63 6f 6e 74 65 6e 74 20 28 61 73 20 74  ed content (as t
1670: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1680: 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 6d  as not been comm
1690: 69 74 74 65 64 20 79 65 74 29 2e 0a 20 20 23 0a  itted yet)..  #.
16a0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
16b0: 2d 24 74 6e 2e 32 31 20 7b 20 73 71 6c 31 20 7b  -$tn.21 { sql1 {
16c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
16d0: 31 20 7d 20 7d 20 7b 31 31 20 6f 6e 65 20 31 32  1 } } {11 one 12
16e0: 20 74 77 6f 20 31 33 20 74 68 72 65 65 7d 0a 20   two 13 three}. 
16f0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1700: 24 74 6e 2e 32 32 20 7b 20 73 71 6c 32 20 7b 20  $tn.22 { sql2 { 
1710: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1720: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
1730: 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f  o 3 three}.  do_
1740: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1750: 32 33 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  23 { sql3 { SELE
1760: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
1770: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20   {1 one 2 two 3 
1780: 74 68 72 65 65 7d 0a 0a 20 20 23 20 42 65 63 61  three}..  # Beca
1790: 75 73 65 20 5b 64 62 32 5d 20 73 74 69 6c 6c 20  use [db2] still 
17a0: 68 61 73 20 74 68 65 20 53 48 41 52 45 44 20 6c  has the SHARED l
17b0: 6f 63 6b 2c 20 5b 64 62 5d 20 69 73 20 75 6e 61  ock, [db] is una
17c0: 62 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ble to commit th
17d0: 65 0a 20 20 23 20 74 72 61 6e 73 61 63 74 69 6f  e.  # transactio
17e0: 6e 2e 20 49 66 20 69 74 20 74 72 69 65 73 2c 20  n. If it tries, 
17f0: 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
1800: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e  rned and the con
1810: 6e 65 63 74 69 6f 6e 20 0a 20 20 23 20 75 70 67  nection .  # upg
1820: 72 61 64 65 73 20 74 6f 20 61 20 50 45 4e 44 49  rades to a PENDI
1830: 4e 47 20 6c 6f 63 6b 2e 0a 20 20 23 0a 20 20 23  NG lock..  #.  #
1840: 20 4f 6e 63 65 20 74 68 69 73 20 68 61 70 70 65   Once this happe
1850: 6e 73 2c 20 5b 64 62 5d 20 63 61 6e 20 72 65 61  ns, [db] can rea
1860: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  d the database a
1870: 6e 64 20 73 65 65 20 74 68 65 20 6e 65 77 20 63  nd see the new c
1880: 6f 6e 74 65 6e 74 2c 0a 20 20 23 20 5b 64 62 32  ontent,.  # [db2
1890: 5d 20 28 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  ] (still holding
18a0: 20 53 48 41 52 45 44 29 20 63 61 6e 20 73 74 69   SHARED) can sti
18b0: 6c 6c 20 72 65 61 64 20 74 68 65 20 6f 6c 64 20  ll read the old 
18c0: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 5b 64 62  content, but [db
18d0: 33 5d 0a 20 20 23 20 28 6e 6f 74 20 68 6f 6c 64  3].  # (not hold
18e0: 69 6e 67 20 61 6e 79 20 6c 6f 63 6b 29 20 69 73  ing any lock) is
18f0: 20 70 72 65 76 65 6e 74 65 64 20 62 79 20 5b 64   prevented by [d
1900: 62 5d 27 73 20 50 45 4e 44 49 4e 47 20 66 72 6f  b]'s PENDING fro
1910: 6d 20 72 65 61 64 69 6e 67 0a 20 20 23 20 74 68  m reading.  # th
1920: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 23 0a  e database..  #.
1930: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1940: 2d 24 74 6e 2e 32 34 20 7b 20 63 73 71 6c 31 20  -$tn.24 { csql1 
1950: 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 31 20  { COMMIT } } {1 
1960: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
1970: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
1980: 70 61 67 65 72 31 2d 24 74 6e 2d 32 35 20 7b 20  pager1-$tn-25 { 
1990: 0a 20 20 20 20 73 71 6c 31 20 7b 20 50 52 41 47  .    sql1 { PRAG
19a0: 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d  MA lock_status }
19b0: 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 70 65 6e 64   .  } {main pend
19c0: 69 6e 67 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d  ing temp closed}
19d0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
19e0: 31 2d 24 74 6e 2e 32 36 20 7b 20 73 71 6c 31 20  1-$tn.26 { sql1 
19f0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1a00: 74 31 20 20 7d 20 7d 20 7b 31 31 20 6f 6e 65 20  t1  } } {11 one 
1a10: 31 32 20 74 77 6f 20 31 33 20 74 68 72 65 65 7d  12 two 13 three}
1a20: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1a30: 31 2d 24 74 6e 2e 32 37 20 7b 20 73 71 6c 32 20  1-$tn.27 { sql2 
1a40: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1a50: 74 31 20 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32  t1  } } {1 one 2
1a60: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20   two 3 three}.  
1a70: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1a80: 74 6e 2e 32 38 20 7b 20 63 73 71 6c 33 20 7b 20  tn.28 { csql3 { 
1a90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1aa0: 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73   } } {1 {databas
1ab0: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 20  e is locked}}.. 
1ac0: 20 23 20 48 61 76 65 20 5b 64 62 32 5d 20 63 6f   # Have [db2] co
1ad0: 6d 6d 69 74 20 69 74 73 20 72 65 61 64 20 74 72  mmit its read tr
1ae0: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 6c 65 61  ansaction, relea
1af0: 73 69 6e 67 20 74 68 65 20 53 48 41 52 45 44 20  sing the SHARED 
1b00: 6c 6f 63 6b 20 69 74 0a 20 20 23 20 69 73 20 68  lock it.  # is h
1b10: 6f 6c 64 69 6e 67 2e 20 4e 6f 77 2c 20 6e 65 69  olding. Now, nei
1b20: 74 68 65 72 20 5b 64 62 32 5d 20 6e 6f 72 20 5b  ther [db2] nor [
1b30: 64 62 33 5d 20 6d 61 79 20 72 65 61 64 20 74 68  db3] may read th
1b40: 65 20 64 61 74 61 62 61 73 65 20 28 61 73 20 5b  e database (as [
1b50: 64 62 5d 0a 20 20 23 20 69 73 20 73 74 69 6c 6c  db].  # is still
1b60: 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49   holding a PENDI
1b70: 4e 47 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65  NG)..  #.  do_te
1b80: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 39  st pager1-$tn.29
1b90: 20 7b 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54   { sql2 { COMMIT
1ba0: 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73   } } {}.  do_tes
1bb0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 33 30 20  t pager1-$tn.30 
1bc0: 7b 20 63 73 71 6c 32 20 7b 20 53 45 4c 45 43 54  { csql2 { SELECT
1bd0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1be0: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1bf0: 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ocked}}.  do_tes
1c00: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 33 31 20  t pager1-$tn.31 
1c10: 7b 20 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54  { csql3 { SELECT
1c20: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1c30: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1c40: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 5b 64 62  ocked}}..  # [db
1c50: 5d 20 69 73 20 6e 6f 77 20 61 62 6c 65 20 74 6f  ] is now able to
1c60: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
1c70: 73 61 63 74 69 6f 6e 2e 20 4f 6e 63 65 20 74 68  saction. Once th
1c80: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1c90: 20 0a 20 20 23 20 63 6f 6d 6d 69 74 74 65 64 2c   .  # committed,
1ca0: 20 61 6c 6c 20 74 68 72 65 65 20 63 6f 6e 6e 65   all three conne
1cb0: 63 74 69 6f 6e 73 20 63 61 6e 20 72 65 61 64 20  ctions can read 
1cc0: 74 68 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2e  the new content.
1cd0: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
1ce0: 61 67 65 72 31 2d 24 74 6e 2e 32 35 20 7b 20 73  ager1-$tn.25 { s
1cf0: 71 6c 31 20 7b 20 55 50 44 41 54 45 20 74 31 20  ql1 { UPDATE t1 
1d00: 53 45 54 20 61 20 3d 20 61 2b 31 30 20 7d 20 7d  SET a = a+10 } }
1d10: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
1d20: 67 65 72 31 2d 24 74 6e 2e 32 36 20 7b 20 73 71  ger1-$tn.26 { sq
1d30: 6c 31 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20  l1 { COMMIT } } 
1d40: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  {}.  do_test pag
1d50: 65 72 31 2d 24 74 6e 2e 32 37 20 7b 20 73 71 6c  er1-$tn.27 { sql
1d60: 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1 { SELECT * FRO
1d70: 4d 20 74 31 20 7d 20 7d 20 7b 32 31 20 6f 6e 65  M t1 } } {21 one
1d80: 20 32 32 20 74 77 6f 20 32 33 20 74 68 72 65 65   22 two 23 three
1d90: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1da0: 72 31 2d 24 74 6e 2e 32 37 20 7b 20 73 71 6c 32  r1-$tn.27 { sql2
1db0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1dc0: 20 74 31 20 7d 20 7d 20 7b 32 31 20 6f 6e 65 20   t1 } } {21 one 
1dd0: 32 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d  22 two 23 three}
1de0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1df0: 31 2d 24 74 6e 2e 32 38 20 7b 20 73 71 6c 33 20  1-$tn.28 { sql3 
1e00: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1e10: 74 31 20 7d 20 7d 20 7b 32 31 20 6f 6e 65 20 32  t1 } } {21 one 2
1e20: 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a  2 two 23 three}.
1e30: 0a 20 20 23 20 49 6e 73 74 61 6c 6c 20 61 20 62  .  # Install a b
1e40: 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy-handler for 
1e50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 2e  connection [db].
1e60: 0a 20 20 23 0a 20 20 73 65 74 20 3a 3a 6e 62 75  .  #.  set ::nbu
1e70: 73 79 20 5b 6c 69 73 74 5d 0a 20 20 70 72 6f 63  sy [list].  proc
1e80: 20 62 75 73 79 20 7b 6e 7d 20 7b 0a 20 20 20 20   busy {n} {.    
1e90: 6c 61 70 70 65 6e 64 20 3a 3a 6e 62 75 73 79 20  lappend ::nbusy 
1ea0: 24 6e 0a 20 20 20 20 69 66 20 7b 24 6e 3e 35 7d  $n.    if {$n>5}
1eb0: 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d   { sql2 COMMIT }
1ec0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 0a 20 20  .    return 0.  
1ed0: 7d 0a 20 20 64 62 20 62 75 73 79 20 62 75 73 79  }.  db busy busy
1ee0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
1ef0: 72 31 2d 24 74 6e 2e 32 39 20 7b 20 0a 20 20 20  r1-$tn.29 { .   
1f00: 20 73 71 6c 31 20 7b 20 42 45 47 49 4e 20 3b 20   sql1 { BEGIN ; 
1f10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1f20: 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 20  ALUES('x', 'y') 
1f30: 7d 20 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  } .  } {}.  do_t
1f40: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 33  est pager1-$tn.3
1f50: 30 20 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b 20  0 { .    sql2 { 
1f60: 42 45 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a  BEGIN ; SELECT *
1f70: 20 46 52 4f 4d 20 74 31 20 7d 20 0a 20 20 7d 20   FROM t1 } .  } 
1f80: 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32  {21 one 22 two 2
1f90: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
1fa0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 33 31  st pager1-$tn.31
1fb0: 20 7b 20 73 71 6c 31 20 43 4f 4d 4d 49 54 20 7d   { sql1 COMMIT }
1fc0: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
1fd0: 67 65 72 31 2d 24 74 6e 2e 33 32 20 7b 20 73 65  ger1-$tn.32 { se
1fe0: 74 20 3a 3a 6e 62 75 73 79 20 7d 20 7b 30 20 31  t ::nbusy } {0 1
1ff0: 20 32 20 33 20 34 20 35 20 36 7d 0a 7d 0a 0a 23   2 3 4 5 6}.}..#
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 61 76 65  ---------.# Save
2050: 70 6f 69 6e 74 20 72 65 6c 61 74 65 64 20 74 65  point related te
2060: 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61  st cases..#.# pa
2070: 67 65 72 31 2d 33 2e 31 2e 32 2e 2a 3a 20 46 6f  ger1-3.1.2.*: Fo
2080: 72 63 65 20 61 20 73 61 76 65 70 6f 69 6e 74 20  rce a savepoint 
2090: 72 6f 6c 6c 62 61 63 6b 20 74 6f 20 63 61 75 73  rollback to caus
20a0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
20b0: 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ile.#           
20c0: 20 20 20 20 20 20 74 6f 20 67 72 6f 77 2e 0a 23        to grow..#
20d0: 0a 23 20 70 61 67 65 72 31 2d 33 2e 31 2e 33 2e  .# pager1-3.1.3.
20e0: 2a 3a 20 55 73 65 20 61 20 6a 6f 75 72 6e 61 6c  *: Use a journal
20f0: 20 63 72 65 61 74 65 64 20 69 6e 20 73 79 6e 63   created in sync
2100: 68 72 6f 6e 6f 75 73 3d 6f 66 66 20 6d 6f 64 65  hronous=off mode
2110: 20 61 73 20 70 61 72 74 0a 23 20 20 20 20 20 20   as part.#      
2120: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 61 20             of a 
2130: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
2140: 63 6b 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 70  ck..# .do_test p
2150: 61 67 65 72 31 2d 33 2e 31 2e 31 20 7b 0a 20 20  ager1-3.1.1 {.  
2160: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
2170: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
2180: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
2190: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
21a0: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
21b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
21c0: 6f 75 6e 74 65 72 28 0a 20 20 20 20 20 20 69 20  ounter(.      i 
21d0: 43 48 45 43 4b 20 28 69 3c 35 29 2c 20 0a 20 20  CHECK (i<5), .  
21e0: 20 20 20 20 75 20 43 48 45 43 4b 20 28 75 3c 31      u CHECK (u<1
21f0: 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e  0).    );.    IN
2200: 53 45 52 54 20 49 4e 54 4f 20 63 6f 75 6e 74 65  SERT INTO counte
2210: 72 20 56 41 4c 55 45 53 28 30 2c 20 30 29 3b 0a  r VALUES(0, 0);.
2220: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
2230: 45 52 20 74 72 31 20 41 46 54 45 52 20 49 4e 53  ER tr1 AFTER INS
2240: 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a  ERT ON t1 BEGIN.
2250: 20 20 20 20 20 20 55 50 44 41 54 45 20 63 6f 75        UPDATE cou
2260: 6e 74 65 72 20 53 45 54 20 69 20 3d 20 69 2b 31  nter SET i = i+1
2270: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43  ;.    END;.    C
2280: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
2290: 32 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f  2 AFTER UPDATE O
22a0: 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20  N t1 BEGIN.     
22b0: 20 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72 20   UPDATE counter 
22c0: 53 45 54 20 75 20 3d 20 75 2b 31 3b 0a 20 20 20  SET u = u+1;.   
22d0: 20 45 4e 44 3b 0a 20 20 7d 0a 20 20 65 78 65 63   END;.  }.  exec
22e0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
22f0: 52 4f 4d 20 63 6f 75 6e 74 65 72 20 7d 0a 7d 20  ROM counter }.} 
2300: 7b 30 20 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  {0 0}..do_execsq
2310: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2320: 31 2e 32 20 7b 0a 20 20 50 52 41 47 4d 41 20 63  1.2 {.  PRAGMA c
2330: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
2340: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
2350: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2360: 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(1, randomblob
2370: 28 31 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  (1500));.    INS
2380: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2390: 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(2, randomblob
23a0: 28 31 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  (1500));.    INS
23b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
23c0: 45 53 28 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(3, randomblob
23d0: 28 31 35 30 30 29 29 3b 0a 20 20 20 20 53 45 4c  (1500));.    SEL
23e0: 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74  ECT * FROM count
23f0: 65 72 3b 0a 7d 20 7b 33 20 30 7d 0a 64 6f 5f 63  er;.} {3 0}.do_c
2400: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67  atchsql_test pag
2410: 65 72 31 2d 33 2e 31 2e 33 20 7b 0a 20 20 20 20  er1-3.1.3 {.    
2420: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2430: 45 4c 45 43 54 20 61 2b 33 2c 20 72 61 6e 64 6f  ELECT a+3, rando
2440: 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
2450: 20 74 31 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74 72   t1.} {1 {constr
2460: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
2470: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
2480: 67 65 72 31 2d 33 2e 34 20 7b 20 53 45 4c 45 43  ger1-3.4 { SELEC
2490: 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74 65 72  T * FROM counter
24a0: 20 7d 20 7b 33 20 30 7d 0a 64 6f 5f 65 78 65 63   } {3 0}.do_exec
24b0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
24c0: 33 2e 35 20 7b 20 53 45 4c 45 43 54 20 61 20 46  3.5 { SELECT a F
24d0: 52 4f 4d 20 74 31 20 7d 20 7b 31 20 32 20 33 7d  ROM t1 } {1 2 3}
24e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
24f0: 20 70 61 67 65 72 31 2d 33 2e 36 20 7b 20 43 4f   pager1-3.6 { CO
2500: 4d 4d 49 54 20 7d 20 7b 7d 0a 0a 66 6f 72 65 61  MMIT } {}..forea
2510: 63 68 20 7b 74 6e 20 73 71 6c 20 74 63 6c 7d 20  ch {tn sql tcl} 
2520: 7b 0a 20 20 37 20 20 7b 20 50 52 41 47 4d 41 20  {.  7  { PRAGMA 
2530: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f  synchronous = NO
2540: 52 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20 74 65  RMAL ; PRAGMA te
2550: 6d 70 5f 73 74 6f 72 65 20 3d 20 30 20 7d 20 7b  mp_store = 0 } {
2560: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
2570: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74  -default 1.    t
2580: 76 20 64 65 76 63 68 61 72 20 73 61 66 65 5f 61  v devchar safe_a
2590: 70 70 65 6e 64 0a 20 20 7d 0a 20 20 38 20 20 7b  ppend.  }.  8  {
25a0: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
25b0: 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50  ous = NORMAL ; P
25c0: 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
25d0: 20 3d 20 32 20 7d 20 7b 0a 20 20 20 20 74 65 73   = 2 } {.    tes
25e0: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
25f0: 20 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61   1.    tv devcha
2600: 72 20 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 7d  r sequential.  }
2610: 0a 20 20 39 20 20 7b 20 50 52 41 47 4d 41 20 73  .  9  { PRAGMA s
2620: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c  ynchronous = FUL
2630: 4c 20 7d 20 7b 20 7d 0a 20 20 31 30 20 7b 20 50  L } { }.  10 { P
2640: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
2650: 73 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20 7b 20 7d  s = NORMAL } { }
2660: 0a 20 20 31 31 20 7b 20 50 52 41 47 4d 41 20 73  .  11 { PRAGMA s
2670: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46  ynchronous = OFF
2680: 20 7d 20 7b 20 7d 0a 20 20 31 32 20 7b 20 50 52   } { }.  12 { PR
2690: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
26a0: 20 3d 20 46 55 4c 4c 20 3b 20 50 52 41 47 4d 41   = FULL ; PRAGMA
26b0: 20 66 75 6c 6c 66 73 79 6e 63 20 3d 20 31 20 7d   fullfsync = 1 }
26c0: 20 7b 20 7d 0a 20 20 31 33 20 7b 20 50 52 41 47   { }.  13 { PRAG
26d0: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
26e0: 20 46 55 4c 4c 20 7d 20 7b 0a 20 20 20 20 74 65   FULL } {.    te
26f0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
2700: 74 20 31 0a 20 20 20 20 74 76 20 64 65 76 63 68  t 1.    tv devch
2710: 61 72 20 73 65 71 75 65 6e 74 69 61 6c 0a 20 20  ar sequential.  
2720: 7d 0a 20 20 31 34 20 7b 20 50 52 41 47 4d 41 20  }.  14 { PRAGMA 
2730: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 45  locking_mode = E
2740: 58 43 4c 55 53 49 56 45 20 7d 20 7b 0a 20 20 7d  XCLUSIVE } {.  }
2750: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  .} {.  do_test p
2760: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 31 20 7b 0a  ager1-3.$tn.1 {.
2770: 20 20 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20      eval $tcl.  
2780: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
2790: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20  e_and_reopen.   
27a0: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
27b0: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65  g a_string.    e
27c0: 78 65 63 73 71 6c 20 24 73 71 6c 0a 20 20 20 20  xecsql $sql.    
27d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
27e0: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
27f0: 75 6d 20 3d 20 32 3b 0a 20 20 20 20 20 20 50 52  um = 2;.      PR
2800: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
2810: 3d 20 31 30 3b 0a 20 20 20 20 20 20 43 52 45 41  = 10;.      CREA
2820: 54 45 20 54 41 42 4c 45 20 7a 28 78 20 49 4e 54  TE TABLE z(x INT
2830: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2840: 2c 20 79 29 3b 0a 20 20 20 20 20 20 42 45 47 49  , y);.      BEGI
2850: 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  N;.        INSER
2860: 54 20 49 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28  T INTO z VALUES(
2870: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38  NULL, a_string(8
2880: 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  00));.        IN
2890: 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45  SERT INTO z SELE
28a0: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
28b0: 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20  g(800) FROM z;  
28c0: 20 20 20 2d 2d 20 20 20 32 0a 20 20 20 20 20 20     --   2.      
28d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
28e0: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
28f0: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
2900: 7a 3b 20 20 20 20 20 2d 2d 20 20 20 34 0a 20 20  z;     --   4.  
2910: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2920: 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c  O z SELECT NULL,
2930: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
2940: 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20  ROM z;     --   
2950: 38 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  8.        INSERT
2960: 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e   INTO z SELECT N
2970: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30  ULL, a_string(80
2980: 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d  0) FROM z;     -
2990: 2d 20 20 31 36 0a 20 20 20 20 20 20 20 20 49 4e  -  16.        IN
29a0: 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45  SERT INTO z SELE
29b0: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
29c0: 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20  g(800) FROM z;  
29d0: 20 20 20 2d 2d 20 20 33 32 0a 20 20 20 20 20 20     --  32.      
29e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
29f0: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
2a00: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
2a10: 7a 3b 20 20 20 20 20 2d 2d 20 20 36 34 0a 20 20  z;     --  64.  
2a20: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2a30: 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c  O z SELECT NULL,
2a40: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
2a50: 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 31 32  ROM z;     -- 12
2a60: 38 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  8.        INSERT
2a70: 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e   INTO z SELECT N
2a80: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30  ULL, a_string(80
2a90: 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d  0) FROM z;     -
2aa0: 2d 20 32 35 36 0a 20 20 20 20 20 20 43 4f 4d 4d  - 256.      COMM
2ab0: 49 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  IT;.    }.    ex
2ac0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 61  ecsql { PRAGMA a
2ad0: 75 74 6f 5f 76 61 63 75 75 6d 20 7d 0a 20 20 7d  uto_vacuum }.  }
2ae0: 20 7b 32 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71   {2}.  do_execsq
2af0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2b00: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 42 45 47 49  $tn.2 {.    BEGI
2b10: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
2b20: 49 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55  INTO z VALUES(NU
2b30: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2b40: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
2b50: 20 49 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e   INTO z VALUES(N
2b60: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30  ULL, a_string(80
2b70: 30 29 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50  0));.      SAVEP
2b80: 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20  OINT one;.      
2b90: 20 20 55 50 44 41 54 45 20 7a 20 53 45 54 20 79    UPDATE z SET y
2ba0: 20 3d 20 4e 55 4c 4c 20 57 48 45 52 45 20 78 3e   = NULL WHERE x>
2bb0: 32 35 36 3b 0a 20 20 20 20 20 20 20 20 50 52 41  256;.        PRA
2bc0: 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f  GMA incremental_
2bd0: 76 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 20 20  vacuum;.        
2be0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2bf0: 46 52 4f 4d 20 7a 20 57 48 45 52 45 20 78 20 3c  FROM z WHERE x <
2c00: 20 31 30 30 3b 0a 20 20 20 20 20 20 52 4f 4c 4c   100;.      ROLL
2c10: 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20  BACK TO one;.   
2c20: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 20 7b 39 39   COMMIT;.  } {99
2c30: 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  }..  do_execsql_
2c40: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74  test pager1-3.$t
2c50: 6e 2e 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  n.3 {.    BEGIN;
2c60: 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  .      SAVEPOINT
2c70: 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50   one;.        UP
2c80: 44 41 54 45 20 7a 20 53 45 54 20 79 20 3d 20 79  DATE z SET y = y
2c90: 7c 7c 78 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42  ||x;.      ROLLB
2ca0: 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20  ACK TO one;.    
2cb0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45  COMMIT;.    SELE
2cc0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2cd0: 20 7a 3b 0a 20 20 7d 20 7b 32 35 38 7d 0a 0a 20   z;.  } {258}.. 
2ce0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2cf0: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 34 20   pager1-3.$tn.4 
2d00: 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  {.    SAVEPOINT 
2d10: 6f 6e 65 3b 0a 20 20 20 20 20 20 55 50 44 41 54  one;.      UPDAT
2d20: 45 20 7a 20 53 45 54 20 79 20 3d 20 79 7c 7c 78  E z SET y = y||x
2d30: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  ;.    ROLLBACK T
2d40: 4f 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 20 20  O one;.  } {}.  
2d50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2d60: 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 35 20 7b  pager1-3.$tn.5 {
2d70: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
2d80: 74 28 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 20  t(*) FROM z;.   
2d90: 20 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20   RELEASE one;.  
2da0: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
2db0: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 7b 32  ty_check;.  } {2
2dc0: 35 38 20 6f 6b 7d 0a 0a 20 20 64 6f 5f 65 78 65  58 ok}..  do_exe
2dd0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
2de0: 2d 33 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 53  -3.$tn.6 {.    S
2df0: 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
2e00: 20 20 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20    RELEASE one;. 
2e10: 20 7d 20 7b 7d 0a 0a 20 20 64 62 20 63 6c 6f 73   } {}..  db clos
2e20: 65 0a 20 20 63 61 74 63 68 20 7b 20 74 76 20 64  e.  catch { tv d
2e30: 65 6c 65 74 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  elete }.}..#----
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 2d  ----------------
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e80: 2d 2d 2d 2d 2d 0a 23 20 48 6f 74 20 6a 6f 75 72  -----.# Hot jour
2e90: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 72 65 6c  nal rollback rel
2ea0: 61 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e  ated test cases.
2eb0: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 31 2e  .#.# pager1.4.1.
2ec0: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65  *: Test that the
2ed0: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 64 65   pager module de
2ee0: 6c 65 74 65 73 20 76 65 72 79 20 73 6d 61 6c 6c  letes very small
2ef0: 20 69 6e 76 61 6c 69 64 0a 23 20 20 20 20 20 20   invalid.#      
2f00: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
2f10: 20 66 69 6c 65 73 2e 0a 23 0a 23 20 70 61 67 65   files..#.# page
2f20: 72 31 2e 34 2e 32 2e 2a 3a 20 54 65 73 74 20 74  r1.4.2.*: Test t
2f30: 68 61 74 20 69 66 20 74 68 65 20 6d 61 73 74 65  hat if the maste
2f40: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
2f50: 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  r at the end of 
2f60: 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  a.#             
2f70: 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69    hot-journal fi
2f80: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
2f90: 20 63 6f 72 72 75 70 74 20 28 63 68 65 63 6b 73   corrupt (checks
2fa0: 75 6d 20 64 6f 65 73 20 6e 6f 74 0a 23 20 20 20  um does not.#   
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70              comp
2fc0: 75 74 65 29 20 74 68 65 20 61 73 73 6f 63 69 61  ute) the associa
2fd0: 74 65 64 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72  ted journal is r
2fe0: 6f 6c 6c 65 64 20 62 61 63 6b 20 28 61 6e 64 20  olled back (and 
2ff0: 6e 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  no.#            
3000: 20 20 20 78 41 63 63 65 73 73 28 29 20 63 61 6c     xAccess() cal
3010: 6c 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 74  l to check for t
3020: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
3030: 6e 79 20 6d 61 73 74 65 72 20 0a 23 20 20 20 20  ny master .#    
3040: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
3050: 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 64 65 29  al file is made)
3060: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 33  ..#.# pager1.4.3
3070: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68  .*: Test that th
3080: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3090: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 72 65 20  hot-journal are 
30a0: 69 67 6e 6f 72 65 64 20 69 66 20 74 68 65 0a 23  ignored if the.#
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
30c0: 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
30d0: 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
30e0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 70  ournal header ap
30f0: 70 65 61 72 20 74 6f 0a 23 20 20 20 20 20 20 20  pear to.#       
3100: 20 20 20 20 20 20 20 20 62 65 20 69 6e 76 61 6c          be inval
3110: 69 64 20 28 74 6f 6f 20 6c 61 72 67 65 2c 20 74  id (too large, t
3120: 6f 6f 20 73 6d 61 6c 6c 20 6f 72 20 6e 6f 74 20  oo small or not 
3130: 61 20 70 6f 77 65 72 20 6f 66 20 32 29 2e 0a 23  a power of 2)..#
3140: 0a 23 20 70 61 67 65 72 31 2e 34 2e 34 2e 2a 3a  .# pager1.4.4.*:
3150: 20 54 65 73 74 20 68 6f 74 2d 6a 6f 75 72 6e 61   Test hot-journa
3160: 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 6a 6f  l rollback of jo
3170: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 20  urnal file with 
3180: 61 20 6d 61 73 74 65 72 0a 23 20 20 20 20 20 20  a master.#      
3190: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
31a0: 20 70 6f 69 6e 74 65 72 20 67 65 6e 65 72 61 74   pointer generat
31b0: 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 22 50  ed in various "P
31c0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
31d0: 73 22 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s".#            
31e0: 20 20 20 6d 6f 64 65 73 2e 0a 23 0a 23 20 70 61     modes..#.# pa
31f0: 67 65 72 31 2e 34 2e 35 2e 2a 3a 20 54 65 73 74  ger1.4.5.*: Test
3200: 20 74 68 61 74 20 68 6f 74 2d 6a 6f 75 72 6e 61   that hot-journa
3210: 6c 20 72 6f 6c 6c 62 61 63 6b 20 73 74 6f 70 73  l rollback stops
3220: 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
3230: 73 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  s a.#           
3240: 20 20 20 20 6a 6f 75 72 6e 61 6c 2d 72 65 63 6f      journal-reco
3250: 72 64 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  rd for which the
3260: 20 63 68 65 63 6b 73 75 6d 20 66 61 69 6c 73 2e   checksum fails.
3270: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 36 2e  .#.# pager1.4.6.
3280: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 77 68 65  *: Test that whe
3290: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
32a0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 68 61   hot-journal tha
32b0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 23 20 20  t contains a.#  
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73               mas
32d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
32e0: 74 65 72 2c 20 74 68 65 20 6d 61 73 74 65 72 20  ter, the master 
32f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
3300: 64 65 6c 65 74 65 64 0a 23 20 20 20 20 20 20 20  deleted.#       
3310: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
3320: 6c 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  l the hot-journa
3330: 6c 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  ls that refer to
3340: 20 69 74 20 61 72 65 20 64 65 6c 65 74 65 64 2e   it are deleted.
3350: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 37 2e  .#.# pager1.4.7.
3360: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20  *: Test that if 
3370: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
3380: 6c 65 20 65 78 69 73 74 73 20 62 75 74 20 61 20  le exists but a 
3390: 63 6c 69 65 6e 74 20 63 61 6e 0a 23 20 20 20 20  client can.#    
33a0: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 20             open 
33b0: 69 74 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  it for reading o
33c0: 6e 6c 79 2c 20 74 68 65 20 64 61 74 61 62 61 73  nly, the databas
33d0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 63 63 65  e cannot be acce
33e0: 73 73 65 64 20 61 6e 64 0a 23 20 20 20 20 20 20  ssed and.#      
33f0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
3400: 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75  CANTOPEN is retu
3410: 72 6e 65 64 2e 0a 23 20 0a 64 6f 5f 74 65 73 74  rned..# .do_test
3420: 20 70 61 67 65 72 31 2e 34 2e 31 2e 31 20 7b 0a   pager1.4.1.1 {.
3430: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
3440: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
3450: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 43 52  xecsql { .    CR
3460: 45 41 54 45 20 54 41 42 4c 45 20 78 28 79 2c 20  EATE TABLE x(y, 
3470: 7a 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  z);.    INSERT I
3480: 4e 54 4f 20 78 20 56 41 4c 55 45 53 28 31 2c 20  NTO x VALUES(1, 
3490: 32 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 66 64  2);.  }.  set fd
34a0: 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a   [open test.db-j
34b0: 6f 75 72 6e 61 6c 20 77 5d 0a 20 20 70 75 74 73  ournal w].  puts
34c0: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20   -nonewline $fd 
34d0: 22 68 65 6c 6c 6f 77 6f 72 6c 64 22 0a 20 20 63  "helloworld".  c
34e0: 6c 6f 73 65 20 24 66 64 0a 20 20 66 69 6c 65 20  lose $fd.  file 
34f0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
3500: 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f  ournal.} {1}.do_
3510: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 31 2e  test pager1.4.1.
3520: 32 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45  2 { execsql { SE
3530: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 20 7d 20  LECT * FROM x } 
3540: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
3550: 70 61 67 65 72 31 2e 34 2e 31 2e 33 20 7b 20 66  pager1.4.1.3 { f
3560: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
3570: 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 7b 30 7d  db-journal } {0}
3580: 0a 0a 23 20 53 65 74 20 75 70 20 61 20 5b 74 65  ..# Set up a [te
3590: 73 74 76 66 73 5d 20 74 6f 20 73 6e 61 70 73 68  stvfs] to snapsh
35a0: 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ot the file-syst
35b0: 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 53  em just before S
35c0: 51 4c 69 74 65 0a 23 20 64 65 6c 65 74 65 73 20  QLite.# deletes 
35d0: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
35e0: 61 6c 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d  al to commit a m
35f0: 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
3600: 63 74 69 6f 6e 2e 0a 23 0a 23 20 49 6e 20 73 75  ction..#.# In su
3610: 62 73 65 71 75 65 6e 74 20 74 65 73 74 20 63 61  bsequent test ca
3620: 73 65 73 2c 20 69 6e 76 6f 6b 69 6e 67 20 5b 66  ses, invoking [f
3630: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
3640: 61 6e 64 5f 72 65 6f 70 65 6e 5d 20 73 65 74 73  and_reopen] sets
3650: 0a 23 20 75 70 20 74 68 65 20 66 69 6c 65 20 73  .# up the file s
3660: 79 73 74 65 6d 20 74 6f 20 63 6f 6e 74 61 69 6e  ystem to contain
3670: 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c 20   two databases, 
3680: 74 77 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  two hot-journal 
3690: 66 69 6c 65 73 20 61 6e 64 0a 23 20 61 20 6d 61  files and.# a ma
36a0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 23 0a  ster-journal..#.
36b0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
36c0: 2e 32 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73  .2.1 {.  testvfs
36d0: 20 74 73 74 76 66 73 20 2d 64 65 66 61 75 6c 74   tstvfs -default
36e0: 20 31 0a 20 20 74 73 74 76 66 73 20 66 69 6c 74   1.  tstvfs filt
36f0: 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 73 74  er xDelete.  tst
3700: 76 66 73 20 73 63 72 69 70 74 20 78 44 65 6c 65  vfs script xDele
3710: 74 65 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f  teCallback.  pro
3720: 63 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63  c xDeleteCallbac
3730: 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61  k {method file a
3740: 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66  rgs} {.    set f
3750: 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ile [file tail $
3760: 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 5b  file].    if { [
3770: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a  string match *mj
3780: 2a 20 24 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75  * $file] } { fau
3790: 6c 74 73 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d  ltsim_save }.  }
37a0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
37b0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
37c0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
37d0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
37e0: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48  sql {.    ATTACH
37f0: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
3800: 75 78 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  ux;.    PRAGMA j
3810: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
3820: 4c 45 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41  LETE;.    PRAGMA
3830: 20 6d 61 69 6e 2e 63 61 63 68 65 5f 73 69 7a 65   main.cache_size
3840: 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d   = 10;.    PRAGM
3850: 41 20 61 75 78 2e 63 61 63 68 65 5f 73 69 7a 65  A aux.cache_size
3860: 20 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54   = 10;.    CREAT
3870: 45 20 54 41 42 4c 45 20 74 31 28 61 20 55 4e 49  E TABLE t1(a UNI
3880: 51 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  QUE, b UNIQUE);.
3890: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
38a0: 20 61 75 78 2e 74 32 28 61 20 55 4e 49 51 55 45   aux.t2(a UNIQUE
38b0: 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  , b UNIQUE);.   
38c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
38d0: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
38e0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38f0: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
3900: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3910: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
3920: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
3930: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
3940: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3950: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
3960: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
3970: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
3980: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
3990: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42  * FROM t1;.    B
39a0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
39b0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
39c0: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29 2c  T a_string(201),
39d0: 20 61 5f 73 74 72 69 6e 67 28 33 30 31 29 20 46   a_string(301) F
39e0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e  ROM t1;.      IN
39f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
3a00: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 32  ECT a_string(202
3a10: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 32 29  ), a_string(302)
3a20: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
3a30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
3a40: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
3a50: 30 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  03), a_string(30
3a60: 33 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  3) FROM t1;.    
3a70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3a80: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
3a90: 28 32 30 34 29 2c 20 61 5f 73 74 72 69 6e 67 28  (204), a_string(
3aa0: 33 30 34 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  304) FROM t1;.  
3ab0: 20 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f      REPLACE INTO
3ac0: 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t2 SELECT * FRO
3ad0: 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  M t1;.    COMMIT
3ae0: 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
3af0: 0a 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65  .  tstvfs delete
3b00: 0a 7d 20 7b 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63  .} {}..if {$::tc
3b10: 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
3b20: 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d  orm)!="windows"}
3b30: 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72   {.do_test pager
3b40: 31 2e 34 2e 32 2e 32 20 7b 0a 20 20 66 61 75 6c  1.4.2.2 {.  faul
3b50: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
3b60: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
3b70: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  l {.    SELECT c
3b80: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
3b90: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
3ba0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
3bb0: 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73  .} {4 ok}.do_tes
3bc0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 33 20 7b  t pager1.4.2.3 {
3bd0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
3be0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
3bf0: 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62   foreach f [glob
3c00: 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20   test.db-mj*] { 
3c10: 66 6f 72 63 65 64 65 6c 65 74 65 20 24 66 20 7d  forcedelete $f }
3c20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3c30: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
3c40: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52   FROM t1;.    PR
3c50: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
3c60: 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 36 34 20  heck;.  }.} {64 
3c70: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
3c80: 72 31 2e 34 2e 32 2e 34 20 7b 0a 20 20 66 61 75  r1.4.2.4 {.  fau
3c90: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
3ca0: 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65 78 69 6f  d_reopen.  hexio
3cb0: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a  _write test.db-j
3cc0: 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 5b 66 69  ournal [expr [fi
3cd0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
3ce0: 6a 6f 75 72 6e 61 6c 5d 2d 33 30 5d 20 31 32 33  journal]-30] 123
3cf0: 34 35 36 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  456.  execsql {.
3d00: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
3d10: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  (*) FROM t1;.   
3d20: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
3d30: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b  y_check;.  }.} {
3d40: 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  4 ok}.do_test pa
3d50: 67 65 72 31 2e 34 2e 32 2e 35 20 7b 0a 20 20 66  ger1.4.2.5 {.  f
3d60: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
3d70: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65 78  and_reopen.  hex
3d80: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
3d90: 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 5b  -journal [expr [
3da0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
3db0: 62 2d 6a 6f 75 72 6e 61 6c 5d 2d 33 30 5d 20 31  b-journal]-30] 1
3dc0: 32 33 34 35 36 0a 20 20 66 6f 72 65 61 63 68 20  23456.  foreach 
3dd0: 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2d  f [glob test.db-
3de0: 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65  mj*] { forcedele
3df0: 74 65 20 24 66 20 7d 0a 20 20 65 78 65 63 73 71  te $f }.  execsq
3e00: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  l {.    SELECT c
3e10: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
3e20: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
3e30: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
3e40: 0a 7d 20 7b 34 20 6f 6b 7d 0a 7d 0a 0a 64 6f 5f  .} {4 ok}.}..do_
3e50: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 33 2e  test pager1.4.3.
3e60: 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 73  1 {.  testvfs ts
3e70: 74 76 66 73 20 2d 64 65 66 61 75 6c 74 20 31 0a  tvfs -default 1.
3e80: 20 20 74 73 74 76 66 73 20 66 69 6c 74 65 72 20    tstvfs filter 
3e90: 78 53 79 6e 63 0a 20 20 74 73 74 76 66 73 20 73  xSync.  tstvfs s
3ea0: 63 72 69 70 74 20 78 53 79 6e 63 43 61 6c 6c 62  cript xSyncCallb
3eb0: 61 63 6b 0a 20 20 70 72 6f 63 20 78 53 79 6e 63  ack.  proc xSync
3ec0: 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64  Callback {method
3ed0: 20 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20   file args} {.  
3ee0: 20 20 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65    set file [file
3ef0: 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20   tail $file].   
3f00: 20 69 66 20 7b 20 30 3d 3d 5b 73 74 72 69 6e 67   if { 0==[string
3f10: 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20   match *journal 
3f20: 24 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75 6c 74  $file] } { fault
3f30: 73 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d 0a 20  sim_save }.  }. 
3f40: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
3f50: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
3f60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
3f70: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
3f80: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 43 52  = DELETE;.    CR
3f90: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
3fa0: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
3fb0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
3fc0: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
3fd0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3fe0: 33 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 64 62 20  3, 4);.  }.  db 
3ff0: 63 6c 6f 73 65 0a 20 20 74 73 74 76 66 73 20 64  close.  tstvfs d
4000: 65 6c 65 74 65 0a 7d 20 7b 7d 0a 0a 66 6f 72 65  elete.} {}..fore
4010: 61 63 68 20 7b 74 6e 20 6f 66 73 74 20 76 61 6c  ach {tn ofst val
4020: 75 65 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 20  ue result} {.   
4030: 20 20 20 20 20 20 20 32 20 20 20 32 30 20 20 20         2   20   
4040: 20 33 31 20 20 20 20 20 20 20 7b 31 20 32 20 33   31       {1 2 3
4050: 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 33 20   4}.          3 
4060: 20 20 32 30 20 20 20 20 33 32 20 20 20 20 20 20    20    32      
4070: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20   {1 2 3 4}.     
4080: 20 20 20 20 20 34 20 20 20 32 30 20 20 20 20 33       4   20    3
4090: 33 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  3       {1 2 3 4
40a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 35 20 20 20  }.          5   
40b0: 32 30 20 20 20 20 36 35 35 33 36 20 20 20 20 7b  20    65536    {
40c0: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
40d0: 20 20 20 36 20 20 20 32 30 20 20 20 20 31 33 31     6   20    131
40e0: 30 37 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  072   {1 2 3 4}.
40f0: 0a 20 20 20 20 20 20 20 20 20 20 37 20 20 20 32  .          7   2
4100: 34 20 20 20 20 35 31 31 20 20 20 20 20 20 7b 31  4    511      {1
4110: 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20   2 3 4}.        
4120: 20 20 38 20 20 20 32 34 20 20 20 20 35 31 33 20    8   24    513 
4130: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20       {1 2 3 4}. 
4140: 20 20 20 20 20 20 20 20 20 39 20 20 20 32 34 20           9   24 
4150: 20 20 20 31 33 31 30 37 32 20 20 20 7b 31 20 32     131072   {1 2
4160: 20 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20 20   3 4}..         
4170: 31 30 20 20 20 33 32 20 20 20 20 36 35 35 33 36  10   32    65536
4180: 20 20 20 20 7b 31 20 32 7d 0a 7d 20 7b 0a 20 20      {1 2}.} {.  
4190: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
41a0: 2e 33 2e 24 74 6e 20 7b 0a 20 20 20 20 66 61 75  .3.$tn {.    fau
41b0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
41c0: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 68 65 78  d_reopen.    hex
41d0: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
41e0: 2d 6a 6f 75 72 6e 61 6c 20 24 6f 66 73 74 20 5b  -journal $ofst [
41f0: 66 6f 72 6d 61 74 20 25 2e 38 78 20 24 76 61 6c  format %.8x $val
4200: 75 65 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ue].    execsql 
4210: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
4220: 74 31 20 7d 0a 20 20 7d 20 24 72 65 73 75 6c 74  t1 }.  } $result
4230: 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20 53  .}.db close..# S
4240: 65 74 20 75 70 20 61 20 56 46 53 20 74 68 61 74  et up a VFS that
4250: 20 73 6e 61 70 73 68 6f 74 73 20 74 68 65 20 66   snapshots the f
4260: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20  ile-system just 
4270: 62 65 66 6f 72 65 20 61 20 6d 61 73 74 65 72 20  before a master 
4280: 6a 6f 75 72 6e 61 6c 0a 23 20 66 69 6c 65 20 69  journal.# file i
4290: 73 20 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d  s deleted to com
42a0: 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  mit a multi-file
42b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 70   transaction. Sp
42c0: 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 0a  ecifically, the.
42d0: 23 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73  # file-system is
42e0: 20 73 61 76 65 64 20 6a 75 73 74 20 62 65 66 6f   saved just befo
42f0: 72 65 20 74 68 65 20 78 44 65 6c 65 74 65 28 29  re the xDelete()
4300: 20 63 61 6c 6c 20 74 6f 20 72 65 6d 6f 76 65 20   call to remove 
4310: 74 68 65 20 0a 23 20 6d 61 73 74 65 72 20 6a 6f  the .# master jo
4320: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
4330: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
4340: 0a 23 0a 73 65 74 20 70 77 64 20 5b 67 65 74 5f  .#.set pwd [get_
4350: 70 77 64 5d 0a 74 65 73 74 76 66 73 20 74 76 20  pwd].testvfs tv 
4360: 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63  -default 1.tv sc
4370: 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f  ript copy_on_mj_
4380: 64 65 6c 65 74 65 0a 73 65 74 20 3a 3a 6d 6a 5f  delete.set ::mj_
4390: 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20  filename_length 
43a0: 30 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d  0.proc copy_on_m
43b0: 6a 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64  j_delete {method
43c0: 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20   filename args} 
43d0: 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20  {.  if {[string 
43e0: 6d 61 74 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65  match *mj* [file
43f0: 20 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d   tail $filename]
4400: 5d 7d 20 7b 20 0a 20 20 20 20 23 0a 20 20 20 20  ]} { .    #.    
4410: 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 66  # NOTE: Is the f
4420: 69 6c 65 20 6e 61 6d 65 20 72 65 6c 61 74 69 76  ile name relativ
4430: 65 3f 20 20 49 66 20 73 6f 2c 20 61 64 64 20 74  e?  If so, add t
4440: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
4450: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 23 20 20   current.    #  
4460: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 2e 0a       directory..
4470: 20 20 20 20 23 0a 20 20 20 20 69 66 20 7b 5b 69      #.    if {[i
4480: 73 5f 72 65 6c 61 74 69 76 65 5f 66 69 6c 65 20  s_relative_file 
4490: 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 7b 0a 20 20  $filename]} {.  
44a0: 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c      set ::mj_fil
44b0: 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 5c 0a 20  ename_length \. 
44c0: 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b 73         [expr {[s
44d0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69  tring length $fi
44e0: 6c 65 6e 61 6d 65 5d 20 2b 20 5b 73 74 72 69 6e  lename] + [strin
44f0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 70 77 64 5d  g length $::pwd]
4500: 7d 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  }].    } else {.
4510: 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f 66        set ::mj_f
4520: 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 5b  ilename_length [
4530: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
4540: 69 6c 65 6e 61 6d 65 5d 0a 20 20 20 20 7d 0a 20  ilename].    }. 
4550: 20 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65     faultsim_save
4560: 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53   .  }.  return S
4570: 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 66 6f 72 65  QLITE_OK.}..fore
4580: 61 63 68 20 7b 74 6e 31 20 74 63 6c 7d 20 7b 0a  ach {tn1 tcl} {.
4590: 20 20 31 20 7b 20 73 65 74 20 70 72 65 66 69 78    1 { set prefix
45a0: 20 22 74 65 73 74 2e 64 62 22 20 7d 0a 20 20 32   "test.db" }.  2
45b0: 20 7b 20 0a 20 20 20 20 23 20 54 68 69 73 20 74   { .    # This t
45c0: 65 73 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  est depends on t
45d0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46  he underlying VF
45e0: 53 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20  S being able to 
45f0: 6f 70 65 6e 20 70 61 74 68 73 0a 20 20 20 20 23  open paths.    #
4600: 20 35 31 32 20 62 79 74 65 73 20 69 6e 20 6c 65   512 bytes in le
4610: 6e 67 74 68 2e 20 54 68 65 20 69 64 65 61 20 69  ngth. The idea i
4620: 73 20 74 6f 20 63 72 65 61 74 65 20 61 20 68 6f  s to create a ho
4630: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t-journal file t
4640: 68 61 74 0a 20 20 20 20 23 20 63 6f 6e 74 61 69  hat.    # contai
4650: 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72  ns a master-jour
4660: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20 6c  nal pointer so l
4670: 61 72 67 65 20 74 68 61 74 20 69 74 20 63 6f 75  arge that it cou
4680: 6c 64 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 23  ld contain.    #
4690: 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 72 65   a valid page re
46a0: 63 6f 72 64 20 28 69 66 20 74 68 65 20 66 69 6c  cord (if the fil
46b0: 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 35  e page-size is 5
46c0: 31 32 20 62 79 74 65 73 29 2e 20 53 6f 20 61 73  12 bytes). So as
46d0: 20 74 6f 0a 20 20 20 20 23 20 6d 61 6b 65 20 73   to.    # make s
46e0: 75 72 65 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ure SQLite doesn
46f0: 27 74 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  't get confused 
4700: 62 79 20 74 68 69 73 2e 0a 20 20 20 20 23 0a 20  by this..    #. 
4710: 20 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67 20     set nPadding 
4720: 5b 65 78 70 72 20 35 31 31 20 2d 20 24 3a 3a 6d  [expr 511 - $::m
4730: 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74  j_filename_lengt
4740: 68 5d 0a 20 20 20 20 69 66 20 7b 24 74 63 6c 5f  h].    if {$tcl_
4750: 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72  platform(platfor
4760: 6d 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b  m)=="windows"} {
4770: 0a 20 20 20 20 20 20 23 20 54 42 44 20 6e 65 65  .      # TBD nee
4780: 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  d to figure out 
4790: 68 6f 77 20 74 6f 20 64 6f 20 74 68 69 73 20 63  how to do this c
47a0: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 57 69 6e  orrectly for Win
47b0: 64 6f 77 73 21 21 21 0a 20 20 20 20 20 20 73 65  dows!!!.      se
47c0: 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72  t nPadding [expr
47d0: 20 32 35 35 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c   255 - $::mj_fil
47e0: 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20  ename_length].  
47f0: 20 20 7d 0a 0a 20 20 20 20 23 20 57 65 20 63 61    }..    # We ca
4800: 6e 6e 6f 74 20 6a 75 73 74 20 63 72 65 61 74 65  nnot just create
4810: 20 61 20 72 65 61 6c 6c 79 20 6c 6f 6e 67 20 64   a really long d
4820: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
4830: 65 20 74 6f 20 6f 70 65 6e 2c 20 61 73 0a 20 20  e to open, as.  
4840: 20 20 23 20 4c 69 6e 75 78 20 6c 69 6d 69 74 73    # Linux limits
4850: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70 6f 6e   a single compon
4860: 65 6e 74 20 6f 66 20 61 20 70 61 74 68 20 74 6f  ent of a path to
4870: 20 32 35 35 20 62 79 74 65 73 20 62 79 20 64 65   255 bytes by de
4880: 66 61 75 6c 74 0a 20 20 20 20 23 20 28 61 6e 64  fault.    # (and
4890: 20 70 72 65 73 75 6d 61 62 6c 79 20 6f 74 68 65   presumably othe
48a0: 72 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 6c  r systems have l
48b0: 69 6d 69 74 73 20 74 6f 6f 29 2e 20 53 6f 20 63  imits too). So c
48c0: 72 65 61 74 65 20 61 20 64 69 72 65 63 74 6f 72  reate a director
48d0: 79 0a 20 20 20 20 23 20 68 69 65 72 61 72 63 68  y.    # hierarch
48e0: 79 20 74 6f 20 77 6f 72 6b 20 69 6e 2e 0a 20 20  y to work in..  
48f0: 20 20 23 0a 20 20 20 20 73 65 74 20 64 69 72 6e    #.    set dirn
4900: 61 6d 65 20 22 64 31 32 33 34 35 36 37 38 39 30  ame "d1234567890
4910: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
4920: 37 38 39 30 2f 22 0a 20 20 20 20 73 65 74 20 6e  7890/".    set n
4930: 44 69 72 20 5b 65 78 70 72 20 24 6e 50 61 64 64  Dir [expr $nPadd
4940: 69 6e 67 20 2f 20 33 32 5d 0a 20 20 20 20 69 66  ing / 32].    if
4950: 20 7b 20 24 6e 44 69 72 20 7d 20 7b 0a 20 20 20   { $nDir } {.   
4960: 20 20 20 73 65 74 20 70 20 5b 73 74 72 69 6e 67     set p [string
4970: 20 72 65 70 65 61 74 20 24 64 69 72 6e 61 6d 65   repeat $dirname
4980: 20 24 6e 44 69 72 5d 0a 20 20 20 20 20 20 66 69   $nDir].      fi
4990: 6c 65 20 6d 6b 64 69 72 20 24 70 0a 20 20 20 20  le mkdir $p.    
49a0: 20 20 63 64 20 24 70 0a 20 20 20 20 7d 0a 0a 20    cd $p.    }.. 
49b0: 20 20 20 73 65 74 20 70 61 64 64 69 6e 67 20 5b     set padding [
49c0: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78 20  string repeat x 
49d0: 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20  [expr $nPadding 
49e0: 25 33 32 5d 5d 0a 20 20 20 20 73 65 74 20 70 72  %32]].    set pr
49f0: 65 66 69 78 20 22 74 65 73 74 2e 64 62 24 7b 70  efix "test.db${p
4a00: 61 64 64 69 6e 67 7d 22 0a 20 20 7d 0a 7d 20 7b  adding}".  }.} {
4a10: 0a 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20 66  .  eval $tcl.  f
4a20: 6f 72 65 61 63 68 20 7b 74 6e 32 20 73 71 6c 7d  oreach {tn2 sql}
4a30: 20 7b 0a 20 20 20 20 6f 20 7b 20 0a 20 20 20 20   {.    o { .    
4a40: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
4a50: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20  nchronous=OFF;. 
4a60: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
4a70: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b  synchronous=OFF;
4a80: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
4a90: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
4aa0: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ETE;.    }.    o
4ab0: 35 31 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41  512 { .      PRA
4ac0: 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f  GMA main.synchro
4ad0: 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20  nous=OFF;.      
4ae0: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
4af0: 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20  ronous=OFF;.    
4b00: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61    PRAGMA main.pa
4b10: 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
4b20: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
4b30: 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b  page_size = 512;
4b40: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
4b50: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
4b60: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ETE;.    }.    n
4b70: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
4b80: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
4b90: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
4ba0: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
4bb0: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
4bc0: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
4bd0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
4be0: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 20 7b  E;.    }.    f {
4bf0: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d   .      PRAGMA m
4c00: 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ain.synchronous=
4c10: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41 47  FULL;.      PRAG
4c20: 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f  MA aux.synchrono
4c30: 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50  us=FULL;.      P
4c40: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4c50: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4c60: 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 73 65   }.  } {..    se
4c70: 74 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24 7b 74  t tn "${tn1}.${t
4c80: 6e 32 7d 22 0a 20 20 0a 20 20 20 20 23 20 53 65  n2}".  .    # Se
4c90: 74 20 75 70 20 61 20 63 6f 6e 6e 65 63 74 69 6f  t up a connectio
4ca0: 6e 20 74 6f 20 68 61 76 65 20 74 77 6f 20 64 61  n to have two da
4cb0: 74 61 62 61 73 65 73 2c 20 74 65 73 74 2e 64 62  tabases, test.db
4cc0: 20 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20 20 20   (main) and .   
4cd0: 20 23 20 74 65 73 74 2e 64 62 32 20 28 61 75 78   # test.db2 (aux
4ce0: 29 2e 20 54 68 65 6e 20 72 75 6e 20 61 20 6d 75  ). Then run a mu
4cf0: 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
4d00: 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20 54 68  tion on them. Th
4d10: 65 0a 20 20 20 20 23 20 56 46 53 20 77 69 6c 6c  e.    # VFS will
4d20: 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   snapshot the fi
4d30: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
4d40: 65 66 6f 72 65 20 74 68 65 20 6d 61 73 74 65 72  efore the master
4d50: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23 20 66  -journal.    # f
4d60: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 74  ile is deleted t
4d70: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
4d80: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 23 0a  nsaction..    #.
4d90: 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 78 44      tv filter xD
4da0: 65 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74 65 73  elete.    do_tes
4db0: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
4dc0: 2e 31 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74  .1 {.      fault
4dd0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
4de0: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
4df0: 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
4e00: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 24 7b        ATTACH '${
4e10: 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78  prefix}2' AS aux
4e20: 3b 0a 20 20 20 20 20 20 20 20 24 73 71 6c 0a 20  ;.        $sql. 
4e30: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
4e40: 42 4c 45 20 61 28 78 29 3b 0a 20 20 20 20 20 20  BLE a(x);.      
4e50: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
4e60: 75 78 2e 62 28 78 29 3b 0a 20 20 20 20 20 20 20  ux.b(x);.       
4e70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56   INSERT INTO a V
4e80: 41 4c 55 45 53 28 27 64 6f 75 62 6c 65 2d 79 6f  ALUES('double-yo
4e90: 75 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  u');.        INS
4ea0: 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45  ERT INTO a VALUE
4eb0: 53 28 27 77 68 79 27 29 3b 0a 20 20 20 20 20 20  S('why');.      
4ec0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20    INSERT INTO a 
4ed0: 56 41 4c 55 45 53 28 27 7a 65 64 27 29 3b 0a 20  VALUES('zed');. 
4ee0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4ef0: 54 4f 20 62 20 56 41 4c 55 45 53 28 27 77 6f 6e  TO b VALUES('won
4f00: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
4f10: 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53  RT INTO b VALUES
4f20: 28 27 74 6f 6f 27 29 3b 0a 20 20 20 20 20 20 20  ('too');.       
4f30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56   INSERT INTO b V
4f40: 41 4c 55 45 53 28 27 66 72 65 65 27 29 3b 0a 20  ALUES('free');. 
4f50: 20 20 20 20 20 22 0a 20 20 20 20 20 20 65 78 65       ".      exe
4f60: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 42  csql {.        B
4f70: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  EGIN;.          
4f80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 53 45  INSERT INTO a SE
4f90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 20 57 48  LECT * FROM b WH
4fa0: 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20  ERE rowid<=3;.  
4fb0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4fc0: 4e 54 4f 20 62 20 53 45 4c 45 43 54 20 2a 20 46  NTO b SELECT * F
4fd0: 52 4f 4d 20 61 20 57 48 45 52 45 20 72 6f 77 69  ROM a WHERE rowi
4fe0: 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 43 4f  d<=3;.        CO
4ff0: 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  MMIT;.      }.  
5000: 20 20 7d 20 7b 7d 0a 20 20 20 20 74 76 20 66 69    } {}.    tv fi
5010: 6c 74 65 72 20 7b 7d 0a 20 20 20 20 0a 20 20 20  lter {}.    .   
5020: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68   # Check that th
5030: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
5040: 73 20 63 6f 6d 6d 69 74 74 65 64 20 73 75 63 63  s committed succ
5050: 65 73 73 66 75 6c 6c 79 2e 0a 20 20 20 20 23 0a  essfully..    #.
5060: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
5070: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
5080: 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 53 45 4c  tn.2 {.      SEL
5090: 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20  ECT * FROM a.   
50a0: 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77   } {double-you w
50b0: 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66  hy zed won too f
50c0: 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63  ree}.    do_exec
50d0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
50e0: 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  4.4.$tn.3 {.    
50f0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5100: 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f  b.    } {won too
5110: 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75   free double-you
5120: 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 0a 20   why zed}.    . 
5130: 20 20 20 23 20 52 65 73 74 6f 72 65 20 74 68 65     # Restore the
5140: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64   file-system and
5150: 20 72 65 6f 70 65 6e 20 74 68 65 20 64 61 74 61   reopen the data
5160: 62 61 73 65 73 2e 20 43 68 65 63 6b 20 74 68 61  bases. Check tha
5170: 74 20 69 74 20 6e 6f 77 0a 20 20 20 20 23 20 61  t it now.    # a
5180: 70 70 65 61 72 73 20 74 68 61 74 20 74 68 65 20  ppears that the 
5190: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
51a0: 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 20 28 62  not committed (b
51b0: 65 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 2d  ecause the file-
51c0: 73 79 73 74 65 6d 0a 20 20 20 20 23 20 77 61 73  system.    # was
51d0: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68 65   restored to the
51e0: 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
51f0: 68 61 64 20 6e 6f 74 20 62 65 65 6e 29 2e 0a 20  had not been).. 
5200: 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74     #.    do_test
5210: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5220: 34 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73  4 {.      faults
5230: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5240: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
5250: 20 20 20 20 65 78 65 63 73 71 6c 20 22 41 54 54      execsql "ATT
5260: 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32 27  ACH '${prefix}2'
5270: 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20 7b   AS aux".    } {
5280: 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c  }.    do_execsql
5290: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
52a0: 2e 24 74 6e 2e 35 20 7b 53 45 4c 45 43 54 20 2a  .$tn.5 {SELECT *
52b0: 20 46 52 4f 4d 20 61 7d 20 7b 64 6f 75 62 6c 65   FROM a} {double
52c0: 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20  -you why zed}.  
52d0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
52e0: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
52f0: 2e 36 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  .6 {SELECT * FRO
5300: 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72  M b} {won too fr
5310: 65 65 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52  ee}.    .    # R
5320: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5330: 73 79 73 74 65 6d 20 61 67 61 69 6e 2e 20 54 68  system again. Th
5340: 69 73 20 74 69 6d 65 2c 20 62 65 66 6f 72 65 20  is time, before 
5350: 72 65 6f 70 65 6e 69 6e 67 20 74 68 65 20 64 61  reopening the da
5360: 74 61 62 61 73 65 73 2c 0a 20 20 20 20 23 20 64  tabases,.    # d
5370: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
5380: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72  -journal file fr
5390: 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  om the file-syst
53a0: 65 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70 65 61  em. It now appea
53b0: 72 73 20 74 68 61 74 0a 20 20 20 20 23 20 74 68  rs that.    # th
53c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
53d0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e 6f 20  s committed (no 
53e0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
53f0: 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c 62 61  ile == no rollba
5400: 63 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20 20 64  ck)..    #.    d
5410: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  o_test pager1-4.
5420: 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 20 20  4.$tn.7 {.      
5430: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
5440: 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 65  _and_reopen $pre
5450: 66 69 78 0a 20 20 20 20 20 20 66 6f 72 65 61 63  fix.      foreac
5460: 68 20 66 20 5b 67 6c 6f 62 20 24 7b 70 72 65 66  h f [glob ${pref
5470: 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65  ix}-mj*] { force
5480: 64 65 6c 65 74 65 20 24 66 20 7d 0a 20 20 20 20  delete $f }.    
5490: 20 20 65 78 65 63 73 71 6c 20 22 41 54 54 41 43    execsql "ATTAC
54a0: 48 20 27 24 7b 70 72 65 66 69 78 7d 32 27 20 41  H '${prefix}2' A
54b0: 53 20 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d 0a  S aux".    } {}.
54c0: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
54d0: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
54e0: 74 6e 2e 38 20 7b 0a 20 20 20 20 20 20 53 45 4c  tn.8 {.      SEL
54f0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20  ECT * FROM a.   
5500: 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77   } {double-you w
5510: 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66  hy zed won too f
5520: 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63  ree}.    do_exec
5530: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
5540: 34 2e 34 2e 24 74 6e 2e 39 20 7b 0a 20 20 20 20  4.4.$tn.9 {.    
5550: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5560: 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f  b.    } {won too
5570: 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75   free double-you
5580: 20 77 68 79 20 7a 65 64 7d 0a 20 20 7d 0a 0a 20   why zed}.  }.. 
5590: 20 63 64 20 24 70 77 64 0a 7d 0a 64 62 20 63 6c   cd $pwd.}.db cl
55a0: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 66 6f  ose.tv delete.fo
55b0: 72 63 65 64 65 6c 65 74 65 20 24 64 69 72 6e 61  rcedelete $dirna
55c0: 6d 65 0a 0a 0a 23 20 53 65 74 20 75 70 20 61 20  me...# Set up a 
55d0: 56 46 53 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f  VFS to make a co
55e0: 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73  py of the file-s
55f0: 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72  ystem just befor
5600: 65 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20 6a  e deleting a.# j
5610: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 63  ournal file to c
5620: 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
5630: 69 6f 6e 2e 20 54 68 65 20 74 72 61 6e 73 61 63  ion. The transac
5640: 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65 78  tion modifies ex
5650: 61 63 74 6c 79 0a 23 20 74 77 6f 20 64 61 74 61  actly.# two data
5660: 62 61 73 65 20 70 61 67 65 73 20 28 61 6e 64 20  base pages (and 
5670: 70 61 67 65 20 31 20 2d 20 74 68 65 20 63 68 61  page 1 - the cha
5680: 6e 67 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23 0a  nge counter)..#.
5690: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
56a0: 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73  ult 1.tv sectors
56b0: 69 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69 70  ize 512.tv scrip
56c0: 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61  t copy_on_journa
56d0: 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74  l_delete.tv filt
56e0: 65 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20  er xDelete.proc 
56f0: 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f  copy_on_journal_
5700: 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66  delete {method f
5710: 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a  ilename args} {.
5720: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
5730: 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69  tch *journal $fi
5740: 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69  lename]} faultsi
5750: 6d 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e  m_save .  return
5760: 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75   SQLITE_OK.}.fau
5770: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
5780: 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73  _reopen.do_execs
5790: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
57a0: 2e 35 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20  .5.1 {.  PRAGMA 
57b0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
57c0: 45 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41 20  ELETE;.  PRAGMA 
57d0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
57e0: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
57f0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45   t1(a, b);.  CRE
5800: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
5810: 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  b);.  INSERT INT
5820: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c  O t1 VALUES('I',
5830: 20 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52 54   'II');.  INSERT
5840: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
5850: 27 49 49 49 27 2c 20 27 49 56 27 29 3b 0a 20 20  'III', 'IV');.  
5860: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
5870: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5880: 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 2);.    INSE
5890: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
58a0: 53 28 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d 49  S(3, 4);.  COMMI
58b0: 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76  T;.} {delete}.tv
58c0: 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68   filter {}..# Ch
58d0: 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  eck the transact
58e0: 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
58f0: 64 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  d:.#.do_execsql_
5900: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
5910: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  2 {.  SELECT * F
5920: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
5930: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49   * FROM t2;.} {I
5940: 20 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33   II 1 2 III IV 3
5950: 20 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66   4}..# Now try f
5960: 6f 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20  our tests:.#.#  
5970: 70 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65  pager1-4.5.3: Re
5980: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73  store the file-s
5990: 79 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61  ystem. Check tha
59a0: 74 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  t the whole tran
59b0: 73 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20  saction .#      
59c0: 20 20 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c            is rol
59d0: 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70  led back..#.#  p
59e0: 61 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73  ager1-4.5.4: Res
59f0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
5a00: 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68  stem. Corrupt th
5a10: 65 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69  e first record i
5a20: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  n the.#         
5a30: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20         journal. 
5a40: 43 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61  Check the transa
5a50: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c  ction is not rol
5a60: 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70  led back..#.#  p
5a70: 61 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73  ager1-4.5.5: Res
5a80: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
5a90: 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68  stem. Corrupt th
5aa0: 65 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20  e second record 
5ab0: 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  in the.#        
5ac0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e          journal.
5ad0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
5ae0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
5af0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5b00: 69 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  is .#           
5b10: 20 20 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b       played back
5b20: 2c 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65  , but not the se
5b30: 63 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72  cond..#.#  pager
5b40: 31 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65  1-4.5.6: Restore
5b50: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5b60: 2e 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  . Try to open th
5b70: 65 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  e database with 
5b80: 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  a.#             
5b90: 20 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e     readonly conn
5ba0: 65 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f  ection. This sho
5bb0: 75 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72  uld fail, as a r
5bc0: 65 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20  ead-only.#      
5bd0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63            connec
5be0: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c  tion cannot roll
5bf0: 20 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61   back the databa
5c00: 73 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74  se file..#.fault
5c10: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5c20: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
5c30: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5c40: 35 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.3 {.  SELECT *
5c50: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5c60: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5c70: 7b 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61  {I II III IV}.fa
5c80: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5c90: 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f  nd_reopen.hexio_
5ca0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  write test.db-jo
5cb0: 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b  urnal [expr 512+
5cc0: 34 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31  4+1024 - 202] 01
5cd0: 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64  23456789ABCDEF.d
5ce0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5cf0: 61 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20  ager1.4.5.4 {.  
5d00: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5d10: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5d20: 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20  M t2;.} {I II 1 
5d30: 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61  2 III IV 3 4}.fa
5d40: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5d50: 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f  nd_reopen.hexio_
5d60: 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  write test.db-jo
5d70: 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b  urnal [expr 512+
5d80: 34 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20  4+1024+4+4+1024 
5d90: 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38  - 202] 012345678
5da0: 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73  9ABCDEF.do_execs
5db0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5dc0: 2e 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.5 {.  SELECT 
5dd0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
5de0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
5df0: 20 7b 49 20 49 49 20 49 49 49 20 49 56 20 33 20   {I II III IV 3 
5e00: 34 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  4}..faultsim_res
5e10: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
5e20: 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33  db close.sqlite3
5e30: 20 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61   db test.db -rea
5e40: 64 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68  donly 1.do_catch
5e50: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5e60: 34 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54  4.5.6 {.  SELECT
5e70: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
5e80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
5e90: 7d 20 7b 31 20 7b 61 74 74 65 6d 70 74 20 74 6f  } {1 {attempt to
5ea0: 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c   write a readonl
5eb0: 79 20 64 61 74 61 62 61 73 65 7d 7d 0a 64 62 20  y database}}.db 
5ec0: 63 6c 6f 73 65 0a 0a 23 20 53 6e 61 70 73 68 6f  close..# Snapsho
5ed0: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
5ee0: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 6d 75  m just before mu
5ef0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 2e  lti-file commit.
5f00: 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65 0a 23   Save the name.#
5f10: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
5f20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 24  ournal file in $
5f30: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 0a 23  ::mj_filename..#
5f40: 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f  .tv script copy_
5f50: 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 74 76 20  on_mj_delete.tv 
5f60: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70  filter xDelete.p
5f70: 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64  roc copy_on_mj_d
5f80: 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69  elete {method fi
5f90: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
5fa0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
5fb0: 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61  ch *mj* [file ta
5fc0: 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20  il $filename]]} 
5fd0: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f  { .    set ::mj_
5fe0: 66 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65 6e 61  filename $filena
5ff0: 6d 65 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f  me.    faultsim_
6000: 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75  save .  }.  retu
6010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 64  rn SQLITE_OK.}.d
6020: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
6030: 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  6.1 {.  faultsim
6040: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
6050: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
6060: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
6070: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
6080: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
6090: 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20  t.db2' AS two;. 
60a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
60b0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
60c0: 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f 2e 74  EATE TABLE two.t
60d0: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  2(a, b);.    INS
60e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
60f0: 45 53 28 31 2c 20 27 74 31 2e 31 27 29 3b 0a 20  ES(1, 't1.1');. 
6100: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6110: 32 20 56 41 4c 55 45 53 28 31 2c 20 27 74 32 2e  2 VALUES(1, 't2.
6120: 31 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  1');.    BEGIN;.
6130: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
6140: 53 45 54 20 62 20 3d 20 27 74 31 2e 32 27 3b 0a  SET b = 't1.2';.
6150: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 32 20        UPDATE t2 
6160: 53 45 54 20 62 20 3d 20 27 74 32 2e 32 27 3b 0a  SET b = 't2.2';.
6170: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
6180: 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 20    tv filter {}. 
6190: 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a   db close.} {}..
61a0: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
61b0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65  _and_reopen.do_e
61c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
61d0: 72 31 2e 34 2e 36 2e 32 20 7b 20 53 45 4c 45 43  r1.4.6.2 { SELEC
61e0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20  T * FROM t1 }   
61f0: 20 20 20 20 20 20 20 20 7b 31 20 74 31 2e 31 7d          {1 t1.1}
6200: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
6210: 20 70 61 67 65 72 31 2e 34 2e 36 2e 33 20 7b 20   pager1.4.6.3 { 
6220: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6230: 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b 31 7d  j_filename } {1}
6240: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6250: 20 70 61 67 65 72 31 2e 34 2e 36 2e 34 20 7b 0a   pager1.4.6.4 {.
6260: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
6270: 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 53 45  b2' AS two;.  SE
6280: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
6290: 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65  } {1 t2.1}.do_te
62a0: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 35 20  st pager1.4.6.5 
62b0: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
62c0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b  :mj_filename } {
62d0: 30 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  0}..faultsim_res
62e0: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
62f0: 64 62 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  db close.do_test
6300: 20 70 61 67 65 72 31 2e 34 2e 36 2e 38 20 7b 0a   pager1.4.6.8 {.
6310: 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e    set ::mj_filen
6320: 61 6d 65 31 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  ame1 $::mj_filen
6330: 61 6d 65 0a 20 20 74 76 20 66 69 6c 74 65 72 20  ame.  tv filter 
6340: 78 44 65 6c 65 74 65 0a 20 20 73 71 6c 69 74 65  xDelete.  sqlite
6350: 33 20 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20  3 db test.db2.  
6360: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
6370: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
6380: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20  e = DELETE;.    
6390: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 33  ATTACH 'test.db3
63a0: 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20 20 20  ' AS three;.    
63b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 68 72  CREATE TABLE thr
63c0: 65 65 2e 74 33 28 61 2c 20 62 29 3b 0a 20 20 20  ee.t3(a, b);.   
63d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
63e0: 56 41 4c 55 45 53 28 31 2c 20 27 74 33 2e 31 27  VALUES(1, 't3.1'
63f0: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
6400: 20 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45      UPDATE t2 SE
6410: 54 20 62 20 3d 20 27 74 32 2e 33 27 3b 0a 20 20  T b = 't2.3';.  
6420: 20 20 20 20 55 50 44 41 54 45 20 74 33 20 53 45      UPDATE t3 SE
6430: 54 20 62 20 3d 20 27 74 33 2e 33 27 3b 0a 20 20  T b = 't3.3';.  
6440: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
6450: 65 78 70 72 20 7b 24 3a 3a 6d 6a 5f 66 69 6c 65  expr {$::mj_file
6460: 6e 61 6d 65 31 20 21 3d 20 24 3a 3a 6d 6a 5f 66  name1 != $::mj_f
6470: 69 6c 65 6e 61 6d 65 7d 0a 7d 20 7b 31 7d 0a 66  ilename}.} {1}.f
6480: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
6490: 61 6e 64 5f 72 65 6f 70 65 6e 0a 74 76 20 66 69  and_reopen.tv fi
64a0: 6c 74 65 72 20 7b 7d 0a 0a 23 20 54 68 65 20 66  lter {}..# The f
64b0: 69 6c 65 2d 73 79 73 74 65 6d 20 6e 6f 77 20 63  ile-system now c
64c0: 6f 6e 74 61 69 6e 73 3a 0a 23 0a 23 20 20 20 2a  ontains:.#.#   *
64d0: 20 74 68 72 65 65 20 64 61 74 61 62 61 73 65 73   three databases
64e0: 0a 23 20 20 20 2a 20 74 68 72 65 65 20 68 6f 74  .#   * three hot
64f0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 23  -journal files.#
6500: 20 20 20 2a 20 74 77 6f 20 6d 61 73 74 65 72 2d     * two master-
6510: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23  journal files..#
6520: 0a 23 20 54 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  .# The hot-journ
6530: 61 6c 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  als associated w
6540: 69 74 68 20 74 65 73 74 2e 64 62 32 20 61 6e 64  ith test.db2 and
6550: 20 74 65 73 74 2e 64 62 33 20 70 6f 69 6e 74 20   test.db3 point 
6560: 74 6f 0a 23 20 6d 61 73 74 65 72 20 6a 6f 75 72  to.# master jour
6570: 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  nal $::mj_filena
6580: 6d 65 2e 20 54 68 65 20 68 6f 74 2d 6a 6f 75 72  me. The hot-jour
6590: 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  nal file associa
65a0: 74 65 64 20 77 69 74 68 0a 23 20 74 65 73 74 2e  ted with.# test.
65b0: 64 62 20 70 6f 69 6e 74 73 20 74 6f 20 6d 61 73  db points to mas
65c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d  ter journal $::m
65d0: 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 20 53 6f 20  j_filename1. So 
65e0: 72 65 61 64 69 6e 67 20 66 72 6f 6d 0a 23 20 74  reading from.# t
65f0: 65 73 74 2e 64 62 20 73 68 6f 75 6c 64 20 64 65  est.db should de
6600: 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  lete $::mj_filen
6610: 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ame1..#.do_test 
6620: 70 61 67 65 72 31 2e 34 2e 36 2e 39 20 7b 0a 20  pager1.4.6.9 {. 
6630: 20 6c 73 6f 72 74 20 5b 67 6c 6f 62 20 74 65 73   lsort [glob tes
6640: 74 2e 64 62 2a 5d 0a 7d 20 5b 6c 73 6f 72 74 20  t.db*].} [lsort 
6650: 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  [list           
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6680: 5c 0a 20 20 74 65 73 74 2e 64 62 20 74 65 73 74  \.  test.db test
6690: 2e 64 62 32 20 74 65 73 74 2e 64 62 33 20 20 20  .db2 test.db3   
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66b0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74             \.  t
66c0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74  est.db-journal t
66d0: 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20  est.db2-journal 
66e0: 74 65 73 74 2e 64 62 33 2d 6a 6f 75 72 6e 61 6c  test.db3-journal
66f0: 20 20 20 20 20 20 5c 0a 20 20 5b 66 69 6c 65 20        \.  [file 
6700: 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  tail $::mj_filen
6710: 61 6d 65 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20  ame] [file tail 
6720: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 5d  $::mj_filename1]
6730: 0a 5d 5d 0a 0a 23 20 54 68 65 20 6d 61 73 74 65  .]]..# The maste
6740: 72 2d 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f  r-journal $::mj_
6750: 66 69 6c 65 6e 61 6d 65 31 20 63 6f 6e 74 61 69  filename1 contai
6760: 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  ns pointers to t
6770: 65 73 74 2e 64 62 20 61 6e 64 20 0a 23 20 74 65  est.db and .# te
6780: 73 74 2e 64 62 32 2e 20 48 6f 77 65 76 65 72 20  st.db2. However 
6790: 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
67a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
67b0: 74 65 73 74 2e 64 62 32 20 70 6f 69 6e 74 73 20  test.db2 points 
67c0: 74 6f 0a 23 20 61 20 64 69 66 66 65 72 65 6e 74  to.# a different
67d0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
67e0: 20 54 68 65 72 65 66 6f 72 65 2c 20 72 65 61 64   Therefore, read
67f0: 69 6e 67 20 66 72 6f 6d 20 74 65 73 74 2e 64 62  ing from test.db
6800: 20 6f 6e 6c 79 20 73 68 6f 75 6c 64 0a 23 20 62   only should.# b
6810: 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 61 75 73  e enough to caus
6820: 65 20 53 51 4c 69 74 65 20 74 6f 20 64 65 6c 65  e SQLite to dele
6830: 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  te $::mj_filenam
6840: 65 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 20 20  e1..#.do_test   
6850: 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36        pager1.4.6
6860: 2e 31 30 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .10 { file exist
6870: 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  s $::mj_filename
6880: 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20    } {1}.do_test 
6890: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
68a0: 2e 36 2e 31 31 20 7b 20 66 69 6c 65 20 65 78 69  .6.11 { file exi
68b0: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
68c0: 6d 65 31 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65  me1 } {1}.do_exe
68d0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
68e0: 2e 34 2e 36 2e 31 32 20 7b 20 53 45 4c 45 43 54  .4.6.12 { SELECT
68f0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20   * FROM t1 } {1 
6900: 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20  t1.1}.do_test   
6910: 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36        pager1.4.6
6920: 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .13 { file exist
6930: 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  s $::mj_filename
6940: 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20    } {1}.do_test 
6950: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
6960: 2e 36 2e 31 34 20 7b 20 66 69 6c 65 20 65 78 69  .6.14 { file exi
6970: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6980: 6d 65 31 20 7d 20 7b 30 7d 0a 0a 64 6f 5f 65 78  me1 } {0}..do_ex
6990: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
69a0: 31 2e 34 2e 36 2e 31 32 20 7b 0a 20 20 41 54 54  1.4.6.12 {.  ATT
69b0: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
69c0: 53 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20  S two;.  SELECT 
69d0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20  * FROM t2;.} {1 
69e0: 74 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20  t2.1}.do_test   
69f0: 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36        pager1.4.6
6a00: 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .13 { file exist
6a10: 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  s $::mj_filename
6a20: 20 7d 20 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73   }  {1}.do_execs
6a30: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
6a40: 2e 36 2e 31 34 20 7b 0a 20 20 41 54 54 41 43 48  .6.14 {.  ATTACH
6a50: 20 27 74 65 73 74 2e 64 62 33 27 20 41 53 20 74   'test.db3' AS t
6a60: 68 72 65 65 3b 0a 20 20 53 45 4c 45 43 54 20 2a  hree;.  SELECT *
6a70: 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 31 20 74   FROM t3;.} {1 t
6a80: 33 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20  3.1}.do_test    
6a90: 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e       pager1.4.6.
6aa0: 31 35 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  15 { file exists
6ab0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20   $::mj_filename 
6ac0: 7d 20 20 7b 30 7d 0a 0a 64 62 20 63 6c 6f 73 65  }  {0}..db close
6ad0: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74 65 73 74  .tv delete..test
6ae0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
6af0: 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20  1.tv sectorsize 
6b00: 35 31 32 0a 74 76 20 73 63 72 69 70 74 20 63 6f  512.tv script co
6b10: 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65  py_on_journal_de
6b20: 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78  lete.tv filter x
6b30: 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79  Delete.proc copy
6b40: 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65  _on_journal_dele
6b50: 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  te {method filen
6b60: 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66  ame args} {.  if
6b70: 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
6b80: 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e 61  *journal $filena
6b90: 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61  me]} faultsim_sa
6ba0: 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ve .  return SQL
6bb0: 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69  ITE_OK.}.faultsi
6bc0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
6bd0: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
6be0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e 31  est pager1.4.7.1
6bf0: 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72   {.  PRAGMA jour
6c00: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
6c10: 45 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  E;.  CREATE TABL
6c20: 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b  E t1(x PRIMARY K
6c30: 45 59 2c 20 79 29 3b 0a 20 20 43 52 45 41 54 45  EY, y);.  CREATE
6c40: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
6c50: 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  y);.  INSERT INT
6c60: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c  O t1 VALUES('I',
6c70: 20 20 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53     'one');.  INS
6c80: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6c90: 45 53 28 27 49 49 27 2c 20 20 27 66 6f 75 72 27  ES('II',  'four'
6ca0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
6cb0: 20 74 31 20 56 41 4c 55 45 53 28 27 49 49 49 27   t1 VALUES('III'
6cc0: 2c 20 27 6e 69 6e 65 27 29 3b 0a 20 20 42 45 47  , 'nine');.  BEG
6cd0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
6ce0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49  NTO t1 VALUES('I
6cf0: 56 27 2c 20 27 73 69 78 74 65 65 6e 27 29 3b 0a  V', 'sixteen');.
6d00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6d10: 74 31 20 56 41 4c 55 45 53 28 27 56 27 20 2c 20  t1 VALUES('V' , 
6d20: 27 74 77 65 6e 74 79 66 69 76 65 27 29 3b 0a 20  'twentyfive');. 
6d30: 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65 6c 65   COMMIT;.} {dele
6d40: 74 65 7d 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d  te}.tv filter {}
6d50: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
6d60: 65 74 65 20 0a 63 61 74 63 68 20 7b 0a 20 20 74  ete .catch {.  t
6d70: 65 73 74 5f 73 79 73 63 61 6c 6c 20 69 6e 73 74  est_syscall inst
6d80: 61 6c 6c 20 66 63 68 6d 6f 64 0a 20 20 74 65 73  all fchmod.  tes
6d90: 74 5f 73 79 73 63 61 6c 6c 20 66 61 75 6c 74 20  t_syscall fault 
6da0: 31 20 31 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61  1 1.}.do_test pa
6db0: 67 65 72 31 2e 34 2e 37 2e 32 20 7b 0a 20 20 66  ger1.4.7.2 {.  f
6dc0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
6dd0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 63 61 74  and_reopen.  cat
6de0: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6df0: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
6e00: 6e 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73  nal -permissions
6e10: 20 72 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61   r--------}.  ca
6e20: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
6e30: 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  utes test.db-jou
6e40: 72 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 31  rnal -readonly 1
6e50: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  }.  catchsql { S
6e60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
6e70: 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74  }.} {1 {unable t
6e80: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
6e90: 66 69 6c 65 7d 7d 0a 63 61 74 63 68 20 7b 0a 20  file}}.catch {. 
6ea0: 20 74 65 73 74 5f 73 79 73 63 61 6c 6c 20 72 65   test_syscall re
6eb0: 73 65 74 0a 20 20 74 65 73 74 5f 73 79 73 63 61  set.  test_sysca
6ec0: 6c 6c 20 66 61 75 6c 74 20 30 20 30 0a 7d 0a 64  ll fault 0 0.}.d
6ed0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
6ee0: 37 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  7.3 {.  db close
6ef0: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
6f00: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
6f10: 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69  b-journal -permi
6f20: 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d  ssions rw-rw-rw-
6f30: 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20  }.  catch {file 
6f40: 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e  attributes test.
6f50: 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64  db-journal -read
6f60: 6f 6e 6c 79 20 30 7d 0a 20 20 64 65 6c 65 74 65  only 0}.  delete
6f70: 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f  _file test.db-jo
6f80: 75 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65 78 69  urnal.  file exi
6f90: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
6fa0: 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73  nal.} {0}.do_tes
6fb0: 74 20 70 61 67 65 72 31 2e 34 2e 38 2e 31 20 7b  t pager1.4.8.1 {
6fc0: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
6fd0: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
6fe0: 62 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72  b -permissions r
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63  --------}.  catc
7000: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
7010: 65 73 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64  es test.db -read
7020: 6f 6e 6c 79 20 31 7d 0a 20 20 73 71 6c 69 74 65  only 1}.  sqlite
7030: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
7040: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
7050: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71  * FROM t1 }.  sq
7060: 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
7070: 79 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 31 7d 0a  y db main.} {1}.
7080: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
7090: 2e 38 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33  .8.2 {.  sqlite3
70a0: 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20  _db_readonly db 
70b0: 78 79 7a 0a 7d 20 7b 2d 31 7d 0a 64 6f 5f 74 65  xyz.} {-1}.do_te
70c0: 73 74 20 70 61 67 65 72 31 2e 34 2e 38 2e 33 20  st pager1.4.8.3 
70d0: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63  {.  db close.  c
70e0: 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69  atch {file attri
70f0: 62 75 74 65 73 20 74 65 73 74 2e 64 62 20 2d 72  butes test.db -r
7100: 65 61 64 6f 6e 6c 79 20 30 7d 0a 20 20 63 61 74  eadonly 0}.  cat
7110: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
7120: 74 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72  tes test.db -per
7130: 6d 69 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72  missions rw-rw-r
7140: 77 2d 7d 20 6d 73 67 0a 20 20 73 71 6c 69 74 65  w-} msg.  sqlite
7150: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
7160: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
7170: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71  * FROM t1 }.  sq
7180: 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
7190: 79 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 30 7d 0a  y db main.} {0}.
71a0: 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
71f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
7200: 73 20 64 65 61 6c 20 77 69 74 68 20 6d 75 6c 74  s deal with mult
7210: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
7220: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 31 2e 2a  #.# pager1-5.1.*
7230: 3a 20 54 68 65 20 63 61 73 65 20 77 68 65 72 65  : The case where
7240: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 61   a multi-file ca
7250: 6e 6e 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74 65  nnot be committe
7260: 64 20 62 65 63 61 75 73 65 0a 23 20 20 20 20 20  d because.#     
7270: 20 20 20 20 20 20 20 20 20 20 61 6e 6f 74 68 65            anothe
7280: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  r connection is 
7290: 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44  holding a SHARED
72a0: 20 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20   lock on one of 
72b0: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
72c0: 20 20 20 20 66 69 6c 65 73 2e 20 41 66 74 65 72      files. After
72d0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
72e0: 20 69 73 20 72 65 6d 6f 76 65 64 2c 20 74 68 65   is removed, the
72f0: 20 43 4f 4d 4d 49 54 20 73 75 63 63 65 65 64 73   COMMIT succeeds
7300: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 32  ..#.# pager1-5.2
7310: 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63  .*: Multi-file c
7320: 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72  ommits with jour
7330: 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e  nal_mode=memory.
7340: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 33 2e  .#.# pager1-5.3.
7350: 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  *: Multi-file co
7360: 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e  mmits with journ
7370: 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a  al_mode=memory..
7380: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 34 2e 2a  #.# pager1-5.4.*
7390: 3a 20 43 68 65 63 6b 20 74 68 61 74 20 77 69 74  : Check that wit
73a0: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f  h synchronous=no
73b0: 72 6d 61 6c 2c 20 74 68 65 20 6d 61 73 74 65 72  rmal, the master
73c0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20  -journal file.# 
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
73e0: 6d 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 61  me is added to a
73f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
7400: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
7410: 74 68 65 20 6c 61 73 74 0a 23 20 20 20 20 20 20  the last.#      
7420: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
7430: 20 72 65 63 6f 72 64 2e 20 42 75 74 20 77 69 74   record. But wit
7440: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75  h synchronous=fu
7450: 6c 6c 2c 20 65 78 74 72 61 20 75 6e 75 73 65 64  ll, extra unused
7460: 20 73 70 61 63 65 0a 23 20 20 20 20 20 20 20 20   space.#        
7470: 20 20 20 20 20 20 20 69 73 20 61 6c 6c 6f 63 61         is alloca
7480: 74 65 64 20 62 65 74 77 65 65 6e 20 74 68 65 20  ted between the 
7490: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
74a0: 6f 72 64 20 61 6e 64 20 74 68 65 20 0a 23 20 20  ord and the .#  
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73               mas
74c0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
74d0: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 74 68   name so that th
74e0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
74f0: 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20   file.#         
7500: 20 20 20 20 20 20 6e 61 6d 65 20 64 6f 65 73 20        name does 
7510: 6e 6f 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 73  not lie on the s
7520: 61 6d 65 20 73 65 63 74 6f 72 20 61 73 20 74 68  ame sector as th
7530: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 66  e last journal f
7540: 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ile.#           
7550: 20 20 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23 20      record..#.# 
7560: 70 61 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43 68  pager1-5.5.*: Ch
7570: 65 63 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75 72  eck that in jour
7580: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
7590: 20 6d 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61 6c   mode, a journal
75a0: 20 66 69 6c 65 20 69 73 0a 23 20 20 20 20 20 20   file is.#      
75b0: 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61 74           truncat
75c0: 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
75d0: 20 77 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66 69   when a multi-fi
75e0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  le transaction i
75f0: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s .#            
7600: 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e     committed (in
7610: 73 74 65 61 64 20 6f 66 20 74 68 65 20 66 69 72  stead of the fir
7620: 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
7630: 65 73 20 62 65 69 6e 67 20 7a 65 72 6f 65 64 29  es being zeroed)
7640: 2e 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ..#.#.do_test pa
7650: 67 65 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20 66  ger1-5.1.1 {.  f
7660: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
7670: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
7680: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48  sql {.    ATTACH
7690: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
76a0: 75 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ux;.    CREATE T
76b0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
76c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
76d0: 61 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20  aux.t2(a, b);.  
76e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
76f0: 20 56 41 4c 55 45 53 28 31 37 2c 20 27 4c 65 6e   VALUES(17, 'Len
7700: 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  in');.    INSERT
7710: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
7720: 32 32 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a 20  22, 'Stalin');. 
7730: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7740: 31 20 56 41 4c 55 45 53 28 35 33 2c 20 27 4b 68  1 VALUES(53, 'Kh
7750: 72 75 73 68 63 68 65 76 27 29 3b 0a 20 20 7d 0a  rushchev');.  }.
7760: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
7770: 65 72 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65 78  er1-5.1.2 {.  ex
7780: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
7790: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
77a0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36  INTO t1 VALUES(6
77b0: 34 2c 20 27 42 72 65 7a 68 6e 65 76 27 29 3b 0a  4, 'Brezhnev');.
77c0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
77d0: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O t2 SELECT * FR
77e0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  OM t1;.  }.  sql
77f0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
7800: 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  2.  execsql {.  
7810: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
7820: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
7830: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f  .  } db2.} {}.do
7840: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
7850: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
7860: 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61 74  COMMIT.} {1 {dat
7870: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
7880: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
7890: 2d 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  -5.1.4 {.  execs
78a0: 71 6c 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20 20  ql COMMIT db2.  
78b0: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20  execsql COMMIT. 
78c0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
78d0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  T * FROM t2 } db
78e0: 32 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32 32  2.} {17 Lenin 22
78f0: 20 53 74 61 6c 69 6e 20 35 33 20 4b 68 72 75 73   Stalin 53 Khrus
7900: 68 63 68 65 76 20 36 34 20 42 72 65 7a 68 6e 65  hchev 64 Brezhne
7910: 76 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  v}.do_test pager
7920: 31 2d 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32 20  1-5.1.5 {.  db2 
7930: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  close.} {}..do_t
7940: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 32 2e 31  est pager1-5.2.1
7950: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
7960: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
7970: 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 3b  l_mode = memory;
7980: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7990: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
79a0: 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64   VALUES(84, 'And
79b0: 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 20 20 49  ropov');.      I
79c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
79d0: 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70  LUES(84, 'Androp
79e0: 6f 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  ov');.    COMMIT
79f0: 3b 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d  ;.  }.} {memory}
7a00: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7a10: 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  5.3.1 {.  execsq
7a20: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
7a30: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66  ournal_mode = of
7a40: 66 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  f;.    BEGIN;.  
7a50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7a60: 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47  t1 VALUES(85, 'G
7a70: 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20  orbachev');.    
7a80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
7a90: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
7aa0: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f  bachev');.    CO
7ab0: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66  MMIT;.  }.} {off
7ac0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
7ad0: 31 2d 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20 63  1-5.4.1 {.  db c
7ae0: 6c 6f 73 65 0a 20 20 74 65 73 74 76 66 73 20 74  lose.  testvfs t
7af0: 76 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  v.  sqlite3 db t
7b00: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20  est.db -vfs tv. 
7b10: 20 65 78 65 63 73 71 6c 20 7b 20 41 54 54 41 43   execsql { ATTAC
7b20: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
7b30: 61 75 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c 74  aux }..  tv filt
7b40: 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 76 20  er xDelete.  tv 
7b50: 73 63 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72 6e  script max_journ
7b60: 61 6c 5f 73 69 7a 65 0a 20 20 74 76 20 73 65 63  al_size.  tv sec
7b70: 74 6f 72 73 69 7a 65 20 35 31 32 0a 20 20 73 65  torsize 512.  se
7b80: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20  t ::max_journal 
7b90: 30 0a 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f 75  0.  proc max_jou
7ba0: 72 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68 6f  rnal_size {metho
7bb0: 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65  d args} {.    se
7bc0: 74 20 73 7a 20 30 0a 20 20 20 20 63 61 74 63 68  t sz 0.    catch
7bd0: 20 7b 20 73 65 74 20 73 7a 20 5b 66 69 6c 65 20   { set sz [file 
7be0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
7bf0: 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20 7b  rnal] }.    if {
7c00: 24 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75  $sz > $::max_jou
7c10: 72 6e 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73 65  rnal} {.      se
7c20: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20  t ::max_journal 
7c30: 24 73 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  $sz.    }.    re
7c40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  turn SQLITE_OK. 
7c50: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
7c60: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
7c70: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
7c80: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
7c90: 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c  hronous = NORMAL
7ca0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
7cb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7cc0: 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f  1 VALUES(85, 'Go
7cd0: 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20  rbachev');.     
7ce0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
7cf0: 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62  VALUES(85, 'Gorb
7d00: 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d  achev');.    COM
7d10: 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 23 20 54 68  MIT;.  }..  # Th
7d20: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
7d30: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
7d40: 77 3a 0a 20 20 23 20 0a 20 20 23 20 20 20 31 29  w:.  # .  #   1)
7d50: 20 35 31 32 20 62 79 74 65 20 68 65 61 64 65 72   512 byte header
7d60: 20 2b 0a 20 20 23 20 20 20 32 29 20 32 20 2a 20   +.  #   2) 2 * 
7d70: 28 31 30 32 34 2b 38 29 20 62 79 74 65 20 72 65  (1024+8) byte re
7d80: 63 6f 72 64 73 20 2b 0a 20 20 23 20 20 20 33 29  cords +.  #   3)
7d90: 20 32 30 2b 4e 20 62 79 74 65 73 20 6f 66 20 6d   20+N bytes of m
7da0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
7db0: 69 6e 74 65 72 2c 20 77 68 65 72 65 20 4e 20 69  inter, where N i
7dc0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 0a 20  s the size of . 
7dd0: 20 23 20 20 20 20 20 20 74 68 65 20 6d 61 73 74   #      the mast
7de0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
7df0: 65 6e 63 6f 64 65 64 20 61 73 20 75 74 66 2d 38  encoded as utf-8
7e00: 20 77 69 74 68 20 6e 6f 20 6e 75 6c 20 74 65 72   with no nul ter
7e10: 6d 2e 0a 20 20 23 0a 20 20 73 65 74 20 6d 6a 5f  m..  #.  set mj_
7e20: 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b 0a  pointer [expr {.
7e30: 20 20 20 20 32 30 20 2b 20 5b 73 74 72 69 6e 67      20 + [string
7e40: 20 6c 65 6e 67 74 68 20 22 74 65 73 74 2e 64 62   length "test.db
7e50: 2d 6d 6a 58 58 58 58 58 58 39 58 58 22 5d 0a 20  -mjXXXXXX9XX"]. 
7e60: 20 7d 5d 0a 20 20 23 0a 20 20 23 20 20 20 4e 4f   }].  #.  #   NO
7e70: 54 45 3a 20 46 6f 72 20 69 74 65 6d 20 33 20 61  TE: For item 3 a
7e80: 62 6f 76 65 2c 20 69 66 20 74 68 65 20 63 75 72  bove, if the cur
7e90: 72 65 6e 74 20 53 51 4c 69 74 65 20 56 46 53 20  rent SQLite VFS 
7ea0: 6c 61 63 6b 73 20 74 68 65 20 63 6f 6e 63 65 70  lacks the concep
7eb0: 74 20 6f 66 20 61 0a 20 20 23 20 20 20 20 20 20  t of a.  #      
7ec0: 20 20 20 63 75 72 72 65 6e 74 20 64 69 72 65 63     current direc
7ed0: 74 6f 72 79 2c 20 74 68 65 20 6c 65 6e 67 74 68  tory, the length
7ee0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
7ef0: 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 70  directory name p
7f00: 6c 75 73 20 31 0a 20 20 23 20 20 20 20 20 20 20  lus 1.  #       
7f10: 20 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20    character for 
7f20: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 65  the directory se
7f30: 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
7f40: 72 20 61 72 65 20 4e 4f 54 20 63 6f 75 6e 74 65  r are NOT counte
7f50: 64 20 61 73 0a 20 20 23 20 20 20 20 20 20 20 20  d as.  #        
7f60: 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 6f 74   part of the tot
7f70: 61 6c 20 73 69 7a 65 3b 20 6f 74 68 65 72 77 69  al size; otherwi
7f80: 73 65 2c 20 74 68 65 79 20 61 72 65 2e 0a 20 20  se, they are..  
7f90: 23 0a 20 20 69 66 63 61 70 61 62 6c 65 20 63 75  #.  ifcapable cu
7fa0: 72 64 69 72 20 7b 0a 20 20 20 20 73 65 74 20 6d  rdir {.    set m
7fb0: 6a 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20  j_pointer [expr 
7fc0: 7b 24 6d 6a 5f 70 6f 69 6e 74 65 72 20 2b 20 5b  {$mj_pointer + [
7fd0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67  string length [g
7fe0: 65 74 5f 70 77 64 5d 5d 20 2b 20 31 7d 5d 0a 20  et_pwd]] + 1}]. 
7ff0: 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 61   }.  expr {$::ma
8000: 78 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 35 31 32 2b  x_journal==(512+
8010: 32 2a 28 31 30 32 34 2b 38 29 2b 24 6d 6a 5f 70  2*(1024+8)+$mj_p
8020: 6f 69 6e 74 65 72 29 7d 0a 7d 20 31 0a 64 6f 5f  ointer)}.} 1.do_
8030: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e  test pager1-5.4.
8040: 32 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f  2 {.  set ::max_
8050: 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 65 78 65 63  journal 0.  exec
8060: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
8070: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66   synchronous = f
8080: 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ull;.    BEGIN;.
8090: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
80a0: 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27  M t1 WHERE b = '
80b0: 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 20 20 44 45  Lenin';.      DE
80c0: 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45  LETE FROM t2 WHE
80d0: 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a  RE b = 'Lenin';.
80e0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
80f0: 0a 20 20 23 20 49 6e 20 73 79 6e 63 68 72 6f 6e  .  # In synchron
8100: 6f 75 73 3d 66 75 6c 6c 20 6d 6f 64 65 2c 20 74  ous=full mode, t
8110: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
8120: 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74  l pointer is not
8130: 20 77 72 69 74 74 65 6e 0a 20 20 23 20 64 69 72   written.  # dir
8140: 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20  ectly after the 
8150: 6c 61 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74  last record in t
8160: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
8170: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 69 73 0a   Instead, it is.
8180: 20 20 23 20 77 72 69 74 74 65 6e 20 73 74 61 72    # written star
8190: 74 69 6e 67 20 61 74 20 74 68 65 20 6e 65 78 74  ting at the next
81a0: 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 35   (in this case 5
81b0: 31 32 20 62 79 74 65 29 20 73 65 63 74 6f 72 20  12 byte) sector 
81c0: 62 6f 75 6e 64 61 72 79 2e 0a 20 20 23 0a 20 20  boundary..  #.  
81d0: 73 65 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b  set mj_pointer [
81e0: 65 78 70 72 20 7b 0a 20 20 20 20 32 30 20 2b 20  expr {.    20 + 
81f0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 22  [string length "
8200: 74 65 73 74 2e 64 62 2d 6d 6a 58 58 58 58 58 58  test.db-mjXXXXXX
8210: 39 58 58 22 5d 0a 20 20 7d 5d 0a 20 20 23 0a 20  9XX"].  }].  #. 
8220: 20 23 20 20 20 4e 4f 54 45 3a 20 49 66 20 74 68   #   NOTE: If th
8230: 65 20 63 75 72 72 65 6e 74 20 53 51 4c 69 74 65  e current SQLite
8240: 20 56 46 53 20 6c 61 63 6b 73 20 74 68 65 20 63   VFS lacks the c
8250: 6f 6e 63 65 70 74 20 6f 66 20 61 20 63 75 72 72  oncept of a curr
8260: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2c 0a 20  ent directory,. 
8270: 20 23 20 20 20 20 20 20 20 20 20 74 68 65 20 6c   #         the l
8280: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 63 75 72  ength of the cur
8290: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6e  rent directory n
82a0: 61 6d 65 20 70 6c 75 73 20 31 20 63 68 61 72 61  ame plus 1 chara
82b0: 63 74 65 72 20 66 6f 72 20 74 68 65 0a 20 20 23  cter for the.  #
82c0: 20 20 20 20 20 20 20 20 20 64 69 72 65 63 74 6f           directo
82d0: 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ry separator cha
82e0: 72 61 63 74 65 72 20 61 72 65 20 4e 4f 54 20 63  racter are NOT c
82f0: 6f 75 6e 74 65 64 20 61 73 20 70 61 72 74 20 6f  ounted as part o
8300: 66 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 23 20  f the total.  # 
8310: 20 20 20 20 20 20 20 20 73 69 7a 65 3b 20 6f 74          size; ot
8320: 68 65 72 77 69 73 65 2c 20 74 68 65 79 20 61 72  herwise, they ar
8330: 65 2e 0a 20 20 23 0a 20 20 69 66 63 61 70 61 62  e..  #.  ifcapab
8340: 6c 65 20 63 75 72 64 69 72 20 7b 0a 20 20 20 20  le curdir {.    
8350: 73 65 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b  set mj_pointer [
8360: 65 78 70 72 20 7b 24 6d 6a 5f 70 6f 69 6e 74 65  expr {$mj_pointe
8370: 72 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  r + [string leng
8380: 74 68 20 5b 67 65 74 5f 70 77 64 5d 5d 20 2b 20  th [get_pwd]] + 
8390: 31 7d 5d 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b  1}].  }.  expr {
83a0: 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 3d 3d  $::max_journal==
83b0: 28 28 28 35 31 32 2b 32 2a 28 31 30 32 34 2b 38  (((512+2*(1024+8
83c0: 29 2b 35 31 31 29 2f 35 31 32 29 2a 35 31 32 20  )+511)/512)*512 
83d0: 2b 20 24 6d 6a 5f 70 6f 69 6e 74 65 72 29 7d 0a  + $mj_pointer)}.
83e0: 7d 20 31 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  } 1.db close.tv 
83f0: 64 65 6c 65 74 65 0a 0a 64 6f 5f 74 65 73 74 20  delete..do_test 
8400: 70 61 67 65 72 31 2d 35 2e 35 2e 31 20 7b 0a 20  pager1-5.5.1 {. 
8410: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
8420: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
8430: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
8440: 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20  t.db2' AS aux;. 
8450: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
8460: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
8470: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8480: 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20  LE t3(a, b);.   
8490: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
84a0: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
84b0: 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
84c0: 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
84d0: 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 33  1;.    UPDATE t3
84e0: 20 53 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d 62   SET b = randomb
84f0: 6c 6f 62 28 31 35 30 30 29 3b 0a 20 20 7d 0a 20  lob(1500);.  }. 
8500: 20 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65   expr [file size
8510: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
8520: 5d 20 3e 20 31 35 30 30 30 0a 7d 20 7b 31 7d 0a  ] > 15000.} {1}.
8530: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
8540: 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .5.2 {.  execsql
8550: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79   {.    PRAGMA sy
8560: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c  nchronous = full
8570: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
8580: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
8590: 31 20 57 48 45 52 45 20 62 20 3d 20 27 53 74 61  1 WHERE b = 'Sta
85a0: 6c 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c 45  lin';.      DELE
85b0: 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45  TE FROM t2 WHERE
85c0: 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20   b = 'Stalin';. 
85d0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
85e0: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
85f0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
8600: 0a 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
8650: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
8660: 73 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50  sts work with "P
8670: 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63  RAGMA max_page_c
8680: 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74 65 73 74 20  ount".#.do_test 
8690: 70 61 67 65 72 31 2d 36 2e 31 20 7b 0a 20 20 66  pager1-6.1 {.  f
86a0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
86b0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
86c0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
86d0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6e   auto_vacuum = n
86e0: 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  one;.    PRAGMA 
86f0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d  max_page_count =
8700: 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20   10;.    CREATE 
8710: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
8720: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8730: 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t3(a, b);.    C
8740: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61  REATE TABLE t4(a
8750: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
8760: 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29 3b   TABLE t5(a, b);
8770: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8780: 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t6(a, b);.    
8790: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28  CREATE TABLE t7(
87a0: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
87b0: 45 20 54 41 42 4c 45 20 74 38 28 61 2c 20 62 29  E TABLE t8(a, b)
87c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
87d0: 4c 45 20 74 39 28 61 2c 20 62 29 3b 0a 20 20 20  LE t9(a, b);.   
87e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
87f0: 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20 7b  0(a, b);.  }.} {
8800: 31 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  10}.do_catchsql_
8810: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 32 20  test pager1-6.2 
8820: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
8830: 20 74 31 31 28 61 2c 20 62 29 0a 7d 20 7b 31 20   t11(a, b).} {1 
8840: 7b 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73  {database or dis
8850: 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 64 6f 5f 65  k is full}}.do_e
8860: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
8870: 72 31 2d 36 2e 34 20 7b 20 50 52 41 47 4d 41 20  r1-6.4 { PRAGMA 
8880: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 20  max_page_count  
8890: 20 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65 78      } {10}.do_ex
88a0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
88b0: 31 2d 36 2e 35 20 7b 20 50 52 41 47 4d 41 20 6d  1-6.5 { PRAGMA m
88c0: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20  ax_page_count = 
88d0: 31 35 20 7d 20 7b 31 35 7d 0a 64 6f 5f 65 78 65  15 } {15}.do_exe
88e0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
88f0: 2d 36 2e 36 20 7b 20 43 52 45 41 54 45 20 54 41  -6.6 { CREATE TA
8900: 42 4c 45 20 74 31 31 28 61 2c 20 62 29 20 20 20  BLE t11(a, b)   
8910: 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71    } {}.do_execsq
8920: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
8930: 37 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  7 {.  BEGIN;.   
8940: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31   INSERT INTO t11
8950: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
8960: 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61     PRAGMA max_pa
8970: 67 65 5f 63 6f 75 6e 74 20 3d 20 31 33 3b 0a 7d  ge_count = 13;.}
8980: 20 7b 31 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {13}.do_execsql
8990: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 38  _test pager1-6.8
89a0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
89b0: 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 33 2c  TO t11 VALUES(3,
89c0: 20 34 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   4);.    PRAGMA 
89d0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d  max_page_count =
89e0: 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a 64 6f 5f 65   10;.} {11}.do_e
89f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
8a00: 72 31 2d 36 2e 39 20 7b 20 43 4f 4d 4d 49 54 20  r1-6.9 { COMMIT 
8a10: 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  } {}..do_execsql
8a20: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31  _test pager1-6.1
8a30: 30 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70  0 { PRAGMA max_p
8a40: 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 20 7d  age_count = 10 }
8a50: 20 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {11}.do_execsql
8a60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31  _test pager1-6.1
8a70: 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1 { SELECT * FRO
8a80: 4d 20 74 31 31 20 7d 20 20 20 20 20 20 20 20 20  M t11 }         
8a90: 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 65 78   {1 2 3 4}.do_ex
8aa0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
8ab0: 31 2d 36 2e 31 32 20 7b 20 50 52 41 47 4d 41 20  1-6.12 { PRAGMA 
8ac0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 7d  max_page_count }
8ad0: 20 20 20 20 20 20 7b 31 31 7d 0a 0a 0a 23 2d 2d        {11}...#--
8ae0: 2d 2d 2d 2d 2d 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 0a 23 20 54 68 65 20 66 6f  -------.# The fo
8b30: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f  llowing tests wo
8b40: 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41 20  rk with "PRAGMA 
8b50: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55  journal_mode=TRU
8b60: 4e 43 41 54 45 22 20 61 6e 64 0a 23 20 22 50 52  NCATE" and.# "PR
8b70: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
8b80: 65 3d 45 58 43 4c 55 53 49 56 45 22 2e 0a 23 0a  e=EXCLUSIVE"..#.
8b90: 23 20 45 61 63 68 20 74 65 73 74 20 69 73 20 73  # Each test is s
8ba0: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 35 20  pecified with 5 
8bb0: 76 61 72 69 61 62 6c 65 73 2e 20 41 73 20 66 6f  variables. As fo
8bc0: 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 24 74 6e  llows:.#.#   $tn
8bd0: 3a 20 20 54 65 73 74 20 4e 75 6d 62 65 72 2e 20  :  Test Number. 
8be0: 55 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  Used as part of 
8bf0: 74 68 65 20 5b 64 6f 5f 74 65 73 74 5d 20 74 65  the [do_test] te
8c00: 73 74 20 6e 61 6d 65 73 2e 0a 23 20 20 20 24 73  st names..#   $s
8c10: 71 6c 3a 20 53 51 4c 20 74 6f 20 65 78 65 63 75  ql: SQL to execu
8c20: 74 65 2e 0a 23 20 20 20 24 72 65 73 3a 20 45 78  te..#   $res: Ex
8c30: 70 65 63 74 65 64 20 72 65 73 75 6c 74 20 6f 66  pected result of
8c40: 20 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 2e   executing $sql.
8c50: 0a 23 20 20 20 24 6a 73 3a 20 20 54 68 65 20 65  .#   $js:  The e
8c60: 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20  xpected size of 
8c70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8c80: 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74 65  , in bytes, afte
8c90: 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20 20  r executing.#   
8ca0: 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73 63        the SQL sc
8cb0: 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20 74  ript. Or -1 if t
8cc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
8cd0: 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65 78  t expected to ex
8ce0: 69 73 74 2e 0a 23 20 20 20 24 77 73 3a 20 20 54  ist..#   $ws:  T
8cf0: 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65  he expected size
8d00: 20 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65   of the WAL file
8d10: 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74 65  , in bytes, afte
8d20: 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20 20  r executing.#   
8d30: 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73 63        the SQL sc
8d40: 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20 74  ript. Or -1 if t
8d50: 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 65 78  he WAL is not ex
8d60: 70 65 63 74 65 64 20 74 6f 20 65 78 69 73 74 2e  pected to exist.
8d70: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c  .#.ifcapable wal
8d80: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
8d90: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
8da0: 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71    foreach {tn sq
8db0: 6c 20 72 65 73 20 6a 73 20 77 73 7d 20 5b 73 75  l res js ws} [su
8dc0: 62 73 74 20 7b 0a 20 20 0a 20 20 20 20 31 20 20  bst {.  .    1  
8dd0: 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  {.      CREATE T
8de0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
8df0: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f       PRAGMA auto
8e00: 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a 20 20 20  _vacuum=OFF;.   
8e10: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
8e20: 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20  onous=NORMAL;.  
8e30: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
8e40: 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20 20 20 20  size=1024;.     
8e50: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
8e60: 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b 0a  mode=EXCLUSIVE;.
8e70: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
8e80: 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41  rnal_mode=TRUNCA
8e90: 54 45 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  TE;.      INSERT
8ea0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8eb0: 31 2c 20 32 29 3b 0a 20 20 20 20 7d 20 7b 65 78  1, 2);.    } {ex
8ec0: 63 6c 75 73 69 76 65 20 74 72 75 6e 63 61 74 65  clusive truncate
8ed0: 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 32 20  } 0 -1.  .    2 
8ee0: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 20 49   {.      BEGIN I
8ef0: 4d 4d 45 44 49 41 54 45 3b 0a 20 20 20 20 20 20  MMEDIATE;.      
8f00: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
8f10: 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  t1;.      COMMIT
8f20: 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d 20 30 20  ;.    } {1 2} 0 
8f30: 2d 31 0a 20 20 0a 20 20 20 20 33 20 20 7b 0a 20  -1.  .    3  {. 
8f40: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
8f50: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
8f60: 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d  M t1;.      COMM
8f70: 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d 20  IT;.    } {1 2} 
8f80: 30 20 2d 31 0a 20 20 0a 20 20 20 20 34 20 20 7b  0 -1.  .    4  {
8f90: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
8fa0: 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20 20 20 20  mode = WAL }    
8fb0: 77 61 6c 20 20 20 20 20 20 20 2d 31 20 2d 31 0a  wal       -1 -1.
8fc0: 20 20 20 20 35 20 20 7b 20 49 4e 53 45 52 54 20      5  { INSERT 
8fd0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
8fe0: 2c 20 34 29 20 7d 20 20 7b 7d 20 20 20 20 20 20  , 4) }  {}      
8ff0: 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73    -1 [wal_file_s
9000: 69 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 20 20  ize 1 1024].    
9010: 36 20 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b  6  { PRAGMA lock
9020: 69 6e 67 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41  ing_mode = NORMA
9030: 4c 20 7d 20 65 78 63 6c 75 73 69 76 65 20 2d 31  L } exclusive -1
9040: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
9050: 31 20 31 30 32 34 5d 0a 20 20 20 20 37 20 20 7b  1 1024].    7  {
9060: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9070: 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 20 7d 20  VALUES(5, 6); } 
9080: 7b 7d 20 20 20 20 20 20 20 20 2d 31 20 5b 77 61  {}        -1 [wa
9090: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31 30  l_file_size 2 10
90a0: 32 34 5d 0a 20 20 0a 20 20 20 20 38 20 20 7b 20  24].  .    8  { 
90b0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
90c0: 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45 20 7d  ode = TRUNCATE }
90d0: 20 74 72 75 6e 63 61 74 65 20 20 20 20 20 20 20   truncate       
90e0: 20 20 20 30 20 2d 31 0a 20 20 20 20 39 20 20 7b     0 -1.    9  {
90f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9100: 56 41 4c 55 45 53 28 37 2c 20 38 29 20 7d 20 20  VALUES(7, 8) }  
9110: 20 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20 20    {}            
9120: 20 20 20 20 30 20 2d 31 0a 20 20 20 20 31 30 20      0 -1.    10 
9130: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
9140: 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  t1 }            
9150: 20 20 20 7b 31 20 32 20 33 20 34 20 35 20 36 20     {1 2 3 4 5 6 
9160: 37 20 38 7d 20 30 20 2d 31 0a 20 20 0a 20 20 7d  7 8} 0 -1.  .  }
9170: 5d 20 7b 0a 20 20 20 20 64 6f 5f 65 78 65 63 73  ] {.    do_execs
9180: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37  ql_test pager1-7
9190: 2e 31 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24 72  .1.$tn.1 $sql $r
91a0: 65 73 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73  es.    catch { s
91b0: 65 74 20 4a 20 2d 31 20 3b 20 73 65 74 20 4a 20  et J -1 ; set J 
91c0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
91d0: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20 20  db-journal] }.  
91e0: 20 20 63 61 74 63 68 20 7b 20 73 65 74 20 57 20    catch { set W 
91f0: 2d 31 20 3b 20 73 65 74 20 57 20 5b 66 69 6c 65  -1 ; set W [file
9200: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
9210: 6c 5d 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  l] }.    do_test
9220: 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e   pager1-7.1.$tn.
9230: 32 20 7b 20 6c 69 73 74 20 24 4a 20 24 57 20 7d  2 { list $J $W }
9240: 20 5b 6c 69 73 74 20 24 6a 73 20 24 77 73 5d 0a   [list $js $ws].
9250: 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70    }.}..do_test p
9260: 61 67 65 72 31 2d 37 2e 32 2e 31 20 7b 0a 20 20  ager1-7.2.1 {.  
9270: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
9280: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
9290: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
92a0: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
92b0: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20   EXCLUSIVE;.    
92c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
92d0: 61 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49 4e  a, b);.    BEGIN
92e0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
92f0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
9300: 6c 65 74 65 3b 0a 20 20 20 20 20 20 50 52 41 47  lete;.      PRAG
9310: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
9320: 3d 20 74 72 75 6e 63 61 74 65 3b 0a 20 20 7d 0a  = truncate;.  }.
9330: 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 64 65 6c  } {exclusive del
9340: 65 74 65 20 74 72 75 6e 63 61 74 65 7d 0a 64 6f  ete truncate}.do
9350: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32  _test pager1-7.2
9360: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
9370: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9380: 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 20  VALUES(1, 2) }. 
9390: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
93a0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
93b0: 20 70 65 72 73 69 73 74 20 7d 0a 7d 20 7b 74 72   persist }.} {tr
93c0: 75 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20  uncate}.do_test 
93d0: 70 61 67 65 72 31 2d 37 2e 32 2e 33 20 7b 0a 20  pager1-7.2.3 {. 
93e0: 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49   execsql { COMMI
93f0: 54 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  T }.  execsql {.
9400: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
9410: 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73  al_mode = persis
9420: 74 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  t;.    PRAGMA jo
9430: 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74  urnal_size_limit
9440: 3b 0a 20 20 7d 0a 7d 20 7b 70 65 72 73 69 73 74  ;.  }.} {persist
9450: 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   -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: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
94b0: 20 74 65 73 74 73 2c 20 70 61 67 65 72 31 2d 38   tests, pager1-8
94c0: 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 74 68  .*, test that th
94d0: 65 20 73 70 65 63 69 61 6c 20 66 69 6c 65 6e 61  e special filena
94e0: 6d 65 73 20 0a 23 20 22 3a 6d 65 6d 6f 72 79 3a  mes .# ":memory:
94f0: 22 20 61 6e 64 20 22 22 20 6f 70 65 6e 20 74 65  " and "" open te
9500: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
9510: 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  s..#.foreach {tn
9520: 20 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20 31   filename} {.  1
9530: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 32 20 22 22   :memory:.  2 ""
9540: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  .} {.  do_test p
9550: 61 67 65 72 31 2d 38 2e 24 74 6e 2e 31 20 7b 0a  ager1-8.$tn.1 {.
9560: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c      faultsim_del
9570: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
9580: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
9590: 73 71 6c 69 74 65 33 20 64 62 20 24 66 69 6c 65  sqlite3 db $file
95a0: 6e 61 6d 65 0a 20 20 20 20 65 78 65 63 73 71 6c  name.    execsql
95b0: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
95c0: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b  auto_vacuum = 1;
95d0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
95e0: 42 4c 45 20 78 31 28 78 29 3b 0a 20 20 20 20 20  BLE x1(x);.     
95f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
9600: 56 41 4c 55 45 53 28 27 43 68 61 72 6c 65 73 27  VALUES('Charles'
9610: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
9620: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27  INTO x1 VALUES('
9630: 4a 61 6d 65 73 27 29 3b 0a 20 20 20 20 20 20 49  James');.      I
9640: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41  NSERT INTO x1 VA
9650: 4c 55 45 53 28 27 4d 61 72 79 27 29 3b 0a 20 20  LUES('Mary');.  
9660: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
9670: 4d 20 78 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M x1;.    }.  } 
9680: 7b 43 68 61 72 6c 65 73 20 4a 61 6d 65 73 20 4d  {Charles James M
9690: 61 72 79 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  ary}..  do_test 
96a0: 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 32 20 7b  pager1-8.$tn.2 {
96b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
96c0: 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 63   $filename.    c
96d0: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
96e0: 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20 64 62 32   * FROM x1 } db2
96f0: 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68  .  } {1 {no such
9700: 20 74 61 62 6c 65 3a 20 78 31 7d 7d 0a 0a 20 20   table: x1}}..  
9710: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9720: 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 33 20 7b  pager1-8.$tn.3 {
9730: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
9740: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
9750: 20 56 41 4c 55 45 53 28 27 57 69 6c 6c 69 61 6d   VALUES('William
9760: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
9770: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
9780: 27 41 6e 6e 65 27 29 3b 0a 20 20 20 20 52 4f 4c  'Anne');.    ROL
9790: 4c 42 41 43 4b 3b 0a 20 20 7d 20 7b 7d 0a 7d 0a  LBACK;.  } {}.}.
97a0: 0a 23 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 68  -----------.# Th
97f0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
9800: 74 65 73 74 73 20 2d 20 70 61 67 65 72 31 2d 39  tests - pager1-9
9810: 2e 2a 20 2d 20 64 65 61 6c 20 77 69 74 68 20 69  .* - deal with i
9820: 6e 74 65 72 61 63 74 69 6f 6e 73 20 62 65 74 77  nteractions betw
9830: 65 65 6e 0a 23 20 74 68 65 20 70 61 67 65 72 20  een.# the pager 
9840: 61 6e 64 20 74 68 65 20 62 61 63 6b 75 70 20 41  and the backup A
9850: 50 49 2e 20 54 65 73 74 20 63 61 73 65 73 3a 0a  PI. Test cases:.
9860: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e 31  #.#   pager1-9.1
9870: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61 20  .*: Test that a 
9880: 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65 73  backup completes
9890: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65 76   successfully ev
98a0: 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20 20  en if the.#     
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 72              sour
98c0: 63 65 20 64 62 20 69 73 20 77 72 69 74 74 65 6e  ce db is written
98d0: 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 62   to during the b
98e0: 61 63 6b 75 70 20 6f 70 2e 0a 23 0a 23 20 20 20  ackup op..#.#   
98f0: 70 61 67 65 72 31 2d 39 2e 32 2e 2a 3a 20 54 65  pager1-9.2.*: Te
9900: 73 74 20 74 68 61 74 20 61 20 62 61 63 6b 75 70  st that a backup
9910: 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65   completes succe
9920: 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66 20  ssfully even if 
9930: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
9940: 20 20 20 20 20 20 73 6f 75 72 63 65 20 64 62 20        source db 
9950: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 61 6e  is written to an
9960: 64 20 74 68 65 6e 20 72 6f 6c 6c 65 64 20 62 61  d then rolled ba
9970: 63 6b 20 64 75 72 69 6e 67 20 61 20 0a 23 20 20  ck during a .#  
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
9990: 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 2e  ackup operation.
99a0: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
99b0: 31 2d 39 2e 30 2e 31 20 7b 0a 20 20 66 61 75 6c  1-9.0.1 {.  faul
99c0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
99d0: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
99e0: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
99f0: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
9a00: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
9a10: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42  size = 10;.    B
9a20: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
9a30: 54 45 20 54 41 42 4c 45 20 61 62 28 61 2c 20 62  TE TABLE ab(a, b
9a40: 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b  , UNIQUE(a, b));
9a50: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9a60: 54 4f 20 61 62 20 56 41 4c 55 45 53 28 20 61 5f  TO ab VALUES( a_
9a70: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
9a80: 74 72 69 6e 67 28 33 30 30 29 20 29 3b 0a 20 20  tring(300) );.  
9a90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9aa0: 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  ab SELECT a_stri
9ab0: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
9ac0: 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a  g(300) FROM ab;.
9ad0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9ae0: 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74  O ab SELECT a_st
9af0: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
9b00: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62  ing(300) FROM ab
9b10: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9b20: 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f  NTO ab SELECT a_
9b30: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
9b40: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
9b50: 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ab;.      INSERT
9b60: 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20   INTO ab SELECT 
9b70: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
9b80: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
9b90: 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45  M ab;.      INSE
9ba0: 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43  RT INTO ab SELEC
9bb0: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
9bc0: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
9bd0: 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e  ROM ab;.      IN
9be0: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c  SERT INTO ab SEL
9bf0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
9c00: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
9c10: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20   FROM ab;.      
9c20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53  INSERT INTO ab S
9c30: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
9c40: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
9c50: 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20  0) FROM ab;.    
9c60: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
9c70: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9c80: 39 2e 30 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  9.0.2 {.  sqlite
9c90: 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20  3 db2 test.db2. 
9ca0: 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41 47   db2 eval { PRAG
9cb0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
9cc0: 31 30 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  10 }.  sqlite3_b
9cd0: 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e  ackup B db2 main
9ce0: 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74 20   db main.  list 
9cf0: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
9d00: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
9d10: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
9d20: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9d30: 72 31 2d 39 2e 30 2e 33 20 7b 0a 20 64 62 20 6f  r1-9.0.3 {. db o
9d40: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
9d50: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
9d60: 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c  .} [db2 one {SEL
9d70: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
9d80: 20 46 52 4f 4d 20 61 62 7d 5d 0a 0a 64 6f 5f 74   FROM ab}]..do_t
9d90: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 31  est pager1-9.1.1
9da0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55   {.  execsql { U
9db0: 50 44 41 54 45 20 61 62 20 53 45 54 20 61 20 3d  PDATE ab SET a =
9dc0: 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29 20 7d   a_string(201) }
9dd0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
9de0: 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20  p B db2 main db 
9df0: 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30  main.  B step 30
9e00: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  .} {SQLITE_OK}.d
9e10: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9e20: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
9e30: 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20  { UPDATE ab SET 
9e40: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 31  b = a_string(301
9e50: 29 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20 73 74  ) }.  list [B st
9e60: 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e  ep 10000] [B fin
9e70: 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  ish].} {SQLITE_D
9e80: 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  ONE SQLITE_OK}.d
9e90: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9ea0: 31 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53  1.3 {. db one {S
9eb0: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
9ec0: 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64  b) FROM ab}.} [d
9ed0: 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  b2 one {SELECT m
9ee0: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
9ef0: 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20 70 61   ab}].do_test pa
9f00: 67 65 72 31 2d 39 2e 31 2e 34 20 7b 20 65 78 65  ger1-9.1.4 { exe
9f10: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
9f20: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 20 7d  unt(*) FROM ab }
9f30: 20 7d 20 7b 31 32 38 7d 0a 0a 64 6f 5f 74 65 73   } {128}..do_tes
9f40: 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 31 20 7b  t pager1-9.2.1 {
9f50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44  .  execsql { UPD
9f60: 41 54 45 20 61 62 20 53 45 54 20 61 20 3d 20 61  ATE ab SET a = a
9f70: 5f 73 74 72 69 6e 67 28 32 30 32 29 20 7d 0a 20  _string(202) }. 
9f80: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
9f90: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
9fa0: 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30 0a 7d  in.  B step 30.}
9fb0: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f   {SQLITE_OK}.do_
9fc0: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e  test pager1-9.2.
9fd0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
9fe0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
9ff0: 20 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20    UPDATE ab SET 
a000: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 31  b = a_string(301
a010: 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b  );.    ROLLBACK;
a020: 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20 73  .  }.  list [B s
a030: 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69  tep 10000] [B fi
a040: 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f  nish].} {SQLITE_
a050: 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a  DONE SQLITE_OK}.
a060: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
a070: 2e 32 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b  .2.3 {. db one {
a080: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c  SELECT md5sum(a,
a090: 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b   b) FROM ab}.} [
a0a0: 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20  db2 one {SELECT 
a0b0: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
a0c0: 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20 70  M ab}].do_test p
a0d0: 61 67 65 72 31 2d 39 2e 32 2e 34 20 7b 20 65 78  ager1-9.2.4 { ex
a0e0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
a0f0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 20  ount(*) FROM ab 
a100: 7d 20 7d 20 7b 31 32 38 7d 0a 64 62 20 63 6c 6f  } } {128}.db clo
a110: 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64 6f  se.db2 close..do
a120: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33  _test pager1-9.3
a130: 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74  .1 {.  testvfs t
a140: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74  v -default 1.  t
a150: 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39  v sectorsize 409
a160: 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  6.  faultsim_del
a170: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a  ete_and_reopen..
a180: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
a190: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
a1a0: 30 32 34 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74  024 }.  for {set
a1b0: 20 69 69 20 30 7d 20 7b 24 69 69 20 3c 20 34 7d   ii 0} {$ii < 4}
a1c0: 20 7b 69 6e 63 72 20 69 69 7d 20 7b 20 65 78 65   {incr ii} { exe
a1d0: 63 73 71 6c 20 22 43 52 45 41 54 45 20 54 41 42  csql "CREATE TAB
a1e0: 4c 45 20 74 24 7b 69 69 7d 28 61 2c 20 62 29 22  LE t${ii}(a, b)"
a1f0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
a200: 70 61 67 65 72 31 2d 39 2e 33 2e 32 20 7b 0a 20  pager1-9.3.2 {. 
a210: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
a220: 74 2e 64 62 32 0a 0a 20 20 65 78 65 63 73 71 6c  t.db2..  execsql
a230: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
a240: 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a  ge_size = 4096;.
a250: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
a260: 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 20 20  ronous = OFF;.  
a270: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a280: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
a290: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
a2a0: 62 29 3b 0a 20 20 7d 20 64 62 32 0a 0a 20 20 73  b);.  } db2..  s
a2b0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20  qlite3_backup B 
a2c0: 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e  db2 main db main
a2d0: 0a 20 20 42 20 73 74 65 70 20 33 30 0a 20 20 6c  .  B step 30.  l
a2e0: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
a2f0: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
a300: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
a310: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
a320: 70 61 67 65 72 31 2d 39 2e 33 2e 33 20 7b 0a 20  pager1-9.3.3 {. 
a330: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 64 62 20   db2 close.  db 
a340: 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74  close.  tv delet
a350: 65 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  e.  file size te
a360: 73 74 2e 64 62 32 0a 7d 20 5b 66 69 6c 65 20 73  st.db2.} [file s
a370: 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 0a 64 6f  ize test.db]..do
a380: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 34  _test pager1-9.4
a390: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
a3a0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
a3b0: 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  n.  sqlite3 db2 
a3c0: 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73  test.db2.  execs
a3d0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
a3e0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36  page_size = 4096
a3f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
a400: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
a410: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
a420: 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a  (a, b);.  } db2.
a430: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
a440: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
a450: 61 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74  ain.  list [B st
a460: 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e  ep 10000] [B fin
a470: 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  ish].} {SQLITE_D
a480: 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  ONE SQLITE_OK}.d
a490: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
a4a0: 34 2e 32 20 7b 0a 20 20 6c 69 73 74 20 5b 66 69  4.2 {.  list [fi
a4b0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 32  le size test.db2
a4c0: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
a4d0: 74 2e 64 62 5d 0a 7d 20 7b 31 30 32 34 20 30 7d  t.db].} {1024 0}
a4e0: 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d  .db2 close..#---
a4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
a540: 61 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  at regardless of
a550: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
a560: 6e 65 64 20 62 79 20 78 53 65 63 74 6f 72 53 69  ned by xSectorSi
a570: 7a 65 28 29 2c 20 74 68 65 0a 23 20 6d 69 6e 69  ze(), the.# mini
a580: 6d 75 6d 20 65 66 66 65 63 74 69 76 65 20 73 65  mum effective se
a590: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 35 31 32  ctor-size is 512
a5a0: 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
a5b0: 20 36 35 35 33 36 20 62 79 74 65 73 2e 0a 23 0a   65536 bytes..#.
a5c0: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
a5d0: 75 6c 74 20 31 0a 66 6f 72 65 61 63 68 20 73 65  ult 1.foreach se
a5e0: 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20 20 20 31  ctorsize {.    1
a5f0: 36 0a 20 20 20 20 33 32 20 20 20 36 34 20 20 20  6.    32   64   
a600: 31 32 38 20 20 20 32 35 36 20 20 20 35 31 32 20  128   256   512 
a610: 20 20 31 30 32 34 20 20 20 32 30 34 38 20 0a 20    1024   2048 . 
a620: 20 20 20 34 30 39 36 20 38 31 39 32 20 31 36 33     4096 8192 163
a630: 38 34 20 33 32 37 36 38 20 36 35 35 33 36 20 31  84 32768 65536 1
a640: 33 31 30 37 32 20 32 36 32 31 34 34 0a 7d 20 7b  31072 262144.} {
a650: 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65  .  tv sectorsize
a660: 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 74   $sectorsize.  t
a670: 76 20 64 65 76 63 68 61 72 20 7b 7d 0a 20 20 73  v devchar {}.  s
a680: 65 74 20 65 66 66 20 24 73 65 63 74 6f 72 73 69  et eff $sectorsi
a690: 7a 65 0a 20 20 69 66 20 7b 24 73 65 63 74 6f 72  ze.  if {$sector
a6a0: 73 69 7a 65 20 3c 20 35 31 32 7d 20 20 20 7b 20  size < 512}   { 
a6b0: 73 65 74 20 65 66 66 20 35 31 32 20 7d 0a 20 20  set eff 512 }.  
a6c0: 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20  if {$sectorsize 
a6d0: 3e 20 36 35 35 33 36 7d 20 7b 20 73 65 74 20 65  > 65536} { set e
a6e0: 66 66 20 36 35 35 33 36 20 7d 0a 0a 20 20 64 6f  ff 65536 }..  do
a6f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e  _test pager1-10.
a700: 24 73 65 63 74 6f 72 73 69 7a 65 2e 31 20 7b 0a  $sectorsize.1 {.
a710: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c      faultsim_del
a720: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
a730: 20 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72     db func a_str
a740: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20  ing a_string.   
a750: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
a760: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
a770: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
a780: 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67        PRAGMA pag
a790: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
a7a0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
a7b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a7c0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
a7d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a7e0: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t2(a, b);.      
a7f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a800: 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43  3(a, b);.      C
a810: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 20  OMMIT;.    }.   
a820: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
a830: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 5b  db-journal.  } [
a840: 65 78 70 72 20 24 73 65 63 74 6f 72 73 69 7a 65  expr $sectorsize
a850: 20 3e 20 36 35 35 33 36 20 3f 20 36 35 35 33 36   > 65536 ? 65536
a860: 20 3a 20 28 24 73 65 63 74 6f 72 73 69 7a 65 3c   : ($sectorsize<
a870: 33 32 20 3f 20 35 31 32 20 3a 20 24 73 65 63 74  32 ? 512 : $sect
a880: 6f 72 73 69 7a 65 29 5d 0a 0a 20 20 64 6f 5f 74  orsize)]..  do_t
a890: 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73  est pager1-10.$s
a8a0: 65 63 74 6f 72 73 69 7a 65 2e 32 20 7b 0a 20 20  ectorsize.2 {.  
a8b0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
a8c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a8d0: 33 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  3 VALUES(a_strin
a8e0: 67 28 33 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(300), a_string
a8f0: 28 33 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e  (300));.      IN
a900: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
a910: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20  ECT * FROM t3;  
a920: 20 20 20 20 20 20 2f 2a 20 20 32 20 2a 2f 0a 20        /*  2 */. 
a930: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
a940: 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t3 SELECT * FRO
a950: 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20  M t3;        /* 
a960: 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   4 */.      INSE
a970: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
a980: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20  T * FROM t3;    
a990: 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20      /*  8 */.   
a9a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a9b0: 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  3 SELECT * FROM 
a9c0: 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 31 36  t3;        /* 16
a9d0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
a9e0: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
a9f0: 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20  * FROM t3;      
aa00: 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 7d    /* 32 */.    }
aa10: 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65  .  } {}..  do_te
aa20: 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65  st pager1-10.$se
aa30: 63 74 6f 72 73 69 7a 65 2e 33 20 7b 0a 20 20 20  ctorsize.3 {.   
aa40: 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71   db close.    sq
aa50: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
aa60: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
aa70: 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
aa80: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
aa90: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 7d      BEGIN;.    }
aaa0: 0a 20 20 20 20 72 65 63 75 72 73 69 76 65 5f 73  .    recursive_s
aab0: 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62 20  elect 32 t3 {db 
aac0: 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  eval "INSERT INT
aad0: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32  O t2 VALUES(1, 2
aae0: 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  )"}.    execsql 
aaf0: 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  {.      COMMIT;.
ab00: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
ab10: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20  ROM t2;.    }.  
ab20: 7d 20 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f 74 65  } {1 2}..  do_te
ab30: 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65  st pager1-10.$se
ab40: 63 74 6f 72 73 69 7a 65 2e 34 20 7b 0a 20 20 20  ctorsize.4 {.   
ab50: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
ab60: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36   CREATE TABLE t6
ab70: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52  (a, b);.      CR
ab80: 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c  EATE TABLE t7(a,
ab90: 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54   b);.      CREAT
aba0: 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29  E TABLE t5(a, b)
abb0: 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42  ;.      DROP TAB
abc0: 4c 45 20 74 36 3b 0a 20 20 20 20 20 20 44 52 4f  LE t6;.      DRO
abd0: 50 20 54 41 42 4c 45 20 74 37 3b 0a 20 20 20 20  P TABLE t7;.    
abe0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  }.    execsql {.
abf0: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
ac00: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
ac10: 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t6(a, b);.    
ac20: 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65 5f  }.    recursive_
ac30: 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62  select 32 t3 {db
ac40: 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e   eval "INSERT IN
ac50: 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c 20  TO t5 VALUES(1, 
ac60: 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  2)"}.    execsql
ac70: 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b   {.      COMMIT;
ac80: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
ac90: 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d 0a 20  FROM t5;.    }. 
aca0: 20 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a 64 62   } {1 2}.  .}.db
acb0: 20 63 6c 6f 73 65 0a 0a 74 76 20 73 65 63 74 6f   close..tv secto
acc0: 72 73 69 7a 65 20 34 30 39 36 0a 64 6f 5f 74 65  rsize 4096.do_te
acd0: 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e 31  st pager1.10.x.1
ace0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
acf0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
ad00: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
ad10: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
ad20: 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50  um = none;.    P
ad30: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
ad40: 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41  = 1024;.    CREA
ad50: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
ad60: 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69    }.  for {set i
ad70: 20 30 7d 20 7b 24 69 3c 33 30 7d 20 7b 69 6e 63   0} {$i<30} {inc
ad80: 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  r i} {.    execs
ad90: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
ada0: 20 74 31 20 56 41 4c 55 45 53 28 7a 65 72 6f 62   t1 VALUES(zerob
adb0: 6c 6f 62 28 39 30 30 29 29 20 7d 0a 20 20 7d 0a  lob(900)) }.  }.
adc0: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
add0: 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d 0a 64 6f  .db.} {32768}.do
ade0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e  _test pager1.10.
adf0: 78 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  x.2 {.  execsql 
ae00: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
ae10: 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 44 52  LE t2(x);.    DR
ae20: 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 7d  OP TABLE t2;.  }
ae30: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
ae40: 74 2e 64 62 0a 7d 20 7b 33 33 37 39 32 7d 0a 64  t.db.} {33792}.d
ae50: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30  o_test pager1.10
ae60: 2e 78 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .x.3 {.  execsql
ae70: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
ae80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
ae90: 32 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65 63 75  2(x);.  }.  recu
aea0: 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 30 20  rsive_select 30 
aeb0: 74 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  t1.  execsql {. 
aec0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
aed0: 74 33 28 78 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  t3(x);.    COMMI
aee0: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 62 20  T;.  }.} {}..db 
aef0: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
af00: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
af10: 61 75 6c 74 20 31 0a 66 61 75 6c 74 73 69 6d 5f  ault 1.faultsim_
af20: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
af30: 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  n.db func a_stri
af40: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 64 6f 5f 65  ng a_string.do_e
af50: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
af60: 72 31 2d 31 31 2e 31 20 7b 0a 20 20 50 52 41 47  r1-11.1 {.  PRAG
af70: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
af80: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 50 52 41 47  = DELETE;.  PRAG
af90: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
afa0: 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  10;.  BEGIN;.   
afb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a 7a   CREATE TABLE zz
afc0: 28 74 6f 70 20 50 52 49 4d 41 52 59 20 4b 45 59  (top PRIMARY KEY
afd0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
afe0: 54 4f 20 7a 7a 20 56 41 4c 55 45 53 28 61 5f 73  TO zz VALUES(a_s
aff0: 74 72 69 6e 67 28 32 32 32 29 29 3b 0a 20 20 20  tring(222));.   
b000: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20   INSERT INTO zz 
b010: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
b020: 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28  (SELECT 222+max(
b030: 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29  rowid) FROM zz))
b040: 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e   FROM zz;.    IN
b050: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c  SERT INTO zz SEL
b060: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45  ECT a_string((SE
b070: 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77  LECT 222+max(row
b080: 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52  id) FROM zz)) FR
b090: 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52  OM zz;.    INSER
b0a0: 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54  T INTO zz SELECT
b0b0: 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43   a_string((SELEC
b0c0: 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29  T 222+max(rowid)
b0d0: 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20   FROM zz)) FROM 
b0e0: 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  zz;.    INSERT I
b0f0: 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f  NTO zz SELECT a_
b100: 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32  string((SELECT 2
b110: 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52  22+max(rowid) FR
b120: 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b  OM zz)) FROM zz;
b130: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b140: 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72   zz SELECT a_str
b150: 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b  ing((SELECT 222+
b160: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
b170: 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20  zz)) FROM zz;.  
b180: 43 4f 4d 4d 49 54 3b 0a 20 20 42 45 47 49 4e 3b  COMMIT;.  BEGIN;
b190: 0a 20 20 20 20 55 50 44 41 54 45 20 7a 7a 20 53  .    UPDATE zz S
b1a0: 45 54 20 74 6f 70 20 3d 20 61 5f 73 74 72 69 6e  ET top = a_strin
b1b0: 67 28 33 34 35 29 3b 0a 7d 20 7b 64 65 6c 65 74  g(345);.} {delet
b1c0: 65 7d 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75 74  e}..proc lockout
b1d0: 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b   {method args} {
b1e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
b1f0: 4f 45 52 52 20 7d 0a 74 76 20 73 63 72 69 70 74  OERR }.tv script
b200: 20 6c 6f 63 6b 6f 75 74 0a 74 76 20 66 69 6c 74   lockout.tv filt
b210: 65 72 20 7b 78 57 72 69 74 65 20 78 54 72 75 6e  er {xWrite xTrun
b220: 63 61 74 65 20 78 53 79 6e 63 7d 0a 64 6f 5f 63  cate xSync}.do_c
b230: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67  atchsql_test pag
b240: 65 72 31 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d 49  er1-11.2 { COMMI
b250: 54 20 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f  T } {1 {disk I/O
b260: 20 65 72 72 6f 72 7d 7d 0a 0a 74 76 20 73 63 72   error}}..tv scr
b270: 69 70 74 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  ipt {}.do_test p
b280: 61 67 65 72 31 2d 31 31 2e 33 20 7b 0a 20 20 73  ager1-11.3 {.  s
b290: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
b2a0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
b2b0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
b2c0: 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54  l_mode = TRUNCAT
b2d0: 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  E;.    PRAGMA in
b2e0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
b2f0: 20 7d 20 64 62 32 0a 7d 20 7b 74 72 75 6e 63 61   } db2.} {trunca
b300: 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70  te ok}.do_test p
b310: 61 67 65 72 31 2d 31 31 2e 34 20 7b 0a 20 20 64  ager1-11.4 {.  d
b320: 62 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20  b2 close.  file 
b330: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
b340: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f  ournal.} {0}.do_
b350: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
b360: 65 72 31 2d 31 31 2e 35 20 7b 20 53 45 4c 45 43  er1-11.5 { SELEC
b370: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
b380: 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62 20 63 6c 6f  zz } {32}.db clo
b390: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 20 20 0a  se.tv delete.  .
b3a0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
b3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
b3f0: 74 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73  t "PRAGMA page_s
b400: 69 7a 65 22 0a 23 0a 74 65 73 74 76 66 73 20 74  ize".#.testvfs t
b410: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20  v -default 1.tv 
b420: 73 65 63 74 6f 72 73 69 7a 65 20 31 30 32 34 0a  sectorsize 1024.
b430: 66 6f 72 65 61 63 68 20 70 61 67 65 73 69 7a 65  foreach pagesize
b440: 20 7b 0a 20 20 20 20 35 31 32 20 20 20 31 30 32   {.    512   102
b450: 34 20 20 20 32 30 34 38 20 34 30 39 36 20 38 31  4   2048 4096 81
b460: 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20 0a  92 16384 32768 .
b470: 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  } {.  faultsim_d
b480: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
b490: 0a 0a 20 20 23 20 54 68 65 20 73 65 63 74 6f 72  ..  # The sector
b4a0: 2d 73 69 7a 65 20 28 61 63 63 6f 72 64 69 6e 67  -size (according
b4b0: 20 74 6f 20 74 68 65 20 56 46 53 29 20 69 73 20   to the VFS) is 
b4c0: 31 30 32 34 20 62 79 74 65 73 2e 20 53 6f 20 69  1024 bytes. So i
b4d0: 66 20 74 68 65 0a 20 20 23 20 70 61 67 65 2d 73  f the.  # page-s
b4e0: 69 7a 65 20 72 65 71 75 65 73 74 65 64 20 75 73  ize requested us
b4f0: 69 6e 67 20 22 50 52 41 47 4d 41 20 70 61 67 65  ing "PRAGMA page
b500: 5f 73 69 7a 65 22 20 69 73 20 67 72 65 61 74 65  _size" is greate
b510: 72 20 74 68 61 6e 20 74 68 65 0a 20 20 23 20 63  r than the.  # c
b520: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
b530: 65 20 6f 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e of SQLITE_MAX_
b540: 50 41 47 45 5f 53 49 5a 45 2c 20 74 68 65 6e 20  PAGE_SIZE, then 
b550: 74 68 65 20 65 66 66 65 63 74 69 76 65 20 0a 20  the effective . 
b560: 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72 65 6d   # page-size rem
b570: 61 69 6e 73 20 31 30 32 34 20 62 79 74 65 73 2e  ains 1024 bytes.
b580: 0a 20 20 23 0a 20 20 73 65 74 20 65 66 66 20 24  .  #.  set eff $
b590: 70 61 67 65 73 69 7a 65 0a 20 20 69 66 20 7b 24  pagesize.  if {$
b5a0: 65 66 66 20 3e 20 24 3a 3a 53 51 4c 49 54 45 5f  eff > $::SQLITE_
b5b0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 7d 20 7b  MAX_PAGE_SIZE} {
b5c0: 20 73 65 74 20 65 66 66 20 31 30 32 34 20 7d 0a   set eff 1024 }.
b5d0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
b5e0: 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 31  1-12.$pagesize.1
b5f0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
b600: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  b2 test.db.    e
b610: 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 50  xecsql ".      P
b620: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
b630: 3d 20 24 70 61 67 65 73 69 7a 65 3b 0a 20 20 20  = $pagesize;.   
b640: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76     CREATE VIEW v
b650: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
b660: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
b670: 0a 20 20 20 20 22 20 64 62 32 0a 20 20 20 20 66  .    " db2.    f
b680: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
b690: 0a 20 20 7d 20 24 65 66 66 0a 20 20 64 6f 5f 74  .  } $eff.  do_t
b6a0: 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70  est pager1-12.$p
b6b0: 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20  agesize.2 {.    
b6c0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
b6d0: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
b6e0: 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  { .      SELECT 
b6f0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b  count(*) FROM v;
b700: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
b710: 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20  in.page_size;.  
b720: 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69 73    } db2.  } [lis
b730: 74 20 31 20 24 65 66 66 5d 0a 20 20 64 6f 5f 74  t 1 $eff].  do_t
b740: 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70  est pager1-12.$p
b750: 61 67 65 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20  agesize.3 {.    
b760: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
b770: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
b780: 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50   FROM v;.      P
b790: 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f  RAGMA main.page_
b7a0: 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  size;.    }.  } 
b7b0: 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20  [list 1 $eff].  
b7c0: 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 64 62 20 63  db2 close.}.db c
b7d0: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
b7e0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
b7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b800: 2d 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 0a 23 20 54 65 73  ----------.# Tes
b830: 74 20 73 70 65 63 61 6c 20 22 50 52 41 47 4d 41  t specal "PRAGMA
b840: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
b850: 52 53 49 53 54 22 20 74 65 73 74 20 63 61 73 65  RSIST" test case
b860: 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33  s..#.# pager1-13
b870: 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73 74 73  .1.*: This tests
b880: 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20   a special case 
b890: 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 70  encountered in p
b8a0: 65 72 73 69 73 74 65 6e 74 20 0a 23 20 20 20 20  ersistent .#    
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
b8c0: 6e 61 6c 20 6d 6f 64 65 3a 20 49 66 20 74 68 65  nal mode: If the
b8d0: 20 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61   journal associa
b8e0: 74 65 64 20 77 69 74 68 20 61 20 74 72 61 6e 73  ted with a trans
b8f0: 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 20  action.#        
b900: 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
b910: 65 72 20 74 68 61 6e 20 74 68 65 20 6a 6f 75 72  er than the jour
b920: 6e 61 6c 20 66 69 6c 65 20 28 62 65 63 61 75 73  nal file (becaus
b930: 65 20 61 20 70 72 65 76 69 6f 75 73 20 0a 23 20  e a previous .# 
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
b950: 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65 66 74 20  ransaction left 
b960: 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e 6f 6e  a very large non
b970: 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  -hot journal fil
b980: 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20  e in the.#      
b990: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 2d 73            file-s
b9a0: 79 73 74 65 6d 29 2c 20 74 68 65 6e 20 53 51 4c  ystem), then SQL
b9b0: 69 74 65 20 68 61 73 20 74 6f 20 62 65 20 63 61  ite has to be ca
b9c0: 72 65 66 75 6c 20 74 68 61 74 20 74 68 65 72 65  reful that there
b9d0: 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20   is.#           
b9e0: 20 20 20 20 20 6e 6f 74 20 61 20 6a 6f 75 72 6e       not a journ
b9f0: 61 6c 2d 68 65 61 64 65 72 20 6c 65 66 74 20 6f  al-header left o
ba00: 76 65 72 20 66 72 6f 6d 20 61 20 70 72 65 76 69  ver from a previ
ba10: 6f 75 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ous transaction.
ba20: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
ba30: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
ba40: 6c 6f 77 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lowing the journ
ba50: 61 6c 20 63 6f 6e 74 65 6e 74 20 6a 75 73 74 20  al content just 
ba60: 77 72 69 74 74 65 6e 2e 0a 23 20 20 20 20 20 20  written..#      
ba70: 20 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65            If the
ba80: 72 65 20 69 73 2c 20 61 6e 64 20 74 68 65 20 70  re is, and the p
ba90: 72 6f 63 65 73 73 20 63 72 61 73 68 65 73 20 73  rocess crashes s
baa0: 6f 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  o that the journ
bab0: 61 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  al.#            
bac0: 20 20 20 20 62 65 63 6f 6d 65 73 20 61 20 68 6f      becomes a ho
bad0: 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 75  t-journal and mu
bae0: 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
baf0: 6b 20 62 79 20 61 6e 6f 74 68 65 72 0a 23 20 20  k by another.#  
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
bb10: 6f 63 65 73 73 2c 20 74 68 65 72 65 20 69 73 20  ocess, there is 
bb20: 61 20 64 61 6e 67 65 72 20 74 68 61 74 20 74 68  a danger that th
bb30: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
bb40: 6d 61 79 20 72 6f 6c 6c 0a 23 20 20 20 20 20 20  may roll.#      
bb50: 20 20 20 20 20 20 20 20 20 20 62 61 63 6b 20 74            back t
bb60: 68 65 20 61 62 6f 72 74 65 64 20 74 72 61 6e 73  he aborted trans
bb70: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 6e  action, then con
bb80: 74 69 6e 75 65 20 63 6f 70 79 69 6e 67 20 64 61  tinue copying da
bb90: 74 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ta.#            
bba0: 20 20 20 20 66 72 6f 6d 20 61 6e 20 6f 6c 64 65      from an olde
bbb0: 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 72  r transaction fr
bbc0: 6f 6d 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  om the remainder
bbd0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
bbe0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
bbf0: 20 20 53 65 65 20 74 68 65 20 73 79 6e 63 4a 6f    See the syncJo
bc00: 75 72 6e 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e  urnal() function
bc10: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 23 0a   for details..#.
bc20: 23 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 2a 3a  # pager1-13.2.*:
bc30: 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 74 68   Same test as th
bc40: 65 20 70 72 65 76 69 6f 75 73 2e 20 54 68 69 73  e previous. This
bc50: 20 74 69 6d 65 2c 20 74 68 72 6f 77 20 61 6e 20   time, throw an 
bc60: 69 6e 64 65 78 20 69 6e 74 6f 0a 23 20 20 20 20  index into.#    
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
bc80: 6d 69 78 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  mix to make the 
bc90: 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
bca0: 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63  more likely to c
bcb0: 61 74 63 68 0a 23 20 20 20 20 20 20 20 20 20 20  atch.#          
bcc0: 20 20 20 20 20 20 65 72 72 6f 72 73 2e 0a 23 0a        errors..#.
bcd0: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
bce0: 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 20  ult 1.tv script 
bcf0: 78 53 79 6e 63 43 62 0a 74 76 20 66 69 6c 74 65  xSyncCb.tv filte
bd00: 72 20 78 53 79 6e 63 0a 70 72 6f 63 20 78 53 79  r xSync.proc xSy
bd10: 6e 63 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c  ncCb {method fil
bd20: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
bd30: 73 65 74 20 74 20 5b 66 69 6c 65 20 74 61 69 6c  set t [file tail
bd40: 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 69 66   $filename].  if
bd50: 20 7b 24 74 20 3d 3d 20 22 74 65 73 74 2e 64 62   {$t == "test.db
bd60: 22 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  "} faultsim_save
bd70: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bd80: 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64  _OK.}.faultsim_d
bd90: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
bda0: 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e  .db func a_strin
bdb0: 67 20 61 5f 73 74 72 69 6e 67 0a 0a 23 20 54 68  g a_string..# Th
bdc0: 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  e UPDATE stateme
bdd0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
bde0: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 20   this test case 
bdf0: 63 72 65 61 74 65 73 20 61 20 72 65 61 6c 6c 79  creates a really
be00: 20 62 69 67 0a 23 20 6a 6f 75 72 6e 61 6c 2e 20   big.# journal. 
be10: 53 69 6e 63 65 20 74 68 65 20 63 61 63 68 65 2d  Since the cache-
be20: 73 69 7a 65 20 69 73 20 6f 6e 6c 79 20 31 30 20  size is only 10 
be30: 70 61 67 65 73 2c 20 74 68 65 20 6a 6f 75 72 6e  pages, the journ
be40: 61 6c 20 63 6f 6e 74 61 69 6e 73 20 0a 23 20 66  al contains .# f
be50: 72 65 71 75 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  requent journal 
be60: 68 65 61 64 65 72 73 2e 0a 23 0a 64 6f 5f 65 78  headers..#.do_ex
be70: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
be80: 31 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 50 52 41  1-13.1.1 {.  PRA
be90: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
bea0: 31 30 32 34 3b 0a 20 20 50 52 41 47 4d 41 20 6a  1024;.  PRAGMA j
beb0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
bec0: 52 53 49 53 54 3b 0a 20 20 50 52 41 47 4d 41 20  RSIST;.  PRAGMA 
bed0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
bee0: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52  .  BEGIN;.    CR
bef0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
bf00: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
bf10: 4b 45 59 2c 20 62 20 42 4c 4f 42 29 3b 0a 20 20  KEY, b BLOB);.  
bf20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
bf30: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
bf40: 73 74 72 69 6e 67 28 34 30 30 29 29 3b 0a 20 20  string(400));.  
bf50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
bf60: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
bf70: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
bf80: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
bf90: 20 20 20 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45     2 */.    INSE
bfa0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
bfb0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
bfc0: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
bfd0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a          /*   4 *
bfe0: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
bff0: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
c000: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
c010: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
c020: 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20    /*   8 */.    
c030: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
c040: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
c050: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
c060: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
c070: 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  16 */.    INSERT
c080: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
c090: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
c0a0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
c0b0: 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a        /*  32 */.
c0c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
c0d0: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
c0e0: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
c0f0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
c100: 2f 2a 20 20 36 34 20 2a 2f 0a 20 20 20 20 49 4e  /*  64 */.    IN
c110: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
c120: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
c130: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
c140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 32 38            /* 128
c150: 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20   */.  COMMIT;.  
c160: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
c170: 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 3b  = a_string(400);
c180: 0a 7d 20 7b 70 65 72 73 69 73 74 7d 0a 0a 69 66  .} {persist}..if
c190: 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
c1a0: 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69  m(platform)!="wi
c1b0: 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 52 75 6e 20  ndows"} {.# Run 
c1c0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66 20  transactions of 
c1d0: 69 6e 63 72 65 61 73 69 6e 67 20 73 69 7a 65 73  increasing sizes
c1e0: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
c1f0: 65 20 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20  e (or more than 
c200: 6f 6e 65 29 0a 23 20 6f 66 20 74 68 65 73 65 20  one).# of these 
c210: 77 69 6c 6c 20 77 72 69 74 65 20 6a 75 73 74 20  will write just 
c220: 65 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20 74  enough content t
c230: 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f  hat one of the o
c240: 6c 64 20 68 65 61 64 65 72 73 20 63 72 65 61 74  ld headers creat
c250: 65 64 20 0a 23 20 62 79 20 74 68 65 20 74 72 61  ed .# by the tra
c260: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
c270: 62 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65 73  block above lies
c280: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
c290: 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 23  er the content.#
c2a0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20 74   journalled by t
c2b0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
c2c0: 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b 73  action..#.for {s
c2d0: 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c  et nUp 1} {$nUp<
c2e0: 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b  64} {incr nUp} {
c2f0: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
c300: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32  st pager1-13.1.2
c310: 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55  .$nUp.1 { .    U
c320: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d  PDATE t1 SET b =
c330: 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57   a_string(399) W
c340: 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20  HERE a <= $nUp. 
c350: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73   } {}.  do_execs
c360: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c370: 33 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50  3.1.2.$nUp.2 { P
c380: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
c390: 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a 20  check } {ok} .. 
c3a0: 20 23 20 54 72 79 20 74 6f 20 61 63 63 65 73 73   # Try to access
c3b0: 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66   the snapshot of
c3c0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
c3d0: 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33 20  ..  #.  sqlite3 
c3e0: 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20  db2 sv_test.db. 
c3f0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
c400: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a  13.1.2.$nUp.3 {.
c410: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
c420: 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28  LECT sum(length(
c430: 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  b)) FROM t1 } db
c440: 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38  2.  } [expr {128
c450: 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d  *400 - ($nUp-1)}
c460: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
c470: 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 34  r1-13.1.2.$nUp.4
c480: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
c490: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
c4a0: 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20  y_check } db2.  
c4b0: 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f  } {ok}.  db2 clo
c4c0: 73 65 0a 7d 0a 7d 0a 0a 69 66 20 7b 24 3a 3a 74  se.}.}..if {$::t
c4d0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74  cl_platform(plat
c4e0: 66 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22  form)!="windows"
c4f0: 7d 20 7b 0a 23 20 53 61 6d 65 20 74 65 73 74 20  } {.# Same test 
c500: 61 73 20 61 62 6f 76 65 2e 20 42 75 74 20 74 68  as above. But th
c510: 69 73 20 74 69 6d 65 20 77 69 74 68 20 61 6e 20  is time with an 
c520: 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62  index on the tab
c530: 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  le..#.do_execsql
c540: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
c550: 32 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 49  2.1 {.  CREATE I
c560: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29  NDEX i1 ON t1(b)
c570: 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45  ;.  UPDATE t1 SE
c580: 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34  T b = a_string(4
c590: 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b 73  00);.} {}.for {s
c5a0: 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c  et nUp 1} {$nUp<
c5b0: 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b  64} {incr nUp} {
c5c0: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
c5d0: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32  st pager1-13.2.2
c5e0: 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55  .$nUp.1 { .    U
c5f0: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d  PDATE t1 SET b =
c600: 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57   a_string(399) W
c610: 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20  HERE a <= $nUp. 
c620: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73   } {}.  do_execs
c630: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c640: 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50  3.2.2.$nUp.2 { P
c650: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
c660: 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20 20  check } {ok} .  
c670: 73 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74  sqlite3 db2 sv_t
c680: 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74  est.db.  do_test
c690: 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24   pager1-13.2.2.$
c6a0: 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  nUp.3 {.    exec
c6b0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d  sql { SELECT sum
c6c0: 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d  (length(b)) FROM
c6d0: 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65   t1 } db2.  } [e
c6e0: 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28  xpr {128*400 - (
c6f0: 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74  $nUp-1)}].  do_t
c700: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
c710: 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65  2.$nUp.4 {.    e
c720: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
c730: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
c740: 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20  } db2.  } {ok}. 
c750: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a   db2 close.}.}..
c760: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
c770: 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  te..#-----------
c780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23  --------------.#
c7c0: 20 54 65 73 74 20 73 70 65 63 61 6c 20 22 50 52   Test specal "PR
c7d0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
c7e0: 65 3d 4f 46 46 22 20 74 65 73 74 20 63 61 73 65  e=OFF" test case
c7f0: 73 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65  s..#.faultsim_de
c800: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
c810: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
c820: 70 61 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b 0a  pager1-14.1.1 {.
c830: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
c840: 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20 43  _mode = OFF;.  C
c850: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
c860: 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  , b);.  BEGIN;. 
c870: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
c880: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
c890: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45    COMMIT;.  SELE
c8a0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  CT * FROM t1;.} 
c8b0: 7b 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61 74  {off 1 2}.do_cat
c8c0: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
c8d0: 31 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45 47  1-14.1.2 {.  BEG
c8e0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
c8f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
c900: 20 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b 3b   4);.  ROLLBACK;
c910: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78 65  .} {0 {}}.do_exe
c920: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c930: 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45  -14.1.3 {.  SELE
c940: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  CT * FROM t1;.} 
c950: 7b 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73 71  {1 2}.do_catchsq
c960: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34  l_test pager1-14
c970: 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b 0a  .1.4 {.  BEGIN;.
c980: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
c990: 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20  t1(rowid, a, b) 
c9a0: 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62  SELECT a+3, b, b
c9b0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
c9c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77  SERT INTO t1(row
c9d0: 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54  id, a, b) SELECT
c9e0: 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20   a+3, b, b FROM 
c9f0: 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d 41 52  t1;.} {1 {PRIMAR
ca00: 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20 75 6e  Y KEY must be un
ca10: 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  ique}}.do_execsq
ca20: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34  l_test pager1-14
ca30: 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49 54 3b  .1.5 {.  COMMIT;
ca40: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
ca50: 20 74 31 3b 0a 7d 20 7b 31 20 32 20 32 20 32 7d   t1;.} {1 2 2 2}
ca60: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
ca70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca80: 2d 2d 2d 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 0a 23 20 54  ------------.# T
cab0: 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e 64 20  est opening and 
cac0: 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65  closing the page
cad0: 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77 69 74  r sub-system wit
cae0: 68 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c 75  h different valu
caf0: 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73 71 6c  es.# for the sql
cb00: 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69 6c  ite3_vfs.szOsFil
cb10: 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a 66 61  e variable..#.fa
cb20: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
cb30: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63  d_reopen.do_exec
cb40: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
cb50: 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  15.0 {.  CREATE 
cb60: 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29 3b 0a  TABLE tx(y, z);.
cb70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78    INSERT INTO tx
cb80: 20 56 41 4c 55 45 53 28 27 41 79 75 74 74 68 61   VALUES('Ayuttha
cb90: 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27 29 3b  ya', 'Beijing');
cba0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
cbb0: 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64 6f 6e  x VALUES('London
cbc0: 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d 20 7b  ', 'Tokyo');.} {
cbd0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 20 7b  }.db close.for {
cbe0: 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35 31 33  set i 0} {$i<513
cbf0: 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b 0a 20  } {incr i 3} {. 
cc00: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
cc10: 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69 6c 65  ault 1 -szosfile
cc20: 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20 64 62   $i.  sqlite3 db
cc30: 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 65 78   test.db.  do_ex
cc40: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
cc50: 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20 20 20  1-15.$i.1 {.    
cc60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 78  SELECT * FROM tx
cc70: 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61 79 61  ;.  } {Ayutthaya
cc80: 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f 6e 20   Beijing London 
cc90: 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c 6f 73  Tokyo}.  db clos
cca0: 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a  e.  tv delete.}.
ccb0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68  -----------.# Ch
cd00: 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 6e  eck that it is n
cd10: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  ot possible to o
cd20: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
cd30: 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c 6c 20  ile if the full 
cd40: 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20 61 73  path.# to the as
cd50: 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e 61 6c  sociated journal
cd60: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6c 6f   file will be lo
cd70: 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65  nger than sqlite
cd80: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
cd90: 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d  ..#.testvfs tv -
cda0: 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72  default 1.tv scr
cdb0: 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76 20 66  ipt xOpenCb.tv f
cdc0: 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72 6f 63  ilter xOpen.proc
cdd0: 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68 6f 64   xOpenCb {method
cde0: 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20   filename args} 
cdf0: 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c 65 5f 6c  {.  set ::file_l
ce00: 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  en [string lengt
ce10: 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 7d 0a 73  h $filename].}.s
ce20: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
ce30: 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  b.db close.tv de
ce40: 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65 74 20 69  lete..for {set i
ce50: 69 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f  i [expr $::file_
ce60: 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20 3c 20 5b  len-5]} {$ii < [
ce70: 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e  expr $::file_len
ce80: 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69 69 7d 20  +20]} {incr ii} 
ce90: 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d  {.  testvfs tv -
cea0: 64 65 66 61 75 6c 74 20 31 20 2d 6d 78 70 61 74  default 1 -mxpat
ceb0: 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20 23 20 54  hname $ii..  # T
cec0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
ced0: 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 66 69   full path to fi
cee0: 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a 6f 75 72  le "test.db-jour
cef0: 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66 69 6c 65  nal" is ($::file
cf00: 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20 49 66 20  _len+8)..  # If 
cf10: 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 73  the configured s
cf20: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
cf30: 68 6e 61 6d 65 20 76 61 6c 75 65 20 67 72 65 61  hname value grea
cf40: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
cf50: 6c 20 74 6f 0a 20 20 23 20 74 68 69 73 2c 20 74  l to.  # this, t
cf60: 68 65 6e 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hen the file can
cf70: 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65   be opened. Othe
cf80: 72 77 69 73 65 2c 20 69 74 20 63 61 6e 6e 6f 74  rwise, it cannot
cf90: 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 69 69 20  ..  #.  if {$ii 
cfa0: 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65  >= [expr $::file
cfb0: 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20 20 20 73  _len+8]} {.    s
cfc0: 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d 0a 20 20  et res {0 {}}.  
cfd0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74  } else {.    set
cfe0: 20 72 65 73 20 7b 31 20 7b 75 6e 61 62 6c 65 20   res {1 {unable 
cff0: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
d000: 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a 20 20 64   file}}.  }..  d
d010: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 36  o_test pager1-16
d020: 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20 6c 69 73  .1.$ii {.    lis
d030: 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69 74  t [catch { sqlit
d040: 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d 20  e3 db test.db } 
d050: 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 24 72  msg] $msg.  } $r
d060: 65 73 0a 0a 20 20 63 61 74 63 68 20 7b 64 62 20  es..  catch {db 
d070: 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64 65 6c 65  close}.  tv dele
d080: 74 65 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  te.}...#--------
d090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20 74 68 65 20 70 61 67  -.# Test the pag
d0e0: 65 72 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 20  ers response to 
d0f0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
d100: 20 72 65 71 75 65 73 74 69 6e 67 20 69 6c 6c 65   requesting ille
d110: 67 61 6c 20 70 61 67 65 20 0a 23 20 6e 75 6d 62  gal page .# numb
d120: 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54 68 65  ers:.#.#   + The
d130: 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c 0a 23   locking page,.#
d140: 20 20 20 2b 20 50 61 67 65 20 30 2c 0a 23 20 20     + Page 0,.#  
d150: 20 2b 20 41 20 70 61 67 65 20 77 69 74 68 20 61   + A page with a
d160: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
d170: 61 74 65 72 20 74 68 61 6e 20 28 32 5e 33 31 2d  ater than (2^31-
d180: 31 29 2e 0a 23 0a 23 20 54 68 65 73 65 20 74 65  1)..#.# These te
d190: 73 74 73 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  sts will not wor
d1a0: 6b 20 69 66 20 53 51 4c 49 54 45 5f 44 49 52 45  k if SQLITE_DIRE
d1b0: 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
d1c0: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49 6e 0a   is defined. In.
d1d0: 23 20 74 68 61 74 20 63 61 73 65 20 49 4f 20 65  # that case IO e
d1e0: 72 72 6f 72 73 20 61 72 65 20 73 6f 6d 65 74 69  rrors are someti
d1f0: 6d 65 73 20 72 65 70 6f 72 74 65 64 20 69 6e 73  mes reported ins
d200: 74 65 61 64 20 6f 66 20 53 51 4c 49 54 45 5f 43  tead of SQLITE_C
d210: 4f 52 52 55 50 54 2e 0a 23 0a 69 66 63 61 70 61  ORRUPT..#.ifcapa
d220: 62 6c 65 20 21 64 69 72 65 63 74 5f 72 65 61 64  ble !direct_read
d230: 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72   {.do_test pager
d240: 31 2d 31 38 2e 31 20 7b 0a 20 20 66 61 75 6c 74  1-18.1 {.  fault
d250: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
d260: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
d270: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
d280: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  g.  execsql { . 
d290: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
d2a0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
d2b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
d2c0: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
d2d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
d2e0: 28 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20  (a_string(500), 
d2f0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 29 3b 0a  a_string(200));.
d300: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d310: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d320: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d330: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d340: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d350: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d360: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d370: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d380: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d390: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d3a0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d3b0: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d3c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d3d0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d3e0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d3f0: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d400: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d410: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d420: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d430: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d440: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d450: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d460: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d470: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d480: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d490: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d4a0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d4b0: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d4c0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
d4d0: 20 70 61 67 65 72 31 2d 31 38 2e 32 20 7b 0a 20   pager1-18.2 {. 
d4e0: 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e   set root [db on
d4f0: 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61  e "SELECT rootpa
d500: 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ge FROM sqlite_m
d510: 61 73 74 65 72 22 5d 0a 20 20 73 65 74 20 6c 6f  aster"].  set lo
d520: 63 6b 69 6e 67 70 61 67 65 20 5b 65 78 70 72 20  ckingpage [expr 
d530: 28 30 78 31 30 30 30 30 2f 31 30 32 34 29 20 2b  (0x10000/1024) +
d540: 20 31 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   1].  execsql {.
d550: 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61      PRAGMA writa
d560: 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a  ble_schema = 1;.
d570: 20 20 20 20 55 50 44 41 54 45 20 73 71 6c 69 74      UPDATE sqlit
d580: 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f  e_master SET roo
d590: 74 70 61 67 65 20 3d 20 24 6c 6f 63 6b 69 6e 67  tpage = $locking
d5a0: 70 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  page;.  }.  sqli
d5b0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
d5c0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
d5d0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
d5e0: 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20  M t1 } db2.} {1 
d5f0: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
d600: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
d610: 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f  d}}.db2 close.do
d620: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e  _test pager1-18.
d630: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
d640: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
d650: 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 49 4e  LE t2(x);.    IN
d660: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
d670: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30  UES(a_string(500
d680: 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 70  0));.  }.  set p
d690: 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66 69 6c 65  gno [expr ([file
d6a0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 2f   size test.db] /
d6b0: 20 31 30 32 34 29 2d 32 5d 0a 20 20 68 65 78 69   1024)-2].  hexi
d6c0: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
d6d0: 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a  [expr ($pgno-1)*
d6e0: 31 30 32 34 5d 20 30 30 30 30 30 30 30 30 0a 20  1024] 00000000. 
d6f0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
d700: 74 2e 64 62 0a 20 20 23 20 65 76 65 6e 20 74 68  t.db.  # even th
d710: 6f 75 67 68 20 78 20 69 73 20 6d 61 6c 66 6f 72  ough x is malfor
d720: 6d 65 64 2c 20 62 65 63 61 75 73 65 20 74 79 70  med, because typ
d730: 65 6f 66 28 29 20 64 6f 65 73 0a 20 20 23 20 6e  eof() does.  # n
d740: 6f 74 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74  ot load the cont
d750: 65 6e 74 20 6f 66 20 78 2c 20 74 68 65 20 65 72  ent of x, the er
d760: 72 6f 72 20 69 73 20 6e 6f 74 20 6e 6f 74 69 63  ror is not notic
d770: 65 64 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  ed..  catchsql {
d780: 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 78   SELECT typeof(x
d790: 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a  ) FROM t2 } db2.
d7a0: 7d 20 7b 30 20 74 65 78 74 7d 0a 64 6f 5f 74 65  } {0 text}.do_te
d7b0: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 33 2e 32  st pager1-18.3.2
d7c0: 20 7b 0a 20 20 23 20 69 6e 20 74 68 69 73 20 63   {.  # in this c
d7d0: 61 73 65 2c 20 74 68 65 20 76 61 6c 75 65 20 6f  ase, the value o
d7e0: 66 20 78 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  f x is loaded an
d7f0: 64 20 73 6f 20 74 68 65 20 65 72 72 6f 72 20 69  d so the error i
d800: 73 0a 20 20 23 20 64 65 74 65 63 74 65 64 0a 20  s.  # detected. 
d810: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
d820: 43 54 20 6c 65 6e 67 74 68 28 78 7c 7c 27 27 29  CT length(x||'')
d830: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
d840: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
d850: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
d860: 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73  ormed}}.db2 clos
d870: 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  e.do_test pager1
d880: 2d 31 38 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63  -18.3.3 {.  exec
d890: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
d8a0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e   FROM t2;.    IN
d8b0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
d8c0: 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 35  UES(randomblob(5
d8d0: 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74  000));.  }.  set
d8e0: 20 70 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66 69   pgno [expr ([fi
d8f0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
d900: 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20 20 68 65   / 1024)-2].  he
d910: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
d920: 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31  b [expr ($pgno-1
d930: 29 2a 31 30 32 34 5d 20 30 30 30 30 30 30 30 30  )*1024] 00000000
d940: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
d950: 65 73 74 2e 64 62 0a 20 20 23 20 65 76 65 6e 20  est.db.  # even 
d960: 74 68 6f 75 67 68 20 78 20 69 73 20 6d 61 6c 66  though x is malf
d970: 6f 72 6d 65 64 2c 20 62 65 63 61 75 73 65 20 6c  ormed, because l
d980: 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65  ength() and type
d990: 6f 66 28 29 20 64 6f 0a 20 20 23 20 6e 6f 74 20  of() do.  # not 
d9a0: 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  load the content
d9b0: 20 6f 66 20 78 2c 20 74 68 65 20 65 72 72 6f 72   of x, the error
d9c0: 20 69 73 20 6e 6f 74 20 6e 6f 74 69 63 65 64 2e   is not noticed.
d9d0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d9e0: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 2c 20  LECT length(x), 
d9f0: 74 79 70 65 6f 66 28 78 29 20 46 52 4f 4d 20 74  typeof(x) FROM t
da00: 32 20 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 35 30  2 } db2.} {0 {50
da10: 30 30 20 62 6c 6f 62 7d 7d 0a 64 6f 5f 74 65 73  00 blob}}.do_tes
da20: 74 20 70 61 67 65 72 31 2d 31 38 2e 33 2e 34 20  t pager1-18.3.4 
da30: 7b 0a 20 20 23 20 69 6e 20 74 68 69 73 20 63 61  {.  # in this ca
da40: 73 65 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66  se, the value of
da50: 20 78 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64   x is loaded and
da60: 20 73 6f 20 74 68 65 20 65 72 72 6f 72 20 69 73   so the error is
da70: 0a 20 20 23 20 64 65 74 65 63 74 65 64 0a 20 20  .  # detected.  
da80: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
da90: 54 20 6c 65 6e 67 74 68 28 78 7c 7c 27 27 29 20  T length(x||'') 
daa0: 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20  FROM t2 } db2.} 
dab0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
dac0: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
dad0: 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65  rmed}}.db2 close
dae0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
daf0: 31 38 2e 34 20 7b 0a 20 20 68 65 78 69 6f 5f 77  18.4 {.  hexio_w
db00: 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78  rite test.db [ex
db10: 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32  pr ($pgno-1)*102
db20: 34 5d 20 39 30 30 30 30 30 30 30 0a 20 20 73 71  4] 90000000.  sq
db30: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
db40: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  b.  catchsql { S
db50: 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 7c 7c  ELECT length(x||
db60: 27 27 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  '') FROM t2 } db
db70: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
db80: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
db90: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63  alformed}}.db2 c
dba0: 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67  lose.do_test pag
dbb0: 65 72 31 2d 31 38 2e 35 20 7b 0a 20 20 73 71 6c  er1-18.5 {.  sql
dbc0: 69 74 65 33 20 64 62 20 22 22 0a 20 20 65 78 65  ite3 db "".  exe
dbd0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
dbe0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
dbf0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
dc00: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  LE t2(a, b);.   
dc10: 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
dc20: 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  _schema = 1;.   
dc30: 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 6d   UPDATE sqlite_m
dc40: 61 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70 61  aster SET rootpa
dc50: 67 65 3d 35 20 57 48 45 52 45 20 74 62 6c 5f 6e  ge=5 WHERE tbl_n
dc60: 61 6d 65 20 3d 20 27 74 31 27 3b 0a 20 20 20 20  ame = 't1';.    
dc70: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
dc80: 73 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  schema = 0;.    
dc90: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 31 20 52  ALTER TABLE t1 R
dca0: 45 4e 41 4d 45 20 54 4f 20 78 31 3b 0a 20 20 7d  ENAME TO x1;.  }
dcb0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
dcc0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d  LECT * FROM x1 }
dcd0: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
dce0: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
dcf0: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 20 63 6c 6f  lformed}}.db clo
dd00: 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  se..do_test page
dd10: 72 31 2d 31 38 2e 36 20 7b 0a 20 20 66 61 75 6c  r1-18.6 {.  faul
dd20: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
dd30: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
dd40: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
dd50: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
dd60: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
dd70: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
dd80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
dd90: 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
dda0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
ddb0: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
ddc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ddd0: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
dde0: 28 38 30 30 29 29 3b 0a 20 20 7d 0a 0a 20 20 73  (800));.  }..  s
ddf0: 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20  et root [db one 
de00: 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65  "SELECT rootpage
de10: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
de20: 74 65 72 22 5d 0a 20 20 64 62 20 63 6c 6f 73 65  ter"].  db close
de30: 0a 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ..  hexio_write 
de40: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
de50: 72 6f 6f 74 2d 31 29 2a 31 30 32 34 20 2b 20 38  root-1)*1024 + 8
de60: 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 00000000.  sql
de70: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
de80: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
de90: 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46 52  ECT length(x) FR
dea0: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 64 61  OM t1 }.} {1 {da
deb0: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
dec0: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
ded0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  .}..do_test page
dee0: 72 31 2d 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69  r1-19.1 {.  sqli
def0: 74 65 33 20 64 62 20 22 22 0a 20 20 64 62 20 66  te3 db "".  db f
df00: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
df10: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
df20: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
df30: 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  e_size = 512;.  
df40: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
df50: 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52  cuum = 1;.    CR
df60: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 61  EATE TABLE t1(aa
df70: 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61 65  , ab, ac, ad, ae
df80: 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61 69  , af, ag, ah, ai
df90: 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d  , aj, ak, al, am
dfa0: 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , an,.          
dfb0: 20 20 20 20 20 20 20 20 20 20 62 61 2c 20 62 62            ba, bb
dfc0: 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62 66  , bc, bd, be, bf
dfd0: 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a  , bg, bh, bi, bj
dfe0: 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e  , bk, bl, bm, bn
dff0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e000: 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63 63        ca, cb, cc
e010: 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63 67  , cd, ce, cf, cg
e020: 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b  , ch, ci, cj, ck
e030: 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20  , cl, cm, cn,.  
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64 64    da, db, dc, dd
e060: 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64 68  , de, df, dg, dh
e070: 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c  , di, dj, dk, dl
e080: 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20  , dm, dn,.      
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 61                ea
e0a0: 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65 65  , eb, ec, ed, ee
e0b0: 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65 69  , ef, eg, eh, ei
e0c0: 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d  , ej, ek, el, em
e0d0: 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , en,.          
e0e0: 20 20 20 20 20 20 20 20 20 20 66 61 2c 20 66 62            fa, fb
e0f0: 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66 66  , fc, fd, fe, ff
e100: 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a  , fg, fh, fi, fj
e110: 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e  , fk, fl, fm, fn
e120: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e130: 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67 63        ga, gb, gc
e140: 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67 67  , gd, ge, gf, gg
e150: 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b  , gh, gi, gj, gk
e160: 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20  , gl, gm, gn,.  
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68 64    ha, hb, hc, hd
e190: 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68 68  , he, hf, hg, hh
e1a0: 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c  , hi, hj, hk, hl
e1b0: 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20  , hm, hn,.      
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 61                ia
e1d0: 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69 65  , ib, ic, id, ie
e1e0: 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69 69  , if, ig, ih, ii
e1f0: 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d  , ij, ik, il, im
e200: 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20 20  , ix,.          
e210: 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a 62            ja, jb
e220: 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66  , jc, jd, je, jf
e230: 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a  , jg, jh, ji, jj
e240: 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e  , jk, jl, jm, jn
e250: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e260: 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63        ka, kb, kc
e270: 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67  , kd, ke, kf, kg
e280: 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b  , kh, ki, kj, kk
e290: 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20  , kl, km, kn,.  
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64    la, lb, lc, ld
e2c0: 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68  , le, lf, lg, lh
e2d0: 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c  , li, lj, lk, ll
e2e0: 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20  , lm, ln,.      
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
e300: 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65  , mb, mc, md, me
e310: 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69  , mf, mg, mh, mi
e320: 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d  , mj, mk, ml, mm
e330: 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20  , mn.    );.    
e340: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
e350: 61 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20  aa, ab, ac, ad, 
e360: 61 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20  ae, af, ag, ah, 
e370: 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20  ai, aj, ak, al, 
e380: 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20  am, an,.        
e390: 20 20 20 20 20 20 20 20 20 20 20 20 62 61 2c 20              ba, 
e3a0: 62 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20  bb, bc, bd, be, 
e3b0: 62 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20  bf, bg, bh, bi, 
e3c0: 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20  bj, bk, bl, bm, 
e3d0: 62 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  bn,.            
e3e0: 20 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20          ca, cb, 
e3f0: 63 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20  cc, cd, ce, cf, 
e400: 63 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20  cg, ch, ci, cj, 
e410: 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a  ck, cl, cm, cn,.
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20      da, db, dc, 
e440: 64 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20  dd, de, df, dg, 
e450: 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20  dh, di, dj, dk, 
e460: 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20  dl, dm, dn,.    
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 65 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20  ea, eb, ec, ed, 
e490: 65 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20  ee, ef, eg, eh, 
e4a0: 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20  ei, ej, ek, el, 
e4b0: 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20  em, en,.        
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 2c 20              fa, 
e4d0: 66 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20  fb, fc, fd, fe, 
e4e0: 66 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20  ff, fg, fh, fi, 
e4f0: 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20  fj, fk, fl, fm, 
e500: 66 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fn,.            
e510: 20 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20          ga, gb, 
e520: 67 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20  gc, gd, ge, gf, 
e530: 67 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20  gg, gh, gi, gj, 
e540: 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a  gk, gl, gm, gn,.
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20      ha, hb, hc, 
e570: 68 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20  hd, he, hf, hg, 
e580: 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20  hh, hi, hj, hk, 
e590: 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20  hl, hm, hn,.    
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 69 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20  ia, ib, ic, id, 
e5c0: 69 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20  ie, if, ig, ih, 
e5d0: 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20  ii, ij, ik, il, 
e5e0: 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20  im, ix,.        
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20              ja, 
e600: 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20  jb, jc, jd, je, 
e610: 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20  jf, jg, jh, ji, 
e620: 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20  jj, jk, jl, jm, 
e630: 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  jn,.            
e640: 20 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20          ka, kb, 
e650: 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20  kc, kd, ke, kf, 
e660: 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20  kg, kh, ki, kj, 
e670: 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a  kk, kl, km, kn,.
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20      la, lb, lc, 
e6a0: 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20  ld, le, lf, lg, 
e6b0: 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20  lh, li, lj, lk, 
e6c0: 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20  ll, lm, ln,.    
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20  ma, mb, mc, md, 
e6f0: 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20  me, mf, mg, mh, 
e700: 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20  mi, mj, mk, ml, 
e710: 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20  mm, mn.    );.  
e720: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
e730: 28 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f 73  (aa) VALUES( a_s
e740: 74 72 69 6e 67 28 31 30 30 30 30 30 29 20 29 3b  tring(100000) );
e750: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
e760: 20 74 32 28 61 61 29 20 56 41 4c 55 45 53 28 20   t2(aa) VALUES( 
e770: 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30 30 29  a_string(100000)
e780: 20 29 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a   );.    VACUUM;.
e790: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d    }.} {}..#-----
e7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 65 73 74 20 61 20 63 6f  ----.# Test a co
e7f0: 75 70 6c 65 20 6f 66 20 73 70 65 63 69 61 6c 20  uple of special 
e800: 63 61 73 65 73 20 74 68 61 74 20 63 6f 6d 65 20  cases that come 
e810: 75 70 20 77 68 69 6c 65 20 63 6f 6d 6d 69 74 74  up while committ
e820: 69 6e 67 20 0a 23 20 74 72 61 6e 73 61 63 74 69  ing .# transacti
e830: 6f 6e 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72  ons:.#.#   pager
e840: 31 2d 32 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69 74  1-20.1.*: Commit
e850: 74 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ting an in-memor
e860: 79 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  y database trans
e870: 61 63 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  action when the 
e880: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
e890: 20 20 20 20 64 61 74 61 62 61 73 65 20 68 61 73      database has
e8a0: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
e8b0: 65 64 20 61 74 20 61 6c 6c 2e 0a 23 0a 23 20 20  ed at all..#.#  
e8c0: 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 2a 3a 20   pager1-20.2.*: 
e8d0: 41 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77 69  As above, but wi
e8e0: 74 68 20 61 20 6e 6f 72 6d 61 6c 20 64 62 20 69  th a normal db i
e8f0: 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b  n exclusive-lock
e900: 69 6e 67 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20  ing mode..#.#   
e910: 70 61 67 65 72 31 2d 32 30 2e 33 2e 2a 3a 20 43  pager1-20.3.*: C
e920: 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
e930: 73 61 63 74 69 6f 6e 20 69 6e 20 57 41 4c 20 6d  saction in WAL m
e940: 6f 64 65 20 77 68 65 72 65 20 74 68 65 20 64 61  ode where the da
e950: 74 61 62 61 73 65 20 68 61 73 0a 23 20 20 20 20  tabase has.#    
e960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
e970: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 62 75 74  en modified, but
e980: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
e990: 20 68 61 76 65 20 62 65 65 6e 20 66 6c 75 73 68   have been flush
e9a0: 65 64 20 74 6f 20 0a 23 20 20 20 20 20 20 20 20  ed to .#        
e9b0: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 20 62            disk b
e9c0: 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 6d 69 74  efore the commit
e9d0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
e9e0: 72 31 2d 32 30 2e 31 2e 31 20 7b 0a 20 20 63 61  r1-20.1.1 {.  ca
e9f0: 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20  tch {db close}. 
ea00: 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d   sqlite3 db :mem
ea10: 6f 72 79 3a 0a 20 20 65 78 65 63 73 71 6c 20 7b  ory:.  execsql {
ea20: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
ea30: 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65  E one(two, three
ea40: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
ea50: 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61  TO one VALUES('a
ea60: 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b  ', 'b');.  }.} {
ea70: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
ea80: 2d 32 30 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  -20.1.2 {.  exec
ea90: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20  sql {.    BEGIN 
eaa0: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43  EXCLUSIVE;.    C
eab0: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
eac0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
ead0: 32 30 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74  20.2.1 {.  fault
eae0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
eaf0: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
eb00: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  {.    PRAGMA loc
eb10: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c  king_mode = excl
eb20: 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41 47 4d  usive;.    PRAGM
eb30: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
eb40: 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 43 52   persist;.    CR
eb50: 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74  EATE TABLE one(t
eb60: 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20  wo, three);.    
eb70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20  INSERT INTO one 
eb80: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
eb90: 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  ;.  }.} {exclusi
eba0: 76 65 20 70 65 72 73 69 73 74 7d 0a 64 6f 5f 74  ve persist}.do_t
ebb0: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 32 2e  est pager1-20.2.
ebc0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
ebd0: 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53      BEGIN EXCLUS
ebe0: 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  IVE;.    COMMIT;
ebf0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70  .  }.} {}..ifcap
ec00: 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f  able wal {.  do_
ec10: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33  test pager1-20.3
ec20: 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  .1 {.    faultsi
ec30: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
ec40: 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20  pen.    db func 
ec50: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
ec60: 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  g.    execsql {.
ec70: 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
ec80: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
ec90: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
eca0: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20  al_mode = wal;. 
ecb0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
ecc0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
ecd0: 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 20 20   t1(x);.        
ece0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
ecf0: 79 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  y);.        INSE
ed00: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
ed10: 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29  S(a_string(800))
ed20: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
ed30: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
ed40: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
ed50: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
ed60: 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 20  *   2 */.       
ed70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ed80: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
ed90: 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  800) FROM t1;   
eda0: 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a        /*   4 */.
edb0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
edc0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
edd0: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
ede0: 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   t1;         /* 
edf0: 20 20 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 49    8 */.        I
ee00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
ee10: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
ee20: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
ee30: 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20      /*  16 */.  
ee40: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
ee50: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
ee60: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
ee70: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 33  1;         /*  3
ee80: 32 20 2a 2f 0a 20 20 20 20 20 20 43 4f 4d 4d 49  2 */.      COMMI
ee90: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61  T;.    }.  } {wa
eea0: 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  l}.  do_test pag
eeb0: 65 72 31 2d 32 30 2e 33 2e 32 20 7b 0a 20 20 20  er1-20.3.2 {.   
eec0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
eed0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
eee0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
eef0: 55 45 53 28 27 78 78 78 78 27 29 3b 0a 20 20 20  UES('xxxx');.   
ef00: 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65   }.    recursive
ef10: 5f 73 65 6c 65 63 74 20 33 32 20 74 31 0a 20 20  _select 32 t1.  
ef20: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
ef30: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .  } {}.}..#----
ef40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef80: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
ef90: 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  t a WAL database
efa0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e   may not be open
efb0: 65 64 20 69 66 3a 0a 23 0a 23 20 20 20 70 61 67  ed if:.#.#   pag
efc0: 65 72 31 2d 32 31 2e 31 2e 2a 3a 20 54 68 65 20  er1-21.1.*: The 
efd0: 56 46 53 20 68 61 73 20 61 6e 20 69 56 65 72 73  VFS has an iVers
efe0: 69 6f 6e 20 6c 65 73 73 20 74 68 61 6e 20 32 2c  ion less than 2,
eff0: 20 6f 72 0a 23 20 20 20 70 61 67 65 72 31 2d 32   or.#   pager1-2
f000: 31 2e 32 2e 2a 3a 20 54 68 65 20 56 46 53 20 64  1.2.*: The VFS d
f010: 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20  oes not provide 
f020: 78 53 68 6d 58 58 58 28 29 20 6d 65 74 68 6f 64  xShmXXX() method
f030: 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77  s..#.ifcapable w
f040: 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  al {.  do_test p
f050: 61 67 65 72 31 2d 32 31 2e 30 20 7b 0a 20 20 20  ager1-21.0 {.   
f060: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
f070: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
f080: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
f090: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f0a0: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20  ode = WAL;.     
f0b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f   CREATE TABLE ko
f0c0: 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27  (c DEFAULT 'abc'
f0d0: 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66  , b DEFAULT 'def
f0e0: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
f0f0: 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54   INTO ko DEFAULT
f100: 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20   VALUES;.    }. 
f110: 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65   } {wal}.  do_te
f120: 73 74 20 70 61 67 65 72 31 2d 32 31 2e 31 20 7b  st pager1-21.1 {
f130: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
f140: 2d 6e 6f 73 68 6d 20 31 0a 20 20 20 20 73 71 6c  -noshm 1.    sql
f150: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
f160: 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61 74   -vfs tv.    cat
f170: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
f180: 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20   FROM ko } db2. 
f190: 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f   } {1 {unable to
f1a0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
f1b0: 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73  ile}}.  db2 clos
f1c0: 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 20 20  e.  tv delete.  
f1d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f1e0: 31 2e 32 20 7b 0a 20 20 20 20 74 65 73 74 76 66  1.2 {.    testvf
f1f0: 73 20 74 76 20 2d 69 76 65 72 73 69 6f 6e 20 31  s tv -iversion 1
f200: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
f210: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76   test.db -vfs tv
f220: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
f230: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f  SELECT * FROM ko
f240: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75   } db2.  } {1 {u
f250: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
f260: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20  tabase file}}.  
f270: 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20 64  db2 close.  tv d
f280: 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  elete.}..#------
f290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
f2e0: 61 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68  a "PRAGMA wal_ch
f2f0: 65 63 6b 70 6f 69 6e 74 22 3a 0a 23 0a 23 20 20  eckpoint":.#.#  
f300: 20 70 61 67 65 72 31 2d 32 32 2e 31 2e 2a 3a 20   pager1-22.1.*: 
f310: 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61 20  is a no-op on a 
f320: 6e 6f 6e 2d 57 41 4c 20 64 62 2c 20 61 6e 64 0a  non-WAL db, and.
f330: 23 20 20 20 70 61 67 65 72 31 2d 32 32 2e 32 2e  #   pager1-22.2.
f340: 2a 3a 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  *: does not caus
f350: 65 20 78 53 79 6e 63 20 63 61 6c 6c 73 20 77 69  e xSync calls wi
f360: 74 68 20 61 20 73 79 6e 63 68 72 6f 6e 6f 75 73  th a synchronous
f370: 3d 6f 66 66 20 64 62 2e 0a 23 0a 69 66 63 61 70  =off db..#.ifcap
f380: 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f  able wal {.  do_
f390: 74 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e 31  test pager1-22.1
f3a0: 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  .1 {.    faultsi
f3b0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
f3c0: 70 65 6e 0a 20 20 20 20 65 78 65 63 73 71 6c 20  pen.    execsql 
f3d0: 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  {.      CREATE T
f3e0: 41 42 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c  ABLE ko(c DEFAUL
f3f0: 54 20 27 61 62 63 27 2c 20 62 20 44 45 46 41 55  T 'abc', b DEFAU
f400: 4c 54 20 27 64 65 66 27 29 3b 0a 20 20 20 20 20  LT 'def');.     
f410: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20   INSERT INTO ko 
f420: 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a  DEFAULT VALUES;.
f430: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
f440: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
f450: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20  heckpoint }.  } 
f460: 7b 30 20 2d 31 20 2d 31 7d 0a 20 20 64 6f 5f 74  {0 -1 -1}.  do_t
f470: 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e 32 2e  est pager1-22.2.
f480: 31 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20  1 {.    testvfs 
f490: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
f4a0: 20 20 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e    tv filter xSyn
f4b0: 63 0a 20 20 20 20 74 76 20 73 63 72 69 70 74 20  c.    tv script 
f4c0: 78 53 79 6e 63 43 62 0a 20 20 20 20 70 72 6f 63  xSyncCb.    proc
f4d0: 20 78 53 79 6e 63 43 62 20 7b 61 72 67 73 7d 20   xSyncCb {args} 
f4e0: 7b 69 6e 63 72 20 3a 3a 73 79 6e 63 63 6f 75 6e  {incr ::synccoun
f4f0: 74 7d 0a 20 20 20 20 73 65 74 20 3a 3a 73 79 6e  t}.    set ::syn
f500: 63 63 6f 75 6e 74 20 30 0a 20 20 20 20 73 71 6c  ccount 0.    sql
f510: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
f520: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
f530: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
f540: 72 6f 6e 6f 75 73 20 3d 20 6f 66 66 3b 0a 20 20  ronous = off;.  
f550: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
f560: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
f570: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
f580: 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55   ko DEFAULT VALU
f590: 45 53 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  ES;.    }.    ex
f5a0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
f5b0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
f5c0: 20 20 20 20 73 65 74 20 73 79 6e 63 63 6f 75 6e      set synccoun
f5d0: 74 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 62 20 63  t.  } {0}.  db c
f5e0: 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65  lose.  tv delete
f5f0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
f600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f610: 2d 2d 2d 2d 2d 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 0a 23  --------------.#
f640: 20 54 65 73 74 73 20 66 6f 72 20 63 68 61 6e 67   Tests for chang
f650: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ing journal mode
f660: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
f670: 33 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  3.1.*: Test that
f680: 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20 66   when changing f
f690: 72 6f 6d 20 50 45 52 53 49 53 54 20 74 6f 20 44  rom PERSIST to D
f6a0: 45 4c 45 54 45 20 6d 6f 64 65 2c 0a 23 20 20 20  ELETE mode,.#   
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
f6c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f6d0: 69 73 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20  is deleted..#.# 
f6e0: 20 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 2a 3a    pager1-23.2.*:
f6f0: 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 61 62   Same test as ab
f700: 6f 76 65 2c 20 62 75 74 20 77 68 69 6c 65 20 61  ove, but while a
f710: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
f720: 68 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20 20  held.#          
f730: 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64          on the d
f740: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a  atabase file..#.
f750: 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 33 2e  #   pager1-23.3.
f760: 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20  *: Same test as 
f770: 61 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c 65  above, but while
f780: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
f790: 20 69 73 20 68 65 6c 64 0a 23 20 20 20 20 20 20   is held.#      
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20 74              on t
f7b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f7c0: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
f7d0: 33 2e 34 2e 2a 3a 20 41 6e 64 2c 20 66 6f 72 20  3.4.*: And, for 
f7e0: 66 75 6e 2c 20 77 68 69 6c 65 20 68 6f 6c 64 69  fun, while holdi
f7f0: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
f800: 6c 6f 63 6b 2e 0a 23 0a 23 20 20 20 70 61 67 65  lock..#.#   page
f810: 72 31 2d 32 33 2e 35 2e 2a 3a 20 54 72 79 20 74  r1-23.5.*: Try t
f820: 6f 20 73 65 74 20 76 61 72 69 6f 75 73 20 64 69  o set various di
f830: 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  fferent journal 
f840: 6d 6f 64 65 73 20 77 69 74 68 20 61 6e 0a 23 20  modes with an.# 
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f870: 61 73 65 20 28 6f 6e 6c 79 20 4d 45 4d 4f 52 59  ase (only MEMORY
f880: 20 61 6e 64 20 4f 46 46 20 73 68 6f 75 6c 64 20   and OFF should 
f890: 77 6f 72 6b 29 2e 0a 23 0a 23 20 20 20 70 61 67  work)..#.#   pag
f8a0: 65 72 31 2d 32 33 2e 36 2e 2a 3a 20 54 72 79 20  er1-23.6.*: Try 
f8b0: 74 6f 20 73 65 74 20 6c 6f 63 6b 69 6e 67 5f 6d  to set locking_m
f8c0: 6f 64 65 3d 6e 6f 72 6d 61 6c 20 6f 6e 20 61 6e  ode=normal on an
f8d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f8e0: 61 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ase.#           
f8f0: 20 20 20 20 20 20 20 28 64 6f 65 73 6e 27 74 20         (doesn't 
f900: 77 6f 72 6b 20 2d 20 69 6e 2d 6d 65 6d 6f 72 79  work - in-memory
f910: 20 64 61 74 61 62 61 73 65 73 20 61 6c 77 61 79   databases alway
f920: 73 20 75 73 65 0a 23 20 20 20 20 20 20 20 20 20  s use.#         
f930: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 69 6e 67           locking
f940: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 29  _mode=exclusive)
f950: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
f960: 72 31 2d 32 33 2e 31 2e 31 20 7b 0a 20 20 66 61  r1-23.1.1 {.  fa
f970: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
f980: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
f990: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
f9a0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
f9b0: 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45 41  ERSIST;.    CREA
f9c0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
f9d0: 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 65 78  );.  }.  file ex
f9e0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
f9f0: 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  rnal.} {1}.do_te
fa00: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 32  st pager1-23.1.2
fa10: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
fa20: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
fa30: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20  de = DELETE }.  
fa40: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
fa50: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30  .db-journal.} {0
fa60: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
fa70: 31 2d 32 33 2e 32 2e 31 20 7b 0a 20 20 65 78 65  1-23.2.1 {.  exe
fa80: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
fa90: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
faa0: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e   PERSIST;.    IN
fab0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
fac0: 55 45 53 28 27 43 61 6e 62 65 72 72 61 27 2c 20  UES('Canberra', 
fad0: 27 41 43 54 27 29 3b 0a 20 20 7d 0a 20 20 64 62  'ACT');.  }.  db
fae0: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a   eval { SELECT *
faf0: 20 46 52 4f 4d 20 74 31 20 7d 20 7b 0a 20 20 20   FROM t1 } {.   
fb00: 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d   db eval { PRAGM
fb10: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
fb20: 20 44 45 4c 45 54 45 20 7d 0a 20 20 7d 0a 20 20   DELETE }.  }.  
fb30: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
fb40: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a   journal_mode }.
fb50: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65  } {delete}.do_te
fb60: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 32  st pager1-23.2.2
fb70: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   {.  file exists
fb80: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
fb90: 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20  .} {0}..do_test 
fba0: 70 61 67 65 72 31 2d 32 33 2e 33 2e 31 20 7b 0a  pager1-23.3.1 {.
fbb0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
fbc0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
fbd0: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
fbe0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
fbf0: 31 20 56 41 4c 55 45 53 28 27 44 61 72 77 69 6e  1 VALUES('Darwin
fc00: 27 2c 20 27 4e 54 27 29 3b 0a 20 20 20 20 42 45  ', 'NT');.    BE
fc10: 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20  GIN IMMEDIATE;. 
fc20: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50   }.  db eval { P
fc30: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
fc40: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20  de = DELETE }.  
fc50: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
fc60: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a   journal_mode }.
fc70: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65  } {delete}.do_te
fc80: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 32  st pager1-23.3.2
fc90: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   {.  file exists
fca0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
fcb0: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {0}.do_test p
fcc0: 61 67 65 72 31 2d 32 33 2e 33 2e 33 20 7b 0a 20  ager1-23.3.3 {. 
fcd0: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
fce0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
fcf0: 67 65 72 31 2d 32 33 2e 34 2e 31 20 7b 0a 20 20  ger1-23.4.1 {.  
fd00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
fd10: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
fd20: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
fd30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
fd40: 56 41 4c 55 45 53 28 27 41 64 65 6c 61 69 64 65  VALUES('Adelaide
fd50: 27 2c 20 27 53 41 27 29 3b 0a 20 20 20 20 42 45  ', 'SA');.    BE
fd60: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20  GIN EXCLUSIVE;. 
fd70: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50   }.  db eval { P
fd80: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
fd90: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20  de = DELETE }.  
fda0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
fdb0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a   journal_mode }.
fdc0: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65  } {delete}.do_te
fdd0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 32  st pager1-23.4.2
fde0: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   {.  file exists
fdf0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
fe00: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {0}.do_test p
fe10: 61 67 65 72 31 2d 32 33 2e 34 2e 33 20 7b 0a 20  ager1-23.4.3 {. 
fe20: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
fe30: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
fe40: 67 65 72 31 2d 32 33 2e 35 2e 31 20 7b 0a 20 20  ger1-23.5.1 {.  
fe50: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
fe60: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c  and_reopen.  sql
fe70: 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a  ite3 db :memory:
fe80: 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74  .} {}.foreach {t
fe90: 6e 20 6d 6f 64 65 20 70 6f 73 73 69 62 6c 65 7d  n mode possible}
fea0: 20 7b 0a 20 20 32 20 20 6f 66 66 20 20 20 20 20   {.  2  off     
feb0: 20 31 0a 20 20 33 20 20 6d 65 6d 6f 72 79 20 20   1.  3  memory  
fec0: 20 31 0a 20 20 34 20 20 70 65 72 73 69 73 74 20   1.  4  persist 
fed0: 20 30 0a 20 20 35 20 20 64 65 6c 65 74 65 20 20   0.  5  delete  
fee0: 20 30 0a 20 20 36 20 20 77 61 6c 20 20 20 20 20   0.  6  wal     
fef0: 20 30 0a 20 20 37 20 20 74 72 75 6e 63 61 74 65   0.  7  truncate
ff00: 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74   0.} {.  do_test
ff10: 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74 6e   pager1-23.5.$tn
ff20: 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
ff30: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
ff40: 5f 6d 6f 64 65 20 3d 20 6f 66 66 22 0a 20 20 20  _mode = off".   
ff50: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
ff60: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
ff70: 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24  $mode".  } [if $
ff80: 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24  possible {list $
ff90: 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6f 66 66 7d  mode} {list off}
ffa0: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
ffb0: 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 32 20 7b 0a  r1-23.5.$tn.2 {.
ffc0: 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41      execsql "PRA
ffd0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
ffe0: 20 3d 20 6d 65 6d 6f 72 79 22 0a 20 20 20 20 65   = memory".    e
fff0: 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a  xecsql "PRAGMA j
10000 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d  ournal_mode = $m
10010 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f  ode".  } [if $po
10020 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f  ssible {list $mo
10030 64 65 7d 20 7b 6c 69 73 74 20 6d 65 6d 6f 72 79  de} {list memory
10040 7d 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  }].}.do_test pag
10050 65 72 31 2d 32 33 2e 36 2e 31 20 7b 0a 20 20 65  er1-23.6.1 {.  e
10060 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c  xecsql {PRAGMA l
10070 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f  ocking_mode = no
10080 72 6d 61 6c 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  rmal}.} {exclusi
10090 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ve}.do_test page
100a0 72 31 2d 32 33 2e 36 2e 32 20 7b 0a 20 20 65 78  r1-23.6.2 {.  ex
100b0 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f  ecsql {PRAGMA lo
100c0 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63  cking_mode = exc
100d0 6c 75 73 69 76 65 7d 0a 7d 20 7b 65 78 63 6c 75  lusive}.} {exclu
100e0 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61  sive}.do_test pa
100f0 67 65 72 31 2d 32 33 2e 36 2e 33 20 7b 0a 20 20  ger1-23.6.3 {.  
10100 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
10110 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20  locking_mode}.} 
10120 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74  {exclusive}.do_t
10130 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  est pager1-23.6.
10140 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  4 {.  execsql {P
10150 52 41 47 4d 41 20 6d 61 69 6e 2e 6c 6f 63 6b 69  RAGMA main.locki
10160 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c  ng_mode}.} {excl
10170 75 73 69 76 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  usive}..#-------
10180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101c0 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  --.#.do_test pag
101d0 65 72 31 2d 32 34 2e 31 2e 31 20 7b 0a 20 20 66  er1-24.1.1 {.  f
101e0 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
101f0 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
10200 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
10210 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
10220 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  {.    PRAGMA cac
10230 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
10240 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
10250 63 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20 20  cuum = FULL;.   
10260 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31   CREATE TABLE x1
10270 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52  (x, y, z, PRIMAR
10280 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20 20  Y KEY(y, z));.  
10290 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
102a0 32 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41  2(x, y, z, PRIMA
102b0 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20  RY KEY(y, z));. 
102c0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
102d0 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  2 VALUES(a_strin
102e0 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(400), a_string
102f0 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
10300 36 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  600));.    INSER
10310 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54  T INTO x2 SELECT
10320 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20   a_string(600), 
10330 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61  a_string(400), a
10340 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f  _string(500) FRO
10350 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x2;.    INSERT
10360 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20   INTO x2 SELECT 
10370 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
10380 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f  _string(600), a_
10390 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
103a0 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x2;.    INSERT 
103b0 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61  INTO x2 SELECT a
103c0 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f  _string(400), a_
103d0 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
103e0 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
103f0 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x2;.    INSERT I
10400 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f  NTO x2 SELECT a_
10410 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73  string(600), a_s
10420 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74  tring(400), a_st
10430 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20 78  ring(500) FROM x
10440 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  2;.    INSERT IN
10450 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73  TO x2 SELECT a_s
10460 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
10470 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72  ring(600), a_str
10480 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 78 32  ing(400) FROM x2
10490 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
104a0 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74  O x2 SELECT a_st
104b0 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72  ring(400), a_str
104c0 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
104d0 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 78 32 3b  ng(600) FROM x2;
104e0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
104f0 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   x1 SELECT * FRO
10500 4d 20 78 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  M x2;.  }.} {}.d
10510 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34  o_test pager1-24
10520 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
10530 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
10540 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
10550 78 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c 33  x1 WHERE rowid<3
10560 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69  2;.  }.  recursi
10570 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32 0a  ve_select 64 x2.
10580 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
10590 65 72 31 2d 32 34 2e 31 2e 33 20 7b 0a 20 20 65  er1-24.1.3 {.  e
105a0 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
105b0 55 50 44 41 54 45 20 78 31 20 53 45 54 20 7a 20  UPDATE x1 SET z 
105c0 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  = a_string(300) 
105d0 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a  WHERE rowid>40;.
105e0 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
105f0 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
10600 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45  _check;.    SELE
10610 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
10620 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33   x1;.  }.} {ok 3
10630 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  3}..do_test page
10640 72 31 2d 32 34 2e 31 2e 34 20 7b 0a 20 20 65 78  r1-24.1.4 {.  ex
10650 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
10660 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20  TE FROM x1;.    
10670 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53  INSERT INTO x1 S
10680 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b  ELECT * FROM x2;
10690 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
106a0 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31    DELETE FROM x1
106b0 20 57 48 45 52 45 20 72 6f 77 69 64 3c 33 32 3b   WHERE rowid<32;
106c0 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78 31  .      UPDATE x1
106d0 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69 6e   SET z = a_strin
106e0 67 28 32 39 39 29 20 57 48 45 52 45 20 72 6f 77  g(299) WHERE row
106f0 69 64 3e 34 30 3b 0a 20 20 7d 0a 20 20 72 65 63  id>40;.  }.  rec
10700 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34  ursive_select 64
10710 20 78 32 20 7b 64 62 20 65 76 61 6c 20 43 4f 4d   x2 {db eval COM
10720 4d 49 54 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  MIT}.  execsql {
10730 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
10740 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20  grity_check;.   
10750 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
10760 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20   FROM x1;.  }.} 
10770 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73 74  {ok 33}..do_test
10780 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 35 20 7b   pager1-24.1.5 {
10790 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
107a0 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 3b   DELETE FROM x1;
107b0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
107c0 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   x1 SELECT * FRO
107d0 4d 20 78 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75  M x2;.  }.  recu
107e0 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20  rsive_select 64 
107f0 78 32 20 7b 20 64 62 20 65 76 61 6c 20 7b 43 52  x2 { db eval {CR
10800 45 41 54 45 20 54 41 42 4c 45 20 78 33 28 78 2c  EATE TABLE x3(x,
10810 20 79 2c 20 7a 29 7d 20 7d 0a 20 20 65 78 65 63   y, z)} }.  exec
10820 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
10830 52 4f 4d 20 78 33 20 7d 0a 7d 20 7b 7d 0a 0a 23  ROM x3 }.} {}..#
10840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 0a 64 6f 5f 74  ---------.#.do_t
10890 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 31 20  est pager1-25-1 
108a0 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
108b0 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
108c0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
108d0 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56 45  EGIN;.      SAVE
108e0 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20  POINT abc;.     
108f0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10900 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
10910 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b  ROLLBACK TO abc;
10920 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
10930 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d  .  db close.} {}
10940 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
10950 32 35 2d 32 20 7b 0a 20 20 66 61 75 6c 74 73 69  25-2 {.  faultsi
10960 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
10970 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
10980 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62      SAVEPOINT ab
10990 63 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  c;.      CREATE 
109a0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
109b0 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
109c0 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  abc;.    COMMIT;
109d0 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
109e0 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
109f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a30 0a 23 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 74  .# Sector-size t
10a40 65 73 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ests..#.do_test 
10a50 70 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20  pager1-26.1 {.  
10a60 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
10a70 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74 6f  ult 1.  tv secto
10a80 72 73 69 7a 65 20 34 30 39 36 0a 20 20 66 61 75  rsize 4096.  fau
10a90 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
10aa0 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
10ab0 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
10ac0 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
10ad0 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
10ae0 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20  size = 512;.    
10af0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c  CREATE TABLE tbl
10b00 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
10b10 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 42  b UNIQUE);.    B
10b20 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
10b30 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
10b40 45 53 28 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  ES(a_string(25),
10b50 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b   a_string(600));
10b60 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10b70 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f  TO tbl SELECT a_
10b80 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
10b90 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74  ring(600) FROM t
10ba0 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bl;.      INSERT
10bb0 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
10bc0 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
10bd0 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
10be0 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
10bf0 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
10c00 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
10c10 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10c20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
10c30 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
10c40 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10c50 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
10c60 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  0) FROM tbl;.   
10c70 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10c80 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
10c90 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
10ca0 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
10cb0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
10cc0 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
10cd0 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
10ce0 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
10cf0 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
10d00 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
10d10 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
10d20 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10d30 20 74 62 6c 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   tbl;.    COMMIT
10d40 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78  ;.  }.} {}.do_ex
10d50 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
10d60 31 2d 32 36 2e 31 20 7b 0a 20 20 55 50 44 41 54  1-26.1 {.  UPDAT
10d70 45 20 74 62 6c 20 53 45 54 20 62 20 3d 20 61 5f  E tbl SET b = a_
10d80 73 74 72 69 6e 67 28 35 35 30 29 3b 0a 7d 20 7b  string(550);.} {
10d90 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  }.db close.tv de
10da0 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lete..#---------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dd0 2d 2d 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 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
10e00 31 2e 32 37 2e 31 20 7b 0a 20 20 66 61 75 6c 74  1.27.1 {.  fault
10e10 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
10e20 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 5f  eopen.  sqlite3_
10e30 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20  pager_refcounts 
10e40 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
10e50 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
10e60 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
10e70 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  a, b);.  }.  sql
10e80 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f  ite3_pager_refco
10e90 75 6e 74 73 20 64 62 0a 20 20 65 78 65 63 73 71  unts db.  execsq
10ea0 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23  l COMMIT.} {}..#
10eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74  ---------.# Test
10f00 20 74 68 61 74 20 61 74 74 65 6d 70 74 69 6e 67   that attempting
10f10 20 74 6f 20 6f 70 65 6e 20 61 20 77 72 69 74 65   to open a write
10f20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74  -transaction wit
10f30 68 20 0a 23 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  h .# locking_mod
10f40 65 3d 65 78 63 6c 75 73 69 76 65 20 69 6e 20 57  e=exclusive in W
10f50 41 4c 20 6d 6f 64 65 20 66 61 69 6c 73 20 69 66  AL mode fails if
10f60 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
10f70 20 63 6c 69 65 6e 74 73 20 6f 6e 20 0a 23 20 74   clients on .# t
10f80 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
10f90 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64 62 20 63  ..#.catch { db c
10fa0 6c 6f 73 65 20 7d 0a 69 66 63 61 70 61 62 6c 65  lose }.ifcapable
10fb0 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 6d 75 6c 74   wal {.  do_mult
10fc0 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20  iclient_test tn 
10fd0 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  {.    do_test pa
10fe0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a  ger1-28.$tn.1 {.
10ff0 20 20 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20        sql1 { .  
11000 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
11010 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
11020 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
11030 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
11040 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
11050 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61  NTO t1 VALUES('a
11060 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 20 20 7d  ', 'b');.      }
11070 0a 20 20 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 20  .    } {wal}.   
11080 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11090 32 38 2e 24 74 6e 2e 32 20 7b 20 73 71 6c 32 20  28.$tn.2 { sql2 
110a0 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
110b0 74 31 20 7d 20 7d 20 7b 61 20 62 7d 0a 0a 20 20  t1 } } {a b}..  
110c0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
110d0 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31  -28.$tn.3 { sql1
110e0 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
110f0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
11100 20 7d 20 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d   } } {exclusive}
11110 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
11120 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 0a  er1-28.$tn.4 { .
11130 20 20 20 20 20 20 63 73 71 6c 31 20 7b 20 42 45        csql1 { BE
11140 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  GIN; INSERT INTO
11150 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20   t1 VALUES('c', 
11160 27 64 27 29 3b 20 7d 0a 20 20 20 20 7d 20 7b 31  'd'); }.    } {1
11170 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
11180 63 6b 65 64 7d 7d 0a 20 20 20 20 63 6f 64 65 32  cked}}.    code2
11190 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 3b 20 73   { db2 close ; s
111a0 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
111b0 64 62 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  db }.    do_test
111c0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34   pager1-28.$tn.4
111d0 20 7b 20 0a 20 20 20 20 20 20 73 71 6c 31 20 7b   { .      sql1 {
111e0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
111f0 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29  VALUES('c', 'd')
11200 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 7d  ; COMMIT }.    }
11210 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d   {}.  }.}..#----
11220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11240 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 4e 6f 72 6d 61 6c 6c 79  -----.# Normally
11270 2c 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20  , when changing 
11280 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  from journal_mod
11290 65 3d 50 45 52 53 49 53 54 20 74 6f 20 44 45 4c  e=PERSIST to DEL
112a0 45 54 45 20 74 68 65 20 70 61 67 65 72 0a 23 20  ETE the pager.# 
112b0 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 6c 65  attempts to dele
112c0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
112d0 69 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ile. However, if
112e0 20 69 74 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   it cannot obtai
112f0 6e 20 61 0a 23 20 52 45 53 45 52 56 45 44 20 6c  n a.# RESERVED l
11300 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
11310 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 73  ase file, this s
11320 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  tep is skipped..
11330 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74  #.do_multiclient
11340 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f 5f  _test tn {.  do_
11350 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11360 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20  tn.1 {.    sql1 
11370 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
11380 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
11390 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 43 52  ERSIST;.      CR
113a0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
113b0 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
113c0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
113d0 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
113e0 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a  }.  } {persist}.
113f0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11400 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 66 69 6c 65  -28.$tn.2 { file
11410 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
11420 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f  journal } 1.  do
11430 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11440 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20 50  $tn.3 { sql1 { P
11450 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
11460 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20  de = DELETE } } 
11470 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74  delete.  do_test
11480 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34   pager1-28.$tn.4
11490 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
114a0 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
114b0 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   0..  do_test pa
114c0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 35 20 7b 0a  ger1-28.$tn.5 {.
114d0 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20      sql1 { .    
114e0 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
114f0 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
11500 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
11510 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27  TO t1 VALUES('c'
11520 2c 20 27 64 27 29 3b 0a 20 20 20 20 7d 0a 20 20  , 'd');.    }.  
11530 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f  } {persist}.  do
11540 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11550 24 74 6e 2e 36 20 7b 20 66 69 6c 65 20 65 78 69  $tn.6 { file exi
11560 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
11570 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  nal } 1.  do_tes
11580 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11590 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42  7 {.    sql2 { B
115a0 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54  EGIN; INSERT INT
115b0 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65 27 2c  O t1 VALUES('e',
115c0 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a   'f'); }.  } {}.
115d0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
115e0 2d 32 38 2e 24 74 6e 2e 38 20 20 7b 20 66 69 6c  -28.$tn.8  { fil
115f0 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
11600 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64  -journal } 1.  d
11610 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11620 2e 24 74 6e 2e 39 20 20 7b 20 73 71 6c 31 20 7b  .$tn.9  { sql1 {
11630 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
11640 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20  mode = DELETE } 
11650 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65  } delete.  do_te
11660 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11670 2e 31 30 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .10 { file exist
11680 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
11690 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 1..  do_test
116a0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
116b0 31 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20  1 { sql2 COMMIT 
116c0 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
116d0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 32 20  ager1-28.$tn.12 
116e0 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
116f0 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
11700 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  0..  do_test pag
11710 65 72 31 2d 32 38 2d 24 74 6e 2e 31 33 20 7b 0a  er1-28-$tn.13 {.
11720 20 20 20 20 63 6f 64 65 31 20 7b 20 73 65 74 20      code1 { set 
11730 63 68 61 6e 6e 65 6c 20 5b 64 62 20 69 6e 63 72  channel [db incr
11740 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c 79 20 74  blob -readonly t
11750 31 20 61 20 32 5d 20 7d 0a 20 20 20 20 73 71 6c  1 a 2] }.    sql
11760 31 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  1 {.      PRAGMA
11770 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
11780 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 49  PERSIST;.      I
11790 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
117a0 4c 55 45 53 28 27 67 27 2c 20 27 68 27 29 3b 0a  LUES('g', 'h');.
117b0 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69      }.  } {persi
117c0 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  st}.  do_test pa
117d0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 34 20 7b  ger1-28.$tn.14 {
117e0 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
117f0 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
11800 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11810 31 2d 32 38 2e 24 74 6e 2e 31 35 20 7b 0a 20 20  1-28.$tn.15 {.  
11820 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20    sql2 { BEGIN; 
11830 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
11840 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29 3b  ALUES('e', 'f');
11850 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
11860 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
11870 6e 2e 31 36 20 7b 20 73 71 6c 31 20 7b 20 50 52  n.16 { sql1 { PR
11880 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
11890 65 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20 64  e = DELETE } } d
118a0 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20  elete.  do_test 
118b0 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 37  pager1-28.$tn.17
118c0 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
118d0 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
118e0 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   1..  do_test pa
118f0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 37 20 7b  ger1-28.$tn.17 {
11900 20 63 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20   csql2 { COMMIT 
11910 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  } } {1 {database
11920 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
11930 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11940 2d 24 74 6e 2e 31 38 20 7b 20 63 6f 64 65 31 20  -$tn.18 { code1 
11950 7b 20 72 65 61 64 20 24 63 68 61 6e 6e 65 6c 20  { read $channel 
11960 7d 20 7d 20 63 0a 20 20 64 6f 5f 74 65 73 74 20  } } c.  do_test 
11970 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 39  pager1-28-$tn.19
11980 20 7b 20 63 6f 64 65 31 20 7b 20 63 6c 6f 73 65   { code1 { close
11990 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 7b 7d   $channel } } {}
119a0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
119b0 31 2d 32 38 2e 24 74 6e 2e 32 30 20 7b 20 73 71  1-28.$tn.20 { sq
119c0 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20  l2 { COMMIT } } 
119d0 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  {}.}..do_test pa
119e0 67 65 72 31 2d 32 39 2e 31 20 7b 0a 20 20 66 61  ger1-29.1 {.  fa
119f0 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
11a00 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
11a10 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
11a20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
11a30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  ;.    PRAGMA aut
11a40 6f 5f 76 61 63 75 75 6d 20 3d 20 66 75 6c 6c 3b  o_vacuum = full;
11a50 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
11a60 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
11a70 76 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ve;.    CREATE T
11a80 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
11a90 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11aa0 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
11ab0 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20    }.  file size 
11ac0 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20  test.db.} [expr 
11ad0 31 30 32 34 2a 33 5d 0a 64 6f 5f 74 65 73 74 20  1024*3].do_test 
11ae0 70 61 67 65 72 31 2d 32 39 2e 32 20 7b 0a 20 20  pager1-29.2 {.  
11af0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
11b00 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
11b10 20 34 30 39 36 3b 0a 20 20 20 20 56 41 43 55 55   4096;.    VACUU
11b20 4d 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  M;.  }.  file si
11b30 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78  ze test.db.} [ex
11b40 70 72 20 34 30 39 36 2a 33 5d 0a 0a 23 2d 2d 2d  pr 4096*3]..#---
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b90 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
11ba0 61 74 20 69 66 20 61 6e 20 65 6d 70 74 79 20 64  at if an empty d
11bb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73 69  atabase file (si
11bc0 7a 65 20 30 20 62 79 74 65 73 29 20 69 73 20 6f  ze 0 bytes) is o
11bd0 70 65 6e 65 64 20 69 6e 20 0a 23 20 65 78 63 6c  pened in .# excl
11be0 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
11bf0 64 65 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  de, any journal 
11c00 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
11c10 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79  from the file-sy
11c20 73 74 65 6d 0a 23 20 77 69 74 68 6f 75 74 20 62  stem.# without b
11c30 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
11c40 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 52  . And that the R
11c50 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 62 74  ESERVED lock obt
11c60 61 69 6e 65 64 20 77 68 69 6c 65 0a 23 20 64 6f  ained while.# do
11c70 69 6e 67 20 74 68 69 73 20 69 73 20 6e 6f 74 20  ing this is not 
11c80 72 65 6c 65 61 73 65 64 2e 0a 23 0a 64 6f 5f 74  released..#.do_t
11c90 65 73 74 20 70 61 67 65 72 31 2d 33 30 2e 31 20  est pager1-30.1 
11ca0 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64  {.  db close.  d
11cb0 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73 74 2e  elete_file test.
11cc0 64 62 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65  db.  delete_file
11cd0 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
11ce0 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20  .  set fd [open 
11cf0 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
11d00 77 5d 0a 20 20 73 65 65 6b 20 24 66 64 20 5b 65  w].  seek $fd [e
11d10 78 70 72 20 35 31 32 2b 31 30 33 32 2a 32 5d 0a  xpr 512+1032*2].
11d20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
11d30 65 20 24 66 64 20 78 0a 20 20 63 6c 6f 73 65 20  e $fd x.  close 
11d40 24 66 64 0a 0a 20 20 73 71 6c 69 74 65 33 20 64  $fd..  sqlite3 d
11d50 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
11d60 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
11d70 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
11d80 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 53 45 4c  CLUSIVE;.    SEL
11d90 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
11da0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
11db0 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
11dc0 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b  _status;.  }.} {
11dd0 65 78 63 6c 75 73 69 76 65 20 30 20 6d 61 69 6e  exclusive 0 main
11de0 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63   reserved temp c
11df0 6c 6f 73 65 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  losed}..#-------
11e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e40 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  --.# Test that i
11e50 66 20 74 68 65 20 22 70 61 67 65 2d 73 69 7a 65  f the "page-size
11e60 22 20 66 69 65 6c 64 20 69 6e 20 61 20 6a 6f 75  " field in a jou
11e70 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 30  rnal-header is 0
11e80 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20  , the journal.# 
11e90 66 69 6c 65 20 63 61 6e 20 73 74 69 6c 6c 20 62  file can still b
11ea0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
11eb0 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
11ec0 66 6f 72 20 62 61 63 6b 77 61 72 64 20 63 6f 6d  for backward com
11ed0 70 61 74 69 62 69 6c 69 74 79 20 2d 0a 23 20 76  patibility -.# v
11ee0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
11ef0 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38  e prior to 3.5.8
11f00 20 61 6c 77 61 79 73 20 73 65 74 20 74 68 69 73   always set this
11f10 20 66 69 65 6c 64 20 74 6f 20 7a 65 72 6f 2e 0a   field to zero..
11f20 23 0a 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66  #.if {$tcl_platf
11f30 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22  orm(platform)=="
11f40 75 6e 69 78 22 7d 20 7b 0a 64 6f 5f 74 65 73 74  unix"} {.do_test
11f50 20 70 61 67 65 72 31 2d 33 31 2e 31 20 7b 0a 20   pager1-31.1 {. 
11f60 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
11f70 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
11f80 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
11f90 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
11fa0 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  10;.    PRAGMA p
11fb0 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
11fc0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
11fd0 45 20 74 31 28 78 2c 20 79 2c 20 55 4e 49 51 55  E t1(x, y, UNIQU
11fe0 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 49 4e  E(x, y));.    IN
11ff0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
12000 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  UES(randomblob(1
12010 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
12020 28 31 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  (1500));.    INS
12030 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
12040 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
12050 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
12060 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
12070 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
12080 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
12090 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
120a0 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
120b0 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
120c0 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
120d0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
120e0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
120f0 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
12100 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
12110 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
12120 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
12130 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
12140 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12150 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
12160 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
12170 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
12180 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
12190 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
121a0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
121b0 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
121c0 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
121d0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
121e0 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
121f0 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
12200 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
12210 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
12220 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
12230 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
12240 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
12250 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
12260 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
12270 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
12280 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
12290 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
122a0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
122b0 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
122c0 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
122d0 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
122e0 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   t1;.    BEGIN;.
122f0 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
12300 53 45 54 20 79 20 3d 20 72 61 6e 64 6f 6d 62 6c  SET y = randombl
12310 6f 62 28 31 34 39 39 29 3b 0a 20 20 7d 0a 20 20  ob(1499);.  }.  
12320 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64  copy_file test.d
12330 62 20 74 65 73 74 2e 64 62 32 0a 20 20 63 6f 70  b test.db2.  cop
12340 79 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a  y_file test.db-j
12350 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d  ournal test.db2-
12360 6a 6f 75 72 6e 61 6c 0a 20 20 0a 20 20 68 65 78  journal.  .  hex
12370 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
12380 32 2d 6a 6f 75 72 6e 61 6c 20 32 34 20 30 30 30  2-journal 24 000
12390 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
123a0 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65  db2 test.db2.  e
123b0 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
123c0 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
123d0 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 7d 0a 0a  } db2.} {ok}.}..
123e0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
123f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
12430 74 20 74 68 61 74 20 61 20 64 61 74 61 62 61 73  t that a databas
12440 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 22 70  e file can be "p
12450 72 65 2d 68 69 6e 74 65 64 22 20 74 6f 20 61 20  re-hinted" to a 
12460 63 65 72 74 61 69 6e 20 73 69 7a 65 20 61 6e 64  certain size and
12470 20 74 68 61 74 0a 23 20 73 75 62 73 65 71 75 65   that.# subseque
12480 6e 74 20 73 70 69 6c 6c 69 6e 67 20 6f 66 20 74  nt spilling of t
12490 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 64  he pager cache d
124a0 6f 65 73 20 6e 6f 74 20 72 65 73 75 6c 74 20 69  oes not result i
124b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 23  n the database.#
124c0 20 66 69 6c 65 20 62 65 69 6e 67 20 73 68 72 75   file being shru
124d0 6e 6b 2e 0a 23 0a 63 61 74 63 68 20 7b 64 62 20  nk..#.catch {db 
124e0 63 6c 6f 73 65 7d 0a 66 6f 72 63 65 64 65 6c 65  close}.forcedele
124f0 74 65 20 74 65 73 74 2e 64 62 0a 0a 64 6f 5f 74  te test.db..do_t
12500 65 73 74 20 70 61 67 65 72 31 2d 33 32 2e 31 20  est pager1-32.1 
12510 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  {.  sqlite3 db t
12520 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
12530 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
12540 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20  BLE t1(x, y);.  
12550 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  }.  db close.  s
12560 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
12570 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
12580 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
12590 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
125a0 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(1, randomblob
125b0 28 31 30 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20  (10000));.  }.  
125c0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75  file_control_chu
125d0 6e 6b 73 69 7a 65 5f 74 65 73 74 20 64 62 20 6d  nksize_test db m
125e0 61 69 6e 20 31 30 32 34 0a 20 20 66 69 6c 65 5f  ain 1024.  file_
125f0 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74  control_sizehint
12600 5f 74 65 73 74 20 64 62 20 6d 61 69 6e 20 32 30  _test db main 20
12610 39 37 31 35 32 30 3b 20 23 20 32 30 4d 42 0a 20  971520; # 20MB. 
12620 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
12630 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
12640 20 3d 20 31 30 3b 0a 20 20 20 20 49 4e 53 45 52   = 10;.    INSER
12650 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
12660 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (1, randomblob(1
12670 30 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  0000));.    INSE
12680 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
12690 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  S(2, randomblob(
126a0 31 30 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  10000));.    INS
126b0 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
126c0 43 54 20 78 2b 32 2c 20 72 61 6e 64 6f 6d 62 6c  CT x+2, randombl
126d0 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74  ob(10000) from t
126e0 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
126f0 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 34  TO t1 SELECT x+4
12700 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
12710 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20  00) from t1;.   
12720 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
12730 53 45 4c 45 43 54 20 78 2b 38 2c 20 72 61 6e 64  SELECT x+8, rand
12740 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72  omblob(10000) fr
12750 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  om t1;.    INSER
12760 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
12770 20 78 2b 31 36 2c 20 72 61 6e 64 6f 6d 62 6c 6f   x+16, randomblo
12780 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31  b(10000) from t1
12790 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
127a0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
127b0 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
127c0 20 64 62 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65   db close.  file
127d0 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
127e0 7b 32 30 39 37 31 35 32 30 7d 0a 0a 23 20 43 6c  {20971520}..# Cl
127f0 65 61 6e 75 70 20 32 30 4d 42 20 66 69 6c 65 20  eanup 20MB file 
12800 6c 65 66 74 20 62 79 20 74 68 65 20 70 72 65 76  left by the prev
12810 69 6f 75 73 20 74 65 73 74 2e 0a 66 6f 72 63 65  ious test..force
12820 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 0a  delete test.db..
12830 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
12840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
12880 74 20 74 68 61 74 20 69 66 20 61 20 74 72 61 6e  t that if a tran
12890 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
128a0 74 74 65 64 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  tted in journal_
128b0 6d 6f 64 65 3d 44 45 4c 45 54 45 20 6d 6f 64 65  mode=DELETE mode
128c0 2c 0a 23 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ,.# and the call
128d0 20 74 6f 20 75 6e 6c 69 6e 6b 28 29 20 72 65 74   to unlink() ret
128e0 75 72 6e 73 20 61 6e 20 45 4e 4f 45 4e 54 20 65  urns an ENOENT e
128f0 72 72 6f 72 2c 20 74 68 65 20 43 4f 4d 4d 49 54  rror, the COMMIT
12900 20 64 6f 65 73 20 6e 6f 74 0a 23 20 73 75 63 63   does not.# succ
12910 65 65 64 2e 0a 23 0a 69 66 20 7b 24 3a 3a 74 63  eed..#.if {$::tc
12920 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
12930 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a  orm)=="unix"} {.
12940 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
12950 2d 33 33 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69  -33.1 {.    sqli
12960 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
12970 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
12980 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
12990 74 31 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53  t1(x);.      INS
129a0 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
129b0 45 53 28 27 6f 6e 65 27 29 3b 0a 20 20 20 20 20  ES('one');.     
129c0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
129d0 56 41 4c 55 45 53 28 27 74 77 6f 27 29 3b 0a 20  VALUES('two');. 
129e0 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
129f0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12a00 74 31 20 56 41 4c 55 45 53 28 27 74 68 72 65 65  t1 VALUES('three
12a10 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
12a20 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
12a30 53 28 27 66 6f 75 72 27 29 3b 0a 20 20 20 20 7d  S('four');.    }
12a40 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65  .    forcedelete
12a50 20 62 61 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   bak-journal.   
12a60 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 74 65 73   file rename tes
12a70 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 62 61 6b  t.db-journal bak
12a80 2d 6a 6f 75 72 6e 61 6c 0a 0a 20 20 20 20 63 61  -journal..    ca
12a90 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20  tchsql COMMIT.  
12aa0 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65  } {1 {disk I/O e
12ab0 72 72 6f 72 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73  rror}}..  do_tes
12ac0 74 20 70 61 67 65 72 31 2d 33 33 2e 32 20 7b 0a  t pager1-33.2 {.
12ad0 20 20 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20      file rename 
12ae0 62 61 6b 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74  bak-journal test
12af0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  .db-journal.    
12b00 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
12b10 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d   * FROM t1 }.  }
12b20 20 7b 6f 6e 65 20 74 77 6f 7d 0a 7d 0a 0a 23 2d   {one two}.}..#-
12b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b70 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
12b80 74 68 61 74 20 61 70 70 65 6e 64 69 6e 67 20 70  that appending p
12b90 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
12ba0 62 61 73 65 20 66 69 6c 65 20 74 68 65 6e 20 6d  base file then m
12bb0 6f 76 69 6e 67 20 74 68 6f 73 65 20 70 61 67 65  oving those page
12bc0 73 0a 23 20 74 6f 20 74 68 65 20 66 72 65 65 2d  s.# to the free-
12bd0 6c 69 73 74 20 62 65 66 6f 72 65 20 74 68 65 20  list before the 
12be0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
12bf0 6f 6d 6d 69 74 74 65 64 20 64 6f 65 73 20 6e 6f  ommitted does no
12c00 74 20 63 61 75 73 65 0a 23 20 61 6e 20 65 72 72  t cause.# an err
12c10 6f 72 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  or..#.foreach {t
12c20 6e 20 70 72 61 67 6d 61 20 73 74 72 73 69 7a 65  n pragma strsize
12c30 7d 20 7b 0a 20 20 31 20 7b 20 50 52 41 47 4d 41  } {.  1 { PRAGMA
12c40 20 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 30 20 7d   mmap_size = 0 }
12c50 20 32 34 30 30 0a 20 20 32 20 7b 20 7d 20 20 20   2400.  2 { }   
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c70 20 20 20 20 32 34 30 30 0a 20 20 33 20 7b 20 50      2400.  3 { P
12c80 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 20  RAGMA mmap_size 
12c90 3d 20 30 20 7d 20 34 34 30 30 0a 20 20 34 20 7b  = 0 } 4400.  4 {
12ca0 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
12cb0 20 20 20 20 20 20 20 20 20 34 34 30 30 0a 7d 20           4400.} 
12cc0 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 64  {.  reset_db.  d
12cd0 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
12ce0 61 5f 73 74 72 69 6e 67 0a 20 20 64 62 20 65 76  a_string.  db ev
12cf0 61 6c 20 24 70 72 61 67 6d 61 0a 20 20 64 6f 5f  al $pragma.  do_
12d00 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 34 2e  execsql_test 34.
12d10 24 74 6e 2e 31 20 7b 0a 20 20 20 20 43 52 45 41  $tn.1 {.    CREA
12d20 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
12d30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
12d40 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
12d50 32 29 3b 0a 20 20 7d 0a 20 20 64 6f 5f 65 78 65  2);.  }.  do_exe
12d60 63 73 71 6c 5f 74 65 73 74 20 33 34 2e 24 74 6e  csql_test 34.$tn
12d70 2e 32 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  .2 {.    BEGIN;.
12d80 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12d90 74 31 20 56 41 4c 55 45 53 28 32 2c 20 61 5f 73  t1 VALUES(2, a_s
12da0 74 72 69 6e 67 28 24 73 74 72 73 69 7a 65 29 29  tring($strsize))
12db0 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
12dc0 4d 20 74 31 20 57 48 45 52 45 20 6f 69 64 3d 32  M t1 WHERE oid=2
12dd0 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
12de0 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
12df0 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 7b 6f  ty_check;.  } {o
12e00 6b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  k}.}..#---------
12e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e50 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 74  .#.reset_db.do_t
12e60 65 73 74 20 33 35 20 7b 0a 20 20 73 71 6c 69 74  est 35 {.  sqlit
12e70 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 20  e3 db test.db.. 
12e80 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
12e90 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
12ea0 2c 20 79 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  , y);.    PRAGMA
12eb0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
12ec0 57 41 4c 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  WAL;.    INSERT 
12ed0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
12ee0 2c 20 32 29 3b 0a 20 20 7d 0a 0a 20 20 65 78 65  , 2);.  }..  exe
12ef0 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
12f00 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
12f10 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20  ABLE t2(a, b);. 
12f20 20 7d 0a 0a 20 20 68 65 78 69 6f 5f 77 72 69 74   }..  hexio_writ
12f30 65 20 74 65 73 74 2e 64 62 2d 73 68 6d 20 5b 65  e test.db-shm [e
12f40 78 70 72 20 31 36 2a 31 30 32 34 5d 20 5b 73 74  xpr 16*1024] [st
12f50 72 69 6e 67 20 72 65 70 65 61 74 20 30 30 35 35  ring repeat 0055
12f60 20 38 31 39 32 5d 0a 20 20 63 61 74 63 68 73 71   8192].  catchsq
12f70 6c 20 52 4f 4c 4c 42 41 43 4b 0a 7d 20 7b 30 20  l ROLLBACK.} {0 
12f80 7b 7d 7d 0a 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69  {}}..do_multicli
12f90 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20  ent_test tn {.  
12fa0 73 71 6c 31 20 7b 0a 20 20 20 20 50 52 41 47 4d  sql1 {.    PRAGM
12fb0 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
12fc0 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  0;.    CREATE TA
12fd0 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20  BLE t1(x, y);.  
12fe0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12ff0 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
13000 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 33 36   }..  do_test 36
13010 2e 24 74 6e 2e 31 20 7b 20 0a 20 20 20 20 73 71  .$tn.1 { .    sq
13020 6c 32 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f  l2 { PRAGMA max_
13030 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 32 20 7d  page_count = 2 }
13040 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68  .    list [catch
13050 20 7b 20 73 71 6c 32 20 7b 20 43 52 45 41 54 45   { sql2 { CREATE
13060 20 54 41 42 4c 45 20 74 32 28 78 29 20 7d 20 7d   TABLE t2(x) } }
13070 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 7b   msg] $msg.  } {
13080 31 20 7b 64 61 74 61 62 61 73 65 20 6f 72 20 64  1 {database or d
13090 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 0a 20  isk is full}}.. 
130a0 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 63   sql1 { PRAGMA c
130b0 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73  heckpoint_fullfs
130c0 79 6e 63 20 3d 20 31 20 7d 0a 20 20 73 71 6c 31  ync = 1 }.  sql1
130d0 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
130e0 74 32 28 78 29 20 7d 0a 0a 20 20 64 6f 5f 74 65  t2(x) }..  do_te
130f0 73 74 20 33 36 2e 24 74 6e 2e 32 20 7b 20 0a 20  st 36.$tn.2 { . 
13100 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52 54     sql2 { INSERT
13110 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
13120 27 78 79 7a 27 29 20 7d 0a 20 20 20 20 6c 69 73  'xyz') }.    lis
13130 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 32 20  t [catch { sql2 
13140 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  { CREATE TABLE t
13150 33 28 78 29 20 7d 20 7d 20 6d 73 67 5d 20 24 6d  3(x) } } msg] $m
13160 73 67 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62  sg.  } {1 {datab
13170 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66  ase or disk is f
13180 75 6c 6c 7d 7d 0a 7d 0a 0a 66 6f 72 63 65 64 65  ull}}.}..forcede
13190 6c 65 74 65 20 74 65 73 74 31 20 74 65 73 74 32  lete test1 test2
131a0 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 75 72 69  .foreach {tn uri
131b0 7d 20 7b 0a 20 20 31 20 20 20 7b 66 69 6c 65 3a  } {.  1   {file:
131c0 3f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 26 63 61 63  ?mode=memory&cac
131d0 68 65 3d 73 68 61 72 65 64 7d 0a 20 20 32 20 20  he=shared}.  2  
131e0 20 7b 66 69 6c 65 3a 6f 6e 65 3f 6d 6f 64 65 3d   {file:one?mode=
131f0 6d 65 6d 6f 72 79 26 63 61 63 68 65 3d 73 68 61  memory&cache=sha
13200 72 65 64 7d 0a 20 20 33 20 20 20 7b 66 69 6c 65  red}.  3   {file
13210 3a 74 65 73 74 31 3f 63 61 63 68 65 3d 73 68 61  :test1?cache=sha
13220 72 65 64 7d 0a 20 20 34 20 20 20 7b 66 69 6c 65  red}.  4   {file
13230 3a 74 65 73 74 32 3f 61 6e 6f 74 68 65 72 3d 70  :test2?another=p
13240 61 72 61 6d 65 74 65 72 26 79 65 74 3d 61 6e 6f  arameter&yet=ano
13250 74 68 65 72 6f 6e 65 7d 0a 7d 20 7b 0a 20 20 64  therone}.} {.  d
13260 6f 5f 74 65 73 74 20 33 37 2e 24 74 6e 20 7b 0a  o_test 37.$tn {.
13270 20 20 20 20 63 61 74 63 68 20 7b 20 64 62 20 63      catch { db c
13280 6c 6f 73 65 20 7d 0a 20 20 20 20 73 71 6c 69 74  lose }.    sqlit
13290 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20 20 20 20  e3_shutdown.    
132a0 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 75  sqlite3_config_u
132b0 72 69 20 31 0a 20 20 20 20 73 71 6c 69 74 65 33  ri 1.    sqlite3
132c0 20 64 62 20 24 75 72 69 0a 0a 20 20 20 20 64 62   db $uri..    db
132d0 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 43 52   eval {.      CR
132e0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
132f0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
13300 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 29  NTO t1 VALUES(1)
13310 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
13320 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a   FROM t1;.    }.
13330 20 20 7d 20 7b 31 7d 0a 0a 20 20 64 6f 5f 65 78    } {1}..  do_ex
13340 65 63 73 71 6c 5f 74 65 73 74 20 33 37 2e 24 74  ecsql_test 37.$t
13350 6e 2e 32 20 7b 0a 20 20 20 20 56 41 43 55 55 4d  n.2 {.    VACUUM
13360 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
13370 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 7b 31 7d 0a  ROM t1;.  } {1}.
13380 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71  .  db close.  sq
13390 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20  lite3_shutdown. 
133a0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f   sqlite3_config_
133b0 75 72 69 20 30 0a 7d 0a 0a 64 6f 5f 74 65 73 74  uri 0.}..do_test
133c0 20 33 38 2e 31 20 7b 0a 20 20 63 61 74 63 68 20   38.1 {.  catch 
133d0 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66  { db close }.  f
133e0 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
133f0 64 62 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65  db.  set fd [ope
13400 6e 20 74 65 73 74 2e 64 62 20 77 5d 0a 20 20 70  n test.db w].  p
13410 75 74 73 20 24 66 64 20 22 68 65 6c 6c 6f 20 77  uts $fd "hello w
13420 6f 72 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24 66  orld".  close $f
13430 64 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  d.  sqlite3 db t
13440 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
13450 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  l { CREATE TABLE
13460 20 74 31 28 78 29 20 7d 0a 7d 20 7b 31 20 7b 66   t1(x) }.} {1 {f
13470 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64  ile is encrypted
13480 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74   or is not a dat
13490 61 62 61 73 65 7d 7d 0a 64 6f 5f 74 65 73 74 20  abase}}.do_test 
134a0 33 38 2e 32 20 7b 0a 20 20 63 61 74 63 68 20 7b  38.2 {.  catch {
134b0 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 6f   db close }.  fo
134c0 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
134d0 62 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  b.} {}..do_test 
134e0 33 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  39.1 {.  sqlite3
134f0 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
13500 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
13510 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
13520 20 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   1;.    CREATE T
13530 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
13540 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
13550 41 4c 55 45 53 28 27 78 78 78 27 29 3b 0a 20 20  ALUES('xxx');.  
13560 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
13570 20 56 41 4c 55 45 53 28 27 74 77 6f 27 29 3b 0a   VALUES('two');.
13580 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13590 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
135a0 62 6c 6f 62 28 34 30 30 29 29 3b 0a 20 20 20 20  blob(400));.    
135b0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
135c0 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
135d0 28 34 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (400));.    INSE
135e0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
135f0 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30  S(randomblob(400
13600 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
13610 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
13620 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 29 3b 0a  ndomblob(400));.
13630 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 55      BEGIN;.    U
13640 50 44 41 54 45 20 74 31 20 53 45 54 20 78 20 3d  PDATE t1 SET x =
13650 20 27 6f 6e 65 27 20 57 48 45 52 45 20 72 6f 77   'one' WHERE row
13660 69 64 3d 31 3b 0a 20 20 7d 0a 20 20 73 65 74 20  id=1;.  }.  set 
13670 3a 3a 73 74 6d 74 20 5b 73 71 6c 69 74 65 33 5f  ::stmt [sqlite3_
13680 70 72 65 70 61 72 65 20 64 62 20 22 53 45 4c 45  prepare db "SELE
13690 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44  CT * FROM t1 ORD
136a0 45 52 20 42 59 20 72 6f 77 69 64 22 20 2d 31 20  ER BY rowid" -1 
136b0 64 75 6d 6d 79 5d 0a 20 20 73 71 6c 69 74 65 33  dummy].  sqlite3
136c0 5f 73 74 65 70 20 24 3a 3a 73 74 6d 74 0a 20 20  _step $::stmt.  
136d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
136e0 65 78 74 20 24 3a 3a 73 74 6d 74 20 30 0a 7d 20  ext $::stmt 0.} 
136f0 7b 6f 6e 65 7d 0a 64 6f 5f 74 65 73 74 20 33 39  {one}.do_test 39
13700 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
13710 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
13720 28 78 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  (x) }.  sqlite3_
13730 73 74 65 70 20 24 3a 3a 73 74 6d 74 0a 20 20 73  step $::stmt.  s
13740 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
13750 78 74 20 24 3a 3a 73 74 6d 74 20 30 0a 7d 20 7b  xt $::stmt 0.} {
13760 74 77 6f 7d 0a 64 6f 5f 74 65 73 74 20 33 39 2e  two}.do_test 39.
13770 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  3 {.  sqlite3_fi
13780 6e 61 6c 69 7a 65 20 24 3a 3a 73 74 6d 74 0a 20  nalize $::stmt. 
13790 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
137a0 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  } {}..do_execsql
137b0 5f 74 65 73 74 20 33 39 2e 34 20 7b 0a 20 20 50  _test 39.4 {.  P
137c0 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
137d0 6d 20 3d 20 32 3b 0a 20 20 43 52 45 41 54 45 20  m = 2;.  CREATE 
137e0 54 41 42 4c 45 20 74 33 28 78 29 3b 0a 20 20 43  TABLE t3(x);.  C
137f0 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 78  REATE TABLE t4(x
13800 29 3b 0a 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  );..  DROP TABLE
13810 20 74 32 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c   t2;.  DROP TABL
13820 45 20 74 33 3b 0a 20 20 44 52 4f 50 20 54 41 42  E t3;.  DROP TAB
13830 4c 45 20 74 34 3b 0a 7d 0a 64 6f 5f 74 65 73 74  LE t4;.}.do_test
13840 20 33 39 2e 35 20 7b 0a 20 20 64 62 20 63 6c 6f   39.5 {.  db clo
13850 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  se.  sqlite3 db 
13860 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
13870 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
13880 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 3b 0a 20  ache_size = 1;. 
13890 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65 6d     PRAGMA increm
138a0 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20 20  ental_vacuum;.  
138b0 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
138c0 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
138d0 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20 34 30  {ok}..do_test 40
138e0 2e 31 20 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a  .1 {.  reset_db.
138f0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
13900 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
13910 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52 45 41  um = 1;.    CREA
13920 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52  TE TABLE t1(x PR
13930 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
13940 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
13950 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
13960 28 31 32 30 30 29 29 3b 0a 20 20 20 20 50 52 41  (1200));.    PRA
13970 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 3b 0a  GMA page_count;.
13980 20 20 7d 0a 7d 20 7b 36 7d 0a 64 6f 5f 74 65 73    }.} {6}.do_tes
13990 74 20 34 30 2e 32 20 7b 0a 20 20 65 78 65 63 73  t 40.2 {.  execs
139a0 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
139b0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
139c0 61 6e 64 6f 6d 62 6c 6f 62 28 31 32 30 30 29 29  andomblob(1200))
139d0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
139e0 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
139f0 6f 6d 62 6c 6f 62 28 31 32 30 30 29 29 3b 0a 20  omblob(1200));. 
13a00 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13a10 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
13a20 6c 6f 62 28 31 32 30 30 29 29 3b 0a 20 20 7d 0a  lob(1200));.  }.
13a30 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 34 30 2e  } {}.do_test 40.
13a40 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  3 {.  db close. 
13a50 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
13a60 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
13a70 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
13a80 5f 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 43  _size = 1;.    C
13a90 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
13aa0 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  );.    PRAGMA in
13ab0 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
13ac0 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65   }.} {ok}..do_te
13ad0 73 74 20 34 31 2e 31 20 7b 0a 20 20 72 65 73 65  st 41.1 {.  rese
13ae0 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t_db.  execsql {
13af0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
13b00 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b  E t1(x PRIMARY K
13b10 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  EY);.    INSERT 
13b20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
13b30 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 29 3b  andomblob(200));
13b40 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
13b50 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
13b60 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20  mblob(200) FROM 
13b70 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
13b80 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
13b90 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
13ba0 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
13bb0 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
13bc0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
13bd0 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
13be0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
13bf0 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  ECT randomblob(2
13c00 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
13c10 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
13c20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
13c30 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(200) FROM t1;.
13c40 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13c50 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
13c60 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74  blob(200) FROM t
13c70 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  1;.  }.} {}.do_t
13c80 65 73 74 20 34 31 2e 32 20 7b 0a 20 20 74 65 73  est 41.2 {.  tes
13c90 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
13ca0 20 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69   1.  tv sectorsi
13cb0 7a 65 20 31 36 33 38 34 3b 0a 20 20 74 76 20 64  ze 16384;.  tv d
13cc0 65 76 63 68 61 72 20 5b 6c 69 73 74 5d 0a 20 20  evchar [list].  
13cd0 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  db close.  sqlit
13ce0 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
13cf0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
13d00 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
13d10 3d 20 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  = 1;.    DELETE 
13d20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f  FROM t1 WHERE ro
13d30 77 69 64 25 34 3b 0a 20 20 20 20 50 52 41 47 4d  wid%4;.    PRAGM
13d40 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
13d50 6b 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 7d 0a 64 62  k;.  }.} {ok}.db
13d60 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
13d70 0a 0a 73 65 74 20 70 65 6e 64 69 6e 67 5f 70 72  ..set pending_pr
13d80 65 76 20 5b 73 71 6c 69 74 65 33 5f 74 65 73 74  ev [sqlite3_test
13d90 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67  _control_pending
13da0 5f 62 79 74 65 20 30 78 31 30 30 30 30 30 30 5d  _byte 0x1000000]
13db0 0a 64 6f 5f 74 65 73 74 20 34 32 2e 31 20 7b 0a  .do_test 42.1 {.
13dc0 20 20 72 65 73 65 74 5f 64 62 0a 20 20 65 78 65    reset_db.  exe
13dd0 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
13de0 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29  E TABLE t1(x, y)
13df0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
13e00 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
13e10 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e  omblob(200), ran
13e20 64 6f 6d 62 6c 6f 62 28 32 30 30 29 29 3b 0a 20  domblob(200));. 
13e30 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13e40 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
13e50 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(200), random
13e60 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74  blob(200) FROM t
13e70 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
13e80 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
13e90 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61  domblob(200), ra
13ea0 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
13eb0 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
13ec0 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
13ed0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
13ee0 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
13ef0 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
13f00 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
13f10 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
13f20 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  200), randomblob
13f30 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (200) FROM t1;. 
13f40 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13f50 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
13f60 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(200), random
13f70 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74  blob(200) FROM t
13f80 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
13f90 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
13fa0 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61  domblob(200), ra
13fb0 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
13fc0 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
13fd0 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
13fe0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
13ff0 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
14000 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
14010 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
14020 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
14030 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  200), randomblob
14040 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (200) FROM t1;. 
14050 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
14060 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
14070 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(200), random
14080 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74  blob(200) FROM t
14090 31 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73  1;.  }.  db clos
140a0 65 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  e.  sqlite3_test
140b0 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67  _control_pending
140c0 5f 62 79 74 65 20 30 78 30 30 31 30 30 30 30 0a  _byte 0x0010000.
140d0 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
140e0 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c 20 7b  t.db.  db eval {
140f0 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a   PRAGMA mmap_siz
14100 65 20 3d 20 30 20 7d 0a 20 20 63 61 74 63 68 73  e = 0 }.  catchs
14110 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28  ql { SELECT sum(
14120 6c 65 6e 67 74 68 28 79 29 29 20 46 52 4f 4d 20  length(y)) FROM 
14130 74 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62  t1 }.} {1 {datab
14140 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
14150 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 6f  s malformed}}.do
14160 5f 74 65 73 74 20 34 32 2e 32 20 7b 0a 20 20 72  _test 42.2 {.  r
14170 65 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71  eset_db.  execsq
14180 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
14190 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20  ABLE t1(x, y);. 
141a0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
141b0 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
141c0 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(200), random
141d0 62 6c 6f 62 28 32 30 30 29 29 3b 0a 20 20 20 20  blob(200));.    
141e0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
141f0 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
14200 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  (200), randomblo
14210 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(200) FROM t1;.
14220 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14230 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
14240 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f  blob(200), rando
14250 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20  mblob(200) FROM 
14260 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
14270 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
14280 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72  ndomblob(200), r
14290 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46  andomblob(200) F
142a0 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
142b0 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
142c0 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  T randomblob(200
142d0 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  ), randomblob(20
142e0 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
142f0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
14300 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
14310 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  (200), randomblo
14320 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(200) FROM t1;.
14330 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14340 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
14350 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f  blob(200), rando
14360 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20  mblob(200) FROM 
14370 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
14380 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
14390 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72  ndomblob(200), r
143a0 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46  andomblob(200) F
143b0 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
143c0 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
143d0 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  T randomblob(200
143e0 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  ), randomblob(20
143f0 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  0) FROM t1;.  }.
14400 20 20 64 62 20 63 6c 6f 73 65 0a 0a 20 20 74 65    db close..  te
14410 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
14420 74 20 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73  t 1.  tv sectors
14430 69 7a 65 20 31 36 33 38 34 3b 0a 20 20 74 76 20  ize 16384;.  tv 
14440 64 65 76 63 68 61 72 20 5b 6c 69 73 74 5d 0a 20  devchar [list]. 
14450 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
14460 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20 65 78  .db -vfs tv.  ex
14470 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  ecsql { UPDATE t
14480 31 20 53 45 54 20 78 20 3d 20 72 61 6e 64 6f 6d  1 SET x = random
14490 62 6c 6f 62 28 32 30 30 29 20 7d 0a 7d 20 7b 7d  blob(200) }.} {}
144a0 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
144b0 65 74 65 0a 73 71 6c 69 74 65 33 5f 74 65 73 74  ete.sqlite3_test
144c0 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67  _control_pending
144d0 5f 62 79 74 65 20 24 70 65 6e 64 69 6e 67 5f 70  _byte $pending_p
144e0 72 65 76 0a 0a 64 6f 5f 74 65 73 74 20 34 33 2e  rev..do_test 43.
144f0 31 20 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 20  1 {.  reset_db. 
14500 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
14510 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
14520 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , y);.    INSERT
14530 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
14540 31 2c 20 32 29 3b 0a 20 20 20 20 43 52 45 41 54  1, 2);.    CREAT
14550 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20 79 29  E TABLE t2(x, y)
14560 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
14570 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32  O t2 VALUES(1, 2
14580 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
14590 42 4c 45 20 74 33 28 78 2c 20 79 29 3b 0a 20 20  BLE t3(x, y);.  
145a0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
145b0 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
145c0 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   }.  db close.  
145d0 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
145e0 64 62 0a 0a 20 20 64 62 20 65 76 61 6c 20 7b 20  db..  db eval { 
145f0 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65  PRAGMA mmap_size
14600 20 3d 20 30 20 7d 0a 20 20 64 62 20 65 76 61 6c   = 0 }.  db eval
14610 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
14620 20 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f   t1 }.  sqlite3_
14630 64 62 5f 73 74 61 74 75 73 20 64 62 20 43 41 43  db_status db CAC
14640 48 45 5f 4d 49 53 53 20 30 0a 7d 20 7b 30 20 32  HE_MISS 0.} {0 2
14650 20 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 34 33 2e   0}..do_test 43.
14660 32 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 20  2 {.  db eval { 
14670 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
14680 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f   }.  sqlite3_db_
14690 73 74 61 74 75 73 20 64 62 20 43 41 43 48 45 5f  status db CACHE_
146a0 4d 49 53 53 20 31 0a 7d 20 7b 30 20 33 20 30 7d  MISS 1.} {0 3 0}
146b0 0a 0a 64 6f 5f 74 65 73 74 20 34 33 2e 33 20 7b  ..do_test 43.3 {
146c0 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c  .  db eval { SEL
146d0 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 7d 0a  ECT * FROM t3 }.
146e0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
146f0 74 75 73 20 64 62 20 43 41 43 48 45 5f 4d 49 53  tus db CACHE_MIS
14700 53 20 30 0a 7d 20 7b 30 20 31 20 30 7d 0a 0a 66  S 0.} {0 1 0}..f
14710 69 6e 69 73 68 5f 74 65 73 74 0a 0a              inish_test..