/ Hex Artifact Content
Login

Artifact 21ec8ef96675aaa7839a0a474ab965d8d5c084fa:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e 6f 74 20  n.tcl..# Do not 
0210: 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 20  use a codec for 
0220: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0230: 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 62  le, as the datab
0240: 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d 61  ase file is.# ma
0250: 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 74  nipulated direct
0260: 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 72  ly using tcl scr
0270: 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 20  ipts (using the 
0280: 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 6f  [hexio_write] co
0290: 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f 74  mmand)..#.do_not
02a0: 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 20  _use_codec..#.# 
02b0: 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 74  pager1-1.*: Test
02c0: 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 6c   inter-process l
02d0: 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 20  ocking (clients 
02e0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
02f0: 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 65  esses)..#.# page
0300: 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e 74  r1-2.*: Test int
0310: 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b 69  ra-process locki
0320: 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c 69  ng (multiple cli
0330: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ents in this pro
0340: 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 72  cess)..#.# pager
0350: 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e 74  1-3.*: Savepoint
0360: 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a   related tests..
0370: 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a 20  #.# pager1-4.*: 
0380: 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c 61  Hot-journal rela
0390: 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 70  ted tests..#.# p
03a0: 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 73  ager1-5.*: Cases
03b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c 74   related to mult
03c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
03d0: 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a 20  #.# pager1-6.*: 
03e0: 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f  Cases related to
03f0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
0400: 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 67  e_count".#.# pag
0410: 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 73  er1-7.*: Cases s
0420: 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47  pecific to "PRAG
0430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0440: 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 61  TRUNCATE".#.# pa
0450: 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 20  ger1-8.*: Cases 
0460: 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  using temporary 
0470: 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
0480: 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  tabases..#.# pag
0490: 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 72  er1-9.*: Tests r
04a0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  elated to the ba
04b0: 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 61  ckup API..#.# pa
04c0: 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 20  ger1-10.*: Test 
04d0: 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 64  that the assumed
04e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
04f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d 69  tor-size is limi
0500: 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ted to.#        
0510: 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 20        64KB..#.# 
0520: 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 73  pager1-12.*: Tes
0530: 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 52  ts involving "PR
0540: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
0550: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a 3a  #.# pager1-13.*:
0560: 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 20   Cases specific 
0570: 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  to "PRAGMA journ
0580: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
0590: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e 2a  .#.# pager1-14.*
05a0: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
05b0: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
05c0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 0a  nal_mode=OFF".#.
05d0: 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 56  # pager1-15.*: V
05e0: 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76  arying sqlite3_v
05f0: 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 20  fs.szOsFile.#.# 
0600: 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 72  pager1-16.*: Var
0610: 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ying sqlite3_vfs
0620: 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 20  .mxPathname.#.# 
0630: 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 73  pager1-17.*: Tes
0640: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 50  ts related to "P
0650: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
0660: 6f 63 6b 22 0a 23 0a 23 20 70 61 67 65 72 31 2d  ock".#.# pager1-
0670: 31 38 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  18.*: Test that 
0680: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
0690: 72 65 73 70 6f 6e 64 73 20 63 6f 72 72 65 63 74  responds correct
06a0: 6c 79 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ly if the b-tree
06b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
06c0: 72 65 71 75 65 73 74 73 20 61 6e 20 69 6e 76 61  requests an inva
06d0: 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
06e0: 28 64 75 65 20 74 6f 20 64 62 20 63 6f 72 72 75  (due to db corru
06f0: 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72 6f 63 20  ption)..#..proc 
0700: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
0710: 20 7b 69 64 20 74 61 62 6c 65 20 7b 73 63 72 69   {id table {scri
0720: 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73 65 74 20  pt {}}} {.  set 
0730: 63 6e 74 20 30 0a 20 20 64 62 20 65 76 61 6c 20  cnt 0.  db eval 
0740: 22 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  "SELECT rowid, *
0750: 20 46 52 4f 4d 20 24 74 61 62 6c 65 20 57 48 45   FROM $table WHE
0760: 52 45 20 72 6f 77 69 64 20 3d 20 28 24 69 64 2d  RE rowid = ($id-
0770: 31 29 22 20 7b 0a 20 20 20 20 72 65 63 75 72 73  1)" {.    recurs
0780: 69 76 65 5f 73 65 6c 65 63 74 20 24 72 6f 77 69  ive_select $rowi
0790: 64 20 24 74 61 62 6c 65 20 24 73 63 72 69 70 74  d $table $script
07a0: 0a 20 20 20 20 69 6e 63 72 20 63 6e 74 0a 20 20  .    incr cnt.  
07b0: 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d 3d 30 7d  }.  if {$cnt==0}
07c0: 20 7b 20 65 76 61 6c 20 24 73 63 72 69 70 74 20   { eval $script 
07d0: 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74 72 69 6e  }.}..set a_strin
07e0: 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70 72 6f 63  g_counter 1.proc
07f0: 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d 20 7b 0a   a_string {n} {.
0800: 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74 72 69 6e    global a_strin
0810: 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69 6e 63 72  g_counter.  incr
0820: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
0830: 72 0a 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65  r.  string range
0840: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
0850: 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  "${a_string_coun
0860: 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20 24 6e 0a  ter}." $n] 1 $n.
0870: 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  }.db func a_stri
0880: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 64 6f 5f  ng a_string..do_
0890: 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
08a0: 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72 65 61 74   tn {..  # Creat
08b0: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
08c0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
08d0: 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  using connection
08e0: 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 0a 20 20   [db]. Check .  
08f0: 23 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  # that connectio
0900: 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62  ns [db2] and [db
0910: 33 5d 20 63 61 6e 20 73 65 65 20 74 68 65 20 73  3] can see the s
0920: 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65 6e  chema and conten
0930: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0940: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 20 7b 0a   pager1-$tn.1 {.
0950: 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20      sql1 {.     
0960: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0970: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
0980: 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  b);.      CREATE
0990: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
09a0: 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
09b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
09c0: 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e 53 45 52  1, 'one'); INSER
09d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
09e0: 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20  (2, 'two');.    
09f0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0a00: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 20  st pager1-$tn.2 
0a10: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0a20: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0a30: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0a40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a50: 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  .3 { sql3 { SELE
0a60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a70: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 0a   {1 one 2 two}..
0a80: 20 20 23 20 4f 70 65 6e 20 61 20 74 72 61 6e 73    # Open a trans
0a90: 61 63 74 69 6f 6e 20 61 6e 64 20 61 64 64 20 61  action and add a
0aa0: 20 72 6f 77 20 75 73 69 6e 67 20 5b 64 62 5d 2e   row using [db].
0ab0: 20 54 68 69 73 20 70 75 74 73 20 5b 64 62 5d 20   This puts [db] 
0ac0: 69 6e 0a 20 20 23 20 52 45 53 45 52 56 45 44 20  in.  # RESERVED 
0ad0: 73 74 61 74 65 2e 20 43 68 65 63 6b 20 74 68 61  state. Check tha
0ae0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64  t connections [d
0af0: 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 20 63 61  b2] and [db3] ca
0b00: 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72 65 61 64  n still.  # read
0b10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
0b20: 6e 74 65 6e 74 20 61 73 20 69 74 20 77 61 73 20  ntent as it was 
0b30: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
0b40: 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 23 20 6f  action was.  # o
0b50: 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73 68 6f 75  pened. [db] shou
0b60: 6c 64 20 73 65 65 20 74 68 65 20 69 6e 73 65 72  ld see the inser
0b70: 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a 20 20 64  ted row..  #.  d
0b80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
0b90: 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b  n.4 {.    sql1 {
0ba0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
0bb0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0bc0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27  O t1 VALUES(3, '
0bd0: 74 68 72 65 65 27 29 3b 0a 20 20 20 20 7d 0a 20  three');.    }. 
0be0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0bf0: 70 61 67 65 72 31 2d 24 74 6e 2e 35 20 7b 20 73  pager1-$tn.5 { s
0c00: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
0c10: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
0c20: 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f 5f 74 65  e 2 two}.  do_te
0c30: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 37 20  st pager1-$tn.7 
0c40: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
0c50: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c60: 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72   one 2 two 3 thr
0c70: 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 73 74  ee}..  # [db] st
0c80: 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ill has an open 
0c90: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
0ca0: 6e 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  n. Check that th
0cb0: 69 73 20 70 72 65 76 65 6e 74 73 0a 20 20 23 20  is prevents.  # 
0cc0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
0cd0: 73 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 20  s (specifically 
0ce0: 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77 72 69 74  [db2]) from writ
0cf0: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
0d00: 61 73 65 2e 0a 20 20 23 0a 20 20 23 20 45 76 65  ase..  #.  # Eve
0d10: 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70 65 6e 73  n if [db2] opens
0d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
0d30: 69 72 73 74 2c 20 69 74 20 6d 61 79 20 6e 6f 74  irst, it may not
0d40: 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20   write to the.  
0d50: 23 20 64 61 74 61 62 61 73 65 2e 20 41 66 74 65  # database. Afte
0d60: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
0d70: 20 77 72 69 74 65 20 74 68 65 20 64 62 20 77 69   write the db wi
0d80: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
0d90: 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32 5d 20 69  on, .  # [db2] i
0da0: 73 20 6c 65 66 74 20 77 69 74 68 20 61 6e 20 6f  s left with an o
0db0: 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
0dc0: 20 62 75 74 20 6e 6f 74 20 61 20 72 65 61 64 2d   but not a read-
0dd0: 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74 68 65 20  lock on.  # the 
0de0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 53  main database. S
0df0: 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 70 72  o it does not pr
0e00: 65 76 65 6e 74 20 5b 64 62 5d 20 66 72 6f 6d 20  event [db] from 
0e10: 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20 20 23 0a  committing..  #.
0e20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0e30: 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20 20 63 73  -$tn.8 { .    cs
0e40: 71 6c 32 20 7b 20 55 50 44 41 54 45 20 74 31 20  ql2 { UPDATE t1 
0e50: 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d  SET a = a + 10 }
0e60: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
0e70: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
0e80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0e90: 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63 73 71 6c  tn.9 { .    csql
0ea0: 32 20 7b 20 0a 20 20 20 20 20 20 42 45 47 49 4e  2 { .      BEGIN
0eb0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
0ec0: 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30  1 SET a = a + 10
0ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  ;.    }.  } {1 {
0ee0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
0ef0: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
0f00: 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20 74  db] commit its t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 43 68 65  ransactions. Che
0f20: 63 6b 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6e  ck the other con
0f30: 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a 20 20 23  nections can.  #
0f40: 20 6e 6f 77 20 73 65 65 20 74 68 65 20 6e 65 77   now see the new
0f50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
0f60: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0f70: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 30 20 7b   pager1-$tn.10 {
0f80: 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql1 { COMMIT }
0f90: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0fa0: 70 61 67 65 72 31 2d 24 74 6e 2e 31 31 20 7b 20  pager1-$tn.11 { 
0fb0: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql1 { SELECT * 
0fc0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
0fd0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
0fe0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
0ff0: 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73 71 6c 32  r1-$tn.12 { sql2
1000: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1010: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1020: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20   two 3 three}.  
1030: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1040: 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20 7b 20 53  tn.13 { sql3 { S
1050: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1060: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
1070: 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 43   3 three}..  # C
1080: 68 65 63 6b 20 74 68 61 74 2c 20 61 73 20 6e 6f  heck that, as no
1090: 74 65 64 20 61 62 6f 76 65 2c 20 5b 64 62 32 5d  ted above, [db2]
10a0: 20 72 65 61 6c 6c 79 20 64 69 64 20 6b 65 65 70   really did keep
10b0: 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   an open transac
10c0: 74 69 6f 6e 0a 20 20 23 20 61 66 74 65 72 20 74  tion.  # after t
10d0: 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
10e0: 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
10f0: 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a 20 20 64   failed..  #.  d
1100: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1110: 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.14 { .    csql
1120: 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a 20 20 7d  2 { BEGIN } .  }
1130: 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61 72   {1 {cannot star
1140: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1150: 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1160: 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  tion}}.  do_test
1170: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b   pager1-$tn.15 {
1180: 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42 41 43 4b   sql2 { ROLLBACK
1190: 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61 76   } } {}..  # Hav
11a0: 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 74  e [db2] open a t
11b0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74  ransaction and t
11c0: 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ake a read-lock 
11d0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
11e0: 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20  .  # Check that 
11f0: 74 68 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64  this prevents [d
1200: 62 5d 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  b] from writing 
1210: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1220: 28 6f 75 74 73 69 64 65 0a 20 20 23 20 6f 66 20  (outside.  # of 
1230: 61 6e 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  any transaction)
1240: 2e 20 41 66 74 65 72 20 74 68 69 73 20 66 61 69  . After this fai
1250: 6c 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 5b  ls, check that [
1260: 64 62 33 5d 20 63 61 6e 20 72 65 61 64 0a 20 20  db3] can read.  
1270: 23 20 74 68 65 20 64 62 20 28 73 68 6f 77 69 6e  # the db (showin
1280: 67 20 74 68 61 74 20 5b 64 62 5d 20 64 69 64 20  g that [db] did 
1290: 6e 6f 74 20 74 61 6b 65 20 61 20 50 45 4e 44 49  not take a PENDI
12a0: 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29 0a 20 20  NG lock etc.).  
12b0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  #.  do_test page
12c0: 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a 20 20 20  r1-$tn.15 { .   
12d0: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53   sql2 { BEGIN; S
12e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
12f0: 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32 20   }.  } {1 one 2 
1300: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64  two 3 three}.  d
1310: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1320: 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.16 { .    csql
1330: 31 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  1 { UPDATE t1 SE
1340: 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d 0a 20  T a = a + 10 }. 
1350: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
1360: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
1370: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1380: 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c  .17 { sql3 { SEL
1390: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
13a0: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
13b0: 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 54 68 69   three}..  # Thi
13c0: 73 20 74 69 6d 65 2c 20 68 61 76 65 20 5b 64 62  s time, have [db
13d0: 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63  ] open a transac
13e0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 77 72 69 74  tion before writ
13f0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1400: 2e 0a 20 20 23 20 54 68 69 73 20 77 6f 72 6b 73  ..  # This works
1410: 20 2d 20 5b 64 62 5d 20 67 65 74 73 20 61 20 52   - [db] gets a R
1420: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 69  ESERVED lock whi
1430: 63 68 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 66  ch does not conf
1440: 6c 69 63 74 20 77 69 74 68 0a 20 20 23 20 74 68  lict with.  # th
1450: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 5b 64  e SHARED lock [d
1460: 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e 67 2e 0a  b2] is holding..
1470: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61    #.  do_test pa
1480: 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b 20 0a 20  ger1-$tn.18 { . 
1490: 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20     sql1 { .     
14a0: 20 42 45 47 49 4e 3b 20 20 0a 20 20 20 20 20 20   BEGIN;  .      
14b0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
14c0: 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20 20 20 7d  = a + 10; .    }
14d0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
14e0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2d 31 39 20  t pager1-$tn-19 
14f0: 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 50 52  { .    sql1 { PR
1500: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
1510: 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 72 65   } .  } {main re
1520: 73 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73  served temp clos
1530: 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ed}.  do_test pa
1540: 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b 20 0a 20  ger1-$tn-20 { . 
1550: 20 20 20 73 71 6c 32 20 7b 20 50 52 41 47 4d 41     sql2 { PRAGMA
1560: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20 0a   lock_status } .
1570: 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61 72 65 64    } {main shared
1580: 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 20   temp closed}.. 
1590: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c   # Check that al
15a0: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  l connections ca
15b0: 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74 68 65  n still read the
15c0: 20 64 61 74 61 62 61 73 65 2e 20 4f 6e 6c 79 20   database. Only 
15d0: 5b 64 62 5d 20 73 65 65 73 0a 20 20 23 20 74 68  [db] sees.  # th
15e0: 65 20 75 70 64 61 74 65 64 20 63 6f 6e 74 65 6e  e updated conten
15f0: 74 20 28 61 73 20 74 68 65 20 74 72 61 6e 73 61  t (as the transa
1600: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  ction has not be
1610: 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 79 65 74  en committed yet
1620: 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  )..  #.  do_test
1630: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 31 20 7b   pager1-$tn.21 {
1640: 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a   sql1 { SELECT *
1650: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 31   FROM t1 } } {11
1660: 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33 20 74   one 12 two 13 t
1670: 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  hree}.  do_test 
1680: 70 61 67 65 72 31 2d 24 74 6e 2e 32 32 20 7b 20  pager1-$tn.22 { 
1690: 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
16a0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
16b0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
16c0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
16d0: 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73 71 6c 33  r1-$tn.23 { sql3
16e0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
16f0: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1700: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20   two 3 three}.. 
1710: 20 23 20 42 65 63 61 75 73 65 20 5b 64 62 32 5d   # Because [db2]
1720: 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 53   still has the S
1730: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b 64 62 5d  HARED lock, [db]
1740: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   is unable to co
1750: 6d 6d 69 74 20 74 68 65 0a 20 20 23 20 74 72 61  mmit the.  # tra
1760: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
1770: 74 72 69 65 73 2c 20 61 6e 20 65 72 72 6f 72 20  tries, an error 
1780: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1790: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  the connection .
17a0: 20 20 23 20 75 70 67 72 61 64 65 73 20 74 6f 20    # upgrades to 
17b0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
17c0: 20 20 23 0a 20 20 23 20 4f 6e 63 65 20 74 68 69    #.  # Once thi
17d0: 73 20 68 61 70 70 65 6e 73 2c 20 5b 64 62 5d 20  s happens, [db] 
17e0: 63 61 6e 20 72 65 61 64 20 74 68 65 20 64 61 74  can read the dat
17f0: 61 62 61 73 65 20 61 6e 64 20 73 65 65 20 74 68  abase and see th
1800: 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2c 0a 20  e new content,. 
1810: 20 23 20 5b 64 62 32 5d 20 28 73 74 69 6c 6c 20   # [db2] (still 
1820: 68 6f 6c 64 69 6e 67 20 53 48 41 52 45 44 29 20  holding SHARED) 
1830: 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74  can still read t
1840: 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 2c 20  he old content, 
1850: 62 75 74 20 5b 64 62 33 5d 0a 20 20 23 20 28 6e  but [db3].  # (n
1860: 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c  ot holding any l
1870: 6f 63 6b 29 20 69 73 20 70 72 65 76 65 6e 74 65  ock) is prevente
1880: 64 20 62 79 20 5b 64 62 5d 27 73 20 50 45 4e 44  d by [db]'s PEND
1890: 49 4e 47 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ING from reading
18a0: 0a 20 20 23 20 74 68 65 20 64 61 74 61 62 61 73  .  # the databas
18b0: 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  e..  #.  do_test
18c0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 34 20 7b   pager1-$tn.24 {
18d0: 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20   csql1 { COMMIT 
18e0: 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  } } {1 {database
18f0: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
1900: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1910: 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73 71 6c 31  n-25 { .    sql1
1920: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73   { PRAGMA lock_s
1930: 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61  tatus } .  } {ma
1940: 69 6e 20 70 65 6e 64 69 6e 67 20 74 65 6d 70 20  in pending temp 
1950: 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73  closed}.  do_tes
1960: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 36 20  t pager1-$tn.26 
1970: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
1980: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
1990: 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33  11 one 12 two 13
19a0: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
19b0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37 20  t pager1-$tn.27 
19c0: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
19d0: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
19e0: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
19f0: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1a00: 61 67 65 72 31 2d 24 74 6e 2e 32 38 20 7b 20 63  ager1-$tn.28 { c
1a10: 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql3 { SELECT * 
1a20: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b  FROM t1 } } {1 {
1a30: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
1a40: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
1a50: 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20  db2] commit its 
1a60: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1a70: 2c 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  , releasing the 
1a80: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 74 0a 20  SHARED lock it. 
1a90: 20 23 20 69 73 20 68 6f 6c 64 69 6e 67 2e 20 4e   # is holding. N
1aa0: 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b 64 62 32  ow, neither [db2
1ab0: 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d 61 79 20  ] nor [db3] may 
1ac0: 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1ad0: 65 20 28 61 73 20 5b 64 62 5d 0a 20 20 23 20 69  e (as [db].  # i
1ae0: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
1af0: 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20 20 23 0a  a PENDING)..  #.
1b00: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1b10: 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c 32 20 7b  -$tn.29 { sql2 {
1b20: 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20   COMMIT } } {}. 
1b30: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b40: 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c 32 20 7b  $tn.30 { csql2 {
1b50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1b60: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1b70: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
1b80: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b90: 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c 33 20 7b  $tn.31 { csql3 {
1ba0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1bb0: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1bc0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a  se is locked}}..
1bd0: 20 20 23 20 5b 64 62 5d 20 69 73 20 6e 6f 77 20    # [db] is now 
1be0: 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20 74  able to commit t
1bf0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
1c00: 4f 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61 63  Once the transac
1c10: 74 69 6f 6e 20 69 73 20 0a 20 20 23 20 63 6f 6d  tion is .  # com
1c20: 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74 68 72 65  mitted, all thre
1c30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  e connections ca
1c40: 6e 20 72 65 61 64 20 74 68 65 20 6e 65 77 20 63  n read the new c
1c50: 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f  ontent..  #.  do
1c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1c70: 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20 55 50 44  .25 { sql1 { UPD
1c80: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61  ATE t1 SET a = a
1c90: 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f  +10 } } {}.  do_
1ca0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1cb0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d  26 { sql1 { COMM
1cc0: 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  IT } } {}.  do_t
1cd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1ce0: 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  7 { sql1 { SELEC
1cf0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
1d00: 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32  {21 one 22 two 2
1d10: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
1d20: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37  st pager1-$tn.27
1d30: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1d40: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1d50: 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33  21 one 22 two 23
1d60: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1d70: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1d80: 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20  { sql3 { SELECT 
1d90: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 32  * FROM t1 } } {2
1da0: 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20  1 one 22 two 23 
1db0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 49 6e 73 74  three}..  # Inst
1dc0: 61 6c 6c 20 61 20 62 75 73 79 2d 68 61 6e 64 6c  all a busy-handl
1dd0: 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  er for connectio
1de0: 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20 20 73 65  n [db]..  #.  se
1df0: 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69 73 74 5d  t ::nbusy [list]
1e00: 0a 20 20 70 72 6f 63 20 62 75 73 79 20 7b 6e 7d  .  proc busy {n}
1e10: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a   {.    lappend :
1e20: 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20 20 69 66  :nbusy $n.    if
1e30: 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c 32 20 43   {$n>5} { sql2 C
1e40: 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72 65 74 75  OMMIT }.    retu
1e50: 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62 20 62 75  rn 0.  }.  db bu
1e60: 73 79 20 62 75 73 79 0a 0a 20 20 64 6f 5f 74 65  sy busy..  do_te
1e70: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 39  st pager1-$tn.29
1e80: 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 42   { .    sql1 { B
1e90: 45 47 49 4e 20 3b 20 49 4e 53 45 52 54 20 49 4e  EGIN ; INSERT IN
1ea0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 27  TO t1 VALUES('x'
1eb0: 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d 20 7b 7d  , 'y') } .  } {}
1ec0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1ed0: 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20 20 20 20  1-$tn.30 { .    
1ee0: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20 53  sql2 { BEGIN ; S
1ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1f00: 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e 65 20 32  } .  } {21 one 2
1f10: 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a  2 two 23 three}.
1f20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1f30: 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c 31 20 43  -$tn.31 { sql1 C
1f40: 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f  OMMIT } {}.  do_
1f50: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1f60: 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62 75 73 79  32 { set ::nbusy
1f70: 20 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35 20   } {0 1 2 3 4 5 
1f80: 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  6}.}..#---------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 0a 23 20 53 61 76 65 70 6f 69 6e 74 20 72 65 6c  .# Savepoint rel
1fe0: 61 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e  ated test cases.
1ff0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 33 2e 31 2e  .#.# pager1-3.1.
2000: 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20 73 61 76  2.*: Force a sav
2010: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
2020: 74 6f 20 63 61 75 73 65 20 74 68 65 20 64 61 74  to cause the dat
2030: 61 62 61 73 65 20 66 69 6c 65 0a 23 20 20 20 20  abase file.#    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20               to 
2050: 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67 65 72 31  grow..#.# pager1
2060: 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65 20 61 20  -3.1.3.*: Use a 
2070: 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
2080: 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f  in synchronous=o
2090: 66 66 20 6d 6f 64 65 20 61 73 20 70 61 72 74 0a  ff mode as part.
20a0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
20b0: 20 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74    of a savepoint
20c0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 0a 64 6f   rollback..# .do
20d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31  _test pager1-3.1
20e0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
20f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
2100: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
2110: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2120: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
2130: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
2140: 54 41 42 4c 45 20 63 6f 75 6e 74 65 72 28 0a 20  TABLE counter(. 
2150: 20 20 20 20 20 69 20 43 48 45 43 4b 20 28 69 3c       i CHECK (i<
2160: 35 29 2c 20 0a 20 20 20 20 20 20 75 20 43 48 45  5), .      u CHE
2170: 43 4b 20 28 75 3c 31 30 29 0a 20 20 20 20 29 3b  CK (u<10).    );
2180: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2190: 20 63 6f 75 6e 74 65 72 20 56 41 4c 55 45 53 28   counter VALUES(
21a0: 30 2c 20 30 29 3b 0a 20 20 20 20 43 52 45 41 54  0, 0);.    CREAT
21b0: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 41 46  E TRIGGER tr1 AF
21c0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
21d0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
21e0: 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20  ATE counter SET 
21f0: 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20 45 4e 44  i = i+1;.    END
2200: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
2210: 47 47 45 52 20 74 72 32 20 41 46 54 45 52 20 55  GGER tr2 AFTER U
2220: 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47 49  PDATE ON t1 BEGI
2230: 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 63  N.      UPDATE c
2240: 6f 75 6e 74 65 72 20 53 45 54 20 75 20 3d 20 75  ounter SET u = u
2250: 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  +1;.    END;.  }
2260: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
2270: 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74  ECT * FROM count
2280: 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a 0a 64 6f  er }.} {0 0}..do
2290: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
22a0: 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a 20 20 50  ger1-3.1.2 {.  P
22b0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
22c0: 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a   = 10;.  BEGIN;.
22d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
22e0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
22f0: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2300: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2310: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e  t1 VALUES(2, ran
2320: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2340: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61 6e  t1 VALUES(3, ran
2350: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2360: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2370: 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20 7b 33 20  M counter;.} {3 
2380: 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  0}.do_catchsql_t
2390: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31 2e 33  est pager1-3.1.3
23a0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
23b0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 33  TO t1 SELECT a+3
23c0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
23d0: 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 31 20  0) FROM t1.} {1 
23e0: 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  {constraint fail
23f0: 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ed}}.do_execsql_
2400: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 34 20  test pager1-3.4 
2410: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
2420: 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20 30 7d 0a  counter } {3 0}.
2430: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2440: 70 61 67 65 72 31 2d 33 2e 35 20 7b 20 53 45 4c  pager1-3.5 { SEL
2450: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 7d 20  ECT a FROM t1 } 
2460: 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78 65 63 73  {1 2 3}.do_execs
2470: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2480: 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d  .6 { COMMIT } {}
2490: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71  ..foreach {tn sq
24a0: 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20 20 7b 20  l tcl} {.  7  { 
24b0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
24c0: 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50 52  us = NORMAL ; PR
24d0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20  AGMA temp_store 
24e0: 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74 65 73 74  = 0 } {.    test
24f0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
2500: 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72  1.    tv devchar
2510: 20 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20 7d   safe_append.  }
2520: 0a 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 73  .  8  { PRAGMA s
2530: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52  ynchronous = NOR
2540: 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20 74 65 6d  MAL ; PRAGMA tem
2550: 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d 20 7b 0a  p_store = 2 } {.
2560: 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d      testvfs tv -
2570: 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76  default 1.    tv
2580: 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e 74   devchar sequent
2590: 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20 7b 20 50  ial.  }.  9  { P
25a0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
25b0: 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20 7d 0a 20  s = FULL } { }. 
25c0: 20 31 30 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   10 { PRAGMA syn
25d0: 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41  chronous = NORMA
25e0: 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20 7b 20 50  L } { }.  11 { P
25f0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
2600: 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d 0a 20 20  s = OFF } { }.  
2610: 31 32 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63  12 { PRAGMA sync
2620: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 3b  hronous = FULL ;
2630: 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e   PRAGMA fullfsyn
2640: 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20 20 31 33  c = 1 } { }.  13
2650: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2660: 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b  onous = FULL } {
2670: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
2680: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74  -default 1.    t
2690: 76 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e  v devchar sequen
26a0: 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34 20 7b 20  tial.  }.  14 { 
26b0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
26c0: 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 20  ode = EXCLUSIVE 
26d0: 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20 20 64 6f  } {.  }.} {.  do
26e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24  _test pager1-3.$
26f0: 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76 61 6c 20  tn.1 {.    eval 
2700: 24 74 63 6c 0a 20 20 20 20 66 61 75 6c 74 73 69  $tcl.    faultsi
2710: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
2720: 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20  pen.    db func 
2730: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
2740: 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 73  g.    execsql $s
2750: 71 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  ql.    execsql {
2760: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
2770: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20  to_vacuum = 2;. 
2780: 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
2790: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
27a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
27b0: 7a 28 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d  z(x INTEGER PRIM
27c0: 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
27d0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
27e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
27f0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73  VALUES(NULL, a_s
2800: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
2810: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2820: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2830: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2840: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20 32  OM z;     --   2
2850: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2860: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2870: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2880: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
2890: 20 20 20 34 0a 20 20 20 20 20 20 20 20 49 4e 53     4.        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 38 0a 20 20 20 20 20 20 20    --   8.       
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 31 36 0a 20 20 20  ;     --  16.   
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 33 32  OM z;     --  32
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 36 34 0a 20 20 20 20 20 20 20 20 49 4e 53    64.        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 31 32 38 0a 20 20 20 20 20 20 20    -- 128.       
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 32 35 36 0a 20 20 20  ;     -- 256.   
2a30: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
2a40: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
2a50: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2a60: 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20 20 64 6f  m }.  } {2}.  do
2a70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
2a80: 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20 7b 0a 20  ger1-3.$tn.2 {. 
2a90: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
2aa0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56 41  INSERT INTO z VA
2ab0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72  LUES(NULL, a_str
2ac0: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20  ing(800));.     
2ad0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56   INSERT INTO z V
2ae0: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74  ALUES(NULL, a_st
2af0: 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20  ring(800));.    
2b00: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
2b10: 0a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  .        UPDATE 
2b20: 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c 4c 20 57  z SET y = NULL W
2b30: 48 45 52 45 20 78 3e 32 35 36 3b 0a 20 20 20 20  HERE x>256;.    
2b40: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65      PRAGMA incre
2b50: 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20  mental_vacuum;. 
2b60: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f         SELECT co
2b70: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 20 57 48  unt(*) FROM z WH
2b80: 45 52 45 20 78 20 3c 20 31 30 30 3b 0a 20 20 20  ERE x < 100;.   
2b90: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
2ba0: 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ne;.    COMMIT;.
2bb0: 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64 6f 5f 65    } {99}..  do_e
2bc0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
2bd0: 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  r1-3.$tn.3 {.   
2be0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41   BEGIN;.      SA
2bf0: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
2c00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2c10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2c20: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
2c30: 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  e;.    COMMIT;. 
2c40: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2c50: 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 7d 20 7b  *) FROM z;.  } {
2c60: 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73  258}..  do_execs
2c70: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2c80: 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 53 41 56  .$tn.4 {.    SAV
2c90: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
2ca0: 20 20 55 50 44 41 54 45 20 7a 20 53 45 54 20 79    UPDATE z SET y
2cb0: 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20 52 4f 4c   = y||x;.    ROL
2cc0: 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
2cd0: 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71  } {}.  do_execsq
2ce0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2cf0: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53 45 4c 45  $tn.5 {.    SELE
2d00: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2d10: 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20   z;.    RELEASE 
2d20: 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  one;.    PRAGMA 
2d30: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
2d40: 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d 0a 0a 20  .  } {258 ok}.. 
2d50: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2d60: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 36 20   pager1-3.$tn.6 
2d70: 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  {.    SAVEPOINT 
2d80: 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45 41 53 45  one;.    RELEASE
2d90: 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 0a 20 20   one;.  } {}..  
2da0: 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68  db close.  catch
2db0: 20 7b 20 74 76 20 64 65 6c 65 74 65 20 7d 0a 7d   { tv delete }.}
2dc0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 48  ------------.# H
2e10: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
2e20: 61 63 6b 20 72 65 6c 61 74 65 64 20 74 65 73 74  ack related test
2e30: 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65   cases..#.# page
2e40: 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73 74 20 74  r1.4.1.*: Test t
2e50: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f  hat the pager mo
2e60: 64 75 6c 65 20 64 65 6c 65 74 65 73 20 76 65 72  dule deletes ver
2e70: 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c 69 64 0a  y small invalid.
2e80: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
2e90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23  journal files..#
2ea0: 0a 23 20 70 61 67 65 72 31 2e 34 2e 32 2e 2a 3a  .# pager1.4.2.*:
2eb0: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
2ec0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2ed0: 20 70 6f 69 6e 74 65 72 20 61 74 20 74 68 65 20   pointer at the 
2ee0: 65 6e 64 20 6f 66 20 61 0a 23 20 20 20 20 20 20  end of a.#      
2ef0: 20 20 20 20 20 20 20 20 20 68 6f 74 2d 6a 6f 75           hot-jou
2f00: 72 6e 61 6c 20 66 69 6c 65 20 61 70 70 65 61 72  rnal file appear
2f10: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 20  s to be corrupt 
2f20: 28 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e  (checksum does n
2f30: 6f 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ot.#            
2f40: 20 20 20 63 6f 6d 70 75 74 65 29 20 74 68 65 20     compute) the 
2f50: 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e  associated journ
2f60: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
2f70: 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20 20 20 20  k (and no.#     
2f80: 20 20 20 20 20 20 20 20 20 20 78 41 63 63 65 73            xAcces
2f90: 73 28 29 20 63 61 6c 6c 20 74 6f 20 63 68 65 63  s() call to chec
2fa0: 6b 20 66 6f 72 20 74 68 65 20 70 72 65 73 65 6e  k for the presen
2fb0: 63 65 20 6f 66 20 61 6e 79 20 6d 61 73 74 65 72  ce of any master
2fc0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
2fd0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
2fe0: 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20 70 61 67  s made)..#.# pag
2ff0: 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65 73 74 20  er1.4.3.*: Test 
3000: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
3010: 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  s of a hot-journ
3020: 61 6c 20 61 72 65 20 69 67 6e 6f 72 65 64 20 69  al are ignored i
3030: 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  f the.#         
3040: 20 20 20 20 20 20 70 61 67 65 2d 73 69 7a 65 20        page-size 
3050: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
3060: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
3070: 61 64 65 72 20 61 70 70 65 61 72 20 74 6f 0a 23  ader appear to.#
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3090: 65 20 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20 6c  e invalid (too l
30a0: 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61 6c 6c 20  arge, too small 
30b0: 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65 72 20 6f  or not a power o
30c0: 66 20 32 29 2e 0a 23 0a 23 20 70 61 67 65 72 31  f 2)..#.# pager1
30d0: 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20 68 6f 74  .4.4.*: Test hot
30e0: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
30f0: 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  k of journal fil
3100: 65 20 77 69 74 68 20 61 20 6d 61 73 74 65 72 0a  e with a master.
3110: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3120: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
3130: 67 65 6e 65 72 61 74 65 64 20 69 6e 20 76 61 72  generated in var
3140: 69 6f 75 73 20 22 50 52 41 47 4d 41 20 73 79 6e  ious "PRAGMA syn
3150: 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20 20 20 20  chronous".#     
3160: 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 73 2e            modes.
3170: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 35 2e  .#.# pager1.4.5.
3180: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 68 6f 74  *: Test that hot
3190: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
31a0: 6b 20 73 74 6f 70 73 20 69 66 20 69 74 20 65 6e  k stops if it en
31b0: 63 6f 75 6e 74 65 72 73 20 61 0a 23 20 20 20 20  counters a.#    
31c0: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
31d0: 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72 20 77 68  al-record for wh
31e0: 69 63 68 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ich the checksum
31f0: 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65   fails..#.# page
3200: 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73 74 20 74  r1.4.6.*: Test t
3210: 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67  hat when rolling
3220: 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
3230: 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nal that contain
3240: 73 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  s a.#           
3250: 20 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e      master journ
3260: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20  al pointer, the 
3270: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
3280: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 0a 23  ile is deleted.#
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
32a0: 66 74 65 72 20 61 6c 6c 20 74 68 65 20 68 6f 74  fter all the hot
32b0: 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61 74 20 72  -journals that r
32c0: 65 66 65 72 20 74 6f 20 69 74 20 61 72 65 20 64  efer to it are d
32d0: 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70 61 67 65  eleted..#.# page
32e0: 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73 74 20 74  r1.4.7.*: Test t
32f0: 68 61 74 20 69 66 20 61 20 68 6f 74 2d 6a 6f 75  hat if a hot-jou
3300: 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
3310: 20 62 75 74 20 61 20 63 6c 69 65 6e 74 20 63 61   but a client ca
3320: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
3330: 20 20 6f 70 65 6e 20 69 74 20 66 6f 72 20 72 65    open it for re
3340: 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74 68 65 20  ading only, the 
3350: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
3360: 62 65 20 61 63 63 65 73 73 65 64 20 61 6e 64 0a  be accessed and.
3370: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3380: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
3390: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 20 0a  is returned..# .
33a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
33b0: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
33c0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
33d0: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  pen.  execsql { 
33e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
33f0: 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20 20 20 49  E x(y, z);.    I
3400: 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41 4c  NSERT INTO x VAL
3410: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
3420: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65   set fd [open te
3430: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d  st.db-journal w]
3440: 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69  .  puts -nonewli
3450: 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f 77 6f 72  ne $fd "hellowor
3460: 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  ld".  close $fd.
3470: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
3480: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
3490: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {1}.do_test page
34a0: 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78 65 63 73  r1.4.1.2 { execs
34b0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
34c0: 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32 7d 0a 64  OM x } } {1 2}.d
34d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
34e0: 31 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  1.3 { file exist
34f0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
3500: 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65 74 20 75  l } {0}..# Set u
3510: 70 20 61 20 5b 74 65 73 74 76 66 73 5d 20 74 6f  p a [testvfs] to
3520: 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   snapshot the fi
3530: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
3540: 65 66 6f 72 65 20 53 51 4c 69 74 65 0a 23 20 64  efore SQLite.# d
3550: 65 6c 65 74 65 73 20 74 68 65 20 6d 61 73 74 65  eletes the maste
3560: 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 63 6f 6d  r-journal to com
3570: 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  mit a multi-file
3580: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
3590: 23 20 49 6e 20 73 75 62 73 65 71 75 65 6e 74 20  # In subsequent 
35a0: 74 65 73 74 20 63 61 73 65 73 2c 20 69 6e 76 6f  test cases, invo
35b0: 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69 6d 5f 72  king [faultsim_r
35c0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
35d0: 6e 5d 20 73 65 74 73 0a 23 20 75 70 20 74 68 65  n] sets.# up the
35e0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
35f0: 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64 61 74 61  contain two data
3600: 62 61 73 65 73 2c 20 74 77 6f 20 68 6f 74 2d 6a  bases, two hot-j
3610: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 6e 64  ournal files and
3620: 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72  .# a master-jour
3630: 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  nal..#.do_test p
3640: 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b 0a 20 20  ager1.4.2.1 {.  
3650: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3660: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3670: 66 73 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  fs filter xDelet
3680: 65 0a 20 20 74 73 74 76 66 73 20 73 63 72 69 70  e.  tstvfs scrip
3690: 74 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63  t xDeleteCallbac
36a0: 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c 65 74 65  k.  proc xDelete
36b0: 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64  Callback {method
36c0: 20 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20   file args} {.  
36d0: 20 20 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65    set file [file
36e0: 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20   tail $file].   
36f0: 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 6d 61   if { [string ma
3700: 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c 65 5d 20  tch *mj* $file] 
3710: 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  } { faultsim_sav
3720: 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  e }.  }.  faults
3730: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
3740: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
3750: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
3760: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3770: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
3780: 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50  2' AS aux;.    P
3790: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
37a0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
37b0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 63 61 63   PRAGMA main.cac
37c0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37d0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 63 61 63    PRAGMA aux.cac
37e0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3800: 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  1(a UNIQUE, b UN
3810: 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54  IQUE);.    CREAT
3820: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61  E TABLE aux.t2(a
3830: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
3840: 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  E);.    INSERT I
3850: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
3860: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
3870: 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20  tring(300));.   
3880: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3890: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38a0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38b0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
38c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
38d0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38e0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
3900: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3910: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3920: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
3930: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3940: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
3950: 67 28 32 30 31 29 2c 20 61 5f 73 74 72 69 6e 67  g(201), a_string
3960: 28 33 30 31 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (301) FROM t1;. 
3970: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3980: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
3990: 69 6e 67 28 32 30 32 29 2c 20 61 5f 73 74 72 69  ing(202), a_stri
39a0: 6e 67 28 33 30 32 29 20 46 52 4f 4d 20 74 31 3b  ng(302) FROM t1;
39b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
39c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
39d0: 74 72 69 6e 67 28 32 30 33 29 2c 20 61 5f 73 74  tring(203), a_st
39e0: 72 69 6e 67 28 33 30 33 29 20 46 52 4f 4d 20 74  ring(303) FROM t
39f0: 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  1;.      INSERT 
3a00: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
3a10: 5f 73 74 72 69 6e 67 28 32 30 34 29 2c 20 61 5f  _string(204), a_
3a20: 73 74 72 69 6e 67 28 33 30 34 29 20 46 52 4f 4d  string(304) FROM
3a30: 20 74 31 3b 0a 20 20 20 20 20 20 52 45 50 4c 41   t1;.      REPLA
3a40: 43 45 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  CE INTO t2 SELEC
3a50: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
3a60: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64   COMMIT;.  }.  d
3a70: 62 20 63 6c 6f 73 65 0a 20 20 74 73 74 76 66 73  b close.  tstvfs
3a80: 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 0a 69 66   delete.} {}..if
3a90: 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
3aa0: 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69  m(platform)!="wi
3ab0: 6e 64 6f 77 73 22 7d 20 7b 0a 64 6f 5f 74 65 73  ndows"} {.do_tes
3ac0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 32 20 7b  t pager1.4.2.2 {
3ad0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
3ae0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
3af0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3b00: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3b10: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3b20: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3b30: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d  ck;.  }.} {4 ok}
3b40: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
3b50: 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75 6c 74 73  4.2.3 {.  faults
3b60: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
3b70: 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61 63 68 20  eopen.  foreach 
3b80: 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2d  f [glob test.db-
3b90: 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65  mj*] { forcedele
3ba0: 74 65 20 24 66 20 7d 0a 20 20 65 78 65 63 73 71  te $f }.  execsq
3bb0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  l {.    SELECT c
3bc0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
3bd0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
3be0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
3bf0: 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f 5f 74 65  .} {64 ok}.do_te
3c00: 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 34 20  st pager1.4.2.4 
3c10: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
3c20: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
3c30: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
3c40: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
3c50: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
3c60: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d  est.db-journal]-
3c70: 32 30 5d 20 31 32 33 34 35 36 0a 20 20 65 78 65  20] 123456.  exe
3c80: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3c90: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3ca0: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3cb0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3cc0: 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f    }.} {4 ok}.do_
3cd0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3ce0: 35 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  5 {.  faultsim_r
3cf0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3d00: 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  n.  hexio_write 
3d10: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
3d20: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
3d30: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3d40: 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20 66  ]-20] 123456.  f
3d50: 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 74  oreach f [glob t
3d60: 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f  est.db-mj*] { fo
3d70: 72 63 65 64 65 6c 65 74 65 20 24 66 20 7d 0a 20  rcedelete $f }. 
3d80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3d90: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3da0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3db0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3dc0: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d  ck;.  }.} {4 ok}
3dd0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  .}..do_test page
3de0: 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20 74 65 73  r1.4.3.1 {.  tes
3df0: 74 76 66 73 20 74 73 74 76 66 73 20 2d 64 65 66  tvfs tstvfs -def
3e00: 61 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73 20  ault 1.  tstvfs 
3e10: 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74  filter xSync.  t
3e20: 73 74 76 66 73 20 73 63 72 69 70 74 20 78 53 79  stvfs script xSy
3e30: 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f  ncCallback.  pro
3e40: 63 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 20  c xSyncCallback 
3e50: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72 67  {method file arg
3e60: 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c  s} {.    set fil
3e70: 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  e [file tail $fi
3e80: 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 30 3d 3d  le].    if { 0==
3e90: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a  [string match *j
3ea0: 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d 20 7d 20  ournal $file] } 
3eb0: 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20  { faultsim_save 
3ec0: 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  }.  }.  faultsim
3ed0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
3ee0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
3ef0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
3f00: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
3f10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3f20: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
3f30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3f40: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
3f50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3f60: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
3f70: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  }.  db close.  t
3f80: 73 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b  stvfs delete.} {
3f90: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6f  }..foreach {tn o
3fa0: 66 73 74 20 76 61 6c 75 65 20 72 65 73 75 6c 74  fst value result
3fb0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 32 20  } {.          2 
3fc0: 20 20 32 30 20 20 20 20 33 31 20 20 20 20 20 20    20    31      
3fd0: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20   {1 2 3 4}.     
3fe0: 20 20 20 20 20 33 20 20 20 32 30 20 20 20 20 33       3   20    3
3ff0: 32 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  2       {1 2 3 4
4000: 7d 0a 20 20 20 20 20 20 20 20 20 20 34 20 20 20  }.          4   
4010: 32 30 20 20 20 20 33 33 20 20 20 20 20 20 20 7b  20    33       {
4020: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4030: 20 20 20 35 20 20 20 32 30 20 20 20 20 36 35 35     5   20    655
4040: 33 36 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  36    {1 2 3 4}.
4050: 20 20 20 20 20 20 20 20 20 20 36 20 20 20 32 30            6   20
4060: 20 20 20 20 31 33 31 30 37 32 20 20 20 7b 31 20      131072   {1 
4070: 32 20 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20  2 3 4}..        
4080: 20 20 37 20 20 20 32 34 20 20 20 20 35 31 31 20    7   24    511 
4090: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20       {1 2 3 4}. 
40a0: 20 20 20 20 20 20 20 20 20 38 20 20 20 32 34 20           8   24 
40b0: 20 20 20 35 31 33 20 20 20 20 20 20 7b 31 20 32     513      {1 2
40c0: 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20   3 4}.          
40d0: 39 20 20 20 32 34 20 20 20 20 31 33 31 30 37 32  9   24    131072
40e0: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20     {1 2 3 4}..  
40f0: 20 20 20 20 20 20 20 31 30 20 20 20 33 32 20 20         10   32  
4100: 20 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 7d    65536    {1 2}
4110: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  .} {.  do_test p
4120: 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e 20 7b 0a  ager1.4.3.$tn {.
4130: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
4140: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
4150: 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20      hexio_write 
4160: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
4170: 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74 20 25 2e  $ofst [format %.
4180: 38 78 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 65  8x $value].    e
4190: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
41a0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
41b0: 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20 63 6c 6f  $result.}.db clo
41c0: 73 65 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56  se..# Set up a V
41d0: 46 53 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  FS that snapshot
41e0: 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
41f0: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 61 20  m just before a 
4200: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 23  master journal.#
4210: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
4220: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75 6c   to commit a mul
4230: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
4240: 69 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c 6c  ion. Specificall
4250: 79 2c 20 74 68 65 0a 23 20 66 69 6c 65 2d 73 79  y, the.# file-sy
4260: 73 74 65 6d 20 69 73 20 73 61 76 65 64 20 6a 75  stem is saved ju
4270: 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 78 44  st before the xD
4280: 65 6c 65 74 65 28 29 20 63 61 6c 6c 20 74 6f 20  elete() call to 
4290: 72 65 6d 6f 76 65 20 74 68 65 20 0a 23 20 6d 61  remove the .# ma
42a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
42b0: 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d  e from the file-
42c0: 73 79 73 74 65 6d 2e 0a 23 0a 74 65 73 74 76 66  system..#.testvf
42d0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
42e0: 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f  tv script copy_o
42f0: 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73 65 74 20  n_mj_delete.set 
4300: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65  ::mj_filename_le
4310: 6e 67 74 68 20 30 0a 70 72 6f 63 20 63 6f 70 79  ngth 0.proc copy
4320: 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d  _on_mj_delete {m
4330: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
4340: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
4350: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20  ring match *mj* 
4360: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
4370: 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73  name]]} { .    s
4380: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
4390: 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67 20  _length [string 
43a0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65  length $filename
43b0: 5d 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73  ].    faultsim_s
43c0: 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave .  }.  retur
43d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 73  n SQLITE_OK.}..s
43e0: 65 74 20 70 77 64 20 5b 70 77 64 5d 0a 69 66 20  et pwd [pwd].if 
43f0: 7b 21 5b 66 6f 72 63 65 64 5f 70 72 6f 78 79 5f  {![forced_proxy_
4400: 6c 6f 63 6b 69 6e 67 5d 7d 20 7b 0a 20 20 23 20  locking]} {.  # 
4410: 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 75 73  proxy locking us
4420: 65 73 20 63 61 6e 27 74 20 64 65 61 6c 20 77 69  es can't deal wi
4430: 74 68 20 61 75 74 6f 20 70 72 6f 78 79 20 66 69  th auto proxy fi
4440: 6c 65 20 70 61 74 68 73 20 6c 6f 6e 67 65 72 20  le paths longer 
4450: 74 68 61 6e 20 4d 41 58 50 41 54 48 4c 45 4e 0a  than MAXPATHLEN.
4460: 66 6f 72 65 61 63 68 20 7b 74 6e 31 20 74 63 6c  foreach {tn1 tcl
4470: 7d 20 7b 0a 20 20 31 20 7b 20 73 65 74 20 70 72  } {.  1 { set pr
4480: 65 66 69 78 20 22 74 65 73 74 2e 64 62 22 20 7d  efix "test.db" }
4490: 0a 20 20 32 20 7b 20 0a 20 20 20 20 23 20 54 68  .  2 { .    # Th
44a0: 69 73 20 74 65 73 74 20 64 65 70 65 6e 64 73 20  is test depends 
44b0: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  on the underlyin
44c0: 67 20 56 46 53 20 62 65 69 6e 67 20 61 62 6c 65  g VFS being able
44d0: 20 74 6f 20 6f 70 65 6e 20 70 61 74 68 73 0a 20   to open paths. 
44e0: 20 20 20 23 20 35 31 32 20 62 79 74 65 73 20 69     # 512 bytes i
44f0: 6e 20 6c 65 6e 67 74 68 2e 20 54 68 65 20 69 64  n length. The id
4500: 65 61 20 69 73 20 74 6f 20 63 72 65 61 74 65 20  ea is to create 
4510: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
4520: 6c 65 20 74 68 61 74 0a 20 20 20 20 23 20 63 6f  le that.    # co
4530: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
4540: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
4550: 73 6f 20 6c 61 72 67 65 20 74 68 61 74 20 69 74  so large that it
4560: 20 63 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 20   could contain. 
4570: 20 20 20 23 20 61 20 76 61 6c 69 64 20 70 61 67     # a valid pag
4580: 65 20 72 65 63 6f 72 64 20 28 69 66 20 74 68 65  e record (if the
4590: 20 66 69 6c 65 20 70 61 67 65 2d 73 69 7a 65 20   file page-size 
45a0: 69 73 20 35 31 32 20 62 79 74 65 73 29 2e 20 53  is 512 bytes). S
45b0: 6f 20 61 73 20 74 6f 0a 20 20 20 20 23 20 6d 61  o as to.    # ma
45c0: 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65 20 64  ke sure SQLite d
45d0: 6f 65 73 6e 27 74 20 67 65 74 20 63 6f 6e 66 75  oesn't get confu
45e0: 73 65 64 20 62 79 20 74 68 69 73 2e 0a 20 20 20  sed by this..   
45f0: 20 23 0a 20 20 20 20 73 65 74 20 6e 50 61 64 64   #.    set nPadd
4600: 69 6e 67 20 5b 65 78 70 72 20 35 31 31 20 2d 20  ing [expr 511 - 
4610: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c  $::mj_filename_l
4620: 65 6e 67 74 68 5d 0a 20 20 20 20 69 66 20 7b 24  ength].    if {$
4630: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
4640: 74 66 6f 72 6d 29 3d 3d 22 77 69 6e 64 6f 77 73  tform)=="windows
4650: 22 7d 20 7b 0a 20 20 20 20 20 20 23 20 54 42 44  "} {.      # TBD
4660: 20 6e 65 65 64 20 74 6f 20 66 69 67 75 72 65 20   need to figure 
4670: 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 74 68  out how to do th
4680: 69 73 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72  is correctly for
4690: 20 57 69 6e 64 6f 77 73 21 21 21 0a 20 20 20 20   Windows!!!.    
46a0: 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67 20 5b    set nPadding [
46b0: 65 78 70 72 20 32 35 35 20 2d 20 24 3a 3a 6d 6a  expr 255 - $::mj
46c0: 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68  _filename_length
46d0: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 57  ].    }..    # W
46e0: 65 20 63 61 6e 6e 6f 74 20 6a 75 73 74 20 63 72  e cannot just cr
46f0: 65 61 74 65 20 61 20 72 65 61 6c 6c 79 20 6c 6f  eate a really lo
4700: 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
4710: 20 6e 61 6d 65 20 74 6f 20 6f 70 65 6e 2c 20 61   name to open, a
4720: 73 0a 20 20 20 20 23 20 4c 69 6e 75 78 20 6c 69  s.    # Linux li
4730: 6d 69 74 73 20 61 20 73 69 6e 67 6c 65 20 63 6f  mits a single co
4740: 6d 70 6f 6e 65 6e 74 20 6f 66 20 61 20 70 61 74  mponent of a pat
4750: 68 20 74 6f 20 32 35 35 20 62 79 74 65 73 20 62  h to 255 bytes b
4760: 79 20 64 65 66 61 75 6c 74 0a 20 20 20 20 23 20  y default.    # 
4770: 28 61 6e 64 20 70 72 65 73 75 6d 61 62 6c 79 20  (and presumably 
4780: 6f 74 68 65 72 20 73 79 73 74 65 6d 73 20 68 61  other systems ha
4790: 76 65 20 6c 69 6d 69 74 73 20 74 6f 6f 29 2e 20  ve limits too). 
47a0: 53 6f 20 63 72 65 61 74 65 20 61 20 64 69 72 65  So create a dire
47b0: 63 74 6f 72 79 0a 20 20 20 20 23 20 68 69 65 72  ctory.    # hier
47c0: 61 72 63 68 79 20 74 6f 20 77 6f 72 6b 20 69 6e  archy to work in
47d0: 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20  ..    #.    set 
47e0: 64 69 72 6e 61 6d 65 20 22 64 31 32 33 34 35 36  dirname "d123456
47f0: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
4800: 33 34 35 36 37 38 39 30 2f 22 0a 20 20 20 20 73  34567890/".    s
4810: 65 74 20 6e 44 69 72 20 5b 65 78 70 72 20 24 6e  et nDir [expr $n
4820: 50 61 64 64 69 6e 67 20 2f 20 33 32 5d 0a 20 20  Padding / 32].  
4830: 20 20 69 66 20 7b 20 24 6e 44 69 72 20 7d 20 7b    if { $nDir } {
4840: 0a 20 20 20 20 20 20 73 65 74 20 70 20 5b 73 74  .      set p [st
4850: 72 69 6e 67 20 72 65 70 65 61 74 20 24 64 69 72  ring repeat $dir
4860: 6e 61 6d 65 20 24 6e 44 69 72 5d 0a 20 20 20 20  name $nDir].    
4870: 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 70 0a    file mkdir $p.
4880: 20 20 20 20 20 20 63 64 20 24 70 0a 20 20 20 20        cd $p.    
4890: 7d 0a 0a 20 20 20 20 73 65 74 20 70 61 64 64 69  }..    set paddi
48a0: 6e 67 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61  ng [string repea
48b0: 74 20 78 20 5b 65 78 70 72 20 24 6e 50 61 64 64  t x [expr $nPadd
48c0: 69 6e 67 20 25 33 32 5d 5d 0a 20 20 20 20 73 65  ing %32]].    se
48d0: 74 20 70 72 65 66 69 78 20 22 74 65 73 74 2e 64  t prefix "test.d
48e0: 62 24 7b 70 61 64 64 69 6e 67 7d 22 0a 20 20 7d  b${padding}".  }
48f0: 0a 7d 20 7b 0a 20 20 65 76 61 6c 20 24 74 63 6c  .} {.  eval $tcl
4900: 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 32 20  .  foreach {tn2 
4910: 73 71 6c 7d 20 7b 0a 20 20 20 20 6f 20 7b 20 0a  sql} {.    o { .
4920: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69        PRAGMA mai
4930: 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46  n.synchronous=OF
4940: 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  F;.      PRAGMA 
4950: 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  aux.synchronous=
4960: 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  OFF;.      PRAGM
4970: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
4980: 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20   DELETE;.    }. 
4990: 20 20 20 6f 35 31 32 20 7b 20 0a 20 20 20 20 20     o512 { .     
49a0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e   PRAGMA main.syn
49b0: 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20  chronous=OFF;.  
49c0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
49d0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a  ynchronous=OFF;.
49e0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69        PRAGMA mai
49f0: 6e 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31  n.page_size = 51
4a00: 32 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  2;.      PRAGMA 
4a10: 61 75 78 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20  aux.page_size = 
4a20: 35 31 32 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  512;.      PRAGM
4a30: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
4a40: 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20   DELETE;.    }. 
4a50: 20 20 20 6e 20 7b 20 0a 20 20 20 20 20 20 50 52     n { .      PR
4a60: 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72  AGMA main.synchr
4a70: 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20  onous=NORMAL;.  
4a80: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
4a90: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
4aa0: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
4ab0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
4ac0: 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20  ELETE;.    }.   
4ad0: 20 66 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47   f { .      PRAG
4ae0: 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e  MA main.synchron
4af0: 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ous=FULL;.      
4b00: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
4b10: 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20 20  ronous=FULL;.   
4b20: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
4b30: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
4b40: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20  .    }.  } {..  
4b50: 20 20 73 65 74 20 74 6e 20 22 24 7b 74 6e 31 7d    set tn "${tn1}
4b60: 2e 24 7b 74 6e 32 7d 22 0a 20 20 0a 20 20 20 20  .${tn2}".  .    
4b70: 23 20 53 65 74 20 75 70 20 61 20 63 6f 6e 6e 65  # Set up a conne
4b80: 63 74 69 6f 6e 20 74 6f 20 68 61 76 65 20 74 77  ction to have tw
4b90: 6f 20 64 61 74 61 62 61 73 65 73 2c 20 74 65 73  o databases, tes
4ba0: 74 2e 64 62 20 28 6d 61 69 6e 29 20 61 6e 64 20  t.db (main) and 
4bb0: 0a 20 20 20 20 23 20 74 65 73 74 2e 64 62 32 20  .    # test.db2 
4bc0: 28 61 75 78 29 2e 20 54 68 65 6e 20 72 75 6e 20  (aux). Then run 
4bd0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
4be0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 6d  nsaction on them
4bf0: 2e 20 54 68 65 0a 20 20 20 20 23 20 56 46 53 20  . The.    # VFS 
4c00: 77 69 6c 6c 20 73 6e 61 70 73 68 6f 74 20 74 68  will snapshot th
4c10: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75  e file-system ju
4c20: 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 6d 61  st before the ma
4c30: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  ster-journal.   
4c40: 20 23 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74   # file is delet
4c50: 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ed to commit the
4c60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
4c70: 20 20 23 0a 20 20 20 20 74 76 20 66 69 6c 74 65    #.    tv filte
4c80: 72 20 78 44 65 6c 65 74 65 0a 20 20 20 20 64 6f  r xDelete.    do
4c90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
4ca0: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 66  .$tn.1 {.      f
4cb0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
4cc0: 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 65 66 69  nd_reopen $prefi
4cd0: 78 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  x.      execsql 
4ce0: 22 0a 20 20 20 20 20 20 20 20 41 54 54 41 43 48  ".        ATTACH
4cf0: 20 27 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53   '${prefix}2' AS
4d00: 20 61 75 78 3b 0a 20 20 20 20 20 20 20 20 24 73   aux;.        $s
4d10: 71 6c 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  ql.        CREAT
4d20: 45 20 54 41 42 4c 45 20 61 28 78 29 3b 0a 20 20  E TABLE a(x);.  
4d30: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
4d40: 4c 45 20 61 75 78 2e 62 28 78 29 3b 0a 20 20 20  LE aux.b(x);.   
4d50: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4d60: 20 61 20 56 41 4c 55 45 53 28 27 64 6f 75 62 6c   a VALUES('doubl
4d70: 65 2d 79 6f 75 27 29 3b 0a 20 20 20 20 20 20 20  e-you');.       
4d80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56   INSERT INTO a V
4d90: 41 4c 55 45 53 28 27 77 68 79 27 29 3b 0a 20 20  ALUES('why');.  
4da0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4db0: 4f 20 61 20 56 41 4c 55 45 53 28 27 7a 65 64 27  O a VALUES('zed'
4dc0: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
4dd0: 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28  T INTO b VALUES(
4de0: 27 77 6f 6e 27 29 3b 0a 20 20 20 20 20 20 20 20  'won');.        
4df0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41  INSERT INTO b VA
4e00: 4c 55 45 53 28 27 74 6f 6f 27 29 3b 0a 20 20 20  LUES('too');.   
4e10: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4e20: 20 62 20 56 41 4c 55 45 53 28 27 66 72 65 65 27   b VALUES('free'
4e30: 29 3b 0a 20 20 20 20 20 20 22 0a 20 20 20 20 20  );.      ".     
4e40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
4e50: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
4e60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4e70: 61 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  a SELECT * FROM 
4e80: 62 20 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33  b WHERE rowid<=3
4e90: 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45  ;.          INSE
4ea0: 52 54 20 49 4e 54 4f 20 62 20 53 45 4c 45 43 54  RT INTO b SELECT
4eb0: 20 2a 20 46 52 4f 4d 20 61 20 57 48 45 52 45 20   * FROM a WHERE 
4ec0: 72 6f 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20  rowid<=3;.      
4ed0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20    COMMIT;.      
4ee0: 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 74  }.    } {}.    t
4ef0: 76 20 66 69 6c 74 65 72 20 7b 7d 0a 20 20 20 20  v filter {}.    
4f00: 0a 20 20 20 20 23 20 43 68 65 63 6b 20 74 68 61  .    # Check tha
4f10: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
4f20: 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 20  n was committed 
4f30: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 20 20  successfully..  
4f40: 20 20 23 0a 20 20 20 20 64 6f 5f 65 78 65 63 73    #.    do_execs
4f50: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  ql_test pager1-4
4f60: 2e 34 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20  .4.$tn.2 {.     
4f70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
4f80: 0a 20 20 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79  .    } {double-y
4f90: 6f 75 20 77 68 79 20 7a 65 64 20 77 6f 6e 20 74  ou why zed won t
4fa0: 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f  oo free}.    do_
4fb0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
4fc0: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a  er1-4.4.$tn.3 {.
4fd0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
4fe0: 52 4f 4d 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e  ROM b.    } {won
4ff0: 20 74 6f 6f 20 66 72 65 65 20 64 6f 75 62 6c 65   too free double
5000: 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20  -you why zed}.  
5010: 20 20 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65    .    # Restore
5020: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5030: 20 61 6e 64 20 72 65 6f 70 65 6e 20 74 68 65 20   and reopen the 
5040: 64 61 74 61 62 61 73 65 73 2e 20 43 68 65 63 6b  databases. Check
5050: 20 74 68 61 74 20 69 74 20 6e 6f 77 0a 20 20 20   that it now.   
5060: 20 23 20 61 70 70 65 61 72 73 20 74 68 61 74 20   # appears that 
5070: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5080: 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  was not committe
5090: 64 20 28 62 65 63 61 75 73 65 20 74 68 65 20 66  d (because the f
50a0: 69 6c 65 2d 73 79 73 74 65 6d 0a 20 20 20 20 23  ile-system.    #
50b0: 20 77 61 73 20 72 65 73 74 6f 72 65 64 20 74 6f   was restored to
50c0: 20 74 68 65 20 73 74 61 74 65 20 77 68 65 72 65   the state where
50d0: 20 69 74 20 68 61 64 20 6e 6f 74 20 62 65 65 6e   it had not been
50e0: 29 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f  )..    #.    do_
50f0: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
5100: 24 74 6e 2e 34 20 7b 0a 20 20 20 20 20 20 66 61  $tn.4 {.      fa
5110: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5120: 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 65 66 69  nd_reopen $prefi
5130: 78 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  x.      execsql 
5140: 22 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69  "ATTACH '${prefi
5150: 78 7d 32 27 20 41 53 20 61 75 78 22 0a 20 20 20  x}2' AS aux".   
5160: 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f 65 78 65   } {}.    do_exe
5170: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
5180: 2d 34 2e 34 2e 24 74 6e 2e 35 20 7b 53 45 4c 45  -4.4.$tn.5 {SELE
5190: 43 54 20 2a 20 46 52 4f 4d 20 61 7d 20 7b 64 6f  CT * FROM a} {do
51a0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
51b0: 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c  }.    do_execsql
51c0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
51d0: 2e 24 74 6e 2e 36 20 7b 53 45 4c 45 43 54 20 2a  .$tn.6 {SELECT *
51e0: 20 46 52 4f 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f   FROM b} {won to
51f0: 6f 20 66 72 65 65 7d 0a 20 20 20 20 0a 20 20 20  o free}.    .   
5200: 20 23 20 52 65 73 74 6f 72 65 20 74 68 65 20 66   # Restore the f
5210: 69 6c 65 2d 73 79 73 74 65 6d 20 61 67 61 69 6e  ile-system again
5220: 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 62 65 66  . This time, bef
5230: 6f 72 65 20 72 65 6f 70 65 6e 69 6e 67 20 74 68  ore reopening th
5240: 65 20 64 61 74 61 62 61 73 65 73 2c 0a 20 20 20  e databases,.   
5250: 20 23 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61   # delete the ma
5260: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
5270: 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d  e from the file-
5280: 73 79 73 74 65 6d 2e 20 49 74 20 6e 6f 77 20 61  system. It now a
5290: 70 70 65 61 72 73 20 74 68 61 74 0a 20 20 20 20  ppears that.    
52a0: 23 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  # the transactio
52b0: 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 20  n was committed 
52c0: 28 6e 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  (no master-journ
52d0: 61 6c 20 66 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f  al file == no ro
52e0: 6c 6c 62 61 63 6b 29 2e 0a 20 20 20 20 23 0a 20  llback)..    #. 
52f0: 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72     do_test pager
5300: 31 2d 34 2e 34 2e 24 74 6e 2e 37 20 7b 0a 20 20  1-4.4.$tn.7 {.  
5310: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
5320: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20  tore_and_reopen 
5330: 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 66 6f  $prefix.      fo
5340: 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 24 7b  reach f [glob ${
5350: 70 72 65 66 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66  prefix}-mj*] { f
5360: 6f 72 63 65 64 65 6c 65 74 65 20 24 66 20 7d 0a  orcedelete $f }.
5370: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 41        execsql "A
5380: 54 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d  TTACH '${prefix}
5390: 32 27 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d  2' AS aux".    }
53a0: 20 7b 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73   {}.    do_execs
53b0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  ql_test pager1-4
53c0: 2e 34 2e 24 74 6e 2e 38 20 7b 0a 20 20 20 20 20  .4.$tn.8 {.     
53d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
53e0: 0a 20 20 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79  .    } {double-y
53f0: 6f 75 20 77 68 79 20 7a 65 64 20 77 6f 6e 20 74  ou why zed won t
5400: 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f  oo free}.    do_
5410: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
5420: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 39 20 7b 0a  er1-4.4.$tn.9 {.
5430: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
5440: 52 4f 4d 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e  ROM b.    } {won
5450: 20 74 6f 6f 20 66 72 65 65 20 64 6f 75 62 6c 65   too free double
5460: 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20  -you why zed}.  
5470: 7d 0a 0a 20 20 63 64 20 24 70 77 64 0a 7d 0a 64  }..  cd $pwd.}.d
5480: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
5490: 65 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 24 64  e.forcedelete $d
54a0: 69 72 6e 61 6d 65 0a 7d 0a 0a 0a 23 20 53 65 74  irname.}...# Set
54b0: 20 75 70 20 61 20 56 46 53 20 74 6f 20 6d 61 6b   up a VFS to mak
54c0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
54d0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
54e0: 20 62 65 66 6f 72 65 20 64 65 6c 65 74 69 6e 67   before deleting
54f0: 20 61 0a 23 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   a.# journal fil
5500: 65 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72  e to commit a tr
5510: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 74  ansaction. The t
5520: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 6f 64 69 66  ransaction modif
5530: 69 65 73 20 65 78 61 63 74 6c 79 0a 23 20 74 77  ies exactly.# tw
5540: 6f 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  o database pages
5550: 20 28 61 6e 64 20 70 61 67 65 20 31 20 2d 20 74   (and page 1 - t
5560: 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
5570: 72 29 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  r)..#.testvfs tv
5580: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
5590: 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76  ectorsize 512.tv
55a0: 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f   script copy_on_
55b0: 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74  journal_delete.t
55c0: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
55d0: 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f  .proc copy_on_jo
55e0: 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65  urnal_delete {me
55f0: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
5600: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
5610: 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e  ing match *journ
5620: 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66  al $filename]} f
5630: 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20  aultsim_save .  
5640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5650: 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .}.faultsim_dele
5660: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  te_and_reopen.do
5670: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5680: 67 65 72 31 2e 34 2e 35 2e 31 20 7b 0a 20 20 50  ger1.4.5.1 {.  P
5690: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
56a0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 50  de = DELETE;.  P
56b0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
56c0: 3d 20 31 30 32 34 3b 0a 20 20 43 52 45 41 54 45  = 1024;.  CREATE
56d0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
56e0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
56f0: 74 32 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45  t2(a, b);.  INSE
5700: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5710: 53 28 27 49 27 2c 20 27 49 49 27 29 3b 0a 20 20  S('I', 'II');.  
5720: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
5730: 41 4c 55 45 53 28 27 49 49 49 27 2c 20 27 49 56  ALUES('III', 'IV
5740: 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  ');.  BEGIN;.   
5750: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5760: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
5770: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
5780: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
5790: 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65 6c 65   COMMIT;.} {dele
57a0: 74 65 7d 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d  te}.tv filter {}
57b0: 0a 0a 23 20 43 68 65 63 6b 20 74 68 65 20 74 72  ..# Check the tr
57c0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
57d0: 6d 6d 69 74 74 65 64 3a 0a 23 0a 64 6f 5f 65 78  mmitted:.#.do_ex
57e0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
57f0: 31 2e 34 2e 35 2e 32 20 7b 0a 20 20 53 45 4c 45  1.4.5.2 {.  SELE
5800: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
5810: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
5820: 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 20 49 49  ;.} {I II 1 2 II
5830: 49 20 49 56 20 33 20 34 7d 0a 0a 23 20 4e 6f 77  I IV 3 4}..# Now
5840: 20 74 72 79 20 66 6f 75 72 20 74 65 73 74 73 3a   try four tests:
5850: 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35  .#.#  pager1-4.5
5860: 2e 33 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .3: Restore the 
5870: 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 68 65  file-system. Che
5880: 63 6b 20 74 68 61 74 20 74 68 65 20 77 68 6f 6c  ck that the whol
5890: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 23  e transaction .#
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
58c0: 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e  #.#  pager1-4.5.
58d0: 34 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20 66  4: Restore the f
58e0: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f 72 72  ile-system. Corr
58f0: 75 70 74 20 74 68 65 20 66 69 72 73 74 20 72 65  upt the first re
5900: 63 6f 72 64 20 69 6e 20 74 68 65 0a 23 20 20 20  cord in the.#   
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
5920: 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74 68 65 20  rnal. Check the 
5930: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
5940: 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  ot rolled back..
5950: 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e  #.#  pager1-4.5.
5960: 35 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20 66  5: Restore the f
5970: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f 72 72  ile-system. Corr
5980: 75 70 74 20 74 68 65 20 73 65 63 6f 6e 64 20 72  upt the second r
5990: 65 63 6f 72 64 20 69 6e 20 74 68 65 0a 23 20 20  ecord in the.#  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
59b0: 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74 68 61  urnal. Check tha
59c0: 74 20 74 68 65 20 66 69 72 73 74 20 72 65 63 6f  t the first reco
59d0: 72 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  rd in the transa
59e0: 63 74 69 6f 6e 20 69 73 20 0a 23 20 20 20 20 20  ction is .#     
59f0: 20 20 20 20 20 20 20 20 20 20 20 70 6c 61 79 65             playe
5a00: 64 20 62 61 63 6b 2c 20 62 75 74 20 6e 6f 74 20  d back, but not 
5a10: 74 68 65 20 73 65 63 6f 6e 64 2e 0a 23 0a 23 20  the second..#.# 
5a20: 20 70 61 67 65 72 31 2d 34 2e 35 2e 36 3a 20 52   pager1-4.5.6: R
5a30: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5a40: 73 79 73 74 65 6d 2e 20 54 72 79 20 74 6f 20 6f  system. Try to o
5a50: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
5a60: 20 77 69 74 68 20 61 0a 23 20 20 20 20 20 20 20   with a.#       
5a70: 20 20 20 20 20 20 20 20 20 72 65 61 64 6f 6e 6c           readonl
5a80: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68  y connection. Th
5a90: 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2c 20  is should fail, 
5aa0: 61 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 0a 23  as a read-only.#
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ac0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 6e 6f  connection canno
5ad0: 74 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  t roll back the 
5ae0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23  database file..#
5af0: 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72  .faultsim_restor
5b00: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f  e_and_reopen.do_
5b10: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
5b20: 65 72 31 2e 34 2e 35 2e 33 20 7b 0a 20 20 53 45  er1.4.5.3 {.  SE
5b30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
5b40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5b50: 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49 49 49 20  t2;.} {I II III 
5b60: 49 56 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  IV}.faultsim_res
5b70: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
5b80: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
5b90: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70  .db-journal [exp
5ba0: 72 20 35 31 32 2b 34 2b 31 30 32 34 20 2d 20 32  r 512+4+1024 - 2
5bb0: 30 32 5d 20 30 31 32 33 34 35 36 37 38 39 41 42  02] 0123456789AB
5bc0: 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  CDEF.do_execsql_
5bd0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
5be0: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  4 {.  SELECT * F
5bf0: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
5c00: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49   * FROM t2;.} {I
5c10: 20 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33   II 1 2 III IV 3
5c20: 20 34 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73   4}.faultsim_res
5c30: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
5c40: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
5c50: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70  .db-journal [exp
5c60: 72 20 35 31 32 2b 34 2b 31 30 32 34 2b 34 2b 34  r 512+4+1024+4+4
5c70: 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32  +1024 - 202] 012
5c80: 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f  3456789ABCDEF.do
5c90: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5ca0: 67 65 72 31 2e 34 2e 35 2e 35 20 7b 0a 20 20 53  ger1.4.5.5 {.  S
5cb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
5cc0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5cd0: 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49 49 49   t2;.} {I II III
5ce0: 20 49 56 20 33 20 34 7d 0a 0a 66 61 75 6c 74 73   IV 3 4}..faults
5cf0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5d00: 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65 0a 73  eopen.db close.s
5d10: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
5d20: 62 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a 64 6f  b -readonly 1.do
5d30: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
5d40: 61 67 65 72 31 2e 34 2e 35 2e 36 20 7b 0a 20 20  ager1.4.5.6 {.  
5d50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5d60: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5d70: 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b 64 69 73 6b  M t2;.} {1 {disk
5d80: 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 64 62 20   I/O error}}.db 
5d90: 63 6c 6f 73 65 0a 0a 23 20 53 6e 61 70 73 68 6f  close..# Snapsho
5da0: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
5db0: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 6d 75  m just before mu
5dc0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 2e  lti-file commit.
5dd0: 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65 0a 23   Save the name.#
5de0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
5df0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 24  ournal file in $
5e00: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 0a 23  ::mj_filename..#
5e10: 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f  .tv script copy_
5e20: 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 74 76 20  on_mj_delete.tv 
5e30: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70  filter xDelete.p
5e40: 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64  roc copy_on_mj_d
5e50: 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69  elete {method fi
5e60: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
5e70: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
5e80: 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61  ch *mj* [file ta
5e90: 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20  il $filename]]} 
5ea0: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f  { .    set ::mj_
5eb0: 66 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65 6e 61  filename $filena
5ec0: 6d 65 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f  me.    faultsim_
5ed0: 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75  save .  }.  retu
5ee0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 64  rn SQLITE_OK.}.d
5ef0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
5f00: 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  6.1 {.  faultsim
5f10: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
5f20: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
5f30: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
5f40: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
5f50: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
5f60: 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20  t.db2' AS two;. 
5f70: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5f80: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
5f90: 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f 2e 74  EATE TABLE two.t
5fa0: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  2(a, b);.    INS
5fb0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5fc0: 45 53 28 31 2c 20 27 74 31 2e 31 27 29 3b 0a 20  ES(1, 't1.1');. 
5fd0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5fe0: 32 20 56 41 4c 55 45 53 28 31 2c 20 27 74 32 2e  2 VALUES(1, 't2.
5ff0: 31 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  1');.    BEGIN;.
6000: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
6010: 53 45 54 20 62 20 3d 20 27 74 31 2e 32 27 3b 0a  SET b = 't1.2';.
6020: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 32 20        UPDATE t2 
6030: 53 45 54 20 62 20 3d 20 27 74 32 2e 32 27 3b 0a  SET b = 't2.2';.
6040: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
6050: 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 20    tv filter {}. 
6060: 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a   db close.} {}..
6070: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
6080: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65  _and_reopen.do_e
6090: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
60a0: 72 31 2e 34 2e 36 2e 32 20 7b 20 53 45 4c 45 43  r1.4.6.2 { SELEC
60b0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20  T * FROM t1 }   
60c0: 20 20 20 20 20 20 20 20 7b 31 20 74 31 2e 31 7d          {1 t1.1}
60d0: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
60e0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 33 20 7b 20   pager1.4.6.3 { 
60f0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6100: 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b 31 7d  j_filename } {1}
6110: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6120: 20 70 61 67 65 72 31 2e 34 2e 36 2e 34 20 7b 0a   pager1.4.6.4 {.
6130: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
6140: 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 53 45  b2' AS two;.  SE
6150: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
6160: 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65  } {1 t2.1}.do_te
6170: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 35 20  st pager1.4.6.5 
6180: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
6190: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b  :mj_filename } {
61a0: 30 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  0}..faultsim_res
61b0: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
61c0: 64 62 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  db close.do_test
61d0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 38 20 7b 0a   pager1.4.6.8 {.
61e0: 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e    set ::mj_filen
61f0: 61 6d 65 31 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  ame1 $::mj_filen
6200: 61 6d 65 0a 20 20 74 76 20 66 69 6c 74 65 72 20  ame.  tv filter 
6210: 78 44 65 6c 65 74 65 0a 20 20 73 71 6c 69 74 65  xDelete.  sqlite
6220: 33 20 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20  3 db test.db2.  
6230: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
6240: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
6250: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20  e = DELETE;.    
6260: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 33  ATTACH 'test.db3
6270: 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20 20 20  ' AS three;.    
6280: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 68 72  CREATE TABLE thr
6290: 65 65 2e 74 33 28 61 2c 20 62 29 3b 0a 20 20 20  ee.t3(a, b);.   
62a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
62b0: 56 41 4c 55 45 53 28 31 2c 20 27 74 33 2e 31 27  VALUES(1, 't3.1'
62c0: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
62d0: 20 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45      UPDATE t2 SE
62e0: 54 20 62 20 3d 20 27 74 32 2e 33 27 3b 0a 20 20  T b = 't2.3';.  
62f0: 20 20 20 20 55 50 44 41 54 45 20 74 33 20 53 45      UPDATE t3 SE
6300: 54 20 62 20 3d 20 27 74 33 2e 33 27 3b 0a 20 20  T b = 't3.3';.  
6310: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
6320: 65 78 70 72 20 7b 24 3a 3a 6d 6a 5f 66 69 6c 65  expr {$::mj_file
6330: 6e 61 6d 65 31 20 21 3d 20 24 3a 3a 6d 6a 5f 66  name1 != $::mj_f
6340: 69 6c 65 6e 61 6d 65 7d 0a 7d 20 7b 31 7d 0a 66  ilename}.} {1}.f
6350: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
6360: 61 6e 64 5f 72 65 6f 70 65 6e 0a 74 76 20 66 69  and_reopen.tv fi
6370: 6c 74 65 72 20 7b 7d 0a 0a 23 20 54 68 65 20 66  lter {}..# The f
6380: 69 6c 65 2d 73 79 73 74 65 6d 20 6e 6f 77 20 63  ile-system now c
6390: 6f 6e 74 61 69 6e 73 3a 0a 23 0a 23 20 20 20 2a  ontains:.#.#   *
63a0: 20 74 68 72 65 65 20 64 61 74 61 62 61 73 65 73   three databases
63b0: 0a 23 20 20 20 2a 20 74 68 72 65 65 20 68 6f 74  .#   * three hot
63c0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 23  -journal files.#
63d0: 20 20 20 2a 20 74 77 6f 20 6d 61 73 74 65 72 2d     * two master-
63e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23  journal files..#
63f0: 0a 23 20 54 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  .# The hot-journ
6400: 61 6c 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  als associated w
6410: 69 74 68 20 74 65 73 74 2e 64 62 32 20 61 6e 64  ith test.db2 and
6420: 20 74 65 73 74 2e 64 62 33 20 70 6f 69 6e 74 20   test.db3 point 
6430: 74 6f 0a 23 20 6d 61 73 74 65 72 20 6a 6f 75 72  to.# master jour
6440: 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  nal $::mj_filena
6450: 6d 65 2e 20 54 68 65 20 68 6f 74 2d 6a 6f 75 72  me. The hot-jour
6460: 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  nal file associa
6470: 74 65 64 20 77 69 74 68 0a 23 20 74 65 73 74 2e  ted with.# test.
6480: 64 62 20 70 6f 69 6e 74 73 20 74 6f 20 6d 61 73  db points to mas
6490: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d  ter journal $::m
64a0: 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 20 53 6f 20  j_filename1. So 
64b0: 72 65 61 64 69 6e 67 20 66 72 6f 6d 0a 23 20 74  reading from.# t
64c0: 65 73 74 2e 64 62 20 73 68 6f 75 6c 64 20 64 65  est.db should de
64d0: 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  lete $::mj_filen
64e0: 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ame1..#.do_test 
64f0: 70 61 67 65 72 31 2e 34 2e 36 2e 39 20 7b 0a 20  pager1.4.6.9 {. 
6500: 20 6c 73 6f 72 74 20 5b 67 6c 6f 62 20 74 65 73   lsort [glob tes
6510: 74 2e 64 62 2a 5d 0a 7d 20 5b 6c 73 6f 72 74 20  t.db*].} [lsort 
6520: 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  [list           
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 5c 0a 20 20 74 65 73 74 2e 64 62 20 74 65 73 74  \.  test.db test
6560: 2e 64 62 32 20 74 65 73 74 2e 64 62 33 20 20 20  .db2 test.db3   
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74             \.  t
6590: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74  est.db-journal t
65a0: 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20  est.db2-journal 
65b0: 74 65 73 74 2e 64 62 33 2d 6a 6f 75 72 6e 61 6c  test.db3-journal
65c0: 20 20 20 20 20 20 5c 0a 20 20 5b 66 69 6c 65 20        \.  [file 
65d0: 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  tail $::mj_filen
65e0: 61 6d 65 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20  ame] [file tail 
65f0: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 5d  $::mj_filename1]
6600: 0a 5d 5d 0a 0a 23 20 54 68 65 20 6d 61 73 74 65  .]]..# The maste
6610: 72 2d 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f  r-journal $::mj_
6620: 66 69 6c 65 6e 61 6d 65 31 20 63 6f 6e 74 61 69  filename1 contai
6630: 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  ns pointers to t
6640: 65 73 74 2e 64 62 20 61 6e 64 20 0a 23 20 74 65  est.db and .# te
6650: 73 74 2e 64 62 32 2e 20 48 6f 77 65 76 65 72 20  st.db2. However 
6660: 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
6670: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6680: 74 65 73 74 2e 64 62 32 20 70 6f 69 6e 74 73 20  test.db2 points 
6690: 74 6f 0a 23 20 61 20 64 69 66 66 65 72 65 6e 74  to.# a different
66a0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
66b0: 20 54 68 65 72 65 66 6f 72 65 2c 20 72 65 61 64   Therefore, read
66c0: 69 6e 67 20 66 72 6f 6d 20 74 65 73 74 2e 64 62  ing from test.db
66d0: 20 6f 6e 6c 79 20 73 68 6f 75 6c 64 0a 23 20 62   only should.# b
66e0: 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 61 75 73  e enough to caus
66f0: 65 20 53 51 4c 69 74 65 20 74 6f 20 64 65 6c 65  e SQLite to dele
6700: 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  te $::mj_filenam
6710: 65 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 20 20  e1..#.do_test   
6720: 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36        pager1.4.6
6730: 2e 31 30 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .10 { file exist
6740: 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  s $::mj_filename
6750: 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20    } {1}.do_test 
6760: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
6770: 2e 36 2e 31 31 20 7b 20 66 69 6c 65 20 65 78 69  .6.11 { file exi
6780: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6790: 6d 65 31 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65  me1 } {1}.do_exe
67a0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
67b0: 2e 34 2e 36 2e 31 32 20 7b 20 53 45 4c 45 43 54  .4.6.12 { SELECT
67c0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20   * FROM t1 } {1 
67d0: 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20  t1.1}.do_test   
67e0: 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36        pager1.4.6
67f0: 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .13 { file exist
6800: 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  s $::mj_filename
6810: 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20    } {1}.do_test 
6820: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
6830: 2e 36 2e 31 34 20 7b 20 66 69 6c 65 20 65 78 69  .6.14 { file exi
6840: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6850: 6d 65 31 20 7d 20 7b 30 7d 0a 0a 64 6f 5f 65 78  me1 } {0}..do_ex
6860: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
6870: 31 2e 34 2e 36 2e 31 32 20 7b 0a 20 20 41 54 54  1.4.6.12 {.  ATT
6880: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
6890: 53 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20  S two;.  SELECT 
68a0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20  * FROM t2;.} {1 
68b0: 74 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20  t2.1}.do_test   
68c0: 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36        pager1.4.6
68d0: 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .13 { file exist
68e0: 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  s $::mj_filename
68f0: 20 7d 20 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73   }  {1}.do_execs
6900: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
6910: 2e 36 2e 31 34 20 7b 0a 20 20 41 54 54 41 43 48  .6.14 {.  ATTACH
6920: 20 27 74 65 73 74 2e 64 62 33 27 20 41 53 20 74   'test.db3' AS t
6930: 68 72 65 65 3b 0a 20 20 53 45 4c 45 43 54 20 2a  hree;.  SELECT *
6940: 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 31 20 74   FROM t3;.} {1 t
6950: 33 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20  3.1}.do_test    
6960: 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e       pager1.4.6.
6970: 31 35 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  15 { file exists
6980: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20   $::mj_filename 
6990: 7d 20 20 7b 30 7d 0a 0a 64 62 20 63 6c 6f 73 65  }  {0}..db close
69a0: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74 65 73 74  .tv delete..test
69b0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
69c0: 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20  1.tv sectorsize 
69d0: 35 31 32 0a 74 76 20 73 63 72 69 70 74 20 63 6f  512.tv script co
69e0: 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65  py_on_journal_de
69f0: 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78  lete.tv filter x
6a00: 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79  Delete.proc copy
6a10: 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65  _on_journal_dele
6a20: 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  te {method filen
6a30: 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66  ame args} {.  if
6a40: 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
6a50: 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e 61  *journal $filena
6a60: 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61  me]} faultsim_sa
6a70: 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ve .  return SQL
6a80: 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69  ITE_OK.}.faultsi
6a90: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
6aa0: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
6ab0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e 31  est pager1.4.7.1
6ac0: 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72   {.  PRAGMA jour
6ad0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
6ae0: 45 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  E;.  CREATE TABL
6af0: 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b  E t1(x PRIMARY K
6b00: 45 59 2c 20 79 29 3b 0a 20 20 43 52 45 41 54 45  EY, y);.  CREATE
6b10: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
6b20: 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  y);.  INSERT INT
6b30: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c  O t1 VALUES('I',
6b40: 20 20 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53     'one');.  INS
6b50: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6b60: 45 53 28 27 49 49 27 2c 20 20 27 66 6f 75 72 27  ES('II',  'four'
6b70: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
6b80: 20 74 31 20 56 41 4c 55 45 53 28 27 49 49 49 27   t1 VALUES('III'
6b90: 2c 20 27 6e 69 6e 65 27 29 3b 0a 20 20 42 45 47  , 'nine');.  BEG
6ba0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
6bb0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49  NTO t1 VALUES('I
6bc0: 56 27 2c 20 27 73 69 78 74 65 65 6e 27 29 3b 0a  V', 'sixteen');.
6bd0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6be0: 74 31 20 56 41 4c 55 45 53 28 27 56 27 20 2c 20  t1 VALUES('V' , 
6bf0: 27 74 77 65 6e 74 79 66 69 76 65 27 29 3b 0a 20  'twentyfive');. 
6c00: 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65 6c 65   COMMIT;.} {dele
6c10: 74 65 7d 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d  te}.tv filter {}
6c20: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
6c30: 65 74 65 20 0a 64 6f 5f 74 65 73 74 20 70 61 67  ete .do_test pag
6c40: 65 72 31 2e 34 2e 37 2e 32 20 7b 0a 20 20 66 61  er1.4.7.2 {.  fa
6c50: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
6c60: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 63 61 74 63  nd_reopen.  catc
6c70: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
6c80: 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  es test.db-journ
6c90: 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20  al -permissions 
6ca0: 72 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74  r--------}.  cat
6cb0: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6cc0: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
6cd0: 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 31 7d  nal -readonly 1}
6ce0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
6cf0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
6d00: 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f  .} {1 {unable to
6d10: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
6d20: 69 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 70 61  ile}}.do_test pa
6d30: 67 65 72 31 2e 34 2e 37 2e 33 20 7b 0a 20 20 64  ger1.4.7.3 {.  d
6d40: 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68 20  b close.  catch 
6d50: 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73  {file attributes
6d60: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
6d70: 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72 77   -permissions rw
6d80: 2d 72 77 2d 72 77 2d 7d 0a 20 20 63 61 74 63 68  -rw-rw-}.  catch
6d90: 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65   {file attribute
6da0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
6db0: 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 30 7d 0a 20  l -readonly 0}. 
6dc0: 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73   delete_file tes
6dd0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 66  t.db-journal.  f
6de0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
6df0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
6e00: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
6e50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
6e60: 74 73 20 64 65 61 6c 20 77 69 74 68 20 6d 75 6c  ts deal with mul
6e70: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e  ti-file commits.
6e80: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 31 2e  .#.# pager1-5.1.
6e90: 2a 3a 20 54 68 65 20 63 61 73 65 20 77 68 65 72  *: The case wher
6ea0: 65 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  e a multi-file c
6eb0: 61 6e 6e 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74  annot be committ
6ec0: 65 64 20 62 65 63 61 75 73 65 0a 23 20 20 20 20  ed because.#    
6ed0: 20 20 20 20 20 20 20 20 20 20 20 61 6e 6f 74 68             anoth
6ee0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
6ef0: 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45   holding a SHARE
6f00: 44 20 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  D lock on one of
6f10: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
6f20: 20 20 20 20 20 66 69 6c 65 73 2e 20 41 66 74 65       files. Afte
6f30: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
6f40: 6b 20 69 73 20 72 65 6d 6f 76 65 64 2c 20 74 68  k is removed, th
6f50: 65 20 43 4f 4d 4d 49 54 20 73 75 63 63 65 65 64  e COMMIT succeed
6f60: 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e  s..#.# pager1-5.
6f70: 32 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20  2.*: Multi-file 
6f80: 63 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75  commits with jou
6f90: 72 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79  rnal_mode=memory
6fa0: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 33  ..#.# pager1-5.3
6fb0: 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63  .*: Multi-file c
6fc0: 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72  ommits with jour
6fd0: 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e  nal_mode=memory.
6fe0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 34 2e  .#.# pager1-5.4.
6ff0: 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20 77 69  *: Check that wi
7000: 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e  th synchronous=n
7010: 6f 72 6d 61 6c 2c 20 74 68 65 20 6d 61 73 74 65  ormal, the maste
7020: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23  r-journal file.#
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
7040: 61 6d 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  ame is added to 
7050: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
7060: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
7070: 20 74 68 65 20 6c 61 73 74 0a 23 20 20 20 20 20   the last.#     
7080: 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
7090: 6c 20 72 65 63 6f 72 64 2e 20 42 75 74 20 77 69  l record. But wi
70a0: 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66  th synchronous=f
70b0: 75 6c 6c 2c 20 65 78 74 72 61 20 75 6e 75 73 65  ull, extra unuse
70c0: 64 20 73 70 61 63 65 0a 23 20 20 20 20 20 20 20  d space.#       
70d0: 20 20 20 20 20 20 20 20 69 73 20 61 6c 6c 6f 63          is alloc
70e0: 61 74 65 64 20 62 65 74 77 65 65 6e 20 74 68 65  ated between the
70f0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
7100: 63 6f 72 64 20 61 6e 64 20 74 68 65 20 0a 23 20  cord and the .# 
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
7120: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
7130: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 74  e name so that t
7140: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
7150: 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20  l file.#        
7160: 20 20 20 20 20 20 20 6e 61 6d 65 20 64 6f 65 73         name does
7170: 20 6e 6f 74 20 6c 69 65 20 6f 6e 20 74 68 65 20   not lie on the 
7180: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 73 20 74  same sector as t
7190: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20  he last journal 
71a0: 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20  file.#          
71b0: 20 20 20 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23       record..#.#
71c0: 20 70 61 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43   pager1-5.5.*: C
71d0: 68 65 63 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75  heck that in jou
71e0: 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
71f0: 54 20 6d 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61  T mode, a journa
7200: 6c 20 66 69 6c 65 20 69 73 0a 23 20 20 20 20 20  l file is.#     
7210: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
7220: 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
7230: 73 20 77 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66  s when a multi-f
7240: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ile transaction 
7250: 69 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  is .#           
7260: 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 28 69      committed (i
7270: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 66 69  nstead of the fi
7280: 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
7290: 74 65 73 20 62 65 69 6e 67 20 7a 65 72 6f 65 64  tes being zeroed
72a0: 29 2e 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70  )..#.#.do_test p
72b0: 61 67 65 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20  ager1-5.1.1 {.  
72c0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
72d0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
72e0: 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43  csql {.    ATTAC
72f0: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
7300: 61 75 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20  aux;.    CREATE 
7310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
7320: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7330: 20 61 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20   aux.t2(a, b);. 
7340: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7350: 31 20 56 41 4c 55 45 53 28 31 37 2c 20 27 4c 65  1 VALUES(17, 'Le
7360: 6e 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  nin');.    INSER
7370: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
7380: 28 32 32 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a  (22, 'Stalin');.
7390: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
73a0: 74 31 20 56 41 4c 55 45 53 28 35 33 2c 20 27 4b  t1 VALUES(53, 'K
73b0: 68 72 75 73 68 63 68 65 76 27 29 3b 0a 20 20 7d  hrushchev');.  }
73c0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
73d0: 67 65 72 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65  ger1-5.1.2 {.  e
73e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
73f0: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
7400: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
7410: 36 34 2c 20 27 42 72 65 7a 68 6e 65 76 27 29 3b  64, 'Brezhnev');
7420: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
7430: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46  TO t2 SELECT * F
7440: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71  ROM t1;.  }.  sq
7450: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
7460: 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  b2.  execsql {. 
7470: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
7480: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
7490: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64  ;.  } db2.} {}.d
74a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
74b0: 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.3 {.  catchsql
74c0: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61   COMMIT.} {1 {da
74d0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
74e0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }}.do_test pager
74f0: 31 2d 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63  1-5.1.4 {.  exec
7500: 73 71 6c 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20  sql COMMIT db2. 
7510: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
7520: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
7530: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64  CT * FROM t2 } d
7540: 62 32 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32  b2.} {17 Lenin 2
7550: 32 20 53 74 61 6c 69 6e 20 35 33 20 4b 68 72 75  2 Stalin 53 Khru
7560: 73 68 63 68 65 76 20 36 34 20 42 72 65 7a 68 6e  shchev 64 Brezhn
7570: 65 76 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ev}.do_test page
7580: 72 31 2d 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32  r1-5.1.5 {.  db2
7590: 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f   close.} {}..do_
75a0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 32 2e  test pager1-5.2.
75b0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
75c0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
75d0: 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79  al_mode = memory
75e0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
75f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7600: 31 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e  1 VALUES(84, 'An
7610: 64 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 20 20  dropov');.      
7620: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
7630: 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f  ALUES(84, 'Andro
7640: 70 6f 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  pov');.    COMMI
7650: 54 3b 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79  T;.  }.} {memory
7660: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
7670: 2d 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  -5.3.1 {.  execs
7680: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
7690: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f  journal_mode = o
76a0: 66 66 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ff;.    BEGIN;. 
76b0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
76c0: 20 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27   t1 VALUES(85, '
76d0: 47 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20  Gorbachev');.   
76e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
76f0: 32 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f  2 VALUES(85, 'Go
7700: 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43  rbachev');.    C
7710: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66  OMMIT;.  }.} {of
7720: 66 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  f}..do_test page
7730: 72 31 2d 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20  r1-5.4.1 {.  db 
7740: 63 6c 6f 73 65 0a 20 20 74 65 73 74 76 66 73 20  close.  testvfs 
7750: 74 76 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  tv.  sqlite3 db 
7760: 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a  test.db -vfs tv.
7770: 20 20 65 78 65 63 73 71 6c 20 7b 20 41 54 54 41    execsql { ATTA
7780: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
7790: 20 61 75 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c   aux }..  tv fil
77a0: 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 76  ter xDelete.  tv
77b0: 20 73 63 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72   script max_jour
77c0: 6e 61 6c 5f 73 69 7a 65 0a 20 20 74 76 20 73 65  nal_size.  tv se
77d0: 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 20 20 73  ctorsize 512.  s
77e0: 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  et ::max_journal
77f0: 20 30 0a 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f   0.  proc max_jo
7800: 75 72 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68  urnal_size {meth
7810: 6f 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73  od args} {.    s
7820: 65 74 20 73 7a 20 30 0a 20 20 20 20 63 61 74 63  et sz 0.    catc
7830: 68 20 7b 20 73 65 74 20 73 7a 20 5b 66 69 6c 65  h { set sz [file
7840: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
7850: 75 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20  urnal] }.    if 
7860: 7b 24 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f  {$sz > $::max_jo
7870: 75 72 6e 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73  urnal} {.      s
7880: 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  et ::max_journal
7890: 20 24 73 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72   $sz.    }.    r
78a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
78b0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
78c0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
78d0: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
78e0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e  ;.    PRAGMA syn
78f0: 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41  chronous = NORMA
7900: 4c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  L;.    BEGIN;.  
7910: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7920: 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47  t1 VALUES(85, 'G
7930: 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20  orbachev');.    
7940: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
7950: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
7960: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f  bachev');.    CO
7970: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 73 65 74 20  MMIT;.  }.  set 
7980: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 0a 7d 20  ::max_journal.} 
7990: 5b 65 78 70 72 20 32 36 31 35 2b 5b 73 74 72 69  [expr 2615+[stri
79a0: 6e 67 20 6c 65 6e 67 74 68 20 5b 70 77 64 5d 5d  ng length [pwd]]
79b0: 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ].do_test pager1
79c0: 2d 35 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20 3a  -5.4.2 {.  set :
79d0: 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20  :max_journal 0. 
79e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
79f0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
7a00: 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45  s = full;.    BE
7a10: 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  GIN;.      DELET
7a20: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
7a30: 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20  b = 'Lenin';.   
7a40: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
7a50: 32 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e  2 WHERE b = 'Len
7a60: 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  in';.    COMMIT;
7a70: 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78  .  }.  set ::max
7a80: 5f 6a 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72  _journal.} [expr
7a90: 20 33 31 31 31 2b 5b 73 74 72 69 6e 67 20 6c 65   3111+[string le
7aa0: 6e 67 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 62 20  ngth [pwd]]].db 
7ab0: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
7ac0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7ad0: 35 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  5.5.1 {.  sqlite
7ae0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
7af0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54  xecsql { .    AT
7b00: 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20  TACH 'test.db2' 
7b10: 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47  AS aux;.    PRAG
7b20: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7b30: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43  = PERSIST;.    C
7b40: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
7b50: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
7b60: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
7b70: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
7b80: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
7b90: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
7ba0: 55 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20  UPDATE t3 SET b 
7bb0: 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  = randomblob(150
7bc0: 30 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 5b  0);.  }.  expr [
7bd0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
7be0: 62 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35 30  b-journal] > 150
7bf0: 30 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  00.} {1}.do_test
7c00: 20 70 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b 0a   pager1-5.5.2 {.
7c10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
7c20: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
7c30: 75 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42  us = full;.    B
7c40: 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
7c50: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
7c60: 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20   b = 'Stalin';. 
7c70: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
7c80: 20 74 32 20 57 48 45 52 45 20 62 20 3d 20 27 53   t2 WHERE b = 'S
7c90: 74 61 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d  talin';.    COMM
7ca0: 49 54 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  IT;.  }.  file s
7cb0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
7cc0: 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d  nal.} {0}...#---
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
7d20: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72  lowing tests wor
7d30: 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41 20 6d  k with "PRAGMA m
7d40: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a 23  ax_page_count".#
7d50: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7d60: 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  6.1 {.  faultsim
7d70: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
7d80: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
7d90: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
7da0: 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20  acuum = none;.  
7db0: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67    PRAGMA max_pag
7dc0: 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20 20  e_count = 10;.  
7dd0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7de0: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  2(a, b);.    CRE
7df0: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
7e00: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
7e10: 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20  ABLE t4(a, b);. 
7e20: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7e30: 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t5(a, b);.    CR
7e40: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c  EATE TABLE t6(a,
7e50: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
7e60: 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a  TABLE t7(a, b);.
7e70: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7e80: 20 74 38 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t8(a, b);.    C
7e90: 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 61  REATE TABLE t9(a
7ea0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
7eb0: 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20 62 29   TABLE t10(a, b)
7ec0: 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f 5f  ;.  }.} {10}.do_
7ed0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61  catchsql_test pa
7ee0: 67 65 72 31 2d 36 2e 32 20 7b 0a 20 20 43 52 45  ger1-6.2 {.  CRE
7ef0: 41 54 45 20 54 41 42 4c 45 20 74 31 31 28 61 2c  ATE TABLE t11(a,
7f00: 20 62 29 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61   b).} {1 {databa
7f10: 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
7f20: 6c 6c 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ll}}.do_execsql_
7f30: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 34 20  test pager1-6.4 
7f40: 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67  { PRAGMA max_pag
7f50: 65 5f 63 6f 75 6e 74 20 20 20 20 20 20 7d 20 7b  e_count      } {
7f60: 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  10}.do_execsql_t
7f70: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 35 20 7b  est pager1-6.5 {
7f80: 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65   PRAGMA max_page
7f90: 5f 63 6f 75 6e 74 20 3d 20 31 35 20 7d 20 7b 31  _count = 15 } {1
7fa0: 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  5}.do_execsql_te
7fb0: 73 74 20 70 61 67 65 72 31 2d 36 2e 36 20 7b 20  st pager1-6.6 { 
7fc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 31  CREATE TABLE t11
7fd0: 28 61 2c 20 62 29 20 20 20 20 20 7d 20 7b 7d 0a  (a, b)     } {}.
7fe0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7ff0: 70 61 67 65 72 31 2d 36 2e 37 20 7b 0a 20 20 42  pager1-6.7 {.  B
8000: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
8010: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53   INTO t11 VALUES
8020: 28 31 2c 20 32 29 3b 0a 20 20 20 20 50 52 41 47  (1, 2);.    PRAG
8030: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
8040: 74 20 3d 20 31 33 3b 0a 7d 20 7b 31 33 7d 0a 64  t = 13;.} {13}.d
8050: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
8060: 61 67 65 72 31 2d 36 2e 38 20 7b 0a 20 20 20 20  ager1-6.8 {.    
8070: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
8080: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
8090: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67    PRAGMA max_pag
80a0: 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 7d 20  e_count = 10;.} 
80b0: 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {11}.do_execsql_
80c0: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 39 20  test pager1-6.9 
80d0: 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a 64  { COMMIT } {}..d
80e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
80f0: 61 67 65 72 31 2d 36 2e 31 30 20 7b 20 50 52 41  ager1-6.10 { PRA
8100: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
8110: 6e 74 20 3d 20 31 30 20 7d 20 7b 31 31 7d 0a 64  nt = 10 } {11}.d
8120: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
8130: 61 67 65 72 31 2d 36 2e 31 31 20 7b 20 53 45 4c  ager1-6.11 { SEL
8140: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31 20 7d  ECT * FROM t11 }
8150: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33            {1 2 3
8160: 20 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   4}.do_execsql_t
8170: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 32 20  est pager1-6.12 
8180: 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67  { PRAGMA max_pag
8190: 65 5f 63 6f 75 6e 74 20 7d 20 20 20 20 20 20 7b  e_count }      {
81a0: 31 31 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  11}...#---------
81b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81f0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
8200: 20 74 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68   tests work with
8210: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
8220: 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 22 20  _mode=TRUNCATE" 
8230: 61 6e 64 0a 23 20 22 50 52 41 47 4d 41 20 6c 6f  and.# "PRAGMA lo
8240: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
8250: 53 49 56 45 22 2e 0a 23 0a 23 20 45 61 63 68 20  SIVE"..#.# Each 
8260: 74 65 73 74 20 69 73 20 73 70 65 63 69 66 69 65  test is specifie
8270: 64 20 77 69 74 68 20 35 20 76 61 72 69 61 62 6c  d with 5 variabl
8280: 65 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a  es. As follows:.
8290: 23 0a 23 20 20 20 24 74 6e 3a 20 20 54 65 73 74  #.#   $tn:  Test
82a0: 20 4e 75 6d 62 65 72 2e 20 55 73 65 64 20 61 73   Number. Used as
82b0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 5b 64 6f   part of the [do
82c0: 5f 74 65 73 74 5d 20 74 65 73 74 20 6e 61 6d 65  _test] test name
82d0: 73 2e 0a 23 20 20 20 24 73 71 6c 3a 20 53 51 4c  s..#   $sql: SQL
82e0: 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 23 20 20   to execute..#  
82f0: 20 24 72 65 73 3a 20 45 78 70 65 63 74 65 64 20   $res: Expected 
8300: 72 65 73 75 6c 74 20 6f 66 20 65 78 65 63 75 74  result of execut
8310: 69 6e 67 20 24 73 71 6c 2e 0a 23 20 20 20 24 6a  ing $sql..#   $j
8320: 73 3a 20 20 54 68 65 20 65 78 70 65 63 74 65 64  s:  The expected
8330: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
8340: 72 6e 61 6c 20 66 69 6c 65 2c 20 69 6e 20 62 79  rnal file, in by
8350: 74 65 73 2c 20 61 66 74 65 72 20 65 78 65 63 75  tes, after execu
8360: 74 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20 74  ting.#         t
8370: 68 65 20 53 51 4c 20 73 63 72 69 70 74 2e 20 4f  he SQL script. O
8380: 72 20 2d 31 20 69 66 20 74 68 65 20 6a 6f 75 72  r -1 if the jour
8390: 6e 61 6c 20 69 73 20 6e 6f 74 20 65 78 70 65 63  nal is not expec
83a0: 74 65 64 20 74 6f 20 65 78 69 73 74 2e 0a 23 20  ted to exist..# 
83b0: 20 20 24 77 73 3a 20 20 54 68 65 20 65 78 70 65    $ws:  The expe
83c0: 63 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  cted size of the
83d0: 20 57 41 4c 20 66 69 6c 65 2c 20 69 6e 20 62 79   WAL file, in by
83e0: 74 65 73 2c 20 61 66 74 65 72 20 65 78 65 63 75  tes, after execu
83f0: 74 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20 74  ting.#         t
8400: 68 65 20 53 51 4c 20 73 63 72 69 70 74 2e 20 4f  he SQL script. O
8410: 72 20 2d 31 20 69 66 20 74 68 65 20 57 41 4c 20  r -1 if the WAL 
8420: 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20  is not expected 
8430: 74 6f 20 65 78 69 73 74 2e 0a 23 0a 69 66 63 61  to exist..#.ifca
8440: 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 66 61  pable wal {.  fa
8450: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
8460: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
8470: 63 68 20 7b 74 6e 20 73 71 6c 20 72 65 73 20 6a  ch {tn sql res j
8480: 73 20 77 73 7d 20 5b 73 75 62 73 74 20 7b 0a 20  s ws} [subst {. 
8490: 20 0a 20 20 20 20 31 20 20 7b 0a 20 20 20 20 20   .    1  {.     
84a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
84b0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 50 52  (a, b);.      PR
84c0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
84d0: 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47  =OFF;.      PRAG
84e0: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  MA synchronous=N
84f0: 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41  ORMAL;.      PRA
8500: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 31 30  GMA page_size=10
8510: 32 34 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  24;.      PRAGMA
8520: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
8530: 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 50  CLUSIVE;.      P
8540: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8550: 64 65 3d 54 52 55 4e 43 41 54 45 3b 0a 20 20 20  de=TRUNCATE;.   
8560: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8570: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
8580: 20 20 20 20 7d 20 7b 65 78 63 6c 75 73 69 76 65      } {exclusive
8590: 20 74 72 75 6e 63 61 74 65 7d 20 30 20 2d 31 0a   truncate} 0 -1.
85a0: 20 20 0a 20 20 20 20 32 20 20 7b 0a 20 20 20 20    .    2  {.    
85b0: 20 20 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54    BEGIN IMMEDIAT
85c0: 45 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  E;.        SELEC
85d0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
85e0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
85f0: 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20   {1 2} 0 -1.  . 
8600: 20 20 20 33 20 20 7b 0a 20 20 20 20 20 20 42 45     3  {.      BE
8610: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c  GIN;.        SEL
8620: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
8630: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20       COMMIT;.   
8640: 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20   } {1 2} 0 -1.  
8650: 0a 20 20 20 20 34 20 20 7b 20 50 52 41 47 4d 41  .    4  { PRAGMA
8660: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
8670: 57 41 4c 20 7d 20 20 20 20 77 61 6c 20 20 20 20  WAL }    wal    
8680: 20 20 20 2d 31 20 2d 31 0a 20 20 20 20 35 20 20     -1 -1.    5  
8690: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
86a0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 20   VALUES(3, 4) } 
86b0: 20 7b 7d 20 20 20 20 20 20 20 20 2d 31 20 5b 77   {}        -1 [w
86c0: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31  al_file_size 1 1
86d0: 30 32 34 5d 0a 20 20 20 20 36 20 20 7b 20 50 52  024].    6  { PR
86e0: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
86f0: 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20 65 78 63  e = NORMAL } exc
8700: 6c 75 73 69 76 65 20 2d 31 20 5b 77 61 6c 5f 66  lusive -1 [wal_f
8710: 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d  ile_size 1 1024]
8720: 0a 20 20 20 20 37 20 20 7b 20 49 4e 53 45 52 54  .    7  { INSERT
8730: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8740: 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20 20  5, 6); } {}     
8750: 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f     -1 [wal_file_
8760: 73 69 7a 65 20 32 20 31 30 32 34 5d 0a 20 20 0a  size 2 1024].  .
8770: 20 20 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20      8  { PRAGMA 
8780: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54  journal_mode = T
8790: 52 55 4e 43 41 54 45 20 7d 20 74 72 75 6e 63 61  RUNCATE } trunca
87a0: 74 65 20 20 20 20 20 20 20 20 20 20 30 20 2d 31  te          0 -1
87b0: 0a 20 20 20 20 39 20 20 7b 20 49 4e 53 45 52 54  .    9  { INSERT
87c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
87d0: 37 2c 20 38 29 20 7d 20 20 20 20 7b 7d 20 20 20  7, 8) }    {}   
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 2d               0 -
87f0: 31 0a 20 20 20 20 31 30 20 7b 20 53 45 4c 45 43  1.    10 { SELEC
8800: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20  T * FROM t1 }   
8810: 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 20 32              {1 2
8820: 20 33 20 34 20 35 20 36 20 37 20 38 7d 20 30 20   3 4 5 6 7 8} 0 
8830: 2d 31 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20 20 20  -1.  .  }] {.   
8840: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
8850: 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e   pager1-7.1.$tn.
8860: 31 20 24 73 71 6c 20 24 72 65 73 0a 20 20 20 20  1 $sql $res.    
8870: 63 61 74 63 68 20 7b 20 73 65 74 20 4a 20 2d 31  catch { set J -1
8880: 20 3b 20 73 65 74 20 4a 20 5b 66 69 6c 65 20 73   ; set J [file s
8890: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
88a0: 6e 61 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63 68  nal] }.    catch
88b0: 20 7b 20 73 65 74 20 57 20 2d 31 20 3b 20 73 65   { set W -1 ; se
88c0: 74 20 57 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  t W [file size t
88d0: 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20 20  est.db-wal] }.  
88e0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
88f0: 2d 37 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69 73  -7.1.$tn.2 { lis
8900: 74 20 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74 20  t $J $W } [list 
8910: 24 6a 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a  $js $ws].  }.}..
8920: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37  do_test pager1-7
8930: 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.1 {.  faultsi
8940: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
8950: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
8960: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
8970: 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53  ng_mode = EXCLUS
8980: 49 56 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20  IVE;.    CREATE 
8990: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
89a0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
89b0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
89c0: 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20  mode = delete;. 
89d0: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
89e0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 74 72 75 6e 63  nal_mode = trunc
89f0: 61 74 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c  ate;.  }.} {excl
8a00: 75 73 69 76 65 20 64 65 6c 65 74 65 20 74 72 75  usive delete tru
8a10: 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70  ncate}.do_test p
8a20: 61 67 65 72 31 2d 37 2e 32 2e 32 20 7b 0a 20 20  ager1-7.2.2 {.  
8a30: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
8a40: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8a50: 31 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71  1, 2) }.  execsq
8a60: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
8a70: 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73  al_mode = persis
8a80: 74 20 7d 0a 7d 20 7b 74 72 75 6e 63 61 74 65 7d  t }.} {truncate}
8a90: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
8aa0: 37 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  7.2.3 {.  execsq
8ab0: 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65  l { COMMIT }.  e
8ac0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
8ad0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8ae0: 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20   = persist;.    
8af0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73  PRAGMA journal_s
8b00: 69 7a 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d  ize_limit;.  }.}
8b10: 20 7b 70 65 72 73 69 73 74 20 2d 31 7d 0a 0a 23   {persist -1}..#
8b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
8b70: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c  following tests,
8b80: 20 70 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65 73   pager1-8.*, tes
8b90: 74 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69  t that the speci
8ba0: 61 6c 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23 20  al filenames .# 
8bb0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20 22  ":memory:" and "
8bc0: 22 20 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72 79  " open temporary
8bd0: 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f   databases..#.fo
8be0: 72 65 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61  reach {tn filena
8bf0: 6d 65 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72  me} {.  1 :memor
8c00: 79 3a 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20  y:.  2 "".} {.  
8c10: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38  do_test pager1-8
8c20: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75  .$tn.1 {.    fau
8c30: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
8c40: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 63  _reopen.    db c
8c50: 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  lose.    sqlite3
8c60: 20 64 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20   db $filename.  
8c70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
8c80: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
8c90: 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  cuum = 1;.      
8ca0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31 28  CREATE TABLE x1(
8cb0: 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  x);.      INSERT
8cc0: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
8cd0: 27 43 68 61 72 6c 65 73 27 29 3b 0a 20 20 20 20  'Charles');.    
8ce0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
8cf0: 20 56 41 4c 55 45 53 28 27 4a 61 6d 65 73 27 29   VALUES('James')
8d00: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
8d10: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 4d  NTO x1 VALUES('M
8d20: 61 72 79 27 29 3b 0a 20 20 20 20 20 20 53 45 4c  ary');.      SEL
8d30: 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a 20  ECT * FROM x1;. 
8d40: 20 20 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c 65     }.  } {Charle
8d50: 73 20 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a 20  s James Mary}.. 
8d60: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
8d70: 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71  8.$tn.2 {.    sq
8d80: 6c 69 74 65 33 20 64 62 32 20 24 66 69 6c 65 6e  lite3 db2 $filen
8d90: 61 6d 65 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ame.    catchsql
8da0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
8db0: 20 78 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31   x1 } db2.  } {1
8dc0: 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   {no such table:
8dd0: 20 78 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65 63   x1}}..  do_exec
8de0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
8df0: 38 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42 45  8.$tn.3 {.    BE
8e00: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
8e10: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
8e20: 28 27 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20 20  ('William');.   
8e30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
8e40: 31 20 56 41 4c 55 45 53 28 27 41 6e 6e 65 27 29  1 VALUES('Anne')
8e50: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
8e60: 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d    } {}.}..#-----
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8eb0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20  ----.# The next 
8ec0: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d  block of tests -
8ed0: 20 70 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64 65   pager1-9.* - de
8ee0: 61 6c 20 77 69 74 68 20 69 6e 74 65 72 61 63 74  al with interact
8ef0: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 23 20 74  ions between.# t
8f00: 68 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  he pager and the
8f10: 20 62 61 63 6b 75 70 20 41 50 49 2e 20 54 65 73   backup API. Tes
8f20: 74 20 63 61 73 65 73 3a 0a 23 0a 23 20 20 20 70  t cases:.#.#   p
8f30: 61 67 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65 73  ager1-9.1.*: Tes
8f40: 74 20 74 68 61 74 20 61 20 62 61 63 6b 75 70 20  t that a backup 
8f50: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
8f60: 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66 20 74  sfully even if t
8f70: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
8f80: 20 20 20 20 20 73 6f 75 72 63 65 20 64 62 20 69       source db i
8f90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 75 72  s written to dur
8fa0: 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 6f  ing the backup o
8fb0: 70 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  p..#.#   pager1-
8fc0: 39 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  9.2.*: Test that
8fd0: 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65   a backup comple
8fe0: 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  tes successfully
8ff0: 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20   even if the.#  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9010: 6f 75 72 63 65 20 64 62 20 69 73 20 77 72 69 74  ource db is writ
9020: 74 65 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e 20  ten to and then 
9030: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 64 75 72 69  rolled back duri
9040: 6e 67 20 61 20 0a 23 20 20 20 20 20 20 20 20 20  ng a .#         
9050: 20 20 20 20 20 20 20 20 62 61 63 6b 75 70 20 6f          backup o
9060: 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  peration..#.do_t
9070: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 31  est pager1-9.0.1
9080: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
9090: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
90a0: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
90b0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
90c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
90d0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
90e0: 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  10;.    BEGIN;. 
90f0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
9100: 45 20 61 62 28 61 2c 20 62 2c 20 55 4e 49 51 55  E ab(a, b, UNIQU
9110: 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 20 20  E(a, b));.      
9120: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56  INSERT INTO ab V
9130: 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28  ALUES( a_string(
9140: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9150: 30 30 29 20 29 3b 0a 20 20 20 20 20 20 49 4e 53  00) );.      INS
9160: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
9170: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
9180: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
9190: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
91a0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
91b0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
91c0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
91d0: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
91e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
91f0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
9200: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9210: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
9220: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
9230: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
9240: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
9250: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
9260: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9270: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
9280: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
9290: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
92a0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
92b0: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
92c0: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
92d0: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
92e0: 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  b;.      INSERT 
92f0: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
9300: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
9310: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
9320: 20 61 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b   ab;.    COMMIT;
9330: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
9340: 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 32 20 7b  t pager1-9.0.2 {
9350: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
9360: 65 73 74 2e 64 62 32 0a 20 20 64 62 32 20 65 76  est.db2.  db2 ev
9370: 61 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68  al { PRAGMA cach
9380: 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20  e_size = 10 }.  
9390: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42  sqlite3_backup B
93a0: 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69   db2 main db mai
93b0: 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70  n.  list [B step
93c0: 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73   10000] [B finis
93d0: 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e  h].} {SQLITE_DON
93e0: 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f  E SQLITE_OK}.do_
93f0: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e  test pager1-9.0.
9400: 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c  3 {. db one {SEL
9410: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
9420: 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32   FROM ab}.} [db2
9430: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35   one {SELECT md5
9440: 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61  sum(a, b) FROM a
9450: 62 7d 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  b}]..do_test pag
9460: 65 72 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78  er1-9.1.1 {.  ex
9470: 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61  ecsql { UPDATE a
9480: 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69  b SET a = a_stri
9490: 6e 67 28 32 30 31 29 20 7d 0a 20 20 73 71 6c 69  ng(201) }.  sqli
94a0: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
94b0: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
94c0: 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c  B step 30.} {SQL
94d0: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
94e0: 70 61 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a 20  pager1-9.1.2 {. 
94f0: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
9500: 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73  E ab SET b = a_s
9510: 74 72 69 6e 67 28 33 30 31 29 20 7d 0a 20 20 6c  tring(301) }.  l
9520: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
9530: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
9540: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
9550: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
9560: 70 61 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a 20  pager1-9.1.3 {. 
9570: 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  db one {SELECT m
9580: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
9590: 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20   ab}.} [db2 one 
95a0: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
95b0: 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64  , b) FROM ab}].d
95c0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
95d0: 31 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20  1.4 { execsql { 
95e0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
95f0: 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38  FROM ab } } {128
9600: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
9610: 31 2d 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63  1-9.2.1 {.  exec
9620: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20  sql { UPDATE ab 
9630: 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67  SET a = a_string
9640: 28 32 30 32 29 20 7d 0a 20 20 73 71 6c 69 74 65  (202) }.  sqlite
9650: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d  3_backup B db2 m
9660: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20  ain db main.  B 
9670: 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54  step 30.} {SQLIT
9680: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
9690: 67 65 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20 65  ger1-9.2.2 {.  e
96a0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45  xecsql { .    BE
96b0: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
96c0: 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73  E ab SET b = a_s
96d0: 74 72 69 6e 67 28 33 30 31 29 3b 0a 20 20 20 20  tring(301);.    
96e0: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20  ROLLBACK;.  }.  
96f0: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
9700: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
9710: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
9720: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9730: 20 70 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b 0a   pager1-9.2.3 {.
9740: 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20   db one {SELECT 
9750: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9760: 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65  M ab}.} [db2 one
9770: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
9780: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a  a, b) FROM ab}].
9790: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
97a0: 2e 32 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b  .2.4 { execsql {
97b0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
97c0: 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32   FROM ab } } {12
97d0: 38 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20  8}.db close.db2 
97e0: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70  close..do_test p
97f0: 61 67 65 72 31 2d 39 2e 33 2e 31 20 7b 0a 20 20  ager1-9.3.1 {.  
9800: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
9810: 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74 6f  ult 1.  tv secto
9820: 72 73 69 7a 65 20 34 30 39 36 0a 20 20 66 61 75  rsize 4096.  fau
9830: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
9840: 5f 72 65 6f 70 65 6e 0a 0a 20 20 65 78 65 63 73  _reopen..  execs
9850: 71 6c 20 7b 20 50 52 41 47 4d 41 20 70 61 67 65  ql { PRAGMA page
9860: 5f 73 69 7a 65 20 3d 20 31 30 32 34 20 7d 0a 20  _size = 1024 }. 
9870: 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20   for {set ii 0} 
9880: 7b 24 69 69 20 3c 20 34 7d 20 7b 69 6e 63 72 20  {$ii < 4} {incr 
9890: 69 69 7d 20 7b 20 65 78 65 63 73 71 6c 20 22 43  ii} { execsql "C
98a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 24 7b 69  REATE TABLE t${i
98b0: 69 7d 28 61 2c 20 62 29 22 20 7d 0a 7d 20 7b 7d  i}(a, b)" }.} {}
98c0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
98d0: 39 2e 33 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  9.3.2 {.  sqlite
98e0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 0a  3 db2 test.db2..
98f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
9900: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
9910: 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 50 52 41   = 4096;.    PRA
9920: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
9930: 3d 20 4f 46 46 3b 0a 20 20 20 20 43 52 45 41 54  = OFF;.    CREAT
9940: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
9950: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
9960: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d  LE t2(a, b);.  }
9970: 20 64 62 32 0a 0a 20 20 73 71 6c 69 74 65 33 5f   db2..  sqlite3_
9980: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
9990: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74  n db main.  B st
99a0: 65 70 20 33 30 0a 20 20 6c 69 73 74 20 5b 42 20  ep 30.  list [B 
99b0: 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66  step 10000] [B f
99c0: 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45  inish].} {SQLITE
99d0: 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d  _DONE SQLITE_OK}
99e0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
99f0: 39 2e 33 2e 33 20 7b 0a 20 20 64 62 32 20 63 6c  9.3.3 {.  db2 cl
9a00: 6f 73 65 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  ose.  db close. 
9a10: 20 74 76 20 64 65 6c 65 74 65 0a 20 20 66 69 6c   tv delete.  fil
9a20: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 32 0a  e size test.db2.
9a30: 7d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  } [file size tes
9a40: 74 2e 64 62 5d 0a 0a 64 6f 5f 74 65 73 74 20 70  t.db]..do_test p
9a50: 61 67 65 72 31 2d 39 2e 34 2e 31 20 7b 0a 20 20  ager1-9.4.1 {.  
9a60: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
9a70: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c  and_reopen.  sql
9a80: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
9a90: 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  2.  execsql {.  
9aa0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
9ab0: 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 43  ze = 4096;.    C
9ac0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
9ad0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
9ae0: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
9af0: 0a 20 20 7d 20 64 62 32 0a 20 20 73 71 6c 69 74  .  } db2.  sqlit
9b00: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
9b10: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c  main db main.  l
9b20: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
9b30: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
9b40: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
9b50: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
9b60: 70 61 67 65 72 31 2d 39 2e 34 2e 32 20 7b 0a 20  pager1-9.4.2 {. 
9b70: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65   list [file size
9b80: 20 74 65 73 74 2e 64 62 32 5d 20 5b 66 69 6c 65   test.db2] [file
9b90: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 7d   size test.db].}
9ba0: 20 7b 30 20 30 7d 0a 64 62 32 20 63 6c 6f 73 65   {0 0}.db2 close
9bb0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
9bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
9c00: 65 73 74 20 74 68 61 74 20 72 65 67 61 72 64 6c  est that regardl
9c10: 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
9c20: 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 53 65   returned by xSe
9c30: 63 74 6f 72 53 69 7a 65 28 29 2c 20 74 68 65 0a  ctorSize(), the.
9c40: 23 20 6d 69 6e 69 6d 75 6d 20 65 66 66 65 63 74  # minimum effect
9c50: 69 76 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  ive sector-size 
9c60: 69 73 20 35 31 32 20 61 6e 64 20 74 68 65 20 6d  is 512 and the m
9c70: 61 78 69 6d 75 6d 20 36 35 35 33 36 20 62 79 74  aximum 65536 byt
9c80: 65 73 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  es..#.testvfs tv
9c90: 20 2d 64 65 66 61 75 6c 74 20 31 0a 66 6f 72 65   -default 1.fore
9ca0: 61 63 68 20 73 65 63 74 6f 72 73 69 7a 65 20 7b  ach sectorsize {
9cb0: 0a 20 20 20 20 33 32 20 20 20 36 34 20 20 20 31  .    32   64   1
9cc0: 32 38 20 20 20 32 35 36 20 20 20 35 31 32 20 20  28   256   512  
9cd0: 20 31 30 32 34 20 20 20 32 30 34 38 20 0a 20 20   1024   2048 .  
9ce0: 20 20 34 30 39 36 20 38 31 39 32 20 31 36 33 38    4096 8192 1638
9cf0: 34 20 33 32 37 36 38 20 36 35 35 33 36 20 31 33  4 32768 65536 13
9d00: 31 30 37 32 20 32 36 32 31 34 34 0a 7d 20 7b 0a  1072 262144.} {.
9d10: 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20    tv sectorsize 
9d20: 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 73 65  $sectorsize.  se
9d30: 74 20 65 66 66 20 24 73 65 63 74 6f 72 73 69 7a  t eff $sectorsiz
9d40: 65 0a 20 20 69 66 20 7b 24 73 65 63 74 6f 72 73  e.  if {$sectors
9d50: 69 7a 65 20 3c 20 35 31 32 7d 20 20 20 7b 20 73  ize < 512}   { s
9d60: 65 74 20 65 66 66 20 35 31 32 20 7d 0a 20 20 69  et eff 512 }.  i
9d70: 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3e  f {$sectorsize >
9d80: 20 36 35 35 33 36 7d 20 7b 20 73 65 74 20 65 66   65536} { set ef
9d90: 66 20 36 35 35 33 36 20 7d 0a 0a 20 20 64 6f 5f  f 65536 }..  do_
9da0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
9db0: 73 65 63 74 6f 72 73 69 7a 65 2e 31 20 7b 0a 20  sectorsize.1 {. 
9dc0: 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65     faultsim_dele
9dd0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
9de0: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
9df0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20  ng a_string.    
9e00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
9e10: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
9e20: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
9e30: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
9e40: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
9e50: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
9e60: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9e70: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
9e80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9e90: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20  2(a, b);.       
9ea0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
9eb0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 4f  (a, b);.      CO
9ec0: 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  MMIT;.    }.    
9ed0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
9ee0: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 5b 65  b-journal.  } [e
9ef0: 78 70 72 20 24 73 65 63 74 6f 72 73 69 7a 65 20  xpr $sectorsize 
9f00: 3e 20 36 35 35 33 36 20 3f 20 36 35 35 33 36 20  > 65536 ? 65536 
9f10: 3a 20 24 73 65 63 74 6f 72 73 69 7a 65 5d 0a 0a  : $sectorsize]..
9f20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
9f30: 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e  -10.$sectorsize.
9f40: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
9f50: 7b 20 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  { .      INSERT 
9f60: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 61  INTO t3 VALUES(a
9f70: 5f 73 74 72 69 6e 67 28 33 30 30 29 2c 20 61 5f  _string(300), a_
9f80: 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20  string(300));.  
9f90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9fa0: 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t3 SELECT * FROM
9fb0: 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20   t3;        /*  
9fc0: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
9fd0: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
9fe0: 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20   * FROM t3;     
9ff0: 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20     /*  4 */.    
a000: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
a010: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
a020: 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 38 20  3;        /*  8 
a030: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
a040: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a  INTO t3 SELECT *
a050: 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20   FROM t3;       
a060: 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20   /* 16 */.      
a070: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
a080: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
a090: 20 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f          /* 32 */
a0a0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20  .    }.  } {}.. 
a0b0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
a0c0: 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 33  10.$sectorsize.3
a0d0: 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a   {.    db close.
a0e0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
a0f0: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
a100: 71 6c 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  ql { .      PRAG
a110: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
a120: 31 30 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  10;.      BEGIN;
a130: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72  .    }.    recur
a140: 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74  sive_select 32 t
a150: 33 20 7b 64 62 20 65 76 61 6c 20 22 49 4e 53 45  3 {db eval "INSE
a160: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
a170: 53 28 31 2c 20 32 29 22 7d 0a 20 20 20 20 65 78  S(1, 2)"}.    ex
a180: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f  ecsql {.      CO
a190: 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53 45 4c 45  MMIT;.      SELE
a1a0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
a1b0: 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 0a 20    }.  } {1 2}.. 
a1c0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
a1d0: 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 34  10.$sectorsize.4
a1e0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
a1f0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
a200: 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20  BLE t6(a, b);.  
a210: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a220: 20 74 37 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t7(a, b);.     
a230: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
a240: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 44 52  (a, b);.      DR
a250: 4f 50 20 54 41 42 4c 45 20 74 36 3b 0a 20 20 20  OP TABLE t6;.   
a260: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 37     DROP TABLE t7
a270: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63  ;.    }.    exec
a280: 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49  sql {.      BEGI
a290: 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  N;.        CREAT
a2a0: 45 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29  E TABLE t6(a, b)
a2b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75  ;.    }.    recu
a2c0: 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20  rsive_select 32 
a2d0: 74 33 20 7b 64 62 20 65 76 61 6c 20 22 49 4e 53  t3 {db eval "INS
a2e0: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
a2f0: 45 53 28 31 2c 20 32 29 22 7d 0a 20 20 20 20 65  ES(1, 2)"}.    e
a300: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
a310: 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53 45 4c  OMMIT;.      SEL
a320: 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 3b 0a 20  ECT * FROM t5;. 
a330: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20     }.  } {1 2}. 
a340: 20 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 74 76   .}.db close..tv
a350: 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39 36   sectorsize 4096
a360: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
a370: 31 30 2e 78 2e 31 20 7b 0a 20 20 66 61 75 6c 74  10.x.1 {.  fault
a380: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
a390: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
a3a0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
a3b0: 6f 5f 76 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b  o_vacuum = none;
a3c0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
a3d0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
a3e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a3f0: 31 28 78 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20  1(x);.  }.  for 
a400: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 33 30  {set i 0} {$i<30
a410: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
a420: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
a430: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
a440: 28 7a 65 72 6f 62 6c 6f 62 28 39 30 30 29 29 20  (zeroblob(900)) 
a450: 7d 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a  }.  }.  file siz
a460: 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 33 32 37  e test.db.} {327
a470: 36 38 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  68}.do_test page
a480: 72 31 2e 31 30 2e 78 2e 32 20 7b 0a 20 20 65 78  r1.10.x.2 {.  ex
a490: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
a4a0: 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a  TE TABLE t2(x);.
a4b0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
a4c0: 32 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  2;.  }.  file si
a4d0: 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 33 33  ze test.db.} {33
a4e0: 37 39 32 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  792}.do_test pag
a4f0: 65 72 31 2e 31 30 2e 78 2e 33 20 7b 0a 20 20 65  er1.10.x.3 {.  e
a500: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
a510: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
a520: 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 7d 0a  ABLE t2(x);.  }.
a530: 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65    recursive_sele
a540: 63 74 20 33 30 20 74 31 0a 20 20 65 78 65 63 73  ct 30 t1.  execs
a550: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
a560: 54 41 42 4c 45 20 74 33 28 78 29 3b 0a 20 20 20  TABLE t3(x);.   
a570: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
a580: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  }..db close.tv d
a590: 65 6c 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74  elete..testvfs t
a5a0: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 66 61 75  v -default 1.fau
a5b0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
a5c0: 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63 20  _reopen.db func 
a5d0: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
a5e0: 67 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  g.do_execsql_tes
a5f0: 74 20 70 61 67 65 72 31 2d 31 31 2e 31 20 7b 0a  t pager1-11.1 {.
a600: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
a610: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
a620: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
a630: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49  ize = 10;.  BEGI
a640: 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  N;.    CREATE TA
a650: 42 4c 45 20 7a 7a 28 74 6f 70 20 50 52 49 4d 41  BLE zz(top PRIMA
a660: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53  RY KEY);.    INS
a670: 45 52 54 20 49 4e 54 4f 20 7a 7a 20 56 41 4c 55  ERT INTO zz VALU
a680: 45 53 28 61 5f 73 74 72 69 6e 67 28 32 32 32 29  ES(a_string(222)
a690: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
a6a0: 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73  TO zz SELECT a_s
a6b0: 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32  tring((SELECT 22
a6c0: 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f  2+max(rowid) FRO
a6d0: 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a  M zz)) FROM zz;.
a6e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a6f0: 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  zz SELECT a_stri
a700: 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d  ng((SELECT 222+m
a710: 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a  ax(rowid) FROM z
a720: 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20  z)) FROM zz;.   
a730: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20   INSERT INTO zz 
a740: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
a750: 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28  (SELECT 222+max(
a760: 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29  rowid) FROM zz))
a770: 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e   FROM zz;.    IN
a780: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c  SERT INTO zz SEL
a790: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45  ECT a_string((SE
a7a0: 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77  LECT 222+max(row
a7b0: 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52  id) FROM zz)) FR
a7c0: 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52  OM zz;.    INSER
a7d0: 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54  T INTO zz SELECT
a7e0: 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43   a_string((SELEC
a7f0: 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29  T 222+max(rowid)
a800: 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20   FROM zz)) FROM 
a810: 7a 7a 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  zz;.  COMMIT;.  
a820: 42 45 47 49 4e 3b 0a 20 20 20 20 55 50 44 41 54  BEGIN;.    UPDAT
a830: 45 20 7a 7a 20 53 45 54 20 74 6f 70 20 3d 20 61  E zz SET top = a
a840: 5f 73 74 72 69 6e 67 28 33 34 35 29 3b 0a 7d 20  _string(345);.} 
a850: 7b 64 65 6c 65 74 65 7d 0a 0a 70 72 6f 63 20 6c  {delete}..proc l
a860: 6f 63 6b 6f 75 74 20 7b 6d 65 74 68 6f 64 20 61  ockout {method a
a870: 72 67 73 7d 20 7b 20 72 65 74 75 72 6e 20 53 51  rgs} { return SQ
a880: 4c 49 54 45 5f 49 4f 45 52 52 20 7d 0a 74 76 20  LITE_IOERR }.tv 
a890: 73 63 72 69 70 74 20 6c 6f 63 6b 6f 75 74 0a 74  script lockout.t
a8a0: 76 20 66 69 6c 74 65 72 20 7b 78 57 72 69 74 65  v filter {xWrite
a8b0: 20 78 54 72 75 6e 63 61 74 65 20 78 53 79 6e 63   xTruncate xSync
a8c0: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
a8d0: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 32 20 7b  st pager1-11.2 {
a8e0: 20 43 4f 4d 4d 49 54 20 7d 20 7b 31 20 7b 64 69   COMMIT } {1 {di
a8f0: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a  sk I/O error}}..
a900: 74 76 20 73 63 72 69 70 74 20 7b 7d 0a 64 6f 5f  tv script {}.do_
a910: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 33  test pager1-11.3
a920: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
a930: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
a940: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
a950: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54  journal_mode = T
a960: 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 50 52 41  RUNCATE;.    PRA
a970: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
a980: 65 63 6b 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b  eck;.  } db2.} {
a990: 74 72 75 6e 63 61 74 65 20 6f 6b 7d 0a 64 6f 5f  truncate ok}.do_
a9a0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 34  test pager1-11.4
a9b0: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20   {.  db2 close. 
a9c0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
a9d0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
a9e0: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
a9f0: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 35 20 7b  st pager1-11.5 {
aa00: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
aa10: 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a   FROM zz } {32}.
aa20: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
aa30: 74 65 0a 20 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  te.  .#---------
aa40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa80: 0a 23 20 54 65 73 74 20 22 50 52 41 47 4d 41 20  .# Test "PRAGMA 
aa90: 70 61 67 65 5f 73 69 7a 65 22 0a 23 0a 74 65 73  page_size".#.tes
aaa0: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
aab0: 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65   1.tv sectorsize
aac0: 20 31 30 32 34 0a 66 6f 72 65 61 63 68 20 70 61   1024.foreach pa
aad0: 67 65 73 69 7a 65 20 7b 0a 20 20 20 20 35 31 32  gesize {.    512
aae0: 20 20 20 31 30 32 34 20 20 20 32 30 34 38 20 34     1024   2048 4
aaf0: 30 39 36 20 38 31 39 32 20 31 36 33 38 34 20 33  096 8192 16384 3
ab00: 32 37 36 38 20 0a 7d 20 7b 0a 20 20 66 61 75 6c  2768 .} {.  faul
ab10: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
ab20: 72 65 6f 70 65 6e 0a 0a 20 20 23 20 54 68 65 20  reopen..  # The 
ab30: 73 65 63 74 6f 72 2d 73 69 7a 65 20 28 61 63 63  sector-size (acc
ab40: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 56 46  ording to the VF
ab50: 53 29 20 69 73 20 31 30 32 34 20 62 79 74 65 73  S) is 1024 bytes
ab60: 2e 20 53 6f 20 69 66 20 74 68 65 0a 20 20 23 20  . So if the.  # 
ab70: 70 61 67 65 2d 73 69 7a 65 20 72 65 71 75 65 73  page-size reques
ab80: 74 65 64 20 75 73 69 6e 67 20 22 50 52 41 47 4d  ted using "PRAGM
ab90: 41 20 70 61 67 65 5f 73 69 7a 65 22 20 69 73 20  A page_size" is 
aba0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
abb0: 0a 20 20 23 20 63 6f 6d 70 69 6c 65 20 74 69 6d  .  # compile tim
abc0: 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54  e value of SQLIT
abd0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
abe0: 20 74 68 65 6e 20 74 68 65 20 65 66 66 65 63 74   then the effect
abf0: 69 76 65 20 0a 20 20 23 20 70 61 67 65 2d 73 69  ive .  # page-si
ac00: 7a 65 20 72 65 6d 61 69 6e 73 20 31 30 32 34 20  ze remains 1024 
ac10: 62 79 74 65 73 2e 0a 20 20 23 0a 20 20 73 65 74  bytes..  #.  set
ac20: 20 65 66 66 20 24 70 61 67 65 73 69 7a 65 0a 20   eff $pagesize. 
ac30: 20 69 66 20 7b 24 65 66 66 20 3e 20 24 3a 3a 53   if {$eff > $::S
ac40: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
ac50: 49 5a 45 7d 20 7b 20 73 65 74 20 65 66 66 20 31  IZE} { set eff 1
ac60: 30 32 34 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  024 }..  do_test
ac70: 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67 65   pager1-12.$page
ac80: 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 73 71 6c  size.1 {.    sql
ac90: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
aca0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20  .    execsql ". 
acb0: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
acc0: 5f 73 69 7a 65 20 3d 20 24 70 61 67 65 73 69 7a  _size = $pagesiz
acd0: 65 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  e;.      CREATE 
ace0: 56 49 45 57 20 76 20 41 53 20 53 45 4c 45 43 54  VIEW v AS SELECT
acf0: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
ad00: 61 73 74 65 72 3b 0a 20 20 20 20 22 20 64 62 32  aster;.    " db2
ad10: 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74  .    file size t
ad20: 65 73 74 2e 64 62 0a 20 20 7d 20 24 65 66 66 0a  est.db.  } $eff.
ad30: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ad40: 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 32 20  -12.$pagesize.2 
ad50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  {.    sqlite3 db
ad60: 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  2 test.db.    ex
ad70: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53  ecsql { .      S
ad80: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
ad90: 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50 52 41  ROM v;.      PRA
ada0: 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69  GMA main.page_si
adb0: 7a 65 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20  ze;.    } db2.  
adc0: 7d 20 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a  } [list 1 $eff].
add0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ade0: 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 33 20  -12.$pagesize.3 
adf0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
ae00: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
ae10: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20  unt(*) FROM v;. 
ae20: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
ae30: 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20  .page_size;.    
ae40: 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65  }.  } [list 1 $e
ae50: 66 66 5d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  ff].  db2 close.
ae60: 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  }.db close.tv de
ae70: 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lete..#---------
ae80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aec0: 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c 20 22  .# Test specal "
aed0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
aee0: 6f 64 65 3d 50 45 52 53 49 53 54 22 20 74 65 73  ode=PERSIST" tes
aef0: 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  t cases..#.# pag
af00: 65 72 31 2d 31 33 2e 31 2e 2a 3a 20 54 68 69 73  er1-13.1.*: This
af10: 20 74 65 73 74 73 20 61 20 73 70 65 63 69 61 6c   tests a special
af20: 20 63 61 73 65 20 65 6e 63 6f 75 6e 74 65 72 65   case encountere
af30: 64 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 20  d in persistent 
af40: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
af50: 20 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20    journal mode: 
af60: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  If the journal a
af70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
af80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20   transaction.#  
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
afa0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
afb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
afc0: 62 65 63 61 75 73 65 20 61 20 70 72 65 76 69 6f  because a previo
afd0: 75 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  us .#           
afe0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
aff0: 20 6c 65 66 74 20 61 20 76 65 72 79 20 6c 61 72   left a very lar
b000: 67 65 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e  ge non-hot journ
b010: 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 23  al file in the.#
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b030: 66 69 6c 65 2d 73 79 73 74 65 6d 29 2c 20 74 68  file-system), th
b040: 65 6e 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f  en SQLite has to
b050: 20 62 65 20 63 61 72 65 66 75 6c 20 74 68 61 74   be careful that
b060: 20 74 68 65 72 65 20 69 73 0a 23 20 20 20 20 20   there is.#     
b070: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 61             not a
b080: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
b090: 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
b0a0: 20 70 72 65 76 69 6f 75 73 20 74 72 61 6e 73 61   previous transa
b0b0: 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 20 20  ction.#         
b0c0: 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65         immediate
b0d0: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
b0e0: 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 65 6e 74   journal content
b0f0: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2e 0a 23   just written..#
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
b120: 20 74 68 65 20 70 72 6f 63 65 73 73 20 63 72 61   the process cra
b130: 73 68 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  shes so that the
b140: 20 6a 6f 75 72 6e 61 6c 0a 23 20 20 20 20 20 20   journal.#      
b150: 20 20 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65            become
b160: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
b170: 61 6e 64 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c  and must be roll
b180: 65 64 20 62 61 63 6b 20 62 79 20 61 6e 6f 74 68  ed back by anoth
b190: 65 72 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  er.#            
b1a0: 20 20 20 20 70 72 6f 63 65 73 73 2c 20 74 68 65      process, the
b1b0: 72 65 20 69 73 20 61 20 64 61 6e 67 65 72 20 74  re is a danger t
b1c0: 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
b1d0: 6f 63 65 73 73 20 6d 61 79 20 72 6f 6c 6c 0a 23  ocess may roll.#
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 62 61 63 6b 20 74 68 65 20 61 62 6f 72 74 65 64  back the aborted
b200: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
b210: 65 6e 20 63 6f 6e 74 69 6e 75 65 20 63 6f 70 79  en continue copy
b220: 69 6e 67 20 64 61 74 61 0a 23 20 20 20 20 20 20  ing data.#      
b230: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 61            from a
b240: 6e 20 6f 6c 64 65 72 20 74 72 61 6e 73 61 63 74  n older transact
b250: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 6d  ion from the rem
b260: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
b270: 75 72 6e 61 6c 2e 0a 23 20 20 20 20 20 20 20 20  urnal..#        
b280: 20 20 20 20 20 20 20 20 53 65 65 20 74 68 65 20          See the 
b290: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 20 66 75  syncJournal() fu
b2a0: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  nction for detai
b2b0: 6c 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31  ls..#.# pager1-1
b2c0: 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74  3.2.*: Same test
b2d0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
b2e0: 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 74 68 72  . This time, thr
b2f0: 6f 77 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f  ow an index into
b300: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b310: 20 20 74 68 65 20 6d 69 78 20 74 6f 20 6d 61 6b    the mix to mak
b320: 65 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  e the integrity-
b330: 63 68 65 63 6b 20 6d 6f 72 65 20 6c 69 6b 65 6c  check more likel
b340: 79 20 74 6f 20 63 61 74 63 68 0a 23 20 20 20 20  y to catch.#    
b350: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
b360: 72 73 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  rs..#.testvfs tv
b370: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
b380: 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 74 76  cript xSyncCb.tv
b390: 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 70 72   filter xSync.pr
b3a0: 6f 63 20 78 53 79 6e 63 43 62 20 7b 6d 65 74 68  oc xSyncCb {meth
b3b0: 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73  od filename args
b3c0: 7d 20 7b 0a 20 20 73 65 74 20 74 20 5b 66 69 6c  } {.  set t [fil
b3d0: 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65  e tail $filename
b3e0: 5d 0a 20 20 69 66 20 7b 24 74 20 3d 3d 20 22 74  ].  if {$t == "t
b3f0: 65 73 74 2e 64 62 22 7d 20 66 61 75 6c 74 73 69  est.db"} faultsi
b400: 6d 5f 73 61 76 65 0a 20 20 72 65 74 75 72 6e 20  m_save.  return 
b410: 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c  SQLITE_OK.}.faul
b420: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
b430: 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63 20 61  reopen.db func a
b440: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
b450: 0a 0a 23 20 54 68 65 20 55 50 44 41 54 45 20 73  ..# The UPDATE s
b460: 74 61 74 65 6d 65 6e 74 20 61 74 20 74 68 65 20  tatement at the 
b470: 65 6e 64 20 6f 66 20 74 68 69 73 20 74 65 73 74  end of this test
b480: 20 63 61 73 65 20 63 72 65 61 74 65 73 20 61 20   case creates a 
b490: 72 65 61 6c 6c 79 20 62 69 67 0a 23 20 6a 6f 75  really big.# jou
b4a0: 72 6e 61 6c 2e 20 53 69 6e 63 65 20 74 68 65 20  rnal. Since the 
b4b0: 63 61 63 68 65 2d 73 69 7a 65 20 69 73 20 6f 6e  cache-size is on
b4c0: 6c 79 20 31 30 20 70 61 67 65 73 2c 20 74 68 65  ly 10 pages, the
b4d0: 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
b4e0: 73 20 0a 23 20 66 72 65 71 75 65 6e 74 20 6a 6f  s .# frequent jo
b4f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 0a 23  urnal headers..#
b500: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
b510: 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 31 20 7b   pager1-13.1.1 {
b520: 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73  .  PRAGMA page_s
b530: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 50 52  ize = 1024;.  PR
b540: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
b550: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 50  e = PERSIST;.  P
b560: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
b570: 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a   = 10;.  BEGIN;.
b580: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
b590: 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52   t1(a INTEGER PR
b5a0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 42 4c 4f  IMARY KEY, b BLO
b5b0: 42 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  B);.    INSERT I
b5c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55  NTO t1 VALUES(NU
b5d0: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
b5e0: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
b5f0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
b600: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
b610: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
b620: 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a 20 20      /*   2 */.  
b630: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
b640: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
b650: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
b660: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
b670: 20 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45     4 */.    INSE
b680: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
b690: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
b6a0: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
b6b0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38 20 2a          /*   8 *
b6c0: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
b6d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
b6e0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
b6f0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
b700: 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20 20 20    /*  16 */.    
b710: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
b720: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
b730: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
b740: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
b750: 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  32 */.    INSERT
b760: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
b770: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
b780: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
b790: 20 20 20 20 20 20 2f 2a 20 20 36 34 20 2a 2f 0a        /*  64 */.
b7a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b7b0: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
b7c0: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
b7d0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
b7e0: 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 43 4f 4d 4d  /* 128 */.  COMM
b7f0: 49 54 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20  IT;.  UPDATE t1 
b800: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
b810: 28 34 30 30 29 3b 0a 7d 20 7b 70 65 72 73 69 73  (400);.} {persis
b820: 74 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70  t}..if {$::tcl_p
b830: 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d  latform(platform
b840: 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a  )!="windows"} {.
b850: 23 20 52 75 6e 20 74 72 61 6e 73 61 63 74 69 6f  # Run transactio
b860: 6e 73 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67  ns of increasing
b870: 20 73 69 7a 65 73 2e 20 45 76 65 6e 74 75 61 6c   sizes. Eventual
b880: 6c 79 2c 20 6f 6e 65 20 28 6f 72 20 6d 6f 72 65  ly, one (or more
b890: 20 74 68 61 6e 20 6f 6e 65 29 0a 23 20 6f 66 20   than one).# of 
b8a0: 74 68 65 73 65 20 77 69 6c 6c 20 77 72 69 74 65  these will write
b8b0: 20 6a 75 73 74 20 65 6e 6f 75 67 68 20 63 6f 6e   just enough con
b8c0: 74 65 6e 74 20 74 68 61 74 20 6f 6e 65 20 6f 66  tent that one of
b8d0: 20 74 68 65 20 6f 6c 64 20 68 65 61 64 65 72 73   the old headers
b8e0: 20 63 72 65 61 74 65 64 20 0a 23 20 62 79 20 74   created .# by t
b8f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
b900: 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
b910: 65 20 6c 69 65 73 20 69 6d 6d 65 64 69 61 74 65  e lies immediate
b920: 6c 79 20 61 66 74 65 72 20 74 68 65 20 63 6f 6e  ly after the con
b930: 74 65 6e 74 0a 23 20 6a 6f 75 72 6e 61 6c 6c 65  tent.# journalle
b940: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
b950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
b960: 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20  for {set nUp 1} 
b970: 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20  {$nUp<64} {incr 
b980: 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63  nUp} {.  do_exec
b990: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b9a0: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 31 20 7b 20  13.1.2.$nUp.1 { 
b9b0: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
b9c0: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
b9d0: 33 39 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20  399) WHERE a <= 
b9e0: 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  $nUp.  } {}.  do
b9f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
ba00: 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70  ger1-13.1.2.$nUp
ba10: 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  .2 { PRAGMA inte
ba20: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f  grity_check } {o
ba30: 6b 7d 20 0a 0a 20 20 23 20 54 72 79 20 74 6f 20  k} ..  # Try to 
ba40: 61 63 63 65 73 73 20 74 68 65 20 73 6e 61 70 73  access the snaps
ba50: 68 6f 74 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  hot of the file-
ba60: 73 79 73 74 65 6d 2e 0a 20 20 23 0a 20 20 73 71  system..  #.  sq
ba70: 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74 65 73  lite3 db2 sv_tes
ba80: 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 70  t.db.  do_test p
ba90: 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55  ager1-13.1.2.$nU
baa0: 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  p.3 {.    execsq
bab0: 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 6c  l { SELECT sum(l
bac0: 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d 20 74  ength(b)) FROM t
bad0: 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78 70  1 } db2.  } [exp
bae0: 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28 24 6e  r {128*400 - ($n
baf0: 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65 73  Up-1)}].  do_tes
bb00: 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e  t pager1-13.1.2.
bb10: 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65 78 65  $nUp.4 {.    exe
bb20: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  csql { PRAGMA in
bb30: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
bb40: 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64  db2.  } {ok}.  d
bb50: 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a 69 66  b2 close.}.}..if
bb60: 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
bb70: 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69  m(platform)!="wi
bb80: 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 53 61 6d 65  ndows"} {.# Same
bb90: 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2e 20   test as above. 
bba0: 42 75 74 20 74 68 69 73 20 74 69 6d 65 20 77 69  But this time wi
bbb0: 74 68 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74  th an index on t
bbc0: 68 65 20 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65  he table..#.do_e
bbd0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
bbe0: 72 31 2d 31 33 2e 32 2e 31 20 7b 0a 20 20 43 52  r1-13.2.1 {.  CR
bbf0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
bc00: 20 74 31 28 62 29 3b 0a 20 20 55 50 44 41 54 45   t1(b);.  UPDATE
bc10: 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74   t1 SET b = a_st
bc20: 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 7d 0a  ring(400);.} {}.
bc30: 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20  for {set nUp 1} 
bc40: 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20  {$nUp<64} {incr 
bc50: 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63  nUp} {.  do_exec
bc60: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
bc70: 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 31 20 7b 20  13.2.2.$nUp.1 { 
bc80: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
bc90: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
bca0: 33 39 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20  399) WHERE a <= 
bcb0: 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  $nUp.  } {}.  do
bcc0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
bcd0: 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70  ger1-13.2.2.$nUp
bce0: 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  .2 { PRAGMA inte
bcf0: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f  grity_check } {o
bd00: 6b 7d 20 0a 20 20 73 71 6c 69 74 65 33 20 64 62  k} .  sqlite3 db
bd10: 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20 20 64  2 sv_test.db.  d
bd20: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  o_test pager1-13
bd30: 2e 32 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20  .2.2.$nUp.3 {.  
bd40: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
bd50: 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 62 29  CT sum(length(b)
bd60: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
bd70: 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a 34    } [expr {128*4
bd80: 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a  00 - ($nUp-1)}].
bd90: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
bda0: 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 34 20 7b  -13.2.2.$nUp.4 {
bdb0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
bdc0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
bdd0: 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20  check } db2.  } 
bde0: 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65  {ok}.  db2 close
bdf0: 0a 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74  .}.}..db close.t
be00: 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d  v delete..#-----
be10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be50: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63  ----.# Test spec
be60: 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  al "PRAGMA journ
be70: 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 20 74 65 73  al_mode=OFF" tes
be80: 74 20 63 61 73 65 73 2e 0a 23 0a 66 61 75 6c 74  t cases..#.fault
be90: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
bea0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
beb0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e  _test pager1-14.
bec0: 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a  1.1 {.  PRAGMA j
bed0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 4f 46  ournal_mode = OF
bee0: 46 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  F;.  CREATE TABL
bef0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 42 45  E t1(a, b);.  BE
bf00: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
bf10: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
bf20: 2c 20 32 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a  , 2);.  COMMIT;.
bf30: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
bf40: 74 31 3b 0a 7d 20 7b 6f 66 66 20 31 20 32 7d 0a  t1;.} {off 1 2}.
bf50: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
bf60: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 32 20 7b   pager1-14.1.2 {
bf70: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e  .  BEGIN;.    IN
bf80: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
bf90: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 52 4f 4c  UES(3, 4);.  ROL
bfa0: 4c 42 41 43 4b 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a  LBACK;.} {0 {}}.
bfb0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
bfc0: 70 61 67 65 72 31 2d 31 34 2e 31 2e 33 20 7b 0a  pager1-14.1.3 {.
bfd0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
bfe0: 74 31 3b 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 63  t1;.} {1 2}.do_c
bff0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67  atchsql_test pag
c000: 65 72 31 2d 31 34 2e 31 2e 34 20 7b 0a 20 20 42  er1-14.1.4 {.  B
c010: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
c020: 20 49 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20   INTO t1(rowid, 
c030: 61 2c 20 62 29 20 53 45 4c 45 43 54 20 61 2b 33  a, b) SELECT a+3
c040: 2c 20 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a  , b, b FROM t1;.
c050: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
c060: 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20  t1(rowid, a, b) 
c070: 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62  SELECT a+3, b, b
c080: 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b   FROM t1;.} {1 {
c090: 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74  PRIMARY KEY must
c0a0: 20 62 65 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f   be unique}}.do_
c0b0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c0c0: 65 72 31 2d 31 34 2e 31 2e 35 20 7b 0a 20 20 43  er1-14.1.5 {.  C
c0d0: 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20  OMMIT;.  SELECT 
c0e0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20  * FROM t1;.} {1 
c0f0: 32 20 32 20 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  2 2 2}..#-------
c100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c140: 2d 2d 0a 23 20 54 65 73 74 20 6f 70 65 6e 69 6e  --.# Test openin
c150: 67 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  g and closing th
c160: 65 20 70 61 67 65 72 20 73 75 62 2d 73 79 73 74  e pager sub-syst
c170: 65 6d 20 77 69 74 68 20 64 69 66 66 65 72 65 6e  em with differen
c180: 74 20 76 61 6c 75 65 73 0a 23 20 66 6f 72 20 74  t values.# for t
c190: 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 73  he sqlite3_vfs.s
c1a0: 7a 4f 73 46 69 6c 65 20 76 61 72 69 61 62 6c 65  zOsFile variable
c1b0: 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c  ..#.faultsim_del
c1c0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ete_and_reopen.d
c1d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
c1e0: 61 67 65 72 31 2d 31 35 2e 30 20 7b 0a 20 20 43  ager1-15.0 {.  C
c1f0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 78 28 79  REATE TABLE tx(y
c200: 2c 20 7a 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , z);.  INSERT I
c210: 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28 27 41  NTO tx VALUES('A
c220: 79 75 74 74 68 61 79 61 27 2c 20 27 42 65 69 6a  yutthaya', 'Beij
c230: 69 6e 67 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ing');.  INSERT 
c240: 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28 27  INTO tx VALUES('
c250: 4c 6f 6e 64 6f 6e 27 2c 20 27 54 6f 6b 79 6f 27  London', 'Tokyo'
c260: 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65  );.} {}.db close
c270: 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b  .for {set i 0} {
c280: 24 69 3c 35 31 33 7d 20 7b 69 6e 63 72 20 69 20  $i<513} {incr i 
c290: 33 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74  3} {.  testvfs t
c2a0: 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 73 7a  v -default 1 -sz
c2b0: 6f 73 66 69 6c 65 20 24 69 0a 20 20 73 71 6c 69  osfile $i.  sqli
c2c0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
c2d0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
c2e0: 20 70 61 67 65 72 31 2d 31 35 2e 24 69 2e 31 20   pager1-15.$i.1 
c2f0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
c300: 52 4f 4d 20 74 78 3b 0a 20 20 7d 20 7b 41 79 75  ROM tx;.  } {Ayu
c310: 74 74 68 61 79 61 20 42 65 69 6a 69 6e 67 20 4c  tthaya Beijing L
c320: 6f 6e 64 6f 6e 20 54 6f 6b 79 6f 7d 0a 20 20 64  ondon Tokyo}.  d
c330: 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c  b close.  tv del
c340: 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ete.}..#--------
c350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c390: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 69  -.# Check that i
c3a0: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
c3b0: 65 20 74 6f 20 6f 70 65 6e 20 61 20 64 61 74 61  e to open a data
c3c0: 62 61 73 65 20 66 69 6c 65 20 69 66 20 74 68 65  base file if the
c3d0: 20 66 75 6c 6c 20 70 61 74 68 0a 23 20 74 6f 20   full path.# to 
c3e0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a  the associated j
c3f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
c400: 20 62 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20   be longer than 
c410: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
c420: 74 68 6e 61 6d 65 2e 0a 23 0a 74 65 73 74 76 66  thname..#.testvf
c430: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
c440: 74 76 20 73 63 72 69 70 74 20 78 4f 70 65 6e 43  tv script xOpenC
c450: 62 0a 74 76 20 66 69 6c 74 65 72 20 78 4f 70 65  b.tv filter xOpe
c460: 6e 0a 70 72 6f 63 20 78 4f 70 65 6e 43 62 20 7b  n.proc xOpenCb {
c470: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
c480: 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 3a 3a  args} {.  set ::
c490: 66 69 6c 65 5f 6c 65 6e 20 5b 73 74 72 69 6e 67  file_len [string
c4a0: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d   length $filenam
c4b0: 65 5d 0a 7d 0a 73 71 6c 69 74 65 33 20 64 62 20  e].}.sqlite3 db 
c4c0: 74 65 73 74 2e 64 62 0a 64 62 20 63 6c 6f 73 65  test.db.db close
c4d0: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 66 6f 72 20  .tv delete..for 
c4e0: 7b 73 65 74 20 69 69 20 5b 65 78 70 72 20 24 3a  {set ii [expr $:
c4f0: 3a 66 69 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b 24  :file_len-5]} {$
c500: 69 69 20 3c 20 5b 65 78 70 72 20 24 3a 3a 66 69  ii < [expr $::fi
c510: 6c 65 5f 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e 63  le_len+20]} {inc
c520: 72 20 69 69 7d 20 7b 0a 20 20 74 65 73 74 76 66  r ii} {.  testvf
c530: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20  s tv -default 1 
c540: 2d 6d 78 70 61 74 68 6e 61 6d 65 20 24 69 69 0a  -mxpathname $ii.
c550: 0a 20 20 23 20 54 68 65 20 6c 65 6e 67 74 68 20  .  # The length 
c560: 6f 66 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  of the full path
c570: 20 74 6f 20 66 69 6c 65 20 22 74 65 73 74 2e 64   to file "test.d
c580: 62 2d 6a 6f 75 72 6e 61 6c 22 20 69 73 20 28 24  b-journal" is ($
c590: 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a 20  ::file_len+8).. 
c5a0: 20 23 20 49 66 20 74 68 65 20 63 6f 6e 66 69 67   # If the config
c5b0: 75 72 65 64 20 73 71 6c 69 74 65 33 5f 76 66 73  ured sqlite3_vfs
c5c0: 2e 6d 78 50 61 74 68 6e 61 6d 65 20 76 61 6c 75  .mxPathname valu
c5d0: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
c5e0: 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 23 20 74  r equal to.  # t
c5f0: 68 69 73 2c 20 74 68 65 6e 20 74 68 65 20 66 69  his, then the fi
c600: 6c 65 20 63 61 6e 20 62 65 20 6f 70 65 6e 65 64  le can be opened
c610: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
c620: 63 61 6e 6e 6f 74 2e 0a 20 20 23 0a 20 20 69 66  cannot..  #.  if
c630: 20 7b 24 69 69 20 3e 3d 20 5b 65 78 70 72 20 24   {$ii >= [expr $
c640: 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20 7b  ::file_len+8]} {
c650: 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 30 20  .    set res {0 
c660: 7b 7d 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  {}}.  } else {. 
c670: 20 20 20 73 65 74 20 72 65 73 20 7b 31 20 7b 75     set res {1 {u
c680: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
c690: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20  tabase file}}.  
c6a0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
c6b0: 65 72 31 2d 31 36 2e 31 2e 24 69 69 20 7b 0a 20  er1-16.1.$ii {. 
c6c0: 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b     list [catch {
c6d0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
c6e0: 2e 64 62 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a  .db } msg] $msg.
c6f0: 20 20 7d 20 24 72 65 73 0a 0a 20 20 63 61 74 63    } $res..  catc
c700: 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 74  h {db close}.  t
c710: 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d  v delete.}..#---
c720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c760: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50  ------.# Test "P
c770: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
c780: 6f 63 6b 22 2e 20 0a 23 0a 23 20 20 20 70 61 67  ock". .#.#   pag
c790: 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 2a 3a 20  er1-17.$tn.1.*: 
c7a0: 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20 73  Test that if a s
c7b0: 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  econd connection
c7c0: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 0a 23 20   has an open .# 
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61       read-transa
c7f0: 63 74 69 6f 6e 2c 20 69 74 20 69 73 20 6e 6f 74  ction, it is not
c800: 20 75 73 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c   usually possibl
c810: 65 20 74 6f 20 77 72 69 74 65 20 0a 23 20 20 20  e to write .#   
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e     the database.
c840: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 31 37  .#.#   pager1-17
c850: 2e 24 74 6e 2e 32 2e 2a 3a 20 54 65 73 74 20 74  .$tn.2.*: Test t
c860: 68 61 74 20 69 66 20 74 68 65 20 73 65 63 6f 6e  hat if the secon
c870: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  d connection was
c880: 20 6f 70 65 6e 65 64 20 77 69 74 68 0a 23 20 20   opened with.#  
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 4f      the SQLITE_O
c8b0: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61  PEN_READONLY fla
c8c0: 67 2c 20 61 6e 64 20 0a 23 20 20 20 20 20 20 20  g, and .#       
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
c8e0: 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64  PRAGMA omit_read
c8f0: 6c 6f 63 6b 20 3d 20 31 22 20 69 73 20 65 78 65  lock = 1" is exe
c900: 63 75 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  cuted before att
c910: 61 63 68 69 6e 67 0a 23 20 20 20 20 20 20 20 20  aching.#        
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
c930: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6f  e database and o
c940: 70 65 6e 69 6e 67 20 61 20 72 65 61 64 2d 74 72  pening a read-tr
c950: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 69 74 2c  ansaction on it,
c960: 20 69 74 20 69 73 0a 23 20 20 20 20 20 20 20 20   it is.#        
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
c980: 73 73 69 62 6c 65 20 74 6f 20 77 72 69 74 65 20  ssible to write 
c990: 74 68 65 20 64 62 2e 0a 23 0a 23 20 20 20 70 61  the db..#.#   pa
c9a0: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 2a 3a  ger1-17.$tn.3.*:
c9b0: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
c9c0: 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74  e second connect
c9d0: 69 6f 6e 20 77 61 73 20 2a 6e 6f 74 2a 20 6f 70  ion was *not* op
c9e0: 65 6e 65 64 20 77 69 74 68 0a 23 20 20 20 20 20  ened with.#     
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   the SQLITE_OPEN
ca10: 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20  _READONLY flag, 
ca20: 65 78 65 63 75 74 69 6e 67 20 0a 23 20 20 20 20  executing .#    
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72    "PRAGMA omit_r
ca50: 65 61 64 6c 6f 63 6b 20 3d 20 31 22 20 68 61 73  eadlock = 1" has
ca60: 20 6e 6f 20 65 66 66 65 63 74 2e 0a 23 0a 64 6f   no effect..#.do
ca70: 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73  _multiclient_tes
ca80: 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74  t tn {.  do_test
ca90: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31   pager1-17.$tn.1
caa0: 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20  .1 {.    sql1 { 
cab0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
cac0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
cad0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cae0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
caf0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20  .    }.    sql2 
cb00: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
cb10: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
cb20: 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t1;.    }.  }
cb30: 20 7b 31 20 32 7d 0a 20 20 64 6f 5f 74 65 73 74   {1 2}.  do_test
cb40: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31   pager1-17.$tn.1
cb50: 2e 32 20 7b 0a 20 20 20 20 63 73 71 6c 31 20 7b  .2 {.    csql1 {
cb60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
cb70: 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20  VALUES(3, 4) }. 
cb80: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
cb90: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
cba0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
cbb0: 24 74 6e 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71  $tn.1.3 {.    sq
cbc0: 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  l2 { COMMIT }.  
cbd0: 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20    sql1 { INSERT 
cbe0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
cbf0: 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20  , 4) }.  } {}.. 
cc00: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
cc10: 31 37 2e 24 74 6e 2e 32 2e 31 20 7b 0a 20 20 20  17.$tn.2.1 {.   
cc20: 20 63 6f 64 65 32 20 7b 0a 20 20 20 20 20 20 64   code2 {.      d
cc30: 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 73  b2 close.      s
cc40: 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f  qlite3 db2 :memo
cc50: 72 79 3a 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a  ry: -readonly 1.
cc60: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b      }.    sql2 {
cc70: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6f   .      PRAGMA o
cc80: 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31  mit_readlock = 1
cc90: 3b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27  ;.      ATTACH '
cca0: 74 65 73 74 2e 64 62 27 20 41 53 20 74 77 6f 3b  test.db' AS two;
ccb0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
ccc0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
ccd0: 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
cce0: 7b 31 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74  {1 2 3 4}.  do_t
ccf0: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
cd00: 6e 2e 32 2e 32 20 7b 20 73 71 6c 31 20 22 49 4e  n.2.2 { sql1 "IN
cd10: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
cd20: 55 45 53 28 35 2c 20 36 29 22 20 7d 20 7b 7d 0a  UES(5, 6)" } {}.
cd30: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
cd40: 2d 31 37 2e 24 74 6e 2e 32 2e 33 20 7b 20 73 71  -17.$tn.2.3 { sq
cd50: 6c 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  l2 "SELECT * FRO
cd60: 4d 20 74 31 22 20 7d 20 20 20 20 20 20 20 20 20  M t1" }         
cd70: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64     {1 2 3 4}.  d
cd80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37  o_test pager1-17
cd90: 2e 24 74 6e 2e 32 2e 34 20 7b 20 73 71 6c 32 20  .$tn.2.4 { sql2 
cda0: 22 43 4f 4d 4d 49 54 20 3b 20 53 45 4c 45 43 54  "COMMIT ; SELECT
cdb0: 20 2a 20 46 52 4f 4d 20 74 31 22 20 7d 20 20 20   * FROM t1" }   
cdc0: 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 20  {1 2 3 4 5 6}.. 
cdd0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
cde0: 31 37 2e 24 74 6e 2e 33 2e 31 20 7b 0a 20 20 20  17.$tn.3.1 {.   
cdf0: 20 63 6f 64 65 32 20 7b 0a 20 20 20 20 20 20 64   code2 {.      d
ce00: 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 73  b2 close.      s
ce10: 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f  qlite3 db2 :memo
ce20: 72 79 3a 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ry:.    }.    sq
ce30: 6c 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  l2 { .      PRAG
ce40: 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b  MA omit_readlock
ce50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 41 54 54 41   = 1;.      ATTA
ce60: 43 48 20 27 74 65 73 74 2e 64 62 27 20 41 53 20  CH 'test.db' AS 
ce70: 74 77 6f 3b 0a 20 20 20 20 20 20 42 45 47 49 4e  two;.      BEGIN
ce80: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
ce90: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a   FROM t1;.    }.
cea0: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
ceb0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
cec0: 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 32 20 7b 0a  r1-17.$tn.3.2 {.
ced0: 20 20 63 73 71 6c 31 20 7b 20 49 4e 53 45 52 54    csql1 { INSERT
cee0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
cef0: 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b  3, 4) }.  } {1 {
cf00: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
cf10: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ed}}.  do_test p
cf20: 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 33  ager1-17.$tn.3.3
cf30: 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d   { sql2 COMMIT }
cf40: 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   {}.}..#--------
cf50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf90: 2d 0a 23 20 54 65 73 74 20 74 68 65 20 70 61 67  -.# Test the pag
cfa0: 65 72 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 20  ers response to 
cfb0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
cfc0: 20 72 65 71 75 65 73 74 69 6e 67 20 69 6c 6c 65   requesting ille
cfd0: 67 61 6c 20 70 61 67 65 20 0a 23 20 6e 75 6d 62  gal page .# numb
cfe0: 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54 68 65  ers:.#.#   + The
cff0: 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c 0a 23   locking page,.#
d000: 20 20 20 2b 20 50 61 67 65 20 30 2c 0a 23 20 20     + Page 0,.#  
d010: 20 2b 20 41 20 70 61 67 65 20 77 69 74 68 20 61   + A page with a
d020: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
d030: 61 74 65 72 20 74 68 61 6e 20 28 32 5e 33 31 2d  ater than (2^31-
d040: 31 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  1)..#.do_test pa
d050: 67 65 72 31 2d 31 38 2e 31 20 7b 0a 20 20 66 61  ger1-18.1 {.  fa
d060: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
d070: 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
d080: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
d090: 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
d0a0: 20 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67   .    PRAGMA pag
d0b0: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
d0c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d0d0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
d0e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
d0f0: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30  UES(a_string(500
d100: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d110: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
d120: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
d130: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
d140: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
d150: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
d160: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
d170: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
d180: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
d190: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
d1a0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
d1b0: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
d1c0: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
d1d0: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
d1e0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
d1f0: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
d200: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
d210: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
d220: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
d230: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
d240: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
d250: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
d260: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
d270: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
d280: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
d290: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
d2a0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
d2b0: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
d2c0: 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74  ring(200) FROM t
d2d0: 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  1;.  }.} {}.do_t
d2e0: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 32 20  est pager1-18.2 
d2f0: 7b 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62  {.  set root [db
d300: 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f   one "SELECT roo
d310: 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74  tpage FROM sqlit
d320: 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 73 65 74  e_master"].  set
d330: 20 6c 6f 63 6b 69 6e 67 70 61 67 65 20 5b 65 78   lockingpage [ex
d340: 70 72 20 28 30 78 31 30 30 30 30 2f 31 30 32 34  pr (0x10000/1024
d350: 29 20 2b 20 31 5d 0a 20 20 65 78 65 63 73 71 6c  ) + 1].  execsql
d360: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72   {.    PRAGMA wr
d370: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
d380: 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73 71  1;.    UPDATE sq
d390: 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54 20  lite_master SET 
d3a0: 72 6f 6f 74 70 61 67 65 20 3d 20 24 6c 6f 63 6b  rootpage = $lock
d3b0: 69 6e 67 70 61 67 65 3b 0a 20 20 7d 0a 20 20 73  ingpage;.  }.  s
d3c0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
d3d0: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  db.  catchsql { 
d3e0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
d3f0: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20  FROM t1 } db2.} 
d400: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
d410: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
d420: 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65  rmed}}.db2 close
d430: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
d440: 31 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  18.3 {.  execsql
d450: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
d460: 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 49  BLE t2(x);.    I
d470: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
d480: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30  LUES(a_string(50
d490: 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20  00));.  }.  set 
d4a0: 70 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66 69 6c  pgno [expr ([fil
d4b0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20  e size test.db] 
d4c0: 2f 20 31 30 32 34 29 2d 32 5d 0a 20 20 68 65 78  / 1024)-2].  hex
d4d0: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
d4e0: 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29   [expr ($pgno-1)
d4f0: 2a 31 30 32 34 5d 20 30 30 30 30 30 30 30 30 0a  *1024] 00000000.
d500: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
d510: 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c  st.db.  catchsql
d520: 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68   { SELECT length
d530: 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  (x) FROM t2 } db
d540: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
d550: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
d560: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63  alformed}}.db2 c
d570: 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67  lose.do_test pag
d580: 65 72 31 2d 31 38 2e 34 20 7b 0a 20 20 68 65 78  er1-18.4 {.  hex
d590: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
d5a0: 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29   [expr ($pgno-1)
d5b0: 2a 31 30 32 34 5d 20 39 30 30 30 30 30 30 30 0a  *1024] 90000000.
d5c0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
d5d0: 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c  st.db.  catchsql
d5e0: 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68   { SELECT length
d5f0: 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  (x) FROM t2 } 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 35 20 7b 0a 20 20 73 71 6c  er1-18.5 {.  sql
d650: 69 74 65 33 20 64 62 20 22 22 0a 20 20 65 78 65  ite3 db "".  exe
d660: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
d670: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
d680: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
d690: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  LE t2(a, b);.   
d6a0: 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
d6b0: 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  _schema = 1;.   
d6c0: 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 6d   UPDATE sqlite_m
d6d0: 61 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70 61  aster SET rootpa
d6e0: 67 65 3d 35 20 57 48 45 52 45 20 74 62 6c 5f 6e  ge=5 WHERE tbl_n
d6f0: 61 6d 65 20 3d 20 27 74 31 27 3b 0a 20 20 20 20  ame = 't1';.    
d700: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
d710: 73 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  schema = 0;.    
d720: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 31 20 52  ALTER TABLE t1 R
d730: 45 4e 41 4d 45 20 54 4f 20 78 31 3b 0a 20 20 7d  ENAME TO x1;.  }
d740: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d750: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d  LECT * FROM x1 }
d760: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
d770: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
d780: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 20 63 6c 6f  lformed}}.db clo
d790: 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  se..do_test page
d7a0: 72 31 2d 31 38 2e 36 20 7b 0a 20 20 66 61 75 6c  r1-18.6 {.  faul
d7b0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
d7c0: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
d7d0: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
d7e0: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
d7f0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
d800: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
d810: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
d820: 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
d830: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
d840: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
d850: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d860: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
d870: 28 38 30 30 29 29 3b 0a 20 20 7d 0a 0a 20 20 73  (800));.  }..  s
d880: 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20  et root [db one 
d890: 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65  "SELECT rootpage
d8a0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
d8b0: 74 65 72 22 5d 0a 20 20 64 62 20 63 6c 6f 73 65  ter"].  db close
d8c0: 0a 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ..  hexio_write 
d8d0: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
d8e0: 72 6f 6f 74 2d 31 29 2a 31 30 32 34 20 2b 20 38  root-1)*1024 + 8
d8f0: 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 00000000.  sql
d900: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
d910: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
d920: 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46 52  ECT length(x) FR
d930: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 64 61  OM t1 }.} {1 {da
d940: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
d950: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
d960: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
d970: 2d 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  -19.1 {.  sqlite
d980: 33 20 64 62 20 22 22 0a 20 20 64 62 20 66 75 6e  3 db "".  db fun
d990: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
d9a0: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
d9b0: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
d9c0: 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20  size = 512;.    
d9d0: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
d9e0: 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52 45 41  um = 1;.    CREA
d9f0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 61 2c 20  TE TABLE t1(aa, 
da00: 61 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c 20  ab, ac, ad, ae, 
da10: 61 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c 20  af, ag, ah, ai, 
da20: 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20  aj, ak, al, am, 
da30: 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  an,.            
da40: 20 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c 20          ba, bb, 
da50: 62 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c 20  bc, bd, be, bf, 
da60: 62 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20  bg, bh, bi, bj, 
da70: 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a  bk, bl, bm, bn,.
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c 20      ca, cb, cc, 
daa0: 63 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c 20  cd, ce, cf, cg, 
dab0: 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20  ch, ci, cj, ck, 
dac0: 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20  cl, cm, cn,.    
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 64 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c 20  da, db, dc, dd, 
daf0: 64 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c 20  de, df, dg, dh, 
db00: 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20  di, dj, dk, dl, 
db10: 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20 20  dm, dn,.        
db20: 20 20 20 20 20 20 20 20 20 20 20 20 65 61 2c 20              ea, 
db30: 65 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c 20  eb, ec, ed, ee, 
db40: 65 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c 20  ef, eg, eh, ei, 
db50: 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20  ej, ek, el, em, 
db60: 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  en,.            
db70: 20 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c 20          fa, fb, 
db80: 66 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c 20  fc, fd, fe, ff, 
db90: 66 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20  fg, fh, fi, fj, 
dba0: 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a  fk, fl, fm, fn,.
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbc0: 20 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c 20      ga, gb, gc, 
dbd0: 67 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c 20  gd, ge, gf, gg, 
dbe0: 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20  gh, gi, gj, gk, 
dbf0: 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20  gl, gm, gn,.    
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 68 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c 20  ha, hb, hc, hd, 
dc20: 68 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c 20  he, hf, hg, hh, 
dc30: 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20  hi, hj, hk, hl, 
dc40: 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20 20  hm, hn,.        
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 69 61 2c 20              ia, 
dc60: 69 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c 20  ib, ic, id, ie, 
dc70: 69 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c 20  if, ig, ih, ii, 
dc80: 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20  ij, ik, il, im, 
dc90: 69 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ix,.            
dca0: 20 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20          ja, jb, 
dcb0: 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20  jc, jd, je, jf, 
dcc0: 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20  jg, jh, ji, jj, 
dcd0: 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a  jk, jl, jm, jn,.
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20      ka, kb, kc, 
dd00: 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20  kd, ke, kf, kg, 
dd10: 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20  kh, ki, kj, kk, 
dd20: 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20  kl, km, kn,.    
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20  la, lb, lc, ld, 
dd50: 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20  le, lf, lg, lh, 
dd60: 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20  li, lj, lk, ll, 
dd70: 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20  lm, ln,.        
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c 20              ma, 
dd90: 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20  mb, mc, md, me, 
dda0: 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20  mf, mg, mh, mi, 
ddb0: 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20  mj, mk, ml, mm, 
ddc0: 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  mn.    );.    CR
ddd0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 61  EATE TABLE t2(aa
dde0: 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61 65  , ab, ac, ad, ae
ddf0: 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61 69  , af, ag, ah, ai
de00: 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d  , aj, ak, al, am
de10: 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , an,.          
de20: 20 20 20 20 20 20 20 20 20 20 62 61 2c 20 62 62            ba, bb
de30: 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62 66  , bc, bd, be, bf
de40: 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a  , bg, bh, bi, bj
de50: 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e  , bk, bl, bm, bn
de60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
de70: 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63 63        ca, cb, cc
de80: 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63 67  , cd, ce, cf, cg
de90: 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b  , ch, ci, cj, ck
dea0: 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20  , cl, cm, cn,.  
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64 64    da, db, dc, dd
ded0: 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64 68  , de, df, dg, dh
dee0: 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c  , di, dj, dk, dl
def0: 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20  , dm, dn,.      
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 61                ea
df10: 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65 65  , eb, ec, ed, ee
df20: 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65 69  , ef, eg, eh, ei
df30: 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d  , ej, ek, el, em
df40: 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , en,.          
df50: 20 20 20 20 20 20 20 20 20 20 66 61 2c 20 66 62            fa, fb
df60: 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66 66  , fc, fd, fe, ff
df70: 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a  , fg, fh, fi, fj
df80: 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e  , fk, fl, fm, fn
df90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dfa0: 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67 63        ga, gb, gc
dfb0: 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67 67  , gd, ge, gf, gg
dfc0: 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b  , gh, gi, gj, gk
dfd0: 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20  , gl, gm, gn,.  
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68 64    ha, hb, hc, hd
e000: 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68 68  , he, hf, hg, hh
e010: 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c  , hi, hj, hk, hl
e020: 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20  , hm, hn,.      
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 61                ia
e040: 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69 65  , ib, ic, id, ie
e050: 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69 69  , if, ig, ih, ii
e060: 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d  , ij, ik, il, im
e070: 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20 20  , ix,.          
e080: 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a 62            ja, jb
e090: 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66  , jc, jd, je, jf
e0a0: 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a  , jg, jh, ji, jj
e0b0: 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e  , jk, jl, jm, jn
e0c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e0d0: 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63        ka, kb, kc
e0e0: 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67  , kd, ke, kf, kg
e0f0: 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b  , kh, ki, kj, kk
e100: 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20  , kl, km, kn,.  
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64    la, lb, lc, ld
e130: 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68  , le, lf, lg, lh
e140: 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c  , li, lj, lk, ll
e150: 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20  , lm, ln,.      
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
e170: 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65  , mb, mc, md, me
e180: 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69  , mf, mg, mh, mi
e190: 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d  , mj, mk, ml, mm
e1a0: 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20  , mn.    );.    
e1b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61  INSERT INTO t1(a
e1c0: 61 29 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72  a) VALUES( a_str
e1d0: 69 6e 67 28 31 30 30 30 30 30 29 20 29 3b 0a 20  ing(100000) );. 
e1e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e1f0: 32 28 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f  2(aa) VALUES( a_
e200: 73 74 72 69 6e 67 28 31 30 30 30 30 30 29 20 29  string(100000) )
e210: 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20 20  ;.    VACUUM;.  
e220: 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  }.} {}..#-------
e230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e270: 2d 2d 0a 23 20 54 65 73 74 20 61 20 63 6f 75 70  --.# Test a coup
e280: 6c 65 20 6f 66 20 73 70 65 63 69 61 6c 20 63 61  le of special ca
e290: 73 65 73 20 74 68 61 74 20 63 6f 6d 65 20 75 70  ses that come up
e2a0: 20 77 68 69 6c 65 20 63 6f 6d 6d 69 74 74 69 6e   while committin
e2b0: 67 20 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  g .# transaction
e2c0: 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  s:.#.#   pager1-
e2d0: 32 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69  20.1.*: Committi
e2e0: 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ng an in-memory 
e2f0: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
e300: 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 0a 23  tion when the .#
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e    database has n
e330: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
e340: 20 61 74 20 61 6c 6c 2e 0a 23 0a 23 20 20 20 70   at all..#.#   p
e350: 61 67 65 72 31 2d 32 30 2e 32 2e 2a 3a 20 41 73  ager1-20.2.*: As
e360: 20 61 62 6f 76 65 2c 20 62 75 74 20 77 69 74 68   above, but with
e370: 20 61 20 6e 6f 72 6d 61 6c 20 64 62 20 69 6e 20   a normal db in 
e380: 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e  exclusive-lockin
e390: 67 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61  g mode..#.#   pa
e3a0: 67 65 72 31 2d 32 30 2e 33 2e 2a 3a 20 43 6f 6d  ger1-20.3.*: Com
e3b0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
e3c0: 63 74 69 6f 6e 20 69 6e 20 57 41 4c 20 6d 6f 64  ction in WAL mod
e3d0: 65 20 77 68 65 72 65 20 74 68 65 20 64 61 74 61  e where the data
e3e0: 62 61 73 65 20 68 61 73 0a 23 20 20 20 20 20 20  base has.#      
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e              been
e400: 20 6d 6f 64 69 66 69 65 64 2c 20 62 75 74 20 61   modified, but a
e410: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68  ll dirty pages h
e420: 61 76 65 20 62 65 65 6e 20 66 6c 75 73 68 65 64  ave been flushed
e430: 20 74 6f 20 0a 23 20 20 20 20 20 20 20 20 20 20   to .#          
e440: 20 20 20 20 20 20 20 20 64 69 73 6b 20 62 65 66          disk bef
e450: 6f 72 65 20 74 68 65 20 63 6f 6d 6d 69 74 2e 0a  ore the commit..
e460: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
e470: 2d 32 30 2e 31 2e 31 20 7b 0a 20 20 63 61 74 63  -20.1.1 {.  catc
e480: 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 73  h {db close}.  s
e490: 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72  qlite3 db :memor
e4a0: 79 3a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  y:.  execsql {. 
e4b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e4c0: 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29 3b  one(two, three);
e4d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
e4e0: 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27 2c   one VALUES('a',
e4f0: 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a   'b');.  }.} {}.
e500: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
e510: 30 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  0.1.2 {.  execsq
e520: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45 58  l {.    BEGIN EX
e530: 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d  CLUSIVE;.    COM
e540: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  MIT;.  }.} {}..d
e550: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30  o_test pager1-20
e560: 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.1 {.  faultsi
e570: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
e580: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
e590: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
e5a0: 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73  ng_mode = exclus
e5b0: 69 76 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ive;.    PRAGMA 
e5c0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70  journal_mode = p
e5d0: 65 72 73 69 73 74 3b 0a 20 20 20 20 43 52 45 41  ersist;.    CREA
e5e0: 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f  TE TABLE one(two
e5f0: 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e  , three);.    IN
e600: 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41  SERT INTO one VA
e610: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
e620: 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65    }.} {exclusive
e630: 20 70 65 72 73 69 73 74 7d 0a 64 6f 5f 74 65 73   persist}.do_tes
e640: 74 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 32 20  t pager1-20.2.2 
e650: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
e660: 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56    BEGIN EXCLUSIV
e670: 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  E;.    COMMIT;. 
e680: 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62   }.} {}..ifcapab
e690: 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 74 65  le wal {.  do_te
e6a0: 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 31  st pager1-20.3.1
e6b0: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
e6c0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
e6d0: 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20 61 5f  n.    db func a_
e6e0: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
e6f0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
e700: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
e710: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
e720: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
e730: 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20  _mode = wal;.   
e740: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
e750: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
e760: 31 28 78 29 3b 0a 20 20 20 20 20 20 20 20 43 52  1(x);.        CR
e770: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 79 29  EATE TABLE t2(y)
e780: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
e790: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
e7a0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
e7b0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
e7c0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
e7d0: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
e7e0: 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   t1;         /* 
e7f0: 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 49    2 */.        I
e800: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
e810: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
e820: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
e830: 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20      /*   4 */.  
e840: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
e850: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
e860: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
e870: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20  1;         /*   
e880: 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53  8 */.        INS
e890: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
e8a0: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
e8b0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
e8c0: 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20 20 20    /*  16 */.    
e8d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e8e0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
e8f0: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(800) FROM t1;
e900: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32 20           /*  32 
e910: 2a 2f 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  */.      COMMIT;
e920: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d  .    }.  } {wal}
e930: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
e940: 31 2d 32 30 2e 33 2e 32 20 7b 0a 20 20 20 20 65  1-20.3.2 {.    e
e950: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42  xecsql {.      B
e960: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
e970: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
e980: 53 28 27 78 78 78 78 27 29 3b 0a 20 20 20 20 7d  S('xxxx');.    }
e990: 0a 20 20 20 20 72 65 63 75 72 73 69 76 65 5f 73  .    recursive_s
e9a0: 65 6c 65 63 74 20 33 32 20 74 31 0a 20 20 20 20  elect 32 t1.    
e9b0: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20  execsql COMMIT. 
e9c0: 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   } {}.}..#------
e9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea10: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
ea20: 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 20 6d  a WAL database m
ea30: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  ay not be opened
ea40: 20 69 66 3a 0a 23 0a 23 20 20 20 70 61 67 65 72   if:.#.#   pager
ea50: 31 2d 32 31 2e 31 2e 2a 3a 20 54 68 65 20 56 46  1-21.1.*: The VF
ea60: 53 20 68 61 73 20 61 6e 20 69 56 65 72 73 69 6f  S has an iVersio
ea70: 6e 20 6c 65 73 73 20 74 68 61 6e 20 32 2c 20 6f  n less than 2, o
ea80: 72 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e  r.#   pager1-21.
ea90: 32 2e 2a 3a 20 54 68 65 20 56 46 53 20 64 6f 65  2.*: The VFS doe
eaa0: 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 78 53  s not provide xS
eab0: 68 6d 58 58 58 28 29 20 6d 65 74 68 6f 64 73 2e  hmXXX() methods.
eac0: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c  .#.ifcapable wal
ead0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
eae0: 65 72 31 2d 32 31 2e 30 20 7b 0a 20 20 20 20 66  er1-21.0 {.    f
eaf0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
eb00: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 65 78  nd_reopen.    ex
eb10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
eb20: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
eb30: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 43  e = WAL;.      C
eb40: 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28 63  REATE TABLE ko(c
eb50: 20 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c 20   DEFAULT 'abc', 
eb60: 62 20 44 45 46 41 55 4c 54 20 27 64 65 66 27 29  b DEFAULT 'def')
eb70: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
eb80: 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56  NTO ko DEFAULT V
eb90: 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20 20 7d  ALUES;.    }.  }
eba0: 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74   {wal}.  do_test
ebb0: 20 70 61 67 65 72 31 2d 32 31 2e 31 20 7b 0a 20   pager1-21.1 {. 
ebc0: 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 6e     testvfs tv -n
ebd0: 6f 73 68 6d 20 31 0a 20 20 20 20 73 71 6c 69 74  oshm 1.    sqlit
ebe0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d  e3 db2 test.db -
ebf0: 76 66 73 20 74 76 0a 20 20 20 20 63 61 74 63 68  vfs tv.    catch
ec00: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
ec10: 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20 20 7d  ROM ko } db2.  }
ec20: 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f   {1 {unable to o
ec30: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
ec40: 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  e}}.  db2 close.
ec50: 20 20 74 76 20 64 65 6c 65 74 65 0a 20 20 64 6f    tv delete.  do
ec60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e  _test pager1-21.
ec70: 32 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20  2 {.    testvfs 
ec80: 74 76 20 2d 69 76 65 72 73 69 6f 6e 20 31 0a 20  tv -iversion 1. 
ec90: 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74     sqlite3 db2 t
eca0: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20  est.db -vfs tv. 
ecb0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45     catchsql { SE
ecc0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d  LECT * FROM ko }
ecd0: 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75 6e 61   db2.  } {1 {una
ece0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
ecf0: 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 64 62  base file}}.  db
ed00: 32 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c  2 close.  tv del
ed10: 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ete.}..#--------
ed20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed60: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20  -.# Test that a 
ed70: 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63  "PRAGMA wal_chec
ed80: 6b 70 6f 69 6e 74 22 3a 0a 23 0a 23 20 20 20 70  kpoint":.#.#   p
ed90: 61 67 65 72 31 2d 32 32 2e 31 2e 2a 3a 20 69 73  ager1-22.1.*: is
eda0: 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61 20 6e 6f   a no-op on a no
edb0: 6e 2d 57 41 4c 20 64 62 2c 20 61 6e 64 0a 23 20  n-WAL db, and.# 
edc0: 20 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 2a 3a    pager1-22.2.*:
edd0: 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
ede0: 78 53 79 6e 63 20 63 61 6c 6c 73 20 77 69 74 68  xSync calls with
edf0: 20 61 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f   a synchronous=o
ee00: 66 66 20 64 62 2e 0a 23 0a 64 6f 5f 74 65 73 74  ff db..#.do_test
ee10: 20 70 61 67 65 72 31 2d 32 32 2e 31 2e 31 20 7b   pager1-22.1.1 {
ee20: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
ee30: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
ee40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
ee50: 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20  EATE TABLE ko(c 
ee60: 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62  DEFAULT 'abc', b
ee70: 20 44 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b   DEFAULT 'def');
ee80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ee90: 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55   ko DEFAULT VALU
eea0: 45 53 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  ES;.  }.  execsq
eeb0: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
eec0: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 7d 20 7b 30  heckpoint }.} {0
eed0: 20 2d 31 20 2d 31 7d 0a 64 6f 5f 74 65 73 74 20   -1 -1}.do_test 
eee0: 70 61 67 65 72 31 2d 32 32 2e 32 2e 31 20 7b 0a  pager1-22.2.1 {.
eef0: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65    testvfs tv -de
ef00: 66 61 75 6c 74 20 31 0a 20 20 74 76 20 66 69 6c  fault 1.  tv fil
ef10: 74 65 72 20 78 53 79 6e 63 0a 20 20 74 76 20 73  ter xSync.  tv s
ef20: 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 20 20  cript xSyncCb.  
ef30: 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 61 72  proc xSyncCb {ar
ef40: 67 73 7d 20 7b 69 6e 63 72 20 3a 3a 73 79 6e 63  gs} {incr ::sync
ef50: 63 6f 75 6e 74 7d 0a 20 20 73 71 6c 69 74 65 33  count}.  sqlite3
ef60: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 23   db test.db..  #
ef70: 20 53 77 69 74 63 68 20 74 68 65 20 64 62 20 74   Switch the db t
ef80: 6f 20 57 41 4c 20 6d 6f 64 65 2e 20 41 6e 64 20  o WAL mode. And 
ef90: 74 68 65 6e 20 65 78 65 63 75 74 65 20 61 20 53  then execute a S
efa0: 45 4c 45 43 54 20 74 6f 20 6d 61 6b 65 20 73 75  ELECT to make su
efb0: 72 65 0a 20 20 23 20 74 68 61 74 20 74 68 65 20  re.  # that the 
efc0: 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  WAL file is open
efd0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
efe0: 20 6d 61 79 20 63 68 61 6e 67 65 20 74 68 65 20   may change the 
eff0: 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 23 20  synchronous.  # 
f000: 73 65 74 74 69 6e 67 20 69 66 20 44 45 46 41 55  setting if DEFAU
f010: 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56  LT_WAL_SAFETYLEV
f020: 45 4c 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20  EL is defined.. 
f030: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f040: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f050: 20 57 41 4c 20 3b 20 53 45 4c 45 43 54 20 2a 20   WAL ; SELECT * 
f060: 46 52 4f 4d 20 6b 6f 20 7d 0a 0a 20 20 23 20 53  FROM ko }..  # S
f070: 65 74 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  et synchronous=O
f080: 46 46 2e 20 49 6e 73 65 72 74 20 73 6f 6d 65 20  FF. Insert some 
f090: 64 61 74 61 20 61 6e 64 20 72 75 6e 20 61 20 63  data and run a c
f0a0: 68 65 63 6b 70 6f 69 6e 74 2e 20 53 69 6e 63 65  heckpoint. Since
f0b0: 0a 20 20 23 20 73 79 6e 63 3d 6f 66 66 2c 20 74  .  # sync=off, t
f0c0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  his should not c
f0d0: 61 75 73 65 20 61 6e 79 20 63 61 6c 6c 73 20 74  ause any calls t
f0e0: 6f 20 74 68 65 20 78 53 79 6e 63 28 29 20 6d 65  o the xSync() me
f0f0: 74 68 6f 64 2e 0a 20 20 73 65 74 20 3a 3a 73 79  thod..  set ::sy
f100: 6e 63 63 6f 75 6e 74 20 30 0a 20 20 65 78 65 63  nccount 0.  exec
f110: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
f120: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6f   synchronous = o
f130: 66 66 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ff;.    INSERT I
f140: 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56  NTO ko DEFAULT V
f150: 41 4c 55 45 53 3b 0a 20 20 20 20 50 52 41 47 4d  ALUES;.    PRAGM
f160: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
f170: 3b 0a 20 20 7d 0a 20 20 73 65 74 20 73 79 6e 63  ;.  }.  set sync
f180: 63 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d  count.} {0}..#--
f190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1d0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20  -------.# Tests 
f1e0: 66 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a 6f 75  for changing jou
f1f0: 72 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20  rnal mode..#.#  
f200: 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a 3a 20   pager1-23.1.*: 
f210: 54 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 63  Test that when c
f220: 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50 45 52  hanging from PER
f230: 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 6d  SIST to DELETE m
f240: 6f 64 65 2c 0a 23 20 20 20 20 20 20 20 20 20 20  ode,.#          
f250: 20 20 20 20 20 20 20 20 74 68 65 20 6a 6f 75 72          the jour
f260: 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65  nal file is dele
f270: 74 65 64 2e 0a 23 0a 23 20 20 20 70 61 67 65 72  ted..#.#   pager
f280: 31 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74  1-23.2.*: Same t
f290: 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75  est as above, bu
f2a0: 74 20 77 68 69 6c 65 20 61 20 73 68 61 72 65 64  t while a shared
f2b0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20   lock is held.# 
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
f2e0: 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67   file..#.#   pag
f2f0: 65 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d 65  er1-23.3.*: Same
f300: 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20   test as above, 
f310: 62 75 74 20 77 68 69 6c 65 20 61 20 72 65 73 65  but while a rese
f320: 72 76 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c  rved lock is hel
f330: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
f340: 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
f350: 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20  base file..#.#  
f360: 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a 3a 20   pager1-23.4.*: 
f370: 41 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20 77 68  And, for fun, wh
f380: 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65  ile holding an e
f390: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 23  xclusive lock..#
f3a0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 35  .#   pager1-23.5
f3b0: 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 76  .*: Try to set v
f3c0: 61 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74  arious different
f3d0: 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 77   journal modes w
f3e0: 69 74 68 20 61 6e 0a 23 20 20 20 20 20 20 20 20  ith an.#        
f3f0: 20 20 20 20 20 20 20 20 20 20 69 6e 2d 6d 65 6d            in-mem
f400: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6f 6e  ory database (on
f410: 6c 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20 4f 46  ly MEMORY and OF
f420: 46 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a  F should work)..
f430: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e  #.#   pager1-23.
f440: 36 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20  6.*: Try to set 
f450: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
f460: 6d 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d  mal on an in-mem
f470: 6f 72 79 20 64 61 74 61 62 61 73 65 0a 23 20 20  ory database.#  
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 28 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 2d 20  (doesn't work - 
f4a0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
f4b0: 73 65 73 20 61 6c 77 61 79 73 20 75 73 65 0a 23  ses always use.#
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65    locking_mode=e
f4e0: 78 63 6c 75 73 69 76 65 29 2e 0a 23 0a 64 6f 5f  xclusive)..#.do_
f4f0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31  test pager1-23.1
f500: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
f510: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
f520: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
f530: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
f540: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
f550: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
f560: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a  E t1(a, b);.  }.
f570: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
f580: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
f590: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {1}.do_test page
f5a0: 72 31 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 65 78  r1-23.1.2 {.  ex
f5b0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a  ecsql { PRAGMA j
f5c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
f5d0: 4c 45 54 45 20 7d 0a 20 20 66 69 6c 65 20 65 78  LETE }.  file ex
f5e0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
f5f0: 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74  rnal.} {0}..do_t
f600: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e  est pager1-23.2.
f610: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
f620: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
f630: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
f640: 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  T;.    INSERT IN
f650: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 43 61  TO t1 VALUES('Ca
f660: 6e 62 65 72 72 61 27 2c 20 27 41 43 54 27 29 3b  nberra', 'ACT');
f670: 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b  .  }.  db eval {
f680: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
f690: 31 20 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61  1 } {.    db eva
f6a0: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
f6b0: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
f6c0: 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c   }.  }.  execsql
f6d0: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f6e0: 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65  l_mode }.} {dele
f6f0: 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  te}.do_test page
f700: 72 31 2d 32 33 2e 32 2e 32 20 7b 0a 20 20 66 69  r1-23.2.2 {.  fi
f710: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
f720: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
f730: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f740: 32 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  23.3.1 {.  execs
f750: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
f760: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
f770: 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45  ERSIST;.    INSE
f780: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
f790: 53 28 27 44 61 72 77 69 6e 27 2c 20 27 4e 54 27  S('Darwin', 'NT'
f7a0: 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d  );.    BEGIN IMM
f7b0: 45 44 49 41 54 45 3b 0a 20 20 7d 0a 20 20 64 62  EDIATE;.  }.  db
f7c0: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a   eval { PRAGMA j
f7d0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
f7e0: 4c 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c  LETE }.  execsql
f7f0: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f800: 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65  l_mode }.} {dele
f810: 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  te}.do_test page
f820: 72 31 2d 32 33 2e 33 2e 32 20 7b 0a 20 20 66 69  r1-23.3.2 {.  fi
f830: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
f840: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
f850: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f860: 33 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  3.3.3 {.  execsq
f870: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64  l COMMIT.} {}..d
f880: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f890: 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.1 {.  execsql
f8a0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
f8b0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
f8c0: 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54  SIST;.    INSERT
f8d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
f8e0: 27 41 64 65 6c 61 69 64 65 27 2c 20 27 53 41 27  'Adelaide', 'SA'
f8f0: 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43  );.    BEGIN EXC
f900: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 64 62  LUSIVE;.  }.  db
f910: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a   eval { PRAGMA j
f920: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
f930: 4c 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c  LETE }.  execsql
f940: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f950: 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65  l_mode }.} {dele
f960: 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  te}.do_test page
f970: 72 31 2d 32 33 2e 34 2e 32 20 7b 0a 20 20 66 69  r1-23.4.2 {.  fi
f980: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
f990: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
f9a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f9b0: 33 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  3.4.3 {.  execsq
f9c0: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64  l COMMIT.} {}..d
f9d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f9e0: 2e 35 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .5.1 {.  faultsi
f9f0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
fa00: 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62  pen.  sqlite3 db
fa10: 20 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66   :memory:.} {}.f
fa20: 6f 72 65 61 63 68 20 7b 74 6e 20 6d 6f 64 65 20  oreach {tn mode 
fa30: 70 6f 73 73 69 62 6c 65 7d 20 7b 0a 20 20 32 20  possible} {.  2 
fa40: 20 6f 66 66 20 20 20 20 20 20 31 0a 20 20 33 20   off      1.  3 
fa50: 20 6d 65 6d 6f 72 79 20 20 20 31 0a 20 20 34 20   memory   1.  4 
fa60: 20 70 65 72 73 69 73 74 20 20 30 0a 20 20 35 20   persist  0.  5 
fa70: 20 64 65 6c 65 74 65 20 20 20 30 0a 20 20 36 20   delete   0.  6 
fa80: 20 77 61 6c 20 20 20 20 20 20 30 0a 20 20 37 20   wal      0.  7 
fa90: 20 74 72 75 6e 63 61 74 65 20 30 0a 7d 20 7b 0a   truncate 0.} {.
faa0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
fab0: 2d 32 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20 20  -23.5.$tn.1 {.  
fac0: 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
fad0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
fae0: 20 6f 66 66 22 0a 20 20 20 20 65 78 65 63 73 71   off".    execsq
faf0: 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  l "PRAGMA journa
fb00: 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a  l_mode = $mode".
fb10: 20 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c    } [if $possibl
fb20: 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b  e {list $mode} {
fb30: 6c 69 73 74 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f  list off}].  do_
fb40: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35  test pager1-23.5
fb50: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65  .$tn.2 {.    exe
fb60: 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75  csql "PRAGMA jou
fb70: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f  rnal_mode = memo
fb80: 72 79 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ry".    execsql 
fb90: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
fba0: 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20  mode = $mode".  
fbb0: 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20  } [if $possible 
fbc0: 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69  {list $mode} {li
fbd0: 73 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f  st memory}].}.do
fbe0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fbf0: 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.1 {.  execsql 
fc00: 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  {PRAGMA locking_
fc10: 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d  mode = normal}.}
fc20: 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f   {exclusive}.do_
fc30: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
fc40: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
fc50: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
fc60: 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 7d  ode = exclusive}
fc70: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64  .} {exclusive}.d
fc80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
fc90: 2e 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .6.3 {.  execsql
fca0: 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67   {PRAGMA locking
fcb0: 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73  _mode}.} {exclus
fcc0: 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ive}.do_test pag
fcd0: 65 72 31 2d 32 33 2e 36 2e 34 20 7b 0a 20 20 65  er1-23.6.4 {.  e
fce0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6d  xecsql {PRAGMA m
fcf0: 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ain.locking_mode
fd00: 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a  }.} {exclusive}.
fd10: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
fd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f  -----------.#.do
fd60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e  _test pager1-24.
fd70: 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
fd80: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
fd90: 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  en.  db func a_s
fda0: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
fdb0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
fdc0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
fdd0: 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d   = 10;.    PRAGM
fde0: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
fdf0: 46 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54 45  FULL;.    CREATE
fe00: 20 54 41 42 4c 45 20 78 31 28 78 2c 20 79 2c 20   TABLE x1(x, y, 
fe10: 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79  z, PRIMARY KEY(y
fe20: 2c 20 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54  , z));.    CREAT
fe30: 45 20 54 41 42 4c 45 20 78 32 28 78 2c 20 79 2c  E TABLE x2(x, y,
fe40: 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   z, PRIMARY KEY(
fe50: 79 2c 20 7a 29 29 3b 0a 20 20 20 20 49 4e 53 45  y, z));.    INSE
fe60: 52 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45  RT INTO x2 VALUE
fe70: 53 28 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c  S(a_string(400),
fe80: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
fe90: 61 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a  a_string(600));.
fea0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
feb0: 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  x2 SELECT a_stri
fec0: 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(600), a_strin
fed0: 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(400), a_string
fee0: 28 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20  (500) FROM x2;. 
fef0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
ff00: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
ff10: 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(500), a_string
ff20: 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (600), a_string(
ff30: 34 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  400) FROM x2;.  
ff40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
ff50: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
ff60: 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
ff70: 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  500), a_string(6
ff80: 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
ff90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
ffa0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
ffb0: 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34  600), a_string(4
ffc0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30  00), a_string(50
ffd0: 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
ffe0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
fff0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35  ELECT a_string(5
10000 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
10010 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  0), a_string(400
10020 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
10030 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
10040 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30  LECT a_string(40
10050 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
10060 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10070 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
10080 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c  SERT INTO x1 SEL
10090 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20  ECT * FROM x2;. 
100a0 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
100b0 70 61 67 65 72 31 2d 32 34 2e 31 2e 32 20 7b 0a  pager1-24.1.2 {.
100c0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
100d0 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c  BEGIN;.      DEL
100e0 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52  ETE FROM x1 WHER
100f0 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 7d 0a  E rowid<32;.  }.
10100 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65    recursive_sele
10110 63 74 20 36 34 20 78 32 0a 7d 20 7b 7d 0a 64 6f  ct 64 x2.} {}.do
10120 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e  _test pager1-24.
10130 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
10140 7b 20 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  { .      UPDATE 
10150 78 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72  x1 SET z = a_str
10160 69 6e 67 28 33 30 30 29 20 57 48 45 52 45 20 72  ing(300) WHERE r
10170 6f 77 69 64 3e 34 30 3b 0a 20 20 20 20 43 4f 4d  owid>40;.    COM
10180 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  MIT;.    PRAGMA 
10190 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
101a0 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
101b0 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20  t(*) FROM x1;.  
101c0 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f  }.} {ok 33}..do_
101d0 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
101e0 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
101f0 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
10200 20 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x1;.    INSERT 
10210 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a  INTO x1 SELECT *
10220 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 42 45   FROM x2;.    BE
10230 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  GIN;.      DELET
10240 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20  E FROM x1 WHERE 
10250 72 6f 77 69 64 3c 33 32 3b 0a 20 20 20 20 20 20  rowid<32;.      
10260 55 50 44 41 54 45 20 78 31 20 53 45 54 20 7a 20  UPDATE x1 SET z 
10270 3d 20 61 5f 73 74 72 69 6e 67 28 32 39 39 29 20  = a_string(299) 
10280 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a  WHERE rowid>40;.
10290 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f    }.  recursive_
102a0 73 65 6c 65 63 74 20 36 34 20 78 32 20 7b 64 62  select 64 x2 {db
102b0 20 65 76 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20 20   eval COMMIT}.  
102c0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
102d0 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
102e0 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54  heck;.    SELECT
102f0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78   count(*) FROM x
10300 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d  1;.  }.} {ok 33}
10310 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
10320 2d 32 34 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63  -24.1.5 {.  exec
10330 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
10340 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e   FROM x1;.    IN
10350 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c  SERT INTO x1 SEL
10360 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20  ECT * FROM x2;. 
10370 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73   }.  recursive_s
10380 65 6c 65 63 74 20 36 34 20 78 32 20 7b 20 64 62  elect 64 x2 { db
10390 20 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41   eval {CREATE TA
103a0 42 4c 45 20 78 33 28 78 2c 20 79 2c 20 7a 29 7d  BLE x3(x, y, z)}
103b0 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   }.  execsql { S
103c0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 33 20  ELECT * FROM x3 
103d0 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  }.} {}..#-------
103e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10420 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  --.#.do_test pag
10430 65 72 31 2d 32 35 2d 31 20 7b 0a 20 20 66 61 75  er1-25-1 {.  fau
10440 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
10450 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
10460 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
10470 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61       SAVEPOINT a
10480 62 63 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  bc;.        CREA
10490 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
104a0 29 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43  );.      ROLLBAC
104b0 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f  K TO abc;.    CO
104c0 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63  MMIT;.  }.  db c
104d0 6c 6f 73 65 0a 7d 20 7b 7d 0a 62 72 65 61 6b 70  lose.} {}.breakp
104e0 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20 70 61 67  oint.do_test pag
104f0 65 72 31 2d 32 35 2d 32 20 7b 0a 20 20 66 61 75  er1-25-2 {.  fau
10500 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
10510 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
10520 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  l {.    SAVEPOIN
10530 54 20 61 62 63 3b 0a 20 20 20 20 20 20 43 52 45  T abc;.      CRE
10540 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
10550 62 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  b);.    ROLLBACK
10560 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d   TO abc;.    COM
10570 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c  MIT;.  }.  db cl
10580 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  ose.} {}..#-----
10590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105d0 2d 2d 2d 2d 0a 23 20 53 65 63 74 6f 72 2d 73 69  ----.# Sector-si
105e0 7a 65 20 74 65 73 74 73 2e 0a 23 0a 64 6f 5f 74  ze tests..#.do_t
105f0 65 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31 20  est pager1-26.1 
10600 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d  {.  testvfs tv -
10610 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 73  default 1.  tv s
10620 65 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 20  ectorsize 4096. 
10630 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
10640 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62  _and_reopen.  db
10650 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
10660 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
10670 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
10680 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a  age_size = 512;.
10690 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
106a0 20 74 62 6c 28 61 20 50 52 49 4d 41 52 59 20 4b   tbl(a PRIMARY K
106b0 45 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20  EY, b UNIQUE);. 
106c0 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
106d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
106e0 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
106f0 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
10700 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  0));.      INSER
10710 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
10720 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
10730 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
10740 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
10750 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
10760 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
10770 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10780 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
10790 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
107a0 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
107b0 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
107c0 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
107d0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
107e0 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72  tbl SELECT a_str
107f0 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
10800 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b  g(600) FROM tbl;
10810 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10820 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f  TO tbl SELECT a_
10830 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
10840 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74  ring(600) FROM t
10850 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bl;.      INSERT
10860 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
10870 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
10880 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
10890 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
108a0 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
108b0 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
108c0 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
108d0 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 43 4f  FROM tbl;.    CO
108e0 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  MMIT;.  }.} {}.d
108f0 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
10900 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20 55  ager1-26.1 {.  U
10910 50 44 41 54 45 20 74 62 6c 20 53 45 54 20 62 20  PDATE tbl SET b 
10920 3d 20 61 5f 73 74 72 69 6e 67 28 35 35 30 29 3b  = a_string(550);
10930 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74  .} {}.db close.t
10940 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d  v delete..#-----
10950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10990 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ----.#.do_test p
109a0 61 67 65 72 31 2e 32 37 2e 31 20 7b 0a 20 20 66  ager1.27.1 {.  f
109b0 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
109c0 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69  nd_reopen.  sqli
109d0 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  te3_pager_refcou
109e0 6e 74 73 20 64 62 0a 20 20 65 78 65 63 73 71 6c  nts db.  execsql
109f0 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
10a00 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
10a10 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20   t1(a, b);.  }. 
10a20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72   sqlite3_pager_r
10a30 65 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65 78  efcounts db.  ex
10a40 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  ecsql COMMIT.} {
10a50 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
10a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
10aa0 54 65 73 74 20 74 68 61 74 20 61 74 74 65 6d 70  Test that attemp
10ab0 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20 61 20 77  ting to open a w
10ac0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10ad0 20 77 69 74 68 20 0a 23 20 6c 6f 63 6b 69 6e 67   with .# locking
10ae0 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
10af0 69 6e 20 57 41 4c 20 6d 6f 64 65 20 66 61 69 6c  in WAL mode fail
10b00 73 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  s if there are o
10b10 74 68 65 72 20 63 6c 69 65 6e 74 73 20 6f 6e 20  ther clients on 
10b20 0a 23 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  .# the same data
10b30 62 61 73 65 2e 0a 23 0a 63 61 74 63 68 20 7b 20  base..#.catch { 
10b40 64 62 20 63 6c 6f 73 65 20 7d 0a 69 66 63 61 70  db close }.ifcap
10b50 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f  able wal {.  do_
10b60 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
10b70 20 74 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73   tn {.    do_tes
10b80 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10b90 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b  1 {.      sql1 {
10ba0 20 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41   .        PRAGMA
10bb0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
10bc0 57 41 4c 3b 0a 20 20 20 20 20 20 20 20 43 52 45  WAL;.        CRE
10bd0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
10be0 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  b);.        INSE
10bf0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
10c00 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20  S('a', 'b');.   
10c10 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d     }.    } {wal}
10c20 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
10c30 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 73  er1-28.$tn.2 { s
10c40 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
10c50 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 61 20 62 7d  ROM t1 } } {a b}
10c60 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  ..    do_test pa
10c70 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20  ger1-28.$tn.3 { 
10c80 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f  sql1 { PRAGMA lo
10c90 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
10ca0 73 69 76 65 20 7d 20 7d 20 7b 65 78 63 6c 75 73  sive } } {exclus
10cb0 69 76 65 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  ive}.    do_test
10cc0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34   pager1-28.$tn.4
10cd0 20 7b 20 0a 20 20 20 20 20 20 63 73 71 6c 31 20   { .      csql1 
10ce0 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20  { BEGIN; INSERT 
10cf0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
10d00 63 27 2c 20 27 64 27 29 3b 20 7d 0a 20 20 20 20  c', 'd'); }.    
10d10 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
10d20 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 20 20 63  s locked}}.    c
10d30 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73 65  ode2 { db2 close
10d40 20 3b 20 73 71 6c 69 74 65 33 20 64 62 32 20 74   ; sqlite3 db2 t
10d50 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 64 6f 5f  est.db }.    do_
10d60 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10d70 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 73 71  tn.4 { .      sq
10d80 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l1 { INSERT INTO
10d90 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20   t1 VALUES('c', 
10da0 27 64 27 29 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20  'd'); COMMIT }. 
10db0 20 20 20 7d 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23     } {}.  }.}..#
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 2d 2d 0a 23 20 4e 6f 72 6d  ---------.# Norm
10e10 61 6c 6c 79 2c 20 77 68 65 6e 20 63 68 61 6e 67  ally, when chang
10e20 69 6e 67 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ing from journal
10e30 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 74 6f  _mode=PERSIST to
10e40 20 44 45 4c 45 54 45 20 74 68 65 20 70 61 67 65   DELETE the page
10e50 72 0a 23 20 61 74 74 65 6d 70 74 73 20 74 6f 20  r.# attempts to 
10e60 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
10e70 61 6c 20 66 69 6c 65 2e 20 48 6f 77 65 76 65 72  al file. However
10e80 2c 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 20 6f  , if it cannot o
10e90 62 74 61 69 6e 20 61 0a 23 20 52 45 53 45 52 56  btain a.# RESERV
10ea0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
10eb0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
10ec0 69 73 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  is step is skipp
10ed0 65 64 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c  ed..#.do_multicl
10ee0 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20  ient_test tn {. 
10ef0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10f00 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73  28.$tn.1 {.    s
10f10 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41  ql1 { .      PRA
10f20 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
10f30 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
10f40 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
10f50 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49  1(a, b);.      I
10f60 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
10f70 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
10f80 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69      }.  } {persi
10f90 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  st}.  do_test pa
10fa0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20  ger1-28.$tn.2 { 
10fb0 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
10fc0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a  .db-journal } 1.
10fd0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10fe0 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31  -28.$tn.3 { sql1
10ff0 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
11000 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
11010 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f  } } delete.  do_
11020 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11030 74 6e 2e 34 20 7b 20 66 69 6c 65 20 65 78 69 73  tn.4 { file exis
11040 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
11050 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73  al } 0..  do_tes
11060 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11070 35 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a  5 {.    sql1 { .
11080 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
11090 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
110a0 49 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  IST;.      INSER
110b0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
110c0 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20  ('c', 'd');.    
110d0 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a  }.  } {persist}.
110e0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
110f0 2d 32 38 2e 24 74 6e 2e 36 20 7b 20 66 69 6c 65  -28.$tn.6 { file
11100 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
11110 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f  journal } 1.  do
11120 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11130 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32  $tn.7 {.    sql2
11140 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54   { BEGIN; INSERT
11150 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
11160 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d  'e', 'f'); }.  }
11170 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
11180 67 65 72 31 2d 32 38 2e 24 74 6e 2e 38 20 20 7b  ger1-28.$tn.8  {
11190 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
111a0 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
111b0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
111c0 31 2d 32 38 2e 24 74 6e 2e 39 20 20 7b 20 73 71  1-28.$tn.9  { sq
111d0 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  l1 { PRAGMA jour
111e0 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
111f0 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64  E } } delete.  d
11200 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11210 2e 24 74 6e 2e 31 30 20 7b 20 66 69 6c 65 20 65  .$tn.10 { file e
11220 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
11230 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f  urnal } 1..  do_
11240 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11250 74 6e 2e 31 31 20 7b 20 73 71 6c 32 20 43 4f 4d  tn.11 { sql2 COM
11260 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  MIT } {}.  do_te
11270 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11280 2e 31 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .12 { file exist
11290 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
112a0 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 0..  do_test
112b0 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31   pager1-28-$tn.1
112c0 33 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b 20  3 {.    code1 { 
112d0 73 65 74 20 63 68 61 6e 6e 65 6c 20 5b 64 62 20  set channel [db 
112e0 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e  incrblob -readon
112f0 6c 79 20 74 31 20 61 20 32 5d 20 7d 0a 20 20 20  ly t1 a 2] }.   
11300 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50 52   sql1 {.      PR
11310 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
11320 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
11330 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11340 31 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68  1 VALUES('g', 'h
11350 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70  ');.    }.  } {p
11360 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73  ersist}.  do_tes
11370 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11380 31 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  14 { file exists
11390 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
113a0 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70   } 1.  do_test p
113b0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 35 20  ager1-28.$tn.15 
113c0 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47  {.    sql2 { BEG
113d0 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  IN; INSERT INTO 
113e0 74 31 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27  t1 VALUES('e', '
113f0 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  f'); }.  } {}.  
11400 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11410 38 2e 24 74 6e 2e 31 36 20 7b 20 73 71 6c 31 20  8.$tn.16 { sql1 
11420 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
11430 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d  _mode = DELETE }
11440 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74   } delete.  do_t
11450 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
11460 6e 2e 31 37 20 7b 20 66 69 6c 65 20 65 78 69 73  n.17 { file exis
11470 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
11480 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73  al } 1..  do_tes
11490 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
114a0 31 37 20 7b 20 63 73 71 6c 32 20 7b 20 43 4f 4d  17 { csql2 { COM
114b0 4d 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61  MIT } } {1 {data
114c0 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
114d0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
114e0 31 2d 32 38 2d 24 74 6e 2e 31 38 20 7b 20 63 6f  1-28-$tn.18 { co
114f0 64 65 31 20 7b 20 72 65 61 64 20 24 63 68 61 6e  de1 { read $chan
11500 6e 65 6c 20 7d 20 7d 20 63 0a 20 20 64 6f 5f 74  nel } } c.  do_t
11510 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74  est pager1-28-$t
11520 6e 2e 31 39 20 7b 20 63 6f 64 65 31 20 7b 20 63  n.19 { code1 { c
11530 6c 6f 73 65 20 24 63 68 61 6e 6e 65 6c 20 7d 20  lose $channel } 
11540 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
11550 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 30 20  ager1-28.$tn.20 
11560 7b 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20  { sql2 { COMMIT 
11570 7d 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73  } } {}.}..do_tes
11580 74 20 70 61 67 65 72 31 2d 32 39 2e 31 20 7b 0a  t pager1-29.1 {.
11590 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
115a0 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
115b0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
115c0 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
115d0 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41  1024;.    PRAGMA
115e0 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 66   auto_vacuum = f
115f0 75 6c 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ull;.    PRAGMA 
11600 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
11610 6c 75 73 69 76 65 3b 0a 20 20 20 20 43 52 45 41  lusive;.    CREA
11620 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
11630 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11640 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
11650 32 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  2);.  }.  file s
11660 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65  ize test.db.} [e
11670 78 70 72 20 31 30 32 34 2a 33 5d 0a 64 6f 5f 74  xpr 1024*3].do_t
11680 65 73 74 20 70 61 67 65 72 31 2d 32 39 2e 32 20  est pager1-29.2 
11690 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
116a0 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
116b0 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 56  ze = 4096;.    V
116c0 41 43 55 55 4d 3b 0a 20 20 7d 0a 20 20 66 69 6c  ACUUM;.  }.  fil
116d0 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d  e size test.db.}
116e0 20 5b 65 78 70 72 20 34 30 39 36 2a 33 5d 0a 0a   [expr 4096*3]..
116f0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
11700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
11740 74 20 74 68 61 74 20 69 66 20 61 6e 20 65 6d 70  t that if an emp
11750 74 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ty database file
11760 20 28 73 69 7a 65 20 30 20 62 79 74 65 73 29 20   (size 0 bytes) 
11770 69 73 20 6f 70 65 6e 65 64 20 69 6e 20 0a 23 20  is opened in .# 
11780 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e  exclusive-lockin
11790 67 20 6d 6f 64 65 2c 20 61 6e 79 20 6a 6f 75 72  g mode, any jour
117a0 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65  nal file is dele
117b0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
117c0 65 2d 73 79 73 74 65 6d 0a 23 20 77 69 74 68 6f  e-system.# witho
117d0 75 74 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ut being rolled 
117e0 62 61 63 6b 2e 20 41 6e 64 20 74 68 61 74 20 74  back. And that t
117f0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
11800 20 6f 62 74 61 69 6e 65 64 20 77 68 69 6c 65 0a   obtained while.
11810 23 20 64 6f 69 6e 67 20 74 68 69 73 20 69 73 20  # doing this is 
11820 6e 6f 74 20 72 65 6c 65 61 73 65 64 2e 0a 23 0a  not released..#.
11830 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  do_test pager1-3
11840 30 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  0.1 {.  db close
11850 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74  .  delete_file t
11860 65 73 74 2e 64 62 0a 20 20 64 65 6c 65 74 65 5f  est.db.  delete_
11870 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  file test.db-jou
11880 72 6e 61 6c 0a 20 20 73 65 74 20 66 64 20 5b 6f  rnal.  set fd [o
11890 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  pen test.db-jour
118a0 6e 61 6c 20 77 5d 0a 20 20 73 65 65 6b 20 24 66  nal w].  seek $f
118b0 64 20 5b 65 78 70 72 20 35 31 32 2b 31 30 33 32  d [expr 512+1032
118c0 2a 32 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65  *2].  puts -none
118d0 77 6c 69 6e 65 20 24 66 64 20 78 0a 20 20 63 6c  wline $fd x.  cl
118e0 6f 73 65 20 24 66 64 0a 0a 20 20 73 71 6c 69 74  ose $fd..  sqlit
118f0 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
11900 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
11910 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
11920 65 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  e=EXCLUSIVE;.   
11930 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
11940 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
11950 74 65 72 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ter;.    PRAGMA 
11960 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d  lock_status;.  }
11970 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 30 20  .} {exclusive 0 
11980 6d 61 69 6e 20 72 65 73 65 72 76 65 64 20 74 65  main reserved te
11990 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 23 2d 2d 2d  mp closed}..#---
119a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119e0 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
119f0 61 74 20 69 66 20 74 68 65 20 22 70 61 67 65 2d  at if the "page-
11a00 73 69 7a 65 22 20 66 69 65 6c 64 20 69 6e 20 61  size" field in a
11a10 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
11a20 69 73 20 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  is 0, the journa
11a30 6c 0a 23 20 66 69 6c 65 20 63 61 6e 20 73 74 69  l.# file can sti
11a40 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
11a50 6b 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  k. This is requi
11a60 72 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64  red for backward
11a70 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
11a80 0a 23 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  .# versions of S
11a90 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33  QLite prior to 3
11aa0 2e 35 2e 38 20 61 6c 77 61 79 73 20 73 65 74 20  .5.8 always set 
11ab0 74 68 69 73 20 66 69 65 6c 64 20 74 6f 20 7a 65  this field to ze
11ac0 72 6f 2e 0a 23 0a 69 66 20 7b 24 74 63 6c 5f 70  ro..#.if {$tcl_p
11ad0 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d  latform(platform
11ae0 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 64 6f 5f  )=="unix"} {.do_
11af0 74 65 73 74 20 70 61 67 65 72 31 2d 33 31 2e 31  test pager1-31.1
11b00 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
11b10 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
11b20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
11b30 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
11b40 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47  e = 10;.    PRAG
11b50 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
11b60 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20  024;.    CREATE 
11b70 54 41 42 4c 45 20 74 31 28 78 2c 20 79 2c 20 55  TABLE t1(x, y, U
11b80 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
11b90 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11ba0 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
11bb0 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
11bc0 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20  blob(1500));.   
11bd0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11be0 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
11bf0 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11c00 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
11c10 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
11c20 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
11c30 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
11c40 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
11c50 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
11c60 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11c70 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
11c80 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
11c90 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
11ca0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11cb0 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
11cc0 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11cd0 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
11ce0 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
11cf0 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
11d00 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
11d10 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11d20 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
11d30 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
11d40 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
11d50 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11d60 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
11d70 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11d80 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
11d90 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
11da0 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
11db0 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
11dc0 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
11dd0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11de0 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
11df0 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
11e00 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11e10 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
11e20 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11e30 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
11e40 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
11e50 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
11e60 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
11e70 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
11e80 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 47  FROM t1;.    BEG
11e90 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  IN;.      UPDATE
11ea0 20 74 31 20 53 45 54 20 79 20 3d 20 72 61 6e 64   t1 SET y = rand
11eb0 6f 6d 62 6c 6f 62 28 31 34 39 39 29 3b 0a 20 20  omblob(1499);.  
11ec0 7d 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65  }.  copy_file te
11ed0 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a 20  st.db test.db2. 
11ee0 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e   copy_file test.
11ef0 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e  db-journal test.
11f00 64 62 32 2d 6a 6f 75 72 6e 61 6c 0a 20 20 0a 20  db2-journal.  . 
11f10 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
11f20 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 32 34  t.db2-journal 24
11f30 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69   00000000.  sqli
11f40 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32  te3 db2 test.db2
11f50 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
11f60 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
11f70 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d  eck } db2.} {ok}
11f80 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
11f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
11fd0 20 54 65 73 74 20 74 68 61 74 20 61 20 64 61 74   Test that a dat
11fe0 61 62 61 73 65 20 66 69 6c 65 20 63 61 6e 20 62  abase file can b
11ff0 65 20 22 70 72 65 2d 68 69 6e 74 65 64 22 20 74  e "pre-hinted" t
12000 6f 20 61 20 63 65 72 74 61 69 6e 20 73 69 7a 65  o a certain size
12010 20 61 6e 64 20 74 68 61 74 0a 23 20 73 75 62 73   and that.# subs
12020 65 71 75 65 6e 74 20 73 70 69 6c 6c 69 6e 67 20  equent spilling 
12030 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63  of the pager cac
12040 68 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 75  he does not resu
12050 6c 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  lt in the databa
12060 73 65 0a 23 20 66 69 6c 65 20 62 65 69 6e 67 20  se.# file being 
12070 73 68 72 75 6e 6b 2e 0a 23 0a 63 61 74 63 68 20  shrunk..#.catch 
12080 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72 63 65  {db close}.force
12090 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 0a  delete test.db..
120a0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  do_test pager1-3
120b0 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  2.1 {.  sqlite3 
120c0 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
120d0 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
120e0 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29  E TABLE t1(x, y)
120f0 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
12100 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
12110 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
12120 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
12130 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
12140 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d  VALUES(1, random
12150 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20  blob(10000));.  
12160 7d 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  }.  file_control
12170 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 64  _sizehint_test d
12180 62 20 6d 61 69 6e 20 32 30 39 37 31 35 32 30 3b  b main 20971520;
12190 20 23 20 32 30 4d 42 0a 20 20 65 78 65 63 73 71   # 20MB.  execsq
121a0 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
121b0 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
121c0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
121d0 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
121e0 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b  domblob(10000));
121f0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12200 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61   t1 VALUES(2, ra
12210 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29  ndomblob(10000))
12220 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12230 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 32 2c  O t1 SELECT x+2,
12240 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
12250 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20  0) from t1;.    
12260 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12270 45 4c 45 43 54 20 78 2b 34 2c 20 72 61 6e 64 6f  ELECT x+4, rando
12280 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f  mblob(10000) fro
12290 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  m t1;.    INSERT
122a0 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
122b0 78 2b 38 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  x+8, randomblob(
122c0 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a  10000) from t1;.
122d0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
122e0 74 31 20 53 45 4c 45 43 54 20 78 2b 31 36 2c 20  t1 SELECT x+16, 
122f0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30  randomblob(10000
12300 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 53  ) from t1;.    S
12310 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
12320 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d  ROM t1;.    COMM
12330 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f  IT;.  }.  db clo
12340 73 65 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74  se.  file size t
12350 65 73 74 2e 64 62 0a 7d 20 7b 32 30 39 37 31 35  est.db.} {209715
12360 32 30 7d 0a 0a 23 20 43 6c 65 61 6e 75 70 20 32  20}..# Cleanup 2
12370 30 4d 42 20 66 69 6c 65 20 6c 65 66 74 20 62 79  0MB file left by
12380 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
12390 73 74 2e 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  st..forcedelete 
123a0 74 65 73 74 2e 64 62 0a 0a 66 69 6e 69 73 68 5f  test.db..finish_
123b0 74 65 73 74 0a                                   test.