/ Hex Artifact Content
Login

Artifact 1acbdb14c5952a72dd43129cabdbf69aaa3ed1fa:


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 43 48 45 43 4b 20   t1.} {1 {CHECK 
2460: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
2470: 64 3a 20 63 6f 75 6e 74 65 72 7d 7d 0a 64 6f 5f  d: counter}}.do_
2480: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
2490: 65 72 31 2d 33 2e 34 20 7b 20 53 45 4c 45 43 54  er1-3.4 { SELECT
24a0: 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74 65 72 20   * FROM counter 
24b0: 7d 20 7b 33 20 30 7d 0a 64 6f 5f 65 78 65 63 73  } {3 0}.do_execs
24c0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
24d0: 2e 35 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52  .5 { SELECT a FR
24e0: 4f 4d 20 74 31 20 7d 20 7b 31 20 32 20 33 7d 0a  OM t1 } {1 2 3}.
24f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2500: 70 61 67 65 72 31 2d 33 2e 36 20 7b 20 43 4f 4d  pager1-3.6 { COM
2510: 4d 49 54 20 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63  MIT } {}..foreac
2520: 68 20 7b 74 6e 20 73 71 6c 20 74 63 6c 7d 20 7b  h {tn sql tcl} {
2530: 0a 20 20 37 20 20 7b 20 50 52 41 47 4d 41 20 73  .  7  { PRAGMA s
2540: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52  ynchronous = NOR
2550: 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20 74 65 6d  MAL ; PRAGMA tem
2560: 70 5f 73 74 6f 72 65 20 3d 20 30 20 7d 20 7b 0a  p_store = 0 } {.
2570: 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d      testvfs tv -
2580: 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76  default 1.    tv
2590: 20 64 65 76 63 68 61 72 20 73 61 66 65 5f 61 70   devchar safe_ap
25a0: 70 65 6e 64 0a 20 20 7d 0a 20 20 38 20 20 7b 20  pend.  }.  8  { 
25b0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
25c0: 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50 52  us = NORMAL ; PR
25d0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20  AGMA temp_store 
25e0: 3d 20 32 20 7d 20 7b 0a 20 20 20 20 74 65 73 74  = 2 } {.    test
25f0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
2600: 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72  1.    tv devchar
2610: 20 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 7d 0a   sequential.  }.
2620: 20 20 39 20 20 7b 20 50 52 41 47 4d 41 20 73 79    9  { PRAGMA sy
2630: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c  nchronous = FULL
2640: 20 7d 20 7b 20 7d 0a 20 20 31 30 20 7b 20 50 52   } { }.  10 { PR
2650: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
2660: 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20 7b 20 7d 0a   = NORMAL } { }.
2670: 20 20 31 31 20 7b 20 50 52 41 47 4d 41 20 73 79    11 { PRAGMA sy
2680: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 20  nchronous = OFF 
2690: 7d 20 7b 20 7d 0a 20 20 31 32 20 7b 20 50 52 41  } { }.  12 { PRA
26a0: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
26b0: 3d 20 46 55 4c 4c 20 3b 20 50 52 41 47 4d 41 20  = FULL ; PRAGMA 
26c0: 66 75 6c 6c 66 73 79 6e 63 20 3d 20 31 20 7d 20  fullfsync = 1 } 
26d0: 7b 20 7d 0a 20 20 31 33 20 7b 20 50 52 41 47 4d  { }.  13 { PRAGM
26e0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
26f0: 46 55 4c 4c 20 7d 20 7b 0a 20 20 20 20 74 65 73  FULL } {.    tes
2700: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
2710: 20 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61   1.    tv devcha
2720: 72 20 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 7d  r sequential.  }
2730: 0a 20 20 31 34 20 7b 20 50 52 41 47 4d 41 20 6c  .  14 { PRAGMA l
2740: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58  ocking_mode = EX
2750: 43 4c 55 53 49 56 45 20 7d 20 7b 0a 20 20 7d 0a  CLUSIVE } {.  }.
2760: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } {.  do_test pa
2770: 67 65 72 31 2d 33 2e 24 74 6e 2e 31 20 7b 0a 20  ger1-3.$tn.1 {. 
2780: 20 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20 20     eval $tcl.   
2790: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
27a0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
27b0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
27c0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78   a_string.    ex
27d0: 65 63 73 71 6c 20 24 73 71 6c 0a 20 20 20 20 65  ecsql $sql.    e
27e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
27f0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2800: 6d 20 3d 20 32 3b 0a 20 20 20 20 20 20 50 52 41  m = 2;.      PRA
2810: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
2820: 20 31 30 3b 0a 20 20 20 20 20 20 43 52 45 41 54   10;.      CREAT
2830: 45 20 54 41 42 4c 45 20 7a 28 78 20 49 4e 54 45  E TABLE z(x INTE
2840: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
2850: 20 79 29 3b 0a 20 20 20 20 20 20 42 45 47 49 4e   y);.      BEGIN
2860: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
2870: 20 49 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e   INTO z VALUES(N
2880: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30  ULL, a_string(80
2890: 30 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  0));.        INS
28a0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
28b0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
28c0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
28d0: 20 20 2d 2d 20 20 20 32 0a 20 20 20 20 20 20 20    --   2.       
28e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
28f0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2900: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2910: 3b 20 20 20 20 20 2d 2d 20 20 20 34 0a 20 20 20  ;     --   4.   
2920: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2930: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2940: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2950: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20 38  OM z;     --   8
2960: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2970: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2980: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2990: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
29a0: 20 20 31 36 0a 20 20 20 20 20 20 20 20 49 4e 53    16.        INS
29b0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
29c0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
29d0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
29e0: 20 20 2d 2d 20 20 33 32 0a 20 20 20 20 20 20 20    --  32.       
29f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
2a00: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2a10: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2a20: 3b 20 20 20 20 20 2d 2d 20 20 36 34 0a 20 20 20  ;     --  64.   
2a30: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2a40: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2a50: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2a60: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 31 32 38  OM z;     -- 128
2a70: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2a80: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2a90: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2aa0: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
2ab0: 20 32 35 36 0a 20 20 20 20 20 20 43 4f 4d 4d 49   256.      COMMI
2ac0: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65  T;.    }.    exe
2ad0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 61 75  csql { PRAGMA au
2ae0: 74 6f 5f 76 61 63 75 75 6d 20 7d 0a 20 20 7d 20  to_vacuum }.  } 
2af0: 7b 32 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  {2}.  do_execsql
2b00: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24  _test pager1-3.$
2b10: 74 6e 2e 32 20 7b 0a 20 20 20 20 42 45 47 49 4e  tn.2 {.    BEGIN
2b20: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2b30: 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c  NTO z VALUES(NUL
2b40: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
2b50: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
2b60: 49 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55  INTO z VALUES(NU
2b70: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2b80: 29 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f  ));.      SAVEPO
2b90: 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20  INT one;.       
2ba0: 20 55 50 44 41 54 45 20 7a 20 53 45 54 20 79 20   UPDATE z SET y 
2bb0: 3d 20 4e 55 4c 4c 20 57 48 45 52 45 20 78 3e 32  = NULL WHERE x>2
2bc0: 35 36 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47  56;.        PRAG
2bd0: 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76  MA incremental_v
2be0: 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 20 20 53  acuum;.        S
2bf0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2c00: 52 4f 4d 20 7a 20 57 48 45 52 45 20 78 20 3c 20  ROM z WHERE x < 
2c10: 31 30 30 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42  100;.      ROLLB
2c20: 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20  ACK TO one;.    
2c30: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 20 7b 39 39 7d  COMMIT;.  } {99}
2c40: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
2c50: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e  est pager1-3.$tn
2c60: 2e 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  .3 {.    BEGIN;.
2c70: 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
2c80: 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50 44  one;.        UPD
2c90: 41 54 45 20 7a 20 53 45 54 20 79 20 3d 20 79 7c  ATE z SET y = y|
2ca0: 7c 78 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41  |x;.      ROLLBA
2cb0: 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43  CK TO one;.    C
2cc0: 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43  OMMIT;.    SELEC
2cd0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2ce0: 7a 3b 0a 20 20 7d 20 7b 32 35 38 7d 0a 0a 20 20  z;.  } {258}..  
2cf0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2d00: 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 34 20 7b  pager1-3.$tn.4 {
2d10: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f  .    SAVEPOINT o
2d20: 6e 65 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  ne;.      UPDATE
2d30: 20 7a 20 53 45 54 20 79 20 3d 20 79 7c 7c 78 3b   z SET y = y||x;
2d40: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  .    ROLLBACK TO
2d50: 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 20 20 64   one;.  } {}.  d
2d60: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
2d70: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 35 20 7b 0a  ager1-3.$tn.5 {.
2d80: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
2d90: 28 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 20 20  (*) FROM z;.    
2da0: 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 20  RELEASE one;.   
2db0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
2dc0: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 7b 32 35  y_check;.  } {25
2dd0: 38 20 6f 6b 7d 0a 0a 20 20 64 6f 5f 65 78 65 63  8 ok}..  do_exec
2de0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
2df0: 33 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 53 41  3.$tn.6 {.    SA
2e00: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
2e10: 20 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20   RELEASE one;.  
2e20: 7d 20 7b 7d 0a 0a 20 20 64 62 20 63 6c 6f 73 65  } {}..  db close
2e30: 0a 20 20 63 61 74 63 68 20 7b 20 74 76 20 64 65  .  catch { tv de
2e40: 6c 65 74 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  lete }.}..#-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e90: 2d 2d 2d 2d 0a 23 20 48 6f 74 20 6a 6f 75 72 6e  ----.# Hot journ
2ea0: 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 72 65 6c 61  al rollback rela
2eb0: 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e 0a  ted test cases..
2ec0: 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 31 2e 2a  #.# pager1.4.1.*
2ed0: 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  : Test that the 
2ee0: 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 64 65 6c  pager module del
2ef0: 65 74 65 73 20 76 65 72 79 20 73 6d 61 6c 6c 20  etes very small 
2f00: 69 6e 76 61 6c 69 64 0a 23 20 20 20 20 20 20 20  invalid.#       
2f10: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
2f20: 66 69 6c 65 73 2e 0a 23 0a 23 20 70 61 67 65 72  files..#.# pager
2f30: 31 2e 34 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68  1.4.2.*: Test th
2f40: 61 74 20 69 66 20 74 68 65 20 6d 61 73 74 65 72  at if the master
2f50: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
2f60: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
2f70: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
2f80: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2f90: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
2fa0: 63 6f 72 72 75 70 74 20 28 63 68 65 63 6b 73 75  corrupt (checksu
2fb0: 6d 20 64 6f 65 73 20 6e 6f 74 0a 23 20 20 20 20  m does not.#    
2fc0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 75             compu
2fd0: 74 65 29 20 74 68 65 20 61 73 73 6f 63 69 61 74  te) the associat
2fe0: 65 64 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72 6f  ed journal is ro
2ff0: 6c 6c 65 64 20 62 61 63 6b 20 28 61 6e 64 20 6e  lled back (and n
3000: 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  o.#             
3010: 20 20 78 41 63 63 65 73 73 28 29 20 63 61 6c 6c    xAccess() call
3020: 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 74 68   to check for th
3030: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 6e  e presence of an
3040: 79 20 6d 61 73 74 65 72 20 0a 23 20 20 20 20 20  y master .#     
3050: 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
3060: 6c 20 66 69 6c 65 20 69 73 20 6d 61 64 65 29 2e  l file is made).
3070: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 33 2e  .#.# pager1.4.3.
3080: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65  *: Test that the
3090: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 68   contents of a h
30a0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 72 65 20 69  ot-journal are i
30b0: 67 6e 6f 72 65 64 20 69 66 20 74 68 65 0a 23 20  gnored if the.# 
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
30d0: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
30e0: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
30f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 70 70  urnal header app
3100: 65 61 72 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ear to.#        
3110: 20 20 20 20 20 20 20 62 65 20 69 6e 76 61 6c 69         be invali
3120: 64 20 28 74 6f 6f 20 6c 61 72 67 65 2c 20 74 6f  d (too large, to
3130: 6f 20 73 6d 61 6c 6c 20 6f 72 20 6e 6f 74 20 61  o small or not a
3140: 20 70 6f 77 65 72 20 6f 66 20 32 29 2e 0a 23 0a   power of 2)..#.
3150: 23 20 70 61 67 65 72 31 2e 34 2e 34 2e 2a 3a 20  # pager1.4.4.*: 
3160: 54 65 73 74 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  Test hot-journal
3170: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 6a 6f 75   rollback of jou
3180: 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 20 61  rnal file with a
3190: 20 6d 61 73 74 65 72 0a 23 20 20 20 20 20 20 20   master.#       
31a0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
31b0: 70 6f 69 6e 74 65 72 20 67 65 6e 65 72 61 74 65  pointer generate
31c0: 64 20 69 6e 20 76 61 72 69 6f 75 73 20 22 50 52  d in various "PR
31d0: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
31e0: 22 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  ".#             
31f0: 20 20 6d 6f 64 65 73 2e 0a 23 0a 23 20 70 61 67    modes..#.# pag
3200: 65 72 31 2e 34 2e 35 2e 2a 3a 20 54 65 73 74 20  er1.4.5.*: Test 
3210: 74 68 61 74 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  that hot-journal
3220: 20 72 6f 6c 6c 62 61 63 6b 20 73 74 6f 70 73 20   rollback stops 
3230: 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 73  if it encounters
3240: 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20   a.#            
3250: 20 20 20 6a 6f 75 72 6e 61 6c 2d 72 65 63 6f 72     journal-recor
3260: 64 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  d for which the 
3270: 63 68 65 63 6b 73 75 6d 20 66 61 69 6c 73 2e 0a  checksum fails..
3280: 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 36 2e 2a  #.# pager1.4.6.*
3290: 3a 20 54 65 73 74 20 74 68 61 74 20 77 68 65 6e  : Test that when
32a0: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
32b0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 68 61 74  hot-journal that
32c0: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 23 20 20 20   contains a.#   
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 74              mast
32e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
32f0: 65 72 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  er, the master j
3300: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
3310: 65 6c 65 74 65 64 0a 23 20 20 20 20 20 20 20 20  eleted.#        
3320: 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c         after all
3330: 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
3340: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
3350: 69 74 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  it are deleted..
3360: 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 37 2e 2a  #.# pager1.4.7.*
3370: 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61  : Test that if a
3380: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
3390: 65 20 65 78 69 73 74 73 20 62 75 74 20 61 20 63  e exists but a c
33a0: 6c 69 65 6e 74 20 63 61 6e 0a 23 20 20 20 20 20  lient can.#     
33b0: 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 20 69            open i
33c0: 74 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e  t for reading on
33d0: 6c 79 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ly, the database
33e0: 20 63 61 6e 6e 6f 74 20 62 65 20 61 63 63 65 73   cannot be acces
33f0: 73 65 64 20 61 6e 64 0a 23 20 20 20 20 20 20 20  sed and.#       
3400: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43          SQLITE_C
3410: 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
3420: 6e 65 64 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20  ned..# .do_test 
3430: 70 61 67 65 72 31 2e 34 2e 31 2e 31 20 7b 0a 20  pager1.4.1.1 {. 
3440: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
3450: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
3460: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 43 52 45  ecsql { .    CRE
3470: 41 54 45 20 54 41 42 4c 45 20 78 28 79 2c 20 7a  ATE TABLE x(y, z
3480: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3490: 54 4f 20 78 20 56 41 4c 55 45 53 28 31 2c 20 32  TO x VALUES(1, 2
34a0: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 66 64 20  );.  }.  set fd 
34b0: 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f  [open test.db-jo
34c0: 75 72 6e 61 6c 20 77 5d 0a 20 20 70 75 74 73 20  urnal w].  puts 
34d0: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 22  -nonewline $fd "
34e0: 68 65 6c 6c 6f 77 6f 72 6c 64 22 0a 20 20 63 6c  helloworld".  cl
34f0: 6f 73 65 20 24 66 64 0a 20 20 66 69 6c 65 20 65  ose $fd.  file e
3500: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
3510: 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  urnal.} {1}.do_t
3520: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 31 2e 32  est pager1.4.1.2
3530: 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c   { execsql { SEL
3540: 45 43 54 20 2a 20 46 52 4f 4d 20 78 20 7d 20 7d  ECT * FROM x } }
3550: 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 70   {1 2}.do_test p
3560: 61 67 65 72 31 2e 34 2e 31 2e 33 20 7b 20 66 69  ager1.4.1.3 { fi
3570: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
3580: 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 7b 30 7d 0a  b-journal } {0}.
3590: 0a 23 20 53 65 74 20 75 70 20 61 20 5b 74 65 73  .# Set up a [tes
35a0: 74 76 66 73 5d 20 74 6f 20 73 6e 61 70 73 68 6f  tvfs] to snapsho
35b0: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
35c0: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 53 51  m just before SQ
35d0: 4c 69 74 65 0a 23 20 64 65 6c 65 74 65 73 20 74  Lite.# deletes t
35e0: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
35f0: 6c 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75  l to commit a mu
3600: 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
3610: 74 69 6f 6e 2e 0a 23 0a 23 20 49 6e 20 73 75 62  tion..#.# In sub
3620: 73 65 71 75 65 6e 74 20 74 65 73 74 20 63 61 73  sequent test cas
3630: 65 73 2c 20 69 6e 76 6f 6b 69 6e 67 20 5b 66 61  es, invoking [fa
3640: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
3650: 6e 64 5f 72 65 6f 70 65 6e 5d 20 73 65 74 73 0a  nd_reopen] sets.
3660: 23 20 75 70 20 74 68 65 20 66 69 6c 65 20 73 79  # up the file sy
3670: 73 74 65 6d 20 74 6f 20 63 6f 6e 74 61 69 6e 20  stem to contain 
3680: 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c 20 74  two databases, t
3690: 77 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  wo hot-journal f
36a0: 69 6c 65 73 20 61 6e 64 0a 23 20 61 20 6d 61 73  iles and.# a mas
36b0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 23 0a 64  ter-journal..#.d
36c0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
36d0: 32 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20  2.1 {.  testvfs 
36e0: 74 73 74 76 66 73 20 2d 64 65 66 61 75 6c 74 20  tstvfs -default 
36f0: 31 0a 20 20 74 73 74 76 66 73 20 66 69 6c 74 65  1.  tstvfs filte
3700: 72 20 78 44 65 6c 65 74 65 0a 20 20 74 73 74 76  r xDelete.  tstv
3710: 66 73 20 73 63 72 69 70 74 20 78 44 65 6c 65 74  fs script xDelet
3720: 65 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f 63  eCallback.  proc
3730: 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63 6b   xDeleteCallback
3740: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72   {method file ar
3750: 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69  gs} {.    set fi
3760: 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  le [file tail $f
3770: 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 5b 73  ile].    if { [s
3780: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a  tring match *mj*
3790: 20 24 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75 6c   $file] } { faul
37a0: 74 73 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d 0a  tsim_save }.  }.
37b0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
37c0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
37d0: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
37e0: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
37f0: 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20  ql {.    ATTACH 
3800: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75  'test.db2' AS au
3810: 78 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  x;.    PRAGMA jo
3820: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
3830: 45 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ETE;.    PRAGMA 
3840: 6d 61 69 6e 2e 63 61 63 68 65 5f 73 69 7a 65 20  main.cache_size 
3850: 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41  = 10;.    PRAGMA
3860: 20 61 75 78 2e 63 61 63 68 65 5f 73 69 7a 65 20   aux.cache_size 
3870: 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45  = 10;.    CREATE
3880: 20 54 41 42 4c 45 20 74 31 28 61 20 55 4e 49 51   TABLE t1(a UNIQ
3890: 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20  UE, b UNIQUE);. 
38a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
38b0: 61 75 78 2e 74 32 28 61 20 55 4e 49 51 55 45 2c  aux.t2(a UNIQUE,
38c0: 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   b UNIQUE);.    
38d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
38e0: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32  ALUES(a_string(2
38f0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
3900: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
3910: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
3920: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
3930: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
3940: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
3950: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
3960: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
3970: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
3980: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
3990: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a  INTO t2 SELECT *
39a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45   FROM t1;.    BE
39b0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
39c0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
39d0: 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29 2c 20   a_string(201), 
39e0: 61 5f 73 74 72 69 6e 67 28 33 30 31 29 20 46 52  a_string(301) FR
39f0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53  OM t1;.      INS
3a00: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
3a10: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29  CT a_string(202)
3a20: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 32 29 20  , a_string(302) 
3a30: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49  FROM t1;.      I
3a40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
3a50: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
3a60: 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 33  3), a_string(303
3a70: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  ) FROM t1;.     
3a80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3a90: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
3aa0: 32 30 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  204), a_string(3
3ab0: 30 34 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  04) FROM t1;.   
3ac0: 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20     REPLACE INTO 
3ad0: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
3ae0: 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b   t1;.    COMMIT;
3af0: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
3b00: 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a    tstvfs delete.
3b10: 7d 20 7b 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c  } {}..if {$::tcl
3b20: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
3b30: 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d 20  rm)!="windows"} 
3b40: 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  {.do_test pager1
3b50: 2e 34 2e 32 2e 32 20 7b 0a 20 20 66 61 75 6c 74  .4.2.2 {.  fault
3b60: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
3b70: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
3b80: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f   {.    SELECT co
3b90: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
3ba0: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
3bb0: 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a  rity_check;.  }.
3bc0: 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74  } {4 ok}.do_test
3bd0: 20 70 61 67 65 72 31 2e 34 2e 32 2e 33 20 7b 0a   pager1.4.2.3 {.
3be0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
3bf0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
3c00: 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20  foreach f [glob 
3c10: 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 66  test.db-mj*] { f
3c20: 6f 72 63 65 64 65 6c 65 74 65 20 24 66 20 7d 0a  orcedelete $f }.
3c30: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3c40: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
3c50: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41  FROM t1;.    PRA
3c60: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
3c70: 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 36 34 20 6f  eck;.  }.} {64 o
3c80: 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  k}.do_test pager
3c90: 31 2e 34 2e 32 2e 34 20 7b 0a 20 20 66 61 75 6c  1.4.2.4 {.  faul
3ca0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
3cb0: 5f 72 65 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f  _reopen.  hexio_
3cc0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  write test.db-jo
3cd0: 75 72 6e 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c  urnal [expr [fil
3ce0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a  e size test.db-j
3cf0: 6f 75 72 6e 61 6c 5d 2d 33 30 5d 20 31 32 33 34  ournal]-30] 1234
3d00: 35 36 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  56.  execsql {. 
3d10: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
3d20: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *) FROM t1;.    
3d30: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
3d40: 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34  _check;.  }.} {4
3d50: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   ok}.do_test pag
3d60: 65 72 31 2e 34 2e 32 2e 35 20 7b 0a 20 20 66 61  er1.4.2.5 {.  fa
3d70: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
3d80: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65 78 69  nd_reopen.  hexi
3d90: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d  o_write test.db-
3da0: 6a 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 5b 66  journal [expr [f
3db0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
3dc0: 2d 6a 6f 75 72 6e 61 6c 5d 2d 33 30 5d 20 31 32  -journal]-30] 12
3dd0: 33 34 35 36 0a 20 20 66 6f 72 65 61 63 68 20 66  3456.  foreach f
3de0: 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2d 6d   [glob test.db-m
3df0: 6a 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74  j*] { forcedelet
3e00: 65 20 24 66 20 7d 0a 20 20 65 78 65 63 73 71 6c  e $f }.  execsql
3e10: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f   {.    SELECT co
3e20: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
3e30: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
3e40: 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a  rity_check;.  }.
3e50: 7d 20 7b 34 20 6f 6b 7d 0a 7d 0a 0a 64 6f 5f 74  } {4 ok}.}..do_t
3e60: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 31  est pager1.4.3.1
3e70: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 73 74   {.  testvfs tst
3e80: 76 66 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20  vfs -default 1. 
3e90: 20 74 73 74 76 66 73 20 66 69 6c 74 65 72 20 78   tstvfs filter x
3ea0: 53 79 6e 63 0a 20 20 74 73 74 76 66 73 20 73 63  Sync.  tstvfs sc
3eb0: 72 69 70 74 20 78 53 79 6e 63 43 61 6c 6c 62 61  ript xSyncCallba
3ec0: 63 6b 0a 20 20 70 72 6f 63 20 78 53 79 6e 63 43  ck.  proc xSyncC
3ed0: 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64 20  allback {method 
3ee0: 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20 20  file args} {.   
3ef0: 20 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65 20   set file [file 
3f00: 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20 20  tail $file].    
3f10: 69 66 20 7b 20 30 3d 3d 5b 73 74 72 69 6e 67 20  if { 0==[string 
3f20: 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24  match *journal $
3f30: 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73  file] } { faults
3f40: 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20  im_save }.  }.  
3f50: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
3f60: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
3f70: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
3f80: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
3f90: 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 43 52 45   DELETE;.    CRE
3fa0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
3fb0: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
3fc0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
3fd0: 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
3fe0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
3ff0: 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63  , 4);.  }.  db c
4000: 6c 6f 73 65 0a 20 20 74 73 74 76 66 73 20 64 65  lose.  tstvfs de
4010: 6c 65 74 65 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61  lete.} {}..forea
4020: 63 68 20 7b 74 6e 20 6f 66 73 74 20 76 61 6c 75  ch {tn ofst valu
4030: 65 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 20 20  e result} {.    
4040: 20 20 20 20 20 20 32 20 20 20 32 30 20 20 20 20        2   20    
4050: 33 31 20 20 20 20 20 20 20 7b 31 20 32 20 33 20  31       {1 2 3 
4060: 34 7d 0a 20 20 20 20 20 20 20 20 20 20 33 20 20  4}.          3  
4070: 20 32 30 20 20 20 20 33 32 20 20 20 20 20 20 20   20    32       
4080: 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20  {1 2 3 4}.      
4090: 20 20 20 20 34 20 20 20 32 30 20 20 20 20 33 33      4   20    33
40a0: 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d         {1 2 3 4}
40b0: 0a 20 20 20 20 20 20 20 20 20 20 35 20 20 20 32  .          5   2
40c0: 30 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31  0    65536    {1
40d0: 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20   2 3 4}.        
40e0: 20 20 36 20 20 20 32 30 20 20 20 20 31 33 31 30    6   20    1310
40f0: 37 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a  72   {1 2 3 4}..
4100: 20 20 20 20 20 20 20 20 20 20 37 20 20 20 32 34            7   24
4110: 20 20 20 20 35 31 31 20 20 20 20 20 20 7b 31 20      511      {1 
4120: 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20  2 3 4}.         
4130: 20 38 20 20 20 32 34 20 20 20 20 35 31 33 20 20   8   24    513  
4140: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
4150: 20 20 20 20 20 20 20 20 39 20 20 20 32 34 20 20          9   24  
4160: 20 20 31 33 31 30 37 32 20 20 20 7b 31 20 32 20    131072   {1 2 
4170: 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20 20 31  3 4}..         1
4180: 30 20 20 20 33 32 20 20 20 20 36 35 35 33 36 20  0   32    65536 
4190: 20 20 20 7b 31 20 32 7d 0a 7d 20 7b 0a 20 20 64     {1 2}.} {.  d
41a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
41b0: 33 2e 24 74 6e 20 7b 0a 20 20 20 20 66 61 75 6c  3.$tn {.    faul
41c0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
41d0: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 68 65 78 69  _reopen.    hexi
41e0: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d  o_write test.db-
41f0: 6a 6f 75 72 6e 61 6c 20 24 6f 66 73 74 20 5b 66  journal $ofst [f
4200: 6f 72 6d 61 74 20 25 2e 38 78 20 24 76 61 6c 75  ormat %.8x $valu
4210: 65 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  e].    execsql {
4220: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4230: 31 20 7d 0a 20 20 7d 20 24 72 65 73 75 6c 74 0a  1 }.  } $result.
4240: 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20 53 65  }.db close..# Se
4250: 74 20 75 70 20 61 20 56 46 53 20 74 68 61 74 20  t up a VFS that 
4260: 73 6e 61 70 73 68 6f 74 73 20 74 68 65 20 66 69  snapshots the fi
4270: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
4280: 65 66 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  efore a master j
4290: 6f 75 72 6e 61 6c 0a 23 20 66 69 6c 65 20 69 73  ournal.# file is
42a0: 20 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d   deleted to comm
42b0: 69 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  it a multi-file 
42c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 70 65  transaction. Spe
42d0: 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 0a 23  cifically, the.#
42e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
42f0: 73 61 76 65 64 20 6a 75 73 74 20 62 65 66 6f 72  saved just befor
4300: 65 20 74 68 65 20 78 44 65 6c 65 74 65 28 29 20  e the xDelete() 
4310: 63 61 6c 6c 20 74 6f 20 72 65 6d 6f 76 65 20 74  call to remove t
4320: 68 65 20 0a 23 20 6d 61 73 74 65 72 20 6a 6f 75  he .# master jou
4330: 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74  rnal file from t
4340: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a  he file-system..
4350: 23 0a 73 65 74 20 70 77 64 20 5b 67 65 74 5f 70  #.set pwd [get_p
4360: 77 64 5d 0a 74 65 73 74 76 66 73 20 74 76 20 2d  wd].testvfs tv -
4370: 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72  default 1.tv scr
4380: 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64  ipt copy_on_mj_d
4390: 65 6c 65 74 65 0a 73 65 74 20 3a 3a 6d 6a 5f 66  elete.set ::mj_f
43a0: 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 30  ilename_length 0
43b0: 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a  .proc copy_on_mj
43c0: 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20  _delete {method 
43d0: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
43e0: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  .  if {[string m
43f0: 61 74 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20  atch *mj* [file 
4400: 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d  tail $filename]]
4410: 7d 20 7b 20 0a 20 20 20 20 23 0a 20 20 20 20 23  } { .    #.    #
4420: 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 66 69   NOTE: Is the fi
4430: 6c 65 20 6e 61 6d 65 20 72 65 6c 61 74 69 76 65  le name relative
4440: 3f 20 20 49 66 20 73 6f 2c 20 61 64 64 20 74 68  ?  If so, add th
4450: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
4460: 63 75 72 72 65 6e 74 0a 20 20 20 20 23 20 20 20  current.    #   
4470: 20 20 20 20 64 69 72 65 63 74 6f 72 79 2e 0a 20      directory.. 
4480: 20 20 20 23 0a 20 20 20 20 69 66 20 7b 5b 69 73     #.    if {[is
4490: 5f 72 65 6c 61 74 69 76 65 5f 66 69 6c 65 20 24  _relative_file $
44a0: 66 69 6c 65 6e 61 6d 65 5d 7d 20 7b 0a 20 20 20  filename]} {.   
44b0: 20 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65     set ::mj_file
44c0: 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 5c 0a 20 20  name_length \.  
44d0: 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b 73 74        [expr {[st
44e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
44f0: 65 6e 61 6d 65 5d 20 2b 20 5b 73 74 72 69 6e 67  ename] + [string
4500: 20 6c 65 6e 67 74 68 20 24 3a 3a 70 77 64 5d 7d   length $::pwd]}
4510: 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ].    } else {. 
4520: 20 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69       set ::mj_fi
4530: 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 5b 73  lename_length [s
4540: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69  tring length $fi
4550: 6c 65 6e 61 6d 65 5d 0a 20 20 20 20 7d 0a 20 20  lename].    }.  
4560: 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20    faultsim_save 
4570: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
4580: 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 66 6f 72 65 61  LITE_OK.}..forea
4590: 63 68 20 7b 74 6e 31 20 74 63 6c 7d 20 7b 0a 20  ch {tn1 tcl} {. 
45a0: 20 31 20 7b 20 73 65 74 20 70 72 65 66 69 78 20   1 { set prefix 
45b0: 22 74 65 73 74 2e 64 62 22 20 7d 0a 20 20 32 20  "test.db" }.  2 
45c0: 7b 20 0a 20 20 20 20 23 20 54 68 69 73 20 74 65  { .    # This te
45d0: 73 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  st depends on th
45e0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53  e underlying VFS
45f0: 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 6f   being able to o
4600: 70 65 6e 20 70 61 74 68 73 0a 20 20 20 20 23 20  pen paths.    # 
4610: 35 31 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e  512 bytes in len
4620: 67 74 68 2e 20 54 68 65 20 69 64 65 61 20 69 73  gth. The idea is
4630: 20 74 6f 20 63 72 65 61 74 65 20 61 20 68 6f 74   to create a hot
4640: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68  -journal file th
4650: 61 74 0a 20 20 20 20 23 20 63 6f 6e 74 61 69 6e  at.    # contain
4660: 73 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  s a master-journ
4670: 61 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20 6c 61  al pointer so la
4680: 72 67 65 20 74 68 61 74 20 69 74 20 63 6f 75 6c  rge that it coul
4690: 64 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 23 20  d contain.    # 
46a0: 61 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  a valid page rec
46b0: 6f 72 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  ord (if the file
46c0: 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 35 31   page-size is 51
46d0: 32 20 62 79 74 65 73 29 2e 20 53 6f 20 61 73 20  2 bytes). So as 
46e0: 74 6f 0a 20 20 20 20 23 20 6d 61 6b 65 20 73 75  to.    # make su
46f0: 72 65 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27  re SQLite doesn'
4700: 74 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 62  t get confused b
4710: 79 20 74 68 69 73 2e 0a 20 20 20 20 23 0a 20 20  y this..    #.  
4720: 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67 20 5b    set nPadding [
4730: 65 78 70 72 20 35 31 31 20 2d 20 24 3a 3a 6d 6a  expr 511 - $::mj
4740: 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68  _filename_length
4750: 5d 0a 20 20 20 20 69 66 20 7b 24 74 63 6c 5f 70  ].    if {$tcl_p
4760: 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d  latform(platform
4770: 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a  )=="windows"} {.
4780: 20 20 20 20 20 20 23 20 54 42 44 20 6e 65 65 64        # TBD need
4790: 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 68   to figure out h
47a0: 6f 77 20 74 6f 20 64 6f 20 74 68 69 73 20 63 6f  ow to do this co
47b0: 72 72 65 63 74 6c 79 20 66 6f 72 20 57 69 6e 64  rrectly for Wind
47c0: 6f 77 73 21 21 21 0a 20 20 20 20 20 20 73 65 74  ows!!!.      set
47d0: 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20   nPadding [expr 
47e0: 32 35 35 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65  255 - $::mj_file
47f0: 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20 20  name_length].   
4800: 20 7d 0a 0a 20 20 20 20 23 20 57 65 20 63 61 6e   }..    # We can
4810: 6e 6f 74 20 6a 75 73 74 20 63 72 65 61 74 65 20  not just create 
4820: 61 20 72 65 61 6c 6c 79 20 6c 6f 6e 67 20 64 61  a really long da
4830: 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
4840: 20 74 6f 20 6f 70 65 6e 2c 20 61 73 0a 20 20 20   to open, as.   
4850: 20 23 20 4c 69 6e 75 78 20 6c 69 6d 69 74 73 20   # Linux limits 
4860: 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70 6f 6e 65  a single compone
4870: 6e 74 20 6f 66 20 61 20 70 61 74 68 20 74 6f 20  nt of a path to 
4880: 32 35 35 20 62 79 74 65 73 20 62 79 20 64 65 66  255 bytes by def
4890: 61 75 6c 74 0a 20 20 20 20 23 20 28 61 6e 64 20  ault.    # (and 
48a0: 70 72 65 73 75 6d 61 62 6c 79 20 6f 74 68 65 72  presumably other
48b0: 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 6c 69   systems have li
48c0: 6d 69 74 73 20 74 6f 6f 29 2e 20 53 6f 20 63 72  mits too). So cr
48d0: 65 61 74 65 20 61 20 64 69 72 65 63 74 6f 72 79  eate a directory
48e0: 0a 20 20 20 20 23 20 68 69 65 72 61 72 63 68 79  .    # hierarchy
48f0: 20 74 6f 20 77 6f 72 6b 20 69 6e 2e 0a 20 20 20   to work in..   
4900: 20 23 0a 20 20 20 20 73 65 74 20 64 69 72 6e 61   #.    set dirna
4910: 6d 65 20 22 64 31 32 33 34 35 36 37 38 39 30 31  me "d12345678901
4920: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
4930: 38 39 30 2f 22 0a 20 20 20 20 73 65 74 20 6e 44  890/".    set nD
4940: 69 72 20 5b 65 78 70 72 20 24 6e 50 61 64 64 69  ir [expr $nPaddi
4950: 6e 67 20 2f 20 33 32 5d 0a 20 20 20 20 69 66 20  ng / 32].    if 
4960: 7b 20 24 6e 44 69 72 20 7d 20 7b 0a 20 20 20 20  { $nDir } {.    
4970: 20 20 73 65 74 20 70 20 5b 73 74 72 69 6e 67 20    set p [string 
4980: 72 65 70 65 61 74 20 24 64 69 72 6e 61 6d 65 20  repeat $dirname 
4990: 24 6e 44 69 72 5d 0a 20 20 20 20 20 20 66 69 6c  $nDir].      fil
49a0: 65 20 6d 6b 64 69 72 20 24 70 0a 20 20 20 20 20  e mkdir $p.     
49b0: 20 63 64 20 24 70 0a 20 20 20 20 7d 0a 0a 20 20   cd $p.    }..  
49c0: 20 20 73 65 74 20 70 61 64 64 69 6e 67 20 5b 73    set padding [s
49d0: 74 72 69 6e 67 20 72 65 70 65 61 74 20 78 20 5b  tring repeat x [
49e0: 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20 25  expr $nPadding %
49f0: 33 32 5d 5d 0a 20 20 20 20 73 65 74 20 70 72 65  32]].    set pre
4a00: 66 69 78 20 22 74 65 73 74 2e 64 62 24 7b 70 61  fix "test.db${pa
4a10: 64 64 69 6e 67 7d 22 0a 20 20 7d 0a 7d 20 7b 0a  dding}".  }.} {.
4a20: 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20 66 6f    eval $tcl.  fo
4a30: 72 65 61 63 68 20 7b 74 6e 32 20 73 71 6c 7d 20  reach {tn2 sql} 
4a40: 7b 0a 20 20 20 20 6f 20 7b 20 0a 20 20 20 20 20  {.    o { .     
4a50: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e   PRAGMA main.syn
4a60: 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20  chronous=OFF;.  
4a70: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
4a80: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a  ynchronous=OFF;.
4a90: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
4aa0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
4ab0: 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 35  TE;.    }.    o5
4ac0: 31 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  12 { .      PRAG
4ad0: 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e  MA main.synchron
4ae0: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  ous=OFF;.      P
4af0: 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72  RAGMA aux.synchr
4b00: 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20  onous=OFF;.     
4b10: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67   PRAGMA main.pag
4b20: 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  e_size = 512;.  
4b30: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 70      PRAGMA aux.p
4b40: 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a  age_size = 512;.
4b50: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
4b60: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
4b70: 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20  TE;.    }.    n 
4b80: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
4b90: 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73  main.synchronous
4ba0: 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50  =NORMAL;.      P
4bb0: 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72  RAGMA aux.synchr
4bc0: 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20  onous=NORMAL;.  
4bd0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
4be0: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
4bf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 20 7b 20  ;.    }.    f { 
4c00: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
4c10: 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  in.synchronous=F
4c20: 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  ULL;.      PRAGM
4c30: 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75  A aux.synchronou
4c40: 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52  s=FULL;.      PR
4c50: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
4c60: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20  e = DELETE;.    
4c70: 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 73 65 74  }.  } {..    set
4c80: 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24 7b 74 6e   tn "${tn1}.${tn
4c90: 32 7d 22 0a 20 20 0a 20 20 20 20 23 20 53 65 74  2}".  .    # Set
4ca0: 20 75 70 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e   up a connection
4cb0: 20 74 6f 20 68 61 76 65 20 74 77 6f 20 64 61 74   to have two dat
4cc0: 61 62 61 73 65 73 2c 20 74 65 73 74 2e 64 62 20  abases, test.db 
4cd0: 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20 20 20 20  (main) and .    
4ce0: 23 20 74 65 73 74 2e 64 62 32 20 28 61 75 78 29  # test.db2 (aux)
4cf0: 2e 20 54 68 65 6e 20 72 75 6e 20 61 20 6d 75 6c  . Then run a mul
4d00: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
4d10: 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20 54 68 65  ion on them. The
4d20: 0a 20 20 20 20 23 20 56 46 53 20 77 69 6c 6c 20  .    # VFS will 
4d30: 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69 6c  snapshot the fil
4d40: 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65  e-system just be
4d50: 66 6f 72 65 20 74 68 65 20 6d 61 73 74 65 72 2d  fore the master-
4d60: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23 20 66 69  journal.    # fi
4d70: 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 74 6f  le is deleted to
4d80: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
4d90: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 23 0a 20  saction..    #. 
4da0: 20 20 20 74 76 20 66 69 6c 74 65 72 20 78 44 65     tv filter xDe
4db0: 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74 65 73 74  lete.    do_test
4dc0: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
4dd0: 31 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73  1 {.      faults
4de0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
4df0: 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20  open $prefix.   
4e00: 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20     execsql ".   
4e10: 20 20 20 20 20 41 54 54 41 43 48 20 27 24 7b 70       ATTACH '${p
4e20: 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 3b  refix}2' AS aux;
4e30: 0a 20 20 20 20 20 20 20 20 24 73 71 6c 0a 20 20  .        $sql.  
4e40: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
4e50: 4c 45 20 61 28 78 29 3b 0a 20 20 20 20 20 20 20  LE a(x);.       
4e60: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
4e70: 78 2e 62 28 78 29 3b 0a 20 20 20 20 20 20 20 20  x.b(x);.        
4e80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41  INSERT INTO a VA
4e90: 4c 55 45 53 28 27 64 6f 75 62 6c 65 2d 79 6f 75  LUES('double-you
4ea0: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
4eb0: 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53  RT INTO a VALUES
4ec0: 28 27 77 68 79 27 29 3b 0a 20 20 20 20 20 20 20  ('why');.       
4ed0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56   INSERT INTO a V
4ee0: 41 4c 55 45 53 28 27 7a 65 64 27 29 3b 0a 20 20  ALUES('zed');.  
4ef0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4f00: 4f 20 62 20 56 41 4c 55 45 53 28 27 77 6f 6e 27  O b VALUES('won'
4f10: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
4f20: 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28  T INTO b VALUES(
4f30: 27 74 6f 6f 27 29 3b 0a 20 20 20 20 20 20 20 20  'too');.        
4f40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41  INSERT INTO b VA
4f50: 4c 55 45 53 28 27 66 72 65 65 27 29 3b 0a 20 20  LUES('free');.  
4f60: 20 20 20 20 22 0a 20 20 20 20 20 20 65 78 65 63      ".      exec
4f70: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 42 45  sql {.        BE
4f80: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 49  GIN;.          I
4f90: 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 53 45 4c  NSERT INTO a SEL
4fa0: 45 43 54 20 2a 20 46 52 4f 4d 20 62 20 57 48 45  ECT * FROM b WHE
4fb0: 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20 20  RE rowid<=3;.   
4fc0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4fd0: 54 4f 20 62 20 53 45 4c 45 43 54 20 2a 20 46 52  TO b SELECT * FR
4fe0: 4f 4d 20 61 20 57 48 45 52 45 20 72 6f 77 69 64  OM a WHERE rowid
4ff0: 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 43 4f 4d  <=3;.        COM
5000: 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MIT;.      }.   
5010: 20 7d 20 7b 7d 0a 20 20 20 20 74 76 20 66 69 6c   } {}.    tv fil
5020: 74 65 72 20 7b 7d 0a 20 20 20 20 0a 20 20 20 20  ter {}.    .    
5030: 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  # Check that the
5040: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
5050: 20 63 6f 6d 6d 69 74 74 65 64 20 73 75 63 63 65   committed succe
5060: 73 73 66 75 6c 6c 79 2e 0a 20 20 20 20 23 0a 20  ssfully..    #. 
5070: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
5080: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5090: 6e 2e 32 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.2 {.      SELE
50a0: 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20 20  CT * FROM a.    
50b0: 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68  } {double-you wh
50c0: 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66 72  y zed won too fr
50d0: 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73  ee}.    do_execs
50e0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  ql_test pager1-4
50f0: 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 20  .4.$tn.3 {.     
5100: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
5110: 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20  .    } {won too 
5120: 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75 20  free double-you 
5130: 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 0a 20 20  why zed}.    .  
5140: 20 20 23 20 52 65 73 74 6f 72 65 20 74 68 65 20    # Restore the 
5150: 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64 20  file-system and 
5160: 72 65 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  reopen the datab
5170: 61 73 65 73 2e 20 43 68 65 63 6b 20 74 68 61 74  ases. Check that
5180: 20 69 74 20 6e 6f 77 0a 20 20 20 20 23 20 61 70   it now.    # ap
5190: 70 65 61 72 73 20 74 68 61 74 20 74 68 65 20 74  pears that the t
51a0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
51b0: 6f 74 20 63 6f 6d 6d 69 74 74 65 64 20 28 62 65  ot committed (be
51c0: 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 2d 73  cause the file-s
51d0: 79 73 74 65 6d 0a 20 20 20 20 23 20 77 61 73 20  ystem.    # was 
51e0: 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68 65 20  restored to the 
51f0: 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20 68  state where it h
5200: 61 64 20 6e 6f 74 20 62 65 65 6e 29 2e 0a 20 20  ad not been)..  
5210: 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20    #.    do_test 
5220: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 34  pager1-4.4.$tn.4
5230: 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69   {.      faultsi
5240: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
5250: 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20  open $prefix.   
5260: 20 20 20 65 78 65 63 73 71 6c 20 22 41 54 54 41     execsql "ATTA
5270: 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32 27 20  CH '${prefix}2' 
5280: 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d  AS aux".    } {}
5290: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
52a0: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
52b0: 24 74 6e 2e 35 20 7b 53 45 4c 45 43 54 20 2a 20  $tn.5 {SELECT * 
52c0: 46 52 4f 4d 20 61 7d 20 7b 64 6f 75 62 6c 65 2d  FROM a} {double-
52d0: 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 20  you why zed}.   
52e0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
52f0: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5300: 36 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  6 {SELECT * FROM
5310: 20 62 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65   b} {won too fre
5320: 65 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52 65  e}.    .    # Re
5330: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73  store the file-s
5340: 79 73 74 65 6d 20 61 67 61 69 6e 2e 20 54 68 69  ystem again. Thi
5350: 73 20 74 69 6d 65 2c 20 62 65 66 6f 72 65 20 72  s time, before r
5360: 65 6f 70 65 6e 69 6e 67 20 74 68 65 20 64 61 74  eopening the dat
5370: 61 62 61 73 65 73 2c 0a 20 20 20 20 23 20 64 65  abases,.    # de
5380: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 2d  lete the master-
5390: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
53a0: 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  m the file-syste
53b0: 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70 65 61 72  m. It now appear
53c0: 73 20 74 68 61 74 0a 20 20 20 20 23 20 74 68 65  s that.    # the
53d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
53e0: 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e 6f 20 6d   committed (no m
53f0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
5400: 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c 62 61 63  le == no rollbac
5410: 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f  k)..    #.    do
5420: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
5430: 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 20 20 66  .$tn.7 {.      f
5440: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
5450: 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 65 66  and_reopen $pref
5460: 69 78 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ix.      foreach
5470: 20 66 20 5b 67 6c 6f 62 20 24 7b 70 72 65 66 69   f [glob ${prefi
5480: 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64  x}-mj*] { forced
5490: 65 6c 65 74 65 20 24 66 20 7d 0a 20 20 20 20 20  elete $f }.     
54a0: 20 65 78 65 63 73 71 6c 20 22 41 54 54 41 43 48   execsql "ATTACH
54b0: 20 27 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53   '${prefix}2' AS
54c0: 20 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20   aux".    } {}. 
54d0: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
54e0: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
54f0: 6e 2e 38 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.8 {.      SELE
5500: 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20 20  CT * FROM a.    
5510: 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68  } {double-you wh
5520: 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66 72  y zed won too fr
5530: 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73  ee}.    do_execs
5540: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  ql_test pager1-4
5550: 2e 34 2e 24 74 6e 2e 39 20 7b 0a 20 20 20 20 20  .4.$tn.9 {.     
5560: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
5570: 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20  .    } {won too 
5580: 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75 20  free double-you 
5590: 77 68 79 20 7a 65 64 7d 0a 20 20 7d 0a 0a 20 20  why zed}.  }..  
55a0: 63 64 20 24 70 77 64 0a 7d 0a 64 62 20 63 6c 6f  cd $pwd.}.db clo
55b0: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 66 6f 72  se.tv delete.for
55c0: 63 65 64 65 6c 65 74 65 20 24 64 69 72 6e 61 6d  cedelete $dirnam
55d0: 65 0a 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56  e...# Set up a V
55e0: 46 53 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  FS to make a cop
55f0: 79 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  y of the file-sy
5600: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
5610: 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20 6a 6f   deleting a.# jo
5620: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 63 6f  urnal file to co
5630: 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
5640: 6f 6e 2e 20 54 68 65 20 74 72 61 6e 73 61 63 74  on. The transact
5650: 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65 78 61  ion modifies exa
5660: 63 74 6c 79 0a 23 20 74 77 6f 20 64 61 74 61 62  ctly.# two datab
5670: 61 73 65 20 70 61 67 65 73 20 28 61 6e 64 20 70  ase pages (and p
5680: 61 67 65 20 31 20 2d 20 74 68 65 20 63 68 61 6e  age 1 - the chan
5690: 67 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23 0a 74  ge counter)..#.t
56a0: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
56b0: 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69  lt 1.tv sectorsi
56c0: 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69 70 74  ze 512.tv script
56d0: 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c   copy_on_journal
56e0: 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65  _delete.tv filte
56f0: 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63  r xDelete.proc c
5700: 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64  opy_on_journal_d
5710: 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69  elete {method fi
5720: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
5730: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
5740: 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c  ch *journal $fil
5750: 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d  ename]} faultsim
5760: 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20  _save .  return 
5770: 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c  SQLITE_OK.}.faul
5780: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
5790: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
57a0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
57b0: 35 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a  5.1 {.  PRAGMA j
57c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
57d0: 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 70  LETE;.  PRAGMA p
57e0: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
57f0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
5800: 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41  t1(a, b);.  CREA
5810: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
5820: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
5830: 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c 20   t1 VALUES('I', 
5840: 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  'II');.  INSERT 
5850: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
5860: 49 49 49 27 2c 20 27 49 56 27 29 3b 0a 20 20 42  III', 'IV');.  B
5870: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
5880: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
5890: 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 2);.    INSER
58a0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
58b0: 28 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d 49 54  (3, 4);.  COMMIT
58c0: 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20  ;.} {delete}.tv 
58d0: 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65  filter {}..# Che
58e0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
58f0: 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
5900: 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  :.#.do_execsql_t
5910: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32  est pager1.4.5.2
5920: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
5930: 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20  OM t1;.  SELECT 
5940: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20  * FROM t2;.} {I 
5950: 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33 20  II 1 2 III IV 3 
5960: 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f  4}..# Now try fo
5970: 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70  ur tests:.#.#  p
5980: 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73  ager1-4.5.3: Res
5990: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
59a0: 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74  stem. Check that
59b0: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
59c0: 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20  action .#       
59d0: 20 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c           is roll
59e0: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
59f0: 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74  ger1-4.5.4: Rest
5a00: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
5a10: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
5a20: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
5a30: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
5a40: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43        journal. C
5a50: 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  heck the transac
5a60: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c  tion is not roll
5a70: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
5a80: 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74  ger1-4.5.5: Rest
5a90: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
5aa0: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
5ab0: 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69   second record i
5ac0: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  n the.#         
5ad0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20         journal. 
5ae0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66  Check that the f
5af0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74  irst record in t
5b00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
5b10: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s .#            
5b20: 20 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c      played back,
5b30: 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63   but not the sec
5b40: 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31  ond..#.#  pager1
5b50: 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20  -4.5.6: Restore 
5b60: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
5b70: 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65   Try to open the
5b80: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61   database with a
5b90: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5ba0: 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65    readonly conne
5bb0: 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75  ction. This shou
5bc0: 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65  ld fail, as a re
5bd0: 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20  ad-only.#       
5be0: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
5bf0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20  ion cannot roll 
5c00: 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
5c10: 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73  e file..#.faults
5c20: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5c30: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
5c40: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5c50: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .3 {.  SELECT * 
5c60: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
5c70: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
5c80: 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75  I II III IV}.fau
5c90: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
5ca0: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
5cb0: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
5cc0: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
5cd0: 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32  +1024 - 202] 012
5ce0: 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f  3456789ABCDEF.do
5cf0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5d00: 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53  ger1.4.5.4 {.  S
5d10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
5d20: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5d30: 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32   t2;.} {I II 1 2
5d40: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75   III IV 3 4}.fau
5d50: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
5d60: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
5d70: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
5d80: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
5d90: 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d  +1024+4+4+1024 -
5da0: 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39   202] 0123456789
5db0: 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71  ABCDEF.do_execsq
5dc0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5dd0: 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.5 {.  SELECT *
5de0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5df0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5e00: 7b 49 20 49 49 20 49 49 49 20 49 56 20 33 20 34  {I II III IV 3 4
5e10: 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  }..faultsim_rest
5e20: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ore_and_reopen.d
5e30: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20  b close.sqlite3 
5e40: 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64  db test.db -read
5e50: 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73  only 1.do_catchs
5e60: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5e70: 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.6 {.  SELECT 
5e80: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
5e90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
5ea0: 20 7b 31 20 7b 61 74 74 65 6d 70 74 20 74 6f 20   {1 {attempt to 
5eb0: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
5ec0: 20 64 61 74 61 62 61 73 65 7d 7d 0a 64 62 20 63   database}}.db c
5ed0: 6c 6f 73 65 0a 0a 23 20 53 6e 61 70 73 68 6f 74  lose..# Snapshot
5ee0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5ef0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 6d 75 6c   just before mul
5f00: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 2e 20  ti-file commit. 
5f10: 53 61 76 65 20 74 68 65 20 6e 61 6d 65 0a 23 20  Save the name.# 
5f20: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
5f30: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 24 3a  urnal file in $:
5f40: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 0a 23 0a  :mj_filename..#.
5f50: 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f  tv script copy_o
5f60: 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 74 76 20 66  n_mj_delete.tv f
5f70: 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70 72  ilter xDelete.pr
5f80: 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65  oc copy_on_mj_de
5f90: 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c  lete {method fil
5fa0: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
5fb0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
5fc0: 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61 69  h *mj* [file tai
5fd0: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b  l $filename]]} {
5fe0: 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f 66   .    set ::mj_f
5ff0: 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d  ilename $filenam
6000: 65 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73  e.    faultsim_s
6010: 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave .  }.  retur
6020: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 64 6f  n SQLITE_OK.}.do
6030: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36  _test pager1.4.6
6040: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
6050: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
6060: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
6070: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
6080: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
6090: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
60a0: 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20  .db2' AS two;.  
60b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
60c0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
60d0: 41 54 45 20 54 41 42 4c 45 20 74 77 6f 2e 74 32  ATE TABLE two.t2
60e0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
60f0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6100: 53 28 31 2c 20 27 74 31 2e 31 27 29 3b 0a 20 20  S(1, 't1.1');.  
6110: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
6120: 20 56 41 4c 55 45 53 28 31 2c 20 27 74 32 2e 31   VALUES(1, 't2.1
6130: 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ');.    BEGIN;. 
6140: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
6150: 45 54 20 62 20 3d 20 27 74 31 2e 32 27 3b 0a 20  ET b = 't1.2';. 
6160: 20 20 20 20 20 55 50 44 41 54 45 20 74 32 20 53       UPDATE t2 S
6170: 45 54 20 62 20 3d 20 27 74 32 2e 32 27 3b 0a 20  ET b = 't2.2';. 
6180: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
6190: 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 20 20   tv filter {}.  
61a0: 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 66  db close.} {}..f
61b0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
61c0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78  and_reopen.do_ex
61d0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
61e0: 31 2e 34 2e 36 2e 32 20 7b 20 53 45 4c 45 43 54  1.4.6.2 { SELECT
61f0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20   * FROM t1 }    
6200: 20 20 20 20 20 20 20 7b 31 20 74 31 2e 31 7d 0a         {1 t1.1}.
6210: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
6220: 70 61 67 65 72 31 2e 34 2e 36 2e 33 20 7b 20 66  pager1.4.6.3 { f
6230: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
6240: 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b 31 7d 0a  _filename } {1}.
6250: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6260: 70 61 67 65 72 31 2e 34 2e 36 2e 34 20 7b 0a 20  pager1.4.6.4 {. 
6270: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
6280: 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 53 45 4c  2' AS two;.  SEL
6290: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
62a0: 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65 73   {1 t2.1}.do_tes
62b0: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 35 20 7b  t pager1.4.6.5 {
62c0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
62d0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b 30  mj_filename } {0
62e0: 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  }..faultsim_rest
62f0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ore_and_reopen.d
6300: 62 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  b close.do_test 
6310: 70 61 67 65 72 31 2e 34 2e 36 2e 38 20 7b 0a 20  pager1.4.6.8 {. 
6320: 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61   set ::mj_filena
6330: 6d 65 31 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  me1 $::mj_filena
6340: 6d 65 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78  me.  tv filter x
6350: 44 65 6c 65 74 65 0a 20 20 73 71 6c 69 74 65 33  Delete.  sqlite3
6360: 20 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20 65   db test.db2.  e
6370: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
6380: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
6390: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 41   = DELETE;.    A
63a0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 33 27  TTACH 'test.db3'
63b0: 20 41 53 20 74 68 72 65 65 3b 0a 20 20 20 20 43   AS three;.    C
63c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 68 72 65  REATE TABLE thre
63d0: 65 2e 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20  e.t3(a, b);.    
63e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
63f0: 41 4c 55 45 53 28 31 2c 20 27 74 33 2e 31 27 29  ALUES(1, 't3.1')
6400: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
6410: 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45 54     UPDATE t2 SET
6420: 20 62 20 3d 20 27 74 32 2e 33 27 3b 0a 20 20 20   b = 't2.3';.   
6430: 20 20 20 55 50 44 41 54 45 20 74 33 20 53 45 54     UPDATE t3 SET
6440: 20 62 20 3d 20 27 74 33 2e 33 27 3b 0a 20 20 20   b = 't3.3';.   
6450: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65   COMMIT;.  }.  e
6460: 78 70 72 20 7b 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  xpr {$::mj_filen
6470: 61 6d 65 31 20 21 3d 20 24 3a 3a 6d 6a 5f 66 69  ame1 != $::mj_fi
6480: 6c 65 6e 61 6d 65 7d 0a 7d 20 7b 31 7d 0a 66 61  lename}.} {1}.fa
6490: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
64a0: 6e 64 5f 72 65 6f 70 65 6e 0a 74 76 20 66 69 6c  nd_reopen.tv fil
64b0: 74 65 72 20 7b 7d 0a 0a 23 20 54 68 65 20 66 69  ter {}..# The fi
64c0: 6c 65 2d 73 79 73 74 65 6d 20 6e 6f 77 20 63 6f  le-system now co
64d0: 6e 74 61 69 6e 73 3a 0a 23 0a 23 20 20 20 2a 20  ntains:.#.#   * 
64e0: 74 68 72 65 65 20 64 61 74 61 62 61 73 65 73 0a  three databases.
64f0: 23 20 20 20 2a 20 74 68 72 65 65 20 68 6f 74 2d  #   * three hot-
6500: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 23 20  journal files.# 
6510: 20 20 2a 20 74 77 6f 20 6d 61 73 74 65 72 2d 6a    * two master-j
6520: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23 0a  ournal files..#.
6530: 23 20 54 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  # The hot-journa
6540: 6c 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ls associated wi
6550: 74 68 20 74 65 73 74 2e 64 62 32 20 61 6e 64 20  th test.db2 and 
6560: 74 65 73 74 2e 64 62 33 20 70 6f 69 6e 74 20 74  test.db3 point t
6570: 6f 0a 23 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  o.# master journ
6580: 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  al $::mj_filenam
6590: 65 2e 20 54 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  e. The hot-journ
65a0: 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  al file associat
65b0: 65 64 20 77 69 74 68 0a 23 20 74 65 73 74 2e 64  ed with.# test.d
65c0: 62 20 70 6f 69 6e 74 73 20 74 6f 20 6d 61 73 74  b points to mast
65d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a  er journal $::mj
65e0: 5f 66 69 6c 65 6e 61 6d 65 31 2e 20 53 6f 20 72  _filename1. So r
65f0: 65 61 64 69 6e 67 20 66 72 6f 6d 0a 23 20 74 65  eading from.# te
6600: 73 74 2e 64 62 20 73 68 6f 75 6c 64 20 64 65 6c  st.db should del
6610: 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  ete $::mj_filena
6620: 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  me1..#.do_test p
6630: 61 67 65 72 31 2e 34 2e 36 2e 39 20 7b 0a 20 20  ager1.4.6.9 {.  
6640: 6c 73 6f 72 74 20 5b 67 6c 6f 62 20 74 65 73 74  lsort [glob test
6650: 2e 64 62 2a 5d 0a 7d 20 5b 6c 73 6f 72 74 20 5b  .db*].} [lsort [
6660: 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
6690: 0a 20 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  .  test.db test.
66a0: 64 62 32 20 74 65 73 74 2e 64 62 33 20 20 20 20  db2 test.db3    
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 65            \.  te
66d0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65  st.db-journal te
66e0: 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 74  st.db2-journal t
66f0: 65 73 74 2e 64 62 33 2d 6a 6f 75 72 6e 61 6c 20  est.db3-journal 
6700: 20 20 20 20 20 5c 0a 20 20 5b 66 69 6c 65 20 74       \.  [file t
6710: 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  ail $::mj_filena
6720: 6d 65 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  me] [file tail $
6730: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 5d 0a  ::mj_filename1].
6740: 5d 5d 0a 0a 23 20 54 68 65 20 6d 61 73 74 65 72  ]]..# The master
6750: 2d 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66  -journal $::mj_f
6760: 69 6c 65 6e 61 6d 65 31 20 63 6f 6e 74 61 69 6e  ilename1 contain
6770: 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 65  s pointers to te
6780: 73 74 2e 64 62 20 61 6e 64 20 0a 23 20 74 65 73  st.db and .# tes
6790: 74 2e 64 62 32 2e 20 48 6f 77 65 76 65 72 20 74  t.db2. However t
67a0: 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61  he hot-journal a
67b0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
67c0: 65 73 74 2e 64 62 32 20 70 6f 69 6e 74 73 20 74  est.db2 points t
67d0: 6f 0a 23 20 61 20 64 69 66 66 65 72 65 6e 74 20  o.# a different 
67e0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 20  master-journal. 
67f0: 54 68 65 72 65 66 6f 72 65 2c 20 72 65 61 64 69  Therefore, readi
6800: 6e 67 20 66 72 6f 6d 20 74 65 73 74 2e 64 62 20  ng from test.db 
6810: 6f 6e 6c 79 20 73 68 6f 75 6c 64 0a 23 20 62 65  only should.# be
6820: 20 65 6e 6f 75 67 68 20 74 6f 20 63 61 75 73 65   enough to cause
6830: 20 53 51 4c 69 74 65 20 74 6f 20 64 65 6c 65 74   SQLite to delet
6840: 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  e $::mj_filename
6850: 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 20 20 20  1..#.do_test    
6860: 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e       pager1.4.6.
6870: 31 30 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  10 { file exists
6880: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20   $::mj_filename 
6890: 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 20   } {1}.do_test  
68a0: 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e         pager1.4.
68b0: 36 2e 31 31 20 7b 20 66 69 6c 65 20 65 78 69 73  6.11 { file exis
68c0: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  ts $::mj_filenam
68d0: 65 31 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63  e1 } {1}.do_exec
68e0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
68f0: 34 2e 36 2e 31 32 20 7b 20 53 45 4c 45 43 54 20  4.6.12 { SELECT 
6900: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20 74  * FROM t1 } {1 t
6910: 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20  1.1}.do_test    
6920: 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e       pager1.4.6.
6930: 31 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  13 { file exists
6940: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20   $::mj_filename 
6950: 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 20   } {1}.do_test  
6960: 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e         pager1.4.
6970: 36 2e 31 34 20 7b 20 66 69 6c 65 20 65 78 69 73  6.14 { file exis
6980: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  ts $::mj_filenam
6990: 65 31 20 7d 20 7b 30 7d 0a 0a 64 6f 5f 65 78 65  e1 } {0}..do_exe
69a0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
69b0: 2e 34 2e 36 2e 31 32 20 7b 0a 20 20 41 54 54 41  .4.6.12 {.  ATTA
69c0: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
69d0: 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a   two;.  SELECT *
69e0: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74   FROM t2;.} {1 t
69f0: 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20  2.1}.do_test    
6a00: 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e       pager1.4.6.
6a10: 31 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  13 { file exists
6a20: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20   $::mj_filename 
6a30: 7d 20 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71  }  {1}.do_execsq
6a40: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
6a50: 36 2e 31 34 20 7b 0a 20 20 41 54 54 41 43 48 20  6.14 {.  ATTACH 
6a60: 27 74 65 73 74 2e 64 62 33 27 20 41 53 20 74 68  'test.db3' AS th
6a70: 72 65 65 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  ree;.  SELECT * 
6a80: 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 31 20 74 33  FROM t3;.} {1 t3
6a90: 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20  .1}.do_test     
6aa0: 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31      pager1.4.6.1
6ab0: 35 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  5 { file exists 
6ac0: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d  $::mj_filename }
6ad0: 20 20 7b 30 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a    {0}..db close.
6ae0: 74 76 20 64 65 6c 65 74 65 0a 0a 74 65 73 74 76  tv delete..testv
6af0: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
6b00: 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 35  .tv sectorsize 5
6b10: 31 32 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70  12.tv script cop
6b20: 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c  y_on_journal_del
6b30: 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78 44  ete.tv filter xD
6b40: 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f  elete.proc copy_
6b50: 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74  on_journal_delet
6b60: 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61  e {method filena
6b70: 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20  me args} {.  if 
6b80: 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a  {[string match *
6b90: 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e 61 6d  journal $filenam
6ba0: 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  e]} faultsim_sav
6bb0: 65 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e .  return SQLI
6bc0: 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d  TE_OK.}.faultsim
6bd0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
6be0: 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  en.do_execsql_te
6bf0: 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e 31 20  st pager1.4.7.1 
6c00: 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  {.  PRAGMA journ
6c10: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
6c20: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
6c30: 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45   t1(x PRIMARY KE
6c40: 59 2c 20 79 29 3b 0a 20 20 43 52 45 41 54 45 20  Y, y);.  CREATE 
6c50: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 79  INDEX i1 ON t1(y
6c60: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
6c70: 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c 20   t1 VALUES('I', 
6c80: 20 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53 45    'one');.  INSE
6c90: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6ca0: 53 28 27 49 49 27 2c 20 20 27 66 6f 75 72 27 29  S('II',  'four')
6cb0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
6cc0: 74 31 20 56 41 4c 55 45 53 28 27 49 49 49 27 2c  t1 VALUES('III',
6cd0: 20 27 6e 69 6e 65 27 29 3b 0a 20 20 42 45 47 49   'nine');.  BEGI
6ce0: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
6cf0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 56  TO t1 VALUES('IV
6d00: 27 2c 20 27 73 69 78 74 65 65 6e 27 29 3b 0a 20  ', 'sixteen');. 
6d10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6d20: 31 20 56 41 4c 55 45 53 28 27 56 27 20 2c 20 27  1 VALUES('V' , '
6d30: 74 77 65 6e 74 79 66 69 76 65 27 29 3b 0a 20 20  twentyfive');.  
6d40: 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65 6c 65 74  COMMIT;.} {delet
6d50: 65 7d 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a  e}.tv filter {}.
6d60: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
6d70: 74 65 20 0a 63 61 74 63 68 20 7b 0a 20 20 74 65  te .catch {.  te
6d80: 73 74 5f 73 79 73 63 61 6c 6c 20 69 6e 73 74 61  st_syscall insta
6d90: 6c 6c 20 66 63 68 6d 6f 64 0a 20 20 74 65 73 74  ll fchmod.  test
6da0: 5f 73 79 73 63 61 6c 6c 20 66 61 75 6c 74 20 31  _syscall fault 1
6db0: 20 31 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   1.}.do_test pag
6dc0: 65 72 31 2e 34 2e 37 2e 32 20 7b 0a 20 20 66 61  er1.4.7.2 {.  fa
6dd0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
6de0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 63 61 74 63  nd_reopen.  catc
6df0: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
6e00: 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  es test.db-journ
6e10: 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20  al -permissions 
6e20: 72 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74  r--------}.  cat
6e30: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6e40: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
6e50: 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 31 7d  nal -readonly 1}
6e60: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
6e70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
6e80: 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f  .} {1 {unable to
6e90: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
6ea0: 69 6c 65 7d 7d 0a 63 61 74 63 68 20 7b 0a 20 20  ile}}.catch {.  
6eb0: 74 65 73 74 5f 73 79 73 63 61 6c 6c 20 72 65 73  test_syscall res
6ec0: 65 74 0a 20 20 74 65 73 74 5f 73 79 73 63 61 6c  et.  test_syscal
6ed0: 6c 20 66 61 75 6c 74 20 30 20 30 0a 7d 0a 64 6f  l fault 0 0.}.do
6ee0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37  _test pager1.4.7
6ef0: 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .3 {.  db close.
6f00: 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74    catch {file at
6f10: 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62  tributes test.db
6f20: 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69 73  -journal -permis
6f30: 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d  sions rw-rw-rw-}
6f40: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
6f50: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
6f60: 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64 6f  b-journal -reado
6f70: 6e 6c 79 20 30 7d 0a 20 20 64 65 6c 65 74 65 5f  nly 0}.  delete_
6f80: 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  file test.db-jou
6f90: 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65 78 69 73  rnal.  file exis
6fa0: 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
6fb0: 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74  al.} {0}.do_test
6fc0: 20 70 61 67 65 72 31 2e 34 2e 38 2e 31 20 7b 0a   pager1.4.8.1 {.
6fd0: 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74    catch {file at
6fe0: 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62  tributes test.db
6ff0: 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72 2d   -permissions r-
7000: 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63 68  -------}.  catch
7010: 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65   {file attribute
7020: 73 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f  s test.db -reado
7030: 6e 6c 79 20 31 7d 0a 20 20 73 71 6c 69 74 65 33  nly 1}.  sqlite3
7040: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62   db test.db.  db
7050: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a   eval { SELECT *
7060: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71 6c   FROM t1 }.  sql
7070: 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
7080: 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 31 7d 0a 64   db main.} {1}.d
7090: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
70a0: 38 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  8.2 {.  sqlite3_
70b0: 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 78  db_readonly db x
70c0: 79 7a 0a 7d 20 7b 2d 31 7d 0a 64 6f 5f 74 65 73  yz.} {-1}.do_tes
70d0: 74 20 70 61 67 65 72 31 2e 34 2e 38 2e 33 20 7b  t pager1.4.8.3 {
70e0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61  .  db close.  ca
70f0: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
7100: 75 74 65 73 20 74 65 73 74 2e 64 62 20 2d 72 65  utes test.db -re
7110: 61 64 6f 6e 6c 79 20 30 7d 0a 20 20 63 61 74 63  adonly 0}.  catc
7120: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
7130: 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72 6d  es test.db -perm
7140: 69 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77  issions rw-rw-rw
7150: 2d 7d 20 6d 73 67 0a 20 20 73 71 6c 69 74 65 33  -} msg.  sqlite3
7160: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62   db test.db.  db
7170: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a   eval { SELECT *
7180: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71 6c   FROM t1 }.  sql
7190: 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
71a0: 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 30 7d 0a 0a   db main.} {0}..
71b0: 23 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 2d 2d 2d 2d 2d  ----------------
71f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
7200: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
7210: 20 64 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69   deal with multi
7220: 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a 23  -file commits..#
7230: 0a 23 20 70 61 67 65 72 31 2d 35 2e 31 2e 2a 3a  .# pager1-5.1.*:
7240: 20 54 68 65 20 63 61 73 65 20 77 68 65 72 65 20   The case where 
7250: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 61 6e  a multi-file can
7260: 6e 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  not be committed
7270: 20 62 65 63 61 75 73 65 0a 23 20 20 20 20 20 20   because.#      
7280: 20 20 20 20 20 20 20 20 20 61 6e 6f 74 68 65 72           another
7290: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
72a0: 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44 20  olding a SHARED 
72b0: 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  lock on one of t
72c0: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
72d0: 20 20 20 66 69 6c 65 73 2e 20 41 66 74 65 72 20     files. After 
72e0: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  the SHARED lock 
72f0: 69 73 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 20  is removed, the 
7300: 43 4f 4d 4d 49 54 20 73 75 63 63 65 65 64 73 2e  COMMIT succeeds.
7310: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 32 2e  .#.# pager1-5.2.
7320: 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  *: Multi-file co
7330: 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e  mmits with journ
7340: 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a  al_mode=memory..
7350: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 33 2e 2a  #.# pager1-5.3.*
7360: 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  : Multi-file com
7370: 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e 61  mits with journa
7380: 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23  l_mode=memory..#
7390: 0a 23 20 70 61 67 65 72 31 2d 35 2e 34 2e 2a 3a  .# pager1-5.4.*:
73a0: 20 43 68 65 63 6b 20 74 68 61 74 20 77 69 74 68   Check that with
73b0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f 72   synchronous=nor
73c0: 6d 61 6c 2c 20 74 68 65 20 6d 61 73 74 65 72 2d  mal, the master-
73d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20  journal file.#  
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
73f0: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 61 20  e is added to a 
7400: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
7410: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74  ediately after t
7420: 68 65 20 6c 61 73 74 0a 23 20 20 20 20 20 20 20  he last.#       
7430: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
7440: 72 65 63 6f 72 64 2e 20 42 75 74 20 77 69 74 68  record. But with
7450: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75 6c   synchronous=ful
7460: 6c 2c 20 65 78 74 72 61 20 75 6e 75 73 65 64 20  l, extra unused 
7470: 73 70 61 63 65 0a 23 20 20 20 20 20 20 20 20 20  space.#         
7480: 20 20 20 20 20 20 69 73 20 61 6c 6c 6f 63 61 74        is allocat
7490: 65 64 20 62 65 74 77 65 65 6e 20 74 68 65 20 6c  ed between the l
74a0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
74b0: 72 64 20 61 6e 64 20 74 68 65 20 0a 23 20 20 20  rd and the .#   
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 74              mast
74d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
74e0: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 74 68 65  name so that the
74f0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7500: 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20  file.#          
7510: 20 20 20 20 20 6e 61 6d 65 20 64 6f 65 73 20 6e       name does n
7520: 6f 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 73 61  ot lie on the sa
7530: 6d 65 20 73 65 63 74 6f 72 20 61 73 20 74 68 65  me sector as the
7540: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 66 69   last journal fi
7550: 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  le.#            
7560: 20 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23 20 70     record..#.# p
7570: 61 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43 68 65  ager1-5.5.*: Che
7580: 63 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75 72 6e  ck that in journ
7590: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 20  al_mode=PERSIST 
75a0: 6d 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61 6c 20  mode, a journal 
75b0: 66 69 6c 65 20 69 73 0a 23 20 20 20 20 20 20 20  file is.#       
75c0: 20 20 20 20 20 20 20 20 74 72 75 6e 63 61 74 65          truncate
75d0: 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
75e0: 77 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c  when a multi-fil
75f0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
7600: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
7610: 20 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e 73    committed (ins
7620: 74 65 61 64 20 6f 66 20 74 68 65 20 66 69 72 73  tead of the firs
7630: 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
7640: 73 20 62 65 69 6e 67 20 7a 65 72 6f 65 64 29 2e  s being zeroed).
7650: 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  .#.#.do_test pag
7660: 65 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20 66 61  er1-5.1.1 {.  fa
7670: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
7680: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
7690: 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20  ql {.    ATTACH 
76a0: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75  'test.db2' AS au
76b0: 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  x;.    CREATE TA
76c0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
76d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
76e0: 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  ux.t2(a, b);.   
76f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
7700: 56 41 4c 55 45 53 28 31 37 2c 20 27 4c 65 6e 69  VALUES(17, 'Leni
7710: 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  n');.    INSERT 
7720: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
7730: 32 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a 20 20  2, 'Stalin');.  
7740: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7750: 20 56 41 4c 55 45 53 28 35 33 2c 20 27 4b 68 72   VALUES(53, 'Khr
7760: 75 73 68 63 68 65 76 27 29 3b 0a 20 20 7d 0a 7d  ushchev');.  }.}
7770: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65   {}.do_test page
7780: 72 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65 78 65  r1-5.1.2 {.  exe
7790: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
77a0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
77b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 34  NTO t1 VALUES(64
77c0: 2c 20 27 42 72 65 7a 68 6e 65 76 27 29 3b 0a 20  , 'Brezhnev');. 
77d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
77e0: 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t2 SELECT * FRO
77f0: 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  M t1;.  }.  sqli
7800: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32  te3 db2 test.db2
7810: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7820: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 45   BEGIN;.      SE
7830: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
7840: 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f    } db2.} {}.do_
7850: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e  test pager1-5.1.
7860: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43  3 {.  catchsql C
7870: 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61 74 61  OMMIT.} {1 {data
7880: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
7890: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
78a0: 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  5.1.4 {.  execsq
78b0: 6c 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20 20 65  l COMMIT db2.  e
78c0: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20  xecsql COMMIT.  
78d0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
78e0: 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32   * FROM t2 } db2
78f0: 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32 32 20  .} {17 Lenin 22 
7900: 53 74 61 6c 69 6e 20 35 33 20 4b 68 72 75 73 68  Stalin 53 Khrush
7910: 63 68 65 76 20 36 34 20 42 72 65 7a 68 6e 65 76  chev 64 Brezhnev
7920: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
7930: 2d 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32 20 63  -5.1.5 {.  db2 c
7940: 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  lose.} {}..do_te
7950: 73 74 20 70 61 67 65 72 31 2d 35 2e 32 2e 31 20  st pager1-5.2.1 
7960: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
7970: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
7980: 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 3b 0a  _mode = memory;.
7990: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
79a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
79b0: 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72  VALUES(84, 'Andr
79c0: 6f 70 6f 76 27 29 3b 0a 20 20 20 20 20 20 49 4e  opov');.      IN
79d0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
79e0: 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f  UES(84, 'Andropo
79f0: 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  v');.    COMMIT;
7a00: 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d 0a  .  }.} {memory}.
7a10: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
7a20: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
7a30: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
7a40: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66  urnal_mode = off
7a50: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
7a60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7a70: 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f  1 VALUES(85, 'Go
7a80: 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20  rbachev');.     
7a90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
7aa0: 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62  VALUES(85, 'Gorb
7ab0: 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d  achev');.    COM
7ac0: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66 7d  MIT;.  }.} {off}
7ad0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
7ae0: 2d 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20 63 6c  -5.4.1 {.  db cl
7af0: 6f 73 65 0a 20 20 74 65 73 74 76 66 73 20 74 76  ose.  testvfs tv
7b00: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
7b10: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20  st.db -vfs tv.  
7b20: 65 78 65 63 73 71 6c 20 7b 20 41 54 54 41 43 48  execsql { ATTACH
7b30: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
7b40: 75 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c 74 65  ux }..  tv filte
7b50: 72 20 78 44 65 6c 65 74 65 0a 20 20 74 76 20 73  r xDelete.  tv s
7b60: 63 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72 6e 61  cript max_journa
7b70: 6c 5f 73 69 7a 65 0a 20 20 74 76 20 73 65 63 74  l_size.  tv sect
7b80: 6f 72 73 69 7a 65 20 35 31 32 0a 20 20 73 65 74  orsize 512.  set
7b90: 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30   ::max_journal 0
7ba0: 0a 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f 75 72  .  proc max_jour
7bb0: 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68 6f 64  nal_size {method
7bc0: 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74   args} {.    set
7bd0: 20 73 7a 20 30 0a 20 20 20 20 63 61 74 63 68 20   sz 0.    catch 
7be0: 7b 20 73 65 74 20 73 7a 20 5b 66 69 6c 65 20 73  { set sz [file s
7bf0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
7c00: 6e 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20 7b 24  nal] }.    if {$
7c10: 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75 72  sz > $::max_jour
7c20: 6e 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  nal} {.      set
7c30: 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 24   ::max_journal $
7c40: 73 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  sz.    }.    ret
7c50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  urn SQLITE_OK.  
7c60: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
7c70: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
7c80: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
7c90: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
7ca0: 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b  ronous = NORMAL;
7cb0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7cc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7cd0: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
7ce0: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20 20  bachev');.      
7cf0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
7d00: 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61  ALUES(85, 'Gorba
7d10: 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d  chev');.    COMM
7d20: 49 54 3b 0a 20 20 7d 0a 0a 20 20 23 20 54 68 65  IT;.  }..  # The
7d30: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
7d40: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 77  rnal file is now
7d50: 3a 0a 20 20 23 20 0a 20 20 23 20 20 20 31 29 20  :.  # .  #   1) 
7d60: 35 31 32 20 62 79 74 65 20 68 65 61 64 65 72 20  512 byte header 
7d70: 2b 0a 20 20 23 20 20 20 32 29 20 32 20 2a 20 28  +.  #   2) 2 * (
7d80: 31 30 32 34 2b 38 29 20 62 79 74 65 20 72 65 63  1024+8) byte rec
7d90: 6f 72 64 73 20 2b 0a 20 20 23 20 20 20 33 29 20  ords +.  #   3) 
7da0: 32 30 2b 4e 20 62 79 74 65 73 20 6f 66 20 6d 61  20+N bytes of ma
7db0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
7dc0: 6e 74 65 72 2c 20 77 68 65 72 65 20 4e 20 69 73  nter, where N is
7dd0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 0a 20 20   the size of .  
7de0: 23 20 20 20 20 20 20 74 68 65 20 6d 61 73 74 65  #      the maste
7df0: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 65  r-journal name e
7e00: 6e 63 6f 64 65 64 20 61 73 20 75 74 66 2d 38 20  ncoded as utf-8 
7e10: 77 69 74 68 20 6e 6f 20 6e 75 6c 20 74 65 72 6d  with no nul term
7e20: 2e 0a 20 20 23 0a 20 20 73 65 74 20 6d 6a 5f 70  ..  #.  set mj_p
7e30: 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b 0a 20  ointer [expr {. 
7e40: 20 20 20 32 30 20 2b 20 5b 73 74 72 69 6e 67 20     20 + [string 
7e50: 6c 65 6e 67 74 68 20 22 74 65 73 74 2e 64 62 2d  length "test.db-
7e60: 6d 6a 58 58 58 58 58 58 39 58 58 22 5d 0a 20 20  mjXXXXXX9XX"].  
7e70: 7d 5d 0a 20 20 23 0a 20 20 23 20 20 20 4e 4f 54  }].  #.  #   NOT
7e80: 45 3a 20 46 6f 72 20 69 74 65 6d 20 33 20 61 62  E: For item 3 ab
7e90: 6f 76 65 2c 20 69 66 20 74 68 65 20 63 75 72 72  ove, if the curr
7ea0: 65 6e 74 20 53 51 4c 69 74 65 20 56 46 53 20 6c  ent SQLite VFS l
7eb0: 61 63 6b 73 20 74 68 65 20 63 6f 6e 63 65 70 74  acks the concept
7ec0: 20 6f 66 20 61 0a 20 20 23 20 20 20 20 20 20 20   of a.  #       
7ed0: 20 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74    current direct
7ee0: 6f 72 79 2c 20 74 68 65 20 6c 65 6e 67 74 68 20  ory, the length 
7ef0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  of the current d
7f00: 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 70 6c  irectory name pl
7f10: 75 73 20 31 0a 20 20 23 20 20 20 20 20 20 20 20  us 1.  #        
7f20: 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 74   character for t
7f30: 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 65 70  he directory sep
7f40: 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
7f50: 20 61 72 65 20 4e 4f 54 20 63 6f 75 6e 74 65 64   are NOT counted
7f60: 20 61 73 0a 20 20 23 20 20 20 20 20 20 20 20 20   as.  #         
7f70: 70 61 72 74 20 6f 66 20 74 68 65 20 74 6f 74 61  part of the tota
7f80: 6c 20 73 69 7a 65 3b 20 6f 74 68 65 72 77 69 73  l size; otherwis
7f90: 65 2c 20 74 68 65 79 20 61 72 65 2e 0a 20 20 23  e, they are..  #
7fa0: 0a 20 20 69 66 63 61 70 61 62 6c 65 20 63 75 72  .  ifcapable cur
7fb0: 64 69 72 20 7b 0a 20 20 20 20 73 65 74 20 6d 6a  dir {.    set mj
7fc0: 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b  _pointer [expr {
7fd0: 24 6d 6a 5f 70 6f 69 6e 74 65 72 20 2b 20 5b 73  $mj_pointer + [s
7fe0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67 65  tring length [ge
7ff0: 74 5f 70 77 64 5d 5d 20 2b 20 31 7d 5d 0a 20 20  t_pwd]] + 1}].  
8000: 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 61 78  }.  expr {$::max
8010: 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 35 31 32 2b 32  _journal==(512+2
8020: 2a 28 31 30 32 34 2b 38 29 2b 24 6d 6a 5f 70 6f  *(1024+8)+$mj_po
8030: 69 6e 74 65 72 29 7d 0a 7d 20 31 0a 64 6f 5f 74  inter)}.} 1.do_t
8040: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 32  est pager1-5.4.2
8050: 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a   {.  set ::max_j
8060: 6f 75 72 6e 61 6c 20 30 0a 20 20 65 78 65 63 73  ournal 0.  execs
8070: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
8080: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75  synchronous = fu
8090: 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ll;.    BEGIN;. 
80a0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
80b0: 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27 4c   t1 WHERE b = 'L
80c0: 65 6e 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c  enin';.      DEL
80d0: 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52  ETE FROM t2 WHER
80e0: 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20  E b = 'Lenin';. 
80f0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a     COMMIT;.  }..
8100: 20 20 23 20 49 6e 20 73 79 6e 63 68 72 6f 6e 6f    # In synchrono
8110: 75 73 3d 66 75 6c 6c 20 6d 6f 64 65 2c 20 74 68  us=full mode, th
8120: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
8130: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
8140: 77 72 69 74 74 65 6e 0a 20 20 23 20 64 69 72 65  written.  # dire
8150: 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c  ctly after the l
8160: 61 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68  ast record in th
8170: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
8180: 49 6e 73 74 65 61 64 2c 20 69 74 20 69 73 0a 20  Instead, it is. 
8190: 20 23 20 77 72 69 74 74 65 6e 20 73 74 61 72 74   # written start
81a0: 69 6e 67 20 61 74 20 74 68 65 20 6e 65 78 74 20  ing at the next 
81b0: 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 35 31  (in this case 51
81c0: 32 20 62 79 74 65 29 20 73 65 63 74 6f 72 20 62  2 byte) sector b
81d0: 6f 75 6e 64 61 72 79 2e 0a 20 20 23 0a 20 20 73  oundary..  #.  s
81e0: 65 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b 65  et mj_pointer [e
81f0: 78 70 72 20 7b 0a 20 20 20 20 32 30 20 2b 20 5b  xpr {.    20 + [
8200: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 22 74  string length "t
8210: 65 73 74 2e 64 62 2d 6d 6a 58 58 58 58 58 58 39  est.db-mjXXXXXX9
8220: 58 58 22 5d 0a 20 20 7d 5d 0a 20 20 23 0a 20 20  XX"].  }].  #.  
8230: 23 20 20 20 4e 4f 54 45 3a 20 49 66 20 74 68 65  #   NOTE: If the
8240: 20 63 75 72 72 65 6e 74 20 53 51 4c 69 74 65 20   current SQLite 
8250: 56 46 53 20 6c 61 63 6b 73 20 74 68 65 20 63 6f  VFS lacks the co
8260: 6e 63 65 70 74 20 6f 66 20 61 20 63 75 72 72 65  ncept of a curre
8270: 6e 74 20 64 69 72 65 63 74 6f 72 79 2c 0a 20 20  nt directory,.  
8280: 23 20 20 20 20 20 20 20 20 20 74 68 65 20 6c 65  #         the le
8290: 6e 67 74 68 20 6f 66 20 74 68 65 20 63 75 72 72  ngth of the curr
82a0: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ent directory na
82b0: 6d 65 20 70 6c 75 73 20 31 20 63 68 61 72 61 63  me plus 1 charac
82c0: 74 65 72 20 66 6f 72 20 74 68 65 0a 20 20 23 20  ter for the.  # 
82d0: 20 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72          director
82e0: 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
82f0: 61 63 74 65 72 20 61 72 65 20 4e 4f 54 20 63 6f  acter are NOT co
8300: 75 6e 74 65 64 20 61 73 20 70 61 72 74 20 6f 66  unted as part of
8310: 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 23 20 20   the total.  #  
8320: 20 20 20 20 20 20 20 73 69 7a 65 3b 20 6f 74 68         size; oth
8330: 65 72 77 69 73 65 2c 20 74 68 65 79 20 61 72 65  erwise, they are
8340: 2e 0a 20 20 23 0a 20 20 69 66 63 61 70 61 62 6c  ..  #.  ifcapabl
8350: 65 20 63 75 72 64 69 72 20 7b 0a 20 20 20 20 73  e curdir {.    s
8360: 65 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b 65  et mj_pointer [e
8370: 78 70 72 20 7b 24 6d 6a 5f 70 6f 69 6e 74 65 72  xpr {$mj_pointer
8380: 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   + [string lengt
8390: 68 20 5b 67 65 74 5f 70 77 64 5d 5d 20 2b 20 31  h [get_pwd]] + 1
83a0: 7d 5d 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 24  }].  }.  expr {$
83b0: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 3d 3d 28  ::max_journal==(
83c0: 28 28 35 31 32 2b 32 2a 28 31 30 32 34 2b 38 29  ((512+2*(1024+8)
83d0: 2b 35 31 31 29 2f 35 31 32 29 2a 35 31 32 20 2b  +511)/512)*512 +
83e0: 20 24 6d 6a 5f 70 6f 69 6e 74 65 72 29 7d 0a 7d   $mj_pointer)}.}
83f0: 20 31 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64   1.db close.tv d
8400: 65 6c 65 74 65 0a 0a 64 6f 5f 74 65 73 74 20 70  elete..do_test p
8410: 61 67 65 72 31 2d 35 2e 35 2e 31 20 7b 0a 20 20  ager1-5.5.1 {.  
8420: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
8430: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  db.  execsql { .
8440: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
8450: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
8460: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
8470: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
8480: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8490: 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t3(a, b);.    
84a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
84b0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
84c0: 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
84d0: 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
84e0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 33 20  ;.    UPDATE t3 
84f0: 53 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d 62 6c  SET b = randombl
8500: 6f 62 28 31 35 30 30 29 3b 0a 20 20 7d 0a 20 20  ob(1500);.  }.  
8510: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
8520: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d  test.db-journal]
8530: 20 3e 20 31 35 30 30 30 0a 7d 20 7b 31 7d 0a 64   > 15000.} {1}.d
8540: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
8550: 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.2 {.  execsql 
8560: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e  {.    PRAGMA syn
8570: 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b  chronous = full;
8580: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
8590: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
85a0: 20 57 48 45 52 45 20 62 20 3d 20 27 53 74 61 6c   WHERE b = 'Stal
85b0: 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  in';.      DELET
85c0: 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  E FROM t2 WHERE 
85d0: 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20  b = 'Stalin';.  
85e0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
85f0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
8600: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
8610: 0a 0a 23 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 2d 2d 2d  ----------------
8650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
8660: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
8670: 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52  ts work with "PR
8680: 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f  AGMA max_page_co
8690: 75 6e 74 22 0a 23 0a 64 6f 5f 74 65 73 74 20 70  unt".#.do_test p
86a0: 61 67 65 72 31 2d 36 2e 31 20 7b 0a 20 20 66 61  ager1-6.1 {.  fa
86b0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
86c0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
86d0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
86e0: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6e 6f  auto_vacuum = no
86f0: 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d  ne;.    PRAGMA m
8700: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20  ax_page_count = 
8710: 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  10;.    CREATE T
8720: 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20  ABLE t2(a, b);. 
8730: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
8740: 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t3(a, b);.    CR
8750: 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c  EATE TABLE t4(a,
8760: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
8770: 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29 3b 0a  TABLE t5(a, b);.
8780: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8790: 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t6(a, b);.    C
87a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61  REATE TABLE t7(a
87b0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
87c0: 20 54 41 42 4c 45 20 74 38 28 61 2c 20 62 29 3b   TABLE t8(a, b);
87d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
87e0: 45 20 74 39 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t9(a, b);.    
87f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 30  CREATE TABLE t10
8800: 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20 7b 31  (a, b);.  }.} {1
8810: 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  0}.do_catchsql_t
8820: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 32 20 7b  est pager1-6.2 {
8830: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
8840: 74 31 31 28 61 2c 20 62 29 0a 7d 20 7b 31 20 7b  t11(a, b).} {1 {
8850: 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b  database or disk
8860: 20 69 73 20 66 75 6c 6c 7d 7d 0a 64 6f 5f 65 78   is full}}.do_ex
8870: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
8880: 31 2d 36 2e 34 20 7b 20 50 52 41 47 4d 41 20 6d  1-6.4 { PRAGMA m
8890: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 20 20  ax_page_count   
88a0: 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65 78 65     } {10}.do_exe
88b0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
88c0: 2d 36 2e 35 20 7b 20 50 52 41 47 4d 41 20 6d 61  -6.5 { PRAGMA ma
88d0: 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31  x_page_count = 1
88e0: 35 20 7d 20 7b 31 35 7d 0a 64 6f 5f 65 78 65 63  5 } {15}.do_exec
88f0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
8900: 36 2e 36 20 7b 20 43 52 45 41 54 45 20 54 41 42  6.6 { CREATE TAB
8910: 4c 45 20 74 31 31 28 61 2c 20 62 29 20 20 20 20  LE t11(a, b)    
8920: 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   } {}.do_execsql
8930: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 37  _test pager1-6.7
8940: 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20   {.  BEGIN;.    
8950: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
8960: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
8970: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67    PRAGMA max_pag
8980: 65 5f 63 6f 75 6e 74 20 3d 20 31 33 3b 0a 7d 20  e_count = 13;.} 
8990: 7b 31 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {13}.do_execsql_
89a0: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 38 20  test pager1-6.8 
89b0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
89c0: 4f 20 74 31 31 20 56 41 4c 55 45 53 28 33 2c 20  O t11 VALUES(3, 
89d0: 34 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d  4);.    PRAGMA m
89e0: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20  ax_page_count = 
89f0: 31 30 3b 0a 7d 20 7b 31 31 7d 0a 64 6f 5f 65 78  10;.} {11}.do_ex
8a00: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
8a10: 31 2d 36 2e 39 20 7b 20 43 4f 4d 4d 49 54 20 7d  1-6.9 { COMMIT }
8a20: 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {}..do_execsql_
8a30: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 30  test pager1-6.10
8a40: 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61   { PRAGMA max_pa
8a50: 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 20 7d 20  ge_count = 10 } 
8a60: 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {11}.do_execsql_
8a70: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 31  test pager1-6.11
8a80: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
8a90: 20 74 31 31 20 7d 20 20 20 20 20 20 20 20 20 20   t11 }          
8aa0: 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 65 78 65  {1 2 3 4}.do_exe
8ab0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
8ac0: 2d 36 2e 31 32 20 7b 20 50 52 41 47 4d 41 20 6d  -6.12 { PRAGMA m
8ad0: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 7d 20  ax_page_count } 
8ae0: 20 20 20 20 20 7b 31 31 7d 0a 0a 0a 23 2d 2d 2d       {11}...#---
8af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b30: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
8b40: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72  lowing tests wor
8b50: 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41 20 6a  k with "PRAGMA j
8b60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e  ournal_mode=TRUN
8b70: 43 41 54 45 22 20 61 6e 64 0a 23 20 22 50 52 41  CATE" and.# "PRA
8b80: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
8b90: 3d 45 58 43 4c 55 53 49 56 45 22 2e 0a 23 0a 23  =EXCLUSIVE"..#.#
8ba0: 20 45 61 63 68 20 74 65 73 74 20 69 73 20 73 70   Each test is sp
8bb0: 65 63 69 66 69 65 64 20 77 69 74 68 20 35 20 76  ecified with 5 v
8bc0: 61 72 69 61 62 6c 65 73 2e 20 41 73 20 66 6f 6c  ariables. As fol
8bd0: 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 24 74 6e 3a  lows:.#.#   $tn:
8be0: 20 20 54 65 73 74 20 4e 75 6d 62 65 72 2e 20 55    Test Number. U
8bf0: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
8c00: 68 65 20 5b 64 6f 5f 74 65 73 74 5d 20 74 65 73  he [do_test] tes
8c10: 74 20 6e 61 6d 65 73 2e 0a 23 20 20 20 24 73 71  t names..#   $sq
8c20: 6c 3a 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74  l: SQL to execut
8c30: 65 2e 0a 23 20 20 20 24 72 65 73 3a 20 45 78 70  e..#   $res: Exp
8c40: 65 63 74 65 64 20 72 65 73 75 6c 74 20 6f 66 20  ected result of 
8c50: 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 2e 0a  executing $sql..
8c60: 23 20 20 20 24 6a 73 3a 20 20 54 68 65 20 65 78  #   $js:  The ex
8c70: 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20 74  pected size of t
8c80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
8c90: 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74 65 72   in bytes, after
8ca0: 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20 20 20   executing.#    
8cb0: 20 20 20 20 20 74 68 65 20 53 51 4c 20 73 63 72       the SQL scr
8cc0: 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20 74 68  ipt. Or -1 if th
8cd0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
8ce0: 20 65 78 70 65 63 74 65 64 20 74 6f 20 65 78 69   expected to exi
8cf0: 73 74 2e 0a 23 20 20 20 24 77 73 3a 20 20 54 68  st..#   $ws:  Th
8d00: 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65 20  e expected size 
8d10: 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2c  of the WAL file,
8d20: 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74 65 72   in bytes, after
8d30: 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20 20 20   executing.#    
8d40: 20 20 20 20 20 74 68 65 20 53 51 4c 20 73 63 72       the SQL scr
8d50: 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20 74 68  ipt. Or -1 if th
8d60: 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 65 78 70  e WAL is not exp
8d70: 65 63 74 65 64 20 74 6f 20 65 78 69 73 74 2e 0a  ected to exist..
8d80: 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20  #.ifcapable wal 
8d90: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
8da0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
8db0: 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c   foreach {tn sql
8dc0: 20 72 65 73 20 6a 73 20 77 73 7d 20 5b 73 75 62   res js ws} [sub
8dd0: 73 74 20 7b 0a 20 20 0a 20 20 20 20 31 20 20 7b  st {.  .    1  {
8de0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
8df0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
8e00: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
8e10: 76 61 63 75 75 6d 3d 4f 46 46 3b 0a 20 20 20 20  vacuum=OFF;.    
8e20: 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
8e30: 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20  nous=NORMAL;.   
8e40: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
8e50: 69 7a 65 3d 31 30 32 34 3b 0a 20 20 20 20 20 20  ize=1024;.      
8e60: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
8e70: 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20  ode=EXCLUSIVE;. 
8e80: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
8e90: 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54  nal_mode=TRUNCAT
8ea0: 45 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  E;.      INSERT 
8eb0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
8ec0: 2c 20 32 29 3b 0a 20 20 20 20 7d 20 7b 65 78 63  , 2);.    } {exc
8ed0: 6c 75 73 69 76 65 20 74 72 75 6e 63 61 74 65 7d  lusive truncate}
8ee0: 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 32 20 20   0 -1.  .    2  
8ef0: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 20 49 4d  {.      BEGIN IM
8f00: 4d 45 44 49 41 54 45 3b 0a 20 20 20 20 20 20 20  MEDIATE;.       
8f10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
8f20: 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  1;.      COMMIT;
8f30: 0a 20 20 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d  .    } {1 2} 0 -
8f40: 31 0a 20 20 0a 20 20 20 20 33 20 20 7b 0a 20 20  1.  .    3  {.  
8f50: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
8f60: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
8f70: 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49   t1;.      COMMI
8f80: 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d 20 30  T;.    } {1 2} 0
8f90: 20 2d 31 0a 20 20 0a 20 20 20 20 34 20 20 7b 20   -1.  .    4  { 
8fa0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
8fb0: 6f 64 65 20 3d 20 57 41 4c 20 7d 20 20 20 20 77  ode = WAL }    w
8fc0: 61 6c 20 20 20 20 20 20 20 2d 31 20 2d 31 0a 20  al       -1 -1. 
8fd0: 20 20 20 35 20 20 7b 20 49 4e 53 45 52 54 20 49     5  { INSERT I
8fe0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
8ff0: 20 34 29 20 7d 20 20 7b 7d 20 20 20 20 20 20 20   4) }  {}       
9000: 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69   -1 [wal_file_si
9010: 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 20 20 36  ze 1 1024].    6
9020: 20 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69    { PRAGMA locki
9030: 6e 67 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c  ng_mode = NORMAL
9040: 20 7d 20 65 78 63 6c 75 73 69 76 65 20 2d 31 20   } exclusive -1 
9050: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31  [wal_file_size 1
9060: 20 31 30 32 34 5d 0a 20 20 20 20 37 20 20 7b 20   1024].    7  { 
9070: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
9080: 41 4c 55 45 53 28 35 2c 20 36 29 3b 20 7d 20 7b  ALUES(5, 6); } {
9090: 7d 20 20 20 20 20 20 20 20 2d 31 20 5b 77 61 6c  }        -1 [wal
90a0: 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31 30 32  _file_size 2 102
90b0: 34 5d 0a 20 20 0a 20 20 20 20 38 20 20 7b 20 50  4].  .    8  { P
90c0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
90d0: 64 65 20 3d 20 54 52 55 4e 43 41 54 45 20 7d 20  de = TRUNCATE } 
90e0: 74 72 75 6e 63 61 74 65 20 20 20 20 20 20 20 20  truncate        
90f0: 20 20 30 20 2d 31 0a 20 20 20 20 39 20 20 7b 20    0 -1.    9  { 
9100: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
9110: 41 4c 55 45 53 28 37 2c 20 38 29 20 7d 20 20 20  ALUES(7, 8) }   
9120: 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20 20 20   {}             
9130: 20 20 20 30 20 2d 31 0a 20 20 20 20 31 30 20 7b     0 -1.    10 {
9140: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
9150: 31 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  1 }             
9160: 20 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37    {1 2 3 4 5 6 7
9170: 20 38 7d 20 30 20 2d 31 0a 20 20 0a 20 20 7d 5d   8} 0 -1.  .  }]
9180: 20 7b 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71   {.    do_execsq
9190: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e  l_test pager1-7.
91a0: 31 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24 72 65  1.$tn.1 $sql $re
91b0: 73 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73 65  s.    catch { se
91c0: 74 20 4a 20 2d 31 20 3b 20 73 65 74 20 4a 20 5b  t J -1 ; set J [
91d0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
91e0: 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20 20 20  b-journal] }.   
91f0: 20 63 61 74 63 68 20 7b 20 73 65 74 20 57 20 2d   catch { set W -
9200: 31 20 3b 20 73 65 74 20 57 20 5b 66 69 6c 65 20  1 ; set W [file 
9210: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
9220: 5d 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  ] }.    do_test 
9230: 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 32  pager1-7.1.$tn.2
9240: 20 7b 20 6c 69 73 74 20 24 4a 20 24 57 20 7d 20   { list $J $W } 
9250: 5b 6c 69 73 74 20 24 6a 73 20 24 77 73 5d 0a 20  [list $js $ws]. 
9260: 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61   }.}..do_test pa
9270: 67 65 72 31 2d 37 2e 32 2e 31 20 7b 0a 20 20 66  ger1-7.2.1 {.  f
9280: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
9290: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
92a0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
92b0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20   locking_mode = 
92c0: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43  EXCLUSIVE;.    C
92d0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
92e0: 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b  , b);.    BEGIN;
92f0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
9300: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c  urnal_mode = del
9310: 65 74 65 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  ete;.      PRAGM
9320: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
9330: 20 74 72 75 6e 63 61 74 65 3b 0a 20 20 7d 0a 7d   truncate;.  }.}
9340: 20 7b 65 78 63 6c 75 73 69 76 65 20 64 65 6c 65   {exclusive dele
9350: 74 65 20 74 72 75 6e 63 61 74 65 7d 0a 64 6f 5f  te truncate}.do_
9360: 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e  test pager1-7.2.
9370: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
9380: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
9390: 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 20 20  ALUES(1, 2) }.  
93a0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
93b0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
93c0: 70 65 72 73 69 73 74 20 7d 0a 7d 20 7b 74 72 75  persist }.} {tru
93d0: 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70  ncate}.do_test p
93e0: 61 67 65 72 31 2d 37 2e 32 2e 33 20 7b 0a 20 20  ager1-7.2.3 {.  
93f0: 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54  execsql { COMMIT
9400: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
9410: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
9420: 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74  l_mode = persist
9430: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
9440: 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 3b  rnal_size_limit;
9450: 0a 20 20 7d 0a 7d 20 7b 70 65 72 73 69 73 74 20  .  }.} {persist 
9460: 2d 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -1}..#----------
9470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
94b0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
94c0: 74 65 73 74 73 2c 20 70 61 67 65 72 31 2d 38 2e  tests, pager1-8.
94d0: 2a 2c 20 74 65 73 74 20 74 68 61 74 20 74 68 65  *, test that the
94e0: 20 73 70 65 63 69 61 6c 20 66 69 6c 65 6e 61 6d   special filenam
94f0: 65 73 20 0a 23 20 22 3a 6d 65 6d 6f 72 79 3a 22  es .# ":memory:"
9500: 20 61 6e 64 20 22 22 20 6f 70 65 6e 20 74 65 6d   and "" open tem
9510: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
9520: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  ..#.foreach {tn 
9530: 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20 31 20  filename} {.  1 
9540: 3a 6d 65 6d 6f 72 79 3a 0a 20 20 32 20 22 22 0a  :memory:.  2 "".
9550: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } {.  do_test pa
9560: 67 65 72 31 2d 38 2e 24 74 6e 2e 31 20 7b 0a 20  ger1-8.$tn.1 {. 
9570: 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65     faultsim_dele
9580: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
9590: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73    db close.    s
95a0: 71 6c 69 74 65 33 20 64 62 20 24 66 69 6c 65 6e  qlite3 db $filen
95b0: 61 6d 65 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ame.    execsql 
95c0: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  {.      PRAGMA a
95d0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a  uto_vacuum = 1;.
95e0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
95f0: 4c 45 20 78 31 28 78 29 3b 0a 20 20 20 20 20 20  LE x1(x);.      
9600: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
9610: 41 4c 55 45 53 28 27 43 68 61 72 6c 65 73 27 29  ALUES('Charles')
9620: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9630: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 4a  NTO x1 VALUES('J
9640: 61 6d 65 73 27 29 3b 0a 20 20 20 20 20 20 49 4e  ames');.      IN
9650: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
9660: 55 45 53 28 27 4d 61 72 79 27 29 3b 0a 20 20 20  UES('Mary');.   
9670: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
9680: 20 78 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   x1;.    }.  } {
9690: 43 68 61 72 6c 65 73 20 4a 61 6d 65 73 20 4d 61  Charles James Ma
96a0: 72 79 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70  ry}..  do_test p
96b0: 61 67 65 72 31 2d 38 2e 24 74 6e 2e 32 20 7b 0a  ager1-8.$tn.2 {.
96c0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20      sqlite3 db2 
96d0: 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 63 61  $filename.    ca
96e0: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
96f0: 2a 20 46 52 4f 4d 20 78 31 20 7d 20 64 62 32 0a  * FROM x1 } db2.
9700: 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20    } {1 {no such 
9710: 74 61 62 6c 65 3a 20 78 31 7d 7d 0a 0a 20 20 64  table: x1}}..  d
9720: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
9730: 61 67 65 72 31 2d 38 2e 24 74 6e 2e 33 20 7b 0a  ager1-8.$tn.3 {.
9740: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
9750: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
9760: 56 41 4c 55 45 53 28 27 57 69 6c 6c 69 61 6d 27  VALUES('William'
9770: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
9780: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27  INTO x1 VALUES('
9790: 41 6e 6e 65 27 29 3b 0a 20 20 20 20 52 4f 4c 4c  Anne');.    ROLL
97a0: 42 41 43 4b 3b 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a  BACK;.  } {}.}..
97b0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
97c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
9800: 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 74   next block of t
9810: 65 73 74 73 20 2d 20 70 61 67 65 72 31 2d 39 2e  ests - pager1-9.
9820: 2a 20 2d 20 64 65 61 6c 20 77 69 74 68 20 69 6e  * - deal with in
9830: 74 65 72 61 63 74 69 6f 6e 73 20 62 65 74 77 65  teractions betwe
9840: 65 6e 0a 23 20 74 68 65 20 70 61 67 65 72 20 61  en.# the pager a
9850: 6e 64 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  nd the backup AP
9860: 49 2e 20 54 65 73 74 20 63 61 73 65 73 3a 0a 23  I. Test cases:.#
9870: 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e 31 2e  .#   pager1-9.1.
9880: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61 20 62  *: Test that a b
9890: 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65 73 20  ackup completes 
98a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65 76 65  successfully eve
98b0: 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20  n if the.#      
98c0: 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63             sourc
98d0: 65 20 64 62 20 69 73 20 77 72 69 74 74 65 6e 20  e db is written 
98e0: 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 62 61  to during the ba
98f0: 63 6b 75 70 20 6f 70 2e 0a 23 0a 23 20 20 20 70  ckup op..#.#   p
9900: 61 67 65 72 31 2d 39 2e 32 2e 2a 3a 20 54 65 73  ager1-9.2.*: Tes
9910: 74 20 74 68 61 74 20 61 20 62 61 63 6b 75 70 20  t that a backup 
9920: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
9930: 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66 20 74  sfully even if t
9940: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
9950: 20 20 20 20 20 73 6f 75 72 63 65 20 64 62 20 69       source db i
9960: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 61 6e 64  s written to and
9970: 20 74 68 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   then rolled bac
9980: 6b 20 64 75 72 69 6e 67 20 61 20 0a 23 20 20 20  k during a .#   
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61                ba
99a0: 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  ckup operation..
99b0: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
99c0: 2d 39 2e 30 2e 31 20 7b 0a 20 20 66 61 75 6c 74  -9.0.1 {.  fault
99d0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
99e0: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
99f0: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
9a00: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
9a10: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
9a20: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45  ize = 10;.    BE
9a30: 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54  GIN;.      CREAT
9a40: 45 20 54 41 42 4c 45 20 61 62 28 61 2c 20 62 2c  E TABLE ab(a, b,
9a50: 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b 0a   UNIQUE(a, b));.
9a60: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9a70: 4f 20 61 62 20 56 41 4c 55 45 53 28 20 61 5f 73  O ab VALUES( a_s
9a80: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
9a90: 72 69 6e 67 28 33 30 30 29 20 29 3b 0a 20 20 20  ring(300) );.   
9aa0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
9ab0: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
9ac0: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
9ad0: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
9ae0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9af0: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
9b00: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
9b10: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
9b20: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9b30: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
9b40: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
9b50: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
9b60: 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  b;.      INSERT 
9b70: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
9b80: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
9b90: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
9ba0: 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   ab;.      INSER
9bb0: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
9bc0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
9bd0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
9be0: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
9bf0: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
9c00: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
9c10: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
9c20: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
9c30: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
9c40: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
9c50: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
9c60: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 43  ) FROM ab;.    C
9c70: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
9c80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9c90: 2e 30 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33  .0.2 {.  sqlite3
9ca0: 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20   db2 test.db2.  
9cb0: 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41 47 4d  db2 eval { PRAGM
9cc0: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
9cd0: 30 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  0 }.  sqlite3_ba
9ce0: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
9cf0: 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74 20 5b  db main.  list [
9d00: 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42  B step 10000] [B
9d10: 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49   finish].} {SQLI
9d20: 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f  TE_DONE SQLITE_O
9d30: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
9d40: 31 2d 39 2e 30 2e 33 20 7b 0a 20 64 62 20 6f 6e  1-9.0.3 {. db on
9d50: 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  e {SELECT md5sum
9d60: 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a  (a, b) FROM ab}.
9d70: 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45  } [db2 one {SELE
9d80: 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20  CT md5sum(a, b) 
9d90: 46 52 4f 4d 20 61 62 7d 5d 0a 0a 64 6f 5f 74 65  FROM ab}]..do_te
9da0: 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 31 20  st pager1-9.1.1 
9db0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50  {.  execsql { UP
9dc0: 44 41 54 45 20 61 62 20 53 45 54 20 61 20 3d 20  DATE ab SET a = 
9dd0: 61 5f 73 74 72 69 6e 67 28 32 30 31 29 20 7d 0a  a_string(201) }.
9de0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
9df0: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
9e00: 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30 0a  ain.  B step 30.
9e10: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  } {SQLITE_OK}.do
9e20: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31  _test pager1-9.1
9e30: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
9e40: 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20 62   UPDATE ab SET b
9e50: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 31 29   = a_string(301)
9e60: 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65   }.  list [B ste
9e70: 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69  p 10000] [B fini
9e80: 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f  sh].} {SQLITE_DO
9e90: 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  NE SQLITE_OK}.do
9ea0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31  _test pager1-9.1
9eb0: 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45  .3 {. db one {SE
9ec0: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
9ed0: 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62  ) FROM ab}.} [db
9ee0: 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64  2 one {SELECT md
9ef0: 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20  5sum(a, b) FROM 
9f00: 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ab}].do_test pag
9f10: 65 72 31 2d 39 2e 31 2e 34 20 7b 20 65 78 65 63  er1-9.1.4 { exec
9f20: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
9f30: 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 20 7d 20  nt(*) FROM ab } 
9f40: 7d 20 7b 31 32 38 7d 0a 0a 64 6f 5f 74 65 73 74  } {128}..do_test
9f50: 20 70 61 67 65 72 31 2d 39 2e 32 2e 31 20 7b 0a   pager1-9.2.1 {.
9f60: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
9f70: 54 45 20 61 62 20 53 45 54 20 61 20 3d 20 61 5f  TE ab SET a = a_
9f80: 73 74 72 69 6e 67 28 32 30 32 29 20 7d 0a 20 20  string(202) }.  
9f90: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42  sqlite3_backup B
9fa0: 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69   db2 main db mai
9fb0: 6e 0a 20 20 42 20 73 74 65 70 20 33 30 0a 7d 20  n.  B step 30.} 
9fc0: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74  {SQLITE_OK}.do_t
9fd0: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 32  est pager1-9.2.2
9fe0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
9ff0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
a000: 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20 62   UPDATE ab SET b
a010: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 31 29   = a_string(301)
a020: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
a030: 20 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20 73 74    }.  list [B st
a040: 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e  ep 10000] [B fin
a050: 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  ish].} {SQLITE_D
a060: 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  ONE SQLITE_OK}.d
a070: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
a080: 32 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53  2.3 {. db one {S
a090: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
a0a0: 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64  b) FROM ab}.} [d
a0b0: 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  b2 one {SELECT m
a0c0: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
a0d0: 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20 70 61   ab}].do_test pa
a0e0: 67 65 72 31 2d 39 2e 32 2e 34 20 7b 20 65 78 65  ger1-9.2.4 { exe
a0f0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
a100: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 20 7d  unt(*) FROM ab }
a110: 20 7d 20 7b 31 32 38 7d 0a 64 62 20 63 6c 6f 73   } {128}.db clos
a120: 65 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f  e.db2 close..do_
a130: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e  test pager1-9.3.
a140: 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76  1 {.  testvfs tv
a150: 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76   -default 1.  tv
a160: 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39 36   sectorsize 4096
a170: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
a180: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20  te_and_reopen.. 
a190: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
a1a0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
a1b0: 32 34 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  24 }.  for {set 
a1c0: 69 69 20 30 7d 20 7b 24 69 69 20 3c 20 34 7d 20  ii 0} {$ii < 4} 
a1d0: 7b 69 6e 63 72 20 69 69 7d 20 7b 20 65 78 65 63  {incr ii} { exec
a1e0: 73 71 6c 20 22 43 52 45 41 54 45 20 54 41 42 4c  sql "CREATE TABL
a1f0: 45 20 74 24 7b 69 69 7d 28 61 2c 20 62 29 22 20  E t${ii}(a, b)" 
a200: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
a210: 61 67 65 72 31 2d 39 2e 33 2e 32 20 7b 0a 20 20  ager1-9.3.2 {.  
a220: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
a230: 2e 64 62 32 0a 0a 20 20 65 78 65 63 73 71 6c 20  .db2..  execsql 
a240: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
a250: 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20  e_size = 4096;. 
a260: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
a270: 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 20 20 20  onous = OFF;.   
a280: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
a290: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
a2a0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
a2b0: 29 3b 0a 20 20 7d 20 64 62 32 0a 0a 20 20 73 71  );.  } db2..  sq
a2c0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
a2d0: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
a2e0: 20 20 42 20 73 74 65 70 20 33 30 0a 20 20 6c 69    B step 30.  li
a2f0: 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30  st [B step 10000
a300: 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b  ] [B finish].} {
a310: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49  SQLITE_DONE SQLI
a320: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70  TE_OK}.do_test p
a330: 61 67 65 72 31 2d 39 2e 33 2e 33 20 7b 0a 20 20  ager1-9.3.3 {.  
a340: 64 62 32 20 63 6c 6f 73 65 0a 20 20 64 62 20 63  db2 close.  db c
a350: 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65  lose.  tv delete
a360: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
a370: 74 2e 64 62 32 0a 7d 20 5b 66 69 6c 65 20 73 69  t.db2.} [file si
a380: 7a 65 20 74 65 73 74 2e 64 62 5d 0a 0a 64 6f 5f  ze test.db]..do_
a390: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 34 2e  test pager1-9.4.
a3a0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
a3b0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
a3c0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
a3d0: 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71  est.db2.  execsq
a3e0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
a3f0: 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b  age_size = 4096;
a400: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
a410: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
a420: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
a430: 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a 20  a, b);.  } db2. 
a440: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
a450: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
a460: 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65  in.  list [B ste
a470: 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69  p 10000] [B fini
a480: 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f  sh].} {SQLITE_DO
a490: 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  NE SQLITE_OK}.do
a4a0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 34  _test pager1-9.4
a4b0: 2e 32 20 7b 0a 20 20 6c 69 73 74 20 5b 66 69 6c  .2 {.  list [fil
a4c0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 32 5d  e size test.db2]
a4d0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
a4e0: 2e 64 62 5d 0a 7d 20 7b 31 30 32 34 20 30 7d 0a  .db].} {1024 0}.
a4f0: 64 62 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d  db2 close..#----
a500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a540: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
a550: 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  t regardless of 
a560: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
a570: 65 64 20 62 79 20 78 53 65 63 74 6f 72 53 69 7a  ed by xSectorSiz
a580: 65 28 29 2c 20 74 68 65 0a 23 20 6d 69 6e 69 6d  e(), the.# minim
a590: 75 6d 20 65 66 66 65 63 74 69 76 65 20 73 65 63  um effective sec
a5a0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 35 31 32 20  tor-size is 512 
a5b0: 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
a5c0: 36 35 35 33 36 20 62 79 74 65 73 2e 0a 23 0a 74  65536 bytes..#.t
a5d0: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
a5e0: 6c 74 20 31 0a 66 6f 72 65 61 63 68 20 73 65 63  lt 1.foreach sec
a5f0: 74 6f 72 73 69 7a 65 20 7b 0a 20 20 20 20 31 36  torsize {.    16
a600: 0a 20 20 20 20 33 32 20 20 20 36 34 20 20 20 31  .    32   64   1
a610: 32 38 20 20 20 32 35 36 20 20 20 35 31 32 20 20  28   256   512  
a620: 20 31 30 32 34 20 20 20 32 30 34 38 20 0a 20 20   1024   2048 .  
a630: 20 20 34 30 39 36 20 38 31 39 32 20 31 36 33 38    4096 8192 1638
a640: 34 20 33 32 37 36 38 20 36 35 35 33 36 20 31 33  4 32768 65536 13
a650: 31 30 37 32 20 32 36 32 31 34 34 0a 7d 20 7b 0a  1072 262144.} {.
a660: 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20    tv sectorsize 
a670: 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 74 76  $sectorsize.  tv
a680: 20 64 65 76 63 68 61 72 20 7b 7d 0a 20 20 73 65   devchar {}.  se
a690: 74 20 65 66 66 20 24 73 65 63 74 6f 72 73 69 7a  t eff $sectorsiz
a6a0: 65 0a 20 20 69 66 20 7b 24 73 65 63 74 6f 72 73  e.  if {$sectors
a6b0: 69 7a 65 20 3c 20 35 31 32 7d 20 20 20 7b 20 73  ize < 512}   { s
a6c0: 65 74 20 65 66 66 20 35 31 32 20 7d 0a 20 20 69  et eff 512 }.  i
a6d0: 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3e  f {$sectorsize >
a6e0: 20 36 35 35 33 36 7d 20 7b 20 73 65 74 20 65 66   65536} { set ef
a6f0: 66 20 36 35 35 33 36 20 7d 0a 0a 20 20 64 6f 5f  f 65536 }..  do_
a700: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
a710: 73 65 63 74 6f 72 73 69 7a 65 2e 31 20 7b 0a 20  sectorsize.1 {. 
a720: 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65     faultsim_dele
a730: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
a740: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
a750: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20  ng a_string.    
a760: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
a770: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
a780: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
a790: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
a7a0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
a7b0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
a7c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a7d0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
a7e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a7f0: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20  2(a, b);.       
a800: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
a810: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 4f  (a, b);.      CO
a820: 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  MMIT;.    }.    
a830: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
a840: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 5b 65  b-journal.  } [e
a850: 78 70 72 20 24 73 65 63 74 6f 72 73 69 7a 65 20  xpr $sectorsize 
a860: 3e 20 36 35 35 33 36 20 3f 20 36 35 35 33 36 20  > 65536 ? 65536 
a870: 3a 20 28 24 73 65 63 74 6f 72 73 69 7a 65 3c 33  : ($sectorsize<3
a880: 32 20 3f 20 35 31 32 20 3a 20 24 73 65 63 74 6f  2 ? 512 : $secto
a890: 72 73 69 7a 65 29 5d 0a 0a 20 20 64 6f 5f 74 65  rsize)]..  do_te
a8a0: 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65  st pager1-10.$se
a8b0: 63 74 6f 72 73 69 7a 65 2e 32 20 7b 0a 20 20 20  ctorsize.2 {.   
a8c0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
a8d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
a8e0: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
a8f0: 28 33 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (300), a_string(
a900: 33 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  300));.      INS
a910: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
a920: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20  CT * FROM t3;   
a930: 20 20 20 20 20 2f 2a 20 20 32 20 2a 2f 0a 20 20       /*  2 */.  
a940: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a950: 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t3 SELECT * FROM
a960: 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20   t3;        /*  
a970: 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  4 */.      INSER
a980: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
a990: 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20   * FROM t3;     
a9a0: 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20     /*  8 */.    
a9b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
a9c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
a9d0: 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 31 36 20  3;        /* 16 
a9e0: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
a9f0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a  INTO t3 SELECT *
aa00: 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20   FROM t3;       
aa10: 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 7d 0a   /* 32 */.    }.
aa20: 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73    } {}..  do_tes
aa30: 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63  t pager1-10.$sec
aa40: 74 6f 72 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20  torsize.3 {.    
aa50: 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c  db close.    sql
aa60: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
aa70: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
aa80: 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
aa90: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
aaa0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 7d 0a     BEGIN;.    }.
aab0: 20 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65      recursive_se
aac0: 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62 20 65  lect 32 t3 {db e
aad0: 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  val "INSERT INTO
aae0: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t2 VALUES(1, 2)
aaf0: 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  "}.    execsql {
ab00: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
ab10: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
ab20: 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t2;.    }.  }
ab30: 20 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f 74 65 73   {1 2}..  do_tes
ab40: 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63  t pager1-10.$sec
ab50: 74 6f 72 73 69 7a 65 2e 34 20 7b 0a 20 20 20 20  torsize.4 {.    
ab60: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
ab70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28  CREATE TABLE t6(
ab80: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  a, b);.      CRE
ab90: 41 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c 20  ATE TABLE t7(a, 
aba0: 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  b);.      CREATE
abb0: 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29 3b   TABLE t5(a, b);
abc0: 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c  .      DROP TABL
abd0: 45 20 74 36 3b 0a 20 20 20 20 20 20 44 52 4f 50  E t6;.      DROP
abe0: 20 54 41 42 4c 45 20 74 37 3b 0a 20 20 20 20 7d   TABLE t7;.    }
abf0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
ac00: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
ac10: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
ac20: 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 7d   t6(a, b);.    }
ac30: 0a 20 20 20 20 72 65 63 75 72 73 69 76 65 5f 73  .    recursive_s
ac40: 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62 20  elect 32 t3 {db 
ac50: 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  eval "INSERT INT
ac60: 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c 20 32  O t5 VALUES(1, 2
ac70: 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  )"}.    execsql 
ac80: 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  {.      COMMIT;.
ac90: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
aca0: 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d 0a 20 20  ROM t5;.    }.  
acb0: 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a 64 62 20  } {1 2}.  .}.db 
acc0: 63 6c 6f 73 65 0a 0a 74 76 20 73 65 63 74 6f 72  close..tv sector
acd0: 73 69 7a 65 20 34 30 39 36 0a 64 6f 5f 74 65 73  size 4096.do_tes
ace0: 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e 31 20  t pager1.10.x.1 
acf0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
ad00: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
ad10: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
ad20: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
ad30: 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52  m = none;.    PR
ad40: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
ad50: 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
ad60: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
ad70: 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20   }.  for {set i 
ad80: 30 7d 20 7b 24 69 3c 33 30 7d 20 7b 69 6e 63 72  0} {$i<30} {incr
ad90: 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71   i} {.    execsq
ada0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
adb0: 74 31 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c  t1 VALUES(zerobl
adc0: 6f 62 28 39 30 30 29 29 20 7d 0a 20 20 7d 0a 20  ob(900)) }.  }. 
add0: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
ade0: 64 62 0a 7d 20 7b 33 32 37 36 38 7d 0a 64 6f 5f  db.} {32768}.do_
adf0: 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78  test pager1.10.x
ae00: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
ae10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
ae20: 45 20 74 32 28 78 29 3b 0a 20 20 20 20 44 52 4f  E t2(x);.    DRO
ae30: 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 7d 0a  P TABLE t2;.  }.
ae40: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
ae50: 2e 64 62 0a 7d 20 7b 33 33 37 39 32 7d 0a 64 6f  .db.} {33792}.do
ae60: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e  _test pager1.10.
ae70: 78 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  x.3 {.  execsql 
ae80: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
ae90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
aea0: 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72  (x);.  }.  recur
aeb0: 73 69 76 65 5f 73 65 6c 65 63 74 20 33 30 20 74  sive_select 30 t
aec0: 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  1.  execsql {.  
aed0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
aee0: 33 28 78 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  3(x);.    COMMIT
aef0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 62 20 63  ;.  }.} {}..db c
af00: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
af10: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
af20: 75 6c 74 20 31 0a 66 61 75 6c 74 73 69 6d 5f 64  ult 1.faultsim_d
af30: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
af40: 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e  .db func a_strin
af50: 67 20 61 5f 73 74 72 69 6e 67 0a 64 6f 5f 65 78  g a_string.do_ex
af60: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
af70: 31 2d 31 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d  1-11.1 {.  PRAGM
af80: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
af90: 20 44 45 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d   DELETE;.  PRAGM
afa0: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
afb0: 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  0;.  BEGIN;.    
afc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a 7a 28  CREATE TABLE zz(
afd0: 74 6f 70 20 50 52 49 4d 41 52 59 20 4b 45 59 29  top PRIMARY KEY)
afe0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
aff0: 4f 20 7a 7a 20 56 41 4c 55 45 53 28 61 5f 73 74  O zz VALUES(a_st
b000: 72 69 6e 67 28 32 32 32 29 29 3b 0a 20 20 20 20  ring(222));.    
b010: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53  INSERT INTO zz S
b020: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28  ELECT a_string((
b030: 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72  SELECT 222+max(r
b040: 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20  owid) FROM zz)) 
b050: 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53  FROM zz;.    INS
b060: 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45  ERT INTO zz SELE
b070: 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c  CT a_string((SEL
b080: 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69  ECT 222+max(rowi
b090: 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f  d) FROM zz)) FRO
b0a0: 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54  M zz;.    INSERT
b0b0: 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20   INTO zz SELECT 
b0c0: 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54  a_string((SELECT
b0d0: 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20   222+max(rowid) 
b0e0: 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a  FROM zz)) FROM z
b0f0: 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  z;.    INSERT IN
b100: 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73  TO zz SELECT a_s
b110: 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32  tring((SELECT 22
b120: 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f  2+max(rowid) FRO
b130: 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a  M zz)) FROM zz;.
b140: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b150: 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  zz SELECT a_stri
b160: 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d  ng((SELECT 222+m
b170: 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a  ax(rowid) FROM z
b180: 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 43  z)) FROM zz;.  C
b190: 4f 4d 4d 49 54 3b 0a 20 20 42 45 47 49 4e 3b 0a  OMMIT;.  BEGIN;.
b1a0: 20 20 20 20 55 50 44 41 54 45 20 7a 7a 20 53 45      UPDATE zz SE
b1b0: 54 20 74 6f 70 20 3d 20 61 5f 73 74 72 69 6e 67  T top = a_string
b1c0: 28 33 34 35 29 3b 0a 7d 20 7b 64 65 6c 65 74 65  (345);.} {delete
b1d0: 7d 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75 74 20  }..proc lockout 
b1e0: 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 20  {method args} { 
b1f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
b200: 45 52 52 20 7d 0a 74 76 20 73 63 72 69 70 74 20  ERR }.tv script 
b210: 6c 6f 63 6b 6f 75 74 0a 74 76 20 66 69 6c 74 65  lockout.tv filte
b220: 72 20 7b 78 57 72 69 74 65 20 78 54 72 75 6e 63  r {xWrite xTrunc
b230: 61 74 65 20 78 53 79 6e 63 7d 0a 64 6f 5f 63 61  ate xSync}.do_ca
b240: 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65  tchsql_test page
b250: 72 31 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d 49 54  r1-11.2 { COMMIT
b260: 20 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20   } {1 {disk I/O 
b270: 65 72 72 6f 72 7d 7d 0a 0a 74 76 20 73 63 72 69  error}}..tv scri
b280: 70 74 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  pt {}.do_test pa
b290: 67 65 72 31 2d 31 31 2e 33 20 7b 0a 20 20 73 71  ger1-11.3 {.  sq
b2a0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
b2b0: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
b2c0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
b2d0: 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45  _mode = TRUNCATE
b2e0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  ;.    PRAGMA int
b2f0: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
b300: 7d 20 64 62 32 0a 7d 20 7b 74 72 75 6e 63 61 74  } db2.} {truncat
b310: 65 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  e ok}.do_test pa
b320: 67 65 72 31 2d 31 31 2e 34 20 7b 0a 20 20 64 62  ger1-11.4 {.  db
b330: 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 65  2 close.  file e
b340: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
b350: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 65  urnal.} {0}.do_e
b360: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
b370: 72 31 2d 31 31 2e 35 20 7b 20 53 45 4c 45 43 54  r1-11.5 { SELECT
b380: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a   count(*) FROM z
b390: 7a 20 7d 20 7b 33 32 7d 0a 64 62 20 63 6c 6f 73  z } {32}.db clos
b3a0: 65 0a 74 76 20 64 65 6c 65 74 65 0a 20 20 0a 23  e.tv delete.  .#
b3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
b400: 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69   "PRAGMA page_si
b410: 7a 65 22 0a 23 0a 74 65 73 74 76 66 73 20 74 76  ze".#.testvfs tv
b420: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
b430: 65 63 74 6f 72 73 69 7a 65 20 31 30 32 34 0a 66  ectorsize 1024.f
b440: 6f 72 65 61 63 68 20 70 61 67 65 73 69 7a 65 20  oreach pagesize 
b450: 7b 0a 20 20 20 20 35 31 32 20 20 20 31 30 32 34  {.    512   1024
b460: 20 20 20 32 30 34 38 20 34 30 39 36 20 38 31 39     2048 4096 819
b470: 32 20 31 36 33 38 34 20 33 32 37 36 38 20 0a 7d  2 16384 32768 .}
b480: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
b490: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
b4a0: 0a 20 20 23 20 54 68 65 20 73 65 63 74 6f 72 2d  .  # The sector-
b4b0: 73 69 7a 65 20 28 61 63 63 6f 72 64 69 6e 67 20  size (according 
b4c0: 74 6f 20 74 68 65 20 56 46 53 29 20 69 73 20 31  to the VFS) is 1
b4d0: 30 32 34 20 62 79 74 65 73 2e 20 53 6f 20 69 66  024 bytes. So if
b4e0: 20 74 68 65 0a 20 20 23 20 70 61 67 65 2d 73 69   the.  # page-si
b4f0: 7a 65 20 72 65 71 75 65 73 74 65 64 20 75 73 69  ze requested usi
b500: 6e 67 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f  ng "PRAGMA page_
b510: 73 69 7a 65 22 20 69 73 20 67 72 65 61 74 65 72  size" is greater
b520: 20 74 68 61 6e 20 74 68 65 0a 20 20 23 20 63 6f   than the.  # co
b530: 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65  mpile time value
b540: 20 6f 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   of SQLITE_MAX_P
b550: 41 47 45 5f 53 49 5a 45 2c 20 74 68 65 6e 20 74  AGE_SIZE, then t
b560: 68 65 20 65 66 66 65 63 74 69 76 65 20 0a 20 20  he effective .  
b570: 23 20 70 61 67 65 2d 73 69 7a 65 20 72 65 6d 61  # page-size rema
b580: 69 6e 73 20 31 30 32 34 20 62 79 74 65 73 2e 0a  ins 1024 bytes..
b590: 20 20 23 0a 20 20 73 65 74 20 65 66 66 20 24 70    #.  set eff $p
b5a0: 61 67 65 73 69 7a 65 0a 20 20 69 66 20 7b 24 65  agesize.  if {$e
b5b0: 66 66 20 3e 20 24 3a 3a 53 51 4c 49 54 45 5f 4d  ff > $::SQLITE_M
b5c0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 7d 20 7b 20  AX_PAGE_SIZE} { 
b5d0: 73 65 74 20 65 66 66 20 31 30 32 34 20 7d 0a 0a  set eff 1024 }..
b5e0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
b5f0: 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 31 20  -12.$pagesize.1 
b600: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  {.    sqlite3 db
b610: 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  2 test.db.    ex
b620: 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 50 52  ecsql ".      PR
b630: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
b640: 20 24 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 20   $pagesize;.    
b650: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76 20    CREATE VIEW v 
b660: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
b670: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
b680: 20 20 20 20 22 20 64 62 32 0a 20 20 20 20 66 69      " db2.    fi
b690: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
b6a0: 20 20 7d 20 24 65 66 66 0a 20 20 64 6f 5f 74 65    } $eff.  do_te
b6b0: 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61  st pager1-12.$pa
b6c0: 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20 73  gesize.2 {.    s
b6d0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
b6e0: 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  db.    execsql {
b6f0: 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63   .      SELECT c
b700: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a  ount(*) FROM v;.
b710: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69        PRAGMA mai
b720: 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20  n.page_size;.   
b730: 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69 73 74   } db2.  } [list
b740: 20 31 20 24 65 66 66 5d 0a 20 20 64 6f 5f 74 65   1 $eff].  do_te
b750: 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61  st pager1-12.$pa
b760: 67 65 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20 65  gesize.3 {.    e
b770: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
b780: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
b790: 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50 52  FROM v;.      PR
b7a0: 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73  AGMA main.page_s
b7b0: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b  ize;.    }.  } [
b7c0: 6c 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20 64  list 1 $eff].  d
b7d0: 62 32 20 63 6c 6f 73 65 0a 7d 0a 64 62 20 63 6c  b2 close.}.db cl
b7e0: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23  ose.tv delete..#
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 2d 2d 2d 2d 2d 2d  ----------------
b830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
b840: 20 73 70 65 63 61 6c 20 22 50 52 41 47 4d 41 20   specal "PRAGMA 
b850: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52  journal_mode=PER
b860: 53 49 53 54 22 20 74 65 73 74 20 63 61 73 65 73  SIST" test cases
b870: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e  ..#.# pager1-13.
b880: 31 2e 2a 3a 20 54 68 69 73 20 74 65 73 74 73 20  1.*: This tests 
b890: 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 65  a special case e
b8a0: 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 70 65  ncountered in pe
b8b0: 72 73 69 73 74 65 6e 74 20 0a 23 20 20 20 20 20  rsistent .#     
b8c0: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
b8d0: 61 6c 20 6d 6f 64 65 3a 20 49 66 20 74 68 65 20  al mode: If the 
b8e0: 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61 74  journal associat
b8f0: 65 64 20 77 69 74 68 20 61 20 74 72 61 6e 73 61  ed with a transa
b900: 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 20 20  ction.#         
b910: 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
b920: 72 20 74 68 61 6e 20 74 68 65 20 6a 6f 75 72 6e  r than the journ
b930: 61 6c 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  al file (because
b940: 20 61 20 70 72 65 76 69 6f 75 73 20 0a 23 20 20   a previous .#  
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
b960: 61 6e 73 61 63 74 69 6f 6e 20 6c 65 66 74 20 61  ansaction left a
b970: 20 76 65 72 79 20 6c 61 72 67 65 20 6e 6f 6e 2d   very large non-
b980: 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
b990: 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20   in the.#       
b9a0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 2d 73 79           file-sy
b9b0: 73 74 65 6d 29 2c 20 74 68 65 6e 20 53 51 4c 69  stem), then SQLi
b9c0: 74 65 20 68 61 73 20 74 6f 20 62 65 20 63 61 72  te has to be car
b9d0: 65 66 75 6c 20 74 68 61 74 20 74 68 65 72 65 20  eful that there 
b9e0: 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  is.#            
b9f0: 20 20 20 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61      not a journa
ba00: 6c 2d 68 65 61 64 65 72 20 6c 65 66 74 20 6f 76  l-header left ov
ba10: 65 72 20 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  er from a previo
ba20: 75 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23  us transaction.#
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
ba50: 6f 77 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  owing the journa
ba60: 6c 20 63 6f 6e 74 65 6e 74 20 6a 75 73 74 20 77  l content just w
ba70: 72 69 74 74 65 6e 2e 0a 23 20 20 20 20 20 20 20  ritten..#       
ba80: 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72           If ther
ba90: 65 20 69 73 2c 20 61 6e 64 20 74 68 65 20 70 72  e is, and the pr
baa0: 6f 63 65 73 73 20 63 72 61 73 68 65 73 20 73 6f  ocess crashes so
bab0: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
bac0: 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  l.#             
bad0: 20 20 20 62 65 63 6f 6d 65 73 20 61 20 68 6f 74     becomes a hot
bae0: 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 75 73  -journal and mus
baf0: 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
bb00: 20 62 79 20 61 6e 6f 74 68 65 72 0a 23 20 20 20   by another.#   
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
bb20: 63 65 73 73 2c 20 74 68 65 72 65 20 69 73 20 61  cess, there is a
bb30: 20 64 61 6e 67 65 72 20 74 68 61 74 20 74 68 65   danger that the
bb40: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d   other process m
bb50: 61 79 20 72 6f 6c 6c 0a 23 20 20 20 20 20 20 20  ay roll.#       
bb60: 20 20 20 20 20 20 20 20 20 62 61 63 6b 20 74 68           back th
bb70: 65 20 61 62 6f 72 74 65 64 20 74 72 61 6e 73 61  e aborted transa
bb80: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 6e 74  ction, then cont
bb90: 69 6e 75 65 20 63 6f 70 79 69 6e 67 20 64 61 74  inue copying dat
bba0: 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  a.#             
bbb0: 20 20 20 66 72 6f 6d 20 61 6e 20 6f 6c 64 65 72     from an older
bbc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 72 6f   transaction fro
bbd0: 6d 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  m the remainder 
bbe0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
bbf0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
bc00: 20 53 65 65 20 74 68 65 20 73 79 6e 63 4a 6f 75   See the syncJou
bc10: 72 6e 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  rnal() function 
bc20: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 23 0a 23  for details..#.#
bc30: 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 2a 3a 20   pager1-13.2.*: 
bc40: 53 61 6d 65 20 74 65 73 74 20 61 73 20 74 68 65  Same test as the
bc50: 20 70 72 65 76 69 6f 75 73 2e 20 54 68 69 73 20   previous. This 
bc60: 74 69 6d 65 2c 20 74 68 72 6f 77 20 61 6e 20 69  time, throw an i
bc70: 6e 64 65 78 20 69 6e 74 6f 0a 23 20 20 20 20 20  ndex into.#     
bc80: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 6d             the m
bc90: 69 78 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 69  ix to make the i
bca0: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 6d  ntegrity-check m
bcb0: 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 61  ore likely to ca
bcc0: 74 63 68 0a 23 20 20 20 20 20 20 20 20 20 20 20  tch.#           
bcd0: 20 20 20 20 20 65 72 72 6f 72 73 2e 0a 23 0a 74       errors..#.t
bce0: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
bcf0: 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 20 78  lt 1.tv script x
bd00: 53 79 6e 63 43 62 0a 74 76 20 66 69 6c 74 65 72  SyncCb.tv filter
bd10: 20 78 53 79 6e 63 0a 70 72 6f 63 20 78 53 79 6e   xSync.proc xSyn
bd20: 63 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65  cCb {method file
bd30: 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 73  name args} {.  s
bd40: 65 74 20 74 20 5b 66 69 6c 65 20 74 61 69 6c 20  et t [file tail 
bd50: 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 69 66 20  $filename].  if 
bd60: 7b 24 74 20 3d 3d 20 22 74 65 73 74 2e 64 62 22  {$t == "test.db"
bd70: 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 0a  } faultsim_save.
bd80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bd90: 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65  OK.}.faultsim_de
bda0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
bdb0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
bdc0: 20 61 5f 73 74 72 69 6e 67 0a 0a 23 20 54 68 65   a_string..# The
bdd0: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
bde0: 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
bdf0: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 20 63  this test case c
be00: 72 65 61 74 65 73 20 61 20 72 65 61 6c 6c 79 20  reates a really 
be10: 62 69 67 0a 23 20 6a 6f 75 72 6e 61 6c 2e 20 53  big.# journal. S
be20: 69 6e 63 65 20 74 68 65 20 63 61 63 68 65 2d 73  ince the cache-s
be30: 69 7a 65 20 69 73 20 6f 6e 6c 79 20 31 30 20 70  ize is only 10 p
be40: 61 67 65 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  ages, the journa
be50: 6c 20 63 6f 6e 74 61 69 6e 73 20 0a 23 20 66 72  l contains .# fr
be60: 65 71 75 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  equent journal h
be70: 65 61 64 65 72 73 2e 0a 23 0a 64 6f 5f 65 78 65  eaders..#.do_exe
be80: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
be90: 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 50 52 41 47  -13.1.1 {.  PRAG
bea0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
beb0: 30 32 34 3b 0a 20 20 50 52 41 47 4d 41 20 6a 6f  024;.  PRAGMA jo
bec0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
bed0: 53 49 53 54 3b 0a 20 20 50 52 41 47 4d 41 20 63  SIST;.  PRAGMA c
bee0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
bef0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45    BEGIN;.    CRE
bf00: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
bf10: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
bf20: 45 59 2c 20 62 20 42 4c 4f 42 29 3b 0a 20 20 20  EY, b BLOB);.   
bf30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
bf40: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73  VALUES(NULL, a_s
bf50: 74 72 69 6e 67 28 34 30 30 29 29 3b 0a 20 20 20  tring(400));.   
bf60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
bf70: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
bf80: 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20  tring(400) FROM 
bf90: 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t1;          /* 
bfa0: 20 20 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52    2 */.    INSER
bfb0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
bfc0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
bfd0: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  400) FROM t1;   
bfe0: 20 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f         /*   4 */
bff0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
c000: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
c010: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
c020: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
c030: 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20 49   /*   8 */.    I
c040: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
c050: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
c060: 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31  ing(400) FROM t1
c070: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31  ;          /*  1
c080: 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  6 */.    INSERT 
c090: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e  INTO t1 SELECT N
c0a0: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  ULL, a_string(40
c0b0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
c0c0: 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20       /*  32 */. 
c0d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
c0e0: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  1 SELECT NULL, a
c0f0: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
c100: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f  M t1;          /
c110: 2a 20 20 36 34 20 2a 2f 0a 20 20 20 20 49 4e 53  *  64 */.    INS
c120: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
c130: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
c140: 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(400) FROM t1; 
c150: 20 20 20 20 20 20 20 20 20 2f 2a 20 31 32 38 20           /* 128 
c160: 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 55  */.  COMMIT;.  U
c170: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d  PDATE t1 SET b =
c180: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 3b 0a   a_string(400);.
c190: 7d 20 7b 70 65 72 73 69 73 74 7d 0a 0a 69 66 20  } {persist}..if 
c1a0: 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  {$::tcl_platform
c1b0: 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69 6e  (platform)!="win
c1c0: 64 6f 77 73 22 7d 20 7b 0a 23 20 52 75 6e 20 74  dows"} {.# Run t
c1d0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66 20 69  ransactions of i
c1e0: 6e 63 72 65 61 73 69 6e 67 20 73 69 7a 65 73 2e  ncreasing sizes.
c1f0: 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 65   Eventually, one
c200: 20 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f   (or more than o
c210: 6e 65 29 0a 23 20 6f 66 20 74 68 65 73 65 20 77  ne).# of these w
c220: 69 6c 6c 20 77 72 69 74 65 20 6a 75 73 74 20 65  ill write just e
c230: 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20 74 68  nough content th
c240: 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 6c  at one of the ol
c250: 64 20 68 65 61 64 65 72 73 20 63 72 65 61 74 65  d headers create
c260: 64 20 0a 23 20 62 79 20 74 68 65 20 74 72 61 6e  d .# by the tran
c270: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  saction in the b
c280: 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65 73 20  lock above lies 
c290: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
c2a0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 23 20  r the content.# 
c2b0: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20 74 68  journalled by th
c2c0: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
c2d0: 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b 73 65  ction..#.for {se
c2e0: 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c 36  t nUp 1} {$nUp<6
c2f0: 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b 0a  4} {incr nUp} {.
c300: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
c310: 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e  t pager1-13.1.2.
c320: 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55 50  $nUp.1 { .    UP
c330: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
c340: 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57 48  a_string(399) WH
c350: 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20 20  ERE a <= $nUp.  
c360: 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71  } {}.  do_execsq
c370: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
c380: 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50 52  .1.2.$nUp.2 { PR
c390: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
c3a0: 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a 20 20  heck } {ok} ..  
c3b0: 23 20 54 72 79 20 74 6f 20 61 63 63 65 73 73 20  # Try to access 
c3c0: 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  the snapshot of 
c3d0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
c3e0: 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33 20 64  .  #.  sqlite3 d
c3f0: 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20 20  b2 sv_test.db.  
c400: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
c410: 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20  3.1.2.$nUp.3 {. 
c420: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
c430: 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 62  ECT sum(length(b
c440: 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32  )) FROM t1 } db2
c450: 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a  .  } [expr {128*
c460: 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d  400 - ($nUp-1)}]
c470: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
c480: 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 34 20  1-13.1.2.$nUp.4 
c490: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
c4a0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
c4b0: 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d  _check } db2.  }
c4c0: 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73   {ok}.  db2 clos
c4d0: 65 0a 7d 0a 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63  e.}.}..if {$::tc
c4e0: 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
c4f0: 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d  orm)!="windows"}
c500: 20 7b 0a 23 20 53 61 6d 65 20 74 65 73 74 20 61   {.# Same test a
c510: 73 20 61 62 6f 76 65 2e 20 42 75 74 20 74 68 69  s above. But thi
c520: 73 20 74 69 6d 65 20 77 69 74 68 20 61 6e 20 69  s time with an i
c530: 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62 6c  ndex on the tabl
c540: 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  e..#.do_execsql_
c550: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32  test pager1-13.2
c560: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 49 4e  .1 {.  CREATE IN
c570: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29 3b  DEX i1 ON t1(b);
c580: 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54  .  UPDATE t1 SET
c590: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34 30   b = a_string(40
c5a0: 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b 73 65  0);.} {}.for {se
c5b0: 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c 36  t nUp 1} {$nUp<6
c5c0: 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b 0a  4} {incr nUp} {.
c5d0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
c5e0: 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e  t pager1-13.2.2.
c5f0: 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55 50  $nUp.1 { .    UP
c600: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
c610: 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57 48  a_string(399) WH
c620: 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20 20  ERE a <= $nUp.  
c630: 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71  } {}.  do_execsq
c640: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
c650: 2e 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50 52  .2.2.$nUp.2 { PR
c660: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
c670: 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20 20 73  heck } {ok} .  s
c680: 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74 65  qlite3 db2 sv_te
c690: 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74 20  st.db.  do_test 
c6a0: 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e  pager1-13.2.2.$n
c6b0: 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  Up.3 {.    execs
c6c0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28  ql { SELECT sum(
c6d0: 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d 20  length(b)) FROM 
c6e0: 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78  t1 } db2.  } [ex
c6f0: 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28 24  pr {128*400 - ($
c700: 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65  nUp-1)}].  do_te
c710: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32  st pager1-13.2.2
c720: 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65 78  .$nUp.4 {.    ex
c730: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69  ecsql { PRAGMA i
c740: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
c750: 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20   db2.  } {ok}.  
c760: 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a 64  db2 close.}.}..d
c770: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
c780: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
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 2d 2d  ----------------
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
c7d0: 54 65 73 74 20 73 70 65 63 61 6c 20 22 50 52 41  Test specal "PRA
c7e0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
c7f0: 3d 4f 46 46 22 20 74 65 73 74 20 63 61 73 65 73  =OFF" test cases
c800: 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c  ..#.faultsim_del
c810: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ete_and_reopen.d
c820: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
c830: 61 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b 0a 20  ager1-14.1.1 {. 
c840: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
c850: 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20 43 52  mode = OFF;.  CR
c860: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
c870: 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20   b);.  BEGIN;.  
c880: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
c890: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
c8a0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43   COMMIT;.  SELEC
c8b0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b  T * FROM t1;.} {
c8c0: 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61 74 63  off 1 2}.do_catc
c8d0: 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  hsql_test pager1
c8e0: 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45 47 49  -14.1.2 {.  BEGI
c8f0: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
c900: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
c910: 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  4);.  ROLLBACK;.
c920: 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78 65 63  } {0 {}}.do_exec
c930: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
c940: 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43  14.1.3 {.  SELEC
c950: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b  T * FROM t1;.} {
c960: 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  1 2}.do_catchsql
c970: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e  _test pager1-14.
c980: 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20  1.4 {.  BEGIN;. 
c990: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
c9a0: 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 53  1(rowid, a, b) S
c9b0: 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62 20  ELECT a+3, b, b 
c9c0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
c9d0: 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77 69  ERT INTO t1(rowi
c9e0: 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54 20  d, a, b) SELECT 
c9f0: 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20 74  a+3, b, b FROM t
ca00: 31 3b 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20  1;.} {1 {UNIQUE 
ca10: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
ca20: 64 3a 20 74 31 2e 72 6f 77 69 64 7d 7d 0a 64 6f  d: t1.rowid}}.do
ca30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
ca40: 67 65 72 31 2d 31 34 2e 31 2e 35 20 7b 0a 20 20  ger1-14.1.5 {.  
ca50: 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54  COMMIT;.  SELECT
ca60: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31   * FROM t1;.} {1
ca70: 20 32 20 32 20 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   2 2 2}..#------
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 2d 2d 2d 2d  ----------------
cab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cac0: 2d 2d 2d 0a 23 20 54 65 73 74 20 6f 70 65 6e 69  ---.# Test openi
cad0: 6e 67 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  ng and closing t
cae0: 68 65 20 70 61 67 65 72 20 73 75 62 2d 73 79 73  he pager sub-sys
caf0: 74 65 6d 20 77 69 74 68 20 64 69 66 66 65 72 65  tem with differe
cb00: 6e 74 20 76 61 6c 75 65 73 0a 23 20 66 6f 72 20  nt values.# for 
cb10: 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
cb20: 73 7a 4f 73 46 69 6c 65 20 76 61 72 69 61 62 6c  szOsFile variabl
cb30: 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65  e..#.faultsim_de
cb40: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
cb50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
cb60: 70 61 67 65 72 31 2d 31 35 2e 30 20 7b 0a 20 20  pager1-15.0 {.  
cb70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 78 28  CREATE TABLE tx(
cb80: 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45 52 54 20  y, z);.  INSERT 
cb90: 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28 27  INTO tx VALUES('
cba0: 41 79 75 74 74 68 61 79 61 27 2c 20 27 42 65 69  Ayutthaya', 'Bei
cbb0: 6a 69 6e 67 27 29 3b 0a 20 20 49 4e 53 45 52 54  jing');.  INSERT
cbc0: 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28   INTO tx VALUES(
cbd0: 27 4c 6f 6e 64 6f 6e 27 2c 20 27 54 6f 6b 79 6f  'London', 'Tokyo
cbe0: 27 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73  ');.} {}.db clos
cbf0: 65 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20  e.for {set i 0} 
cc00: 7b 24 69 3c 35 31 33 7d 20 7b 69 6e 63 72 20 69  {$i<513} {incr i
cc10: 20 33 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 20   3} {.  testvfs 
cc20: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 73  tv -default 1 -s
cc30: 7a 6f 73 66 69 6c 65 20 24 69 0a 20 20 73 71 6c  zosfile $i.  sql
cc40: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
cc50: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
cc60: 74 20 70 61 67 65 72 31 2d 31 35 2e 24 69 2e 31  t pager1-15.$i.1
cc70: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
cc80: 46 52 4f 4d 20 74 78 3b 0a 20 20 7d 20 7b 41 79  FROM tx;.  } {Ay
cc90: 75 74 74 68 61 79 61 20 42 65 69 6a 69 6e 67 20  utthaya Beijing 
cca0: 4c 6f 6e 64 6f 6e 20 54 6f 6b 79 6f 7d 0a 20 20  London Tokyo}.  
ccb0: 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65  db close.  tv de
ccc0: 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lete.}..#-------
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 2d 2d 2d 2d 2d  ----------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20  --.# Check that 
cd20: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
cd30: 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 64 61 74  le to open a dat
cd40: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 74 68  abase file if th
cd50: 65 20 66 75 6c 6c 20 70 61 74 68 0a 23 20 74 6f  e full path.# to
cd60: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
cd70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
cd80: 6c 20 62 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l be longer than
cd90: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
cda0: 61 74 68 6e 61 6d 65 2e 0a 23 0a 74 65 73 74 76  athname..#.testv
cdb0: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
cdc0: 0a 74 76 20 73 63 72 69 70 74 20 78 4f 70 65 6e  .tv script xOpen
cdd0: 43 62 0a 74 76 20 66 69 6c 74 65 72 20 78 4f 70  Cb.tv filter xOp
cde0: 65 6e 0a 70 72 6f 63 20 78 4f 70 65 6e 43 62 20  en.proc xOpenCb 
cdf0: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65  {method filename
ce00: 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 3a   args} {.  set :
ce10: 3a 66 69 6c 65 5f 6c 65 6e 20 5b 73 74 72 69 6e  :file_len [strin
ce20: 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61  g length $filena
ce30: 6d 65 5d 0a 7d 0a 73 71 6c 69 74 65 33 20 64 62  me].}.sqlite3 db
ce40: 20 74 65 73 74 2e 64 62 0a 64 62 20 63 6c 6f 73   test.db.db clos
ce50: 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 66 6f 72  e.tv delete..for
ce60: 20 7b 73 65 74 20 69 69 20 5b 65 78 70 72 20 24   {set ii [expr $
ce70: 3a 3a 66 69 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b  ::file_len-5]} {
ce80: 24 69 69 20 3c 20 5b 65 78 70 72 20 24 3a 3a 66  $ii < [expr $::f
ce90: 69 6c 65 5f 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e  ile_len+20]} {in
cea0: 63 72 20 69 69 7d 20 7b 0a 20 20 74 65 73 74 76  cr ii} {.  testv
ceb0: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
cec0: 20 2d 6d 78 70 61 74 68 6e 61 6d 65 20 24 69 69   -mxpathname $ii
ced0: 0a 0a 20 20 23 20 54 68 65 20 6c 65 6e 67 74 68  ..  # The length
cee0: 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 70 61 74   of the full pat
cef0: 68 20 74 6f 20 66 69 6c 65 20 22 74 65 73 74 2e  h to file "test.
cf00: 64 62 2d 6a 6f 75 72 6e 61 6c 22 20 69 73 20 28  db-journal" is (
cf10: 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a  $::file_len+8)..
cf20: 20 20 23 20 49 66 20 74 68 65 20 63 6f 6e 66 69    # If the confi
cf30: 67 75 72 65 64 20 73 71 6c 69 74 65 33 5f 76 66  gured sqlite3_vf
cf40: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 76 61 6c  s.mxPathname val
cf50: 75 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ue greater than 
cf60: 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 23 20  or equal to.  # 
cf70: 74 68 69 73 2c 20 74 68 65 6e 20 74 68 65 20 66  this, then the f
cf80: 69 6c 65 20 63 61 6e 20 62 65 20 6f 70 65 6e 65  ile can be opene
cf90: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  d. Otherwise, it
cfa0: 20 63 61 6e 6e 6f 74 2e 0a 20 20 23 0a 20 20 69   cannot..  #.  i
cfb0: 66 20 7b 24 69 69 20 3e 3d 20 5b 65 78 70 72 20  f {$ii >= [expr 
cfc0: 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20  $::file_len+8]} 
cfd0: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 30  {.    set res {0
cfe0: 20 7b 7d 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   {}}.  } else {.
cff0: 20 20 20 20 73 65 74 20 72 65 73 20 7b 31 20 7b      set res {1 {
d000: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
d010: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20  atabase file}}. 
d020: 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   }..  do_test pa
d030: 67 65 72 31 2d 31 36 2e 31 2e 24 69 69 20 7b 0a  ger1-16.1.$ii {.
d040: 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20      list [catch 
d050: 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  { sqlite3 db tes
d060: 74 2e 64 62 20 7d 20 6d 73 67 5d 20 24 6d 73 67  t.db } msg] $msg
d070: 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20 63 61 74  .  } $res..  cat
d080: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20  ch {db close}.  
d090: 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 0a 23 2d  tv delete.}...#-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
d0f0: 74 68 65 20 70 61 67 65 72 73 20 72 65 73 70 6f  the pagers respo
d100: 6e 73 65 20 74 6f 20 74 68 65 20 62 2d 74 72 65  nse to the b-tre
d110: 65 20 6c 61 79 65 72 20 72 65 71 75 65 73 74 69  e layer requesti
d120: 6e 67 20 69 6c 6c 65 67 61 6c 20 70 61 67 65 20  ng illegal page 
d130: 0a 23 20 6e 75 6d 62 65 72 73 3a 0a 23 0a 23 20  .# numbers:.#.# 
d140: 20 20 2b 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20    + The locking 
d150: 70 61 67 65 2c 0a 23 20 20 20 2b 20 50 61 67 65  page,.#   + Page
d160: 20 30 2c 0a 23 20 20 20 2b 20 41 20 70 61 67 65   0,.#   + A page
d170: 20 77 69 74 68 20 61 20 70 61 67 65 20 6e 75 6d   with a page num
d180: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
d190: 20 28 32 5e 33 31 2d 31 29 2e 0a 23 0a 23 20 54   (2^31-1)..#.# T
d1a0: 68 65 73 65 20 74 65 73 74 73 20 77 69 6c 6c 20  hese tests will 
d1b0: 6e 6f 74 20 77 6f 72 6b 20 69 66 20 53 51 4c 49  not work if SQLI
d1c0: 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
d1d0: 4f 57 5f 52 45 41 44 20 69 73 20 64 65 66 69 6e  OW_READ is defin
d1e0: 65 64 2e 20 49 6e 0a 23 20 74 68 61 74 20 63 61  ed. In.# that ca
d1f0: 73 65 20 49 4f 20 65 72 72 6f 72 73 20 61 72 65  se IO errors are
d200: 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 70 6f 72   sometimes repor
d210: 74 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 53  ted instead of S
d220: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 23  QLITE_CORRUPT..#
d230: 0a 69 66 63 61 70 61 62 6c 65 20 21 64 69 72 65  .ifcapable !dire
d240: 63 74 5f 72 65 61 64 20 7b 0a 64 6f 5f 74 65 73  ct_read {.do_tes
d250: 74 20 70 61 67 65 72 31 2d 31 38 2e 31 20 7b 0a  t pager1-18.1 {.
d260: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
d270: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
d280: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
d290: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
d2a0: 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41  ql { .    PRAGMA
d2b0: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
d2c0: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
d2d0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
d2e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d2f0: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
d300: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d310: 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  200));.    INSER
d320: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d330: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d340: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d350: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d360: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d370: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d380: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d390: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d3a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d3b0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d3c0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d3d0: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d3e0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d3f0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d400: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d410: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d420: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d430: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d440: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d450: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d460: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d470: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d480: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d490: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d4a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d4b0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d4c0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d4d0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM t1;.  }.} {}.
d4e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d4f0: 38 2e 32 20 7b 0a 20 20 73 65 74 20 72 6f 6f 74  8.2 {.  set root
d500: 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54   [db one "SELECT
d510: 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73   rootpage FROM s
d520: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20  qlite_master"]. 
d530: 20 73 65 74 20 6c 6f 63 6b 69 6e 67 70 61 67 65   set lockingpage
d540: 20 5b 65 78 70 72 20 28 30 78 31 30 30 30 30 2f   [expr (0x10000/
d550: 31 30 32 34 29 20 2b 20 31 5d 0a 20 20 65 78 65  1024) + 1].  exe
d560: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
d570: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
d580: 61 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54  a = 1;.    UPDAT
d590: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  E sqlite_master 
d5a0: 53 45 54 20 72 6f 6f 74 70 61 67 65 20 3d 20 24  SET rootpage = $
d5b0: 6c 6f 63 6b 69 6e 67 70 61 67 65 3b 0a 20 20 7d  lockingpage;.  }
d5c0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
d5d0: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
d5e0: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
d5f0: 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  (*) FROM t1 } db
d600: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
d610: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
d620: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63  alformed}}.db2 c
d630: 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67  lose.do_test pag
d640: 65 72 31 2d 31 38 2e 33 2e 31 20 7b 0a 20 20 65  er1-18.3.1 {.  e
d650: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
d660: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b  ATE TABLE t2(x);
d670: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d680: 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t2 VALUES(a_str
d690: 69 6e 67 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a  ing(5000));.  }.
d6a0: 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78 70 72    set pgno [expr
d6b0: 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73   ([file size tes
d6c0: 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d  t.db] / 1024)-2]
d6d0: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
d6e0: 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70  est.db [expr ($p
d6f0: 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30 30  gno-1)*1024] 000
d700: 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
d710: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 23 20  db2 test.db.  # 
d720: 65 76 65 6e 20 74 68 6f 75 67 68 20 78 20 69 73  even though x is
d730: 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 62 65 63 61   malformed, beca
d740: 75 73 65 20 74 79 70 65 6f 66 28 29 20 64 6f 65  use typeof() doe
d750: 73 0a 20 20 23 20 6e 6f 74 20 6c 6f 61 64 20 74  s.  # not load t
d760: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 78 2c  he content of x,
d770: 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f   the error is no
d780: 74 20 6e 6f 74 69 63 65 64 2e 0a 20 20 63 61 74  t noticed..  cat
d790: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 74  chsql { SELECT t
d7a0: 79 70 65 6f 66 28 78 29 20 46 52 4f 4d 20 74 32  ypeof(x) FROM t2
d7b0: 20 7d 20 64 62 32 0a 7d 20 7b 30 20 74 65 78 74   } db2.} {0 text
d7c0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
d7d0: 2d 31 38 2e 33 2e 32 20 7b 0a 20 20 23 20 69 6e  -18.3.2 {.  # in
d7e0: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
d7f0: 76 61 6c 75 65 20 6f 66 20 78 20 69 73 20 6c 6f  value of x is lo
d800: 61 64 65 64 20 61 6e 64 20 73 6f 20 74 68 65 20  aded and so the 
d810: 65 72 72 6f 72 20 69 73 0a 20 20 23 20 64 65 74  error is.  # det
d820: 65 63 74 65 64 0a 20 20 63 61 74 63 68 73 71 6c  ected.  catchsql
d830: 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68   { SELECT length
d840: 28 78 7c 7c 27 27 29 20 46 52 4f 4d 20 74 32 20  (x||'') FROM t2 
d850: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
d860: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
d870: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64  is malformed}}.d
d880: 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  b2 close.do_test
d890: 20 70 61 67 65 72 31 2d 31 38 2e 33 2e 33 20 7b   pager1-18.3.3 {
d8a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
d8b0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b   DELETE FROM t2;
d8c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d8d0: 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t2 VALUES(rando
d8e0: 6d 62 6c 6f 62 28 35 30 30 30 29 29 3b 0a 20 20  mblob(5000));.  
d8f0: 7d 0a 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78  }.  set pgno [ex
d900: 70 72 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74  pr ([file size t
d910: 65 73 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d  est.db] / 1024)-
d920: 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  2].  hexio_write
d930: 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28   test.db [expr (
d940: 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30  $pgno-1)*1024] 0
d950: 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65  0000000.  sqlite
d960: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
d970: 23 20 65 76 65 6e 20 74 68 6f 75 67 68 20 78 20  # even though x 
d980: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 62 65  is malformed, be
d990: 63 61 75 73 65 20 6c 65 6e 67 74 68 28 29 20 61  cause length() a
d9a0: 6e 64 20 74 79 70 65 6f 66 28 29 20 64 6f 0a 20  nd typeof() do. 
d9b0: 20 23 20 6e 6f 74 20 6c 6f 61 64 20 74 68 65 20   # not load the 
d9c0: 63 6f 6e 74 65 6e 74 20 6f 66 20 78 2c 20 74 68  content of x, th
d9d0: 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 6e  e error is not n
d9e0: 6f 74 69 63 65 64 2e 0a 20 20 63 61 74 63 68 73  oticed..  catchs
d9f0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67  ql { SELECT leng
da00: 74 68 28 78 29 2c 20 74 79 70 65 6f 66 28 78 29  th(x), typeof(x)
da10: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
da20: 20 7b 30 20 7b 35 30 30 30 20 62 6c 6f 62 7d 7d   {0 {5000 blob}}
da30: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
da40: 31 38 2e 33 2e 34 20 7b 0a 20 20 23 20 69 6e 20  18.3.4 {.  # in 
da50: 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 76  this case, the v
da60: 61 6c 75 65 20 6f 66 20 78 20 69 73 20 6c 6f 61  alue of x is loa
da70: 64 65 64 20 61 6e 64 20 73 6f 20 74 68 65 20 65  ded and so the e
da80: 72 72 6f 72 20 69 73 0a 20 20 23 20 64 65 74 65  rror is.  # dete
da90: 63 74 65 64 0a 20 20 63 61 74 63 68 73 71 6c 20  cted.  catchsql 
daa0: 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28  { SELECT length(
dab0: 78 7c 7c 27 27 29 20 46 52 4f 4d 20 74 32 20 7d  x||'') FROM t2 }
dac0: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
dad0: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
dae0: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
daf0: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
db00: 70 61 67 65 72 31 2d 31 38 2e 34 20 7b 0a 20 20  pager1-18.4 {.  
db10: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
db20: 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f  .db [expr ($pgno
db30: 2d 31 29 2a 31 30 32 34 5d 20 39 30 30 30 30 30  -1)*1024] 900000
db40: 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  00.  sqlite3 db2
db50: 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68   test.db.  catch
db60: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e  sql { SELECT len
db70: 67 74 68 28 78 7c 7c 27 27 29 20 46 52 4f 4d 20  gth(x||'') FROM 
db80: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t2 } db2.} {1 {d
db90: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
dba0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
dbb0: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
dbc0: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 35 20  est pager1-18.5 
dbd0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22  {.  sqlite3 db "
dbe0: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
dbf0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
dc00: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
dc10: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
dc20: 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  b);.    PRAGMA w
dc30: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
dc40: 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73   1;.    UPDATE s
dc50: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54  qlite_master SET
dc60: 20 72 6f 6f 74 70 61 67 65 3d 35 20 57 48 45 52   rootpage=5 WHER
dc70: 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74 31  E tbl_name = 't1
dc80: 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72  ';.    PRAGMA wr
dc90: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
dca0: 30 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42  0;.    ALTER TAB
dcb0: 4c 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20  LE t1 RENAME TO 
dcc0: 78 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73  x1;.  }.  catchs
dcd0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
dce0: 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31 20 7b 64 61  OM x1 }.} {1 {da
dcf0: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
dd00: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
dd10: 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65  .db close..do_te
dd20: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 36 20 7b  st pager1-18.6 {
dd30: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
dd40: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
dd50: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
dd60: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
dd70: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
dd80: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
dd90: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
dda0: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49  BLE t1(x);.    I
ddb0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
ddc0: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30  LUES(a_string(80
ddd0: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
dde0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
ddf0: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
de00: 20 7d 0a 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b   }..  set root [
de10: 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72  db one "SELECT r
de20: 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c  ootpage FROM sql
de30: 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 64  ite_master"].  d
de40: 62 20 63 6c 6f 73 65 0a 0a 20 20 68 65 78 69 6f  b close..  hexio
de50: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b  _write test.db [
de60: 65 78 70 72 20 28 24 72 6f 6f 74 2d 31 29 2a 31  expr ($root-1)*1
de70: 30 32 34 20 2b 20 38 5d 20 30 30 30 30 30 30 30  024 + 8] 0000000
de80: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  0.  sqlite3 db t
de90: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
dea0: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
deb0: 68 28 78 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  h(x) FROM t1 }.}
dec0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
ded0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
dee0: 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65  ormed}}.}..do_te
def0: 73 74 20 70 61 67 65 72 31 2d 31 39 2e 31 20 7b  st pager1-19.1 {
df00: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22 22  .  sqlite3 db ""
df10: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
df20: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65  ing a_string.  e
df30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
df40: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
df50: 35 31 32 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  512;.    PRAGMA 
df60: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b  auto_vacuum = 1;
df70: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
df80: 45 20 74 31 28 61 61 2c 20 61 62 2c 20 61 63 2c  E t1(aa, ab, ac,
df90: 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c   ad, ae, af, ag,
dfa0: 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c   ah, ai, aj, ak,
dfb0: 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20   al, am, an,.   
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c   ba, bb, bc, bd,
dfe0: 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c   be, bf, bg, bh,
dff0: 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c   bi, bj, bk, bl,
e000: 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20   bm, bn,.       
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 2c               ca,
e020: 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c   cb, cc, cd, ce,
e030: 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c   cf, cg, ch, ci,
e040: 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c   cj, ck, cl, cm,
e050: 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   cn,.           
e060: 20 20 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c           da, db,
e070: 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c   dc, dd, de, df,
e080: 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c   dg, dh, di, dj,
e090: 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c   dk, dl, dm, dn,
e0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e0b0: 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c       ea, eb, ec,
e0c0: 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c   ed, ee, ef, eg,
e0d0: 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c   eh, ei, ej, ek,
e0e0: 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20   el, em, en,.   
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c   fa, fb, fc, fd,
e110: 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c   fe, ff, fg, fh,
e120: 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c   fi, fj, fk, fl,
e130: 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20   fm, fn,.       
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 61 2c               ga,
e150: 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c   gb, gc, gd, ge,
e160: 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c   gf, gg, gh, gi,
e170: 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c   gj, gk, gl, gm,
e180: 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   gn,.           
e190: 20 20 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c           ha, hb,
e1a0: 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c   hc, hd, he, hf,
e1b0: 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c   hg, hh, hi, hj,
e1c0: 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c   hk, hl, hm, hn,
e1d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e1e0: 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c       ia, ib, ic,
e1f0: 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c   id, ie, if, ig,
e200: 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c   ih, ii, ij, ik,
e210: 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20   il, im, ix,.   
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c   ja, jb, jc, jd,
e240: 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c   je, jf, jg, jh,
e250: 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c   ji, jj, jk, jl,
e260: 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20   jm, jn,.       
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c               ka,
e280: 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c   kb, kc, kd, ke,
e290: 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c   kf, kg, kh, ki,
e2a0: 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c   kj, kk, kl, km,
e2b0: 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   kn,.           
e2c0: 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c           la, lb,
e2d0: 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c   lc, ld, le, lf,
e2e0: 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c   lg, lh, li, lj,
e2f0: 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c   lk, ll, lm, ln,
e300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e310: 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c       ma, mb, mc,
e320: 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c   md, me, mf, mg,
e330: 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c   mh, mi, mj, mk,
e340: 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20   ml, mm, mn.    
e350: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
e360: 42 4c 45 20 74 32 28 61 61 2c 20 61 62 2c 20 61  BLE t2(aa, ab, a
e370: 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61  c, ad, ae, af, a
e380: 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61  g, ah, ai, aj, a
e390: 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20  k, al, am, an,. 
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62     ba, bb, bc, b
e3c0: 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62  d, be, bf, bg, b
e3d0: 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62  h, bi, bj, bk, b
e3e0: 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20  l, bm, bn,.     
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
e400: 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63  a, cb, cc, cd, c
e410: 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63  e, cf, cg, ch, c
e420: 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63  i, cj, ck, cl, c
e430: 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, cn,.         
e440: 20 20 20 20 20 20 20 20 20 20 20 64 61 2c 20 64             da, d
e450: 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64  b, dc, dd, de, d
e460: 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64  f, dg, dh, di, d
e470: 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64  j, dk, dl, dm, d
e480: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e490: 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65         ea, eb, e
e4a0: 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65  c, ed, ee, ef, e
e4b0: 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65  g, eh, ei, ej, e
e4c0: 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20  k, el, em, en,. 
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66     fa, fb, fc, f
e4f0: 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66  d, fe, ff, fg, f
e500: 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66  h, fi, fj, fk, f
e510: 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20  l, fm, fn,.     
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
e530: 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67  a, gb, gc, gd, g
e540: 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67  e, gf, gg, gh, g
e550: 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67  i, gj, gk, gl, g
e560: 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, gn,.         
e570: 20 20 20 20 20 20 20 20 20 20 20 68 61 2c 20 68             ha, h
e580: 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68  b, hc, hd, he, h
e590: 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68  f, hg, hh, hi, h
e5a0: 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68  j, hk, hl, hm, h
e5b0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e5c0: 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69         ia, ib, i
e5d0: 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69  c, id, ie, if, i
e5e0: 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69  g, ih, ii, ij, i
e5f0: 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20  k, il, im, ix,. 
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a     ja, jb, jc, j
e620: 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a  d, je, jf, jg, j
e630: 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a  h, ji, jj, jk, j
e640: 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20  l, jm, jn,.     
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
e660: 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b  a, kb, kc, kd, k
e670: 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b  e, kf, kg, kh, k
e680: 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b  i, kj, kk, kl, k
e690: 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, kn,.         
e6a0: 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c             la, l
e6b0: 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c  b, lc, ld, le, l
e6c0: 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c  f, lg, lh, li, l
e6d0: 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c  j, lk, ll, lm, l
e6e0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e6f0: 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d         ma, mb, m
e700: 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d  c, md, me, mf, m
e710: 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d  g, mh, mi, mj, m
e720: 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20  k, ml, mm, mn.  
e730: 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20    );.    INSERT 
e740: 49 4e 54 4f 20 74 31 28 61 61 29 20 56 41 4c 55  INTO t1(aa) VALU
e750: 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30 30  ES( a_string(100
e760: 30 30 30 29 20 29 3b 0a 20 20 20 20 49 4e 53 45  000) );.    INSE
e770: 52 54 20 49 4e 54 4f 20 74 32 28 61 61 29 20 56  RT INTO t2(aa) V
e780: 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28  ALUES( a_string(
e790: 31 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20 56  100000) );.    V
e7a0: 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  ACUUM;.  }.} {}.
e7b0: 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
e800: 73 74 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 73  st a couple of s
e810: 70 65 63 69 61 6c 20 63 61 73 65 73 20 74 68 61  pecial cases tha
e820: 74 20 63 6f 6d 65 20 75 70 20 77 68 69 6c 65 20  t come up while 
e830: 63 6f 6d 6d 69 74 74 69 6e 67 20 0a 23 20 74 72  committing .# tr
e840: 61 6e 73 61 63 74 69 6f 6e 73 3a 0a 23 0a 23 20  ansactions:.#.# 
e850: 20 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 2a 3a    pager1-20.1.*:
e860: 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 20 69   Committing an i
e870: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
e880: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68  e transaction wh
e890: 65 6e 20 74 68 65 20 0a 23 20 20 20 20 20 20 20  en the .#       
e8a0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
e8b0: 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ase has not been
e8c0: 20 6d 6f 64 69 66 69 65 64 20 61 74 20 61 6c 6c   modified at all
e8d0: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
e8e0: 30 2e 32 2e 2a 3a 20 41 73 20 61 62 6f 76 65 2c  0.2.*: As above,
e8f0: 20 62 75 74 20 77 69 74 68 20 61 20 6e 6f 72 6d   but with a norm
e900: 61 6c 20 64 62 20 69 6e 20 65 78 63 6c 75 73 69  al db in exclusi
e910: 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e  ve-locking mode.
e920: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30  .#.#   pager1-20
e930: 2e 33 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67  .3.*: Committing
e940: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
e950: 6e 20 57 41 4c 20 6d 6f 64 65 20 77 68 65 72 65  n WAL mode where
e960: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
e970: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
e980: 20 20 20 20 20 62 65 65 6e 20 6d 6f 64 69 66 69       been modifi
e990: 65 64 2c 20 62 75 74 20 61 6c 6c 20 64 69 72 74  ed, but all dirt
e9a0: 79 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  y pages have bee
e9b0: 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 0a 23 20  n flushed to .# 
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 20 64 69 73 6b 20 62 65 66 6f 72 65 20 74 68 65   disk before the
e9e0: 20 63 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74 65   commit..#.do_te
e9f0: 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 31  st pager1-20.1.1
ea00: 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63   {.  catch {db c
ea10: 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65 33 20  lose}.  sqlite3 
ea20: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78  db :memory:.  ex
ea30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
ea40: 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f  TE TABLE one(two
ea50: 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e  , three);.    IN
ea60: 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41  SERT INTO one VA
ea70: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
ea80: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
ea90: 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 32 20 7b   pager1-20.1.2 {
eaa0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
eab0: 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45   BEGIN EXCLUSIVE
eac0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
ead0: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
eae0: 70 61 67 65 72 31 2d 32 30 2e 32 2e 31 20 7b 0a  pager1-20.2.1 {.
eaf0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
eb00: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
eb10: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
eb20: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
eb30: 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20   = exclusive;.  
eb40: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
eb50: 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b  _mode = persist;
eb60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
eb70: 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65  E one(two, three
eb80: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
eb90: 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61  TO one VALUES('a
eba0: 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b  ', 'b');.  }.} {
ebb0: 65 78 63 6c 75 73 69 76 65 20 70 65 72 73 69 73  exclusive persis
ebc0: 74 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  t}.do_test pager
ebd0: 31 2d 32 30 2e 32 2e 32 20 7b 0a 20 20 65 78 65  1-20.2.2 {.  exe
ebe0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
ebf0: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20   EXCLUSIVE;.    
ec00: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
ec10: 0a 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20  ..ifcapable wal 
ec20: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  {.  do_test page
ec30: 72 31 2d 32 30 2e 33 2e 31 20 7b 0a 20 20 20 20  r1-20.3.1 {.    
ec40: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
ec50: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64  and_reopen.    d
ec60: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
ec70: 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65  a_string.    exe
ec80: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
ec90: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
eca0: 20 31 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d   10;.      PRAGM
ecb0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
ecc0: 20 77 61 6c 3b 0a 20 20 20 20 20 20 42 45 47 49   wal;.      BEGI
ecd0: 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  N;.        CREAT
ece0: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
ecf0: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
ed00: 42 4c 45 20 74 32 28 79 29 3b 0a 20 20 20 20 20  BLE t2(y);.     
ed10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
ed20: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
ed30: 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20 20 20  g(800));.       
ed40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ed50: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
ed60: 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  800) FROM t1;   
ed70: 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a        /*   2 */.
ed80: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
ed90: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
eda0: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
edb0: 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   t1;         /* 
edc0: 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 49    4 */.        I
edd0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
ede0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
edf0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
ee00: 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20      /*   8 */.  
ee10: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
ee20: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
ee30: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
ee40: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31  1;         /*  1
ee50: 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53  6 */.        INS
ee60: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
ee70: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
ee80: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
ee90: 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20    /*  32 */.    
eea0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a    COMMIT;.    }.
eeb0: 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74    } {wal}.  do_t
eec0: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e  est pager1-20.3.
eed0: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
eee0: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
eef0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
ef00: 20 74 32 20 56 41 4c 55 45 53 28 27 78 78 78 78   t2 VALUES('xxxx
ef10: 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ');.    }.    re
ef20: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33  cursive_select 3
ef30: 32 20 74 31 0a 20 20 20 20 65 78 65 63 73 71 6c  2 t1.    execsql
ef40: 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 7d   COMMIT.  } {}.}
ef50: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
ef60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
efa0: 65 73 74 20 74 68 61 74 20 61 20 57 41 4c 20 64  est that a WAL d
efb0: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
efc0: 62 65 20 6f 70 65 6e 65 64 20 69 66 3a 0a 23 0a  be opened if:.#.
efd0: 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e 31 2e  #   pager1-21.1.
efe0: 2a 3a 20 54 68 65 20 56 46 53 20 68 61 73 20 61  *: The VFS has a
eff0: 6e 20 69 56 65 72 73 69 6f 6e 20 6c 65 73 73 20  n iVersion less 
f000: 74 68 61 6e 20 32 2c 20 6f 72 0a 23 20 20 20 70  than 2, or.#   p
f010: 61 67 65 72 31 2d 32 31 2e 32 2e 2a 3a 20 54 68  ager1-21.2.*: Th
f020: 65 20 56 46 53 20 64 6f 65 73 20 6e 6f 74 20 70  e VFS does not p
f030: 72 6f 76 69 64 65 20 78 53 68 6d 58 58 58 28 29  rovide xShmXXX()
f040: 20 6d 65 74 68 6f 64 73 2e 0a 23 0a 69 66 63 61   methods..#.ifca
f050: 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f  pable wal {.  do
f060: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e  _test pager1-21.
f070: 30 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d  0 {.    faultsim
f080: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
f090: 65 6e 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  en.    execsql {
f0a0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
f0b0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
f0c0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
f0d0: 41 42 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c  ABLE ko(c DEFAUL
f0e0: 54 20 27 61 62 63 27 2c 20 62 20 44 45 46 41 55  T 'abc', b DEFAU
f0f0: 4c 54 20 27 64 65 66 27 29 3b 0a 20 20 20 20 20  LT 'def');.     
f100: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20   INSERT INTO ko 
f110: 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a  DEFAULT VALUES;.
f120: 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a      }.  } {wal}.
f130: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
f140: 2d 32 31 2e 31 20 7b 0a 20 20 20 20 74 65 73 74  -21.1 {.    test
f150: 76 66 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31 0a  vfs tv -noshm 1.
f160: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20      sqlite3 db2 
f170: 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a  test.db -vfs tv.
f180: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53      catchsql { S
f190: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20  ELECT * FROM ko 
f1a0: 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75 6e  } db2.  } {1 {un
f1b0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
f1c0: 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 64  abase file}}.  d
f1d0: 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65  b2 close.  tv de
f1e0: 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70  lete.  do_test p
f1f0: 61 67 65 72 31 2d 32 31 2e 32 20 7b 0a 20 20 20  ager1-21.2 {.   
f200: 20 74 65 73 74 76 66 73 20 74 76 20 2d 69 76 65   testvfs tv -ive
f210: 72 73 69 6f 6e 20 31 0a 20 20 20 20 73 71 6c 69  rsion 1.    sqli
f220: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20  te3 db2 test.db 
f230: 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61 74 63  -vfs tv.    catc
f240: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  hsql { SELECT * 
f250: 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20 20  FROM ko } db2.  
f260: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  } {1 {unable to 
f270: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
f280: 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65  le}}.  db2 close
f290: 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a  .  tv delete.}..
f2a0: 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
f2f0: 74 20 74 68 61 74 20 61 20 22 50 52 41 47 4d 41  t that a "PRAGMA
f300: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22   wal_checkpoint"
f310: 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  :.#.#   pager1-2
f320: 32 2e 31 2e 2a 3a 20 69 73 20 61 20 6e 6f 2d 6f  2.1.*: is a no-o
f330: 70 20 6f 6e 20 61 20 6e 6f 6e 2d 57 41 4c 20 64  p on a non-WAL d
f340: 62 2c 20 61 6e 64 0a 23 20 20 20 70 61 67 65 72  b, and.#   pager
f350: 31 2d 32 32 2e 32 2e 2a 3a 20 64 6f 65 73 20 6e  1-22.2.*: does n
f360: 6f 74 20 63 61 75 73 65 20 78 53 79 6e 63 20 63  ot cause xSync c
f370: 61 6c 6c 73 20 77 69 74 68 20 61 20 73 79 6e 63  alls with a sync
f380: 68 72 6f 6e 6f 75 73 3d 6f 66 66 20 64 62 2e 0a  hronous=off db..
f390: 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20  #.ifcapable wal 
f3a0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  {.  do_test page
f3b0: 72 31 2d 32 32 2e 31 2e 31 20 7b 0a 20 20 20 20  r1-22.1.1 {.    
f3c0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
f3d0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 65  and_reopen.    e
f3e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
f3f0: 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28 63  REATE TABLE ko(c
f400: 20 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c 20   DEFAULT 'abc', 
f410: 62 20 44 45 46 41 55 4c 54 20 27 64 65 66 27 29  b DEFAULT 'def')
f420: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
f430: 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56  NTO ko DEFAULT V
f440: 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20 20 20  ALUES;.    }.   
f450: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f460: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
f470: 20 7d 0a 20 20 7d 20 7b 30 20 2d 31 20 2d 31 7d   }.  } {0 -1 -1}
f480: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
f490: 31 2d 32 32 2e 32 2e 31 20 7b 0a 20 20 20 20 74  1-22.2.1 {.    t
f4a0: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
f4b0: 6c 74 20 31 0a 20 20 20 20 74 76 20 66 69 6c 74  lt 1.    tv filt
f4c0: 65 72 20 78 53 79 6e 63 0a 20 20 20 20 74 76 20  er xSync.    tv 
f4d0: 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 20  script xSyncCb. 
f4e0: 20 20 20 70 72 6f 63 20 78 53 79 6e 63 43 62 20     proc xSyncCb 
f4f0: 7b 61 72 67 73 7d 20 7b 69 6e 63 72 20 3a 3a 73  {args} {incr ::s
f500: 79 6e 63 63 6f 75 6e 74 7d 0a 20 20 20 20 73 65  ynccount}.    se
f510: 74 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 20 30 0a  t ::synccount 0.
f520: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
f530: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
f540: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
f550: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
f560: 6f 66 66 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  off;.      PRAGM
f570: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f580: 20 57 41 4c 3b 0a 20 20 20 20 20 20 49 4e 53 45   WAL;.      INSE
f590: 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55  RT INTO ko DEFAU
f5a0: 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d  LT VALUES;.    }
f5b0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
f5c0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
f5d0: 6f 69 6e 74 20 7d 0a 20 20 20 20 73 65 74 20 73  oint }.    set s
f5e0: 79 6e 63 63 6f 75 6e 74 0a 20 20 7d 20 7b 30 7d  ynccount.  } {0}
f5f0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76  .  db close.  tv
f600: 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d   delete.}..#----
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 2d 2d  ----------------
f640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f650: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66 6f  -----.# Tests fo
f660: 72 20 63 68 61 6e 67 69 6e 67 20 6a 6f 75 72 6e  r changing journ
f670: 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20 70  al mode..#.#   p
f680: 61 67 65 72 31 2d 32 33 2e 31 2e 2a 3a 20 54 65  ager1-23.1.*: Te
f690: 73 74 20 74 68 61 74 20 77 68 65 6e 20 63 68 61  st that when cha
f6a0: 6e 67 69 6e 67 20 66 72 6f 6d 20 50 45 52 53 49  nging from PERSI
f6b0: 53 54 20 74 6f 20 44 45 4c 45 54 45 20 6d 6f 64  ST to DELETE mod
f6c0: 65 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  e,.#            
f6d0: 20 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61        the journa
f6e0: 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65  l file is delete
f6f0: 64 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  d..#.#   pager1-
f700: 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65 73  23.2.*: Same tes
f710: 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74 20  t as above, but 
f720: 77 68 69 6c 65 20 61 20 73 68 61 72 65 64 20 6c  while a shared l
f730: 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20 20  ock is held.#   
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
f750: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
f760: 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72  ile..#.#   pager
f770: 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d 65 20 74  1-23.3.*: Same t
f780: 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75  est as above, bu
f790: 74 20 77 68 69 6c 65 20 61 20 72 65 73 65 72 76  t while a reserv
f7a0: 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a  ed lock is held.
f7b0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
f7c0: 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
f7d0: 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70  se file..#.#   p
f7e0: 61 67 65 72 31 2d 32 33 2e 34 2e 2a 3a 20 41 6e  ager1-23.4.*: An
f7f0: 64 2c 20 66 6f 72 20 66 75 6e 2c 20 77 68 69 6c  d, for fun, whil
f800: 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  e holding an exc
f810: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 23 0a 23  lusive lock..#.#
f820: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 2a     pager1-23.5.*
f830: 3a 20 54 72 79 20 74 6f 20 73 65 74 20 76 61 72  : Try to set var
f840: 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20 6a  ious different j
f850: 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 77 69 74  ournal modes wit
f860: 68 20 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20  h an.#          
f870: 20 20 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72          in-memor
f880: 79 20 64 61 74 61 62 61 73 65 20 28 6f 6e 6c 79  y database (only
f890: 20 4d 45 4d 4f 52 59 20 61 6e 64 20 4f 46 46 20   MEMORY and OFF 
f8a0: 73 68 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a 23 0a  should work)..#.
f8b0: 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  #   pager1-23.6.
f8c0: 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 6c 6f  *: Try to set lo
f8d0: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
f8e0: 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  l on an in-memor
f8f0: 79 20 64 61 74 61 62 61 73 65 0a 23 20 20 20 20  y database.#    
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64                (d
f910: 6f 65 73 6e 27 74 20 77 6f 72 6b 20 2d 20 69 6e  oesn't work - in
f920: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
f930: 73 20 61 6c 77 61 79 73 20 75 73 65 0a 23 20 20  s always use.#  
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
f960: 6c 75 73 69 76 65 29 2e 0a 23 0a 64 6f 5f 74 65  lusive)..#.do_te
f970: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 31  st pager1-23.1.1
f980: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
f990: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
f9a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
f9b0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f9c0: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
f9d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
f9e0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20  t1(a, b);.  }.  
f9f0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
fa00: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 31  .db-journal.} {1
fa10: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
fa20: 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  -23.1.2 {.  exec
fa30: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
fa40: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
fa50: 54 45 20 7d 0a 20 20 66 69 6c 65 20 65 78 69 73  TE }.  file exis
fa60: 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
fa70: 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73  al.} {0}..do_tes
fa80: 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 31 20  t pager1-23.2.1 
fa90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
faa0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
fab0: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
fac0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
fad0: 20 74 31 20 56 41 4c 55 45 53 28 27 43 61 6e 62   t1 VALUES('Canb
fae0: 65 72 72 61 27 2c 20 27 41 43 54 27 29 3b 0a 20  erra', 'ACT');. 
faf0: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53   }.  db eval { S
fb00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
fb10: 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20  } {.    db eval 
fb20: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
fb30: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d  _mode = DELETE }
fb40: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
fb50: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
fb60: 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65  mode }.} {delete
fb70: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
fb80: 2d 32 33 2e 32 2e 32 20 7b 0a 20 20 66 69 6c 65  -23.2.2 {.  file
fb90: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
fba0: 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64  journal.} {0}..d
fbb0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
fbc0: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
fbd0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
fbe0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
fbf0: 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54  SIST;.    INSERT
fc00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
fc10: 27 44 61 72 77 69 6e 27 2c 20 27 4e 54 27 29 3b  'Darwin', 'NT');
fc20: 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45 44  .    BEGIN IMMED
fc30: 49 41 54 45 3b 0a 20 20 7d 0a 20 20 64 62 20 65  IATE;.  }.  db e
fc40: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  val { PRAGMA jou
fc50: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
fc60: 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  TE }.  execsql {
fc70: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
fc80: 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65  mode }.} {delete
fc90: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
fca0: 2d 32 33 2e 33 2e 32 20 7b 0a 20 20 66 69 6c 65  -23.3.2 {.  file
fcb0: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
fcc0: 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f  journal.} {0}.do
fcd0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fce0: 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.3 {.  execsql 
fcf0: 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f  COMMIT.} {}..do_
fd00: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34  test pager1-23.4
fd10: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
fd20: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
fd30: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
fd40: 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ST;.    INSERT I
fd50: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41  NTO t1 VALUES('A
fd60: 64 65 6c 61 69 64 65 27 2c 20 27 53 41 27 29 3b  delaide', 'SA');
fd70: 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55  .    BEGIN EXCLU
fd80: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 64 62 20 65  SIVE;.  }.  db e
fd90: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  val { PRAGMA jou
fda0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
fdb0: 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  TE }.  execsql {
fdc0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
fdd0: 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65  mode }.} {delete
fde0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
fdf0: 2d 32 33 2e 34 2e 32 20 7b 0a 20 20 66 69 6c 65  -23.4.2 {.  file
fe00: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
fe10: 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f  journal.} {0}.do
fe20: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fe30: 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.3 {.  execsql 
fe40: 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f  COMMIT.} {}..do_
fe50: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35  test pager1-23.5
fe60: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
fe70: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
fe80: 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a  n.  sqlite3 db :
fe90: 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66 6f 72  memory:.} {}.for
fea0: 65 61 63 68 20 7b 74 6e 20 6d 6f 64 65 20 70 6f  each {tn mode po
feb0: 73 73 69 62 6c 65 7d 20 7b 0a 20 20 32 20 20 6f  ssible} {.  2  o
fec0: 66 66 20 20 20 20 20 20 31 0a 20 20 33 20 20 6d  ff      1.  3  m
fed0: 65 6d 6f 72 79 20 20 20 31 0a 20 20 34 20 20 70  emory   1.  4  p
fee0: 65 72 73 69 73 74 20 20 30 0a 20 20 35 20 20 64  ersist  0.  5  d
fef0: 65 6c 65 74 65 20 20 20 30 0a 20 20 36 20 20 77  elete   0.  6  w
ff00: 61 6c 20 20 20 20 20 20 30 0a 20 20 37 20 20 74  al      0.  7  t
ff10: 72 75 6e 63 61 74 65 20 30 0a 7d 20 7b 0a 20 20  runcate 0.} {.  
ff20: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
ff30: 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  3.5.$tn.1 {.    
ff40: 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20  execsql "PRAGMA 
ff50: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f  journal_mode = o
ff60: 66 66 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ff".    execsql 
ff70: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
ff80: 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20  mode = $mode".  
ff90: 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20  } [if $possible 
ffa0: 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69  {list $mode} {li
ffb0: 73 74 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f 74 65  st off}].  do_te
ffc0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24  st pager1-23.5.$
ffd0: 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.2 {.    execs
ffe0: 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  ql "PRAGMA journ
fff0: 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79  al_mode = memory
10000 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50  ".    execsql "P
10010 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
10020 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d 20  de = $mode".  } 
10030 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b 6c  [if $possible {l
10040 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73 74  ist $mode} {list
10050 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f 74   memory}].}.do_t
10060 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  est pager1-23.6.
10070 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  1 {.  execsql {P
10080 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
10090 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d 20 7b  de = normal}.} {
100a0 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65  exclusive}.do_te
100b0 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 32  st pager1-23.6.2
100c0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52   {.  execsql {PR
100d0 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
100e0 65 20 3d 20 65 78 63 6c 75 73 69 76 65 7d 0a 7d  e = exclusive}.}
100f0 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f   {exclusive}.do_
10100 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
10110 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
10120 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
10130 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  ode}.} {exclusiv
10140 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
10150 31 2d 32 33 2e 36 2e 34 20 7b 0a 20 20 65 78 65  1-23.6.4 {.  exe
10160 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6d 61 69  csql {PRAGMA mai
10170 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a  n.locking_mode}.
10180 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 0a 23  } {exclusive}..#
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74  ---------.#.do_t
101e0 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e  est pager1-24.1.
101f0 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
10200 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
10210 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
10220 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65  ing a_string.  e
10230 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
10240 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
10250 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   10;.    PRAGMA 
10260 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46 55  auto_vacuum = FU
10270 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  LL;.    CREATE T
10280 41 42 4c 45 20 78 31 28 78 2c 20 79 2c 20 7a 2c  ABLE x1(x, y, z,
10290 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c 20   PRIMARY KEY(y, 
102a0 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  z));.    CREATE 
102b0 54 41 42 4c 45 20 78 32 28 78 2c 20 79 2c 20 7a  TABLE x2(x, y, z
102c0 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c  , PRIMARY KEY(y,
102d0 20 7a 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   z));.    INSERT
102e0 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53 28   INTO x2 VALUES(
102f0 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61  a_string(400), a
10300 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
10310 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20  string(600));.  
10320 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
10330 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10340 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (600), a_string(
10350 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35  400), a_string(5
10360 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
10370 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
10380 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10390 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  500), a_string(6
103a0 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  00), a_string(40
103b0 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
103c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
103d0 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34  ELECT a_string(4
103e0 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30  00), a_string(50
103f0 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
10400 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
10410 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
10420 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36 30  LECT a_string(60
10430 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  0), a_string(400
10440 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ), a_string(500)
10450 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
10460 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
10470 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
10480 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10490 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
104a0 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
104b0 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45  ERT INTO x2 SELE
104c0 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  CT a_string(400)
104d0 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  , a_string(500),
104e0 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
104f0 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45  ROM x2;.    INSE
10500 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43  RT INTO x1 SELEC
10510 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 7d  T * FROM x2;.  }
10520 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
10530 67 65 72 31 2d 32 34 2e 31 2e 32 20 7b 0a 20 20  ger1-24.1.2 {.  
10540 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
10550 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  GIN;.      DELET
10560 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20  E FROM x1 WHERE 
10570 72 6f 77 69 64 3c 33 32 3b 0a 20 20 7d 0a 20 20  rowid<32;.  }.  
10580 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
10590 20 36 34 20 78 32 0a 7d 20 7b 7d 0a 64 6f 5f 74   64 x2.} {}.do_t
105a0 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e  est pager1-24.1.
105b0 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
105c0 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78 31  .      UPDATE x1
105d0 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69 6e   SET z = a_strin
105e0 67 28 33 30 30 29 20 57 48 45 52 45 20 72 6f 77  g(300) WHERE row
105f0 69 64 3e 34 30 3b 0a 20 20 20 20 43 4f 4d 4d 49  id>40;.    COMMI
10600 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  T;.    PRAGMA in
10610 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
10620 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
10630 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a  *) FROM x1;.  }.
10640 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65  } {ok 33}..do_te
10650 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 34  st pager1-24.1.4
10660 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
10670 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78     DELETE FROM x
10680 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
10690 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46  TO x1 SELECT * F
106a0 52 4f 4d 20 78 32 3b 0a 20 20 20 20 42 45 47 49  ROM x2;.    BEGI
106b0 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  N;.      DELETE 
106c0 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72 6f  FROM x1 WHERE ro
106d0 77 69 64 3c 33 32 3b 0a 20 20 20 20 20 20 55 50  wid<32;.      UP
106e0 44 41 54 45 20 78 31 20 53 45 54 20 7a 20 3d 20  DATE x1 SET z = 
106f0 61 5f 73 74 72 69 6e 67 28 32 39 39 29 20 57 48  a_string(299) WH
10700 45 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20 20  ERE rowid>40;.  
10710 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65  }.  recursive_se
10720 6c 65 63 74 20 36 34 20 78 32 20 7b 64 62 20 65  lect 64 x2 {db e
10730 76 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20 20 65 78  val COMMIT}.  ex
10740 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
10750 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
10760 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  ck;.    SELECT c
10770 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b  ount(*) FROM x1;
10780 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a  .  }.} {ok 33}..
10790 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
107a0 34 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  4.1.5 {.  execsq
107b0 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
107c0 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53 45  ROM x1;.    INSE
107d0 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43  RT INTO x1 SELEC
107e0 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 7d  T * FROM x2;.  }
107f0 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  .  recursive_sel
10800 65 63 74 20 36 34 20 78 32 20 7b 20 64 62 20 65  ect 64 x2 { db e
10810 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c  val {CREATE TABL
10820 45 20 78 33 28 78 2c 20 79 2c 20 7a 29 7d 20 7d  E x3(x, y, z)} }
10830 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
10840 45 43 54 20 2a 20 46 52 4f 4d 20 78 33 20 7d 0a  ECT * FROM x3 }.
10850 7d 20 7b 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d  ----------------
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108a0 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
108b0 31 2d 32 35 2d 31 20 7b 0a 20 20 66 61 75 6c 74  1-25-1 {.  fault
108c0 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
108d0 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
108e0 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
108f0 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62 63     SAVEPOINT abc
10900 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
10910 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
10920 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  .      ROLLBACK 
10930 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d  TO abc;.    COMM
10940 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f  IT;.  }.  db clo
10950 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  se.} {}.do_test 
10960 70 61 67 65 72 31 2d 32 35 2d 32 20 7b 0a 20 20  pager1-25-2 {.  
10970 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
10980 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
10990 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50  csql {.    SAVEP
109a0 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20  OINT abc;.      
109b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
109c0 61 2c 20 62 29 3b 0a 20 20 20 20 52 4f 4c 4c 42  a, b);.    ROLLB
109d0 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20  ACK TO abc;.    
109e0 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62  COMMIT;.  }.  db
109f0 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d   close.} {}..#--
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 2d 2d 2d 2d 2d  ----------------
10a40 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 65 63 74 6f 72  -------.# Sector
10a50 2d 73 69 7a 65 20 74 65 73 74 73 2e 0a 23 0a 64  -size tests..#.d
10a60 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 36  o_test pager1-26
10a70 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74  .1 {.  testvfs t
10a80 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74  v -default 1.  t
10a90 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39  v sectorsize 409
10aa0 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  6.  faultsim_del
10ab0 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
10ac0 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
10ad0 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
10ae0 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
10af0 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31  A page_size = 51
10b00 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  2;.    CREATE TA
10b10 42 4c 45 20 74 62 6c 28 61 20 50 52 49 4d 41 52  BLE tbl(a PRIMAR
10b20 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 29  Y KEY, b UNIQUE)
10b30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
10b40 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10b50 62 6c 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  bl VALUES(a_stri
10b60 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
10b70 28 36 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e  (600));.      IN
10b80 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
10b90 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
10ba0 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10bb0 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
10bc0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
10bd0 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10be0 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
10bf0 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
10c00 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10c10 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72  tbl SELECT a_str
10c20 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
10c30 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b  g(600) FROM tbl;
10c40 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10c50 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f  TO tbl SELECT a_
10c60 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
10c70 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74  ring(600) FROM t
10c80 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bl;.      INSERT
10c90 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
10ca0 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
10cb0 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
10cc0 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
10cd0 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
10ce0 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
10cf0 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10d00 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
10d10 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
10d20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10d30 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
10d40 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  0) FROM tbl;.   
10d50 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
10d60 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
10d70 74 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a  t pager1-26.1 {.
10d80 20 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54    UPDATE tbl SET
10d90 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 35 35   b = a_string(55
10da0 30 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73  0);.} {}.db clos
10db0 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d  e.tv delete..#--
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 2d 2d 2d 2d 2d  ----------------
10e00 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73  -------.#.do_tes
10e10 74 20 70 61 67 65 72 31 2e 32 37 2e 31 20 7b 0a  t pager1.27.1 {.
10e20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
10e30 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73  e_and_reopen.  s
10e40 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66  qlite3_pager_ref
10e50 63 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65 63  counts db.  exec
10e60 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
10e70 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
10e80 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
10e90 7d 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  }.  sqlite3_page
10ea0 72 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20  r_refcounts db. 
10eb0 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
10ec0 7d 20 7b 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f10 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 74 74  .# Test that att
10f20 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20  empting to open 
10f30 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
10f40 69 6f 6e 20 77 69 74 68 20 0a 23 20 6c 6f 63 6b  ion with .# lock
10f50 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
10f60 76 65 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 66  ve in WAL mode f
10f70 61 69 6c 73 20 69 66 20 74 68 65 72 65 20 61 72  ails if there ar
10f80 65 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 73 20  e other clients 
10f90 6f 6e 20 0a 23 20 74 68 65 20 73 61 6d 65 20 64  on .# the same d
10fa0 61 74 61 62 61 73 65 2e 0a 23 0a 63 61 74 63 68  atabase..#.catch
10fb0 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 69 66   { db close }.if
10fc0 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20  capable wal {.  
10fd0 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
10fe0 65 73 74 20 74 6e 20 7b 0a 20 20 20 20 64 6f 5f  est tn {.    do_
10ff0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11000 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 73 71 6c  tn.1 {.      sql
11010 31 20 7b 20 0a 20 20 20 20 20 20 20 20 50 52 41  1 { .        PRA
11020 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
11030 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 20 20   = WAL;.        
11040 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
11050 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 49  a, b);.        I
11060 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11070 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
11080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77        }.    } {w
11090 61 6c 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  al}.    do_test 
110a0 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20  pager1-28.$tn.2 
110b0 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
110c0 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 61  * FROM t1 } } {a
110d0 20 62 7d 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74   b}..    do_test
110e0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33   pager1-28.$tn.3
110f0 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41   { sql1 { PRAGMA
11100 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
11110 63 6c 75 73 69 76 65 20 7d 20 7d 20 7b 65 78 63  clusive } } {exc
11120 6c 75 73 69 76 65 7d 0a 20 20 20 20 64 6f 5f 74  lusive}.    do_t
11130 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
11140 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 63 73 71  n.4 { .      csq
11150 6c 31 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45  l1 { BEGIN; INSE
11160 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
11170 53 28 27 63 27 2c 20 27 64 27 29 3b 20 7d 0a 20  S('c', 'd'); }. 
11180 20 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73     } {1 {databas
11190 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
111a0 20 20 63 6f 64 65 32 20 7b 20 64 62 32 20 63 6c    code2 { db2 cl
111b0 6f 73 65 20 3b 20 73 71 6c 69 74 65 33 20 64 62  ose ; sqlite3 db
111c0 32 20 74 65 73 74 2e 64 62 20 7d 0a 20 20 20 20  2 test.db }.    
111d0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
111e0 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20  8.$tn.4 { .     
111f0 20 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49   sql1 { INSERT I
11200 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63  NTO t1 VALUES('c
11210 27 2c 20 27 64 27 29 3b 20 43 4f 4d 4d 49 54 20  ', 'd'); COMMIT 
11220 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 7d 0a 7d  }.    } {}.  }.}
11230 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e  ------------.# N
11280 6f 72 6d 61 6c 6c 79 2c 20 77 68 65 6e 20 63 68  ormally, when ch
11290 61 6e 67 69 6e 67 20 66 72 6f 6d 20 6a 6f 75 72  anging from jour
112a0 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
112b0 20 74 6f 20 44 45 4c 45 54 45 20 74 68 65 20 70   to DELETE the p
112c0 61 67 65 72 0a 23 20 61 74 74 65 6d 70 74 73 20  ager.# attempts 
112d0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
112e0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 48 6f 77 65  urnal file. Howe
112f0 76 65 72 2c 20 69 66 20 69 74 20 63 61 6e 6e 6f  ver, if it canno
11300 74 20 6f 62 74 61 69 6e 20 61 0a 23 20 52 45 53  t obtain a.# RES
11310 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
11320 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
11330 20 74 68 69 73 20 73 74 65 70 20 69 73 20 73 6b   this step is sk
11340 69 70 70 65 64 2e 0a 23 0a 64 6f 5f 6d 75 6c 74  ipped..#.do_mult
11350 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20  iclient_test tn 
11360 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  {.  do_test page
11370 72 31 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20  r1-28.$tn.1 {.  
11380 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20    sql1 { .      
11390 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
113a0 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
113b0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
113c0 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
113d0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
113e0 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
113f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65  );.    }.  } {pe
11400 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74  rsist}.  do_test
11410 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32   pager1-28.$tn.2
11420 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
11430 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
11440 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   1.  do_test pag
11450 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73  er1-28.$tn.3 { s
11460 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  ql1 { PRAGMA jou
11470 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
11480 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20  TE } } delete.  
11490 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
114a0 38 2e 24 74 6e 2e 34 20 7b 20 66 69 6c 65 20 65  8.$tn.4 { file e
114b0 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
114c0 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f  urnal } 0..  do_
114d0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
114e0 74 6e 2e 35 20 7b 0a 20 20 20 20 73 71 6c 31 20  tn.5 {.    sql1 
114f0 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
11500 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
11510 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 49 4e  ERSIST;.      IN
11520 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11530 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20  UES('c', 'd');. 
11540 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73     }.  } {persis
11550 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  t}.  do_test pag
11560 65 72 31 2d 32 38 2e 24 74 6e 2e 36 20 7b 20 66  er1-28.$tn.6 { f
11570 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
11580 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20  db-journal } 1. 
11590 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
115a0 32 38 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73  28.$tn.7 {.    s
115b0 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53  ql2 { BEGIN; INS
115c0 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
115d0 45 53 28 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a  ES('e', 'f'); }.
115e0 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
115f0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 38   pager1-28.$tn.8
11600 20 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20    { file exists 
11610 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
11620 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } 1.  do_test pa
11630 67 65 72 31 2d 32 38 2e 24 74 6e 2e 39 20 20 7b  ger1-28.$tn.9  {
11640 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a   sql1 { PRAGMA j
11650 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
11660 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a  LETE } } delete.
11670 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11680 2d 32 38 2e 24 74 6e 2e 31 30 20 7b 20 66 69 6c  -28.$tn.10 { fil
11690 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
116a0 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20  -journal } 1..  
116b0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
116c0 38 2e 24 74 6e 2e 31 31 20 7b 20 73 71 6c 32 20  8.$tn.11 { sql2 
116d0 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f  COMMIT } {}.  do
116e0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
116f0 24 74 6e 2e 31 32 20 7b 20 66 69 6c 65 20 65 78  $tn.12 { file ex
11700 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
11710 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74  rnal } 0..  do_t
11720 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74  est pager1-28-$t
11730 6e 2e 31 33 20 7b 0a 20 20 20 20 63 6f 64 65 31  n.13 {.    code1
11740 20 7b 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 5b   { set channel [
11750 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61  db incrblob -rea
11760 64 6f 6e 6c 79 20 74 31 20 61 20 32 5d 20 7d 0a  donly t1 a 2] }.
11770 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20      sql1 {.     
11780 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
11790 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
117a0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
117b0 4f 20 74 31 20 56 41 4c 55 45 53 28 27 67 27 2c  O t1 VALUES('g',
117c0 20 27 68 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   'h');.    }.  }
117d0 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f   {persist}.  do_
117e0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
117f0 74 6e 2e 31 34 20 7b 20 66 69 6c 65 20 65 78 69  tn.14 { file exi
11800 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
11810 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  nal } 1.  do_tes
11820 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11830 31 35 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  15 {.    sql2 { 
11840 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e  BEGIN; INSERT IN
11850 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65 27  TO t1 VALUES('e'
11860 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d  , 'f'); }.  } {}
11870 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11880 31 2d 32 38 2e 24 74 6e 2e 31 36 20 7b 20 73 71  1-28.$tn.16 { sq
11890 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  l1 { PRAGMA jour
118a0 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
118b0 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64  E } } delete.  d
118c0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
118d0 2e 24 74 6e 2e 31 37 20 7b 20 66 69 6c 65 20 65  .$tn.17 { file e
118e0 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
118f0 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f  urnal } 1..  do_
11900 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11910 74 6e 2e 31 37 20 7b 20 63 73 71 6c 32 20 7b 20  tn.17 { csql2 { 
11920 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 31 20 7b 64  COMMIT } } {1 {d
11930 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
11940 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  d}}.  do_test pa
11950 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 38 20 7b  ger1-28-$tn.18 {
11960 20 63 6f 64 65 31 20 7b 20 72 65 61 64 20 24 63   code1 { read $c
11970 68 61 6e 6e 65 6c 20 7d 20 7d 20 63 0a 20 20 64  hannel } } c.  d
11980 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11990 2d 24 74 6e 2e 31 39 20 7b 20 63 6f 64 65 31 20  -$tn.19 { code1 
119a0 7b 20 63 6c 6f 73 65 20 24 63 68 61 6e 6e 65 6c  { close $channel
119b0 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73   } } {}.  do_tes
119c0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
119d0 32 30 20 7b 20 73 71 6c 32 20 7b 20 43 4f 4d 4d  20 { sql2 { COMM
119e0 49 54 20 7d 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f  IT } } {}.}..do_
119f0 74 65 73 74 20 70 61 67 65 72 31 2d 32 39 2e 31  test pager1-29.1
11a00 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
11a10 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
11a20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
11a30 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
11a40 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41   = 1024;.    PRA
11a50 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
11a60 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 50 52 41 47  = full;.    PRAG
11a70 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  MA locking_mode=
11a80 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 43  exclusive;.    C
11a90 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
11aa0 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
11ab0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
11ac0 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 66 69 6c  1, 2);.  }.  fil
11ad0 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d  e size test.db.}
11ae0 20 5b 65 78 70 72 20 31 30 32 34 2a 33 5d 0a 64   [expr 1024*3].d
11af0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 39  o_test pager1-29
11b00 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
11b10 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
11b20 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20  _size = 4096;.  
11b30 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 20 20    VACUUM;.  }.  
11b40 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
11b50 62 0a 7d 20 5b 65 78 70 72 20 34 30 39 36 2a 33  b.} [expr 4096*3
11b60 5d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
11bb0 54 65 73 74 20 74 68 61 74 20 69 66 20 61 6e 20  Test that if an 
11bc0 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 66  empty database f
11bd0 69 6c 65 20 28 73 69 7a 65 20 30 20 62 79 74 65  ile (size 0 byte
11be0 73 29 20 69 73 20 6f 70 65 6e 65 64 20 69 6e 20  s) is opened in 
11bf0 0a 23 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63  .# exclusive-loc
11c00 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 6e 79 20 6a  king mode, any j
11c10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
11c20 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
11c30 66 69 6c 65 2d 73 79 73 74 65 6d 0a 23 20 77 69  file-system.# wi
11c40 74 68 6f 75 74 20 62 65 69 6e 67 20 72 6f 6c 6c  thout being roll
11c50 65 64 20 62 61 63 6b 2e 20 41 6e 64 20 74 68 61  ed back. And tha
11c60 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
11c70 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20 77 68 69  ock obtained whi
11c80 6c 65 0a 23 20 64 6f 69 6e 67 20 74 68 69 73 20  le.# doing this 
11c90 69 73 20 6e 6f 74 20 72 65 6c 65 61 73 65 64 2e  is not released.
11ca0 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
11cb0 31 2d 33 30 2e 31 20 7b 0a 20 20 64 62 20 63 6c  1-30.1 {.  db cl
11cc0 6f 73 65 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c  ose.  delete_fil
11cd0 65 20 74 65 73 74 2e 64 62 0a 20 20 64 65 6c 65  e test.db.  dele
11ce0 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d  te_file test.db-
11cf0 6a 6f 75 72 6e 61 6c 0a 20 20 73 65 74 20 66 64  journal.  set fd
11d00 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a   [open test.db-j
11d10 6f 75 72 6e 61 6c 20 77 5d 0a 20 20 73 65 65 6b  ournal w].  seek
11d20 20 24 66 64 20 5b 65 78 70 72 20 35 31 32 2b 31   $fd [expr 512+1
11d30 30 33 32 2a 32 5d 0a 20 20 70 75 74 73 20 2d 6e  032*2].  puts -n
11d40 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 78 0a 20  onewline $fd x. 
11d50 20 63 6c 6f 73 65 20 24 66 64 0a 0a 20 20 73 71   close $fd..  sq
11d60 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
11d70 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11d80 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
11d90 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b 0a  mode=EXCLUSIVE;.
11da0 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
11db0 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  (*) FROM sqlite_
11dc0 6d 61 73 74 65 72 3b 0a 20 20 20 20 50 52 41 47  master;.    PRAG
11dd0 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a  MA lock_status;.
11de0 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65    }.} {exclusive
11df0 20 30 20 6d 61 69 6e 20 72 65 73 65 72 76 65 64   0 main reserved
11e00 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 23   temp closed}..#
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 2d 2d 2d  ----------------
11e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
11e60 20 74 68 61 74 20 69 66 20 74 68 65 20 22 70 61   that if the "pa
11e70 67 65 2d 73 69 7a 65 22 20 66 69 65 6c 64 20 69  ge-size" field i
11e80 6e 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  n a journal-head
11e90 65 72 20 69 73 20 30 2c 20 74 68 65 20 6a 6f 75  er is 0, the jou
11ea0 72 6e 61 6c 0a 23 20 66 69 6c 65 20 63 61 6e 20  rnal.# file can 
11eb0 73 74 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20  still be rolled 
11ec0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 72 65  back. This is re
11ed0 71 75 69 72 65 64 20 66 6f 72 20 62 61 63 6b 77  quired for backw
11ee0 61 72 64 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  ard compatibilit
11ef0 79 20 2d 0a 23 20 76 65 72 73 69 6f 6e 73 20 6f  y -.# versions o
11f00 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
11f10 6f 20 33 2e 35 2e 38 20 61 6c 77 61 79 73 20 73  o 3.5.8 always s
11f20 65 74 20 74 68 69 73 20 66 69 65 6c 64 20 74 6f  et this field to
11f30 20 7a 65 72 6f 2e 0a 23 0a 69 66 20 7b 24 74 63   zero..#.if {$tc
11f40 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
11f50 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a  orm)=="unix"} {.
11f60 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  do_test pager1-3
11f70 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
11f80 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
11f90 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
11fa0 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
11fb0 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50  size = 10;.    P
11fc0 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
11fd0 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41  = 1024;.    CREA
11fe0 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
11ff0 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
12000 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12010 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t1 VALUES(rando
12020 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
12030 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
12040 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12050 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
12060 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
12070 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
12080 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
12090 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
120a0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
120b0 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
120c0 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
120d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
120e0 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
120f0 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
12100 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
12110 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12120 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
12130 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
12140 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
12150 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
12160 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
12170 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
12180 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
12190 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
121a0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
121b0 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
121c0 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
121d0 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
121e0 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
121f0 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
12200 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
12210 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12220 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
12230 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
12240 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
12250 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
12260 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
12270 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12280 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
12290 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
122a0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
122b0 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
122c0 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
122d0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
122e0 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
122f0 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
12300 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
12310 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 72  ATE t1 SET y = r
12320 61 6e 64 6f 6d 62 6c 6f 62 28 31 34 39 39 29 3b  andomblob(1499);
12330 0a 20 20 7d 0a 20 20 63 6f 70 79 5f 66 69 6c 65  .  }.  copy_file
12340 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
12350 32 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65  2.  copy_file te
12360 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65  st.db-journal te
12370 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 0a 20  st.db2-journal. 
12380 20 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20   .  hexio_write 
12390 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c  test.db2-journal
123a0 20 32 34 20 30 30 30 30 30 30 30 30 0a 20 20 73   24 00000000.  s
123b0 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
123c0 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  db2.  execsql { 
123d0 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
123e0 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b  _check } db2.} {
123f0 6f 6b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ok}.}..#--------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12440 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20  -.# Test that a 
12450 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 61  database file ca
12460 6e 20 62 65 20 22 70 72 65 2d 68 69 6e 74 65 64  n be "pre-hinted
12470 22 20 74 6f 20 61 20 63 65 72 74 61 69 6e 20 73  " to a certain s
12480 69 7a 65 20 61 6e 64 20 74 68 61 74 0a 23 20 73  ize and that.# s
12490 75 62 73 65 71 75 65 6e 74 20 73 70 69 6c 6c 69  ubsequent spilli
124a0 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ng of the pager 
124b0 63 61 63 68 65 20 64 6f 65 73 20 6e 6f 74 20 72  cache does not r
124c0 65 73 75 6c 74 20 69 6e 20 74 68 65 20 64 61 74  esult in the dat
124d0 61 62 61 73 65 0a 23 20 66 69 6c 65 20 62 65 69  abase.# file bei
124e0 6e 67 20 73 68 72 75 6e 6b 2e 0a 23 0a 63 61 74  ng shrunk..#.cat
124f0 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f  ch {db close}.fo
12500 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
12510 62 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  b..do_test pager
12520 31 2d 33 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74  1-32.1 {.  sqlit
12530 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
12540 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
12550 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c  EATE TABLE t1(x,
12560 20 79 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c   y);.  }.  db cl
12570 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62  ose.  sqlite3 db
12580 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
12590 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
125a0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
125b0 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
125c0 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b  domblob(10000));
125d0 0a 20 20 7d 0a 20 20 66 69 6c 65 5f 63 6f 6e 74  .  }.  file_cont
125e0 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65  rol_chunksize_te
125f0 73 74 20 64 62 20 6d 61 69 6e 20 31 30 32 34 0a  st db main 1024.
12600 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73    file_control_s
12610 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 64 62 20  izehint_test db 
12620 6d 61 69 6e 20 32 30 39 37 31 35 32 30 3b 20 23  main 20971520; #
12630 20 32 30 4d 42 0a 20 20 65 78 65 63 73 71 6c 20   20MB.  execsql 
12640 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  {.    PRAGMA cac
12650 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
12660 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12670 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f   VALUES(1, rando
12680 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20  mblob(10000));. 
12690 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
126a0 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64  1 VALUES(2, rand
126b0 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a  omblob(10000));.
126c0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
126d0 74 31 20 53 45 4c 45 43 54 20 78 2b 32 2c 20 72  t1 SELECT x+2, r
126e0 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29  andomblob(10000)
126f0 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e   from t1;.    IN
12700 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
12710 45 43 54 20 78 2b 34 2c 20 72 61 6e 64 6f 6d 62  ECT x+4, randomb
12720 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20  lob(10000) from 
12730 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
12740 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b  NTO t1 SELECT x+
12750 38 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  8, randomblob(10
12760 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20  000) from t1;.  
12770 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12780 20 53 45 4c 45 43 54 20 78 2b 31 36 2c 20 72 61   SELECT x+16, ra
12790 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20  ndomblob(10000) 
127a0 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 53 45 4c  from t1;.    SEL
127b0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
127c0 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  M t1;.    COMMIT
127d0 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
127e0 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
127f0 74 2e 64 62 0a 7d 20 7b 32 30 39 37 31 35 32 30  t.db.} {20971520
12800 7d 0a 0a 23 20 43 6c 65 61 6e 75 70 20 32 30 4d  }..# Cleanup 20M
12810 42 20 66 69 6c 65 20 6c 65 66 74 20 62 79 20 74  B file left by t
12820 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 73 74  he previous test
12830 2e 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65  ..forcedelete te
12840 73 74 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  st.db..#--------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12890 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 66  -.# Test that if
128a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
128b0 73 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 6a  s committed in j
128c0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45 4c 45  ournal_mode=DELE
128d0 54 45 20 6d 6f 64 65 2c 0a 23 20 61 6e 64 20 74  TE mode,.# and t
128e0 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 69 6e  he call to unlin
128f0 6b 28 29 20 72 65 74 75 72 6e 73 20 61 6e 20 45  k() returns an E
12900 4e 4f 45 4e 54 20 65 72 72 6f 72 2c 20 74 68 65  NOENT error, the
12910 20 43 4f 4d 4d 49 54 20 64 6f 65 73 20 6e 6f 74   COMMIT does not
12920 0a 23 20 73 75 63 63 65 65 64 2e 0a 23 0a 69 66  .# succeed..#.if
12930 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
12940 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e  m(platform)=="un
12950 69 78 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  ix"} {.  do_test
12960 20 70 61 67 65 72 31 2d 33 33 2e 31 20 7b 0a 20   pager1-33.1 {. 
12970 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
12980 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
12990 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
129a0 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
129b0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
129c0 74 31 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 29  t1 VALUES('one')
129d0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
129e0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74  NTO t1 VALUES('t
129f0 77 6f 27 29 3b 0a 20 20 20 20 20 20 42 45 47 49  wo');.      BEGI
12a00 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  N;.        INSER
12a10 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
12a20 28 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20 20  ('three');.     
12a30 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
12a40 31 20 56 41 4c 55 45 53 28 27 66 6f 75 72 27 29  1 VALUES('four')
12a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 63  ;.    }.    forc
12a60 65 64 65 6c 65 74 65 20 62 61 6b 2d 6a 6f 75 72  edelete bak-jour
12a70 6e 61 6c 0a 20 20 20 20 66 69 6c 65 20 72 65 6e  nal.    file ren
12a80 61 6d 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ame test.db-jour
12a90 6e 61 6c 20 62 61 6b 2d 6a 6f 75 72 6e 61 6c 0a  nal bak-journal.
12aa0 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 43 4f  .    catchsql CO
12ab0 4d 4d 49 54 0a 20 20 7d 20 7b 31 20 7b 64 69 73  MMIT.  } {1 {dis
12ac0 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a 20  k I/O error}}.. 
12ad0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
12ae0 33 33 2e 32 20 7b 0a 20 20 20 20 66 69 6c 65 20  33.2 {.    file 
12af0 72 65 6e 61 6d 65 20 62 61 6b 2d 6a 6f 75 72 6e  rename bak-journ
12b00 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  al test.db-journ
12b10 61 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  al.    execsql {
12b20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
12b30 31 20 7d 0a 20 20 7d 20 7b 6f 6e 65 20 74 77 6f  1 }.  } {one two
12b40 7d 0a 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
12b90 23 20 54 65 73 74 20 74 68 61 74 20 61 70 70 65  # Test that appe
12ba0 6e 64 69 6e 67 20 70 61 67 65 73 20 74 6f 20 74  nding pages to t
12bb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12bc0 20 74 68 65 6e 20 6d 6f 76 69 6e 67 20 74 68 6f   then moving tho
12bd0 73 65 20 70 61 67 65 73 0a 23 20 74 6f 20 74 68  se pages.# to th
12be0 65 20 66 72 65 65 2d 6c 69 73 74 20 62 65 66 6f  e free-list befo
12bf0 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
12c00 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
12c10 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 0a 23  does not cause.#
12c20 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 66 6f 72   an error..#.for
12c30 65 61 63 68 20 7b 74 6e 20 70 72 61 67 6d 61 20  each {tn pragma 
12c40 73 74 72 73 69 7a 65 7d 20 7b 0a 20 20 31 20 7b  strsize} {.  1 {
12c50 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a   PRAGMA mmap_siz
12c60 65 20 3d 20 30 20 7d 20 32 34 30 30 0a 20 20 32  e = 0 } 2400.  2
12c70 20 7b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20   { }            
12c80 20 20 20 20 20 20 20 20 20 20 20 32 34 30 30 0a             2400.
12c90 20 20 33 20 7b 20 50 52 41 47 4d 41 20 6d 6d 61    3 { PRAGMA mma
12ca0 70 5f 73 69 7a 65 20 3d 20 30 20 7d 20 34 34 30  p_size = 0 } 440
12cb0 30 0a 20 20 34 20 7b 20 7d 20 20 20 20 20 20 20  0.  4 { }       
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 34 34 30 30 0a 7d 20 7b 0a 20 20 72 65 73 65 74  4400.} {.  reset
12ce0 5f 64 62 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  _db.  db func a_
12cf0 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
12d00 20 20 64 62 20 65 76 61 6c 20 24 70 72 61 67 6d    db eval $pragm
12d10 61 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  a.  do_execsql_t
12d20 65 73 74 20 33 34 2e 24 74 6e 2e 31 20 7b 0a 20  est 34.$tn.1 {. 
12d30 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
12d40 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
12d50 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
12d60 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
12d70 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
12d80 20 33 34 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20   34.$tn.2 {.    
12d90 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
12da0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
12db0 28 32 2c 20 61 5f 73 74 72 69 6e 67 28 24 73 74  (2, a_string($st
12dc0 72 73 69 7a 65 29 29 3b 0a 20 20 20 20 44 45 4c  rsize));.    DEL
12dd0 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
12de0 45 20 6f 69 64 3d 32 3b 0a 20 20 20 20 43 4f 4d  E oid=2;.    COM
12df0 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  MIT;.    PRAGMA 
12e00 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
12e10 0a 20 20 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 23 2d 2d  .  } {ok}.}..#--
12e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e60 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f  -------.#.reset_
12e70 64 62 0a 64 6f 5f 74 65 73 74 20 33 35 20 7b 0a  db.do_test 35 {.
12e80 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
12e90 74 2e 64 62 0a 0a 20 20 65 78 65 63 73 71 6c 20  t.db..  execsql 
12ea0 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
12eb0 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 20  LE t1(x, y);.   
12ec0 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
12ed0 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
12ee0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
12ef0 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d  ALUES(1, 2);.  }
12f00 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
12f10 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43    BEGIN;.      C
12f20 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
12f30 2c 20 62 29 3b 0a 20 20 7d 0a 0a 20 20 68 65 78  , b);.  }..  hex
12f40 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
12f50 2d 73 68 6d 20 5b 65 78 70 72 20 31 36 2a 31 30  -shm [expr 16*10
12f60 32 34 5d 20 5b 73 74 72 69 6e 67 20 72 65 70 65  24] [string repe
12f70 61 74 20 30 30 35 35 20 38 31 39 32 5d 0a 20 20  at 0055 8192].  
12f80 63 61 74 63 68 73 71 6c 20 52 4f 4c 4c 42 41 43  catchsql ROLLBAC
12f90 4b 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 6d  K.} {0 {}}..do_m
12fa0 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20  ulticlient_test 
12fb0 74 6e 20 7b 0a 20 20 73 71 6c 31 20 7b 0a 20 20  tn {.  sql1 {.  
12fc0 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
12fd0 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 43 52  cuum = 0;.    CR
12fe0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c  EATE TABLE t1(x,
12ff0 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   y);.    INSERT 
13000 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
13010 2c 20 32 29 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f  , 2);.  }..  do_
13020 74 65 73 74 20 33 36 2e 24 74 6e 2e 31 20 7b 20  test 36.$tn.1 { 
13030 0a 20 20 20 20 73 71 6c 32 20 7b 20 50 52 41 47  .    sql2 { PRAG
13040 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
13050 74 20 3d 20 32 20 7d 0a 20 20 20 20 6c 69 73 74  t = 2 }.    list
13060 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 32 20 7b   [catch { sql2 {
13070 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
13080 28 78 29 20 7d 20 7d 20 6d 73 67 5d 20 24 6d 73  (x) } } msg] $ms
13090 67 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  g.  } {1 {databa
130a0 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
130b0 6c 6c 7d 7d 0a 0a 20 20 73 71 6c 31 20 7b 20 50  ll}}..  sql1 { P
130c0 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74  RAGMA checkpoint
130d0 5f 66 75 6c 6c 66 73 79 6e 63 20 3d 20 31 20 7d  _fullfsync = 1 }
130e0 0a 20 20 73 71 6c 31 20 7b 20 43 52 45 41 54 45  .  sql1 { CREATE
130f0 20 54 41 42 4c 45 20 74 32 28 78 29 20 7d 0a 0a   TABLE t2(x) }..
13100 20 20 64 6f 5f 74 65 73 74 20 33 36 2e 24 74 6e    do_test 36.$tn
13110 2e 32 20 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b  .2 { .    sql2 {
13120 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
13130 56 41 4c 55 45 53 28 27 78 79 7a 27 29 20 7d 0a  VALUES('xyz') }.
13140 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20      list [catch 
13150 7b 20 73 71 6c 32 20 7b 20 43 52 45 41 54 45 20  { sql2 { CREATE 
13160 54 41 42 4c 45 20 74 33 28 78 29 20 7d 20 7d 20  TABLE t3(x) } } 
13170 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 7b 31  msg] $msg.  } {1
13180 20 7b 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   {database or di
13190 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 7d 0a 0a  sk is full}}.}..
131a0 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
131b0 31 20 74 65 73 74 32 0a 66 6f 72 65 61 63 68 20  1 test2.foreach 
131c0 7b 74 6e 20 75 72 69 7d 20 7b 0a 20 20 31 20 20  {tn uri} {.  1  
131d0 20 7b 66 69 6c 65 3a 3f 6d 6f 64 65 3d 6d 65 6d   {file:?mode=mem
131e0 6f 72 79 26 63 61 63 68 65 3d 73 68 61 72 65 64  ory&cache=shared
131f0 7d 0a 20 20 32 20 20 20 7b 66 69 6c 65 3a 6f 6e  }.  2   {file:on
13200 65 3f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 26 63 61  e?mode=memory&ca
13210 63 68 65 3d 73 68 61 72 65 64 7d 0a 20 20 33 20  che=shared}.  3 
13220 20 20 7b 66 69 6c 65 3a 74 65 73 74 31 3f 63 61    {file:test1?ca
13230 63 68 65 3d 73 68 61 72 65 64 7d 0a 20 20 34 20  che=shared}.  4 
13240 20 20 7b 66 69 6c 65 3a 74 65 73 74 32 3f 61 6e    {file:test2?an
13250 6f 74 68 65 72 3d 70 61 72 61 6d 65 74 65 72 26  other=parameter&
13260 79 65 74 3d 61 6e 6f 74 68 65 72 6f 6e 65 7d 0a  yet=anotherone}.
13270 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 33 37  } {.  do_test 37
13280 2e 24 74 6e 20 7b 0a 20 20 20 20 63 61 74 63 68  .$tn {.    catch
13290 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20   { db close }.  
132a0 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f    sqlite3_shutdo
132b0 77 6e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  wn.    sqlite3_c
132c0 6f 6e 66 69 67 5f 75 72 69 20 31 0a 20 20 20 20  onfig_uri 1.    
132d0 73 71 6c 69 74 65 33 20 64 62 20 24 75 72 69 0a  sqlite3 db $uri.
132e0 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20  .    db eval {. 
132f0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
13300 45 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 49  E t1(x);.      I
13310 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
13320 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 20 20 53  LUES(1);.      S
13330 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
13340 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a  .    }.  } {1}..
13350 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
13360 74 20 33 37 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  t 37.$tn.2 {.   
13370 20 56 41 43 55 55 4d 3b 0a 20 20 20 20 53 45 4c   VACUUM;.    SEL
13380 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
13390 20 7d 20 7b 31 7d 0a 0a 20 20 64 62 20 63 6c 6f   } {1}..  db clo
133a0 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75  se.  sqlite3_shu
133b0 74 64 6f 77 6e 0a 20 20 73 71 6c 69 74 65 33 5f  tdown.  sqlite3_
133c0 63 6f 6e 66 69 67 5f 75 72 69 20 30 0a 7d 0a 0a  config_uri 0.}..
133d0 64 6f 5f 74 65 73 74 20 33 38 2e 31 20 7b 0a 20  do_test 38.1 {. 
133e0 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73   catch { db clos
133f0 65 20 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74  e }.  forcedelet
13400 65 20 74 65 73 74 2e 64 62 0a 20 20 73 65 74 20  e test.db.  set 
13410 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62  fd [open test.db
13420 20 77 5d 0a 20 20 70 75 74 73 20 24 66 64 20 22   w].  puts $fd "
13430 68 65 6c 6c 6f 20 77 6f 72 6c 64 22 0a 20 20 63  hello world".  c
13440 6c 6f 73 65 20 24 66 64 0a 20 20 73 71 6c 69 74  lose $fd.  sqlit
13450 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
13460 63 61 74 63 68 73 71 6c 20 7b 20 43 52 45 41 54  catchsql { CREAT
13470 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 7d 0a  E TABLE t1(x) }.
13480 7d 20 7b 31 20 7b 66 69 6c 65 20 69 73 20 65 6e  } {1 {file is en
13490 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
134a0 74 20 61 20 64 61 74 61 62 61 73 65 7d 7d 0a 64  t a database}}.d
134b0 6f 5f 74 65 73 74 20 33 38 2e 32 20 7b 0a 20 20  o_test 38.2 {.  
134c0 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
134d0 20 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65   }.  forcedelete
134e0 20 74 65 73 74 2e 64 62 0a 7d 20 7b 7d 0a 0a 64   test.db.} {}..d
134f0 6f 5f 74 65 73 74 20 33 39 2e 31 20 7b 0a 20 20  o_test 39.1 {.  
13500 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
13510 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
13520 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
13530 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43  acuum = 1;.    C
13540 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
13550 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
13560 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 78  TO t1 VALUES('xx
13570 78 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  x');.    INSERT 
13580 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
13590 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  two');.    INSER
135a0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
135b0 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29  (randomblob(400)
135c0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
135d0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
135e0 64 6f 6d 62 6c 6f 62 28 34 30 30 29 29 3b 0a 20  domblob(400));. 
135f0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13600 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
13610 6c 6f 62 28 34 30 30 29 29 3b 0a 20 20 20 20 49  lob(400));.    I
13620 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
13630 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
13640 34 30 30 29 29 3b 0a 20 20 20 20 42 45 47 49 4e  400));.    BEGIN
13650 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  ;.    UPDATE t1 
13660 53 45 54 20 78 20 3d 20 27 6f 6e 65 27 20 57 48  SET x = 'one' WH
13670 45 52 45 20 72 6f 77 69 64 3d 31 3b 0a 20 20 7d  ERE rowid=1;.  }
13680 0a 20 20 73 65 74 20 3a 3a 73 74 6d 74 20 5b 73  .  set ::stmt [s
13690 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 64  qlite3_prepare d
136a0 62 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  b "SELECT * FROM
136b0 20 74 31 20 4f 52 44 45 52 20 42 59 20 72 6f 77   t1 ORDER BY row
136c0 69 64 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20  id" -1 dummy].  
136d0 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a  sqlite3_step $::
136e0 73 74 6d 74 0a 20 20 73 71 6c 69 74 65 33 5f 63  stmt.  sqlite3_c
136f0 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 3a 3a 73 74  olumn_text $::st
13700 6d 74 20 30 0a 7d 20 7b 6f 6e 65 7d 0a 64 6f 5f  mt 0.} {one}.do_
13710 74 65 73 74 20 33 39 2e 32 20 7b 0a 20 20 65 78  test 39.2 {.  ex
13720 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  ecsql { CREATE T
13730 41 42 4c 45 20 74 32 28 78 29 20 7d 0a 20 20 73  ABLE t2(x) }.  s
13740 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 73  qlite3_step $::s
13750 74 6d 74 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  tmt.  sqlite3_co
13760 6c 75 6d 6e 5f 74 65 78 74 20 24 3a 3a 73 74 6d  lumn_text $::stm
13770 74 20 30 0a 7d 20 7b 74 77 6f 7d 0a 64 6f 5f 74  t 0.} {two}.do_t
13780 65 73 74 20 33 39 2e 33 20 7b 0a 20 20 73 71 6c  est 39.3 {.  sql
13790 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a  ite3_finalize $:
137a0 3a 73 74 6d 74 0a 20 20 65 78 65 63 73 71 6c 20  :stmt.  execsql 
137b0 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f  COMMIT.} {}..do_
137c0 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 39 2e  execsql_test 39.
137d0 34 20 7b 0a 20 20 50 52 41 47 4d 41 20 61 75 74  4 {.  PRAGMA aut
137e0 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20 20  o_vacuum = 2;.  
137f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
13800 78 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  x);.  CREATE TAB
13810 4c 45 20 74 34 28 78 29 3b 0a 0a 20 20 44 52 4f  LE t4(x);..  DRO
13820 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 44 52  P TABLE t2;.  DR
13830 4f 50 20 54 41 42 4c 45 20 74 33 3b 0a 20 20 44  OP TABLE t3;.  D
13840 52 4f 50 20 54 41 42 4c 45 20 74 34 3b 0a 7d 0a  ROP TABLE t4;.}.
13850 64 6f 5f 74 65 73 74 20 33 39 2e 35 20 7b 0a 20  do_test 39.5 {. 
13860 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
13870 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
13880 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
13890 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
138a0 20 3d 20 31 3b 0a 20 20 20 20 50 52 41 47 4d 41   = 1;.    PRAGMA
138b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63   incremental_vac
138c0 75 75 6d 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  uum;.    PRAGMA 
138d0 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
138e0 0a 20 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f  .  }.} {ok}..do_
138f0 74 65 73 74 20 34 30 2e 31 20 7b 0a 20 20 72 65  test 40.1 {.  re
13900 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c  set_db.  execsql
13910 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75   {.    PRAGMA au
13920 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20  to_vacuum = 1;. 
13930 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
13940 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(x PRIMARY KEY
13950 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
13960 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
13970 64 6f 6d 62 6c 6f 62 28 31 32 30 30 29 29 3b 0a  domblob(1200));.
13980 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
13990 63 6f 75 6e 74 3b 0a 20 20 7d 0a 7d 20 7b 36 7d  count;.  }.} {6}
139a0 0a 64 6f 5f 74 65 73 74 20 34 30 2e 32 20 7b 0a  .do_test 40.2 {.
139b0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
139c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
139d0 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
139e0 28 31 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  (1200));.    INS
139f0 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
13a00 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 32  ES(randomblob(12
13a10 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
13a20 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
13a30 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 32 30 30 29  randomblob(1200)
13a40 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
13a50 65 73 74 20 34 30 2e 33 20 7b 0a 20 20 64 62 20  est 40.3 {.  db 
13a60 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20  close.  sqlite3 
13a70 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
13a80 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
13a90 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
13aa0 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
13ab0 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 50 52  LE t2(x);.    PR
13ac0 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
13ad0 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 7d  heck;.  }.} {ok}
13ae0 0a 0a 64 6f 5f 74 65 73 74 20 34 31 2e 31 20 7b  ..do_test 41.1 {
13af0 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 65 78  .  reset_db.  ex
13b00 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
13b10 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52  TE TABLE t1(x PR
13b20 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
13b30 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
13b40 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
13b50 28 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (200));.    INSE
13b60 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
13b70 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  T randomblob(200
13b80 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
13b90 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
13ba0 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
13bb0 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
13bc0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
13bd0 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
13be0 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(200) FROM t1;
13bf0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
13c00 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
13c10 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20  mblob(200) FROM 
13c20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
13c30 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
13c40 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
13c50 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
13c60 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
13c70 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
13c80 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
13c90 7b 7d 0a 64 6f 5f 74 65 73 74 20 34 31 2e 32 20  {}.do_test 41.2 
13ca0 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d  {.  testvfs tv -
13cb0 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 73  default 1.  tv s
13cc0 65 63 74 6f 72 73 69 7a 65 20 31 36 33 38 34 3b  ectorsize 16384;
13cd0 0a 20 20 74 76 20 64 65 76 63 68 61 72 20 5b 6c  .  tv devchar [l
13ce0 69 73 74 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  ist].  db close.
13cf0 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
13d00 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
13d10 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
13d20 65 5f 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20  e_size = 1;.    
13d30 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
13d40 48 45 52 45 20 72 6f 77 69 64 25 34 3b 0a 20 20  HERE rowid%4;.  
13d50 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
13d60 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
13d70 7b 6f 6b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  {ok}.db close.tv
13d80 20 64 65 6c 65 74 65 0a 0a 73 65 74 20 70 65 6e   delete..set pen
13d90 64 69 6e 67 5f 70 72 65 76 20 5b 73 71 6c 69 74  ding_prev [sqlit
13da0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f  e3_test_control_
13db0 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 30 78 31  pending_byte 0x1
13dc0 30 30 30 30 30 30 5d 0a 64 6f 5f 74 65 73 74 20  000000].do_test 
13dd0 34 32 2e 31 20 7b 0a 20 20 72 65 73 65 74 5f 64  42.1 {.  reset_d
13de0 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
13df0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
13e00 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53  1(x, y);.    INS
13e10 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
13e20 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  ES(randomblob(20
13e30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  0), randomblob(2
13e40 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
13e50 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
13e60 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c  randomblob(200),
13e70 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
13e80 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
13e90 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
13ea0 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  ECT randomblob(2
13eb0 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
13ec0 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
13ed0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
13ee0 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
13ef0 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62  ob(200), randomb
13f00 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31  lob(200) FROM t1
13f10 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
13f20 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
13f30 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e  omblob(200), ran
13f40 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f  domblob(200) FRO
13f50 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
13f60 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
13f70 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c  randomblob(200),
13f80 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
13f90 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
13fa0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
13fb0 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  ECT randomblob(2
13fc0 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
13fd0 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
13fe0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
13ff0 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
14000 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62  ob(200), randomb
14010 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31  lob(200) FROM t1
14020 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
14030 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
14040 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e  omblob(200), ran
14050 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f  domblob(200) FRO
14060 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
14070 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
14080 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c  randomblob(200),
14090 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
140a0 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20   FROM t1;.  }.  
140b0 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  db close.  sqlit
140c0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f  e3_test_control_
140d0 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 30 78 30  pending_byte 0x0
140e0 30 31 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  010000.  sqlite3
140f0 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62   db test.db.  db
14100 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6d   eval { PRAGMA m
14110 6d 61 70 5f 73 69 7a 65 20 3d 20 30 20 7d 0a 20  map_size = 0 }. 
14120 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
14130 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 79 29  CT sum(length(y)
14140 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  ) FROM t1 }.} {1
14150 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
14160 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
14170 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 34 32 2e  ed}}.do_test 42.
14180 32 20 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 20  2 {.  reset_db. 
14190 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
141a0 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
141b0 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , y);.    INSERT
141c0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
141d0 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c  randomblob(200),
141e0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
141f0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
14200 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
14210 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61  domblob(200), ra
14220 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
14230 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
14240 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
14250 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14260 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
14270 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
14280 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
14290 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
142a0 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  200), randomblob
142b0 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (200) FROM t1;. 
142c0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
142d0 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
142e0 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(200), random
142f0 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74  blob(200) FROM t
14300 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
14310 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
14320 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61  domblob(200), ra
14330 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
14340 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
14350 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
14360 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14370 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
14380 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
14390 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
143a0 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
143b0 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  200), randomblob
143c0 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (200) FROM t1;. 
143d0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
143e0 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
143f0 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(200), random
14400 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74  blob(200) FROM t
14410 31 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73  1;.  }.  db clos
14420 65 0a 0a 20 20 74 65 73 74 76 66 73 20 74 76 20  e..  testvfs tv 
14430 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20  -default 1.  tv 
14440 73 65 63 74 6f 72 73 69 7a 65 20 31 36 33 38 34  sectorsize 16384
14450 3b 0a 20 20 74 76 20 64 65 76 63 68 61 72 20 5b  ;.  tv devchar [
14460 6c 69 73 74 5d 0a 20 20 73 71 6c 69 74 65 33 20  list].  sqlite3 
14470 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20  db test.db -vfs 
14480 74 76 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55  tv.  execsql { U
14490 50 44 41 54 45 20 74 31 20 53 45 54 20 78 20 3d  PDATE t1 SET x =
144a0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
144b0 20 7d 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65   }.} {}.db close
144c0 0a 74 76 20 64 65 6c 65 74 65 0a 73 71 6c 69 74  .tv delete.sqlit
144d0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f  e3_test_control_
144e0 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 24 70 65  pending_byte $pe
144f0 6e 64 69 6e 67 5f 70 72 65 76 0a 0a 64 6f 5f 74  nding_prev..do_t
14500 65 73 74 20 34 33 2e 31 20 7b 0a 20 20 72 65 73  est 43.1 {.  res
14510 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20  et_db.  execsql 
14520 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
14530 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 20  LE t1(x, y);.   
14540 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
14550 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
14560 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
14570 32 28 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53  2(x, y);.    INS
14580 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
14590 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 43 52  ES(1, 2);.    CR
145a0 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 78 2c  EATE TABLE t3(x,
145b0 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   y);.    INSERT 
145c0 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31  INTO t3 VALUES(1
145d0 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63  , 2);.  }.  db c
145e0 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64  lose.  sqlite3 d
145f0 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 64 62 20  b test.db..  db 
14600 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6d 6d  eval { PRAGMA mm
14610 61 70 5f 73 69 7a 65 20 3d 20 30 20 7d 0a 20 20  ap_size = 0 }.  
14620 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54  db eval { SELECT
14630 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73   * FROM t1 }.  s
14640 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
14650 20 64 62 20 43 41 43 48 45 5f 4d 49 53 53 20 30   db CACHE_MISS 0
14660 0a 7d 20 7b 30 20 32 20 30 7d 0a 0a 64 6f 5f 74  .} {0 2 0}..do_t
14670 65 73 74 20 34 33 2e 32 20 7b 0a 20 20 64 62 20  est 43.2 {.  db 
14680 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
14690 46 52 4f 4d 20 74 32 20 7d 0a 20 20 73 71 6c 69  FROM t2 }.  sqli
146a0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 20 64 62  te3_db_status db
146b0 20 43 41 43 48 45 5f 4d 49 53 53 20 31 0a 7d 20   CACHE_MISS 1.} 
146c0 7b 30 20 33 20 30 7d 0a 0a 64 6f 5f 74 65 73 74  {0 3 0}..do_test
146d0 20 34 33 2e 33 20 7b 0a 20 20 64 62 20 65 76 61   43.3 {.  db eva
146e0 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
146f0 4d 20 74 33 20 7d 0a 20 20 73 71 6c 69 74 65 33  M t3 }.  sqlite3
14700 5f 64 62 5f 73 74 61 74 75 73 20 64 62 20 43 41  _db_status db CA
14710 43 48 45 5f 4d 49 53 53 20 30 0a 7d 20 7b 30 20  CHE_MISS 0.} {0 
14720 31 20 30 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73  1 0}..finish_tes
14730 74 0a                                            t.