/ Hex Artifact Content
Login

Artifact 622bfaea80604a96010f35256a4fc22fce584e95:


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 62 72 65 61 6b 70 6f 69 6e 74 0a 64 6f 5f 74  .breakpoint.do_t
10950 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 32 20  est pager1-25-2 
10960 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
10970 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
10980 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
10990 41 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20  AVEPOINT abc;.  
109a0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
109b0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 52   t1(a, b);.    R
109c0 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a  OLLBACK TO abc;.
109d0 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
109e0 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a    db close.} {}.
109f0 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 65  -----------.# Se
10a40 63 74 6f 72 2d 73 69 7a 65 20 74 65 73 74 73 2e  ctor-size tests.
10a50 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
10a60 31 2d 32 36 2e 31 20 7b 0a 20 20 74 65 73 74 76  1-26.1 {.  testv
10a70 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
10a80 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65  .  tv sectorsize
10a90 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69 6d   4096.  faultsim
10aa0 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
10ab0 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  en.  db func a_s
10ac0 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
10ad0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
10ae0 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
10af0 3d 20 35 31 32 3b 0a 20 20 20 20 43 52 45 41 54  = 512;.    CREAT
10b00 45 20 54 41 42 4c 45 20 74 62 6c 28 61 20 50 52  E TABLE tbl(a PR
10b10 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49  IMARY KEY, b UNI
10b20 51 55 45 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b  QUE);.    BEGIN;
10b30 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10b40 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 61 5f  TO tbl VALUES(a_
10b50 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
10b60 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20 20  ring(600));.    
10b70 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
10b80 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
10b90 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
10ba0 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
10bb0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10bc0 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
10bd0 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
10be0 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
10bf0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
10c00 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61  NTO tbl SELECT a
10c10 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
10c20 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
10c30 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  tbl;.      INSER
10c40 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
10c50 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
10c60 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
10c70 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
10c80 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
10c90 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
10ca0 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10cb0 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
10cc0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
10cd0 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10ce0 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
10cf0 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
10d00 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10d10 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72  tbl SELECT a_str
10d20 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
10d30 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b  g(600) FROM tbl;
10d40 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
10d50 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  .} {}.do_execsql
10d60 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 36 2e  _test pager1-26.
10d70 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74 62 6c  1 {.  UPDATE tbl
10d80 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
10d90 67 28 35 35 30 29 3b 0a 7d 20 7b 7d 0a 64 62 20  g(550);.} {}.db 
10da0 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
10db0 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f  -----------.#.do
10e00 5f 74 65 73 74 20 70 61 67 65 72 31 2e 32 37 2e  _test pager1.27.
10e10 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
10e20 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
10e30 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  .  sqlite3_pager
10e40 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20 20  _refcounts db.  
10e50 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
10e60 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54  GIN;.      CREAT
10e70 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
10e80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
10e90 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20  pager_refcounts 
10ea0 64 62 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d  db.  execsql COM
10eb0 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  MIT.} {}..#-----
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 2d 2d 2d 2d 2d 2d 2d  ----------------
10f00 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
10f10 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f   attempting to o
10f20 70 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  pen a write-tran
10f30 73 61 63 74 69 6f 6e 20 77 69 74 68 20 0a 23 20  saction with .# 
10f40 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
10f50 6c 75 73 69 76 65 20 69 6e 20 57 41 4c 20 6d 6f  lusive in WAL mo
10f60 64 65 20 66 61 69 6c 73 20 69 66 20 74 68 65 72  de fails if ther
10f70 65 20 61 72 65 20 6f 74 68 65 72 20 63 6c 69 65  e are other clie
10f80 6e 74 73 20 6f 6e 20 0a 23 20 74 68 65 20 73 61  nts on .# the sa
10f90 6d 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 63  me database..#.c
10fa0 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20  atch { db close 
10fb0 7d 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20  }.ifcapable wal 
10fc0 7b 0a 20 20 64 6f 5f 6d 75 6c 74 69 63 6c 69 65  {.  do_multiclie
10fd0 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 20  nt_test tn {.   
10fe0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10ff0 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20  28.$tn.1 {.     
11000 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 20   sql1 { .       
11010 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
11020 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
11030 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
11040 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
11050 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11060 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  1 VALUES('a', 'b
11070 27 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ');.      }.    
11080 7d 20 7b 77 61 6c 7d 0a 20 20 20 20 64 6f 5f 74  } {wal}.    do_t
11090 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
110a0 6e 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c  n.2 { sql2 { SEL
110b0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
110c0 7d 20 7b 61 20 62 7d 0a 0a 20 20 20 20 64 6f 5f  } {a b}..    do_
110d0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
110e0 74 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20 50 52  tn.3 { sql1 { PR
110f0 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
11100 65 3d 65 78 63 6c 75 73 69 76 65 20 7d 20 7d 20  e=exclusive } } 
11110 7b 65 78 63 6c 75 73 69 76 65 7d 0a 20 20 20 20  {exclusive}.    
11120 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11130 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20  8.$tn.4 { .     
11140 20 63 73 71 6c 31 20 7b 20 42 45 47 49 4e 3b 20   csql1 { BEGIN; 
11150 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
11160 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b  ALUES('c', 'd');
11170 20 7d 0a 20 20 20 20 7d 20 7b 31 20 7b 64 61 74   }.    } {1 {dat
11180 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
11190 7d 0a 20 20 20 20 63 6f 64 65 32 20 7b 20 64 62  }.    code2 { db
111a0 32 20 63 6c 6f 73 65 20 3b 20 73 71 6c 69 74 65  2 close ; sqlite
111b0 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 7d 0a  3 db2 test.db }.
111c0 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
111d0 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 0a 20  r1-28.$tn.4 { . 
111e0 20 20 20 20 20 73 71 6c 31 20 7b 20 49 4e 53 45       sql1 { INSE
111f0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
11200 53 28 27 63 27 2c 20 27 64 27 29 3b 20 43 4f 4d  S('c', 'd'); COM
11210 4d 49 54 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20  MIT }.    } {}. 
11220 20 7d 0a 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11270 0a 23 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65  .# Normally, whe
11280 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20  n changing from 
11290 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52  journal_mode=PER
112a0 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 74  SIST to DELETE t
112b0 68 65 20 70 61 67 65 72 0a 23 20 61 74 74 65 6d  he pager.# attem
112c0 70 74 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68  pts to delete th
112d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
112e0 48 6f 77 65 76 65 72 2c 20 69 66 20 69 74 20 63  However, if it c
112f0 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 20 61 0a 23  annot obtain a.#
11300 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
11310 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
11320 69 6c 65 2c 20 74 68 69 73 20 73 74 65 70 20 69  ile, this step i
11330 73 20 73 6b 69 70 70 65 64 2e 0a 23 0a 64 6f 5f  s skipped..#.do_
11340 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
11350 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20   tn {.  do_test 
11360 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20  pager1-28.$tn.1 
11370 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20  {.    sql1 { .  
11380 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
11390 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
113a0 54 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  T;.      CREATE 
113b0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
113c0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
113d0 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c  O t1 VALUES('a',
113e0 20 27 62 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   'b');.    }.  }
113f0 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f   {persist}.  do_
11400 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11410 74 6e 2e 32 20 7b 20 66 69 6c 65 20 65 78 69 73  tn.2 { file exis
11420 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
11430 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74  al } 1.  do_test
11440 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33   pager1-28.$tn.3
11450 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41   { sql1 { PRAGMA
11460 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
11470 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74  DELETE } } delet
11480 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  e.  do_test page
11490 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 66 69  r1-28.$tn.4 { fi
114a0 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
114b0 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20  b-journal } 0.. 
114c0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
114d0 32 38 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 73  28.$tn.5 {.    s
114e0 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41  ql1 { .      PRA
114f0 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
11500 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
11510 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11520 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27   VALUES('c', 'd'
11530 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65  );.    }.  } {pe
11540 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74  rsist}.  do_test
11550 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 36   pager1-28.$tn.6
11560 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
11570 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
11580 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   1.  do_test pag
11590 65 72 31 2d 32 38 2e 24 74 6e 2e 37 20 7b 0a 20  er1-28.$tn.7 {. 
115a0 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b     sql2 { BEGIN;
115b0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
115c0 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29  VALUES('e', 'f')
115d0 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ; }.  } {}.  do_
115e0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
115f0 74 6e 2e 38 20 20 7b 20 66 69 6c 65 20 65 78 69  tn.8  { file exi
11600 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
11610 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  nal } 1.  do_tes
11620 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11630 39 20 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47  9  { sql1 { PRAG
11640 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
11650 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c  = DELETE } } del
11660 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ete.  do_test pa
11670 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 30 20 7b  ger1-28.$tn.10 {
11680 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
11690 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
116a0 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
116b0 72 31 2d 32 38 2e 24 74 6e 2e 31 31 20 7b 20 73  r1-28.$tn.11 { s
116c0 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a  ql2 COMMIT } {}.
116d0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
116e0 2d 32 38 2e 24 74 6e 2e 31 32 20 7b 20 66 69 6c  -28.$tn.12 { fil
116f0 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
11700 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20  -journal } 0..  
11710 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11720 38 2d 24 74 6e 2e 31 33 20 7b 0a 20 20 20 20 63  8-$tn.13 {.    c
11730 6f 64 65 31 20 7b 20 73 65 74 20 63 68 61 6e 6e  ode1 { set chann
11740 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20  el [db incrblob 
11750 2d 72 65 61 64 6f 6e 6c 79 20 74 31 20 61 20 32  -readonly t1 a 2
11760 5d 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20  ] }.    sql1 {. 
11770 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
11780 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
11790 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ST;.      INSERT
117a0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
117b0 27 67 27 2c 20 27 68 27 29 3b 0a 20 20 20 20 7d  'g', 'h');.    }
117c0 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20  .  } {persist}. 
117d0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
117e0 32 38 2e 24 74 6e 2e 31 34 20 7b 20 66 69 6c 65  28.$tn.14 { file
117f0 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
11800 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f  journal } 1.  do
11810 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11820 24 74 6e 2e 31 35 20 7b 0a 20 20 20 20 73 71 6c  $tn.15 {.    sql
11830 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52  2 { BEGIN; INSER
11840 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
11850 28 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20  ('e', 'f'); }.  
11860 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
11870 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 36 20  ager1-28.$tn.16 
11880 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20  { sql1 { PRAGMA 
11890 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
118a0 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65  ELETE } } delete
118b0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
118c0 31 2d 32 38 2e 24 74 6e 2e 31 37 20 7b 20 66 69  1-28.$tn.17 { fi
118d0 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
118e0 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20  b-journal } 1.. 
118f0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11900 32 38 2e 24 74 6e 2e 31 37 20 7b 20 63 73 71 6c  28.$tn.17 { csql
11910 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b  2 { COMMIT } } {
11920 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
11930 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ocked}}.  do_tes
11940 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e  t pager1-28-$tn.
11950 31 38 20 7b 20 63 6f 64 65 31 20 7b 20 72 65 61  18 { code1 { rea
11960 64 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 63  d $channel } } c
11970 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11980 31 2d 32 38 2d 24 74 6e 2e 31 39 20 7b 20 63 6f  1-28-$tn.19 { co
11990 64 65 31 20 7b 20 63 6c 6f 73 65 20 24 63 68 61  de1 { close $cha
119a0 6e 6e 65 6c 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f  nnel } } {}.  do
119b0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
119c0 24 74 6e 2e 32 30 20 7b 20 73 71 6c 32 20 7b 20  $tn.20 { sql2 { 
119d0 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 7d 0a  COMMIT } } {}.}.
119e0 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
119f0 32 39 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  29.1 {.  faultsi
11a00 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
11a10 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
11a20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
11a30 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
11a40 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
11a50 75 75 6d 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20  uum = full;.    
11a60 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
11a70 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 3b 0a 20  ode=exclusive;. 
11a80 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
11a90 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
11aa0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11ab0 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
11ac0 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
11ad0 64 62 0a 7d 20 5b 65 78 70 72 20 31 30 32 34 2a  db.} [expr 1024*
11ae0 33 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  3].do_test pager
11af0 31 2d 32 39 2e 32 20 7b 0a 20 20 65 78 65 63 73  1-29.2 {.  execs
11b00 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
11b10 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36  page_size = 4096
11b20 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20 20  ;.    VACUUM;.  
11b30 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
11b40 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 34 30  st.db.} [expr 40
11b50 39 36 2a 33 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  96*3]..#--------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ba0 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 66  -.# Test that if
11bb0 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62 61   an empty databa
11bc0 73 65 20 66 69 6c 65 20 28 73 69 7a 65 20 30 20  se file (size 0 
11bd0 62 79 74 65 73 29 20 69 73 20 6f 70 65 6e 65 64  bytes) is opened
11be0 20 69 6e 20 0a 23 20 65 78 63 6c 75 73 69 76 65   in .# exclusive
11bf0 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61  -locking mode, a
11c00 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ny journal file 
11c10 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  is deleted from 
11c20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a  the file-system.
11c30 23 20 77 69 74 68 6f 75 74 20 62 65 69 6e 67 20  # without being 
11c40 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 41 6e 64  rolled back. And
11c50 20 74 68 61 74 20 74 68 65 20 52 45 53 45 52 56   that the RESERV
11c60 45 44 20 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64  ED lock obtained
11c70 20 77 68 69 6c 65 0a 23 20 64 6f 69 6e 67 20 74   while.# doing t
11c80 68 69 73 20 69 73 20 6e 6f 74 20 72 65 6c 65 61  his is not relea
11c90 73 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  sed..#.do_test p
11ca0 61 67 65 72 31 2d 33 30 2e 31 20 7b 0a 20 20 64  ager1-30.1 {.  d
11cb0 62 20 63 6c 6f 73 65 0a 20 20 64 65 6c 65 74 65  b close.  delete
11cc0 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 0a 20 20  _file test.db.  
11cd0 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73 74  delete_file test
11ce0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 65  .db-journal.  se
11cf0 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e  t fd [open test.
11d00 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20 20  db-journal w].  
11d10 73 65 65 6b 20 24 66 64 20 5b 65 78 70 72 20 35  seek $fd [expr 5
11d20 31 32 2b 31 30 33 32 2a 32 5d 0a 20 20 70 75 74  12+1032*2].  put
11d30 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64  s -nonewline $fd
11d40 20 78 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 0a   x.  close $fd..
11d50 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
11d60 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
11d70 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
11d80 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
11d90 56 45 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  VE;.    SELECT c
11da0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c  ount(*) FROM sql
11db0 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20  ite_master;.    
11dc0 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74  PRAGMA lock_stat
11dd0 75 73 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75  us;.  }.} {exclu
11de0 73 69 76 65 20 30 20 6d 61 69 6e 20 72 65 73 65  sive 0 main rese
11df0 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64  rved temp closed
11e00 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
11e50 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68 65  Test that if the
11e60 20 22 70 61 67 65 2d 73 69 7a 65 22 20 66 69 65   "page-size" fie
11e70 6c 64 20 69 6e 20 61 20 6a 6f 75 72 6e 61 6c 2d  ld in a journal-
11e80 68 65 61 64 65 72 20 69 73 20 30 2c 20 74 68 65  header is 0, the
11e90 20 6a 6f 75 72 6e 61 6c 0a 23 20 66 69 6c 65 20   journal.# file 
11ea0 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 72 6f 6c  can still be rol
11eb0 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
11ec0 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 62  s required for b
11ed0 61 63 6b 77 61 72 64 20 63 6f 6d 70 61 74 69 62  ackward compatib
11ee0 69 6c 69 74 79 20 2d 0a 23 20 76 65 72 73 69 6f  ility -.# versio
11ef0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
11f00 6f 72 20 74 6f 20 33 2e 35 2e 38 20 61 6c 77 61  or to 3.5.8 alwa
11f10 79 73 20 73 65 74 20 74 68 69 73 20 66 69 65 6c  ys set this fiel
11f20 64 20 74 6f 20 7a 65 72 6f 2e 0a 23 0a 69 66 20  d to zero..#.if 
11f30 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70  {$tcl_platform(p
11f40 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22  latform)=="unix"
11f50 7d 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  } {.do_test page
11f60 72 31 2d 33 31 2e 31 20 7b 0a 20 20 66 61 75 6c  r1-31.1 {.  faul
11f70 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
11f80 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
11f90 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
11fa0 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
11fb0 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
11fc0 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
11fd0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
11fe0 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
11ff0 79 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  y));.    INSERT 
12000 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
12010 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
12020 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
12030 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
12040 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
12050 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
12060 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12070 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
12080 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
12090 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
120a0 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
120b0 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
120c0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
120d0 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
120e0 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
120f0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
12100 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
12110 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
12120 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12130 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
12140 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
12150 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12160 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
12170 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
12180 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
12190 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
121a0 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
121b0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
121c0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
121d0 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
121e0 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
121f0 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
12200 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
12210 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
12220 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12230 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
12240 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
12250 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
12260 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
12270 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
12280 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
12290 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
122a0 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
122b0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
122c0 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
122d0 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
122e0 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
122f0 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
12300 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79   UPDATE t1 SET y
12310 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 34   = randomblob(14
12320 39 39 29 3b 0a 20 20 7d 0a 20 20 63 6f 70 79 5f  99);.  }.  copy_
12330 66 69 6c 65 20 74 65 73 74 2e 64 62 20 74 65 73  file test.db tes
12340 74 2e 64 62 32 0a 20 20 63 6f 70 79 5f 66 69 6c  t.db2.  copy_fil
12350 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
12360 6c 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e  l test.db2-journ
12370 61 6c 0a 20 20 0a 20 20 68 65 78 69 6f 5f 77 72  al.  .  hexio_wr
12380 69 74 65 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75  ite test.db2-jou
12390 72 6e 61 6c 20 32 34 20 30 30 30 30 30 30 30 30  rnal 24 00000000
123a0 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
123b0 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71  est.db2.  execsq
123c0 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  l { PRAGMA integ
123d0 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32  rity_check } db2
123e0 0a 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .} {ok}.}..#----
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 2d 2d 2d 2d 2d 2d  ----------------
12430 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
12440 74 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  t a database fil
12450 65 20 63 61 6e 20 62 65 20 22 70 72 65 2d 68 69  e can be "pre-hi
12460 6e 74 65 64 22 20 74 6f 20 61 20 63 65 72 74 61  nted" to a certa
12470 69 6e 20 73 69 7a 65 20 61 6e 64 20 74 68 61 74  in size and that
12480 0a 23 20 73 75 62 73 65 71 75 65 6e 74 20 73 70  .# subsequent sp
12490 69 6c 6c 69 6e 67 20 6f 66 20 74 68 65 20 70 61  illing of the pa
124a0 67 65 72 20 63 61 63 68 65 20 64 6f 65 73 20 6e  ger cache does n
124b0 6f 74 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  ot result in the
124c0 20 64 61 74 61 62 61 73 65 0a 23 20 66 69 6c 65   database.# file
124d0 20 62 65 69 6e 67 20 73 68 72 75 6e 6b 2e 0a 23   being shrunk..#
124e0 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65  .catch {db close
124f0 7d 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65  }.forcedelete te
12500 73 74 2e 64 62 0a 0a 64 6f 5f 74 65 73 74 20 70  st.db..do_test p
12510 61 67 65 72 31 2d 33 32 2e 31 20 7b 0a 20 20 73  ager1-32.1 {.  s
12520 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
12530 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
12540 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
12550 31 28 78 2c 20 79 29 3b 0a 20 20 7d 0a 20 20 64  1(x, y);.  }.  d
12560 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65  b close.  sqlite
12570 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
12580 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
12590 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
125a0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
125b0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
125c0 30 29 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 5f  0));.  }.  file_
125d0 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a  control_chunksiz
125e0 65 5f 74 65 73 74 20 64 62 20 6d 61 69 6e 20 31  e_test db main 1
125f0 30 32 34 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72  024.  file_contr
12600 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74  ol_sizehint_test
12610 20 64 62 20 6d 61 69 6e 20 32 30 39 37 31 35 32   db main 2097152
12620 30 3b 20 23 20 32 30 4d 42 0a 20 20 65 78 65 63  0; # 20MB.  exec
12630 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
12640 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
12650 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12660 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72  O t1 VALUES(1, r
12670 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29  andomblob(10000)
12680 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
12690 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
126a0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30  randomblob(10000
126b0 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
126c0 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b  NTO t1 SELECT x+
126d0 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  2, randomblob(10
126e0 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20  000) from t1;.  
126f0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12700 20 53 45 4c 45 43 54 20 78 2b 34 2c 20 72 61 6e   SELECT x+4, ran
12710 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66  domblob(10000) f
12720 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  rom t1;.    INSE
12730 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
12740 54 20 78 2b 38 2c 20 72 61 6e 64 6f 6d 62 6c 6f  T x+8, randomblo
12750 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31  b(10000) from t1
12760 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12770 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 31 36  O t1 SELECT x+16
12780 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
12790 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20  00) from t1;.   
127a0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
127b0 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f   FROM t1;.    CO
127c0 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63  MMIT;.  }.  db c
127d0 6c 6f 73 65 0a 20 20 66 69 6c 65 20 73 69 7a 65  lose.  file size
127e0 20 74 65 73 74 2e 64 62 0a 7d 20 7b 32 30 39 37   test.db.} {2097
127f0 31 35 32 30 7d 0a 0a 23 20 43 6c 65 61 6e 75 70  1520}..# Cleanup
12800 20 32 30 4d 42 20 66 69 6c 65 20 6c 65 66 74 20   20MB file left 
12810 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
12820 74 65 73 74 2e 0a 66 6f 72 63 65 64 65 6c 65 74  test..forcedelet
12830 65 20 74 65 73 74 2e 64 62 0a 0a 23 2d 2d 2d 2d  e test.db..#----
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 2d 2d 2d 2d 2d 2d  ----------------
12880 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
12890 74 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  t if a transacti
128a0 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
128b0 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  in journal_mode=
128c0 44 45 4c 45 54 45 20 6d 6f 64 65 2c 0a 23 20 61  DELETE mode,.# a
128d0 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  nd the call to u
128e0 6e 6c 69 6e 6b 28 29 20 72 65 74 75 72 6e 73 20  nlink() returns 
128f0 61 6e 20 45 4e 4f 45 4e 54 20 65 72 72 6f 72 2c  an ENOENT error,
12900 20 74 68 65 20 43 4f 4d 4d 49 54 20 64 6f 65 73   the COMMIT does
12910 20 6e 6f 74 0a 23 20 73 75 63 63 65 65 64 2e 0a   not.# succeed..
12920 23 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61  #.if {$::tcl_pla
12930 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d  tform(platform)=
12940 3d 22 75 6e 69 78 22 7d 20 7b 0a 20 20 64 6f 5f  ="unix"} {.  do_
12950 74 65 73 74 20 70 61 67 65 72 31 2d 33 33 2e 31  test pager1-33.1
12960 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
12970 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  b test.db.    ex
12980 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
12990 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
129a0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
129b0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 6f  NTO t1 VALUES('o
129c0 6e 65 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ne');.      INSE
129d0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
129e0 53 28 27 74 77 6f 27 29 3b 0a 20 20 20 20 20 20  S('two');.      
129f0 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49  BEGIN;.        I
12a00 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
12a10 4c 55 45 53 28 27 74 68 72 65 65 27 29 3b 0a 20  LUES('three');. 
12a20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
12a30 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 66 6f  TO t1 VALUES('fo
12a40 75 72 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ur');.    }.    
12a50 66 6f 72 63 65 64 65 6c 65 74 65 20 62 61 6b 2d  forcedelete bak-
12a60 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 66 69 6c 65  journal.    file
12a70 20 72 65 6e 61 6d 65 20 74 65 73 74 2e 64 62 2d   rename test.db-
12a80 6a 6f 75 72 6e 61 6c 20 62 61 6b 2d 6a 6f 75 72  journal bak-jour
12a90 6e 61 6c 0a 0a 20 20 20 20 63 61 74 63 68 73 71  nal..    catchsq
12aa0 6c 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 31 20  l COMMIT.  } {1 
12ab0 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d  {disk I/O error}
12ac0 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
12ad0 65 72 31 2d 33 33 2e 32 20 7b 0a 20 20 20 20 66  er1-33.2 {.    f
12ae0 69 6c 65 20 72 65 6e 61 6d 65 20 62 61 6b 2d 6a  ile rename bak-j
12af0 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 2d 6a  ournal test.db-j
12b00 6f 75 72 6e 61 6c 0a 20 20 20 20 65 78 65 63 73  ournal.    execs
12b10 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
12b20 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 6f 6e 65  OM t1 }.  } {one
12b30 20 74 77 6f 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   two}.}..#------
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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b80 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
12b90 61 70 70 65 6e 64 69 6e 67 20 70 61 67 65 73 20  appending pages 
12ba0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
12bb0 66 69 6c 65 20 74 68 65 6e 20 6d 6f 76 69 6e 67  file then moving
12bc0 20 74 68 6f 73 65 20 70 61 67 65 73 0a 23 20 74   those pages.# t
12bd0 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
12be0 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
12bf0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
12c00 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  ted does not cau
12c10 73 65 0a 23 20 61 6e 20 65 72 72 6f 72 2e 0a 23  se.# an error..#
12c20 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 70 72 61  .foreach {tn pra
12c30 67 6d 61 20 73 74 72 73 69 7a 65 7d 20 7b 0a 20  gma strsize} {. 
12c40 20 31 20 7b 20 50 52 41 47 4d 41 20 6d 6d 61 70   1 { PRAGMA mmap
12c50 5f 6c 69 6d 69 74 20 3d 20 30 20 7d 20 32 34 30  _limit = 0 } 240
12c60 30 0a 20 20 32 20 7b 20 7d 20 20 20 20 20 20 20  0.  2 { }       
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c80 32 34 30 30 0a 20 20 33 20 7b 20 50 52 41 47 4d  2400.  3 { PRAGM
12c90 41 20 6d 6d 61 70 5f 6c 69 6d 69 74 20 3d 20 30  A mmap_limit = 0
12ca0 20 7d 20 34 34 30 30 0a 20 20 34 20 7b 20 7d 20   } 4400.  4 { } 
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 20 20 20 20 34 34 30 30 0a 7d 20 7b 0a 20        4400.} {. 
12cd0 20 72 65 73 65 74 5f 64 62 0a 20 20 64 62 20 66   reset_db.  db f
12ce0 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
12cf0 74 72 69 6e 67 0a 20 20 64 62 20 65 76 61 6c 20  tring.  db eval 
12d00 24 70 72 61 67 6d 61 0a 20 20 64 6f 5f 65 78 65  $pragma.  do_exe
12d10 63 73 71 6c 5f 74 65 73 74 20 33 34 2e 24 74 6e  csql_test 34.$tn
12d20 2e 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  .1 {.    CREATE 
12d30 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
12d40 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12d50 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
12d60 0a 20 20 7d 0a 20 20 62 72 65 61 6b 70 6f 69 6e  .  }.  breakpoin
12d70 74 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  t.  do_execsql_t
12d80 65 73 74 20 33 34 2e 24 74 6e 2e 32 20 7b 0a 20  est 34.$tn.2 {. 
12d90 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e     BEGIN;.    IN
12da0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
12db0 55 45 53 28 32 2c 20 61 5f 73 74 72 69 6e 67 28  UES(2, a_string(
12dc0 24 73 74 72 73 69 7a 65 29 29 3b 0a 20 20 20 20  $strsize));.    
12dd0 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
12de0 48 45 52 45 20 6f 69 64 3d 32 3b 0a 20 20 20 20  HERE oid=2;.    
12df0 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47  COMMIT;.    PRAG
12e00 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
12e10 63 6b 3b 0a 20 20 7d 20 7b 6f 6b 7d 0a 7d 0a 0a  ck;.  } {ok}.}..
12e20 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73  ----------.#.res
12e70 65 74 5f 64 62 0a 64 6f 5f 74 65 73 74 20 33 35  et_db.do_test 35
12e80 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
12e90 74 65 73 74 2e 64 62 0a 0a 20 20 65 78 65 63 73  test.db..  execs
12ea0 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
12eb0 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a  TABLE t1(x, y);.
12ec0 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
12ed0 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
12ee0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
12ef0 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
12f00 20 20 7d 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b    }..  execsql {
12f10 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
12f20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
12f30 32 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 0a 20 20  2(a, b);.  }..  
12f40 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
12f50 2e 64 62 2d 73 68 6d 20 5b 65 78 70 72 20 31 36  .db-shm [expr 16
12f60 2a 31 30 32 34 5d 20 5b 73 74 72 69 6e 67 20 72  *1024] [string r
12f70 65 70 65 61 74 20 30 30 35 35 20 38 31 39 32 5d  epeat 0055 8192]
12f80 0a 20 20 63 61 74 63 68 73 71 6c 20 52 4f 4c 4c  .  catchsql ROLL
12f90 42 41 43 4b 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64  BACK.} {0 {}}..d
12fa0 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65  o_multiclient_te
12fb0 73 74 20 74 6e 20 7b 0a 20 20 73 71 6c 31 20 7b  st tn {.  sql1 {
12fc0 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
12fd0 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20  _vacuum = 0;.   
12fe0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
12ff0 28 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45  (x, y);.    INSE
13000 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
13010 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 0a 20 20  S(1, 2);.  }..  
13020 64 6f 5f 74 65 73 74 20 33 36 2e 24 74 6e 2e 31  do_test 36.$tn.1
13030 20 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 50   { .    sql2 { P
13040 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63  RAGMA max_page_c
13050 6f 75 6e 74 20 3d 20 32 20 7d 0a 20 20 20 20 6c  ount = 2 }.    l
13060 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c  ist [catch { sql
13070 32 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  2 { CREATE TABLE
13080 20 74 32 28 78 29 20 7d 20 7d 20 6d 73 67 5d 20   t2(x) } } msg] 
13090 24 6d 73 67 0a 20 20 7d 20 7b 31 20 7b 64 61 74  $msg.  } {1 {dat
130a0 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
130b0 20 66 75 6c 6c 7d 7d 0a 0a 20 20 73 71 6c 31 20   full}}..  sql1 
130c0 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f  { PRAGMA checkpo
130d0 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 3d 20  int_fullfsync = 
130e0 31 20 7d 0a 20 20 73 71 6c 31 20 7b 20 43 52 45  1 }.  sql1 { CRE
130f0 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 20  ATE TABLE t2(x) 
13100 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 33 36 2e  }..  do_test 36.
13110 24 74 6e 2e 32 20 7b 20 0a 20 20 20 20 73 71 6c  $tn.2 { .    sql
13120 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  2 { INSERT INTO 
13130 74 32 20 56 41 4c 55 45 53 28 27 78 79 7a 27 29  t2 VALUES('xyz')
13140 20 7d 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74   }.    list [cat
13150 63 68 20 7b 20 73 71 6c 32 20 7b 20 43 52 45 41  ch { sql2 { CREA
13160 54 45 20 54 41 42 4c 45 20 74 33 28 78 29 20 7d  TE TABLE t3(x) }
13170 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d   } msg] $msg.  }
13180 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 6f 72   {1 {database or
13190 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a   disk is full}}.
131a0 7d 0a 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  }..forcedelete t
131b0 65 73 74 31 20 74 65 73 74 32 0a 66 6f 72 65 61  est1 test2.forea
131c0 63 68 20 7b 74 6e 20 75 72 69 7d 20 7b 0a 20 20  ch {tn uri} {.  
131d0 31 20 20 20 7b 66 69 6c 65 3a 3f 6d 6f 64 65 3d  1   {file:?mode=
131e0 6d 65 6d 6f 72 79 26 63 61 63 68 65 3d 73 68 61  memory&cache=sha
131f0 72 65 64 7d 0a 20 20 32 20 20 20 7b 66 69 6c 65  red}.  2   {file
13200 3a 6f 6e 65 3f 6d 6f 64 65 3d 6d 65 6d 6f 72 79  :one?mode=memory
13210 26 63 61 63 68 65 3d 73 68 61 72 65 64 7d 0a 20  &cache=shared}. 
13220 20 33 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 31   3   {file:test1
13230 3f 63 61 63 68 65 3d 73 68 61 72 65 64 7d 0a 20  ?cache=shared}. 
13240 20 34 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 32   4   {file:test2
13250 3f 61 6e 6f 74 68 65 72 3d 70 61 72 61 6d 65 74  ?another=paramet
13260 65 72 26 79 65 74 3d 61 6e 6f 74 68 65 72 6f 6e  er&yet=anotheron
13270 65 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  e}.} {.  do_test
13280 20 33 37 2e 24 74 6e 20 7b 0a 20 20 20 20 63 61   37.$tn {.    ca
13290 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
132a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68 75  .    sqlite3_shu
132b0 74 64 6f 77 6e 0a 20 20 20 20 20 20 73 71 6c 69  tdown.      sqli
132c0 74 65 33 5f 63 6f 6e 66 69 67 5f 75 72 69 20 31  te3_config_uri 1
132d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64  .      sqlite3 d
132e0 62 20 24 75 72 69 0a 20 20 20 20 64 62 20 65 76  b $uri.    db ev
132f0 61 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  al {.      CREAT
13300 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
13310 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
13320 20 74 31 20 56 41 4c 55 45 53 28 31 29 3b 0a 20   t1 VALUES(1);. 
13330 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
13340 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t1;.    }.  }
13350 20 7b 31 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a   {1}.  db close.
13360 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f    sqlite3_shutdo
13370 77 6e 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  wn.  sqlite3_con
13380 66 69 67 5f 75 72 69 20 30 0a 7d 0a 0a 64 6f 5f  fig_uri 0.}..do_
13390 74 65 73 74 20 33 38 2e 31 20 7b 0a 20 20 63 61  test 38.1 {.  ca
133a0 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
133b0 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
133c0 65 73 74 2e 64 62 0a 20 20 73 65 74 20 66 64 20  est.db.  set fd 
133d0 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 20 77 5d  [open test.db w]
133e0 0a 20 20 70 75 74 73 20 24 66 64 20 22 68 65 6c  .  puts $fd "hel
133f0 6c 6f 20 77 6f 72 6c 64 22 0a 20 20 63 6c 6f 73  lo world".  clos
13400 65 20 24 66 64 0a 20 20 73 71 6c 69 74 65 33 20  e $fd.  sqlite3 
13410 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  db test.db.  cat
13420 63 68 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  chsql { CREATE T
13430 41 42 4c 45 20 74 31 28 78 29 20 7d 0a 7d 20 7b  ABLE t1(x) }.} {
13440 31 20 7b 66 69 6c 65 20 69 73 20 65 6e 63 72 79  1 {file is encry
13450 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61  pted or is not a
13460 20 64 61 74 61 62 61 73 65 7d 7d 0a 64 6f 5f 74   database}}.do_t
13470 65 73 74 20 33 38 2e 32 20 7b 0a 20 20 63 61 74  est 38.2 {.  cat
13480 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
13490 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
134a0 73 74 2e 64 62 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  st.db.} {}..do_t
134b0 65 73 74 20 33 39 2e 31 20 7b 0a 20 20 73 71 6c  est 39.1 {.  sql
134c0 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
134d0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
134e0 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
134f0 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52 45 41  um = 1;.    CREA
13500 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
13510 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13520 74 31 20 56 41 4c 55 45 53 28 27 78 78 78 27 29  t1 VALUES('xxx')
13530 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
13540 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74 77 6f  O t1 VALUES('two
13550 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
13560 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
13570 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 29 3b 0a  ndomblob(400));.
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 42 45 47 49 4e 3b 0a 20  ));.    BEGIN;. 
13610 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
13620 20 78 20 3d 20 27 6f 6e 65 27 20 57 48 45 52 45   x = 'one' WHERE
13630 20 72 6f 77 69 64 3d 31 3b 0a 20 20 7d 0a 20 20   rowid=1;.  }.  
13640 73 65 74 20 3a 3a 73 74 6d 74 20 5b 73 71 6c 69  set ::stmt [sqli
13650 74 65 33 5f 70 72 65 70 61 72 65 20 64 62 20 22  te3_prepare db "
13660 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
13670 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22   ORDER BY rowid"
13680 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 73 71 6c   -1 dummy].  sql
13690 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 73 74 6d  ite3_step $::stm
136a0 74 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t.  sqlite3_colu
136b0 6d 6e 5f 74 65 78 74 20 24 3a 3a 73 74 6d 74 20  mn_text $::stmt 
136c0 30 0a 7d 20 7b 6f 6e 65 7d 0a 64 6f 5f 74 65 73  0.} {one}.do_tes
136d0 74 20 33 39 2e 32 20 7b 0a 20 20 65 78 65 63 73  t 39.2 {.  execs
136e0 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c  ql { CREATE TABL
136f0 45 20 74 32 28 78 29 20 7d 0a 20 20 73 71 6c 69  E t2(x) }.  sqli
13700 74 65 33 5f 73 74 65 70 20 24 3a 3a 73 74 6d 74  te3_step $::stmt
13710 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .  sqlite3_colum
13720 6e 5f 74 65 78 74 20 24 3a 3a 73 74 6d 74 20 30  n_text $::stmt 0
13730 0a 7d 20 7b 74 77 6f 7d 0a 64 6f 5f 74 65 73 74  .} {two}.do_test
13740 20 33 39 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65   39.3 {.  sqlite
13750 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 73 74  3_finalize $::st
13760 6d 74 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d  mt.  execsql COM
13770 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65  MIT.} {}..do_exe
13780 63 73 71 6c 5f 74 65 73 74 20 33 39 2e 34 20 7b  csql_test 39.4 {
13790 0a 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76  .  PRAGMA auto_v
137a0 61 63 75 75 6d 20 3d 20 32 3b 0a 20 20 43 52 45  acuum = 2;.  CRE
137b0 41 54 45 20 54 41 42 4c 45 20 74 33 28 78 29 3b  ATE TABLE t3(x);
137c0 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
137d0 74 34 28 78 29 3b 0a 0a 20 20 44 52 4f 50 20 54  t4(x);..  DROP T
137e0 41 42 4c 45 20 74 32 3b 0a 20 20 44 52 4f 50 20  ABLE t2;.  DROP 
137f0 54 41 42 4c 45 20 74 33 3b 0a 20 20 44 52 4f 50  TABLE t3;.  DROP
13800 20 54 41 42 4c 45 20 74 34 3b 0a 7d 0a 64 6f 5f   TABLE t4;.}.do_
13810 74 65 73 74 20 33 39 2e 35 20 7b 0a 20 20 64 62  test 39.5 {.  db
13820 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
13830 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
13840 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
13850 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
13860 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  1;.    PRAGMA in
13870 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
13880 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  ;.    PRAGMA int
13890 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
138a0 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73  }.} {ok}..do_tes
138b0 74 20 34 30 2e 31 20 7b 0a 20 20 72 65 73 65 74  t 40.1 {.  reset
138c0 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  _db.  execsql {.
138d0 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
138e0 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20  vacuum = 1;.    
138f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
13900 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
13910 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13920 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
13930 62 6c 6f 62 28 31 32 30 30 29 29 3b 0a 20 20 20  blob(1200));.   
13940 20 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75   PRAGMA page_cou
13950 6e 74 3b 0a 20 20 7d 0a 7d 20 7b 36 7d 0a 64 6f  nt;.  }.} {6}.do
13960 5f 74 65 73 74 20 34 30 2e 32 20 7b 0a 20 20 65  _test 40.2 {.  e
13970 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
13980 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
13990 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 32  ES(randomblob(12
139a0 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
139b0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
139c0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 32 30 30 29  randomblob(1200)
139d0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
139e0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
139f0 64 6f 6d 62 6c 6f 62 28 31 32 30 30 29 29 3b 0a  domblob(1200));.
13a00 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
13a10 20 34 30 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f   40.3 {.  db clo
13a20 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  se.  sqlite3 db 
13a30 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
13a40 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
13a50 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 3b 0a 20  ache_size = 1;. 
13a60 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
13a70 74 32 28 78 29 3b 0a 20 20 20 20 50 52 41 47 4d  t2(x);.    PRAGM
13a80 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
13a90 6b 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 64  k;.  }.} {ok}..d
13aa0 6f 5f 74 65 73 74 20 34 31 2e 31 20 7b 0a 20 20  o_test 41.1 {.  
13ab0 72 65 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73  reset_db.  execs
13ac0 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
13ad0 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41  TABLE t1(x PRIMA
13ae0 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53  RY KEY);.    INS
13af0 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
13b00 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  ES(randomblob(20
13b10 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
13b20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
13b30 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46  andomblob(200) F
13b40 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
13b50 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
13b60 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  T randomblob(200
13b70 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
13b80 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
13b90 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
13ba0 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
13bb0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
13bc0 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
13bd0 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(200) FROM t1;
13be0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
13bf0 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
13c00 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20  mblob(200) FROM 
13c10 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
13c20 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
13c30 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
13c40 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM t1;.  }.} {}.
13c50 64 6f 5f 74 65 73 74 20 34 31 2e 32 20 7b 0a 20  do_test 41.2 {. 
13c60 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
13c70 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74  ault 1.  tv sect
13c80 6f 72 73 69 7a 65 20 31 36 33 38 34 3b 0a 20 20  orsize 16384;.  
13c90 74 76 20 64 65 76 63 68 61 72 20 5b 6c 69 73 74  tv devchar [list
13ca0 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  ].  db close.  s
13cb0 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
13cc0 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
13cd0 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
13ce0 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 44 45 4c  ize = 1;.    DEL
13cf0 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
13d00 45 20 72 6f 77 69 64 25 34 3b 0a 20 20 20 20 50  E rowid%4;.    P
13d10 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
13d20 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b  check;.  }.} {ok
13d30 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  }...finish_test.