/ Hex Artifact Content
Login

Artifact 0b5d05d5fc747e10eb2b216b3236b617951fa9cb:


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 0a 20 20 23 20 54  MMIT;.  }..  # T
7980: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
7990: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
79a0: 6f 77 3a 0a 20 20 23 20 0a 20 20 23 20 20 20 31  ow:.  # .  #   1
79b0: 29 20 35 31 32 20 62 79 74 65 20 68 65 61 64 65  ) 512 byte heade
79c0: 72 20 2b 0a 20 20 23 20 20 20 32 29 20 32 20 2a  r +.  #   2) 2 *
79d0: 20 28 31 30 32 34 2b 38 29 20 62 79 74 65 20 72   (1024+8) byte r
79e0: 65 63 6f 72 64 73 20 2b 0a 20 20 23 20 20 20 33  ecords +.  #   3
79f0: 29 20 32 30 2b 4e 20 62 79 74 65 73 20 6f 66 20  ) 20+N bytes of 
7a00: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
7a10: 6f 69 6e 74 65 72 2c 20 77 68 65 72 65 20 4e 20  ointer, where N 
7a20: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 0a  is the size of .
7a30: 20 20 23 20 20 20 20 20 20 74 68 65 20 6d 61 73    #      the mas
7a40: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
7a50: 20 65 6e 63 6f 64 65 64 20 61 73 20 75 74 66 2d   encoded as utf-
7a60: 38 20 77 69 74 68 20 6e 6f 20 6e 75 6c 20 74 65  8 with no nul te
7a70: 72 6d 2e 0a 20 20 23 0a 20 20 73 65 74 20 6d 6a  rm..  #.  set mj
7a80: 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b  _pointer [expr {
7a90: 0a 20 20 20 20 32 30 20 2b 20 5b 73 74 72 69 6e  .    20 + [strin
7aa0: 67 20 6c 65 6e 67 74 68 20 5b 70 77 64 5d 5d 20  g length [pwd]] 
7ab0: 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  + [string length
7ac0: 20 22 2f 74 65 73 74 2e 64 62 2d 6d 6a 58 58 58   "/test.db-mjXXX
7ad0: 58 58 58 39 58 58 22 5d 0a 20 20 7d 5d 0a 20 20  XXX9XX"].  }].  
7ae0: 65 78 70 72 20 7b 24 3a 3a 6d 61 78 5f 6a 6f 75  expr {$::max_jou
7af0: 72 6e 61 6c 3d 3d 28 35 31 32 2b 32 2a 28 31 30  rnal==(512+2*(10
7b00: 32 34 2b 38 29 2b 24 6d 6a 5f 70 6f 69 6e 74 65  24+8)+$mj_pointe
7b10: 72 29 7d 0a 7d 20 31 0a 64 6f 5f 74 65 73 74 20  r)}.} 1.do_test 
7b20: 70 61 67 65 72 31 2d 35 2e 34 2e 32 20 7b 0a 20  pager1-5.4.2 {. 
7b30: 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e   set ::max_journ
7b40: 61 6c 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b  al 0.  execsql {
7b50: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
7b60: 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a  hronous = full;.
7b70: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
7b80: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
7b90: 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e  WHERE b = 'Lenin
7ba0: 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  ';.      DELETE 
7bb0: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20  FROM t2 WHERE b 
7bc0: 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 43  = 'Lenin';.    C
7bd0: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 23 20  OMMIT;.  }..  # 
7be0: 49 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66  In synchronous=f
7bf0: 75 6c 6c 20 6d 6f 64 65 2c 20 74 68 65 20 6d 61  ull mode, the ma
7c00: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
7c10: 6e 74 65 72 20 69 73 20 6e 6f 74 20 77 72 69 74  nter is not writ
7c20: 74 65 6e 0a 20 20 23 20 64 69 72 65 63 74 6c 79  ten.  # directly
7c30: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
7c40: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
7c50: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 73 74  urnal file. Inst
7c60: 65 61 64 2c 20 69 74 20 69 73 0a 20 20 23 20 77  ead, it is.  # w
7c70: 72 69 74 74 65 6e 20 73 74 61 72 74 69 6e 67 20  ritten starting 
7c80: 61 74 20 74 68 65 20 6e 65 78 74 20 28 69 6e 20  at the next (in 
7c90: 74 68 69 73 20 63 61 73 65 20 35 31 32 20 62 79  this case 512 by
7ca0: 74 65 29 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  te) sector bound
7cb0: 61 72 79 2e 0a 20 20 23 0a 20 20 73 65 74 20 6d  ary..  #.  set m
7cc0: 6a 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20  j_pointer [expr 
7cd0: 7b 0a 20 20 20 20 32 30 20 2b 20 5b 73 74 72 69  {.    20 + [stri
7ce0: 6e 67 20 6c 65 6e 67 74 68 20 5b 70 77 64 5d 5d  ng length [pwd]]
7cf0: 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   + [string lengt
7d00: 68 20 22 2f 74 65 73 74 2e 64 62 2d 6d 6a 58 58  h "/test.db-mjXX
7d10: 58 58 58 58 39 58 58 22 5d 0a 20 20 7d 5d 0a 20  XXXX9XX"].  }]. 
7d20: 20 65 78 70 72 20 7b 24 3a 3a 6d 61 78 5f 6a 6f   expr {$::max_jo
7d30: 75 72 6e 61 6c 3d 3d 28 28 28 35 31 32 2b 32 2a  urnal==(((512+2*
7d40: 28 31 30 32 34 2b 38 29 2b 35 31 31 29 2f 35 31  (1024+8)+511)/51
7d50: 32 29 2a 35 31 32 20 2b 20 24 6d 6a 5f 70 6f 69  2)*512 + $mj_poi
7d60: 6e 74 65 72 29 7d 0a 7d 20 31 0a 64 62 20 63 6c  nter)}.} 1.db cl
7d70: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 64  ose.tv delete..d
7d80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7d90: 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  5.1 {.  sqlite3 
7da0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
7db0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54 54 41  csql { .    ATTA
7dc0: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
7dd0: 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47 4d 41   aux;.    PRAGMA
7de0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
7df0: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45  PERSIST;.    CRE
7e00: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
7e10: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
7e20: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61  NTO t3 SELECT ra
7e30: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
7e40: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
7e50: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 55 50   FROM t1;.    UP
7e60: 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d 20  DATE t3 SET b = 
7e70: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
7e80: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 5b 66 69  ;.  }.  expr [fi
7e90: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
7ea0: 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35 30 30 30  journal] > 15000
7eb0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {1}.do_test p
7ec0: 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b 0a 20 20  ager1-5.5.2 {.  
7ed0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
7ee0: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
7ef0: 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47   = full;.    BEG
7f00: 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
7f10: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
7f20: 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20 20   = 'Stalin';.   
7f30: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
7f40: 32 20 57 48 45 52 45 20 62 20 3d 20 27 53 74 61  2 WHERE b = 'Sta
7f50: 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  lin';.    COMMIT
7f60: 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a  ;.  }.  file siz
7f70: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
7f80: 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  l.} {0}...#-----
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fd0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
7fe0: 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72 6b 20  wing tests work 
7ff0: 77 69 74 68 20 22 50 52 41 47 4d 41 20 6d 61 78  with "PRAGMA max
8000: 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a 23 0a 64  _page_count".#.d
8010: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  o_test pager1-6.
8020: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
8030: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
8040: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
8050: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
8060: 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20  uum = none;.    
8070: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8080: 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20 20 20 20  count = 10;.    
8090: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
80a0: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
80b0: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29  E TABLE t3(a, b)
80c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
80d0: 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20 20 20  LE t4(a, b);.   
80e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
80f0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
8100: 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62  TE TABLE t6(a, b
8110: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
8120: 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a 20 20  BLE t7(a, b);.  
8130: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
8140: 38 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  8(a, b);.    CRE
8150: 41 54 45 20 54 41 42 4c 45 20 74 39 28 61 2c 20  ATE TABLE t9(a, 
8160: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
8170: 41 42 4c 45 20 74 31 30 28 61 2c 20 62 29 3b 0a  ABLE t10(a, b);.
8180: 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f 5f 63 61    }.} {10}.do_ca
8190: 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65  tchsql_test page
81a0: 72 31 2d 36 2e 32 20 7b 0a 20 20 43 52 45 41 54  r1-6.2 {.  CREAT
81b0: 45 20 54 41 42 4c 45 20 74 31 31 28 61 2c 20 62  E TABLE t11(a, b
81c0: 29 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  ).} {1 {database
81d0: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
81e0: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
81f0: 73 74 20 70 61 67 65 72 31 2d 36 2e 34 20 7b 20  st pager1-6.4 { 
8200: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8210: 63 6f 75 6e 74 20 20 20 20 20 20 7d 20 7b 31 30  count      } {10
8220: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
8230: 74 20 70 61 67 65 72 31 2d 36 2e 35 20 7b 20 50  t pager1-6.5 { P
8240: 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63  RAGMA max_page_c
8250: 6f 75 6e 74 20 3d 20 31 35 20 7d 20 7b 31 35 7d  ount = 15 } {15}
8260: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8270: 20 70 61 67 65 72 31 2d 36 2e 36 20 7b 20 43 52   pager1-6.6 { CR
8280: 45 41 54 45 20 54 41 42 4c 45 20 74 31 31 28 61  EATE TABLE t11(a
8290: 2c 20 62 29 20 20 20 20 20 7d 20 7b 7d 0a 64 6f  , b)     } {}.do
82a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
82b0: 67 65 72 31 2d 36 2e 37 20 7b 0a 20 20 42 45 47  ger1-6.7 {.  BEG
82c0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
82d0: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 31  NTO t11 VALUES(1
82e0: 2c 20 32 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  , 2);.    PRAGMA
82f0: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8300: 3d 20 31 33 3b 0a 7d 20 7b 31 33 7d 0a 64 6f 5f  = 13;.} {13}.do_
8310: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
8320: 65 72 31 2d 36 2e 38 20 7b 0a 20 20 20 20 49 4e  er1-6.8 {.    IN
8330: 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41  SERT INTO t11 VA
8340: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20  LUES(3, 4);.    
8350: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8360: 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 7d 20 7b 31  count = 10;.} {1
8370: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
8380: 73 74 20 70 61 67 65 72 31 2d 36 2e 39 20 7b 20  st pager1-6.9 { 
8390: 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a 64 6f 5f  COMMIT } {}..do_
83a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
83b0: 65 72 31 2d 36 2e 31 30 20 7b 20 50 52 41 47 4d  er1-6.10 { PRAGM
83c0: 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  A max_page_count
83d0: 20 3d 20 31 30 20 7d 20 7b 31 31 7d 0a 64 6f 5f   = 10 } {11}.do_
83e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
83f0: 65 72 31 2d 36 2e 31 31 20 7b 20 53 45 4c 45 43  er1-6.11 { SELEC
8400: 54 20 2a 20 46 52 4f 4d 20 74 31 31 20 7d 20 20  T * FROM t11 }  
8410: 20 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34          {1 2 3 4
8420: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
8430: 74 20 70 61 67 65 72 31 2d 36 2e 31 32 20 7b 20  t pager1-6.12 { 
8440: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8450: 63 6f 75 6e 74 20 7d 20 20 20 20 20 20 7b 31 31  count }      {11
8460: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
84b0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
84c0: 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22  ests work with "
84d0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
84e0: 6f 64 65 3d 54 52 55 4e 43 41 54 45 22 20 61 6e  ode=TRUNCATE" an
84f0: 64 0a 23 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b  d.# "PRAGMA lock
8500: 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
8510: 56 45 22 2e 0a 23 0a 23 20 45 61 63 68 20 74 65  VE"..#.# Each te
8520: 73 74 20 69 73 20 73 70 65 63 69 66 69 65 64 20  st is specified 
8530: 77 69 74 68 20 35 20 76 61 72 69 61 62 6c 65 73  with 5 variables
8540: 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a  . As follows:.#.
8550: 23 20 20 20 24 74 6e 3a 20 20 54 65 73 74 20 4e  #   $tn:  Test N
8560: 75 6d 62 65 72 2e 20 55 73 65 64 20 61 73 20 70  umber. Used as p
8570: 61 72 74 20 6f 66 20 74 68 65 20 5b 64 6f 5f 74  art of the [do_t
8580: 65 73 74 5d 20 74 65 73 74 20 6e 61 6d 65 73 2e  est] test names.
8590: 0a 23 20 20 20 24 73 71 6c 3a 20 53 51 4c 20 74  .#   $sql: SQL t
85a0: 6f 20 65 78 65 63 75 74 65 2e 0a 23 20 20 20 24  o execute..#   $
85b0: 72 65 73 3a 20 45 78 70 65 63 74 65 64 20 72 65  res: Expected re
85c0: 73 75 6c 74 20 6f 66 20 65 78 65 63 75 74 69 6e  sult of executin
85d0: 67 20 24 73 71 6c 2e 0a 23 20 20 20 24 6a 73 3a  g $sql..#   $js:
85e0: 20 20 54 68 65 20 65 78 70 65 63 74 65 64 20 73    The expected s
85f0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
8600: 61 6c 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65  al file, in byte
8610: 73 2c 20 61 66 74 65 72 20 65 78 65 63 75 74 69  s, after executi
8620: 6e 67 0a 23 20 20 20 20 20 20 20 20 20 74 68 65  ng.#         the
8630: 20 53 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20   SQL script. Or 
8640: 2d 31 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  -1 if the journa
8650: 6c 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65  l is not expecte
8660: 64 20 74 6f 20 65 78 69 73 74 2e 0a 23 20 20 20  d to exist..#   
8670: 24 77 73 3a 20 20 54 68 65 20 65 78 70 65 63 74  $ws:  The expect
8680: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57  ed size of the W
8690: 41 4c 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65  AL file, in byte
86a0: 73 2c 20 61 66 74 65 72 20 65 78 65 63 75 74 69  s, after executi
86b0: 6e 67 0a 23 20 20 20 20 20 20 20 20 20 74 68 65  ng.#         the
86c0: 20 53 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20   SQL script. Or 
86d0: 2d 31 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  -1 if the WAL is
86e0: 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f   not expected to
86f0: 20 65 78 69 73 74 2e 0a 23 0a 69 66 63 61 70 61   exist..#.ifcapa
8700: 62 6c 65 20 77 61 6c 20 7b 0a 20 20 66 61 75 6c  ble wal {.  faul
8710: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
8720: 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61 63 68  reopen.  foreach
8730: 20 7b 74 6e 20 73 71 6c 20 72 65 73 20 6a 73 20   {tn sql res js 
8740: 77 73 7d 20 5b 73 75 62 73 74 20 7b 0a 20 20 0a  ws} [subst {.  .
8750: 20 20 20 20 31 20 20 7b 0a 20 20 20 20 20 20 43      1  {.      C
8760: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
8770: 2c 20 62 29 3b 0a 20 20 20 20 20 20 50 52 41 47  , b);.      PRAG
8780: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f  MA auto_vacuum=O
8790: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
87a0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
87b0: 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  MAL;.      PRAGM
87c0: 41 20 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34  A page_size=1024
87d0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c  ;.      PRAGMA l
87e0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
87f0: 55 53 49 56 45 3b 0a 20 20 20 20 20 20 50 52 41  USIVE;.      PRA
8800: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8810: 3d 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 20  =TRUNCATE;.     
8820: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8830: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
8840: 20 20 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 74    } {exclusive t
8850: 72 75 6e 63 61 74 65 7d 20 30 20 2d 31 0a 20 20  runcate} 0 -1.  
8860: 0a 20 20 20 20 32 20 20 7b 0a 20 20 20 20 20 20  .    2  {.      
8870: 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b  BEGIN IMMEDIATE;
8880: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
8890: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  * FROM t1;.     
88a0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b   COMMIT;.    } {
88b0: 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20  1 2} 0 -1.  .   
88c0: 20 33 20 20 7b 0a 20 20 20 20 20 20 42 45 47 49   3  {.      BEGI
88d0: 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  N;.        SELEC
88e0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
88f0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
8900: 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20   {1 2} 0 -1.  . 
8910: 20 20 20 34 20 20 7b 20 50 52 41 47 4d 41 20 6a     4  { PRAGMA j
8920: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
8930: 4c 20 7d 20 20 20 20 77 61 6c 20 20 20 20 20 20  L }    wal      
8940: 20 2d 31 20 2d 31 0a 20 20 20 20 35 20 20 7b 20   -1 -1.    5  { 
8950: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
8960: 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 20 20 7b  ALUES(3, 4) }  {
8970: 7d 20 20 20 20 20 20 20 20 2d 31 20 5b 77 61 6c  }        -1 [wal
8980: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32  _file_size 1 102
8990: 34 5d 0a 20 20 20 20 36 20 20 7b 20 50 52 41 47  4].    6  { PRAG
89a0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
89b0: 3d 20 4e 4f 52 4d 41 4c 20 7d 20 65 78 63 6c 75  = NORMAL } exclu
89c0: 73 69 76 65 20 2d 31 20 5b 77 61 6c 5f 66 69 6c  sive -1 [wal_fil
89d0: 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a 20  e_size 1 1024]. 
89e0: 20 20 20 37 20 20 7b 20 49 4e 53 45 52 54 20 49     7  { INSERT I
89f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
8a00: 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20 20 20 20   6); } {}       
8a10: 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69   -1 [wal_file_si
8a20: 7a 65 20 32 20 31 30 32 34 5d 0a 20 20 0a 20 20  ze 2 1024].  .  
8a30: 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f    8  { PRAGMA jo
8a40: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55  urnal_mode = TRU
8a50: 4e 43 41 54 45 20 7d 20 74 72 75 6e 63 61 74 65  NCATE } truncate
8a60: 20 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20            0 -1. 
8a70: 20 20 20 39 20 20 7b 20 49 4e 53 45 52 54 20 49     9  { INSERT I
8a80: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c  NTO t1 VALUES(7,
8a90: 20 38 29 20 7d 20 20 20 20 7b 7d 20 20 20 20 20   8) }    {}     
8aa0: 20 20 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a             0 -1.
8ab0: 20 20 20 20 31 30 20 7b 20 53 45 4c 45 43 54 20      10 { SELECT 
8ac0: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20 20  * FROM t1 }     
8ad0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33            {1 2 3
8ae0: 20 34 20 35 20 36 20 37 20 38 7d 20 30 20 2d 31   4 5 6 7 8} 0 -1
8af0: 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 64  .  .  }] {.    d
8b00: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
8b10: 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20  ager1-7.1.$tn.1 
8b20: 24 73 71 6c 20 24 72 65 73 0a 20 20 20 20 63 61  $sql $res.    ca
8b30: 74 63 68 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b  tch { set J -1 ;
8b40: 20 73 65 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a   set J [file siz
8b50: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
8b60: 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63 68 20 7b  l] }.    catch {
8b70: 20 73 65 74 20 57 20 2d 31 20 3b 20 73 65 74 20   set W -1 ; set 
8b80: 57 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  W [file size tes
8b90: 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20  t.db-wal] }.    
8ba0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37  do_test pager1-7
8bb0: 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20  .1.$tn.2 { list 
8bc0: 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a  $J $W } [list $j
8bd0: 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f  s $ws].  }.}..do
8be0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32  _test pager1-7.2
8bf0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
8c00: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
8c10: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
8c20: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
8c30: 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56  _mode = EXCLUSIV
8c40: 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  E;.    CREATE TA
8c50: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
8c60: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50    BEGIN;.      P
8c70: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8c80: 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20  de = delete;.   
8c90: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
8ca0: 6c 5f 6d 6f 64 65 20 3d 20 74 72 75 6e 63 61 74  l_mode = truncat
8cb0: 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73  e;.  }.} {exclus
8cc0: 69 76 65 20 64 65 6c 65 74 65 20 74 72 75 6e 63  ive delete trunc
8cd0: 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ate}.do_test pag
8ce0: 65 72 31 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78  er1-7.2.2 {.  ex
8cf0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
8d00: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
8d10: 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   2) }.  execsql 
8d20: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
8d30: 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74 20  _mode = persist 
8d40: 7d 0a 7d 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64  }.} {truncate}.d
8d50: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e  o_test pager1-7.
8d60: 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
8d70: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65  { COMMIT }.  exe
8d80: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
8d90: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
8da0: 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 50 52   persist;.    PR
8db0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a  AGMA journal_siz
8dc0: 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b  e_limit;.  }.} {
8dd0: 70 65 72 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d  persist -1}..#--
8de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
8e30: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 70  llowing tests, p
8e40: 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20  ager1-8.*, test 
8e50: 74 68 61 74 20 74 68 65 20 73 70 65 63 69 61 6c  that the special
8e60: 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a   filenames .# ":
8e70: 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20 22 22 20  memory:" and "" 
8e80: 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72 79 20 64  open temporary d
8e90: 61 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65  atabases..#.fore
8ea0: 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65  ach {tn filename
8eb0: 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a  } {.  1 :memory:
8ec0: 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f  .  2 "".} {.  do
8ed0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24  _test pager1-8.$
8ee0: 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74  tn.1 {.    fault
8ef0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
8f00: 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f  eopen.    db clo
8f10: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  se.    sqlite3 d
8f20: 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  b $filename.    
8f30: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
8f40: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
8f50: 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 43 52  um = 1;.      CR
8f60: 45 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 29  EATE TABLE x1(x)
8f70: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
8f80: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 43  NTO x1 VALUES('C
8f90: 68 61 72 6c 65 73 27 29 3b 0a 20 20 20 20 20 20  harles');.      
8fa0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
8fb0: 41 4c 55 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a  ALUES('James');.
8fc0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
8fd0: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 4d 61 72  O x1 VALUES('Mar
8fe0: 79 27 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  y');.      SELEC
8ff0: 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20  T * FROM x1;.   
9000: 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c 65 73 20   }.  } {Charles 
9010: 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64  James Mary}..  d
9020: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e  o_test pager1-8.
9030: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69  $tn.2 {.    sqli
9040: 74 65 33 20 64 62 32 20 24 66 69 6c 65 6e 61 6d  te3 db2 $filenam
9050: 65 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  e.    catchsql {
9060: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
9070: 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b  1 } db2.  } {1 {
9080: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 78  no such table: x
9090: 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71  1}}..  do_execsq
90a0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e  l_test pager1-8.
90b0: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42 45 47 49  $tn.3 {.    BEGI
90c0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
90d0: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27  INTO x1 VALUES('
90e0: 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20  William');.     
90f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
9100: 56 41 4c 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a  VALUES('Anne');.
9110: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
9120: 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  } {}.}..#-------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9170: 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20 62 6c  --.# The next bl
9180: 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 70  ock of tests - p
9190: 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c  ager1-9.* - deal
91a0: 20 77 69 74 68 20 69 6e 74 65 72 61 63 74 69 6f   with interactio
91b0: 6e 73 20 62 65 74 77 65 65 6e 0a 23 20 74 68 65  ns between.# the
91c0: 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 62   pager and the b
91d0: 61 63 6b 75 70 20 41 50 49 2e 20 54 65 73 74 20  ackup API. Test 
91e0: 63 61 73 65 73 3a 0a 23 0a 23 20 20 20 70 61 67  cases:.#.#   pag
91f0: 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20  er1-9.1.*: Test 
9200: 74 68 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f  that a backup co
9210: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
9220: 75 6c 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65  ully even if the
9230: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
9240: 20 20 20 73 6f 75 72 63 65 20 64 62 20 69 73 20     source db is 
9250: 77 72 69 74 74 65 6e 20 74 6f 20 64 75 72 69 6e  written to durin
9260: 67 20 74 68 65 20 62 61 63 6b 75 70 20 6f 70 2e  g the backup op.
9270: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e  .#.#   pager1-9.
9280: 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61  2.*: Test that a
9290: 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65   backup complete
92a0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65  s successfully e
92b0: 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20  ven if the.#    
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
92d0: 72 63 65 20 64 62 20 69 73 20 77 72 69 74 74 65  rce db is writte
92e0: 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f  n to and then ro
92f0: 6c 6c 65 64 20 62 61 63 6b 20 64 75 72 69 6e 67  lled back during
9300: 20 61 20 0a 23 20 20 20 20 20 20 20 20 20 20 20   a .#           
9310: 20 20 20 20 20 20 62 61 63 6b 75 70 20 6f 70 65        backup ope
9320: 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73  ration..#.do_tes
9330: 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b  t pager1-9.0.1 {
9340: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
9350: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
9360: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
9370: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
9380: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
9390: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
93a0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
93b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
93c0: 61 62 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28  ab(a, b, UNIQUE(
93d0: 61 2c 20 62 29 29 3b 0a 20 20 20 20 20 20 49 4e  a, b));.      IN
93e0: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c  SERT INTO ab VAL
93f0: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 32 30  UES( a_string(20
9400: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
9410: 29 20 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ) );.      INSER
9420: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
9430: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
9440: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
9450: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
9460: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
9470: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
9480: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
9490: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
94a0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
94b0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
94c0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
94d0: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
94e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
94f0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
9500: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9510: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
9520: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
9530: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
9540: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
9550: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
9560: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9570: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
9580: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
9590: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
95a0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
95b0: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
95c0: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
95d0: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
95e0: 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  b;.    COMMIT;. 
95f0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
9600: 70 61 67 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20  pager1-9.0.2 {. 
9610: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
9620: 74 2e 64 62 32 0a 20 20 64 62 32 20 65 76 61 6c  t.db2.  db2 eval
9630: 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f   { PRAGMA cache_
9640: 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 73 71  size = 10 }.  sq
9650: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
9660: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
9670: 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31    list [B step 1
9680: 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d  0000] [B finish]
9690: 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .} {SQLITE_DONE 
96a0: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
96b0: 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 33 20  st pager1-9.0.3 
96c0: 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  {. db one {SELEC
96d0: 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46  T md5sum(a, b) F
96e0: 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f  ROM ab}.} [db2 o
96f0: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
9700: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
9710: 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  ]..do_test pager
9720: 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63  1-9.1.1 {.  exec
9730: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20  sql { UPDATE ab 
9740: 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67  SET a = a_string
9750: 28 32 30 31 29 20 7d 0a 20 20 73 71 6c 69 74 65  (201) }.  sqlite
9760: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d  3_backup B db2 m
9770: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20  ain db main.  B 
9780: 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54  step 30.} {SQLIT
9790: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
97a0: 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65  ger1-9.1.2 {.  e
97b0: 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20  xecsql { UPDATE 
97c0: 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  ab SET b = a_str
97d0: 69 6e 67 28 33 30 31 29 20 7d 0a 20 20 6c 69 73  ing(301) }.  lis
97e0: 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d  t [B step 10000]
97f0: 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53   [B finish].} {S
9800: 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54  QLITE_DONE SQLIT
9810: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
9820: 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62  ger1-9.1.3 {. db
9830: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35   one {SELECT md5
9840: 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61  sum(a, b) FROM a
9850: 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53  b}.} [db2 one {S
9860: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
9870: 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f  b) FROM ab}].do_
9880: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e  test pager1-9.1.
9890: 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45  4 { execsql { SE
98a0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
98b0: 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a  OM ab } } {128}.
98c0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
98d0: 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  9.2.1 {.  execsq
98e0: 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45  l { UPDATE ab SE
98f0: 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32  T a = a_string(2
9900: 30 32 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  02) }.  sqlite3_
9910: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
9920: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74  n db main.  B st
9930: 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f  ep 30.} {SQLITE_
9940: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9950: 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65  r1-9.2.2 {.  exe
9960: 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49  csql { .    BEGI
9970: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
9980: 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  ab SET b = a_str
9990: 69 6e 67 28 33 30 31 29 3b 0a 20 20 20 20 52 4f  ing(301);.    RO
99a0: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69  LLBACK;.  }.  li
99b0: 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30  st [B step 10000
99c0: 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b  ] [B finish].} {
99d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49  SQLITE_DONE SQLI
99e0: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70  TE_OK}.do_test p
99f0: 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64  ager1-9.2.3 {. d
9a00: 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64  b one {SELECT md
9a10: 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20  5sum(a, b) FROM 
9a20: 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b  ab}.} [db2 one {
9a30: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c  SELECT md5sum(a,
9a40: 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f   b) FROM ab}].do
9a50: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32  _test pager1-9.2
9a60: 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53  .4 { execsql { S
9a70: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
9a80: 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d  ROM ab } } {128}
9a90: 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c  .db close.db2 cl
9aa0: 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  ose..do_test pag
9ab0: 65 72 31 2d 39 2e 33 2e 31 20 7b 0a 20 20 74 65  er1-9.3.1 {.  te
9ac0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
9ad0: 74 20 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73  t 1.  tv sectors
9ae0: 69 7a 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74  ize 4096.  fault
9af0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
9b00: 65 6f 70 65 6e 0a 0a 20 20 65 78 65 63 73 71 6c  eopen..  execsql
9b10: 20 7b 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73   { PRAGMA page_s
9b20: 69 7a 65 20 3d 20 31 30 32 34 20 7d 0a 20 20 66  ize = 1024 }.  f
9b30: 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24  or {set ii 0} {$
9b40: 69 69 20 3c 20 34 7d 20 7b 69 6e 63 72 20 69 69  ii < 4} {incr ii
9b50: 7d 20 7b 20 65 78 65 63 73 71 6c 20 22 43 52 45  } { execsql "CRE
9b60: 41 54 45 20 54 41 42 4c 45 20 74 24 7b 69 69 7d  ATE TABLE t${ii}
9b70: 28 61 2c 20 62 29 22 20 7d 0a 7d 20 7b 7d 0a 64  (a, b)" }.} {}.d
9b80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9b90: 33 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  3.2 {.  sqlite3 
9ba0: 64 62 32 20 74 65 73 74 2e 64 62 32 0a 0a 20 20  db2 test.db2..  
9bb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
9bc0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
9bd0: 20 34 30 39 36 3b 0a 20 20 20 20 50 52 41 47 4d   4096;.    PRAGM
9be0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
9bf0: 4f 46 46 3b 0a 20 20 20 20 43 52 45 41 54 45 20  OFF;.    CREATE 
9c00: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
9c10: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9c20: 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64   t2(a, b);.  } d
9c30: 62 32 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  b2..  sqlite3_ba
9c40: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
9c50: 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70  db main.  B step
9c60: 20 33 30 0a 20 20 6c 69 73 74 20 5b 42 20 73 74   30.  list [B st
9c70: 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e  ep 10000] [B fin
9c80: 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  ish].} {SQLITE_D
9c90: 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  ONE SQLITE_OK}.d
9ca0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9cb0: 33 2e 33 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73  3.3 {.  db2 clos
9cc0: 65 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  e.  db close.  t
9cd0: 76 20 64 65 6c 65 74 65 0a 20 20 66 69 6c 65 20  v delete.  file 
9ce0: 73 69 7a 65 20 74 65 73 74 2e 64 62 32 0a 7d 20  size test.db2.} 
9cf0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
9d00: 64 62 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  db]..do_test pag
9d10: 65 72 31 2d 39 2e 34 2e 31 20 7b 0a 20 20 66 61  er1-9.4.1 {.  fa
9d20: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
9d30: 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74  d_reopen.  sqlit
9d40: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
9d50: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
9d60: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
9d70: 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 43 52 45   = 4096;.    CRE
9d80: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
9d90: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
9da0: 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20  ABLE t2(a, b);. 
9db0: 20 7d 20 64 62 32 0a 20 20 73 71 6c 69 74 65 33   } db2.  sqlite3
9dc0: 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61  _backup B db2 ma
9dd0: 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73  in db main.  lis
9de0: 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d  t [B step 10000]
9df0: 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53   [B finish].} {S
9e00: 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54  QLITE_DONE SQLIT
9e10: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
9e20: 67 65 72 31 2d 39 2e 34 2e 32 20 7b 0a 20 20 6c  ger1-9.4.2 {.  l
9e30: 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  ist [file size t
9e40: 65 73 74 2e 64 62 32 5d 20 5b 66 69 6c 65 20 73  est.db2] [file s
9e50: 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b  ize test.db].} {
9e60: 30 20 30 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a  0 0}.db2 close..
9e70: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
9e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
9ec0: 74 20 74 68 61 74 20 72 65 67 61 72 64 6c 65 73  t that regardles
9ed0: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 72  s of the value r
9ee0: 65 74 75 72 6e 65 64 20 62 79 20 78 53 65 63 74  eturned by xSect
9ef0: 6f 72 53 69 7a 65 28 29 2c 20 74 68 65 0a 23 20  orSize(), the.# 
9f00: 6d 69 6e 69 6d 75 6d 20 65 66 66 65 63 74 69 76  minimum effectiv
9f10: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
9f20: 20 35 31 32 20 61 6e 64 20 74 68 65 20 6d 61 78   512 and the max
9f30: 69 6d 75 6d 20 36 35 35 33 36 20 62 79 74 65 73  imum 65536 bytes
9f40: 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d  ..#.testvfs tv -
9f50: 64 65 66 61 75 6c 74 20 31 0a 66 6f 72 65 61 63  default 1.foreac
9f60: 68 20 73 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20  h sectorsize {. 
9f70: 20 20 20 33 32 20 20 20 36 34 20 20 20 31 32 38     32   64   128
9f80: 20 20 20 32 35 36 20 20 20 35 31 32 20 20 20 31     256   512   1
9f90: 30 32 34 20 20 20 32 30 34 38 20 0a 20 20 20 20  024   2048 .    
9fa0: 34 30 39 36 20 38 31 39 32 20 31 36 33 38 34 20  4096 8192 16384 
9fb0: 33 32 37 36 38 20 36 35 35 33 36 20 31 33 31 30  32768 65536 1310
9fc0: 37 32 20 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20  72 262144.} {.  
9fd0: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 24 73  tv sectorsize $s
9fe0: 65 63 74 6f 72 73 69 7a 65 0a 20 20 74 76 20 64  ectorsize.  tv d
9ff0: 65 76 63 68 61 72 20 7b 7d 0a 20 20 73 65 74 20  evchar {}.  set 
a000: 65 66 66 20 24 73 65 63 74 6f 72 73 69 7a 65 0a  eff $sectorsize.
a010: 20 20 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a    if {$sectorsiz
a020: 65 20 3c 20 35 31 32 7d 20 20 20 7b 20 73 65 74  e < 512}   { set
a030: 20 65 66 66 20 35 31 32 20 7d 0a 20 20 69 66 20   eff 512 }.  if 
a040: 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36  {$sectorsize > 6
a050: 35 35 33 36 7d 20 7b 20 73 65 74 20 65 66 66 20  5536} { set eff 
a060: 36 35 35 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65  65536 }..  do_te
a070: 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65  st pager1-10.$se
a080: 63 74 6f 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20  ctorsize.1 {.   
a090: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
a0a0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
a0b0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
a0c0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78   a_string.    ex
a0d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
a0e0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
a0f0: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
a100: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
a110: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
a120: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
a130: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
a140: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20  (a, b);.        
a150: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
a160: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43  a, b);.        C
a170: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
a180: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d  , b);.      COMM
a190: 49 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69  IT;.    }.    fi
a1a0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
a1b0: 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70  journal.  } [exp
a1c0: 72 20 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20  r $sectorsize > 
a1d0: 36 35 35 33 36 20 3f 20 36 35 35 33 36 20 3a 20  65536 ? 65536 : 
a1e0: 24 73 65 63 74 6f 72 73 69 7a 65 5d 0a 0a 20 20  $sectorsize]..  
a1f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
a200: 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 32 20  0.$sectorsize.2 
a210: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
a220: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
a230: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 61 5f 73  TO t3 VALUES(a_s
a240: 74 72 69 6e 67 28 33 30 30 29 2c 20 61 5f 73 74  tring(300), a_st
a250: 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20 20  ring(300));.    
a260: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
a270: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
a280: 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 32 20  3;        /*  2 
a290: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
a2a0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a  INTO t3 SELECT *
a2b0: 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20   FROM t3;       
a2c0: 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20   /*  4 */.      
a2d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
a2e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f          /*  8 */
a300: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
a310: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46  TO t3 SELECT * F
a320: 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f  ROM t3;        /
a330: 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e  * 16 */.      IN
a340: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
a350: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20  ECT * FROM t3;  
a360: 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20        /* 32 */. 
a370: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64     }.  } {}..  d
a380: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30  o_test pager1-10
a390: 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 33 20 7b  .$sectorsize.3 {
a3a0: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
a3b0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
a3c0: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
a3d0: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
a3e0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
a3f0: 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  ;.      BEGIN;. 
a400: 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69     }.    recursi
a410: 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20  ve_select 32 t3 
a420: 7b 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54  {db eval "INSERT
a430: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
a440: 31 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63  1, 2)"}.    exec
a450: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d  sql {.      COMM
a460: 49 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  IT;.      SELECT
a470: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
a480: 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 64  }.  } {1 2}..  d
a490: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30  o_test pager1-10
a4a0: 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 34 20 7b  .$sectorsize.4 {
a4b0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
a4c0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a4d0: 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t6(a, b);.    
a4e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a4f0: 37 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43  7(a, b);.      C
a500: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61  REATE TABLE t5(a
a510: 2c 20 62 29 3b 0a 20 20 20 20 20 20 44 52 4f 50  , b);.      DROP
a520: 20 54 41 42 4c 45 20 74 36 3b 0a 20 20 20 20 20   TABLE t6;.     
a530: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 37 3b 0a   DROP TABLE t7;.
a540: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
a550: 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  l {.      BEGIN;
a560: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
a570: 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a  TABLE t6(a, b);.
a580: 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73      }.    recurs
a590: 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33  ive_select 32 t3
a5a0: 20 7b 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52   {db eval "INSER
a5b0: 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53  T INTO t5 VALUES
a5c0: 28 31 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65  (1, 2)"}.    exe
a5d0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d  csql {.      COM
a5e0: 4d 49 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  MIT;.      SELEC
a5f0: 54 20 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20  T * FROM t5;.   
a600: 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 0a   }.  } {1 2}.  .
a610: 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 74 76 20 73  }.db close..tv s
a620: 65 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 64  ectorsize 4096.d
a630: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30  o_test pager1.10
a640: 2e 78 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .x.1 {.  faultsi
a650: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
a660: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
a670: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
a680: 76 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20  vacuum = none;. 
a690: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
a6a0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
a6b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
a6c0: 78 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73  x);.  }.  for {s
a6d0: 65 74 20 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20  et i 0} {$i<30} 
a6e0: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
a6f0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
a700: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 7a  INTO t1 VALUES(z
a710: 65 72 6f 62 6c 6f 62 28 39 30 30 29 29 20 7d 0a  eroblob(900)) }.
a720: 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20    }.  file size 
a730: 74 65 73 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38  test.db.} {32768
a740: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
a750: 2e 31 30 2e 78 2e 32 20 7b 0a 20 20 65 78 65 63  .10.x.2 {.  exec
a760: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
a770: 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20   TABLE t2(x);.  
a780: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b    DROP TABLE t2;
a790: 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65  .  }.  file size
a7a0: 20 74 65 73 74 2e 64 62 0a 7d 20 7b 33 33 37 39   test.db.} {3379
a7b0: 32 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  2}.do_test pager
a7c0: 31 2e 31 30 2e 78 2e 33 20 7b 0a 20 20 65 78 65  1.10.x.3 {.  exe
a7d0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
a7e0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
a7f0: 4c 45 20 74 32 28 78 29 3b 0a 20 20 7d 0a 20 20  LE t2(x);.  }.  
a800: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
a810: 20 33 30 20 74 31 0a 20 20 65 78 65 63 73 71 6c   30 t1.  execsql
a820: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
a830: 42 4c 45 20 74 33 28 78 29 3b 0a 20 20 20 20 43  BLE t3(x);.    C
a840: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
a850: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
a860: 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20  ete..testvfs tv 
a870: 2d 64 65 66 61 75 6c 74 20 31 0a 66 61 75 6c 74  -default 1.fault
a880: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
a890: 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f  eopen.db func a_
a8a0: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
a8b0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
a8c0: 70 61 67 65 72 31 2d 31 31 2e 31 20 7b 0a 20 20  pager1-11.1 {.  
a8d0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
a8e0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
a8f0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
a900: 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b  e = 10;.  BEGIN;
a910: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
a920: 45 20 7a 7a 28 74 6f 70 20 50 52 49 4d 41 52 59  E zz(top PRIMARY
a930: 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52   KEY);.    INSER
a940: 54 20 49 4e 54 4f 20 7a 7a 20 56 41 4c 55 45 53  T INTO zz VALUES
a950: 28 61 5f 73 74 72 69 6e 67 28 32 32 32 29 29 3b  (a_string(222));
a960: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a970: 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72   zz SELECT a_str
a980: 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b  ing((SELECT 222+
a990: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
a9a0: 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20  zz)) FROM zz;.  
a9b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
a9c0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
a9d0: 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78  ((SELECT 222+max
a9e0: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29  (rowid) FROM zz)
a9f0: 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49  ) FROM zz;.    I
aa00: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
aa10: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
aa20: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
aa30: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
aa40: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
aa50: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
aa60: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
aa70: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
aa80: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
aa90: 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   zz;.    INSERT 
aaa0: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
aab0: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
aac0: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
aad0: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
aae0: 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 42 45  ;.  COMMIT;.  BE
aaf0: 47 49 4e 3b 0a 20 20 20 20 55 50 44 41 54 45 20  GIN;.    UPDATE 
ab00: 7a 7a 20 53 45 54 20 74 6f 70 20 3d 20 61 5f 73  zz SET top = a_s
ab10: 74 72 69 6e 67 28 33 34 35 29 3b 0a 7d 20 7b 64  tring(345);.} {d
ab20: 65 6c 65 74 65 7d 0a 0a 70 72 6f 63 20 6c 6f 63  elete}..proc loc
ab30: 6b 6f 75 74 20 7b 6d 65 74 68 6f 64 20 61 72 67  kout {method arg
ab40: 73 7d 20 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  s} { return SQLI
ab50: 54 45 5f 49 4f 45 52 52 20 7d 0a 74 76 20 73 63  TE_IOERR }.tv sc
ab60: 72 69 70 74 20 6c 6f 63 6b 6f 75 74 0a 74 76 20  ript lockout.tv 
ab70: 66 69 6c 74 65 72 20 7b 78 57 72 69 74 65 20 78  filter {xWrite x
ab80: 54 72 75 6e 63 61 74 65 20 78 53 79 6e 63 7d 0a  Truncate xSync}.
ab90: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
aba0: 20 70 61 67 65 72 31 2d 31 31 2e 32 20 7b 20 43   pager1-11.2 { C
abb0: 4f 4d 4d 49 54 20 7d 20 7b 31 20 7b 64 69 73 6b  OMMIT } {1 {disk
abc0: 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a 74 76   I/O error}}..tv
abd0: 20 73 63 72 69 70 74 20 7b 7d 0a 64 6f 5f 74 65   script {}.do_te
abe0: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 33 20 7b  st pager1-11.3 {
abf0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
ac00: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
ac10: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
ac20: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55  urnal_mode = TRU
ac30: 4e 43 41 54 45 3b 0a 20 20 20 20 50 52 41 47 4d  NCATE;.    PRAGM
ac40: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
ac50: 6b 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 74 72  k;.  } db2.} {tr
ac60: 75 6e 63 61 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65  uncate ok}.do_te
ac70: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 34 20 7b  st pager1-11.4 {
ac80: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 66  .  db2 close.  f
ac90: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
aca0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
acb0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
acc0: 20 70 61 67 65 72 31 2d 31 31 2e 35 20 7b 20 53   pager1-11.5 { S
acd0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
ace0: 52 4f 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62  ROM zz } {32}.db
acf0: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
ad00: 0a 20 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  .#-----------
ad10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
ad50: 20 54 65 73 74 20 22 50 52 41 47 4d 41 20 70 61   Test "PRAGMA pa
ad60: 67 65 5f 73 69 7a 65 22 0a 23 0a 74 65 73 74 76  ge_size".#.testv
ad70: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
ad80: 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 31  .tv sectorsize 1
ad90: 30 32 34 0a 66 6f 72 65 61 63 68 20 70 61 67 65  024.foreach page
ada0: 73 69 7a 65 20 7b 0a 20 20 20 20 35 31 32 20 20  size {.    512  
adb0: 20 31 30 32 34 20 20 20 32 30 34 38 20 34 30 39   1024   2048 409
adc0: 36 20 38 31 39 32 20 31 36 33 38 34 20 33 32 37  6 8192 16384 327
add0: 36 38 20 0a 7d 20 7b 0a 20 20 66 61 75 6c 74 73  68 .} {.  faults
ade0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
adf0: 6f 70 65 6e 0a 0a 20 20 23 20 54 68 65 20 73 65  open..  # The se
ae00: 63 74 6f 72 2d 73 69 7a 65 20 28 61 63 63 6f 72  ctor-size (accor
ae10: 64 69 6e 67 20 74 6f 20 74 68 65 20 56 46 53 29  ding to the VFS)
ae20: 20 69 73 20 31 30 32 34 20 62 79 74 65 73 2e 20   is 1024 bytes. 
ae30: 53 6f 20 69 66 20 74 68 65 0a 20 20 23 20 70 61  So if the.  # pa
ae40: 67 65 2d 73 69 7a 65 20 72 65 71 75 65 73 74 65  ge-size requeste
ae50: 64 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20  d using "PRAGMA 
ae60: 70 61 67 65 5f 73 69 7a 65 22 20 69 73 20 67 72  page_size" is gr
ae70: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
ae80: 20 23 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20   # compile time 
ae90: 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f  value of SQLITE_
aea0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 74  MAX_PAGE_SIZE, t
aeb0: 68 65 6e 20 74 68 65 20 65 66 66 65 63 74 69 76  hen the effectiv
aec0: 65 20 0a 20 20 23 20 70 61 67 65 2d 73 69 7a 65  e .  # page-size
aed0: 20 72 65 6d 61 69 6e 73 20 31 30 32 34 20 62 79   remains 1024 by
aee0: 74 65 73 2e 0a 20 20 23 0a 20 20 73 65 74 20 65  tes..  #.  set e
aef0: 66 66 20 24 70 61 67 65 73 69 7a 65 0a 20 20 69  ff $pagesize.  i
af00: 66 20 7b 24 65 66 66 20 3e 20 24 3a 3a 53 51 4c  f {$eff > $::SQL
af10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
af20: 45 7d 20 7b 20 73 65 74 20 65 66 66 20 31 30 32  E} { set eff 102
af30: 34 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70  4 }..  do_test p
af40: 61 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69  ager1-12.$pagesi
af50: 7a 65 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74  ze.1 {.    sqlit
af60: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
af70: 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20     execsql ".   
af80: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
af90: 69 7a 65 20 3d 20 24 70 61 67 65 73 69 7a 65 3b  ize = $pagesize;
afa0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 56 49  .      CREATE VI
afb0: 45 57 20 76 20 41 53 20 53 45 4c 45 43 54 20 2a  EW v AS SELECT *
afc0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
afd0: 74 65 72 3b 0a 20 20 20 20 22 20 64 62 32 0a 20  ter;.    " db2. 
afe0: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
aff0: 74 2e 64 62 0a 20 20 7d 20 24 65 66 66 0a 20 20  t.db.  } $eff.  
b000: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
b010: 32 2e 24 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a  2.$pagesize.2 {.
b020: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20      sqlite3 db2 
b030: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63  test.db.    exec
b040: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c  sql { .      SEL
b050: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
b060: 4d 20 76 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  M v;.      PRAGM
b070: 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65  A main.page_size
b080: 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20  ;.    } db2.  } 
b090: 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20  [list 1 $eff].  
b0a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
b0b0: 32 2e 24 70 61 67 65 73 69 7a 65 2e 33 20 7b 0a  2.$pagesize.3 {.
b0c0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
b0d0: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
b0e0: 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20  t(*) FROM v;.   
b0f0: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70     PRAGMA main.p
b100: 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 0a  age_size;.    }.
b110: 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 66 66    } [list 1 $eff
b120: 5d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a  ].  db2 close.}.
b130: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
b140: 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  te..#-----------
b150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
b190: 20 54 65 73 74 20 73 70 65 63 61 6c 20 22 50 52   Test specal "PR
b1a0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
b1b0: 65 3d 50 45 52 53 49 53 54 22 20 74 65 73 74 20  e=PERSIST" test 
b1c0: 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65 72  cases..#.# pager
b1d0: 31 2d 31 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74  1-13.1.*: This t
b1e0: 65 73 74 73 20 61 20 73 70 65 63 69 61 6c 20 63  ests a special c
b1f0: 61 73 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ase encountered 
b200: 69 6e 20 70 65 72 73 69 73 74 65 6e 74 20 0a 23  in persistent .#
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 49 66  journal mode: If
b230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 73 73   the journal ass
b240: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 74  ociated with a t
b250: 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20  ransaction.#    
b260: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
b270: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
b280: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 62 65  journal file (be
b290: 63 61 75 73 65 20 61 20 70 72 65 76 69 6f 75 73  cause a previous
b2a0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
b2b0: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c     transaction l
b2c0: 65 66 74 20 61 20 76 65 72 79 20 6c 61 72 67 65  eft a very large
b2d0: 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c   non-hot journal
b2e0: 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 23 20 20   file in the.#  
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
b300: 6c 65 2d 73 79 73 74 65 6d 29 2c 20 74 68 65 6e  le-system), then
b310: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 62   SQLite has to b
b320: 65 20 63 61 72 65 66 75 6c 20 74 68 61 74 20 74  e careful that t
b330: 68 65 72 65 20 69 73 0a 23 20 20 20 20 20 20 20  here is.#       
b340: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 61 20 6a           not a j
b350: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6c 65  ournal-header le
b360: 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
b370: 72 65 76 69 6f 75 73 20 74 72 61 6e 73 61 63 74  revious transact
b380: 69 6f 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20  ion.#           
b390: 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79       immediately
b3a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6a   following the j
b3b0: 6f 75 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6a  ournal content j
b3c0: 75 73 74 20 77 72 69 74 74 65 6e 2e 0a 23 20 20  ust written..#  
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66                If
b3e0: 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
b3f0: 68 65 20 70 72 6f 63 65 73 73 20 63 72 61 73 68  he process crash
b400: 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a  es so that the j
b410: 6f 75 72 6e 61 6c 0a 23 20 20 20 20 20 20 20 20  ournal.#        
b420: 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20          becomes 
b430: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
b440: 64 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  d must be rolled
b450: 20 62 61 63 6b 20 62 79 20 61 6e 6f 74 68 65 72   back by another
b460: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b470: 20 20 70 72 6f 63 65 73 73 2c 20 74 68 65 72 65    process, there
b480: 20 69 73 20 61 20 64 61 6e 67 65 72 20 74 68 61   is a danger tha
b490: 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63  t the other proc
b4a0: 65 73 73 20 6d 61 79 20 72 6f 6c 6c 0a 23 20 20  ess may roll.#  
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61                ba
b4c0: 63 6b 20 74 68 65 20 61 62 6f 72 74 65 64 20 74  ck the aborted t
b4d0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
b4e0: 20 63 6f 6e 74 69 6e 75 65 20 63 6f 70 79 69 6e   continue copyin
b4f0: 67 20 64 61 74 61 0a 23 20 20 20 20 20 20 20 20  g data.#        
b500: 20 20 20 20 20 20 20 20 66 72 6f 6d 20 61 6e 20          from an 
b510: 6f 6c 64 65 72 20 74 72 61 6e 73 61 63 74 69 6f  older transactio
b520: 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 6d 61 69  n from the remai
b530: 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  nder of the jour
b540: 6e 61 6c 2e 0a 23 20 20 20 20 20 20 20 20 20 20  nal..#          
b550: 20 20 20 20 20 20 53 65 65 20 74 68 65 20 73 79        See the sy
b560: 6e 63 4a 6f 75 72 6e 61 6c 28 29 20 66 75 6e 63  ncJournal() func
b570: 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73  tion for details
b580: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e  ..#.# pager1-13.
b590: 32 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61  2.*: Same test a
b5a0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20  s the previous. 
b5b0: 54 68 69 73 20 74 69 6d 65 2c 20 74 68 72 6f 77  This time, throw
b5c0: 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 0a 23   an index into.#
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 74 68 65 20 6d 69 78 20 74 6f 20 6d 61 6b 65 20  the mix to make 
b5f0: 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
b600: 65 63 6b 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20  eck more likely 
b610: 74 6f 20 63 61 74 63 68 0a 23 20 20 20 20 20 20  to catch.#      
b620: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 73            errors
b630: 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d  ..#.testvfs tv -
b640: 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72  default 1.tv scr
b650: 69 70 74 20 78 53 79 6e 63 43 62 0a 74 76 20 66  ipt xSyncCb.tv f
b660: 69 6c 74 65 72 20 78 53 79 6e 63 0a 70 72 6f 63  ilter xSync.proc
b670: 20 78 53 79 6e 63 43 62 20 7b 6d 65 74 68 6f 64   xSyncCb {method
b680: 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20   filename args} 
b690: 7b 0a 20 20 73 65 74 20 74 20 5b 66 69 6c 65 20  {.  set t [file 
b6a0: 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 0a  tail $filename].
b6b0: 20 20 69 66 20 7b 24 74 20 3d 3d 20 22 74 65 73    if {$t == "tes
b6c0: 74 2e 64 62 22 7d 20 66 61 75 6c 74 73 69 6d 5f  t.db"} faultsim_
b6d0: 73 61 76 65 0a 20 20 72 65 74 75 72 6e 20 53 51  save.  return SQ
b6e0: 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73  LITE_OK.}.faults
b6f0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
b700: 6f 70 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73  open.db func a_s
b710: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a  tring a_string..
b720: 23 20 54 68 65 20 55 50 44 41 54 45 20 73 74 61  # The UPDATE sta
b730: 74 65 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e  tement at the en
b740: 64 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 63  d of this test c
b750: 61 73 65 20 63 72 65 61 74 65 73 20 61 20 72 65  ase creates a re
b760: 61 6c 6c 79 20 62 69 67 0a 23 20 6a 6f 75 72 6e  ally big.# journ
b770: 61 6c 2e 20 53 69 6e 63 65 20 74 68 65 20 63 61  al. Since the ca
b780: 63 68 65 2d 73 69 7a 65 20 69 73 20 6f 6e 6c 79  che-size is only
b790: 20 31 30 20 70 61 67 65 73 2c 20 74 68 65 20 6a   10 pages, the j
b7a0: 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
b7b0: 0a 23 20 66 72 65 71 75 65 6e 74 20 6a 6f 75 72  .# frequent jour
b7c0: 6e 61 6c 20 68 65 61 64 65 72 73 2e 0a 23 0a 64  nal headers..#.d
b7d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
b7e0: 61 67 65 72 31 2d 31 33 2e 31 2e 31 20 7b 0a 20  ager1-13.1.1 {. 
b7f0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
b800: 65 20 3d 20 31 30 32 34 3b 0a 20 20 50 52 41 47  e = 1024;.  PRAG
b810: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
b820: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 50 52 41  = PERSIST;.  PRA
b830: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
b840: 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20   10;.  BEGIN;.  
b850: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
b860: 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(a INTEGER PRIM
b870: 41 52 59 20 4b 45 59 2c 20 62 20 42 4c 4f 42 29  ARY KEY, b BLOB)
b880: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
b890: 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O t1 VALUES(NULL
b8a0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 29  , a_string(400))
b8b0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
b8c0: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
b8d0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
b8e0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
b8f0: 20 20 2f 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20    /*   2 */.    
b900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
b910: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
b920: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
b930: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
b940: 20 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54   4 */.    INSERT
b950: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
b960: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
b970: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
b980: 20 20 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a        /*   8 */.
b990: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b9a0: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
b9b0: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
b9c0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
b9d0: 2f 2a 20 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e  /*  16 */.    IN
b9e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
b9f0: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
ba00: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
ba10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32            /*  32
ba20: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
ba30: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
ba40: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
ba50: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
ba60: 20 20 20 20 2f 2a 20 20 36 34 20 2a 2f 0a 20 20      /*  64 */.  
ba70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ba80: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
ba90: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
baa0: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
bab0: 20 31 32 38 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54   128 */.  COMMIT
bac0: 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45  ;.  UPDATE t1 SE
bad0: 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34  T b = a_string(4
bae0: 30 30 29 3b 0a 7d 20 7b 70 65 72 73 69 73 74 7d  00);.} {persist}
baf0: 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61  ..if {$::tcl_pla
bb00: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21  tform(platform)!
bb10: 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20  ="windows"} {.# 
bb20: 52 75 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  Run transactions
bb30: 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67 20 73   of increasing s
bb40: 69 7a 65 73 2e 20 45 76 65 6e 74 75 61 6c 6c 79  izes. Eventually
bb50: 2c 20 6f 6e 65 20 28 6f 72 20 6d 6f 72 65 20 74  , one (or more t
bb60: 68 61 6e 20 6f 6e 65 29 0a 23 20 6f 66 20 74 68  han one).# of th
bb70: 65 73 65 20 77 69 6c 6c 20 77 72 69 74 65 20 6a  ese will write j
bb80: 75 73 74 20 65 6e 6f 75 67 68 20 63 6f 6e 74 65  ust enough conte
bb90: 6e 74 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  nt that one of t
bba0: 68 65 20 6f 6c 64 20 68 65 61 64 65 72 73 20 63  he old headers c
bbb0: 72 65 61 74 65 64 20 0a 23 20 62 79 20 74 68 65  reated .# by the
bbc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
bbd0: 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20  the block above 
bbe0: 6c 69 65 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  lies immediately
bbf0: 20 61 66 74 65 72 20 74 68 65 20 63 6f 6e 74 65   after the conte
bc00: 6e 74 0a 23 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  nt.# journalled 
bc10: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
bc20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f  ransaction..#.fo
bc30: 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24  r {set nUp 1} {$
bc40: 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55  nUp<64} {incr nU
bc50: 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71  p} {.  do_execsq
bc60: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
bc70: 2e 31 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20  .1.2.$nUp.1 { . 
bc80: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
bc90: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39   b = a_string(39
bca0: 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e  9) WHERE a <= $n
bcb0: 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65  Up.  } {}.  do_e
bcc0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
bcd0: 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 32  r1-13.1.2.$nUp.2
bce0: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
bcf0: 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d  ity_check } {ok}
bd00: 20 0a 0a 20 20 23 20 54 72 79 20 74 6f 20 61 63   ..  # Try to ac
bd10: 63 65 73 73 20 74 68 65 20 73 6e 61 70 73 68 6f  cess the snapsho
bd20: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  t of the file-sy
bd30: 73 74 65 6d 2e 0a 20 20 23 0a 20 20 73 71 6c 69  stem..  #.  sqli
bd40: 74 65 33 20 64 62 32 20 73 76 5f 74 65 73 74 2e  te3 db2 sv_test.
bd50: 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  db.  do_test pag
bd60: 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e  er1-13.1.2.$nUp.
bd70: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
bd80: 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e  { SELECT sum(len
bd90: 67 74 68 28 62 29 29 20 46 52 4f 4d 20 74 31 20  gth(b)) FROM t1 
bda0: 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78 70 72 20  } db2.  } [expr 
bdb0: 7b 31 32 38 2a 34 30 30 20 2d 20 28 24 6e 55 70  {128*400 - ($nUp
bdc0: 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20  -1)}].  do_test 
bdd0: 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e  pager1-13.1.2.$n
bde0: 55 70 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  Up.4 {.    execs
bdf0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  ql { PRAGMA inte
be00: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62  grity_check } db
be10: 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32  2.  } {ok}.  db2
be20: 20 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a 69 66 20 7b   close.}.}..if {
be30: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
be40: 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69 6e 64  platform)!="wind
be50: 6f 77 73 22 7d 20 7b 0a 23 20 53 61 6d 65 20 74  ows"} {.# Same t
be60: 65 73 74 20 61 73 20 61 62 6f 76 65 2e 20 42 75  est as above. Bu
be70: 74 20 74 68 69 73 20 74 69 6d 65 20 77 69 74 68  t this time with
be80: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74 68 65   an index on the
be90: 20 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65   table..#.do_exe
bea0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
beb0: 2d 31 33 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41  -13.2.1 {.  CREA
bec0: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
bed0: 31 28 62 29 3b 0a 20 20 55 50 44 41 54 45 20 74  1(b);.  UPDATE t
bee0: 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  1 SET b = a_stri
bef0: 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f  ng(400);.} {}.fo
bf00: 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24  r {set nUp 1} {$
bf10: 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55  nUp<64} {incr nU
bf20: 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71  p} {.  do_execsq
bf30: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
bf40: 2e 32 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20  .2.2.$nUp.1 { . 
bf50: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
bf60: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39   b = a_string(39
bf70: 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e  9) WHERE a <= $n
bf80: 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65  Up.  } {}.  do_e
bf90: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
bfa0: 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 32  r1-13.2.2.$nUp.2
bfb0: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
bfc0: 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d  ity_check } {ok}
bfd0: 20 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20   .  sqlite3 db2 
bfe0: 73 76 5f 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f  sv_test.db.  do_
bff0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32  test pager1-13.2
c000: 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20  .2.$nUp.3 {.    
c010: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
c020: 20 73 75 6d 28 6c 65 6e 67 74 68 28 62 29 29 20   sum(length(b)) 
c030: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20  FROM t1 } db2.  
c040: 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a 34 30 30  } [expr {128*400
c050: 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20   - ($nUp-1)}].  
c060: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
c070: 33 2e 32 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20  3.2.2.$nUp.4 {. 
c080: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41     execsql { PRA
c090: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
c0a0: 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f  eck } db2.  } {o
c0b0: 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d  k}.  db2 close.}
c0c0: 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  .}..db close.tv 
c0d0: 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  delete..#-------
c0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c  --.# Test specal
c130: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
c140: 5f 6d 6f 64 65 3d 4f 46 46 22 20 74 65 73 74 20  _mode=OFF" test 
c150: 63 61 73 65 73 2e 0a 23 0a 66 61 75 6c 74 73 69  cases..#.faultsi
c160: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
c170: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
c180: 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e  est pager1-14.1.
c190: 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75  1 {.  PRAGMA jou
c1a0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b  rnal_mode = OFF;
c1b0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
c1c0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 42 45 47 49  t1(a, b);.  BEGI
c1d0: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
c1e0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
c1f0: 32 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  2);.  COMMIT;.  
c200: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
c210: 3b 0a 7d 20 7b 6f 66 66 20 31 20 32 7d 0a 64 6f  ;.} {off 1 2}.do
c220: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
c230: 61 67 65 72 31 2d 31 34 2e 31 2e 32 20 7b 0a 20  ager1-14.1.2 {. 
c240: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
c250: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
c260: 53 28 33 2c 20 34 29 3b 0a 20 20 52 4f 4c 4c 42  S(3, 4);.  ROLLB
c270: 41 43 4b 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  ACK;.} {0 {}}.do
c280: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
c290: 67 65 72 31 2d 31 34 2e 31 2e 33 20 7b 0a 20 20  ger1-14.1.3 {.  
c2a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
c2b0: 3b 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 63 61 74  ;.} {1 2}.do_cat
c2c0: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
c2d0: 31 2d 31 34 2e 31 2e 34 20 7b 0a 20 20 42 45 47  1-14.1.4 {.  BEG
c2e0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
c2f0: 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c  NTO t1(rowid, a,
c300: 20 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20   b) SELECT a+3, 
c310: 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20  b, b FROM t1;.  
c320: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
c330: 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 53 45  (rowid, a, b) SE
c340: 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62 20 46  LECT a+3, b, b F
c350: 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b 50 52  ROM t1;.} {1 {PR
c360: 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62  IMARY KEY must b
c370: 65 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65 78  e unique}}.do_ex
c380: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
c390: 31 2d 31 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d  1-14.1.5 {.  COM
c3a0: 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  MIT;.  SELECT * 
c3b0: 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20  FROM t1;.} {1 2 
c3c0: 32 20 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  2 2}..#---------
c3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c410: 0a 23 20 54 65 73 74 20 6f 70 65 6e 69 6e 67 20  .# Test opening 
c420: 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
c430: 70 61 67 65 72 20 73 75 62 2d 73 79 73 74 65 6d  pager sub-system
c440: 20 77 69 74 68 20 64 69 66 66 65 72 65 6e 74 20   with different 
c450: 76 61 6c 75 65 73 0a 23 20 66 6f 72 20 74 68 65  values.# for the
c460: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f   sqlite3_vfs.szO
c470: 73 46 69 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a  sFile variable..
c480: 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74  #.faultsim_delet
c490: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f  e_and_reopen.do_
c4a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c4b0: 65 72 31 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45  er1-15.0 {.  CRE
c4c0: 41 54 45 20 54 41 42 4c 45 20 74 78 28 79 2c 20  ATE TABLE tx(y, 
c4d0: 7a 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  z);.  INSERT INT
c4e0: 4f 20 74 78 20 56 41 4c 55 45 53 28 27 41 79 75  O tx VALUES('Ayu
c4f0: 74 74 68 61 79 61 27 2c 20 27 42 65 69 6a 69 6e  tthaya', 'Beijin
c500: 67 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  g');.  INSERT IN
c510: 54 4f 20 74 78 20 56 41 4c 55 45 53 28 27 4c 6f  TO tx VALUES('Lo
c520: 6e 64 6f 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b  ndon', 'Tokyo');
c530: 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66  .} {}.db close.f
c540: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
c550: 3c 35 31 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d  <513} {incr i 3}
c560: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
c570: 2d 64 65 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73  -default 1 -szos
c580: 66 69 6c 65 20 24 69 0a 20 20 73 71 6c 69 74 65  file $i.  sqlite
c590: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
c5a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
c5b0: 61 67 65 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a  ager1-15.$i.1 {.
c5c0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
c5d0: 4d 20 74 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74  M tx;.  } {Ayutt
c5e0: 68 61 79 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e  haya Beijing Lon
c5f0: 64 6f 6e 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20  don Tokyo}.  db 
c600: 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74  close.  tv delet
c610: 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.}..#----------
c620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c660: 23 20 43 68 65 63 6b 20 74 68 61 74 20 69 74 20  # Check that it 
c670: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
c680: 74 6f 20 6f 70 65 6e 20 61 20 64 61 74 61 62 61  to open a databa
c690: 73 65 20 66 69 6c 65 20 69 66 20 74 68 65 20 66  se file if the f
c6a0: 75 6c 6c 20 70 61 74 68 0a 23 20 74 6f 20 74 68  ull path.# to th
c6b0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75  e associated jou
c6c0: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
c6d0: 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 73 71  e longer than sq
c6e0: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
c6f0: 6e 61 6d 65 2e 0a 23 0a 74 65 73 74 76 66 73 20  name..#.testvfs 
c700: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76  tv -default 1.tv
c710: 20 73 63 72 69 70 74 20 78 4f 70 65 6e 43 62 0a   script xOpenCb.
c720: 74 76 20 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a  tv filter xOpen.
c730: 70 72 6f 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65  proc xOpenCb {me
c740: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
c750: 67 73 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 66 69  gs} {.  set ::fi
c760: 6c 65 5f 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c  le_len [string l
c770: 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d  ength $filename]
c780: 0a 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  .}.sqlite3 db te
c790: 73 74 2e 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74  st.db.db close.t
c7a0: 76 20 64 65 6c 65 74 65 0a 0a 66 6f 72 20 7b 73  v delete..for {s
c7b0: 65 74 20 69 69 20 5b 65 78 70 72 20 24 3a 3a 66  et ii [expr $::f
c7c0: 69 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69  ile_len-5]} {$ii
c7d0: 20 3c 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65   < [expr $::file
c7e0: 5f 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72 20  _len+20]} {incr 
c7f0: 69 69 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 20  ii} {.  testvfs 
c800: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 6d  tv -default 1 -m
c810: 78 70 61 74 68 6e 61 6d 65 20 24 69 69 0a 0a 20  xpathname $ii.. 
c820: 20 23 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66   # The length of
c830: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74   the full path t
c840: 6f 20 66 69 6c 65 20 22 74 65 73 74 2e 64 62 2d  o file "test.db-
c850: 6a 6f 75 72 6e 61 6c 22 20 69 73 20 28 24 3a 3a  journal" is ($::
c860: 66 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23  file_len+8)..  #
c870: 20 49 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   If the configur
c880: 65 64 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  ed sqlite3_vfs.m
c890: 78 50 61 74 68 6e 61 6d 65 20 76 61 6c 75 65 20  xPathname value 
c8a0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
c8b0: 65 71 75 61 6c 20 74 6f 0a 20 20 23 20 74 68 69  equal to.  # thi
c8c0: 73 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  s, then the file
c8d0: 20 63 61 6e 20 62 65 20 6f 70 65 6e 65 64 2e 20   can be opened. 
c8e0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 63 61  Otherwise, it ca
c8f0: 6e 6e 6f 74 2e 0a 20 20 23 0a 20 20 69 66 20 7b  nnot..  #.  if {
c900: 24 69 69 20 3e 3d 20 5b 65 78 70 72 20 24 3a 3a  $ii >= [expr $::
c910: 66 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20  file_len+8]} {. 
c920: 20 20 20 73 65 74 20 72 65 73 20 7b 30 20 7b 7d     set res {0 {}
c930: 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
c940: 20 73 65 74 20 72 65 73 20 7b 31 20 7b 75 6e 61   set res {1 {una
c950: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
c960: 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a  base file}}.  }.
c970: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
c980: 31 2d 31 36 2e 31 2e 24 69 69 20 7b 0a 20 20 20  1-16.1.$ii {.   
c990: 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73   list [catch { s
c9a0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
c9b0: 62 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20  b } msg] $msg.  
c9c0: 7d 20 24 72 65 73 0a 0a 20 20 63 61 74 63 68 20  } $res..  catch 
c9d0: 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 74 76 20  {db close}.  tv 
c9e0: 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  delete.}..#-----
c9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca30: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50 52 41  ----.# Test "PRA
ca40: 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63  GMA omit_readloc
ca50: 6b 22 2e 20 0a 23 0a 23 20 20 20 70 61 67 65 72  k". .#.#   pager
ca60: 31 2d 31 37 2e 24 74 6e 2e 31 2e 2a 3a 20 54 65  1-17.$tn.1.*: Te
ca70: 73 74 20 74 68 61 74 20 69 66 20 61 20 73 65 63  st that if a sec
ca80: 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ond connection h
ca90: 61 73 20 61 6e 20 6f 70 65 6e 20 0a 23 20 20 20  as an open .#   
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74     read-transact
cac0: 69 6f 6e 2c 20 69 74 20 69 73 20 6e 6f 74 20 75  ion, it is not u
cad0: 73 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  sually possible 
cae0: 74 6f 20 77 72 69 74 65 20 0a 23 20 20 20 20 20  to write .#     
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 23   the database..#
cb10: 0a 23 20 20 20 70 61 67 65 72 31 2d 31 37 2e 24  .#   pager1-17.$
cb20: 74 6e 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61  tn.2.*: Test tha
cb30: 74 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t if the second 
cb40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 6f  connection was o
cb50: 70 65 6e 65 64 20 77 69 74 68 0a 23 20 20 20 20  pened with.#    
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 20 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45    the SQLITE_OPE
cb80: 4e 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c  N_READONLY flag,
cb90: 20 61 6e 64 20 0a 23 20 20 20 20 20 20 20 20 20   and .#         
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50 52               "PR
cbb0: 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f  AGMA omit_readlo
cbc0: 63 6b 20 3d 20 31 22 20 69 73 20 65 78 65 63 75  ck = 1" is execu
cbd0: 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 61 63  ted before attac
cbe0: 68 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20 20  hing.#          
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
cc00: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6f 70 65  database and ope
cc10: 6e 69 6e 67 20 61 20 72 65 61 64 2d 74 72 61 6e  ning a read-tran
cc20: 73 61 63 74 69 6f 6e 20 6f 6e 20 69 74 2c 20 69  saction on it, i
cc30: 74 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20  t is.#          
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 73 73              poss
cc50: 69 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 68  ible to write th
cc60: 65 20 64 62 2e 0a 23 0a 23 20 20 20 70 61 67 65  e db..#.#   page
cc70: 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 2a 3a 20 54  r1-17.$tn.3.*: T
cc80: 65 73 74 20 74 68 61 74 20 69 66 20 74 68 65 20  est that if the 
cc90: 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  second connectio
cca0: 6e 20 77 61 73 20 2a 6e 6f 74 2a 20 6f 70 65 6e  n was *not* open
ccb0: 65 64 20 77 69 74 68 0a 23 20 20 20 20 20 20 20  ed with.#       
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
ccd0: 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  he SQLITE_OPEN_R
cce0: 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20 65 78  EADONLY flag, ex
ccf0: 65 63 75 74 69 6e 67 20 0a 23 20 20 20 20 20 20  ecuting .#      
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61  "PRAGMA omit_rea
cd20: 64 6c 6f 63 6b 20 3d 20 31 22 20 68 61 73 20 6e  dlock = 1" has n
cd30: 6f 20 65 66 66 65 63 74 2e 0a 23 0a 64 6f 5f 6d  o effect..#.do_m
cd40: 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20  ulticlient_test 
cd50: 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  tn {.  do_test p
cd60: 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 31  ager1-17.$tn.1.1
cd70: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20   {.    sql1 { . 
cd80: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
cd90: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
cda0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
cdb0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
cdc0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 0a     }.    sql2 {.
cdd0: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
cde0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
cdf0: 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t1;.    }.  } {
ce00: 31 20 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  1 2}.  do_test p
ce10: 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 32  ager1-17.$tn.1.2
ce20: 20 7b 0a 20 20 20 20 63 73 71 6c 31 20 7b 20 49   {.    csql1 { I
ce30: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
ce40: 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d  LUES(3, 4) }.  }
ce50: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
ce60: 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74   locked}}.  do_t
ce70: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
ce80: 6e 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71 6c 32  n.1.3 {.    sql2
ce90: 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20   { COMMIT }.    
cea0: 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e  sql1 { INSERT IN
ceb0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
cec0: 34 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64  4) }.  } {}..  d
ced0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37  o_test pager1-17
cee0: 2e 24 74 6e 2e 32 2e 31 20 7b 0a 20 20 20 20 63  .$tn.2.1 {.    c
cef0: 6f 64 65 32 20 7b 0a 20 20 20 20 20 20 64 62 32  ode2 {.      db2
cf00: 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 73 71 6c   close.      sql
cf10: 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79  ite3 db2 :memory
cf20: 3a 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a 20 20  : -readonly 1.  
cf30: 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20 0a    }.    sql2 { .
cf40: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6f 6d 69        PRAGMA omi
cf50: 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 3b 0a  t_readlock = 1;.
cf60: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65        ATTACH 'te
cf70: 73 74 2e 64 62 27 20 41 53 20 74 77 6f 3b 0a 20  st.db' AS two;. 
cf80: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
cf90: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
cfa0: 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  t1;.    }.  } {1
cfb0: 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73   2 3 4}.  do_tes
cfc0: 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e  t pager1-17.$tn.
cfd0: 32 2e 32 20 7b 20 73 71 6c 31 20 22 49 4e 53 45  2.2 { sql1 "INSE
cfe0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
cff0: 53 28 35 2c 20 36 29 22 20 7d 20 7b 7d 0a 20 20  S(5, 6)" } {}.  
d000: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d010: 37 2e 24 74 6e 2e 32 2e 33 20 7b 20 73 71 6c 32  7.$tn.2.3 { sql2
d020: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
d030: 74 31 22 20 7d 20 20 20 20 20 20 20 20 20 20 20  t1" }           
d040: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f   {1 2 3 4}.  do_
d050: 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24  test pager1-17.$
d060: 74 6e 2e 32 2e 34 20 7b 20 73 71 6c 32 20 22 43  tn.2.4 { sql2 "C
d070: 4f 4d 4d 49 54 20 3b 20 53 45 4c 45 43 54 20 2a  OMMIT ; SELECT *
d080: 20 46 52 4f 4d 20 74 31 22 20 7d 20 20 20 7b 31   FROM t1" }   {1
d090: 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 20 20 64   2 3 4 5 6}..  d
d0a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37  o_test pager1-17
d0b0: 2e 24 74 6e 2e 33 2e 31 20 7b 0a 20 20 20 20 63  .$tn.3.1 {.    c
d0c0: 6f 64 65 32 20 7b 0a 20 20 20 20 20 20 64 62 32  ode2 {.      db2
d0d0: 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 73 71 6c   close.      sql
d0e0: 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79  ite3 db2 :memory
d0f0: 3a 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32  :.    }.    sql2
d100: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
d110: 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d   omit_readlock =
d120: 20 31 3b 0a 20 20 20 20 20 20 41 54 54 41 43 48   1;.      ATTACH
d130: 20 27 74 65 73 74 2e 64 62 27 20 41 53 20 74 77   'test.db' AS tw
d140: 6f 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  o;.      BEGIN;.
d150: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
d160: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20  ROM t1;.    }.  
d170: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
d180: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
d190: 2d 31 37 2e 24 74 6e 2e 33 2e 32 20 7b 0a 20 20  -17.$tn.3.2 {.  
d1a0: 63 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49  csql1 { INSERT I
d1b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
d1c0: 20 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61   4) }.  } {1 {da
d1d0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
d1e0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }}.  do_test pag
d1f0: 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 33 20 7b  er1-17.$tn.3.3 {
d200: 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 7b   sql2 COMMIT } {
d210: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
d220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d260: 23 20 54 65 73 74 20 74 68 65 20 70 61 67 65 72  # Test the pager
d270: 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68  s response to th
d280: 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 72  e b-tree layer r
d290: 65 71 75 65 73 74 69 6e 67 20 69 6c 6c 65 67 61  equesting illega
d2a0: 6c 20 70 61 67 65 20 0a 23 20 6e 75 6d 62 65 72  l page .# number
d2b0: 73 3a 0a 23 0a 23 20 20 20 2b 20 54 68 65 20 6c  s:.#.#   + The l
d2c0: 6f 63 6b 69 6e 67 20 70 61 67 65 2c 0a 23 20 20  ocking page,.#  
d2d0: 20 2b 20 50 61 67 65 20 30 2c 0a 23 20 20 20 2b   + Page 0,.#   +
d2e0: 20 41 20 70 61 67 65 20 77 69 74 68 20 61 20 70   A page with a p
d2f0: 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
d300: 65 72 20 74 68 61 6e 20 28 32 5e 33 31 2d 31 29  er than (2^31-1)
d310: 2e 0a 23 0a 23 20 54 68 65 73 65 20 74 65 73 74  ..#.# These test
d320: 73 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  s will not work 
d330: 69 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  if SQLITE_DIRECT
d340: 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 20 69  _OVERFLOW_READ i
d350: 73 20 64 65 66 69 6e 65 64 2e 20 49 6e 0a 23 20  s defined. In.# 
d360: 74 68 61 74 20 63 61 73 65 20 49 4f 20 65 72 72  that case IO err
d370: 6f 72 73 20 61 72 65 20 73 6f 6d 65 74 69 6d 65  ors are sometime
d380: 73 20 72 65 70 6f 72 74 65 64 20 69 6e 73 74 65  s reported inste
d390: 61 64 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 52  ad of SQLITE_COR
d3a0: 52 55 50 54 2e 0a 23 0a 69 66 63 61 70 61 62 6c  RUPT..#.ifcapabl
d3b0: 65 20 21 64 69 72 65 63 74 5f 72 65 61 64 20 7b  e !direct_read {
d3c0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
d3d0: 31 38 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  18.1 {.  faultsi
d3e0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
d3f0: 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
d400: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
d410: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
d420: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
d430: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
d440: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
d450: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
d460: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
d470: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
d480: 73 74 72 69 6e 67 28 32 30 30 29 29 3b 0a 20 20  string(200));.  
d490: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d4a0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d4b0: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d4c0: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d4d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d4e0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d4f0: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d500: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d510: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d520: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d530: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d540: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d550: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d560: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d570: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d580: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d590: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d5a0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d5b0: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d5c0: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d5d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d5e0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d5f0: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d600: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d610: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d620: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d630: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d640: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d650: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
d660: 61 67 65 72 31 2d 31 38 2e 32 20 7b 0a 20 20 73  ager1-18.2 {.  s
d670: 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20  et root [db one 
d680: 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65  "SELECT rootpage
d690: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
d6a0: 74 65 72 22 5d 0a 20 20 73 65 74 20 6c 6f 63 6b  ter"].  set lock
d6b0: 69 6e 67 70 61 67 65 20 5b 65 78 70 72 20 28 30  ingpage [expr (0
d6c0: 78 31 30 30 30 30 2f 31 30 32 34 29 20 2b 20 31  x10000/1024) + 1
d6d0: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ].  execsql {.  
d6e0: 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c    PRAGMA writabl
d6f0: 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  e_schema = 1;.  
d700: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
d710: 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70  master SET rootp
d720: 61 67 65 20 3d 20 24 6c 6f 63 6b 69 6e 67 70 61  age = $lockingpa
d730: 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
d740: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
d750: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
d760: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
d770: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t1 } db2.} {1 {d
d780: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d790: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d7a0: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
d7b0: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 33 20  est pager1-18.3 
d7c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
d7d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
d7e0: 32 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  2(x);.    INSERT
d7f0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
d800: 61 5f 73 74 72 69 6e 67 28 35 30 30 30 29 29 3b  a_string(5000));
d810: 0a 20 20 7d 0a 20 20 73 65 74 20 70 67 6e 6f 20  .  }.  set pgno 
d820: 5b 65 78 70 72 20 28 5b 66 69 6c 65 20 73 69 7a  [expr ([file siz
d830: 65 20 74 65 73 74 2e 64 62 5d 20 2f 20 31 30 32  e test.db] / 102
d840: 34 29 2d 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72  4)-2].  hexio_wr
d850: 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ite test.db [exp
d860: 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34  r ($pgno-1)*1024
d870: 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 00000000.  sql
d880: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
d890: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d8a0: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46  LECT length(x) F
d8b0: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
d8c0: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
d8d0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
d8e0: 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  med}}.db2 close.
d8f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d900: 38 2e 34 20 7b 0a 20 20 68 65 78 69 6f 5f 77 72  8.4 {.  hexio_wr
d910: 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ite test.db [exp
d920: 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34  r ($pgno-1)*1024
d930: 5d 20 39 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 90000000.  sql
d940: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
d950: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d960: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46  LECT length(x) F
d970: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
d980: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
d990: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
d9a0: 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  med}}.db2 close.
d9b0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d9c0: 38 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  8.5 {.  sqlite3 
d9d0: 64 62 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20  db "".  execsql 
d9e0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
d9f0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
da00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
da10: 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47  (a, b);.    PRAG
da20: 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
da30: 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41  ma = 1;.    UPDA
da40: 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TE sqlite_master
da50: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 35 20   SET rootpage=5 
da60: 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d  WHERE tbl_name =
da70: 20 27 74 31 27 3b 0a 20 20 20 20 50 52 41 47 4d   't1';.    PRAGM
da80: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
da90: 61 20 3d 20 30 3b 0a 20 20 20 20 41 4c 54 45 52  a = 0;.    ALTER
daa0: 20 54 41 42 4c 45 20 74 31 20 52 45 4e 41 4d 45   TABLE t1 RENAME
dab0: 20 54 4f 20 78 31 3b 0a 20 20 7d 0a 20 20 63 61   TO x1;.  }.  ca
dac0: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
dad0: 2a 20 46 52 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31  * FROM x1 }.} {1
dae0: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
daf0: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
db00: 65 64 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 64  ed}}.db close..d
db10: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38  o_test pager1-18
db20: 2e 36 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .6 {.  faultsim_
db30: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
db40: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
db50: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
db60: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
db70: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
db80: 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
db90: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
dba0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
dbb0: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
dbc0: 67 28 38 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  g(800));.    INS
dbd0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
dbe0: 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29  ES(a_string(800)
dbf0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 6f  );.  }..  set ro
dc00: 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45  ot [db one "SELE
dc10: 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
dc20: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d   sqlite_master"]
dc30: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 0a 20 20 68  .  db close..  h
dc40: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
dc50: 64 62 20 5b 65 78 70 72 20 28 24 72 6f 6f 74 2d  db [expr ($root-
dc60: 31 29 2a 31 30 32 34 20 2b 20 38 5d 20 30 30 30  1)*1024 + 8] 000
dc70: 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
dc80: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  db test.db.  cat
dc90: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c  chsql { SELECT l
dca0: 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20 74 31  ength(x) FROM t1
dcb0: 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73   }.} {1 {databas
dcc0: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
dcd0: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 64  malformed}}.}..d
dce0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 39  o_test pager1-19
dcf0: 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .1 {.  sqlite3 d
dd00: 62 20 22 22 0a 20 20 64 62 20 66 75 6e 63 20 61  b "".  db func a
dd10: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
dd20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
dd30: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
dd40: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 50 52 41  e = 512;.    PRA
dd50: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
dd60: 3d 20 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20  = 1;.    CREATE 
dd70: 54 41 42 4c 45 20 74 31 28 61 61 2c 20 61 62 2c  TABLE t1(aa, ab,
dd80: 20 61 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c   ac, ad, ae, af,
dd90: 20 61 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c   ag, ah, ai, aj,
dda0: 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c   ak, al, am, an,
ddb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ddc0: 20 20 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c       ba, bb, bc,
ddd0: 20 62 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c   bd, be, bf, bg,
dde0: 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c   bh, bi, bj, bk,
ddf0: 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20   bl, bm, bn,.   
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 63 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c   ca, cb, cc, cd,
de20: 20 63 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c   ce, cf, cg, ch,
de30: 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c   ci, cj, ck, cl,
de40: 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20   cm, cn,.       
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 2c               da,
de60: 20 64 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c   db, dc, dd, de,
de70: 20 64 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c   df, dg, dh, di,
de80: 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c   dj, dk, dl, dm,
de90: 20 64 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   dn,.           
dea0: 20 20 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c           ea, eb,
deb0: 20 65 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c   ec, ed, ee, ef,
dec0: 20 65 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c   eg, eh, ei, ej,
ded0: 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c   ek, el, em, en,
dee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
def0: 20 20 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c       fa, fb, fc,
df00: 20 66 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c   fd, fe, ff, fg,
df10: 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c   fh, fi, fj, fk,
df20: 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20   fl, fm, fn,.   
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 67 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c   ga, gb, gc, gd,
df50: 20 67 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c   ge, gf, gg, gh,
df60: 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c   gi, gj, gk, gl,
df70: 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20   gm, gn,.       
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 2c               ha,
df90: 20 68 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c   hb, hc, hd, he,
dfa0: 20 68 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c   hf, hg, hh, hi,
dfb0: 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c   hj, hk, hl, hm,
dfc0: 20 68 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   hn,.           
dfd0: 20 20 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c           ia, ib,
dfe0: 20 69 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c   ic, id, ie, if,
dff0: 20 69 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c   ig, ih, ii, ij,
e000: 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c   ik, il, im, ix,
e010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e020: 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c       ja, jb, jc,
e030: 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c   jd, je, jf, jg,
e040: 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c   jh, ji, jj, jk,
e050: 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20   jl, jm, jn,.   
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c   ka, kb, kc, kd,
e080: 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c   ke, kf, kg, kh,
e090: 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c   ki, kj, kk, kl,
e0a0: 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20   km, kn,.       
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c               la,
e0c0: 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c   lb, lc, ld, le,
e0d0: 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c   lf, lg, lh, li,
e0e0: 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c   lj, lk, ll, lm,
e0f0: 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   ln,.           
e100: 20 20 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c           ma, mb,
e110: 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c   mc, md, me, mf,
e120: 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c   mg, mh, mi, mj,
e130: 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a   mk, ml, mm, mn.
e140: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
e150: 45 20 54 41 42 4c 45 20 74 32 28 61 61 2c 20 61  E TABLE t2(aa, a
e160: 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c 20 61  b, ac, ad, ae, a
e170: 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c 20 61  f, ag, ah, ai, a
e180: 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61  j, ak, al, am, a
e190: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e1a0: 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c 20 62         ba, bb, b
e1b0: 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c 20 62  c, bd, be, bf, b
e1c0: 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62  g, bh, bi, bj, b
e1d0: 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20  k, bl, bm, bn,. 
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c 20 63     ca, cb, cc, c
e200: 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c 20 63  d, ce, cf, cg, c
e210: 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63  h, ci, cj, ck, c
e220: 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20  l, cm, cn,.     
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
e240: 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c 20 64  a, db, dc, dd, d
e250: 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c 20 64  e, df, dg, dh, d
e260: 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64  i, dj, dk, dl, d
e270: 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, dn,.         
e280: 20 20 20 20 20 20 20 20 20 20 20 65 61 2c 20 65             ea, e
e290: 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c 20 65  b, ec, ed, ee, e
e2a0: 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c 20 65  f, eg, eh, ei, e
e2b0: 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65  j, ek, el, em, e
e2c0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
e2d0: 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c 20 66         fa, fb, f
e2e0: 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c 20 66  c, fd, fe, ff, f
e2f0: 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66  g, fh, fi, fj, f
e300: 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20  k, fl, fm, fn,. 
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c 20 67     ga, gb, gc, g
e330: 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c 20 67  d, ge, gf, gg, g
e340: 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67  h, gi, gj, gk, g
e350: 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20  l, gm, gn,.     
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
e370: 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c 20 68  a, hb, hc, hd, h
e380: 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c 20 68  e, hf, hg, hh, h
e390: 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68  i, hj, hk, hl, h
e3a0: 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, hn,.         
e3b0: 20 20 20 20 20 20 20 20 20 20 20 69 61 2c 20 69             ia, i
e3c0: 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c 20 69  b, ic, id, ie, i
e3d0: 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c 20 69  f, ig, ih, ii, i
e3e0: 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69  j, ik, il, im, i
e3f0: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
e400: 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a         ja, jb, j
e410: 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a  c, jd, je, jf, j
e420: 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a  g, jh, ji, jj, j
e430: 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20  k, jl, jm, jn,. 
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b     ka, kb, kc, k
e460: 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b  d, ke, kf, kg, k
e470: 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b  h, ki, kj, kk, k
e480: 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20  l, km, kn,.     
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
e4a0: 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c  a, lb, lc, ld, l
e4b0: 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c  e, lf, lg, lh, l
e4c0: 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c  i, lj, lk, ll, l
e4d0: 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, ln,.         
e4e0: 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c 20 6d             ma, m
e4f0: 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d  b, mc, md, me, m
e500: 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d  f, mg, mh, mi, m
e510: 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d  j, mk, ml, mm, m
e520: 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53  n.    );.    INS
e530: 45 52 54 20 49 4e 54 4f 20 74 31 28 61 61 29 20  ERT INTO t1(aa) 
e540: 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67  VALUES( a_string
e550: 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20  (100000) );.    
e560: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 61  INSERT INTO t2(a
e570: 61 29 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72  a) VALUES( a_str
e580: 69 6e 67 28 31 30 30 30 30 30 29 20 29 3b 0a 20  ing(100000) );. 
e590: 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d     VACUUM;.  }.}
e5a0: 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
e5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
e5f0: 23 20 54 65 73 74 20 61 20 63 6f 75 70 6c 65 20  # Test a couple 
e600: 6f 66 20 73 70 65 63 69 61 6c 20 63 61 73 65 73  of special cases
e610: 20 74 68 61 74 20 63 6f 6d 65 20 75 70 20 77 68   that come up wh
e620: 69 6c 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 0a  ile committing .
e630: 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 3a 0a  # transactions:.
e640: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e  #.#   pager1-20.
e650: 31 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20  1.*: Committing 
e660: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
e670: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
e680: 6e 20 77 68 65 6e 20 74 68 65 20 0a 23 20 20 20  n when the .#   
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
e6a0: 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20  atabase has not 
e6b0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 74  been modified at
e6c0: 20 61 6c 6c 2e 0a 23 0a 23 20 20 20 70 61 67 65   all..#.#   page
e6d0: 72 31 2d 32 30 2e 32 2e 2a 3a 20 41 73 20 61 62  r1-20.2.*: As ab
e6e0: 6f 76 65 2c 20 62 75 74 20 77 69 74 68 20 61 20  ove, but with a 
e6f0: 6e 6f 72 6d 61 6c 20 64 62 20 69 6e 20 65 78 63  normal db in exc
e700: 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d  lusive-locking m
e710: 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72  ode..#.#   pager
e720: 31 2d 32 30 2e 33 2e 2a 3a 20 43 6f 6d 6d 69 74  1-20.3.*: Commit
e730: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
e740: 6f 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 77  on in WAL mode w
e750: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
e760: 65 20 68 61 73 0a 23 20 20 20 20 20 20 20 20 20  e has.#         
e770: 20 20 20 20 20 20 20 20 20 62 65 65 6e 20 6d 6f           been mo
e780: 64 69 66 69 65 64 2c 20 62 75 74 20 61 6c 6c 20  dified, but all 
e790: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
e7a0: 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f   been flushed to
e7b0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
e7c0: 20 20 20 20 20 64 69 73 6b 20 62 65 66 6f 72 65       disk before
e7d0: 20 74 68 65 20 63 6f 6d 6d 69 74 2e 0a 23 0a 64   the commit..#.d
e7e0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30  o_test pager1-20
e7f0: 2e 31 2e 31 20 7b 0a 20 20 63 61 74 63 68 20 7b  .1.1 {.  catch {
e800: 64 62 20 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69  db close}.  sqli
e810: 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a  te3 db :memory:.
e820: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
e830: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65  CREATE TABLE one
e840: 28 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20  (two, three);.  
e850: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e    INSERT INTO on
e860: 65 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  e VALUES('a', 'b
e870: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ');.  }.} {}.do_
e880: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31  test pager1-20.1
e890: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
e8a0: 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55  .    BEGIN EXCLU
e8b0: 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  SIVE;.    COMMIT
e8c0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  ;.  }.} {}..do_t
e8d0: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 32 2e  est pager1-20.2.
e8e0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
e8f0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
e900: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
e910: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
e920: 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65  mode = exclusive
e930: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
e940: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73  rnal_mode = pers
e950: 69 73 74 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ist;.    CREATE 
e960: 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74  TABLE one(two, t
e970: 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53 45 52  hree);.    INSER
e980: 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45  T INTO one VALUE
e990: 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d  S('a', 'b');.  }
e9a0: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 70 65  .} {exclusive pe
e9b0: 72 73 69 73 74 7d 0a 64 6f 5f 74 65 73 74 20 70  rsist}.do_test p
e9c0: 61 67 65 72 31 2d 32 30 2e 32 2e 32 20 7b 0a 20  ager1-20.2.2 {. 
e9d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
e9e0: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a  EGIN EXCLUSIVE;.
e9f0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
ea00: 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20  } {}..ifcapable 
ea10: 77 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  wal {.  do_test 
ea20: 70 61 67 65 72 31 2d 32 30 2e 33 2e 31 20 7b 0a  pager1-20.3.1 {.
ea30: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c      faultsim_del
ea40: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
ea50: 20 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72     db func a_str
ea60: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20  ing a_string.   
ea70: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
ea80: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
ea90: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 50  ze = 10;.      P
eaa0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
eab0: 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20  de = wal;.      
eac0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43  BEGIN;.        C
ead0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
eae0: 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  );.        CREAT
eaf0: 45 20 54 41 42 4c 45 20 74 32 28 79 29 3b 0a 20  E TABLE t2(y);. 
eb00: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
eb10: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73  TO t1 VALUES(a_s
eb20: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
eb30: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
eb40: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
eb50: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
eb60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32  ;         /*   2
eb70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45   */.        INSE
eb80: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
eb90: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  T a_string(800) 
eba0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
ebb0: 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 20   /*   4 */.     
ebc0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
ebd0: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
ebe0: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
ebf0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38 20 2a          /*   8 *
ec00: 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  /.        INSERT
ec10: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
ec20: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
ec30: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
ec40: 2a 20 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 20  *  16 */.       
ec50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ec60: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
ec70: 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  800) FROM t1;   
ec80: 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a        /*  32 */.
ec90: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
eca0: 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20    }.  } {wal}.  
ecb0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
ecc0: 30 2e 33 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  0.3.2 {.    exec
ecd0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49  sql {.      BEGI
ece0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
ecf0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
ed00: 78 78 78 78 27 29 3b 0a 20 20 20 20 7d 0a 20 20  xxxx');.    }.  
ed10: 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65    recursive_sele
ed20: 63 74 20 33 32 20 74 31 0a 20 20 20 20 65 78 65  ct 32 t1.    exe
ed30: 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 7d 20  csql COMMIT.  } 
ed40: 7b 7d 0a 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed90: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20 57  .# Test that a W
eda0: 41 4c 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  AL database may 
edb0: 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 20 69 66  not be opened if
edc0: 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  :.#.#   pager1-2
edd0: 31 2e 31 2e 2a 3a 20 54 68 65 20 56 46 53 20 68  1.1.*: The VFS h
ede0: 61 73 20 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c  as an iVersion l
edf0: 65 73 73 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23  ess than 2, or.#
ee00: 20 20 20 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a     pager1-21.2.*
ee10: 3a 20 54 68 65 20 56 46 53 20 64 6f 65 73 20 6e  : The VFS does n
ee20: 6f 74 20 70 72 6f 76 69 64 65 20 78 53 68 6d 58  ot provide xShmX
ee30: 58 58 28 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a  XX() methods..#.
ee40: 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a  ifcapable wal {.
ee50: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ee60: 2d 32 31 2e 30 20 7b 0a 20 20 20 20 66 61 75 6c  -21.0 {.    faul
ee70: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
ee80: 72 65 6f 70 65 6e 0a 20 20 20 20 65 78 65 63 73  reopen.    execs
ee90: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
eea0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
eeb0: 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52 45 41   WAL;.      CREA
eec0: 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20 44 45  TE TABLE ko(c DE
eed0: 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62 20 44  FAULT 'abc', b D
eee0: 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b 0a 20  EFAULT 'def');. 
eef0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
ef00: 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55   ko DEFAULT VALU
ef10: 45 53 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77  ES;.    }.  } {w
ef20: 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  al}.  do_test pa
ef30: 67 65 72 31 2d 32 31 2e 31 20 7b 0a 20 20 20 20  ger1-21.1 {.    
ef40: 74 65 73 74 76 66 73 20 74 76 20 2d 6e 6f 73 68  testvfs tv -nosh
ef50: 6d 20 31 0a 20 20 20 20 73 71 6c 69 74 65 33 20  m 1.    sqlite3 
ef60: 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73  db2 test.db -vfs
ef70: 20 74 76 0a 20 20 20 20 63 61 74 63 68 73 71 6c   tv.    catchsql
ef80: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
ef90: 20 6b 6f 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31   ko } db2.  } {1
efa0: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
efb0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
efc0: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 74  .  db2 close.  t
efd0: 76 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65  v delete.  do_te
efe0: 73 74 20 70 61 67 65 72 31 2d 32 31 2e 32 20 7b  st pager1-21.2 {
eff0: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
f000: 2d 69 76 65 72 73 69 6f 6e 20 31 0a 20 20 20 20  -iversion 1.    
f010: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
f020: 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20 20 20  .db -vfs tv.    
f030: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
f040: 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62  T * FROM ko } db
f050: 32 0a 20 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65  2.  } {1 {unable
f060: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
f070: 65 20 66 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63  e file}}.  db2 c
f080: 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65  lose.  tv delete
f090: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
f0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
f0e0: 20 54 65 73 74 20 74 68 61 74 20 61 20 22 50 52   Test that a "PR
f0f0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
f100: 69 6e 74 22 3a 0a 23 0a 23 20 20 20 70 61 67 65  int":.#.#   page
f110: 72 31 2d 32 32 2e 31 2e 2a 3a 20 69 73 20 61 20  r1-22.1.*: is a 
f120: 6e 6f 2d 6f 70 20 6f 6e 20 61 20 6e 6f 6e 2d 57  no-op on a non-W
f130: 41 4c 20 64 62 2c 20 61 6e 64 0a 23 20 20 20 70  AL db, and.#   p
f140: 61 67 65 72 31 2d 32 32 2e 32 2e 2a 3a 20 64 6f  ager1-22.2.*: do
f150: 65 73 20 6e 6f 74 20 63 61 75 73 65 20 78 53 79  es not cause xSy
f160: 6e 63 20 63 61 6c 6c 73 20 77 69 74 68 20 61 20  nc calls with a 
f170: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f 66 66 20  synchronous=off 
f180: 64 62 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  db..#.do_test pa
f190: 67 65 72 31 2d 32 32 2e 31 2e 31 20 7b 0a 20 20  ger1-22.1.1 {.  
f1a0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
f1b0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
f1c0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
f1d0: 45 20 54 41 42 4c 45 20 6b 6f 28 63 20 44 45 46  E TABLE ko(c DEF
f1e0: 41 55 4c 54 20 27 61 62 63 27 2c 20 62 20 44 45  AULT 'abc', b DE
f1f0: 46 41 55 4c 54 20 27 64 65 66 27 29 3b 0a 20 20  FAULT 'def');.  
f200: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f    INSERT INTO ko
f210: 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b   DEFAULT VALUES;
f220: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
f230: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
f240: 6b 70 6f 69 6e 74 20 7d 0a 7d 20 7b 30 20 2d 31  kpoint }.} {0 -1
f250: 20 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   -1}.do_test pag
f260: 65 72 31 2d 32 32 2e 32 2e 31 20 7b 0a 20 20 74  er1-22.2.1 {.  t
f270: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
f280: 6c 74 20 31 0a 20 20 74 76 20 66 69 6c 74 65 72  lt 1.  tv filter
f290: 20 78 53 79 6e 63 0a 20 20 74 76 20 73 63 72 69   xSync.  tv scri
f2a0: 70 74 20 78 53 79 6e 63 43 62 0a 20 20 70 72 6f  pt xSyncCb.  pro
f2b0: 63 20 78 53 79 6e 63 43 62 20 7b 61 72 67 73 7d  c xSyncCb {args}
f2c0: 20 7b 69 6e 63 72 20 3a 3a 73 79 6e 63 63 6f 75   {incr ::synccou
f2d0: 6e 74 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62  nt}.  sqlite3 db
f2e0: 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 53 77   test.db..  # Sw
f2f0: 69 74 63 68 20 74 68 65 20 64 62 20 74 6f 20 57  itch the db to W
f300: 41 4c 20 6d 6f 64 65 2e 20 41 6e 64 20 74 68 65  AL mode. And the
f310: 6e 20 65 78 65 63 75 74 65 20 61 20 53 45 4c 45  n execute a SELE
f320: 43 54 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 0a  CT to make sure.
f330: 20 20 23 20 74 68 61 74 20 74 68 65 20 57 41 4c    # that the WAL
f340: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 4e   file is open. N
f350: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 6d 61  ote that this ma
f360: 79 20 63 68 61 6e 67 65 20 74 68 65 20 73 79 6e  y change the syn
f370: 63 68 72 6f 6e 6f 75 73 0a 20 20 23 20 73 65 74  chronous.  # set
f380: 74 69 6e 67 20 69 66 20 44 45 46 41 55 4c 54 5f  ting if DEFAULT_
f390: 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 20  WAL_SAFETYLEVEL 
f3a0: 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 65 78  is defined..  ex
f3b0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a  ecsql { PRAGMA j
f3c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
f3d0: 4c 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  L ; SELECT * FRO
f3e0: 4d 20 6b 6f 20 7d 0a 0a 20 20 23 20 53 65 74 20  M ko }..  # Set 
f3f0: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 2e  synchronous=OFF.
f400: 20 49 6e 73 65 72 74 20 73 6f 6d 65 20 64 61 74   Insert some dat
f410: 61 20 61 6e 64 20 72 75 6e 20 61 20 63 68 65 63  a and run a chec
f420: 6b 70 6f 69 6e 74 2e 20 53 69 6e 63 65 0a 20 20  kpoint. Since.  
f430: 23 20 73 79 6e 63 3d 6f 66 66 2c 20 74 68 69 73  # sync=off, this
f440: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61 75 73   should not caus
f450: 65 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20 74  e any calls to t
f460: 68 65 20 78 53 79 6e 63 28 29 20 6d 65 74 68 6f  he xSync() metho
f470: 64 2e 0a 20 20 73 65 74 20 3a 3a 73 79 6e 63 63  d..  set ::syncc
f480: 6f 75 6e 74 20 30 0a 20 20 65 78 65 63 73 71 6c  ount 0.  execsql
f490: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79   {.    PRAGMA sy
f4a0: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6f 66 66 3b  nchronous = off;
f4b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
f4c0: 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55   ko DEFAULT VALU
f4d0: 45 53 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  ES;.    PRAGMA w
f4e0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20  al_checkpoint;. 
f4f0: 20 7d 0a 20 20 73 65 74 20 73 79 6e 63 63 6f 75   }.  set synccou
f500: 6e 74 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d  nt.} {0}..#-----
f510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f550: 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66 6f 72  ----.# Tests for
f560: 20 63 68 61 6e 67 69 6e 67 20 6a 6f 75 72 6e 61   changing journa
f570: 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61  l mode..#.#   pa
f580: 67 65 72 31 2d 32 33 2e 31 2e 2a 3a 20 54 65 73  ger1-23.1.*: Tes
f590: 74 20 74 68 61 74 20 77 68 65 6e 20 63 68 61 6e  t that when chan
f5a0: 67 69 6e 67 20 66 72 6f 6d 20 50 45 52 53 49 53  ging from PERSIS
f5b0: 54 20 74 6f 20 44 45 4c 45 54 45 20 6d 6f 64 65  T to DELETE mode
f5c0: 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.#             
f5d0: 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
f5e0: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
f5f0: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
f600: 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74  3.2.*: Same test
f610: 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77   as above, but w
f620: 68 69 6c 65 20 61 20 73 68 61 72 65 64 20 6c 6f  hile a shared lo
f630: 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20 20 20  ck is held.#    
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e                on
f650: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f660: 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  le..#.#   pager1
f670: 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d 65 20 74 65  -23.3.*: Same te
f680: 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74  st as above, but
f690: 20 77 68 69 6c 65 20 61 20 72 65 73 65 72 76 65   while a reserve
f6a0: 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23  d lock is held.#
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6c0: 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73    on the databas
f6d0: 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61  e file..#.#   pa
f6e0: 67 65 72 31 2d 32 33 2e 34 2e 2a 3a 20 41 6e 64  ger1-23.4.*: And
f6f0: 2c 20 66 6f 72 20 66 75 6e 2c 20 77 68 69 6c 65  , for fun, while
f700: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
f710: 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 23 0a 23 20  usive lock..#.# 
f720: 20 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 2a 3a    pager1-23.5.*:
f730: 20 54 72 79 20 74 6f 20 73 65 74 20 76 61 72 69   Try to set vari
f740: 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20 6a 6f  ous different jo
f750: 75 72 6e 61 6c 20 6d 6f 64 65 73 20 77 69 74 68  urnal modes with
f760: 20 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20   an.#           
f770: 20 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79         in-memory
f780: 20 64 61 74 61 62 61 73 65 20 28 6f 6e 6c 79 20   database (only 
f790: 4d 45 4d 4f 52 59 20 61 6e 64 20 4f 46 46 20 73  MEMORY and OFF s
f7a0: 68 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a 23 0a 23  hould work)..#.#
f7b0: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 2a     pager1-23.6.*
f7c0: 3a 20 54 72 79 20 74 6f 20 73 65 74 20 6c 6f 63  : Try to set loc
f7d0: 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c  king_mode=normal
f7e0: 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   on an in-memory
f7f0: 20 64 61 74 61 62 61 73 65 0a 23 20 20 20 20 20   database.#     
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64 6f               (do
f810: 65 73 6e 27 74 20 77 6f 72 6b 20 2d 20 69 6e 2d  esn't work - in-
f820: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
f830: 20 61 6c 77 61 79 73 20 75 73 65 0a 23 20 20 20   always use.#   
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
f850: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
f860: 75 73 69 76 65 29 2e 0a 23 0a 64 6f 5f 74 65 73  usive)..#.do_tes
f870: 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 31 20  t pager1-23.1.1 
f880: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
f890: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
f8a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
f8b0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f8c0: 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
f8d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
f8e0: 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 66  1(a, b);.  }.  f
f8f0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
f900: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d  db-journal.} {1}
f910: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f920: 32 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  23.1.2 {.  execs
f930: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
f940: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
f950: 45 20 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74  E }.  file exist
f960: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f970: 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74  l.} {0}..do_test
f980: 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 31 20 7b   pager1-23.2.1 {
f990: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f9a0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f9b0: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
f9c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f9d0: 74 31 20 56 41 4c 55 45 53 28 27 43 61 6e 62 65  t1 VALUES('Canbe
f9e0: 72 72 61 27 2c 20 27 41 43 54 27 29 3b 0a 20 20  rra', 'ACT');.  
f9f0: 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45  }.  db eval { SE
fa00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
fa10: 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b   {.    db eval {
fa20: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
fa30: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a  mode = DELETE }.
fa40: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
fa50: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
fa60: 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d  ode }.} {delete}
fa70: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
fa80: 32 33 2e 32 2e 32 20 7b 0a 20 20 66 69 6c 65 20  23.2.2 {.  file 
fa90: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
faa0: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f  ournal.} {0}..do
fab0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fac0: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
fad0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
fae0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
faf0: 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  IST;.    INSERT 
fb00: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
fb10: 44 61 72 77 69 6e 27 2c 20 27 4e 54 27 29 3b 0a  Darwin', 'NT');.
fb20: 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45 44 49      BEGIN IMMEDI
fb30: 41 54 45 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76  ATE;.  }.  db ev
fb40: 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  al { PRAGMA jour
fb50: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
fb60: 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  E }.  execsql { 
fb70: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
fb80: 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d  ode }.} {delete}
fb90: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
fba0: 32 33 2e 33 2e 32 20 7b 0a 20 20 66 69 6c 65 20  23.3.2 {.  file 
fbb0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
fbc0: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f  ournal.} {0}.do_
fbd0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33  test pager1-23.3
fbe0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43  .3 {.  execsql C
fbf0: 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  OMMIT.} {}..do_t
fc00: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e  est pager1-23.4.
fc10: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
fc20: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
fc30: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
fc40: 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  T;.    INSERT IN
fc50: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41 64  TO t1 VALUES('Ad
fc60: 65 6c 61 69 64 65 27 2c 20 27 53 41 27 29 3b 0a  elaide', 'SA');.
fc70: 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53      BEGIN EXCLUS
fc80: 49 56 45 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76  IVE;.  }.  db ev
fc90: 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  al { PRAGMA jour
fca0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
fcb0: 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  E }.  execsql { 
fcc0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
fcd0: 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d  ode }.} {delete}
fce0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
fcf0: 32 33 2e 34 2e 32 20 7b 0a 20 20 66 69 6c 65 20  23.4.2 {.  file 
fd00: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
fd10: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f  ournal.} {0}.do_
fd20: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34  test pager1-23.4
fd30: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43  .3 {.  execsql C
fd40: 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  OMMIT.} {}..do_t
fd50: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  est pager1-23.5.
fd60: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
fd70: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
fd80: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d  .  sqlite3 db :m
fd90: 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66 6f 72 65  emory:.} {}.fore
fda0: 61 63 68 20 7b 74 6e 20 6d 6f 64 65 20 70 6f 73  ach {tn mode pos
fdb0: 73 69 62 6c 65 7d 20 7b 0a 20 20 32 20 20 6f 66  sible} {.  2  of
fdc0: 66 20 20 20 20 20 20 31 0a 20 20 33 20 20 6d 65  f      1.  3  me
fdd0: 6d 6f 72 79 20 20 20 31 0a 20 20 34 20 20 70 65  mory   1.  4  pe
fde0: 72 73 69 73 74 20 20 30 0a 20 20 35 20 20 64 65  rsist  0.  5  de
fdf0: 6c 65 74 65 20 20 20 30 0a 20 20 36 20 20 77 61  lete   0.  6  wa
fe00: 6c 20 20 20 20 20 20 30 0a 20 20 37 20 20 74 72  l      0.  7  tr
fe10: 75 6e 63 61 74 65 20 30 0a 7d 20 7b 0a 20 20 64  uncate 0.} {.  d
fe20: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
fe30: 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65  .5.$tn.1 {.    e
fe40: 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a  xecsql "PRAGMA j
fe50: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66  ournal_mode = of
fe60: 66 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  f".    execsql "
fe70: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
fe80: 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d  ode = $mode".  }
fe90: 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b   [if $possible {
fea0: 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73  list $mode} {lis
feb0: 74 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f 74 65 73  t off}].  do_tes
fec0: 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74  t pager1-23.5.$t
fed0: 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.2 {.    execsq
fee0: 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  l "PRAGMA journa
fef0: 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 22  l_mode = memory"
ff00: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52  .    execsql "PR
ff10: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
ff20: 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b  e = $mode".  } [
ff30: 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69  if $possible {li
ff40: 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20  st $mode} {list 
ff50: 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f 74 65  memory}].}.do_te
ff60: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 31  st pager1-23.6.1
ff70: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52   {.  execsql {PR
ff80: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
ff90: 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d 20 7b 65  e = normal}.} {e
ffa0: 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73  xclusive}.do_tes
ffb0: 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 32 20  t pager1-23.6.2 
ffc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41  {.  execsql {PRA
ffd0: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
ffe0: 20 3d 20 65 78 63 6c 75 73 69 76 65 7d 0a 7d 20   = exclusive}.} 
fff0: 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74  {exclusive}.do_t
10000 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  est pager1-23.6.
10010 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  3 {.  execsql {P
10020 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
10030 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65  de}.} {exclusive
10040 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
10050 2d 32 33 2e 36 2e 34 20 7b 0a 20 20 65 78 65 63  -23.6.4 {.  exec
10060 73 71 6c 20 7b 50 52 41 47 4d 41 20 6d 61 69 6e  sql {PRAGMA main
10070 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d  .locking_mode}.}
10080 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 0a 23 2d   {exclusive}..#-
10090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100d0 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65  --------.#.do_te
100e0 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 31  st pager1-24.1.1
100f0 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
10100 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
10110 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
10120 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
10130 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
10140 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
10150 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  10;.    PRAGMA a
10160 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46 55 4c  uto_vacuum = FUL
10170 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  L;.    CREATE TA
10180 42 4c 45 20 78 31 28 78 2c 20 79 2c 20 7a 2c 20  BLE x1(x, y, z, 
10190 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c 20 7a  PRIMARY KEY(y, z
101a0 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ));.    CREATE T
101b0 41 42 4c 45 20 78 32 28 78 2c 20 79 2c 20 7a 2c  ABLE x2(x, y, z,
101c0 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c 20   PRIMARY KEY(y, 
101d0 7a 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  z));.    INSERT 
101e0 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53 28 61  INTO x2 VALUES(a
101f0 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f  _string(400), a_
10200 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
10210 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20  tring(600));.   
10220 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
10230 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10240 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34  600), a_string(4
10250 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30  00), a_string(50
10260 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
10270 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
10280 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35  ELECT a_string(5
10290 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
102a0 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  0), a_string(400
102b0 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
102c0 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
102d0 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30  LECT a_string(40
102e0 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
102f0 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10300 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
10310 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
10320 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36 30 30  ECT a_string(600
10330 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ), a_string(400)
10340 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 20  , a_string(500) 
10350 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
10360 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45  ERT INTO x2 SELE
10370 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  CT a_string(500)
10380 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c  , a_string(600),
10390 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
103a0 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45  ROM x2;.    INSE
103b0 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43  RT INTO x2 SELEC
103c0 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c  T a_string(400),
103d0 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
103e0 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
103f0 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52  OM x2;.    INSER
10400 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54  T INTO x1 SELECT
10410 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a   * FROM x2;.  }.
10420 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
10430 65 72 31 2d 32 34 2e 31 2e 32 20 7b 0a 20 20 65  er1-24.1.2 {.  e
10440 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
10450 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
10460 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72   FROM x1 WHERE r
10470 6f 77 69 64 3c 33 32 3b 0a 20 20 7d 0a 20 20 72  owid<32;.  }.  r
10480 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
10490 36 34 20 78 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  64 x2.} {}.do_te
104a0 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 33  st pager1-24.1.3
104b0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
104c0 20 20 20 20 20 20 55 50 44 41 54 45 20 78 31 20        UPDATE x1 
104d0 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69 6e 67  SET z = a_string
104e0 28 33 30 30 29 20 57 48 45 52 45 20 72 6f 77 69  (300) WHERE rowi
104f0 64 3e 34 30 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  d>40;.    COMMIT
10500 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  ;.    PRAGMA int
10510 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
10520 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
10530 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d  ) FROM x1;.  }.}
10540 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73   {ok 33}..do_tes
10550 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 34 20  t pager1-24.1.4 
10560 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
10570 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31    DELETE FROM x1
10580 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10590 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O x1 SELECT * FR
105a0 4f 4d 20 78 32 3b 0a 20 20 20 20 42 45 47 49 4e  OM x2;.    BEGIN
105b0 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
105c0 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72 6f 77  ROM x1 WHERE row
105d0 69 64 3c 33 32 3b 0a 20 20 20 20 20 20 55 50 44  id<32;.      UPD
105e0 41 54 45 20 78 31 20 53 45 54 20 7a 20 3d 20 61  ATE x1 SET z = a
105f0 5f 73 74 72 69 6e 67 28 32 39 39 29 20 57 48 45  _string(299) WHE
10600 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20 20 7d  RE rowid>40;.  }
10610 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  .  recursive_sel
10620 65 63 74 20 36 34 20 78 32 20 7b 64 62 20 65 76  ect 64 x2 {db ev
10630 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20 20 65 78 65  al COMMIT}.  exe
10640 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
10650 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
10660 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  k;.    SELECT co
10670 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a  unt(*) FROM x1;.
10680 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64    }.} {ok 33}..d
10690 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34  o_test pager1-24
106a0 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.5 {.  execsql
106b0 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
106c0 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM x1;.    INSER
106d0 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54  T INTO x1 SELECT
106e0 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a   * FROM x2;.  }.
106f0 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65    recursive_sele
10700 63 74 20 36 34 20 78 32 20 7b 20 64 62 20 65 76  ct 64 x2 { db ev
10710 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45  al {CREATE TABLE
10720 20 78 33 28 78 2c 20 79 2c 20 7a 29 7d 20 7d 0a   x3(x, y, z)} }.
10730 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
10740 43 54 20 2a 20 46 52 4f 4d 20 78 33 20 7d 0a 7d  CT * FROM x3 }.}
10750 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
10760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
107a0 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
107b0 2d 32 35 2d 31 20 7b 0a 20 20 66 61 75 6c 74 73  -25-1 {.  faults
107c0 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
107d0 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
107e0 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
107f0 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b    SAVEPOINT abc;
10800 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
10810 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
10820 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
10830 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d 49  O abc;.    COMMI
10840 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73  T;.  }.  db clos
10850 65 0a 7d 20 7b 7d 0a 62 72 65 61 6b 70 6f 69 6e  e.} {}.breakpoin
10860 74 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  t.do_test pager1
10870 2d 32 35 2d 32 20 7b 0a 20 20 66 61 75 6c 74 73  -25-2 {.  faults
10880 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
10890 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
108a0 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61  .    SAVEPOINT a
108b0 62 63 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  bc;.      CREATE
108c0 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
108d0 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  .    ROLLBACK TO
108e0 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   abc;.    COMMIT
108f0 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
10900 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10950 2d 0a 23 20 53 65 63 74 6f 72 2d 73 69 7a 65 20  -.# Sector-size 
10960 74 65 73 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  tests..#.do_test
10970 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20   pager1-26.1 {. 
10980 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
10990 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74  ault 1.  tv sect
109a0 6f 72 73 69 7a 65 20 34 30 39 36 0a 20 20 66 61  orsize 4096.  fa
109b0 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
109c0 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
109d0 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
109e0 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
109f0 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
10a00 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20  _size = 512;.   
10a10 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62   CREATE TABLE tb
10a20 6c 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  l(a PRIMARY KEY,
10a30 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   b UNIQUE);.    
10a40 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
10a50 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c  ERT INTO tbl VAL
10a60 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 35 29  UES(a_string(25)
10a70 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 29  , a_string(600))
10a80 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
10a90 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61  NTO tbl SELECT a
10aa0 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
10ab0 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
10ac0 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  tbl;.      INSER
10ad0 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
10ae0 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
10af0 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
10b00 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
10b10 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
10b20 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
10b30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10b40 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
10b50 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
10b60 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10b70 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
10b80 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
10b90 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10ba0 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72  tbl SELECT a_str
10bb0 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
10bc0 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b  g(600) FROM tbl;
10bd0 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10be0 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f  TO tbl SELECT a_
10bf0 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
10c00 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74  ring(600) FROM t
10c10 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bl;.      INSERT
10c20 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
10c30 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
10c40 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
10c50 4d 20 74 62 6c 3b 0a 20 20 20 20 43 4f 4d 4d 49  M tbl;.    COMMI
10c60 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65  T;.  }.} {}.do_e
10c70 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
10c80 72 31 2d 32 36 2e 31 20 7b 0a 20 20 55 50 44 41  r1-26.1 {.  UPDA
10c90 54 45 20 74 62 6c 20 53 45 54 20 62 20 3d 20 61  TE tbl SET b = a
10ca0 5f 73 74 72 69 6e 67 28 35 35 30 29 3b 0a 7d 20  _string(550);.} 
10cb0 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  {}.db close.tv d
10cc0 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  elete..#--------
10cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d10 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  -.#.do_test page
10d20 72 31 2e 32 37 2e 31 20 7b 0a 20 20 66 61 75 6c  r1.27.1 {.  faul
10d30 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
10d40 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33  reopen.  sqlite3
10d50 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
10d60 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   db.  execsql {.
10d70 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
10d80 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
10d90 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 73 71  (a, b);.  }.  sq
10da0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63  lite3_pager_refc
10db0 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65 63 73  ounts db.  execs
10dc0 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a  ql COMMIT.} {}..
10dd0 23 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 2d 2d 2d 2d 2d 2d 2d  ----------------
10e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
10e20 74 20 74 68 61 74 20 61 74 74 65 6d 70 74 69 6e  t that attemptin
10e30 67 20 74 6f 20 6f 70 65 6e 20 61 20 77 72 69 74  g to open a writ
10e40 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  e-transaction wi
10e50 74 68 20 0a 23 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  th .# locking_mo
10e60 64 65 3d 65 78 63 6c 75 73 69 76 65 20 69 6e 20  de=exclusive in 
10e70 57 41 4c 20 6d 6f 64 65 20 66 61 69 6c 73 20 69  WAL mode fails i
10e80 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
10e90 72 20 63 6c 69 65 6e 74 73 20 6f 6e 20 0a 23 20  r clients on .# 
10ea0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
10eb0 65 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64 62 20  e..#.catch { db 
10ec0 63 6c 6f 73 65 20 7d 0a 69 66 63 61 70 61 62 6c  close }.ifcapabl
10ed0 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 6d 75 6c  e wal {.  do_mul
10ee0 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e  ticlient_test tn
10ef0 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70   {.    do_test p
10f00 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20 7b  ager1-28.$tn.1 {
10f10 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 20 0a 20  .      sql1 { . 
10f20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f         PRAGMA jo
10f30 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
10f40 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
10f50 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
10f60 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
10f70 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
10f80 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 20 20  a', 'b');.      
10f90 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d 0a 20 20  }.    } {wal}.  
10fa0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10fb0 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 73 71 6c 32  -28.$tn.2 { sql2
10fc0 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
10fd0 20 74 31 20 7d 20 7d 20 7b 61 20 62 7d 0a 0a 20   t1 } } {a b}.. 
10fe0 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72     do_test pager
10ff0 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c  1-28.$tn.3 { sql
11000 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69  1 { PRAGMA locki
11010 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
11020 65 20 7d 20 7d 20 7b 65 78 63 6c 75 73 69 76 65  e } } {exclusive
11030 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  }.    do_test pa
11040 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20  ger1-28.$tn.4 { 
11050 0a 20 20 20 20 20 20 63 73 71 6c 31 20 7b 20 42  .      csql1 { B
11060 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54  EGIN; INSERT INT
11070 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c  O t1 VALUES('c',
11080 20 27 64 27 29 3b 20 7d 0a 20 20 20 20 7d 20 7b   'd'); }.    } {
11090 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
110a0 6f 63 6b 65 64 7d 7d 0a 20 20 20 20 63 6f 64 65  ocked}}.    code
110b0 32 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 3b 20  2 { db2 close ; 
110c0 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
110d0 2e 64 62 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73  .db }.    do_tes
110e0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
110f0 34 20 7b 20 0a 20 20 20 20 20 20 73 71 6c 31 20  4 { .      sql1 
11100 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
11110 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27   VALUES('c', 'd'
11120 29 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20  ); COMMIT }.    
11130 7d 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d  } {}.  }.}..#---
11140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11180 2d 2d 2d 2d 2d 2d 0a 23 20 4e 6f 72 6d 61 6c 6c  ------.# Normall
11190 79 2c 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67  y, when changing
111a0 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   from journal_mo
111b0 64 65 3d 50 45 52 53 49 53 54 20 74 6f 20 44 45  de=PERSIST to DE
111c0 4c 45 54 45 20 74 68 65 20 70 61 67 65 72 0a 23  LETE the pager.#
111d0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 6c   attempts to del
111e0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
111f0 66 69 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  file. However, i
11200 66 20 69 74 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f it cannot obta
11210 69 6e 20 61 0a 23 20 52 45 53 45 52 56 45 44 20  in a.# RESERVED 
11220 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
11230 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
11240 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 2e  step is skipped.
11250 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e  .#.do_multiclien
11260 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f  t_test tn {.  do
11270 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11280 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.1 {.    sql1
11290 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
112a0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
112b0 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 43  PERSIST;.      C
112c0 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
112d0 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , b);.      INSE
112e0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
112f0 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20  S('a', 'b');.   
11300 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d   }.  } {persist}
11310 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11320 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 66 69 6c  1-28.$tn.2 { fil
11330 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
11340 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64  -journal } 1.  d
11350 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11360 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20  .$tn.3 { sql1 { 
11370 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
11380 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d  ode = DELETE } }
11390 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73   delete.  do_tes
113a0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
113b0 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  4 { file exists 
113c0 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
113d0 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70  } 0..  do_test p
113e0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 35 20 7b  ager1-28.$tn.5 {
113f0 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20  .    sql1 { .   
11400 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
11410 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
11420 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
11430 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63  NTO t1 VALUES('c
11440 27 2c 20 27 64 27 29 3b 0a 20 20 20 20 7d 0a 20  ', 'd');.    }. 
11450 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64   } {persist}.  d
11460 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11470 2e 24 74 6e 2e 36 20 7b 20 66 69 6c 65 20 65 78  .$tn.6 { file ex
11480 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
11490 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65  rnal } 1.  do_te
114a0 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
114b0 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  .7 {.    sql2 { 
114c0 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e  BEGIN; INSERT IN
114d0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65 27  TO t1 VALUES('e'
114e0 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d  , 'f'); }.  } {}
114f0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11500 31 2d 32 38 2e 24 74 6e 2e 38 20 20 7b 20 66 69  1-28.$tn.8  { fi
11510 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
11520 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20  b-journal } 1.  
11530 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11540 38 2e 24 74 6e 2e 39 20 20 7b 20 73 71 6c 31 20  8.$tn.9  { sql1 
11550 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
11560 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d  _mode = DELETE }
11570 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74   } delete.  do_t
11580 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
11590 6e 2e 31 30 20 7b 20 66 69 6c 65 20 65 78 69 73  n.10 { file exis
115a0 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
115b0 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73  al } 1..  do_tes
115c0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
115d0 31 31 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54  11 { sql2 COMMIT
115e0 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
115f0 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 32  pager1-28.$tn.12
11600 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
11610 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
11620 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   0..  do_test pa
11630 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 33 20 7b  ger1-28-$tn.13 {
11640 0a 20 20 20 20 63 6f 64 65 31 20 7b 20 73 65 74  .    code1 { set
11650 20 63 68 61 6e 6e 65 6c 20 5b 64 62 20 69 6e 63   channel [db inc
11660 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c 79 20  rblob -readonly 
11670 74 31 20 61 20 32 5d 20 7d 0a 20 20 20 20 73 71  t1 a 2] }.    sq
11680 6c 31 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  l1 {.      PRAGM
11690 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
116a0 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20   PERSIST;.      
116b0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
116c0 41 4c 55 45 53 28 27 67 27 2c 20 27 68 27 29 3b  ALUES('g', 'h');
116d0 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73  .    }.  } {pers
116e0 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ist}.  do_test p
116f0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 34 20  ager1-28.$tn.14 
11700 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
11710 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
11720 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  1.  do_test page
11730 72 31 2d 32 38 2e 24 74 6e 2e 31 35 20 7b 0a 20  r1-28.$tn.15 {. 
11740 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b     sql2 { BEGIN;
11750 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11760 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29  VALUES('e', 'f')
11770 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ; }.  } {}.  do_
11780 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11790 74 6e 2e 31 36 20 7b 20 73 71 6c 31 20 7b 20 50  tn.16 { sql1 { P
117a0 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
117b0 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20  de = DELETE } } 
117c0 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74  delete.  do_test
117d0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
117e0 37 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  7 { file exists 
117f0 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
11800 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70  } 1..  do_test p
11810 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 37 20  ager1-28.$tn.17 
11820 7b 20 63 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54  { csql2 { COMMIT
11830 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73   } } {1 {databas
11840 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
11850 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11860 38 2d 24 74 6e 2e 31 38 20 7b 20 63 6f 64 65 31  8-$tn.18 { code1
11870 20 7b 20 72 65 61 64 20 24 63 68 61 6e 6e 65 6c   { read $channel
11880 20 7d 20 7d 20 63 0a 20 20 64 6f 5f 74 65 73 74   } } c.  do_test
11890 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31   pager1-28-$tn.1
118a0 39 20 7b 20 63 6f 64 65 31 20 7b 20 63 6c 6f 73  9 { code1 { clos
118b0 65 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 7b  e $channel } } {
118c0 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
118d0 72 31 2d 32 38 2e 24 74 6e 2e 32 30 20 7b 20 73  r1-28.$tn.20 { s
118e0 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d  ql2 { COMMIT } }
118f0 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70   {}.}..do_test p
11900 61 67 65 72 31 2d 32 39 2e 31 20 7b 0a 20 20 66  ager1-29.1 {.  f
11910 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
11920 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
11930 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
11940 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
11950 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75  4;.    PRAGMA au
11960 74 6f 5f 76 61 63 75 75 6d 20 3d 20 66 75 6c 6c  to_vacuum = full
11970 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  ;.    PRAGMA loc
11980 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
11990 69 76 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ive;.    CREATE 
119a0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
119b0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
119c0 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
119d0 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65  .  }.  file size
119e0 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72   test.db.} [expr
119f0 20 31 30 32 34 2a 33 5d 0a 64 6f 5f 74 65 73 74   1024*3].do_test
11a00 20 70 61 67 65 72 31 2d 32 39 2e 32 20 7b 0a 20   pager1-29.2 {. 
11a10 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
11a20 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
11a30 3d 20 34 30 39 36 3b 0a 20 20 20 20 56 41 43 55  = 4096;.    VACU
11a40 55 4d 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  UM;.  }.  file s
11a50 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65  ize test.db.} [e
11a60 78 70 72 20 34 30 39 36 2a 33 5d 0a 0a 23 2d 2d  xpr 4096*3]..#--
11a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ab0 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
11ac0 68 61 74 20 69 66 20 61 6e 20 65 6d 70 74 79 20  hat if an empty 
11ad0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73  database file (s
11ae0 69 7a 65 20 30 20 62 79 74 65 73 29 20 69 73 20  ize 0 bytes) is 
11af0 6f 70 65 6e 65 64 20 69 6e 20 0a 23 20 65 78 63  opened in .# exc
11b00 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d  lusive-locking m
11b10 6f 64 65 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  ode, any journal
11b20 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
11b30 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73   from the file-s
11b40 79 73 74 65 6d 0a 23 20 77 69 74 68 6f 75 74 20  ystem.# without 
11b50 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
11b60 6b 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  k. And that the 
11b70 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 62  RESERVED lock ob
11b80 74 61 69 6e 65 64 20 77 68 69 6c 65 0a 23 20 64  tained while.# d
11b90 6f 69 6e 67 20 74 68 69 73 20 69 73 20 6e 6f 74  oing this is not
11ba0 20 72 65 6c 65 61 73 65 64 2e 0a 23 0a 64 6f 5f   released..#.do_
11bb0 74 65 73 74 20 70 61 67 65 72 31 2d 33 30 2e 31  test pager1-30.1
11bc0 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
11bd0 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73 74  delete_file test
11be0 2e 64 62 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c  .db.  delete_fil
11bf0 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
11c00 6c 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  l.  set fd [open
11c10 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
11c20 20 77 5d 0a 20 20 73 65 65 6b 20 24 66 64 20 5b   w].  seek $fd [
11c30 65 78 70 72 20 35 31 32 2b 31 30 33 32 2a 32 5d  expr 512+1032*2]
11c40 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69  .  puts -nonewli
11c50 6e 65 20 24 66 64 20 78 0a 20 20 63 6c 6f 73 65  ne $fd x.  close
11c60 20 24 66 64 0a 0a 20 20 73 71 6c 69 74 65 33 20   $fd..  sqlite3 
11c70 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
11c80 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
11c90 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  A locking_mode=E
11ca0 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 53 45  XCLUSIVE;.    SE
11cb0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
11cc0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
11cd0 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  ;.    PRAGMA loc
11ce0 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20  k_status;.  }.} 
11cf0 7b 65 78 63 6c 75 73 69 76 65 20 30 20 6d 61 69  {exclusive 0 mai
11d00 6e 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20  n reserved temp 
11d10 63 6c 6f 73 65 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  closed}..#------
11d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d60 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
11d70 69 66 20 74 68 65 20 22 70 61 67 65 2d 73 69 7a  if the "page-siz
11d80 65 22 20 66 69 65 6c 64 20 69 6e 20 61 20 6a 6f  e" field in a jo
11d90 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
11da0 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23  0, the journal.#
11db0 20 66 69 6c 65 20 63 61 6e 20 73 74 69 6c 6c 20   file can still 
11dc0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
11dd0 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
11de0 20 66 6f 72 20 62 61 63 6b 77 61 72 64 20 63 6f   for backward co
11df0 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 0a 23 20  mpatibility -.# 
11e00 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
11e10 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
11e20 38 20 61 6c 77 61 79 73 20 73 65 74 20 74 68 69  8 always set thi
11e30 73 20 66 69 65 6c 64 20 74 6f 20 7a 65 72 6f 2e  s field to zero.
11e40 0a 23 0a 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74  .#.if {$tcl_plat
11e50 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d  form(platform)==
11e60 22 75 6e 69 78 22 7d 20 7b 0a 64 6f 5f 74 65 73  "unix"} {.do_tes
11e70 74 20 70 61 67 65 72 31 2d 33 31 2e 31 20 7b 0a  t pager1-31.1 {.
11e80 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
11e90 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
11ea0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
11eb0 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
11ec0 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   10;.    PRAGMA 
11ed0 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
11ee0 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
11ef0 4c 45 20 74 31 28 78 2c 20 79 2c 20 55 4e 49 51  LE t1(x, y, UNIQ
11f00 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 49  UE(x, y));.    I
11f10 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11f20 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
11f30 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11f40 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20 49 4e  b(1500));.    IN
11f50 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
11f60 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
11f70 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
11f80 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
11f90 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11fa0 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
11fb0 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
11fc0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
11fd0 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
11fe0 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
11ff0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12000 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
12010 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
12020 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12030 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
12040 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
12050 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
12060 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12070 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
12080 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
12090 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
120a0 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
120b0 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
120c0 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
120d0 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
120e0 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
120f0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12100 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
12110 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
12120 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
12130 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
12140 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
12150 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
12160 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12170 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
12180 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
12190 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
121a0 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
121b0 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
121c0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
121d0 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
121e0 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
121f0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
12200 4d 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b  M t1;.    BEGIN;
12210 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31  .      UPDATE t1
12220 20 53 45 54 20 79 20 3d 20 72 61 6e 64 6f 6d 62   SET y = randomb
12230 6c 6f 62 28 31 34 39 39 29 3b 0a 20 20 7d 0a 20  lob(1499);.  }. 
12240 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e   copy_file test.
12250 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20 63 6f  db test.db2.  co
12260 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d  py_file test.db-
12270 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32  journal test.db2
12280 2d 6a 6f 75 72 6e 61 6c 0a 20 20 0a 20 20 68 65  -journal.  .  he
12290 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
122a0 62 32 2d 6a 6f 75 72 6e 61 6c 20 32 34 20 30 30  b2-journal 24 00
122b0 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  000000.  sqlite3
122c0 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20   db2 test.db2.  
122d0 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
122e0 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
122f0 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 7d 0a   } db2.} {ok}.}.
12300 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
12310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
12350 73 74 20 74 68 61 74 20 61 20 64 61 74 61 62 61  st that a databa
12360 73 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 22  se file can be "
12370 70 72 65 2d 68 69 6e 74 65 64 22 20 74 6f 20 61  pre-hinted" to a
12380 20 63 65 72 74 61 69 6e 20 73 69 7a 65 20 61 6e   certain size an
12390 64 20 74 68 61 74 0a 23 20 73 75 62 73 65 71 75  d that.# subsequ
123a0 65 6e 74 20 73 70 69 6c 6c 69 6e 67 20 6f 66 20  ent spilling of 
123b0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
123c0 64 6f 65 73 20 6e 6f 74 20 72 65 73 75 6c 74 20  does not result 
123d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
123e0 23 20 66 69 6c 65 20 62 65 69 6e 67 20 73 68 72  # file being shr
123f0 75 6e 6b 2e 0a 23 0a 63 61 74 63 68 20 7b 64 62  unk..#.catch {db
12400 20 63 6c 6f 73 65 7d 0a 66 6f 72 63 65 64 65 6c   close}.forcedel
12410 65 74 65 20 74 65 73 74 2e 64 62 0a 0a 64 6f 5f  ete test.db..do_
12420 74 65 73 74 20 70 61 67 65 72 31 2d 33 32 2e 31  test pager1-32.1
12430 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
12440 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
12450 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
12460 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20  ABLE t1(x, y);. 
12470 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   }.  db close.  
12480 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
12490 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
124a0 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e     BEGIN;.    IN
124b0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
124c0 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(1, randomblo
124d0 62 28 31 30 30 30 30 29 29 3b 0a 20 20 7d 0a 20  b(10000));.  }. 
124e0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68   file_control_ch
124f0 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 64 62 20  unksize_test db 
12500 6d 61 69 6e 20 31 30 32 34 0a 20 20 66 69 6c 65  main 1024.  file
12510 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e  _control_sizehin
12520 74 5f 74 65 73 74 20 64 62 20 6d 61 69 6e 20 32  t_test db main 2
12530 30 39 37 31 35 32 30 3b 20 23 20 32 30 4d 42 0a  0971520; # 20MB.
12540 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
12550 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
12560 65 20 3d 20 31 30 3b 0a 20 20 20 20 49 4e 53 45  e = 10;.    INSE
12570 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
12580 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  S(1, randomblob(
12590 31 30 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  10000));.    INS
125a0 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
125b0 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(2, randomblob
125c0 28 31 30 30 30 30 29 29 3b 0a 20 20 20 20 49 4e  (10000));.    IN
125d0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
125e0 45 43 54 20 78 2b 32 2c 20 72 61 6e 64 6f 6d 62  ECT x+2, randomb
125f0 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20  lob(10000) from 
12600 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
12610 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b  NTO t1 SELECT x+
12620 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  4, randomblob(10
12630 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20  000) from t1;.  
12640 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12650 20 53 45 4c 45 43 54 20 78 2b 38 2c 20 72 61 6e   SELECT x+8, ran
12660 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66  domblob(10000) f
12670 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  rom t1;.    INSE
12680 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
12690 54 20 78 2b 31 36 2c 20 72 61 6e 64 6f 6d 62 6c  T x+16, randombl
126a0 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74  ob(10000) from t
126b0 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  1;.    SELECT co
126c0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
126d0 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
126e0 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66 69 6c    db close.  fil
126f0 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d  e size test.db.}
12700 20 7b 32 30 39 37 31 35 32 30 7d 0a 0a 23 20 43   {20971520}..# C
12710 6c 65 61 6e 75 70 20 32 30 4d 42 20 66 69 6c 65  leanup 20MB file
12720 20 6c 65 66 74 20 62 79 20 74 68 65 20 70 72 65   left by the pre
12730 76 69 6f 75 73 20 74 65 73 74 2e 0a 66 6f 72 63  vious test..forc
12740 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a  edelete test.db.
12750 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.