/ Hex Artifact Content
Login

Artifact 6922029d71a8090169c71a67a141b6b94ad17d50:


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 64 6f 5f   delete.} {}.do_
3a90: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3aa0: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
3ab0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3ac0: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3ad0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3ae0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3af0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3b00: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3b10: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
3b20: 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75  r1.4.2.3 {.  fau
3b30: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
3b40: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
3b50: 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e  ch f [glob test.
3b60: 64 62 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20 64  db-mj*] { file d
3b70: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66 20  elete -force $f 
3b80: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3b90: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3ba0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3bb0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3bc0: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 36 34  check;.  }.} {64
3bd0: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   ok}.do_test pag
3be0: 65 72 31 2e 34 2e 32 2e 34 20 7b 0a 20 20 66 61  er1.4.2.4 {.  fa
3bf0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
3c00: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65 78 69  nd_reopen.  hexi
3c10: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d  o_write test.db-
3c20: 6a 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 5b 66  journal [expr [f
3c30: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
3c40: 2d 6a 6f 75 72 6e 61 6c 5d 2d 32 30 5d 20 31 32  -journal]-20] 12
3c50: 33 34 35 36 0a 20 20 65 78 65 63 73 71 6c 20 7b  3456.  execsql {
3c60: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
3c70: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
3c80: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
3c90: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
3ca0: 7b 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70  {4 ok}.do_test p
3cb0: 61 67 65 72 31 2e 34 2e 32 2e 35 20 7b 0a 20 20  ager1.4.2.5 {.  
3cc0: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
3cd0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65  _and_reopen.  he
3ce0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
3cf0: 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20  b-journal [expr 
3d00: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
3d10: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d 32 30 5d 20  db-journal]-20] 
3d20: 31 32 33 34 35 36 0a 20 20 66 6f 72 65 61 63 68  123456.  foreach
3d30: 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62   f [glob test.db
3d40: 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20 64 65 6c  -mj*] { file del
3d50: 65 74 65 20 2d 66 6f 72 63 65 20 24 66 20 7d 0a  ete -force $f }.
3d60: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3d70: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
3d80: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41  FROM t1;.    PRA
3d90: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
3da0: 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b  eck;.  }.} {4 ok
3db0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
3dc0: 31 2e 34 2e 33 2e 31 20 7b 0a 20 20 74 65 73 74  1.4.3.1 {.  test
3dd0: 76 66 73 20 74 73 74 76 66 73 20 2d 64 65 66 61  vfs tstvfs -defa
3de0: 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73 20 66  ult 1.  tstvfs f
3df0: 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74 73  ilter xSync.  ts
3e00: 74 76 66 73 20 73 63 72 69 70 74 20 78 53 79 6e  tvfs script xSyn
3e10: 63 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f 63  cCallback.  proc
3e20: 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 20 7b   xSyncCallback {
3e30: 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72 67 73  method file args
3e40: 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c 65  } {.    set file
3e50: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
3e60: 65 5d 0a 20 20 20 20 69 66 20 7b 20 30 3d 3d 5b  e].    if { 0==[
3e70: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f  string match *jo
3e80: 75 72 6e 61 6c 20 24 66 69 6c 65 5d 20 7d 20 7b  urnal $file] } {
3e90: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 7d   faultsim_save }
3ea0: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
3eb0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
3ec0: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3ed0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
3ee0: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
3ef0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3f00: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
3f10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3f20: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
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 33 2c 20 34 29 3b 0a 20 20 7d  ALUES(3, 4);.  }
3f50: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73  .  db close.  ts
3f60: 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d  tvfs delete.} {}
3f70: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6f 66  ..foreach {tn of
3f80: 73 74 20 76 61 6c 75 65 20 72 65 73 75 6c 74 7d  st value result}
3f90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 32 20 20   {.          2  
3fa0: 20 32 30 20 20 20 20 33 31 20 20 20 20 20 20 20   20    31       
3fb0: 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20  {1 2 3 4}.      
3fc0: 20 20 20 20 33 20 20 20 32 30 20 20 20 20 33 32      3   20    32
3fd0: 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d         {1 2 3 4}
3fe0: 0a 20 20 20 20 20 20 20 20 20 20 34 20 20 20 32  .          4   2
3ff0: 30 20 20 20 20 33 33 20 20 20 20 20 20 20 7b 31  0    33       {1
4000: 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20   2 3 4}.        
4010: 20 20 35 20 20 20 32 30 20 20 20 20 36 35 35 33    5   20    6553
4020: 36 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20  6    {1 2 3 4}. 
4030: 20 20 20 20 20 20 20 20 20 36 20 20 20 32 30 20           6   20 
4040: 20 20 20 31 33 31 30 37 32 20 20 20 7b 31 20 32     131072   {1 2
4050: 20 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20 20   3 4}..         
4060: 20 37 20 20 20 32 34 20 20 20 20 35 31 31 20 20   7   24    511  
4070: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
4080: 20 20 20 20 20 20 20 20 38 20 20 20 32 34 20 20          8   24  
4090: 20 20 35 31 33 20 20 20 20 20 20 7b 31 20 32 20    513      {1 2 
40a0: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 39  3 4}.          9
40b0: 20 20 20 32 34 20 20 20 20 31 33 31 30 37 32 20     24    131072 
40c0: 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 20    {1 2 3 4}..   
40d0: 20 20 20 20 20 20 31 30 20 20 20 33 32 20 20 20        10   32   
40e0: 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 7d 0a   65536    {1 2}.
40f0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } {.  do_test pa
4100: 67 65 72 31 2e 34 2e 33 2e 24 74 6e 20 7b 0a 20  ger1.4.3.$tn {. 
4110: 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74     faultsim_rest
4120: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
4130: 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74     hexio_write t
4140: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 24  est.db-journal $
4150: 6f 66 73 74 20 5b 66 6f 72 6d 61 74 20 25 2e 38  ofst [format %.8
4160: 78 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 65 78  x $value].    ex
4170: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
4180: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 24   FROM t1 }.  } $
4190: 72 65 73 75 6c 74 0a 7d 0a 64 62 20 63 6c 6f 73  result.}.db clos
41a0: 65 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56 46  e..# Set up a VF
41b0: 53 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 73  S that snapshots
41c0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
41d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 61 20 6d   just before a m
41e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 23 20  aster journal.# 
41f0: 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
4200: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74  to commit a mult
4210: 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
4220: 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79  on. Specifically
4230: 2c 20 74 68 65 0a 23 20 66 69 6c 65 2d 73 79 73  , the.# file-sys
4240: 74 65 6d 20 69 73 20 73 61 76 65 64 20 6a 75 73  tem is saved jus
4250: 74 20 62 65 66 6f 72 65 20 74 68 65 20 78 44 65  t before the xDe
4260: 6c 65 74 65 28 29 20 63 61 6c 6c 20 74 6f 20 72  lete() call to r
4270: 65 6d 6f 76 65 20 74 68 65 20 0a 23 20 6d 61 73  emove the .# mas
4280: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
4290: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73   from the file-s
42a0: 79 73 74 65 6d 2e 0a 23 0a 74 65 73 74 76 66 73  ystem..#.testvfs
42b0: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74   tv -default 1.t
42c0: 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e  v script copy_on
42d0: 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73 65 74 20 3a  _mj_delete.set :
42e0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e  :mj_filename_len
42f0: 67 74 68 20 30 0a 70 72 6f 63 20 63 6f 70 79 5f  gth 0.proc copy_
4300: 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d 65  on_mj_delete {me
4310: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
4320: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
4330: 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 5b  ing match *mj* [
4340: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e  file tail $filen
4350: 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73 65  ame]]} { .    se
4360: 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f  t ::mj_filename_
4370: 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67 20 6c  length [string l
4380: 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d  ength $filename]
4390: 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73 61  .    faultsim_sa
43a0: 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ve .  }.  return
43b0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 73 65   SQLITE_OK.}..se
43c0: 74 20 70 77 64 20 5b 70 77 64 5d 0a 66 6f 72 65  t pwd [pwd].fore
43d0: 61 63 68 20 7b 74 6e 31 20 74 63 6c 7d 20 7b 0a  ach {tn1 tcl} {.
43e0: 20 20 31 20 7b 20 73 65 74 20 70 72 65 66 69 78    1 { set prefix
43f0: 20 22 74 65 73 74 2e 64 62 22 20 7d 0a 20 20 32   "test.db" }.  2
4400: 20 7b 20 0a 20 20 20 20 23 20 54 68 69 73 20 74   { .    # This t
4410: 65 73 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  est depends on t
4420: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46  he underlying VF
4430: 53 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20  S being able to 
4440: 6f 70 65 6e 20 70 61 74 68 73 0a 20 20 20 20 23  open paths.    #
4450: 20 35 31 32 20 62 79 74 65 73 20 69 6e 20 6c 65   512 bytes in le
4460: 6e 67 74 68 2e 20 54 68 65 20 69 64 65 61 20 69  ngth. The idea i
4470: 73 20 74 6f 20 63 72 65 61 74 65 20 61 20 68 6f  s to create a ho
4480: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t-journal file t
4490: 68 61 74 0a 20 20 20 20 23 20 63 6f 6e 74 61 69  hat.    # contai
44a0: 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72  ns a master-jour
44b0: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20 6c  nal pointer so l
44c0: 61 72 67 65 20 74 68 61 74 20 69 74 20 63 6f 75  arge that it cou
44d0: 6c 64 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 23  ld contain.    #
44e0: 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 72 65   a valid page re
44f0: 63 6f 72 64 20 28 69 66 20 74 68 65 20 66 69 6c  cord (if the fil
4500: 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 35  e page-size is 5
4510: 31 32 20 62 79 74 65 73 29 2e 20 53 6f 20 61 73  12 bytes). So as
4520: 20 74 6f 0a 20 20 20 20 23 20 6d 61 6b 65 20 73   to.    # make s
4530: 75 72 65 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ure SQLite doesn
4540: 27 74 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  't get confused 
4550: 62 79 20 74 68 69 73 2e 0a 20 20 20 20 23 0a 20  by this..    #. 
4560: 20 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67 20     set nPadding 
4570: 5b 65 78 70 72 20 35 31 31 20 2d 20 24 3a 3a 6d  [expr 511 - $::m
4580: 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74  j_filename_lengt
4590: 68 5d 0a 20 20 20 20 69 66 20 7b 24 74 63 6c 5f  h].    if {$tcl_
45a0: 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72  platform(platfor
45b0: 6d 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b  m)=="windows"} {
45c0: 0a 20 20 20 20 20 20 23 20 54 42 44 20 6e 65 65  .      # TBD nee
45d0: 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  d to figure out 
45e0: 68 6f 77 20 74 6f 20 64 6f 20 74 68 69 73 20 63  how to do this c
45f0: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 57 69 6e  orrectly for Win
4600: 64 6f 77 73 21 21 21 0a 20 20 20 20 20 20 73 65  dows!!!.      se
4610: 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72  t nPadding [expr
4620: 20 32 35 35 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c   255 - $::mj_fil
4630: 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20  ename_length].  
4640: 20 20 7d 0a 0a 20 20 20 20 23 20 57 65 20 63 61    }..    # We ca
4650: 6e 6e 6f 74 20 6a 75 73 74 20 63 72 65 61 74 65  nnot just create
4660: 20 61 20 72 65 61 6c 6c 79 20 6c 6f 6e 67 20 64   a really long d
4670: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
4680: 65 20 74 6f 20 6f 70 65 6e 2c 20 61 73 0a 20 20  e to open, as.  
4690: 20 20 23 20 4c 69 6e 75 78 20 6c 69 6d 69 74 73    # Linux limits
46a0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70 6f 6e   a single compon
46b0: 65 6e 74 20 6f 66 20 61 20 70 61 74 68 20 74 6f  ent of a path to
46c0: 20 32 35 35 20 62 79 74 65 73 20 62 79 20 64 65   255 bytes by de
46d0: 66 61 75 6c 74 0a 20 20 20 20 23 20 28 61 6e 64  fault.    # (and
46e0: 20 70 72 65 73 75 6d 61 62 6c 79 20 6f 74 68 65   presumably othe
46f0: 72 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 6c  r systems have l
4700: 69 6d 69 74 73 20 74 6f 6f 29 2e 20 53 6f 20 63  imits too). So c
4710: 72 65 61 74 65 20 61 20 64 69 72 65 63 74 6f 72  reate a director
4720: 79 0a 20 20 20 20 23 20 68 69 65 72 61 72 63 68  y.    # hierarch
4730: 79 20 74 6f 20 77 6f 72 6b 20 69 6e 2e 0a 20 20  y to work in..  
4740: 20 20 23 0a 20 20 20 20 73 65 74 20 64 69 72 6e    #.    set dirn
4750: 61 6d 65 20 22 64 31 32 33 34 35 36 37 38 39 30  ame "d1234567890
4760: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
4770: 37 38 39 30 2f 22 0a 20 20 20 20 73 65 74 20 6e  7890/".    set n
4780: 44 69 72 20 5b 65 78 70 72 20 24 6e 50 61 64 64  Dir [expr $nPadd
4790: 69 6e 67 20 2f 20 33 32 5d 0a 20 20 20 20 69 66  ing / 32].    if
47a0: 20 7b 20 24 6e 44 69 72 20 7d 20 7b 0a 20 20 20   { $nDir } {.   
47b0: 20 20 20 73 65 74 20 70 20 5b 73 74 72 69 6e 67     set p [string
47c0: 20 72 65 70 65 61 74 20 24 64 69 72 6e 61 6d 65   repeat $dirname
47d0: 20 24 6e 44 69 72 5d 0a 20 20 20 20 20 20 66 69   $nDir].      fi
47e0: 6c 65 20 6d 6b 64 69 72 20 24 70 0a 20 20 20 20  le mkdir $p.    
47f0: 20 20 63 64 20 24 70 0a 20 20 20 20 7d 0a 0a 20    cd $p.    }.. 
4800: 20 20 20 73 65 74 20 70 61 64 64 69 6e 67 20 5b     set padding [
4810: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78 20  string repeat x 
4820: 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20  [expr $nPadding 
4830: 25 33 32 5d 5d 0a 20 20 20 20 73 65 74 20 70 72  %32]].    set pr
4840: 65 66 69 78 20 22 74 65 73 74 2e 64 62 24 7b 70  efix "test.db${p
4850: 61 64 64 69 6e 67 7d 22 0a 20 20 7d 0a 7d 20 7b  adding}".  }.} {
4860: 0a 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20 66  .  eval $tcl.  f
4870: 6f 72 65 61 63 68 20 7b 74 6e 32 20 73 71 6c 7d  oreach {tn2 sql}
4880: 20 7b 0a 20 20 20 20 6f 20 7b 20 0a 20 20 20 20   {.    o { .    
4890: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
48a0: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20  nchronous=OFF;. 
48b0: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
48c0: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b  synchronous=OFF;
48d0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
48e0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
48f0: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ETE;.    }.    o
4900: 35 31 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41  512 { .      PRA
4910: 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f  GMA main.synchro
4920: 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20  nous=OFF;.      
4930: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
4940: 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20  ronous=OFF;.    
4950: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61    PRAGMA main.pa
4960: 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
4970: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
4980: 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b  page_size = 512;
4990: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
49a0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
49b0: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ETE;.    }.    n
49c0: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
49d0: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
49e0: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
49f0: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
4a00: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
4a10: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
4a20: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
4a30: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 20 7b  E;.    }.    f {
4a40: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d   .      PRAGMA m
4a50: 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ain.synchronous=
4a60: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41 47  FULL;.      PRAG
4a70: 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f  MA aux.synchrono
4a80: 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50  us=FULL;.      P
4a90: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4aa0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4ab0: 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 73 65   }.  } {..    se
4ac0: 74 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24 7b 74  t tn "${tn1}.${t
4ad0: 6e 32 7d 22 0a 20 20 0a 20 20 20 20 23 20 53 65  n2}".  .    # Se
4ae0: 74 20 75 70 20 61 20 63 6f 6e 6e 65 63 74 69 6f  t up a connectio
4af0: 6e 20 74 6f 20 68 61 76 65 20 74 77 6f 20 64 61  n to have two da
4b00: 74 61 62 61 73 65 73 2c 20 74 65 73 74 2e 64 62  tabases, test.db
4b10: 20 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20 20 20   (main) and .   
4b20: 20 23 20 74 65 73 74 2e 64 62 32 20 28 61 75 78   # test.db2 (aux
4b30: 29 2e 20 54 68 65 6e 20 72 75 6e 20 61 20 6d 75  ). Then run a mu
4b40: 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
4b50: 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20 54 68  tion on them. Th
4b60: 65 0a 20 20 20 20 23 20 56 46 53 20 77 69 6c 6c  e.    # VFS will
4b70: 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   snapshot the fi
4b80: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
4b90: 65 66 6f 72 65 20 74 68 65 20 6d 61 73 74 65 72  efore the master
4ba0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23 20 66  -journal.    # f
4bb0: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 74  ile is deleted t
4bc0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
4bd0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 23 0a  nsaction..    #.
4be0: 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 78 44      tv filter xD
4bf0: 65 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74 65 73  elete.    do_tes
4c00: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
4c10: 2e 31 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74  .1 {.      fault
4c20: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
4c30: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
4c40: 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
4c50: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 24 7b        ATTACH '${
4c60: 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78  prefix}2' AS aux
4c70: 3b 0a 20 20 20 20 20 20 20 20 24 73 71 6c 0a 20  ;.        $sql. 
4c80: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
4c90: 42 4c 45 20 61 28 78 29 3b 0a 20 20 20 20 20 20  BLE a(x);.      
4ca0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
4cb0: 75 78 2e 62 28 78 29 3b 0a 20 20 20 20 20 20 20  ux.b(x);.       
4cc0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56   INSERT INTO a V
4cd0: 41 4c 55 45 53 28 27 64 6f 75 62 6c 65 2d 79 6f  ALUES('double-yo
4ce0: 75 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  u');.        INS
4cf0: 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45  ERT INTO a VALUE
4d00: 53 28 27 77 68 79 27 29 3b 0a 20 20 20 20 20 20  S('why');.      
4d10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20    INSERT INTO a 
4d20: 56 41 4c 55 45 53 28 27 7a 65 64 27 29 3b 0a 20  VALUES('zed');. 
4d30: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4d40: 54 4f 20 62 20 56 41 4c 55 45 53 28 27 77 6f 6e  TO b VALUES('won
4d50: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
4d60: 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53  RT INTO b VALUES
4d70: 28 27 74 6f 6f 27 29 3b 0a 20 20 20 20 20 20 20  ('too');.       
4d80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56   INSERT INTO b V
4d90: 41 4c 55 45 53 28 27 66 72 65 65 27 29 3b 0a 20  ALUES('free');. 
4da0: 20 20 20 20 20 22 0a 20 20 20 20 20 20 65 78 65       ".      exe
4db0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 42  csql {.        B
4dc0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  EGIN;.          
4dd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 53 45  INSERT INTO a SE
4de0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 20 57 48  LECT * FROM b WH
4df0: 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20  ERE rowid<=3;.  
4e00: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4e10: 4e 54 4f 20 62 20 53 45 4c 45 43 54 20 2a 20 46  NTO b SELECT * F
4e20: 52 4f 4d 20 61 20 57 48 45 52 45 20 72 6f 77 69  ROM a WHERE rowi
4e30: 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 43 4f  d<=3;.        CO
4e40: 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  MMIT;.      }.  
4e50: 20 20 7d 20 7b 7d 0a 20 20 20 20 74 76 20 66 69    } {}.    tv fi
4e60: 6c 74 65 72 20 7b 7d 0a 20 20 20 20 0a 20 20 20  lter {}.    .   
4e70: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68   # Check that th
4e80: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
4e90: 73 20 63 6f 6d 6d 69 74 74 65 64 20 73 75 63 63  s committed succ
4ea0: 65 73 73 66 75 6c 6c 79 2e 0a 20 20 20 20 23 0a  essfully..    #.
4eb0: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
4ec0: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
4ed0: 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 53 45 4c  tn.2 {.      SEL
4ee0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20  ECT * FROM a.   
4ef0: 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77   } {double-you w
4f00: 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66  hy zed won too f
4f10: 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63  ree}.    do_exec
4f20: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
4f30: 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  4.4.$tn.3 {.    
4f40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4f50: 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f  b.    } {won too
4f60: 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75   free double-you
4f70: 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 0a 20   why zed}.    . 
4f80: 20 20 20 23 20 52 65 73 74 6f 72 65 20 74 68 65     # Restore the
4f90: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64   file-system and
4fa0: 20 72 65 6f 70 65 6e 20 74 68 65 20 64 61 74 61   reopen the data
4fb0: 62 61 73 65 73 2e 20 43 68 65 63 6b 20 74 68 61  bases. Check tha
4fc0: 74 20 69 74 20 6e 6f 77 0a 20 20 20 20 23 20 61  t it now.    # a
4fd0: 70 70 65 61 72 73 20 74 68 61 74 20 74 68 65 20  ppears that the 
4fe0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
4ff0: 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 20 28 62  not committed (b
5000: 65 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 2d  ecause the file-
5010: 73 79 73 74 65 6d 0a 20 20 20 20 23 20 77 61 73  system.    # was
5020: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68 65   restored to the
5030: 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
5040: 68 61 64 20 6e 6f 74 20 62 65 65 6e 29 2e 0a 20  had not been).. 
5050: 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74     #.    do_test
5060: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5070: 34 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73  4 {.      faults
5080: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5090: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
50a0: 20 20 20 20 65 78 65 63 73 71 6c 20 22 41 54 54      execsql "ATT
50b0: 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32 27  ACH '${prefix}2'
50c0: 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20 7b   AS aux".    } {
50d0: 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c  }.    do_execsql
50e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
50f0: 2e 24 74 6e 2e 35 20 7b 53 45 4c 45 43 54 20 2a  .$tn.5 {SELECT *
5100: 20 46 52 4f 4d 20 61 7d 20 7b 64 6f 75 62 6c 65   FROM a} {double
5110: 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20  -you why zed}.  
5120: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
5130: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
5140: 2e 36 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  .6 {SELECT * FRO
5150: 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72  M b} {won too fr
5160: 65 65 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52  ee}.    .    # R
5170: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5180: 73 79 73 74 65 6d 20 61 67 61 69 6e 2e 20 54 68  system again. Th
5190: 69 73 20 74 69 6d 65 2c 20 62 65 66 6f 72 65 20  is time, before 
51a0: 72 65 6f 70 65 6e 69 6e 67 20 74 68 65 20 64 61  reopening the da
51b0: 74 61 62 61 73 65 73 2c 0a 20 20 20 20 23 20 64  tabases,.    # d
51c0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
51d0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72  -journal file fr
51e0: 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  om the file-syst
51f0: 65 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70 65 61  em. It now appea
5200: 72 73 20 74 68 61 74 0a 20 20 20 20 23 20 74 68  rs that.    # th
5210: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
5220: 73 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e 6f 20  s committed (no 
5230: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
5240: 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c 62 61  ile == no rollba
5250: 63 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20 20 64  ck)..    #.    d
5260: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  o_test pager1-4.
5270: 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 20 20  4.$tn.7 {.      
5280: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
5290: 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 65  _and_reopen $pre
52a0: 66 69 78 0a 20 20 20 20 20 20 66 6f 72 65 61 63  fix.      foreac
52b0: 68 20 66 20 5b 67 6c 6f 62 20 24 7b 70 72 65 66  h f [glob ${pref
52c0: 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20  ix}-mj*] { file 
52d0: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66  delete -force $f
52e0: 20 7d 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   }.      execsql
52f0: 20 22 41 54 54 41 43 48 20 27 24 7b 70 72 65 66   "ATTACH '${pref
5300: 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a 20 20  ix}2' AS aux".  
5310: 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f 65 78    } {}.    do_ex
5320: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
5330: 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b 0a 20 20  1-4.4.$tn.8 {.  
5340: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
5350: 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62 6c  M a.    } {doubl
5360: 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77 6f  e-you why zed wo
5370: 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20  n too free}.    
5380: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5390: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 39  pager1-4.4.$tn.9
53a0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
53b0: 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20 7b  * FROM b.    } {
53c0: 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f 75  won too free dou
53d0: 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d  ble-you why zed}
53e0: 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70 77 64 0a  .  }..  cd $pwd.
53f0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  }.db close.tv de
5400: 6c 65 74 65 0a 66 69 6c 65 20 64 65 6c 65 74 65  lete.file delete
5410: 20 2d 66 6f 72 63 65 20 24 64 69 72 6e 61 6d 65   -force $dirname
5420: 0a 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56 46  ...# Set up a VF
5430: 53 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  S to make a copy
5440: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
5450: 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20  tem just before 
5460: 64 65 6c 65 74 69 6e 67 20 61 0a 23 20 6a 6f 75  deleting a.# jou
5470: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 63 6f 6d  rnal file to com
5480: 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
5490: 6e 2e 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  n. The transacti
54a0: 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65 78 61 63  on modifies exac
54b0: 74 6c 79 0a 23 20 74 77 6f 20 64 61 74 61 62 61  tly.# two databa
54c0: 73 65 20 70 61 67 65 73 20 28 61 6e 64 20 70 61  se pages (and pa
54d0: 67 65 20 31 20 2d 20 74 68 65 20 63 68 61 6e 67  ge 1 - the chang
54e0: 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23 0a 74 65  e counter)..#.te
54f0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
5500: 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a  t 1.tv sectorsiz
5510: 65 20 35 31 32 0a 74 76 20 73 63 72 69 70 74 20  e 512.tv script 
5520: 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f  copy_on_journal_
5530: 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72  delete.tv filter
5540: 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f   xDelete.proc co
5550: 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65  py_on_journal_de
5560: 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c  lete {method fil
5570: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
5580: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
5590: 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65  h *journal $file
55a0: 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f  name]} faultsim_
55b0: 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53  save .  return S
55c0: 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74  QLITE_OK.}.fault
55d0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
55e0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
55f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5600: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f  .1 {.  PRAGMA jo
5610: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
5620: 45 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 70 61  ETE;.  PRAGMA pa
5630: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
5640: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
5650: 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54  1(a, b);.  CREAT
5660: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
5670: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
5680: 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27  t1 VALUES('I', '
5690: 49 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  II');.  INSERT I
56a0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 49  NTO t2 VALUES('I
56b0: 49 49 27 2c 20 27 49 56 27 29 3b 0a 20 20 42 45  II', 'IV');.  BE
56c0: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
56d0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
56e0: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
56f0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
5700: 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b  3, 4);.  COMMIT;
5710: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20 66  .} {delete}.tv f
5720: 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65 63  ilter {}..# Chec
5730: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
5740: 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 3a  n was committed:
5750: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
5760: 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32 20  st pager1.4.5.2 
5770: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
5780: 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a  M t1;.  SELECT *
5790: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49   FROM t2;.} {I I
57a0: 49 20 31 20 32 20 49 49 49 20 49 56 20 33 20 34  I 1 2 III IV 3 4
57b0: 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f 75  }..# Now try fou
57c0: 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70 61  r tests:.#.#  pa
57d0: 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73 74  ger1-4.5.3: Rest
57e0: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
57f0: 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74 20  tem. Check that 
5800: 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
5810: 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20 20  ction .#        
5820: 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c 65          is rolle
5830: 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67  d back..#.#  pag
5840: 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74 6f  er1-4.5.4: Resto
5850: 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  re the file-syst
5860: 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20  em. Corrupt the 
5870: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
5880: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
5890: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68       journal. Ch
58a0: 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  eck the transact
58b0: 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c 65  ion is not rolle
58c0: 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67  d back..#.#  pag
58d0: 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74 6f  er1-4.5.5: Resto
58e0: 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  re the file-syst
58f0: 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20  em. Corrupt the 
5900: 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69 6e  second record in
5910: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
5920: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43        journal. C
5930: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66 69  heck that the fi
5940: 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68  rst record in th
5950: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
5960: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
5970: 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20     played back, 
5980: 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63 6f  but not the seco
5990: 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  nd..#.#  pager1-
59a0: 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20 74  4.5.6: Restore t
59b0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
59c0: 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  Try to open the 
59d0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 0a  database with a.
59e0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
59f0: 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65 63   readonly connec
5a00: 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c  tion. This shoul
5a10: 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65 61  d fail, as a rea
5a20: 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20 20  d-only.#        
5a30: 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
5a40: 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20 62  on cannot roll b
5a50: 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
5a60: 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69   file..#.faultsi
5a70: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
5a80: 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  open.do_execsql_
5a90: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
5aa0: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  3 {.  SELECT * F
5ab0: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
5ac0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49   * FROM t2;.} {I
5ad0: 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75 6c   II III IV}.faul
5ae0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5af0: 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 72  _reopen.hexio_wr
5b00: 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ite test.db-jour
5b10: 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 2b  nal [expr 512+4+
5b20: 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32 33  1024 - 202] 0123
5b30: 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f 5f  456789ABCDEF.do_
5b40: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
5b50: 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53 45  er1.4.5.4 {.  SE
5b60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
5b70: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5b80: 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 20  t2;.} {I II 1 2 
5b90: 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75 6c  III IV 3 4}.faul
5ba0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5bb0: 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 72  _reopen.hexio_wr
5bc0: 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ite test.db-jour
5bd0: 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 2b  nal [expr 512+4+
5be0: 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d 20  1024+4+4+1024 - 
5bf0: 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39 41  202] 0123456789A
5c00: 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71 6c  BCDEF.do_execsql
5c10: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5c20: 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .5 {.  SELECT * 
5c30: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
5c40: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
5c50: 49 20 49 49 20 49 49 49 20 49 56 20 33 20 34 7d  I II III IV 3 4}
5c60: 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f  ..faultsim_resto
5c70: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62  re_and_reopen.db
5c80: 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64   close.sqlite3 d
5c90: 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f  b test.db -reado
5ca0: 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73 71  nly 1.do_catchsq
5cb0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5cc0: 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.6 {.  SELECT *
5cd0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5ce0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5cf0: 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72  {1 {disk I/O err
5d00: 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 23  or}}.db close..#
5d10: 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   Snapshot the fi
5d20: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
5d30: 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69 6c 65  efore multi-file
5d40: 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20 74 68   commit. Save th
5d50: 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68 65 20  e name.# of the 
5d60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5d70: 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66 69 6c  ile in $::mj_fil
5d80: 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63 72 69  ename..#.tv scri
5d90: 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65  pt copy_on_mj_de
5da0: 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78  lete.tv filter x
5db0: 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79  Delete.proc copy
5dc0: 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d  _on_mj_delete {m
5dd0: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
5de0: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
5df0: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20  ring match *mj* 
5e00: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
5e10: 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73  name]]} { .    s
5e20: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
5e30: 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 66   $filename.    f
5e40: 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20  aultsim_save .  
5e50: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5e60: 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20 70  E_OK.}.do_test p
5e70: 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a 20 20  ager1.4.6.1 {.  
5e80: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
5e90: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
5ea0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
5eb0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
5ec0: 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 41 54 54   DELETE;.    ATT
5ed0: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
5ee0: 53 20 74 77 6f 3b 0a 20 20 20 20 43 52 45 41 54  S two;.    CREAT
5ef0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
5f00: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
5f10: 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20 62 29 3b  LE two.t2(a, b);
5f20: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5f30: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 74   t1 VALUES(1, 't
5f40: 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  1.1');.    INSER
5f50: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5f60: 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20 20 20  (1, 't2.1');.   
5f70: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
5f80: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
5f90: 27 74 31 2e 32 27 3b 0a 20 20 20 20 20 20 55 50  't1.2';.      UP
5fa0: 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20  DATE t2 SET b = 
5fb0: 27 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f 4d 4d  't2.2';.    COMM
5fc0: 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66 69 6c  IT;.  }.  tv fil
5fd0: 74 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c 6f 73  ter {}.  db clos
5fe0: 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73 69 6d  e.} {}..faultsim
5ff0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
6000: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
6010: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 32  est pager1.4.6.2
6020: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
6030: 20 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20   t1 }           
6040: 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74  {1 t1.1}.do_test
6050: 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e           pager1.
6060: 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65 78 69  4.6.3 { file exi
6070: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6080: 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63  me } {1}.do_exec
6090: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
60a0: 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41 43 48  4.6.4 {.  ATTACH
60b0: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74   'test.db2' AS t
60c0: 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  wo;.  SELECT * F
60d0: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e  ROM t2;.} {1 t2.
60e0: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
60f0: 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65 20 65  1.4.6.5 { file e
6100: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6110: 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61 75 6c  name } {0}..faul
6120: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
6130: 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65  _reopen.db close
6140: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
6150: 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20 3a 3a  4.6.8 {.  set ::
6160: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24 3a 3a  mj_filename1 $::
6170: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20 74 76  mj_filename.  tv
6180: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
6190: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
61a0: 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20  t.db2.  execsql 
61b0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
61c0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
61d0: 54 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27  TE;.    ATTACH '
61e0: 74 65 73 74 2e 64 62 33 27 20 41 53 20 74 68 72  test.db3' AS thr
61f0: 65 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ee;.    CREATE T
6200: 41 42 4c 45 20 74 68 72 65 65 2e 74 33 28 61 2c  ABLE three.t3(a,
6210: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
6220: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31  INTO t3 VALUES(1
6230: 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20 20 20 42  , 't3.1');.    B
6240: 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41  EGIN;.      UPDA
6250: 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27 74  TE t2 SET b = 't
6260: 32 2e 33 27 3b 0a 20 20 20 20 20 20 55 50 44 41  2.3';.      UPDA
6270: 54 45 20 74 33 20 53 45 54 20 62 20 3d 20 27 74  TE t3 SET b = 't
6280: 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  3.3';.    COMMIT
6290: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a  ;.  }.  expr {$:
62a0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 21 3d  :mj_filename1 !=
62b0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 7d   $::mj_filename}
62c0: 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73 69 6d 5f  .} {1}.faultsim_
62d0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
62e0: 65 6e 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a  en.tv filter {}.
62f0: 0a 23 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74  .# The file-syst
6300: 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 3a  em now contains:
6310: 0a 23 0a 23 20 20 20 2a 20 74 68 72 65 65 20 64  .#.#   * three d
6320: 61 74 61 62 61 73 65 73 0a 23 20 20 20 2a 20 74  atabases.#   * t
6330: 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  hree hot-journal
6340: 20 66 69 6c 65 73 0a 23 20 20 20 2a 20 74 77 6f   files.#   * two
6350: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6360: 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68 65 20 68  files..#.# The h
6370: 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61 73 73 6f  ot-journals asso
6380: 63 69 61 74 65 64 20 77 69 74 68 20 74 65 73 74  ciated with test
6390: 2e 64 62 32 20 61 6e 64 20 74 65 73 74 2e 64 62  .db2 and test.db
63a0: 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20 6d 61 73  3 point to.# mas
63b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d  ter journal $::m
63c0: 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54 68 65 20  j_filename. The 
63d0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
63e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
63f0: 0a 23 20 74 65 73 74 2e 64 62 20 70 6f 69 6e 74  .# test.db point
6400: 73 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s to master jour
6410: 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  nal $::mj_filena
6420: 6d 65 31 2e 20 53 6f 20 72 65 61 64 69 6e 67 20  me1. So reading 
6430: 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64 62 20 73  from.# test.db s
6440: 68 6f 75 6c 64 20 64 65 6c 65 74 65 20 24 3a 3a  hould delete $::
6450: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a  mj_filename1..#.
6460: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
6470: 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72 74 20 5b  .6.9 {.  lsort [
6480: 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d 0a 7d  glob test.db*].}
6490: 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74 20 20 20   [lsort [list   
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 5c 0a 20 20 74 65 73 74          \.  test
64d0: 2e 64 62 20 74 65 73 74 2e 64 62 32 20 74 65 73  .db test.db2 tes
64e0: 74 2e 64 62 33 20 20 20 20 20 20 20 20 20 20 20  t.db3           
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6500: 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 2d 6a     \.  test.db-j
6510: 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d  ournal test.db2-
6520: 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 33  journal test.db3
6530: 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20 5c 0a  -journal      \.
6540: 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a    [file tail $::
6550: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b 66 69  mj_filename] [fi
6560: 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69  le tail $::mj_fi
6570: 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23 20 54  lename1].]]..# T
6580: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
6590: 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  l $::mj_filename
65a0: 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  1 contains point
65b0: 65 72 73 20 74 6f 20 74 65 73 74 2e 64 62 20 61  ers to test.db a
65c0: 6e 64 20 0a 23 20 74 65 73 74 2e 64 62 32 2e 20  nd .# test.db2. 
65d0: 48 6f 77 65 76 65 72 20 74 68 65 20 68 6f 74 2d  However the hot-
65e0: 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61 74  journal associat
65f0: 65 64 20 77 69 74 68 20 74 65 73 74 2e 64 62 32  ed with test.db2
6600: 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20 61 20 64   points to.# a d
6610: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 2d  ifferent master-
6620: 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72 65 66 6f  journal. Therefo
6630: 72 65 2c 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  re, reading from
6640: 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79 20 73 68   test.db only sh
6650: 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f 75 67 68  ould.# be enough
6660: 20 74 6f 20 63 61 75 73 65 20 53 51 4c 69 74 65   to cause SQLite
6670: 20 74 6f 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a   to delete $::mj
6680: 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f  _filename1..#.do
6690: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
66a0: 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b 20 66 69  ger1.4.6.10 { fi
66b0: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
66c0: 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a  filename  } {1}.
66d0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
66e0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 31 20 7b 20  pager1.4.6.11 { 
66f0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6700: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 31  j_filename1 } {1
6710: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
6720: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20  t pager1.4.6.12 
6730: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6740: 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d 0a 64 6f  t1 } {1 t1.1}.do
6750: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
6760: 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69  ger1.4.6.13 { fi
6770: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
6780: 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a  filename  } {1}.
6790: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
67a0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b 20  pager1.4.6.14 { 
67b0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
67c0: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 30  j_filename1 } {0
67d0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
67e0: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32  st pager1.4.6.12
67f0: 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73   {.  ATTACH 'tes
6800: 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20  t.db2' AS two;. 
6810: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6820: 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f  2;.} {1 t2.1}.do
6830: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
6840: 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69  ger1.4.6.13 { fi
6850: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
6860: 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 31 7d 0a  filename }  {1}.
6870: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6880: 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b 0a  pager1.4.6.14 {.
6890: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
68a0: 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20  b3' AS three;.  
68b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
68c0: 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a 64 6f 5f  ;.} {1 t3.1}.do_
68d0: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
68e0: 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20 66 69 6c  er1.4.6.15 { fil
68f0: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
6900: 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30 7d 0a 0a  ilename }  {0}..
6910: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
6920: 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d  te..testvfs tv -
6930: 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65 63  default 1.tv sec
6940: 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76 20 73  torsize 512.tv s
6950: 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f  cript copy_on_jo
6960: 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20  urnal_delete.tv 
6970: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70  filter xDelete.p
6980: 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72  roc copy_on_jour
6990: 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68  nal_delete {meth
69a0: 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73  od filename args
69b0: 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e  } {.  if {[strin
69c0: 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c  g match *journal
69d0: 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75   $filename]} fau
69e0: 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 72 65  ltsim_save .  re
69f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
6a00: 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65  .faultsim_delete
6a10: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65  _and_reopen.do_e
6a20: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
6a30: 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20 50 52 41  r1.4.7.1 {.  PRA
6a40: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
6a50: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 43 52 45   = DELETE;.  CRE
6a60: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50  ATE TABLE t1(x P
6a70: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
6a80: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
6a90: 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20 20 49 4e  1 ON t1(y);.  IN
6aa0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6ab0: 55 45 53 28 27 49 27 2c 20 20 20 27 6f 6e 65 27  UES('I',   'one'
6ac0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
6ad0: 20 74 31 20 56 41 4c 55 45 53 28 27 49 49 27 2c   t1 VALUES('II',
6ae0: 20 20 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53    'four');.  INS
6af0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6b00: 45 53 28 27 49 49 49 27 2c 20 27 6e 69 6e 65 27  ES('III', 'nine'
6b10: 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  );.  BEGIN;.    
6b20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6b30: 41 4c 55 45 53 28 27 49 56 27 2c 20 27 73 69 78  ALUES('IV', 'six
6b40: 74 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  teen');.    INSE
6b50: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6b60: 53 28 27 56 27 20 2c 20 27 74 77 65 6e 74 79 66  S('V' , 'twentyf
6b70: 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b  ive');.  COMMIT;
6b80: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20 66  .} {delete}.tv f
6b90: 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63 6c 6f 73  ilter {}.db clos
6ba0: 65 0a 74 76 20 64 65 6c 65 74 65 20 0a 64 6f 5f  e.tv delete .do_
6bb0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e  test pager1.4.7.
6bc0: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
6bd0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
6be0: 6e 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20  n.  catch {file 
6bf0: 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e  attributes test.
6c00: 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d  db-journal -perm
6c10: 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d 2d  issions r-------
6c20: 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65  -}.  catch {file
6c30: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
6c40: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61  .db-journal -rea
6c50: 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61 74 63 68  donly 1}.  catch
6c60: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
6c70: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 75  ROM t1 }.} {1 {u
6c80: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
6c90: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 64 6f  tabase file}}.do
6ca0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37  _test pager1.4.7
6cb0: 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .3 {.  db close.
6cc0: 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74    catch {file at
6cd0: 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62  tributes test.db
6ce0: 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69 73  -journal -permis
6cf0: 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d  sions rw-rw-rw-}
6d00: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
6d10: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
6d20: 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64 6f  b-journal -reado
6d30: 6e 6c 79 20 30 7d 0a 20 20 66 69 6c 65 20 64 65  nly 0}.  file de
6d40: 6c 65 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  lete test.db-jou
6d50: 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65 78 69 73  rnal.  file exis
6d60: 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
6d70: 61 6c 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d  al.} {0}..#-----
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dc0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
6dd0: 77 69 6e 67 20 74 65 73 74 73 20 64 65 61 6c 20  wing tests deal 
6de0: 77 69 74 68 20 6d 75 6c 74 69 2d 66 69 6c 65 20  with multi-file 
6df0: 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20 70 61 67  commits..#.# pag
6e00: 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68 65 20 63  er1-5.1.*: The c
6e10: 61 73 65 20 77 68 65 72 65 20 61 20 6d 75 6c 74  ase where a mult
6e20: 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  i-file cannot be
6e30: 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 63 61 75   committed becau
6e40: 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  se.#            
6e50: 20 20 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65     another conne
6e60: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
6e70: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
6e80: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a 23 20 20  n one of the.#  
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
6ea0: 65 73 2e 20 41 66 74 65 72 20 74 68 65 20 53 48  es. After the SH
6eb0: 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 6d  ARED lock is rem
6ec0: 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d 4d 49 54  oved, the COMMIT
6ed0: 20 73 75 63 63 65 65 64 73 2e 0a 23 0a 23 20 70   succeeds..#.# p
6ee0: 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20 4d 75 6c  ager1-5.2.*: Mul
6ef0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20  ti-file commits 
6f00: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
6f10: 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61  e=memory..#.# pa
6f20: 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d 75 6c 74  ger1-5.3.*: Mult
6f30: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20 77  i-file commits w
6f40: 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
6f50: 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61 67  =memory..#.# pag
6f60: 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68 65 63 6b  er1-5.4.*: Check
6f70: 20 74 68 61 74 20 77 69 74 68 20 73 79 6e 63 68   that with synch
6f80: 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c 2c 20 74  ronous=normal, t
6f90: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
6fa0: 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20  l file.#        
6fb0: 20 20 20 20 20 20 20 6e 61 6d 65 20 69 73 20 61         name is a
6fc0: 64 64 65 64 20 74 6f 20 61 20 6a 6f 75 72 6e 61  dded to a journa
6fd0: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
6fe0: 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  ly after the las
6ff0: 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  t.#             
7000: 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64    journal record
7010: 2e 20 42 75 74 20 77 69 74 68 20 73 79 6e 63 68  . But with synch
7020: 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20 65 78 74  ronous=full, ext
7030: 72 61 20 75 6e 75 73 65 64 20 73 70 61 63 65 0a  ra unused space.
7040: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
7050: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 74  is allocated bet
7060: 77 65 65 6e 20 74 68 65 20 6c 61 73 74 20 6a 6f  ween the last jo
7070: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 61 6e 64  urnal record and
7080: 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20 20   the .#         
7090: 20 20 20 20 20 20 6d 61 73 74 65 72 2d 6a 6f 75        master-jou
70a0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 73  rnal file name s
70b0: 6f 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65  o that the maste
70c0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23  r-journal file.#
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
70e0: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 6c 69 65  ame does not lie
70f0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63   on the same sec
7100: 74 6f 72 20 61 73 20 74 68 65 20 6c 61 73 74 20  tor as the last 
7110: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20  journal file.#  
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 63               rec
7130: 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  ord..#.# pager1-
7140: 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61  5.5.*: Check tha
7150: 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  t in journal_mod
7160: 65 3d 50 45 52 53 49 53 54 20 6d 6f 64 65 2c 20  e=PERSIST mode, 
7170: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
7180: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
7190: 20 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a    truncated to z
71a0: 65 72 6f 20 62 79 74 65 73 20 77 68 65 6e 20 61  ero bytes when a
71b0: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
71c0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 20 20  saction is .#   
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d              comm
71e0: 69 74 74 65 64 20 28 69 6e 73 74 65 61 64 20 6f  itted (instead o
71f0: 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  f the first coup
7200: 6c 65 20 6f 66 20 62 79 74 65 73 20 62 65 69 6e  le of bytes bein
7210: 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a 23 0a 64  g zeroed)..#.#.d
7220: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7230: 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
7240: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
7250: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
7260: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
7270: 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20  db2' AS aux;.   
7280: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
7290: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
72a0: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28  TE TABLE aux.t2(
72b0: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
72c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
72d0: 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29 3b 0a 20  (17, 'Lenin');. 
72e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
72f0: 31 20 56 41 4c 55 45 53 28 32 32 2c 20 27 53 74  1 VALUES(22, 'St
7300: 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  alin');.    INSE
7310: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7320: 53 28 35 33 2c 20 27 4b 68 72 75 73 68 63 68 65  S(53, 'Khrushche
7330: 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  v');.  }.} {}.do
7340: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
7350: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
7360: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7370: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7380: 20 56 41 4c 55 45 53 28 36 34 2c 20 27 42 72 65   VALUES(64, 'Bre
7390: 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20 20 20 49  zhnev');.      I
73a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
73b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
73c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
73d0: 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65  2 test.db2.  exe
73e0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
73f0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
7400: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 64 62   FROM t2;.  } db
7410: 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  2.} {}.do_test p
7420: 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b 0a 20 20  ager1-5.1.3 {.  
7430: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
7440: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
7450: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65  s locked}}.do_te
7460: 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 34 20  st pager1-5.1.4 
7470: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
7480: 49 54 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c  IT db2.  execsql
7490: 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63 73 71   COMMIT.  execsq
74a0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
74b0: 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 37  M t2 } db2.} {17
74c0: 20 4c 65 6e 69 6e 20 32 32 20 53 74 61 6c 69 6e   Lenin 22 Stalin
74d0: 20 35 33 20 4b 68 72 75 73 68 63 68 65 76 20 36   53 Khrushchev 6
74e0: 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64 6f 5f 74  4 Brezhnev}.do_t
74f0: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 35  est pager1-5.1.5
7500: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d   {.  db2 close.}
7510: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67   {}..do_test pag
7520: 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20 20 65 78  er1-5.2.1 {.  ex
7530: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
7540: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7550: 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20 20 42 45  = memory;.    BE
7560: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
7570: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
7580: 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29  (84, 'Andropov')
7590: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
75a0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38 34  NTO t2 VALUES(84
75b0: 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a 20  , 'Andropov');. 
75c0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
75d0: 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f 74 65 73   {memory}.do_tes
75e0: 74 20 70 61 67 65 72 31 2d 35 2e 33 2e 31 20 7b  t pager1-5.3.1 {
75f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7600: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
7610: 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20 20 20 20  mode = off;.    
7620: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
7630: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7640: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
7650: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
7660: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
7670: 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27  (85, 'Gorbachev'
7680: 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  );.    COMMIT;. 
7690: 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64 6f 5f 74   }.} {off}..do_t
76a0: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 31  est pager1-5.4.1
76b0: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
76c0: 74 65 73 74 76 66 73 20 74 76 0a 20 20 73 71 6c  testvfs tv.  sql
76d0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20  ite3 db test.db 
76e0: 2d 76 66 73 20 74 76 0a 20 20 65 78 65 63 73 71  -vfs tv.  execsq
76f0: 6c 20 7b 20 41 54 54 41 43 48 20 27 74 65 73 74  l { ATTACH 'test
7700: 2e 64 62 32 27 20 41 53 20 61 75 78 20 7d 0a 0a  .db2' AS aux }..
7710: 20 20 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c    tv filter xDel
7720: 65 74 65 0a 20 20 74 76 20 73 63 72 69 70 74 20  ete.  tv script 
7730: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  max_journal_size
7740: 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65  .  tv sectorsize
7750: 20 35 31 32 0a 20 20 73 65 74 20 3a 3a 6d 61 78   512.  set ::max
7760: 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 70 72 6f  _journal 0.  pro
7770: 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69  c max_journal_si
7780: 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d  ze {method args}
7790: 20 7b 0a 20 20 20 20 73 65 74 20 73 7a 20 30 0a   {.    set sz 0.
77a0: 20 20 20 20 63 61 74 63 68 20 7b 20 73 65 74 20      catch { set 
77b0: 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  sz [file size te
77c0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d  st.db-journal] }
77d0: 0a 20 20 20 20 69 66 20 7b 24 73 7a 20 3e 20 24  .    if {$sz > $
77e0: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 7d 20 7b  ::max_journal} {
77f0: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 61 78  .      set ::max
7800: 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a 20 20 20  _journal $sz.   
7810: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
7820: 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 65 78  LITE_OK.  }.  ex
7830: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
7840: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7850: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50 52  = DELETE;.    PR
7860: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
7870: 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 42   = NORMAL;.    B
7880: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
7890: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
78a0: 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76  S(85, 'Gorbachev
78b0: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
78c0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
78d0: 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27 29  85, 'Gorbachev')
78e0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
78f0: 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f  }.  set ::max_jo
7900: 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72 20 32 36  urnal.} [expr 26
7910: 31 35 2b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  15+[string lengt
7920: 68 20 5b 70 77 64 5d 5d 5d 0a 64 6f 5f 74 65 73  h [pwd]]].do_tes
7930: 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 32 20 7b  t pager1-5.4.2 {
7940: 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75  .  set ::max_jou
7950: 72 6e 61 6c 20 30 0a 20 20 65 78 65 63 73 71 6c  rnal 0.  execsql
7960: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79   {.    PRAGMA sy
7970: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c  nchronous = full
7980: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
7990: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
79a0: 31 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e  1 WHERE b = 'Len
79b0: 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  in';.      DELET
79c0: 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  E FROM t2 WHERE 
79d0: 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20  b = 'Lenin';.   
79e0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 73   COMMIT;.  }.  s
79f0: 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  et ::max_journal
7a00: 0a 7d 20 5b 65 78 70 72 20 33 31 31 31 2b 5b 73  .} [expr 3111+[s
7a10: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 70 77  tring length [pw
7a20: 64 5d 5d 5d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  d]]].db close.tv
7a30: 20 64 65 6c 65 74 65 0a 0a 64 6f 5f 74 65 73 74   delete..do_test
7a40: 20 70 61 67 65 72 31 2d 35 2e 35 2e 31 20 7b 0a   pager1-5.5.1 {.
7a50: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
7a60: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
7a70: 20 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65   .    ATTACH 'te
7a80: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a  st.db2' AS aux;.
7a90: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7aa0: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
7ab0: 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  T;.    CREATE TA
7ac0: 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20  BLE t3(a, b);.  
7ad0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
7ae0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
7af0: 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
7b00: 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
7b10: 74 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74  t1;.    UPDATE t
7b20: 33 20 53 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d  3 SET b = random
7b30: 62 6c 6f 62 28 31 35 30 30 29 3b 0a 20 20 7d 0a  blob(1500);.  }.
7b40: 20 20 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a    expr [file siz
7b50: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
7b60: 6c 5d 20 3e 20 31 35 30 30 30 0a 7d 20 7b 31 7d  l] > 15000.} {1}
7b70: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7b80: 35 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  5.5.2 {.  execsq
7b90: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73  l {.    PRAGMA s
7ba0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c  ynchronous = ful
7bb0: 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  l;.    BEGIN;.  
7bc0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
7bd0: 74 31 20 57 48 45 52 45 20 62 20 3d 20 27 53 74  t1 WHERE b = 'St
7be0: 61 6c 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c  alin';.      DEL
7bf0: 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52  ETE FROM t2 WHER
7c00: 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a  E b = 'Stalin';.
7c10: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
7c20: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
7c30: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30  .db-journal.} {0
7c40: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
7c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
7c90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
7ca0: 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22  ests work with "
7cb0: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
7cc0: 63 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74 65 73 74  count".#.do_test
7cd0: 20 70 61 67 65 72 31 2d 36 2e 31 20 7b 0a 20 20   pager1-6.1 {.  
7ce0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
7cf0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
7d00: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
7d10: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
7d20: 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41  none;.    PRAGMA
7d30: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
7d40: 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45  = 10;.    CREATE
7d50: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
7d60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7d70: 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t3(a, b);.    
7d80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
7d90: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
7da0: 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29  E TABLE t5(a, b)
7db0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7dc0: 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20  LE t6(a, b);.   
7dd0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
7de0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
7df0: 54 45 20 54 41 42 4c 45 20 74 38 28 61 2c 20 62  TE TABLE t8(a, b
7e00: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
7e10: 42 4c 45 20 74 39 28 61 2c 20 62 29 3b 0a 20 20  BLE t9(a, b);.  
7e20: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7e30: 31 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20  10(a, b);.  }.} 
7e40: 7b 31 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  {10}.do_catchsql
7e50: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 32  _test pager1-6.2
7e60: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
7e70: 45 20 74 31 31 28 61 2c 20 62 29 0a 7d 20 7b 31  E t11(a, b).} {1
7e80: 20 7b 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   {database or di
7e90: 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 64 6f 5f  sk is full}}.do_
7ea0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
7eb0: 65 72 31 2d 36 2e 34 20 7b 20 50 52 41 47 4d 41  er1-6.4 { PRAGMA
7ec0: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
7ed0: 20 20 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65       } {10}.do_e
7ee0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
7ef0: 72 31 2d 36 2e 35 20 7b 20 50 52 41 47 4d 41 20  r1-6.5 { PRAGMA 
7f00: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d  max_page_count =
7f10: 20 31 35 20 7d 20 7b 31 35 7d 0a 64 6f 5f 65 78   15 } {15}.do_ex
7f20: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
7f30: 31 2d 36 2e 36 20 7b 20 43 52 45 41 54 45 20 54  1-6.6 { CREATE T
7f40: 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29 20 20  ABLE t11(a, b)  
7f50: 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73     } {}.do_execs
7f60: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  ql_test pager1-6
7f70: 2e 37 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  .7 {.  BEGIN;.  
7f80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7f90: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
7fa0: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70      PRAGMA max_p
7fb0: 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 33 3b 0a  age_count = 13;.
7fc0: 7d 20 7b 31 33 7d 0a 64 6f 5f 65 78 65 63 73 71  } {13}.do_execsq
7fd0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
7fe0: 38 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  8 {.    INSERT I
7ff0: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 33  NTO t11 VALUES(3
8000: 2c 20 34 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  , 4);.    PRAGMA
8010: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8020: 3d 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a 64 6f 5f  = 10;.} {11}.do_
8030: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
8040: 65 72 31 2d 36 2e 39 20 7b 20 43 4f 4d 4d 49 54  er1-6.9 { COMMIT
8050: 20 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   } {}..do_execsq
8060: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
8070: 31 30 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f  10 { PRAGMA max_
8080: 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 20  page_count = 10 
8090: 7d 20 7b 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71  } {10}.do_execsq
80a0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
80b0: 31 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  11 { SELECT * FR
80c0: 4f 4d 20 74 31 31 20 7d 20 20 20 20 20 20 20 20  OM t11 }        
80d0: 20 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 65    {1 2 3 4}.do_e
80e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
80f0: 72 31 2d 36 2e 31 32 20 7b 20 50 52 41 47 4d 41  r1-6.12 { PRAGMA
8100: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8110: 7d 20 20 20 20 20 20 7b 31 31 7d 0a 0a 0a 23 2d  }      {11}...#-
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
8170: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77  ollowing tests w
8180: 6f 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41  ork with "PRAGMA
8190: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52   journal_mode=TR
81a0: 55 4e 43 41 54 45 22 20 61 6e 64 0a 23 20 22 50  UNCATE" and.# "P
81b0: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
81c0: 64 65 3d 45 58 43 4c 55 53 49 56 45 22 2e 0a 23  de=EXCLUSIVE"..#
81d0: 0a 23 20 45 61 63 68 20 74 65 73 74 20 69 73 20  .# Each test is 
81e0: 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20 35  specified with 5
81f0: 20 76 61 72 69 61 62 6c 65 73 2e 20 41 73 20 66   variables. As f
8200: 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 24 74  ollows:.#.#   $t
8210: 6e 3a 20 20 54 65 73 74 20 4e 75 6d 62 65 72 2e  n:  Test Number.
8220: 20 55 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   Used as part of
8230: 20 74 68 65 20 5b 64 6f 5f 74 65 73 74 5d 20 74   the [do_test] t
8240: 65 73 74 20 6e 61 6d 65 73 2e 0a 23 20 20 20 24  est names..#   $
8250: 73 71 6c 3a 20 53 51 4c 20 74 6f 20 65 78 65 63  sql: SQL to exec
8260: 75 74 65 2e 0a 23 20 20 20 24 72 65 73 3a 20 45  ute..#   $res: E
8270: 78 70 65 63 74 65 64 20 72 65 73 75 6c 74 20 6f  xpected result o
8280: 66 20 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c  f executing $sql
8290: 2e 0a 23 20 20 20 24 6a 73 3a 20 20 54 68 65 20  ..#   $js:  The 
82a0: 65 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66  expected size of
82b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
82c0: 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74  e, in bytes, aft
82d0: 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20  er executing.#  
82e0: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73         the SQL s
82f0: 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20  cript. Or -1 if 
8300: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
8310: 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65  ot expected to e
8320: 78 69 73 74 2e 0a 23 20 20 20 24 77 73 3a 20 20  xist..#   $ws:  
8330: 54 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a  The expected siz
8340: 65 20 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c  e of the WAL fil
8350: 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74  e, in bytes, aft
8360: 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20  er executing.#  
8370: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73         the SQL s
8380: 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20  cript. Or -1 if 
8390: 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 65  the WAL is not e
83a0: 78 70 65 63 74 65 64 20 74 6f 20 65 78 69 73 74  xpected to exist
83b0: 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61  ..#.ifcapable wa
83c0: 6c 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  l {.  faultsim_d
83d0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
83e0: 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  .  foreach {tn s
83f0: 71 6c 20 72 65 73 20 6a 73 20 77 73 7d 20 5b 73  ql res js ws} [s
8400: 75 62 73 74 20 7b 0a 20 20 0a 20 20 20 20 31 20  ubst {.  .    1 
8410: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
8420: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
8430: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 74        PRAGMA aut
8440: 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a 20 20  o_vacuum=OFF;.  
8450: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
8460: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
8470: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
8480: 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20 20 20  _size=1024;.    
8490: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
84a0: 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b  _mode=EXCLUSIVE;
84b0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
84c0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43  urnal_mode=TRUNC
84d0: 41 54 45 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ATE;.      INSER
84e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
84f0: 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 20 7b 65  (1, 2);.    } {e
8500: 78 63 6c 75 73 69 76 65 20 74 72 75 6e 63 61 74  xclusive truncat
8510: 65 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 32  e} 0 -1.  .    2
8520: 20 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 20    {.      BEGIN 
8530: 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20 20 20 20  IMMEDIATE;.     
8540: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
8550: 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49   t1;.      COMMI
8560: 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d 20 30  T;.    } {1 2} 0
8570: 20 2d 31 0a 20 20 0a 20 20 20 20 33 20 20 7b 0a   -1.  .    3  {.
8580: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
8590: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
85a0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d  OM t1;.      COM
85b0: 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d  MIT;.    } {1 2}
85c0: 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 34 20 20   0 -1.  .    4  
85d0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
85e0: 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20 20 20  _mode = WAL }   
85f0: 20 77 61 6c 20 20 20 20 2d 31 20 2d 31 0a 20 20   wal    -1 -1.  
8600: 20 20 35 20 20 7b 20 49 4e 53 45 52 54 20 49 4e    5  { INSERT IN
8610: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
8620: 34 29 20 7d 20 20 7b 7d 20 20 20 20 20 2d 31 20  4) }  {}     -1 
8630: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31  [wal_file_size 1
8640: 20 31 30 32 34 5d 0a 20 20 20 20 36 20 20 7b 20   1024].    6  { 
8650: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
8660: 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20 6e  ode = NORMAL } n
8670: 6f 72 6d 61 6c 20 2d 31 20 5b 77 61 6c 5f 66 69  ormal -1 [wal_fi
8680: 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a  le_size 1 1024].
8690: 20 20 20 20 37 20 20 7b 20 49 4e 53 45 52 54 20      7  { INSERT 
86a0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35  INTO t1 VALUES(5
86b0: 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20 20 2d  , 6); } {}     -
86c0: 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  1 [wal_file_size
86d0: 20 32 20 31 30 32 34 5d 0a 20 20 0a 20 20 20 20   2 1024].  .    
86e0: 38 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  8  { PRAGMA jour
86f0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43  nal_mode = TRUNC
8700: 41 54 45 20 7d 20 74 72 75 6e 63 61 74 65 20 20  ATE } truncate  
8710: 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20 20          0 -1.   
8720: 20 39 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54   9  { INSERT INT
8730: 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38  O t1 VALUES(7, 8
8740: 29 20 7d 20 20 20 20 7b 7d 20 20 20 20 20 20 20  ) }    {}       
8750: 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20           0 -1.  
8760: 20 20 31 30 20 7b 20 53 45 4c 45 43 54 20 2a 20    10 { SELECT * 
8770: 46 52 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20  FROM t1 }       
8780: 20 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34          {1 2 3 4
8790: 20 35 20 36 20 37 20 38 7d 20 30 20 2d 31 0a 20   5 6 7 8} 0 -1. 
87a0: 20 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 64 6f 5f   .  }] {.    do_
87b0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
87c0: 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20 24 73  er1-7.1.$tn.1 $s
87d0: 71 6c 20 24 72 65 73 0a 20 20 20 20 63 61 74 63  ql $res.    catc
87e0: 68 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b 20 73  h { set J -1 ; s
87f0: 65 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a 65 20  et J [file size 
8800: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d  test.db-journal]
8810: 20 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73   }.    catch { s
8820: 65 74 20 57 20 2d 31 20 3b 20 73 65 74 20 57 20  et W -1 ; set W 
8830: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
8840: 64 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20 64 6f  db-wal] }.    do
8850: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 31  _test pager1-7.1
8860: 2e 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20 24 4a  .$tn.2 { list $J
8870: 20 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a 73 20   $W } [list $js 
8880: 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74  $ws].  }.}..do_t
8890: 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 31  est pager1-7.2.1
88a0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
88b0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
88c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
88d0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
88e0: 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 3b  ode = EXCLUSIVE;
88f0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8900: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
8910: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 52 41  BEGIN;.      PRA
8920: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8930: 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 20   = delete;.     
8940: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
8950: 6d 6f 64 65 20 3d 20 74 72 75 6e 63 61 74 65 3b  mode = truncate;
8960: 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  .  }.} {exclusiv
8970: 65 20 64 65 6c 65 74 65 20 74 72 75 6e 63 61 74  e delete truncat
8980: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
8990: 31 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63  1-7.2.2 {.  exec
89a0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
89b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
89c0: 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ) }.  execsql { 
89d0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
89e0: 6f 64 65 20 3d 20 70 65 72 73 69 73 74 20 7d 0a  ode = persist }.
89f0: 7d 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64 6f 5f  } {truncate}.do_
8a00: 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e  test pager1-7.2.
8a10: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
8a20: 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65 63 73  COMMIT }.  execs
8a30: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
8a40: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70  journal_mode = p
8a50: 65 72 73 69 73 74 3b 0a 20 20 20 20 50 52 41 47  ersist;.    PRAG
8a60: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  MA journal_size_
8a70: 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b 70 65  limit;.  }.} {pe
8a80: 72 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d  rsist -1}..#----
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ad0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
8ae0: 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 70 61 67  owing tests, pag
8af0: 65 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20 74 68  er1-8.*, test th
8b00: 61 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 66  at the special f
8b10: 69 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a 6d 65  ilenames .# ":me
8b20: 6d 6f 72 79 3a 22 20 61 6e 64 20 22 22 20 6f 70  mory:" and "" op
8b30: 65 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  en temporary dat
8b40: 61 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65 61 63  abases..#.foreac
8b50: 68 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65 7d 20  h {tn filename} 
8b60: 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a 0a 20  {.  1 :memory:. 
8b70: 20 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74   2 "".} {.  do_t
8b80: 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e  est pager1-8.$tn
8b90: 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  .1 {.    faultsi
8ba0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
8bb0: 70 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f 73 65  pen.    db close
8bc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
8bd0: 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 65 78  $filename.    ex
8be0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
8bf0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
8c00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 43 52 45 41   = 1;.      CREA
8c10: 54 45 20 54 41 42 4c 45 20 78 31 28 78 29 3b 0a  TE TABLE x1(x);.
8c20: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
8c30: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 43 68 61  O x1 VALUES('Cha
8c40: 72 6c 65 73 27 29 3b 0a 20 20 20 20 20 20 49 4e  rles');.      IN
8c50: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
8c60: 55 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a 20 20  UES('James');.  
8c70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8c80: 78 31 20 56 41 4c 55 45 53 28 27 4d 61 72 79 27  x1 VALUES('Mary'
8c90: 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  );.      SELECT 
8ca0: 2a 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 7d  * FROM x1;.    }
8cb0: 0a 20 20 7d 20 7b 43 68 61 72 6c 65 73 20 4a 61  .  } {Charles Ja
8cc0: 6d 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64 6f 5f  mes Mary}..  do_
8cd0: 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74  test pager1-8.$t
8ce0: 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  n.2 {.    sqlite
8cf0: 33 20 64 62 32 20 24 66 69 6c 65 6e 61 6d 65 0a  3 db2 $filename.
8d00: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53      catchsql { S
8d10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20  ELECT * FROM x1 
8d20: 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 6e 6f  } db2.  } {1 {no
8d30: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 78 31 7d   such table: x1}
8d40: 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  }..  do_execsql_
8d50: 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74  test pager1-8.$t
8d60: 6e 2e 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  n.3 {.    BEGIN;
8d70: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
8d80: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 57 69  TO x1 VALUES('Wi
8d90: 6c 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20 20 49  lliam');.      I
8da0: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41  NSERT INTO x1 VA
8db0: 4c 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a 20 20  LUES('Anne');.  
8dc0: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20    ROLLBACK;.  } 
8dd0: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
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: 0a 23 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  .# The next bloc
8e30: 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 70 61 67  k of tests - pag
8e40: 65 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c 20 77  er1-9.* - deal w
8e50: 69 74 68 20 69 6e 74 65 72 61 63 74 69 6f 6e 73  ith interactions
8e60: 20 62 65 74 77 65 65 6e 0a 23 20 74 68 65 20 70   between.# the p
8e70: 61 67 65 72 20 61 6e 64 20 74 68 65 20 62 61 63  ager and the bac
8e80: 6b 75 70 20 41 50 49 2e 20 54 65 73 74 20 63 61  kup API. Test ca
8e90: 73 65 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72  ses:.#.#   pager
8ea0: 31 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68  1-9.1.*: Test th
8eb0: 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70  at a backup comp
8ec0: 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c  letes successful
8ed0: 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23  ly even if the.#
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ef0: 20 73 6f 75 72 63 65 20 64 62 20 69 73 20 77 72   source db is wr
8f00: 69 74 74 65 6e 20 74 6f 20 64 75 72 69 6e 67 20  itten to during 
8f10: 74 68 65 20 62 61 63 6b 75 70 20 6f 70 2e 0a 23  the backup op..#
8f20: 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e 32 2e  .#   pager1-9.2.
8f30: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61 20 62  *: Test that a b
8f40: 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65 73 20  ackup completes 
8f50: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65 76 65  successfully eve
8f60: 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20  n if the.#      
8f70: 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63             sourc
8f80: 65 20 64 62 20 69 73 20 77 72 69 74 74 65 6e 20  e db is written 
8f90: 74 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f 6c 6c  to and then roll
8fa0: 65 64 20 62 61 63 6b 20 64 75 72 69 6e 67 20 61  ed back during a
8fb0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
8fc0: 20 20 20 20 62 61 63 6b 75 70 20 6f 70 65 72 61      backup opera
8fd0: 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  tion..#.do_test 
8fe0: 70 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b 0a 20  pager1-9.0.1 {. 
8ff0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
9000: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62  _and_reopen.  db
9010: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
9020: 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
9030: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
9040: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
9050: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
9060: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
9070: 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c  (a, b, UNIQUE(a,
9080: 20 62 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45   b));.      INSE
9090: 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45  RT INTO ab VALUE
90a0: 53 28 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  S( a_string(200)
90b0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
90c0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
90d0: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
90e0: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
90f0: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
9100: 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   ab;.      INSER
9110: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
9120: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
9130: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
9140: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
9150: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
9160: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
9170: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
9180: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
9190: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
91a0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
91b0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
91c0: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
91d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
91e0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
91f0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9200: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
9210: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
9220: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
9230: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
9240: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
9250: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9260: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
9270: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
9280: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
9290: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
92a0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
92b0: 67 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20 20 73  ger1-9.0.2 {.  s
92c0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
92d0: 64 62 32 0a 20 20 64 62 32 20 65 76 61 6c 20 7b  db2.  db2 eval {
92e0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
92f0: 7a 65 20 3d 20 31 30 20 7d 0a 20 20 73 71 6c 69  ze = 10 }.  sqli
9300: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
9310: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
9320: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
9330: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
9340: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
9350: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9360: 20 70 61 67 65 72 31 2d 39 2e 30 2e 33 20 7b 0a   pager1-9.0.3 {.
9370: 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20   db one {SELECT 
9380: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9390: 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65  M ab}.} [db2 one
93a0: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
93b0: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a  a, b) FROM ab}].
93c0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
93d0: 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  9.1.1 {.  execsq
93e0: 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45  l { UPDATE ab SE
93f0: 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32  T a = a_string(2
9400: 30 31 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  01) }.  sqlite3_
9410: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
9420: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74  n db main.  B st
9430: 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f  ep 30.} {SQLITE_
9440: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9450: 72 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65 78 65  r1-9.1.2 {.  exe
9460: 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62  csql { UPDATE ab
9470: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
9480: 67 28 33 30 31 29 20 7d 0a 20 20 6c 69 73 74 20  g(301) }.  list 
9490: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
94a0: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
94b0: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
94c0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
94d0: 72 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62 20 6f  r1-9.1.3 {. db o
94e0: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
94f0: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
9500: 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c  .} [db2 one {SEL
9510: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
9520: 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65   FROM ab}].do_te
9530: 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 34 20  st pager1-9.1.4 
9540: 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45  { execsql { SELE
9550: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
9560: 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 0a 64   ab } } {128}..d
9570: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9580: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
9590: 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20  { UPDATE ab SET 
95a0: 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 32  a = a_string(202
95b0: 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  ) }.  sqlite3_ba
95c0: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
95d0: 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70  db main.  B step
95e0: 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   30.} {SQLITE_OK
95f0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
9600: 2d 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  -9.2.2 {.  execs
9610: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
9620: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 61 62  .      UPDATE ab
9630: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
9640: 67 28 33 30 31 29 3b 0a 20 20 20 20 52 4f 4c 4c  g(301);.    ROLL
9650: 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69 73 74  BACK;.  }.  list
9660: 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20   [B step 10000] 
9670: 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51  [B finish].} {SQ
9680: 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45  LITE_DONE SQLITE
9690: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  _OK}.do_test pag
96a0: 65 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64 62 20  er1-9.2.3 {. db 
96b0: 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73  one {SELECT md5s
96c0: 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62  um(a, b) FROM ab
96d0: 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45  }.} [db2 one {SE
96e0: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
96f0: 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74  ) FROM ab}].do_t
9700: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 34  est pager1-9.2.4
9710: 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c   { execsql { SEL
9720: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
9730: 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 64  M ab } } {128}.d
9740: 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73  b close.db2 clos
9750: 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e..do_test pager
9760: 31 2d 39 2e 33 2e 31 20 7b 0a 20 20 74 65 73 74  1-9.3.1 {.  test
9770: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
9780: 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  1.  tv sectorsiz
9790: 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69  e 4096.  faultsi
97a0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
97b0: 70 65 6e 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b  pen..  execsql {
97c0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
97d0: 65 20 3d 20 31 30 32 34 20 7d 0a 20 20 66 6f 72  e = 1024 }.  for
97e0: 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69   {set ii 0} {$ii
97f0: 20 3c 20 34 7d 20 7b 69 6e 63 72 20 69 69 7d 20   < 4} {incr ii} 
9800: 7b 20 65 78 65 63 73 71 6c 20 22 43 52 45 41 54  { execsql "CREAT
9810: 45 20 54 41 42 4c 45 20 74 24 7b 69 69 7d 28 61  E TABLE t${ii}(a
9820: 2c 20 62 29 22 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  , b)" }.} {}.do_
9830: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e  test pager1-9.3.
9840: 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  2 {.  sqlite3 db
9850: 32 20 74 65 73 74 2e 64 62 32 0a 0a 20 20 65 78  2 test.db2..  ex
9860: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
9870: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34  MA page_size = 4
9880: 30 39 36 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  096;.    PRAGMA 
9890: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46  synchronous = OF
98a0: 46 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  F;.    CREATE TA
98b0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
98c0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
98d0: 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32  2(a, b);.  } db2
98e0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ..  sqlite3_back
98f0: 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62  up B db2 main db
9900: 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33   main.  B step 3
9910: 30 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70  0.  list [B step
9920: 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73   10000] [B finis
9930: 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e  h].} {SQLITE_DON
9940: 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f  E SQLITE_OK}.do_
9950: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e  test pager1-9.3.
9960: 33 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  3 {.  db2 close.
9970: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20    db close.  tv 
9980: 64 65 6c 65 74 65 0a 20 20 66 69 6c 65 20 73 69  delete.  file si
9990: 7a 65 20 74 65 73 74 2e 64 62 32 0a 7d 20 5b 66  ze test.db2.} [f
99a0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
99b0: 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  ]..do_test pager
99c0: 31 2d 39 2e 34 2e 31 20 7b 0a 20 20 66 61 75 6c  1-9.4.1 {.  faul
99d0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
99e0: 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33  reopen.  sqlite3
99f0: 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20   db2 test.db2.  
9a00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
9a10: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
9a20: 20 34 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54   4096;.    CREAT
9a30: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
9a40: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
9a50: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d  LE t2(a, b);.  }
9a60: 20 64 62 32 0a 20 20 73 71 6c 69 74 65 33 5f 62   db2.  sqlite3_b
9a70: 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e  ackup B db2 main
9a80: 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74 20   db main.  list 
9a90: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
9aa0: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
9ab0: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
9ac0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9ad0: 72 31 2d 39 2e 34 2e 32 20 7b 0a 20 20 6c 69 73  r1-9.4.2 {.  lis
9ae0: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
9af0: 74 2e 64 62 32 5d 20 5b 66 69 6c 65 20 73 69 7a  t.db2] [file siz
9b00: 65 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 30 20  e test.db].} {0 
9b10: 30 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23 2d  0}.db2 close..#-
9b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
9b70: 74 68 61 74 20 72 65 67 61 72 64 6c 65 73 73 20  that regardless 
9b80: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  of the value ret
9b90: 75 72 6e 65 64 20 62 79 20 78 53 65 63 74 6f 72  urned by xSector
9ba0: 53 69 7a 65 28 29 2c 20 74 68 65 0a 23 20 6d 69  Size(), the.# mi
9bb0: 6e 69 6d 75 6d 20 65 66 66 65 63 74 69 76 65 20  nimum effective 
9bc0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 35  sector-size is 5
9bd0: 31 32 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  12 and the maxim
9be0: 75 6d 20 36 35 35 33 36 20 62 79 74 65 73 2e 0a  um 65536 bytes..
9bf0: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
9c00: 66 61 75 6c 74 20 31 0a 66 6f 72 65 61 63 68 20  fault 1.foreach 
9c10: 73 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20 20  sectorsize {.   
9c20: 20 33 32 20 20 20 36 34 20 20 20 31 32 38 20 20   32   64   128  
9c30: 20 32 35 36 20 20 20 35 31 32 20 20 20 31 30 32   256   512   102
9c40: 34 20 20 20 32 30 34 38 20 0a 20 20 20 20 34 30  4   2048 .    40
9c50: 39 36 20 38 31 39 32 20 31 36 33 38 34 20 33 32  96 8192 16384 32
9c60: 37 36 38 20 36 35 35 33 36 20 31 33 31 30 37 32  768 65536 131072
9c70: 20 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74 76   262144.} {.  tv
9c80: 20 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63   sectorsize $sec
9c90: 74 6f 72 73 69 7a 65 0a 20 20 73 65 74 20 65 66  torsize.  set ef
9ca0: 66 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20  f $sectorsize.  
9cb0: 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20  if {$sectorsize 
9cc0: 3c 20 35 31 32 7d 20 20 20 7b 20 73 65 74 20 65  < 512}   { set e
9cd0: 66 66 20 35 31 32 20 7d 0a 20 20 69 66 20 7b 24  ff 512 }.  if {$
9ce0: 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35  sectorsize > 655
9cf0: 33 36 7d 20 7b 20 73 65 74 20 65 66 66 20 36 35  36} { set eff 65
9d00: 35 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  536 }..  do_test
9d10: 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74   pager1-10.$sect
9d20: 6f 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 66  orsize.1 {.    f
9d30: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
9d40: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62  nd_reopen.    db
9d50: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
9d60: 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63  _string.    exec
9d70: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
9d80: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
9d90: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20  = PERSIST;.     
9da0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
9db0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20  e = 1024;.      
9dc0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43  BEGIN;.        C
9dd0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
9de0: 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52  , b);.        CR
9df0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
9e00: 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45   b);.        CRE
9e10: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
9e20: 62 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  b);.      COMMIT
9e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65  ;.    }.    file
9e40: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
9e50: 75 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72 20  urnal.  } [expr 
9e60: 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35  $sectorsize > 65
9e70: 35 33 36 20 3f 20 36 35 35 33 36 20 3a 20 24 73  536 ? 65536 : $s
9e80: 65 63 74 6f 72 73 69 7a 65 5d 0a 0a 20 20 64 6f  ectorsize]..  do
9e90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e  _test pager1-10.
9ea0: 24 73 65 63 74 6f 72 73 69 7a 65 2e 32 20 7b 0a  $sectorsize.2 {.
9eb0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
9ec0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9ed0: 20 74 33 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t3 VALUES(a_str
9ee0: 69 6e 67 28 33 30 30 29 2c 20 61 5f 73 74 72 69  ing(300), a_stri
9ef0: 6e 67 28 33 30 30 29 29 3b 0a 20 20 20 20 20 20  ng(300));.      
9f00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
9f10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
9f20: 20 20 20 20 20 20 20 20 2f 2a 20 20 32 20 2a 2f          /*  2 */
9f30: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9f40: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46  TO t3 SELECT * F
9f50: 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f  ROM t3;        /
9f60: 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  4 */.      IN
9f70: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
9f80: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20  ECT * FROM t3;  
9f90: 20 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20        /*  8 */. 
9fa0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9fb0: 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t3 SELECT * FRO
9fc0: 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20  M t3;        /* 
9fd0: 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  16 */.      INSE
9fe0: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
9ff0: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20  T * FROM t3;    
a000: 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20      /* 32 */.   
a010: 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f   }.  } {}..  do_
a020: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
a030: 73 65 63 74 6f 72 73 69 7a 65 2e 33 20 7b 0a 20  sectorsize.3 {. 
a040: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
a050: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
a060: 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  db.    execsql {
a070: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63   .      PRAGMA c
a080: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
a090: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
a0a0: 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65   }.    recursive
a0b0: 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64  _select 32 t3 {d
a0c0: 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49  b eval "INSERT I
a0d0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
a0e0: 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71   2)"}.    execsq
a0f0: 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  l {.      COMMIT
a100: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
a110: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a   FROM t2;.    }.
a120: 20 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f    } {1 2}..  do_
a130: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
a140: 73 65 63 74 6f 72 73 69 7a 65 2e 34 20 7b 0a 20  sectorsize.4 {. 
a150: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
a160: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a170: 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t6(a, b);.      
a180: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28  CREATE TABLE t7(
a190: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  a, b);.      CRE
a1a0: 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20  ATE TABLE t5(a, 
a1b0: 62 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54  b);.      DROP T
a1c0: 41 42 4c 45 20 74 36 3b 0a 20 20 20 20 20 20 44  ABLE t6;.      D
a1d0: 52 4f 50 20 54 41 42 4c 45 20 74 37 3b 0a 20 20  ROP TABLE t7;.  
a1e0: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
a1f0: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
a200: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
a210: 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20  BLE t6(a, b);.  
a220: 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76    }.    recursiv
a230: 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b  e_select 32 t3 {
a240: 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20  db eval "INSERT 
a250: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31  INTO t5 VALUES(1
a260: 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73  , 2)"}.    execs
a270: 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49  ql {.      COMMI
a280: 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  T;.      SELECT 
a290: 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d  * FROM t5;.    }
a2a0: 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a  .  } {1 2}.  .}.
a2b0: 64 62 20 63 6c 6f 73 65 0a 0a 74 76 20 73 65 63  db close..tv sec
a2c0: 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 64 6f 5f  torsize 4096.do_
a2d0: 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78  test pager1.10.x
a2e0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
a2f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
a300: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
a310: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
a320: 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20  cuum = none;.   
a330: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
a340: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
a350: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
a360: 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74  ;.  }.  for {set
a370: 20 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20 7b 69   i 0} {$i<30} {i
a380: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65  ncr i} {.    exe
a390: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
a3a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 7a 65 72  TO t1 VALUES(zer
a3b0: 6f 62 6c 6f 62 28 39 30 30 29 29 20 7d 0a 20 20  oblob(900)) }.  
a3c0: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
a3d0: 73 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d 0a  st.db.} {32768}.
a3e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31  do_test pager1.1
a3f0: 30 2e 78 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  0.x.2 {.  execsq
a400: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
a410: 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20  ABLE t2(x);.    
a420: 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20  DROP TABLE t2;. 
a430: 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
a440: 65 73 74 2e 64 62 0a 7d 20 7b 33 33 37 39 32 7d  est.db.} {33792}
a450: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
a460: 31 30 2e 78 2e 33 20 7b 0a 20 20 65 78 65 63 73  10.x.3 {.  execs
a470: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
a480: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a490: 20 74 32 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65   t2(x);.  }.  re
a4a0: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33  cursive_select 3
a4b0: 30 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20 7b  0 t1.  execsql {
a4c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
a4d0: 45 20 74 33 28 78 29 3b 0a 20 20 20 20 43 4f 4d  E t3(x);.    COM
a4e0: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  MIT;.  }.} {}..d
a4f0: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
a500: 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64  e..testvfs tv -d
a510: 65 66 61 75 6c 74 20 31 0a 66 61 75 6c 74 73 69  efault 1.faultsi
a520: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
a530: 70 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74  pen.db func a_st
a540: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 64 6f  ring a_string.do
a550: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
a560: 67 65 72 31 2d 31 31 2e 31 20 7b 0a 20 20 50 52  ger1-11.1 {.  PR
a570: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
a580: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 50 52  e = DELETE;.  PR
a590: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
a5a0: 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  = 10;.  BEGIN;. 
a5b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a5c0: 7a 7a 28 74 6f 70 20 50 52 49 4d 41 52 59 20 4b  zz(top PRIMARY K
a5d0: 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  EY);.    INSERT 
a5e0: 49 4e 54 4f 20 7a 7a 20 56 41 4c 55 45 53 28 61  INTO zz VALUES(a
a5f0: 5f 73 74 72 69 6e 67 28 32 32 32 29 29 3b 0a 20  _string(222));. 
a600: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
a610: 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  z SELECT a_strin
a620: 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61  g((SELECT 222+ma
a630: 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a  x(rowid) FROM zz
a640: 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20  )) FROM zz;.    
a650: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53  INSERT INTO zz S
a660: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28  ELECT a_string((
a670: 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72  SELECT 222+max(r
a680: 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20  owid) FROM zz)) 
a690: 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53  FROM zz;.    INS
a6a0: 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45  ERT INTO zz SELE
a6b0: 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c  CT a_string((SEL
a6c0: 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69  ECT 222+max(rowi
a6d0: 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f  d) FROM zz)) FRO
a6e0: 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54  M zz;.    INSERT
a6f0: 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20   INTO zz SELECT 
a700: 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54  a_string((SELECT
a710: 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20   222+max(rowid) 
a720: 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a  FROM zz)) FROM z
a730: 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  z;.    INSERT IN
a740: 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73  TO zz SELECT a_s
a750: 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32  tring((SELECT 22
a760: 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f  2+max(rowid) FRO
a770: 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a  M zz)) FROM zz;.
a780: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 42 45 47 49    COMMIT;.  BEGI
a790: 4e 3b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 7a  N;.    UPDATE zz
a7a0: 20 53 45 54 20 74 6f 70 20 3d 20 61 5f 73 74 72   SET top = a_str
a7b0: 69 6e 67 28 33 34 35 29 3b 0a 7d 20 7b 64 65 6c  ing(345);.} {del
a7c0: 65 74 65 7d 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f  ete}..proc locko
a7d0: 75 74 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d  ut {method args}
a7e0: 20 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   { return SQLITE
a7f0: 5f 49 4f 45 52 52 20 7d 0a 74 76 20 73 63 72 69  _IOERR }.tv scri
a800: 70 74 20 6c 6f 63 6b 6f 75 74 0a 74 76 20 66 69  pt lockout.tv fi
a810: 6c 74 65 72 20 7b 78 57 72 69 74 65 20 78 54 72  lter {xWrite xTr
a820: 75 6e 63 61 74 65 20 78 53 79 6e 63 7d 0a 64 6f  uncate xSync}.do
a830: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
a840: 61 67 65 72 31 2d 31 31 2e 32 20 7b 20 43 4f 4d  ager1-11.2 { COM
a850: 4d 49 54 20 7d 20 7b 31 20 7b 64 69 73 6b 20 49  MIT } {1 {disk I
a860: 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a 74 76 20 73  /O error}}..tv s
a870: 63 72 69 70 74 20 7b 7d 0a 64 6f 5f 74 65 73 74  cript {}.do_test
a880: 20 70 61 67 65 72 31 2d 31 31 2e 33 20 7b 0a 20   pager1-11.3 {. 
a890: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
a8a0: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
a8b0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
a8c0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43  nal_mode = TRUNC
a8d0: 41 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ATE;.    PRAGMA 
a8e0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
a8f0: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 74 72 75 6e  .  } db2.} {trun
a900: 63 61 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74  cate ok}.do_test
a910: 20 70 61 67 65 72 31 2d 31 31 2e 34 20 7b 0a 20   pager1-11.4 {. 
a920: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c   db2 close.  fil
a930: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
a940: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
a950: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
a960: 61 67 65 72 31 2d 31 31 2e 35 20 7b 20 53 45 4c  ager1-11.5 { SEL
a970: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
a980: 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62 20 63  M zz } {32}.db c
a990: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 20  lose.tv delete. 
a9a0: 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   .#-------------
a9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
a9f0: 65 73 74 20 22 50 52 41 47 4d 41 20 70 61 67 65  est "PRAGMA page
aa00: 5f 73 69 7a 65 22 0a 23 0a 74 65 73 74 76 66 73  _size".#.testvfs
aa10: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74   tv -default 1.t
aa20: 76 20 73 65 63 74 6f 72 73 69 7a 65 20 31 30 32  v sectorsize 102
aa30: 34 0a 66 6f 72 65 61 63 68 20 70 61 67 65 73 69  4.foreach pagesi
aa40: 7a 65 20 7b 0a 20 20 20 20 35 31 32 20 20 20 31  ze {.    512   1
aa50: 30 32 34 20 20 20 32 30 34 38 20 34 30 39 36 20  024   2048 4096 
aa60: 38 31 39 32 20 31 36 33 38 34 20 33 32 37 36 38  8192 16384 32768
aa70: 20 0a 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d   .} {.  faultsim
aa80: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
aa90: 65 6e 0a 0a 20 20 23 20 54 68 65 20 73 65 63 74  en..  # The sect
aaa0: 6f 72 2d 73 69 7a 65 20 28 61 63 63 6f 72 64 69  or-size (accordi
aab0: 6e 67 20 74 6f 20 74 68 65 20 56 46 53 29 20 69  ng to the VFS) i
aac0: 73 20 31 30 32 34 20 62 79 74 65 73 2e 20 53 6f  s 1024 bytes. So
aad0: 20 69 66 20 74 68 65 0a 20 20 23 20 70 61 67 65   if the.  # page
aae0: 2d 73 69 7a 65 20 72 65 71 75 65 73 74 65 64 20  -size requested 
aaf0: 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 70 61  using "PRAGMA pa
ab00: 67 65 5f 73 69 7a 65 22 20 69 73 20 67 72 65 61  ge_size" is grea
ab10: 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 23  ter than the.  #
ab20: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
ab30: 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 4d 41  lue of SQLITE_MA
ab40: 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 74 68 65  X_PAGE_SIZE, the
ab50: 6e 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  n the effective 
ab60: 0a 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72  .  # page-size r
ab70: 65 6d 61 69 6e 73 20 31 30 32 34 20 62 79 74 65  emains 1024 byte
ab80: 73 2e 0a 20 20 23 0a 20 20 73 65 74 20 65 66 66  s..  #.  set eff
ab90: 20 24 70 61 67 65 73 69 7a 65 0a 20 20 69 66 20   $pagesize.  if 
aba0: 7b 24 65 66 66 20 3e 20 24 3a 3a 53 51 4c 49 54  {$eff > $::SQLIT
abb0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 7d  E_MAX_PAGE_SIZE}
abc0: 20 7b 20 73 65 74 20 65 66 66 20 31 30 32 34 20   { set eff 1024 
abd0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
abe0: 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65  er1-12.$pagesize
abf0: 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .1 {.    sqlite3
ac00: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20   db2 test.db.   
ac10: 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20   execsql ".     
ac20: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
ac30: 65 20 3d 20 24 70 61 67 65 73 69 7a 65 3b 0a 20  e = $pagesize;. 
ac40: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
ac50: 20 76 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46   v AS SELECT * F
ac60: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
ac70: 72 3b 0a 20 20 20 20 22 20 64 62 32 0a 20 20 20  r;.    " db2.   
ac80: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
ac90: 64 62 0a 20 20 7d 20 24 65 66 66 0a 20 20 64 6f  db.  } $eff.  do
aca0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e  _test pager1-12.
acb0: 24 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20  $pagesize.2 {.  
acc0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
acd0: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
ace0: 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43  l { .      SELEC
acf0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
ad00: 76 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  v;.      PRAGMA 
ad10: 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a  main.page_size;.
ad20: 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c      } db2.  } [l
ad30: 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20 64 6f  ist 1 $eff].  do
ad40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e  _test pager1-12.
ad50: 24 70 61 67 65 73 69 7a 65 2e 33 20 7b 0a 20 20  $pagesize.3 {.  
ad60: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
ad70: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
ad80: 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20  *) FROM v;.     
ad90: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67   PRAGMA main.pag
ada0: 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  e_size;.    }.  
adb0: 7d 20 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a  } [list 1 $eff].
adc0: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 64 62    db2 close.}.db
add0: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
ade0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
adf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
ae30: 65 73 74 20 73 70 65 63 61 6c 20 22 50 52 41 47  est specal "PRAG
ae40: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
ae50: 50 45 52 53 49 53 54 22 20 74 65 73 74 20 63 61  PERSIST" test ca
ae60: 73 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  ses..#.# pager1-
ae70: 31 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73  13.1.*: This tes
ae80: 74 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  ts a special cas
ae90: 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  e encountered in
aea0: 20 70 65 72 73 69 73 74 65 6e 74 20 0a 23 20 20   persistent .#  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
aec0: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 49 66 20 74  urnal mode: If t
aed0: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63  he journal assoc
aee0: 69 61 74 65 64 20 77 69 74 68 20 61 20 74 72 61  iated with a tra
aef0: 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20  nsaction.#      
af00: 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
af10: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6a 6f  ller than the jo
af20: 75 72 6e 61 6c 20 66 69 6c 65 20 28 62 65 63 61  urnal file (beca
af30: 75 73 65 20 61 20 70 72 65 76 69 6f 75 73 20 0a  use a previous .
af40: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
af50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65 66   transaction lef
af60: 74 20 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e  t a very large n
af70: 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66  on-hot journal f
af80: 69 6c 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20  ile in the.#    
af90: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
afa0: 2d 73 79 73 74 65 6d 29 2c 20 74 68 65 6e 20 53  -system), then S
afb0: 51 4c 69 74 65 20 68 61 73 20 74 6f 20 62 65 20  QLite has to be 
afc0: 63 61 72 65 66 75 6c 20 74 68 61 74 20 74 68 65  careful that the
afd0: 72 65 20 69 73 0a 23 20 20 20 20 20 20 20 20 20  re is.#         
afe0: 20 20 20 20 20 20 20 6e 6f 74 20 61 20 6a 6f 75         not a jou
aff0: 72 6e 61 6c 2d 68 65 61 64 65 72 20 6c 65 66 74  rnal-header left
b000: 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 65   over from a pre
b010: 76 69 6f 75 73 20 74 72 61 6e 73 61 63 74 69 6f  vious transactio
b020: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
b030: 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66     immediately f
b040: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6a 6f 75  ollowing the jou
b050: 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6a 75 73  rnal content jus
b060: 74 20 77 72 69 74 74 65 6e 2e 0a 23 20 20 20 20  t written..#    
b070: 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 74              If t
b080: 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 65  here is, and the
b090: 20 70 72 6f 63 65 73 73 20 63 72 61 73 68 65 73   process crashes
b0a0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a 6f 75   so that the jou
b0b0: 72 6e 61 6c 0a 23 20 20 20 20 20 20 20 20 20 20  rnal.#          
b0c0: 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20 61 20        becomes a 
b0d0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
b0e0: 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
b0f0: 61 63 6b 20 62 79 20 61 6e 6f 74 68 65 72 0a 23  ack by another.#
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 70 72 6f 63 65 73 73 2c 20 74 68 65 72 65 20 69  process, there i
b120: 73 20 61 20 64 61 6e 67 65 72 20 74 68 61 74 20  s a danger that 
b130: 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  the other proces
b140: 73 20 6d 61 79 20 72 6f 6c 6c 0a 23 20 20 20 20  s may roll.#    
b150: 20 20 20 20 20 20 20 20 20 20 20 20 62 61 63 6b              back
b160: 20 74 68 65 20 61 62 6f 72 74 65 64 20 74 72 61   the aborted tra
b170: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63  nsaction, then c
b180: 6f 6e 74 69 6e 75 65 20 63 6f 70 79 69 6e 67 20  ontinue copying 
b190: 64 61 74 61 0a 23 20 20 20 20 20 20 20 20 20 20  data.#          
b1a0: 20 20 20 20 20 20 66 72 6f 6d 20 61 6e 20 6f 6c        from an ol
b1b0: 64 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  der transaction 
b1c0: 66 72 6f 6d 20 74 68 65 20 72 65 6d 61 69 6e 64  from the remaind
b1d0: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
b1e0: 6c 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  l..#            
b1f0: 20 20 20 20 53 65 65 20 74 68 65 20 73 79 6e 63      See the sync
b200: 4a 6f 75 72 6e 61 6c 28 29 20 66 75 6e 63 74 69  Journal() functi
b210: 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  on for details..
b220: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  #.# pager1-13.2.
b230: 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20  *: Same test as 
b240: 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 54 68  the previous. Th
b250: 69 73 20 74 69 6d 65 2c 20 74 68 72 6f 77 20 61  is time, throw a
b260: 6e 20 69 6e 64 65 78 20 69 6e 74 6f 0a 23 20 20  n index into.#  
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
b280: 65 20 6d 69 78 20 74 6f 20 6d 61 6b 65 20 74 68  e mix to make th
b290: 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
b2a0: 6b 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f  k more likely to
b2b0: 20 63 61 74 63 68 0a 23 20 20 20 20 20 20 20 20   catch.#        
b2c0: 20 20 20 20 20 20 20 20 65 72 72 6f 72 73 2e 0a          errors..
b2d0: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
b2e0: 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70  fault 1.tv scrip
b2f0: 74 20 78 53 79 6e 63 43 62 0a 74 76 20 66 69 6c  t xSyncCb.tv fil
b300: 74 65 72 20 78 53 79 6e 63 0a 70 72 6f 63 20 78  ter xSync.proc x
b310: 53 79 6e 63 43 62 20 7b 6d 65 74 68 6f 64 20 66  SyncCb {method f
b320: 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a  ilename args} {.
b330: 20 20 73 65 74 20 74 20 5b 66 69 6c 65 20 74 61    set t [file ta
b340: 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20  il $filename].  
b350: 69 66 20 7b 24 74 20 3d 3d 20 22 74 65 73 74 2e  if {$t == "test.
b360: 64 62 22 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61  db"} faultsim_sa
b370: 76 65 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ve.  return SQLI
b380: 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d  TE_OK.}.faultsim
b390: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
b3a0: 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72  en.db func a_str
b3b0: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 23 20  ing a_string..# 
b3c0: 54 68 65 20 55 50 44 41 54 45 20 73 74 61 74 65  The UPDATE state
b3d0: 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  ment at the end 
b3e0: 6f 66 20 74 68 69 73 20 74 65 73 74 20 63 61 73  of this test cas
b3f0: 65 20 63 72 65 61 74 65 73 20 61 20 72 65 61 6c  e creates a real
b400: 6c 79 20 62 69 67 0a 23 20 6a 6f 75 72 6e 61 6c  ly big.# journal
b410: 2e 20 53 69 6e 63 65 20 74 68 65 20 63 61 63 68  . Since the cach
b420: 65 2d 73 69 7a 65 20 69 73 20 6f 6e 6c 79 20 31  e-size is only 1
b430: 30 20 70 61 67 65 73 2c 20 74 68 65 20 6a 6f 75  0 pages, the jou
b440: 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 0a 23  rnal contains .#
b450: 20 66 72 65 71 75 65 6e 74 20 6a 6f 75 72 6e 61   frequent journa
b460: 6c 20 68 65 61 64 65 72 73 2e 0a 23 0a 64 6f 5f  l headers..#.do_
b470: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
b480: 65 72 31 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 50  er1-13.1.1 {.  P
b490: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
b4a0: 3d 20 31 30 32 34 3b 0a 20 20 50 52 41 47 4d 41  = 1024;.  PRAGMA
b4b0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
b4c0: 50 45 52 53 49 53 54 3b 0a 20 20 50 52 41 47 4d  PERSIST;.  PRAGM
b4d0: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
b4e0: 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  0;.  BEGIN;.    
b4f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
b500: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
b510: 59 20 4b 45 59 2c 20 62 20 42 4c 4f 42 29 3b 0a  Y KEY, b BLOB);.
b520: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b530: 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  t1 VALUES(NULL, 
b540: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 29 3b 0a  a_string(400));.
b550: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b560: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
b570: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
b580: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
b590: 2f 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 49 4e  /*   2 */.    IN
b5a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
b5b0: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
b5c0: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
b5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34            /*   4
b5e0: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
b5f0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
b600: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
b610: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
b620: 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20      /*   8 */.  
b630: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
b640: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
b650: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
b660: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
b670: 20 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45    16 */.    INSE
b680: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
b690: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
b6a0: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
b6b0: 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a          /*  32 *
b6c0: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
b6d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
b6e0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
b6f0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
b700: 20 20 2f 2a 20 20 36 34 20 2a 2f 0a 20 20 20 20    /*  64 */.    
b710: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
b720: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
b730: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
b740: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31  1;          /* 1
b750: 32 38 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a  28 */.  COMMIT;.
b760: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
b770: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30  b = a_string(400
b780: 29 3b 0a 7d 20 7b 70 65 72 73 69 73 74 7d 0a 0a  );.} {persist}..
b790: 23 20 52 75 6e 20 74 72 61 6e 73 61 63 74 69 6f  # Run transactio
b7a0: 6e 73 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67  ns of increasing
b7b0: 20 73 69 7a 65 73 2e 20 45 76 65 6e 74 75 61 6c   sizes. Eventual
b7c0: 6c 79 2c 20 6f 6e 65 20 28 6f 72 20 6d 6f 72 65  ly, one (or more
b7d0: 20 74 68 61 6e 20 6f 6e 65 29 0a 23 20 6f 66 20   than one).# of 
b7e0: 74 68 65 73 65 20 77 69 6c 6c 20 77 72 69 74 65  these will write
b7f0: 20 6a 75 73 74 20 65 6e 6f 75 67 68 20 63 6f 6e   just enough con
b800: 74 65 6e 74 20 74 68 61 74 20 6f 6e 65 20 6f 66  tent that one of
b810: 20 74 68 65 20 6f 6c 64 20 68 65 61 64 65 72 73   the old headers
b820: 20 63 72 65 61 74 65 64 20 0a 23 20 62 79 20 74   created .# by t
b830: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
b840: 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
b850: 65 20 6c 69 65 73 20 69 6d 6d 65 64 69 61 74 65  e lies immediate
b860: 6c 79 20 61 66 74 65 72 20 74 68 65 20 63 6f 6e  ly after the con
b870: 74 65 6e 74 0a 23 20 6a 6f 75 72 6e 61 6c 6c 65  tent.# journalle
b880: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
b890: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
b8a0: 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20  for {set nUp 1} 
b8b0: 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20  {$nUp<64} {incr 
b8c0: 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63  nUp} {.  do_exec
b8d0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b8e0: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 31 20 7b 20  13.1.2.$nUp.1 { 
b8f0: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
b900: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
b910: 33 39 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20  399) WHERE a <= 
b920: 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  $nUp.  } {}.  do
b930: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
b940: 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70  ger1-13.1.2.$nUp
b950: 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  .2 { PRAGMA inte
b960: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f  grity_check } {o
b970: 6b 7d 20 0a 0a 20 20 23 20 54 72 79 20 74 6f 20  k} ..  # Try to 
b980: 61 63 63 65 73 73 20 74 68 65 20 73 6e 61 70 73  access the snaps
b990: 68 6f 74 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  hot of the file-
b9a0: 73 79 73 74 65 6d 2e 0a 20 20 23 0a 20 20 73 71  system..  #.  sq
b9b0: 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74 65 73  lite3 db2 sv_tes
b9c0: 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 70  t.db.  do_test p
b9d0: 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55  ager1-13.1.2.$nU
b9e0: 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  p.3 {.    execsq
b9f0: 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 6c  l { SELECT sum(l
ba00: 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d 20 74  ength(b)) FROM t
ba10: 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78 70  1 } db2.  } [exp
ba20: 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28 24 6e  r {128*400 - ($n
ba30: 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65 73  Up-1)}].  do_tes
ba40: 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e  t pager1-13.1.2.
ba50: 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65 78 65  $nUp.4 {.    exe
ba60: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  csql { PRAGMA in
ba70: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
ba80: 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64  db2.  } {ok}.  d
ba90: 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a 23 20 53 61  b2 close.}..# Sa
baa0: 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65  me test as above
bab0: 2e 20 42 75 74 20 74 68 69 73 20 74 69 6d 65 20  . But this time 
bac0: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 6f 6e  with an index on
bad0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a 64 6f   the table..#.do
bae0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
baf0: 67 65 72 31 2d 31 33 2e 32 2e 31 20 7b 0a 20 20  ger1-13.2.1 {.  
bb00: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
bb10: 4f 4e 20 74 31 28 62 29 3b 0a 20 20 55 50 44 41  ON t1(b);.  UPDA
bb20: 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f  TE t1 SET b = a_
bb30: 73 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b  string(400);.} {
bb40: 7d 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31  }.for {set nUp 1
bb50: 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63  } {$nUp<64} {inc
bb60: 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78  r nUp} {.  do_ex
bb70: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
bb80: 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 31 20  1-13.2.2.$nUp.1 
bb90: 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 74 31  { .    UPDATE t1
bba0: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
bbb0: 67 28 33 39 39 29 20 57 48 45 52 45 20 61 20 3c  g(399) WHERE a <
bbc0: 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20  = $nUp.  } {}.  
bbd0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
bbe0: 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e  pager1-13.2.2.$n
bbf0: 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e  Up.2 { PRAGMA in
bc00: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
bc10: 7b 6f 6b 7d 20 0a 20 20 73 71 6c 69 74 65 33 20  {ok} .  sqlite3 
bc20: 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20  db2 sv_test.db. 
bc30: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
bc40: 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a  13.2.2.$nUp.3 {.
bc50: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
bc60: 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28  LECT sum(length(
bc70: 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  b)) FROM t1 } db
bc80: 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38  2.  } [expr {128
bc90: 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d  *400 - ($nUp-1)}
bca0: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
bcb0: 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 34  r1-13.2.2.$nUp.4
bcc0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
bcd0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
bce0: 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20  y_check } db2.  
bcf0: 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f  } {ok}.  db2 clo
bd00: 73 65 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74  se.}..db close.t
bd10: 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d  v delete..#-----
bd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd60: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63  ----.# Test spec
bd70: 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  al "PRAGMA journ
bd80: 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 20 74 65 73  al_mode=OFF" tes
bd90: 74 20 63 61 73 65 73 2e 0a 23 0a 66 61 75 6c 74  t cases..#.fault
bda0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
bdb0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
bdc0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e  _test pager1-14.
bdd0: 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a  1.1 {.  PRAGMA j
bde0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 4f 46  ournal_mode = OF
bdf0: 46 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  F;.  CREATE TABL
be00: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 42 45  E t1(a, b);.  BE
be10: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
be20: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
be30: 2c 20 32 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a  , 2);.  COMMIT;.
be40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
be50: 74 31 3b 0a 7d 20 7b 6f 66 66 20 31 20 32 7d 0a  t1;.} {off 1 2}.
be60: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
be70: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 32 20 7b   pager1-14.1.2 {
be80: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e  .  BEGIN;.    IN
be90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
bea0: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 52 4f 4c  UES(3, 4);.  ROL
beb0: 4c 42 41 43 4b 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a  LBACK;.} {0 {}}.
bec0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
bed0: 70 61 67 65 72 31 2d 31 34 2e 31 2e 33 20 7b 0a  pager1-14.1.3 {.
bee0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
bef0: 74 31 3b 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a  t1;.} {1 2 3 4}.
bf00: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
bf10: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 34 20 7b   pager1-14.1.4 {
bf20: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e  .  BEGIN;.    IN
bf30: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77  SERT INTO t1(row
bf40: 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54  id, a, b) SELECT
bf50: 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20   a+3, b, b FROM 
bf60: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
bf70: 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c  NTO t1(rowid, a,
bf80: 20 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20   b) SELECT a+3, 
bf90: 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  b, b FROM t1;.} 
bfa0: 7b 31 20 7b 50 52 49 4d 41 52 59 20 4b 45 59 20  {1 {PRIMARY KEY 
bfb0: 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 7d 7d  must be unique}}
bfc0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
bfd0: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 35 20 7b   pager1-14.1.5 {
bfe0: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c  .  COMMIT;.  SEL
bff0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d  ECT * FROM t1;.}
c000: 20 7b 31 20 32 20 33 20 34 20 32 20 32 20 34 20   {1 2 3 4 2 2 4 
c010: 34 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  4}..#-----------
c020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
c060: 20 54 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e   Test opening an
c070: 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61  d closing the pa
c080: 67 65 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77  ger sub-system w
c090: 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 76 61  ith different va
c0a0: 6c 75 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73  lues.# for the s
c0b0: 71 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46  qlite3_vfs.szOsF
c0c0: 69 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a  ile variable..#.
c0d0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
c0e0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78  and_reopen.do_ex
c0f0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
c100: 31 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54  1-15.0 {.  CREAT
c110: 45 20 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29  E TABLE tx(y, z)
c120: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
c130: 74 78 20 56 41 4c 55 45 53 28 27 41 79 75 74 74  tx VALUES('Ayutt
c140: 68 61 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27  haya', 'Beijing'
c150: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
c160: 20 74 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64   tx VALUES('Lond
c170: 6f 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d  on', 'Tokyo');.}
c180: 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72   {}.db close.for
c190: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35   {set i 0} {$i<5
c1a0: 31 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b  13} {incr i 3} {
c1b0: 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
c1c0: 65 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69  efault 1 -szosfi
c1d0: 6c 65 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20  le $i.  sqlite3 
c1e0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f  db test.db.  do_
c1f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c200: 65 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20  er1-15.$i.1 {.  
c210: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
c220: 74 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61  tx;.  } {Ayuttha
c230: 79 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f  ya Beijing Londo
c240: 6e 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c  n Tokyo}.  db cl
c250: 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a  ose.  tv delete.
c260: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
c270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
c2b0: 43 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73  Check that it is
c2c0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
c2d0: 20 6f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   open a database
c2e0: 20 66 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c   file if the ful
c2f0: 6c 20 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20  l path.# to the 
c300: 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e  associated journ
c310: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
c320: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69  longer than sqli
c330: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
c340: 6d 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  me..#.testvfs tv
c350: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
c360: 63 72 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76  cript xOpenCb.tv
c370: 20 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72   filter xOpen.pr
c380: 6f 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68  oc xOpenCb {meth
c390: 6f 64 20 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20  od filename} {. 
c3a0: 20 73 65 74 20 3a 3a 66 69 6c 65 5f 6c 65 6e 20   set ::file_len 
c3b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
c3c0: 66 69 6c 65 6e 61 6d 65 5d 0a 7d 0a 73 71 6c 69  filename].}.sqli
c3d0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64  te3 db test.db.d
c3e0: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
c3f0: 65 0a 0a 66 6f 72 20 7b 73 65 74 20 69 69 20 5b  e..for {set ii [
c400: 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e  expr $::file_len
c410: 2d 35 5d 7d 20 7b 24 69 69 20 3c 20 5b 65 78 70  -5]} {$ii < [exp
c420: 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 32 30  r $::file_len+20
c430: 5d 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20  ]} {incr ii} {. 
c440: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
c450: 61 75 6c 74 20 31 20 2d 6d 78 70 61 74 68 6e 61  ault 1 -mxpathna
c460: 6d 65 20 24 69 69 0a 0a 20 20 23 20 54 68 65 20  me $ii..  # The 
c470: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75  length of the fu
c480: 6c 6c 20 70 61 74 68 20 74 6f 20 66 69 6c 65 20  ll path to file 
c490: 22 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c  "test.db-journal
c4a0: 22 20 69 73 20 28 24 3a 3a 66 69 6c 65 5f 6c 65  " is ($::file_le
c4b0: 6e 2b 38 29 2e 0a 20 20 23 20 49 66 20 74 68 65  n+8)..  # If the
c4c0: 20 63 6f 6e 66 69 67 75 72 65 64 20 73 71 6c 69   configured sqli
c4d0: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
c4e0: 6d 65 20 76 61 6c 75 65 20 67 72 65 61 74 65 72  me value greater
c4f0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
c500: 6f 0a 20 20 23 20 74 68 69 73 2c 20 74 68 65 6e  o.  # this, then
c510: 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
c520: 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77 69   opened. Otherwi
c530: 73 65 2c 20 69 74 20 63 61 6e 6e 6f 74 2e 0a 20  se, it cannot.. 
c540: 20 23 0a 20 20 69 66 20 7b 24 69 69 20 3e 3d 20   #.  if {$ii >= 
c550: 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65  [expr $::file_le
c560: 6e 2b 38 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20  n+8]} {.    set 
c570: 72 65 73 20 7b 30 20 7b 7d 7d 0a 20 20 7d 20 65  res {0 {}}.  } e
c580: 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 72 65  lse {.    set re
c590: 73 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  s {1 {unable to 
c5a0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
c5b0: 6c 65 7d 7d 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74  le}}.  }..  do_t
c5c0: 65 73 74 20 70 61 67 65 72 31 2d 31 36 2e 31 2e  est pager1-16.1.
c5d0: 24 69 69 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b  $ii {.    list [
c5e0: 63 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33 20  catch { sqlite3 
c5f0: 64 62 20 74 65 73 74 2e 64 62 20 7d 20 6d 73 67  db test.db } msg
c600: 5d 20 24 6d 73 67 0a 20 20 7d 20 24 72 65 73 0a  ] $msg.  } $res.
c610: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
c620: 73 65 7d 0a 20 20 74 76 20 64 65 6c 65 74 65 0a  se}.  tv delete.
c630: 7d 0a 0a 23 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 2d  ----------------
c660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
c680: 54 65 73 74 20 22 50 52 41 47 4d 41 20 6f 6d 69  Test "PRAGMA omi
c690: 74 5f 72 65 61 64 6c 6f 63 6b 22 2e 20 0a 23 0a  t_readlock". .#.
c6a0: 23 20 20 20 70 61 67 65 72 31 2d 31 37 2e 24 74  #   pager1-17.$t
c6b0: 6e 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  n.1.*: Test that
c6c0: 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 6f 6e   if a second con
c6d0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 20 6f  nection has an o
c6e0: 70 65 6e 20 0a 23 20 20 20 20 20 20 20 20 20 20  pen .#          
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
c700: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74  -transaction, it
c710: 20 69 73 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20   is not usually 
c720: 70 6f 73 73 69 62 6c 65 20 74 6f 20 77 72 69 74  possible to writ
c730: 65 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  e .#            
c740: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64 61            the da
c750: 74 61 62 61 73 65 2e 0a 23 0a 23 20 20 20 70 61  tabase..#.#   pa
c760: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 2a 3a  ger1-17.$tn.2.*:
c770: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
c780: 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74  e second connect
c790: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77  ion was opened w
c7a0: 69 74 68 0a 23 20 20 20 20 20 20 20 20 20 20 20  ith.#           
c7b0: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 53             the S
c7c0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
c7d0: 4e 4c 59 20 66 6c 61 67 2c 20 61 6e 64 20 0a 23  NLY flag, and .#
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 6f 6d        "PRAGMA om
c800: 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 22  it_readlock = 1"
c810: 20 69 73 20 65 78 65 63 75 74 65 64 20 62 65 66   is executed bef
c820: 6f 72 65 20 61 74 74 61 63 68 69 6e 67 0a 23 20  ore attaching.# 
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
c850: 65 20 61 6e 64 20 6f 70 65 6e 69 6e 67 20 61 20  e and opening a 
c860: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
c870: 20 6f 6e 20 69 74 2c 20 69 74 20 69 73 0a 23 20   on it, it is.# 
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 20 20 70 6f 73 73 69 62 6c 65 20 74 6f       possible to
c8a0: 20 77 72 69 74 65 20 74 68 65 20 64 62 2e 0a 23   write the db..#
c8b0: 0a 23 20 20 20 70 61 67 65 72 31 2d 31 37 2e 24  .#   pager1-17.$
c8c0: 74 6e 2e 33 2e 2a 3a 20 54 65 73 74 20 74 68 61  tn.3.*: Test tha
c8d0: 74 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t if the second 
c8e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 2a  connection was *
c8f0: 6e 6f 74 2a 20 6f 70 65 6e 65 64 20 77 69 74 68  not* opened with
c900: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
c910: 20 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 49          the SQLI
c920: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
c930: 20 66 6c 61 67 2c 20 65 78 65 63 75 74 69 6e 67   flag, executing
c940: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
c950: 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41           "PRAGMA
c960: 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d   omit_readlock =
c970: 20 31 22 20 68 61 73 20 6e 6f 20 65 66 66 65 63   1" has no effec
c980: 74 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69  t..#.do_multicli
c990: 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20  ent_test tn {.  
c9a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
c9b0: 37 2e 24 74 6e 2e 31 2e 31 20 7b 0a 20 20 20 20  7.$tn.1.1 {.    
c9c0: 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 43 52  sql1 { .      CR
c9d0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
c9e0: 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
c9f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
ca00: 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20  (1, 2);.    }.  
ca10: 20 20 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 42    sql2 {.      B
ca20: 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45  EGIN;.      SELE
ca30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
ca40: 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20    }.  } {1 2}.  
ca50: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
ca60: 37 2e 24 74 6e 2e 31 2e 32 20 7b 0a 20 20 20 20  7.$tn.1.2 {.    
ca70: 63 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49  csql1 { INSERT I
ca80: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
ca90: 20 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61   4) }.  } {1 {da
caa0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
cab0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }}.  do_test pag
cac0: 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 33 20 7b  er1-17.$tn.1.3 {
cad0: 0a 20 20 20 20 73 71 6c 32 20 7b 20 43 4f 4d 4d  .    sql2 { COMM
cae0: 49 54 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 20  IT }.    sql1 { 
caf0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
cb00: 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20 20  ALUES(3, 4) }.  
cb10: 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  } {}..  do_test 
cb20: 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e  pager1-17.$tn.2.
cb30: 31 20 7b 0a 20 20 20 20 63 6f 64 65 32 20 7b 0a  1 {.    code2 {.
cb40: 20 20 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a        db2 close.
cb50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
cb60: 32 20 3a 6d 65 6d 6f 72 79 3a 20 2d 72 65 61 64  2 :memory: -read
cb70: 6f 6e 6c 79 20 31 0a 20 20 20 20 7d 0a 20 20 20  only 1.    }.   
cb80: 20 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 50   sql2 { .      P
cb90: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
cba0: 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 41  ock = 1;.      A
cbb0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 27 20  TTACH 'test.db' 
cbc0: 41 53 20 74 77 6f 3b 0a 20 20 20 20 20 20 42 45  AS two;.      BE
cbd0: 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  GIN;.      SELEC
cbe0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
cbf0: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d   }.  } {1 2 3 4}
cc00: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
cc10: 31 2d 31 37 2e 24 74 6e 2e 32 2e 32 20 7b 20 73  1-17.$tn.2.2 { s
cc20: 71 6c 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ql1 "INSERT INTO
cc30: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29   t1 VALUES(5, 6)
cc40: 22 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  " } {}.  do_test
cc50: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32   pager1-17.$tn.2
cc60: 2e 33 20 7b 20 73 71 6c 32 20 22 53 45 4c 45 43  .3 { sql2 "SELEC
cc70: 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 7d 20 20  T * FROM t1" }  
cc80: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33            {1 2 3
cc90: 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   4}.  do_test pa
cca0: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 34 20  ger1-17.$tn.2.4 
ccb0: 7b 20 73 71 6c 32 20 22 43 4f 4d 4d 49 54 20 3b  { sql2 "COMMIT ;
ccc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
ccd0: 31 22 20 7d 20 20 20 7b 31 20 32 20 33 20 34 20  1" }   {1 2 3 4 
cce0: 35 20 36 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  5 6}..  do_test 
ccf0: 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e  pager1-17.$tn.3.
cd00: 31 20 7b 0a 20 20 20 20 63 6f 64 65 32 20 7b 0a  1 {.    code2 {.
cd10: 20 20 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a        db2 close.
cd20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
cd30: 32 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 20 20 7d  2 :memory:.    }
cd40: 0a 20 20 20 20 73 71 6c 32 20 7b 20 0a 20 20 20  .    sql2 { .   
cd50: 20 20 20 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72     PRAGMA omit_r
cd60: 65 61 64 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  eadlock = 1;.   
cd70: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
cd80: 64 62 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20  db' AS two;.    
cd90: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
cda0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
cdb0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20  .    }.  } {1 2 
cdc0: 33 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65  3 4 5 6}.  do_te
cdd0: 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e  st pager1-17.$tn
cde0: 2e 33 2e 32 20 7b 0a 20 20 63 73 71 6c 31 20 7b  .3.2 {.  csql1 {
cdf0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ce00: 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20  VALUES(3, 4) }. 
ce10: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
ce20: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
ce30: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
ce40: 24 74 6e 2e 33 2e 33 20 7b 20 73 71 6c 32 20 43  $tn.3.3 { sql2 C
ce50: 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d  OMMIT } {}.}..#-
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
ceb0: 74 68 65 20 70 61 67 65 72 73 20 72 65 73 70 6f  the pagers respo
cec0: 6e 73 65 20 74 6f 20 74 68 65 20 62 2d 74 72 65  nse to the b-tre
ced0: 65 20 6c 61 79 65 72 20 72 65 71 75 65 73 74 69  e layer requesti
cee0: 6e 67 20 69 6c 6c 65 67 61 6c 20 70 61 67 65 20  ng illegal page 
cef0: 0a 23 20 6e 75 6d 62 65 72 73 3a 0a 23 0a 23 20  .# numbers:.#.# 
cf00: 20 20 2b 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20    + The locking 
cf10: 70 61 67 65 2c 0a 23 20 20 20 2b 20 50 61 67 65  page,.#   + Page
cf20: 20 30 2c 0a 23 20 20 20 2b 20 41 20 70 61 67 65   0,.#   + A page
cf30: 20 77 69 74 68 20 61 20 70 61 67 65 20 6e 75 6d   with a page num
cf40: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
cf50: 20 28 32 5e 33 31 2d 31 29 2e 0a 23 0a 64 6f 5f   (2^31-1)..#.do_
cf60: 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 31  test pager1-18.1
cf70: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
cf80: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
cf90: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
cfa0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
cfb0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
cfc0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
cfd0: 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
cfe0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
cff0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d000: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
d010: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
d020: 6e 67 28 32 30 30 29 29 3b 0a 20 20 20 20 49 4e  ng(200));.    IN
d030: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d040: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d050: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d060: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d070: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d080: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d090: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d0a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d0b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d0c0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d0d0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d0e0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d0f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d100: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d110: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d120: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d130: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d140: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d150: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d160: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d170: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d180: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d190: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d1a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d1b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d1c0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d1d0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d1e0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
d1f0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
d200: 31 2d 31 38 2e 32 20 7b 0a 20 20 73 65 74 20 72  1-18.2 {.  set r
d210: 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c  oot [db one "SEL
d220: 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
d230: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
d240: 5d 0a 20 20 73 65 74 20 6c 6f 63 6b 69 6e 67 70  ].  set lockingp
d250: 61 67 65 20 5b 65 78 70 72 20 28 30 78 31 30 30  age [expr (0x100
d260: 30 30 2f 31 30 32 34 29 20 2b 20 31 5d 0a 20 20  00/1024) + 1].  
d270: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
d280: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
d290: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50  hema = 1;.    UP
d2a0: 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  DATE sqlite_mast
d2b0: 65 72 20 53 45 54 20 72 6f 6f 74 70 61 67 65 20  er SET rootpage 
d2c0: 3d 20 24 6c 6f 63 6b 69 6e 67 70 61 67 65 3b 0a  = $lockingpage;.
d2d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
d2e0: 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  2 test.db.  catc
d2f0: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  hsql { SELECT co
d300: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d  unt(*) FROM t1 }
d310: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
d320: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d330: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
d340: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
d350: 70 61 67 65 72 31 2d 31 38 2e 33 20 7b 0a 20 20  pager1-18.3 {.  
d360: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
d370: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29  EATE TABLE t2(x)
d380: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d390: 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73 74  O t2 VALUES(a_st
d3a0: 72 69 6e 67 28 35 30 30 30 29 29 3b 0a 20 20 7d  ring(5000));.  }
d3b0: 0a 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78 70  .  set pgno [exp
d3c0: 72 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  r ([file size te
d3d0: 73 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d 32  st.db] / 1024)-2
d3e0: 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ].  hexio_write 
d3f0: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
d400: 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30  pgno-1)*1024] 00
d410: 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  000000.  sqlite3
d420: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63   db2 test.db.  c
d430: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
d440: 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20   length(x) FROM 
d450: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t2 } db2.} {1 {d
d460: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d470: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d480: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
d490: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 34 20  est pager1-18.4 
d4a0: 7b 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  {.  hexio_write 
d4b0: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
d4c0: 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 39 30  pgno-1)*1024] 90
d4d0: 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  000000.  sqlite3
d4e0: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63   db2 test.db.  c
d4f0: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
d500: 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20   length(x) FROM 
d510: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t2 } db2.} {1 {d
d520: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d530: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d540: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
d550: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 35 20  est pager1-18.5 
d560: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22  {.  sqlite3 db "
d570: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
d580: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
d590: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
d5a0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
d5b0: 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  b);.    PRAGMA w
d5c0: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
d5d0: 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73   1;.    UPDATE s
d5e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54  qlite_master SET
d5f0: 20 72 6f 6f 74 70 61 67 65 3d 35 20 57 48 45 52   rootpage=5 WHER
d600: 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74 31  E tbl_name = 't1
d610: 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72  ';.    PRAGMA wr
d620: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
d630: 30 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42  0;.    ALTER TAB
d640: 4c 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20  LE t1 RENAME TO 
d650: 78 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73  x1;.  }.  catchs
d660: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
d670: 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31 20 7b 64 61  OM x1 }.} {1 {da
d680: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
d690: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
d6a0: 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65  .db close..do_te
d6b0: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 36 20 7b  st pager1-18.6 {
d6c0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
d6d0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
d6e0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
d6f0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
d700: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
d710: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
d720: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
d730: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49  BLE t1(x);.    I
d740: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
d750: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30  LUES(a_string(80
d760: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
d770: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
d780: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
d790: 20 7d 0a 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b   }..  set root [
d7a0: 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72  db one "SELECT r
d7b0: 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c  ootpage FROM sql
d7c0: 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 64  ite_master"].  d
d7d0: 62 20 63 6c 6f 73 65 0a 0a 20 20 68 65 78 69 6f  b close..  hexio
d7e0: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b  _write test.db [
d7f0: 65 78 70 72 20 28 24 72 6f 6f 74 2d 31 29 2a 31  expr ($root-1)*1
d800: 30 32 34 20 2b 20 38 5d 20 30 30 30 30 30 30 30  024 + 8] 0000000
d810: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  0.  sqlite3 db t
d820: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
d830: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
d840: 68 28 78 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  h(x) FROM t1 }.}
d850: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
d860: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
d870: 6f 72 6d 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74  ormed}}..do_test
d880: 20 70 61 67 65 72 31 2d 31 39 2e 31 20 7b 0a 20   pager1-19.1 {. 
d890: 20 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20   sqlite3 db "". 
d8a0: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
d8b0: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
d8c0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
d8d0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31  A page_size = 51
d8e0: 32 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75  2;.    PRAGMA au
d8f0: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20  to_vacuum = 1;. 
d900: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d910: 74 31 28 61 61 2c 20 61 62 2c 20 61 63 2c 20 61  t1(aa, ab, ac, a
d920: 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c 20 61  d, ae, af, ag, a
d930: 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61  h, ai, aj, ak, a
d940: 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20  l, am, an,.     
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
d960: 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c 20 62  a, bb, bc, bd, b
d970: 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c 20 62  e, bf, bg, bh, b
d980: 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62  i, bj, bk, bl, b
d990: 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, bn,.         
d9a0: 20 20 20 20 20 20 20 20 20 20 20 63 61 2c 20 63             ca, c
d9b0: 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c 20 63  b, cc, cd, ce, c
d9c0: 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c 20 63  f, cg, ch, ci, c
d9d0: 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63  j, ck, cl, cm, c
d9e0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d9f0: 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c 20 64         da, db, d
da00: 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c 20 64  c, dd, de, df, d
da10: 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64  g, dh, di, dj, d
da20: 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20  k, dl, dm, dn,. 
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c 20 65     ea, eb, ec, e
da50: 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c 20 65  d, ee, ef, eg, e
da60: 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65  h, ei, ej, ek, e
da70: 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20  l, em, en,.     
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
da90: 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c 20 66  a, fb, fc, fd, f
daa0: 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c 20 66  e, ff, fg, fh, f
dab0: 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66  i, fj, fk, fl, f
dac0: 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, fn,.         
dad0: 20 20 20 20 20 20 20 20 20 20 20 67 61 2c 20 67             ga, g
dae0: 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c 20 67  b, gc, gd, ge, g
daf0: 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c 20 67  f, gg, gh, gi, g
db00: 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67  j, gk, gl, gm, g
db10: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
db20: 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c 20 68         ha, hb, h
db30: 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c 20 68  c, hd, he, hf, h
db40: 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68  g, hh, hi, hj, h
db50: 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20  k, hl, hm, hn,. 
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c 20 69     ia, ib, ic, i
db80: 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c 20 69  d, ie, if, ig, i
db90: 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69  h, ii, ij, ik, i
dba0: 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20  l, im, ix,.     
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
dbc0: 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a  a, jb, jc, jd, j
dbd0: 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a  e, jf, jg, jh, j
dbe0: 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a  i, jj, jk, jl, j
dbf0: 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, jn,.         
dc00: 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c 20 6b             ka, k
dc10: 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b  b, kc, kd, ke, k
dc20: 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b  f, kg, kh, ki, k
dc30: 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b  j, kk, kl, km, k
dc40: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dc50: 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c         la, lb, l
dc60: 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c  c, ld, le, lf, l
dc70: 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c  g, lh, li, lj, l
dc80: 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20  k, ll, lm, ln,. 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d     ma, mb, mc, m
dcb0: 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d  d, me, mf, mg, m
dcc0: 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d  h, mi, mj, mk, m
dcd0: 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b  l, mm, mn.    );
dce0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
dcf0: 45 20 74 32 28 61 61 2c 20 61 62 2c 20 61 63 2c  E t2(aa, ab, ac,
dd00: 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c   ad, ae, af, ag,
dd10: 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c   ah, ai, aj, ak,
dd20: 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20   al, am, an,.   
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c   ba, bb, bc, bd,
dd50: 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c   be, bf, bg, bh,
dd60: 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c   bi, bj, bk, bl,
dd70: 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20   bm, bn,.       
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 2c               ca,
dd90: 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c   cb, cc, cd, ce,
dda0: 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c   cf, cg, ch, ci,
ddb0: 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c   cj, ck, cl, cm,
ddc0: 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   cn,.           
ddd0: 20 20 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c           da, db,
dde0: 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c   dc, dd, de, df,
ddf0: 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c   dg, dh, di, dj,
de00: 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c   dk, dl, dm, dn,
de10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de20: 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c       ea, eb, ec,
de30: 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c   ed, ee, ef, eg,
de40: 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c   eh, ei, ej, ek,
de50: 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20   el, em, en,.   
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c   fa, fb, fc, fd,
de80: 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c   fe, ff, fg, fh,
de90: 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c   fi, fj, fk, fl,
dea0: 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20   fm, fn,.       
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 61 2c               ga,
dec0: 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c   gb, gc, gd, ge,
ded0: 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c   gf, gg, gh, gi,
dee0: 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c   gj, gk, gl, gm,
def0: 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   gn,.           
df00: 20 20 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c           ha, hb,
df10: 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c   hc, hd, he, hf,
df20: 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c   hg, hh, hi, hj,
df30: 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c   hk, hl, hm, hn,
df40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df50: 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c       ia, ib, ic,
df60: 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c   id, ie, if, ig,
df70: 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c   ih, ii, ij, ik,
df80: 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20   il, im, ix,.   
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c   ja, jb, jc, jd,
dfb0: 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c   je, jf, jg, jh,
dfc0: 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c   ji, jj, jk, jl,
dfd0: 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20   jm, jn,.       
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c               ka,
dff0: 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c   kb, kc, kd, ke,
e000: 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c   kf, kg, kh, ki,
e010: 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c   kj, kk, kl, km,
e020: 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   kn,.           
e030: 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c           la, lb,
e040: 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c   lc, ld, le, lf,
e050: 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c   lg, lh, li, lj,
e060: 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c   lk, ll, lm, ln,
e070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e080: 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c       ma, mb, mc,
e090: 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c   md, me, mf, mg,
e0a0: 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c   mh, mi, mj, mk,
e0b0: 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20   ml, mm, mn.    
e0c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
e0d0: 54 4f 20 74 31 28 61 61 29 20 56 41 4c 55 45 53  TO t1(aa) VALUES
e0e0: 28 20 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30  ( a_string(10000
e0f0: 30 29 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  0) );.    INSERT
e100: 20 49 4e 54 4f 20 74 32 28 61 61 29 20 56 41 4c   INTO t2(aa) VAL
e110: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30  UES( a_string(10
e120: 30 30 30 30 29 20 29 3b 0a 20 20 20 20 56 41 43  0000) );.    VAC
e130: 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23  UUM;.  }.} {}..#
e140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
e190: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 73 70 65   a couple of spe
e1a0: 63 69 61 6c 20 63 61 73 65 73 20 74 68 61 74 20  cial cases that 
e1b0: 63 6f 6d 65 20 75 70 20 77 68 69 6c 65 20 63 6f  come up while co
e1c0: 6d 6d 69 74 74 69 6e 67 20 0a 23 20 74 72 61 6e  mmitting .# tran
e1d0: 73 61 63 74 69 6f 6e 73 3a 0a 23 0a 23 20 20 20  sactions:.#.#   
e1e0: 70 61 67 65 72 31 2d 32 30 2e 31 2e 2a 3a 20 43  pager1-20.1.*: C
e1f0: 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 20 69 6e 2d  ommitting an in-
e200: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
e210: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68 65 6e  transaction when
e220: 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20 20   the .#         
e230: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
e240: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  e has not been m
e250: 6f 64 69 66 69 65 64 20 61 74 20 61 6c 6c 2e 0a  odified at all..
e260: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e  #.#   pager1-20.
e270: 32 2e 2a 3a 20 41 73 20 61 62 6f 76 65 2c 20 62  2.*: As above, b
e280: 75 74 20 77 69 74 68 20 61 20 6e 6f 72 6d 61 6c  ut with a normal
e290: 20 64 62 20 69 6e 20 65 78 63 6c 75 73 69 76 65   db in exclusive
e2a0: 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 23  -locking mode..#
e2b0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e 33  .#   pager1-20.3
e2c0: 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61  .*: Committing a
e2d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
e2e0: 57 41 4c 20 6d 6f 64 65 20 77 68 65 72 65 20 74  WAL mode where t
e2f0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 0a  he database has.
e300: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
e310: 20 20 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64     been modified
e320: 2c 20 62 75 74 20 61 6c 6c 20 64 69 72 74 79 20  , but all dirty 
e330: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
e340: 66 6c 75 73 68 65 64 20 74 6f 20 0a 23 20 20 20  flushed to .#   
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
e360: 69 73 6b 20 62 65 66 6f 72 65 20 74 68 65 20 63  isk before the c
e370: 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74 65 73 74  ommit..#.do_test
e380: 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 31 20 7b   pager1-20.1.1 {
e390: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
e3a0: 73 65 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62  se}.  sqlite3 db
e3b0: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78 65 63   :memory:.  exec
e3c0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
e3d0: 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20   TABLE one(two, 
e3e0: 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53 45  three);.    INSE
e3f0: 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55  RT INTO one VALU
e400: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
e410: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
e420: 61 67 65 72 31 2d 32 30 2e 31 2e 32 20 7b 0a 20  ager1-20.1.2 {. 
e430: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
e440: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a  EGIN EXCLUSIVE;.
e450: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
e460: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
e470: 67 65 72 31 2d 32 30 2e 32 2e 31 20 7b 0a 20 20  ger1-20.2.1 {.  
e480: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
e490: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
e4a0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
e4b0: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
e4c0: 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20   exclusive;.    
e4d0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
e4e0: 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20  ode = persist;. 
e4f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e500: 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29 3b  one(two, three);
e510: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
e520: 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27 2c   one VALUES('a',
e530: 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 65 78   'b');.  }.} {ex
e540: 63 6c 75 73 69 76 65 20 70 65 72 73 69 73 74 7d  clusive persist}
e550: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
e560: 32 30 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  20.2.2 {.  execs
e570: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45  ql {.    BEGIN E
e580: 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f  XCLUSIVE;.    CO
e590: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  MMIT;.  }.} {}..
e5a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
e5b0: 30 2e 33 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  0.3.1 {.  faults
e5c0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
e5d0: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
e5e0: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
e5f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
e600: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
e610: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41  ze = 10;.    PRA
e620: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
e630: 20 3d 20 77 61 6c 3b 0a 20 20 20 20 42 45 47 49   = wal;.    BEGI
e640: 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  N;.      CREATE 
e650: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
e660: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e670: 74 32 28 79 29 3b 0a 20 20 20 20 20 20 49 4e 53  t2(y);.      INS
e680: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
e690: 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29  ES(a_string(800)
e6a0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
e6b0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
e6c0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
e6d0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  M t1;         /*
e6e0: 20 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e     2 */.      IN
e6f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
e700: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
e710: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
e720: 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20     /*   4 */.   
e730: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e740: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
e750: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
e760: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38 20 2a          /*   8 *
e770: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
e780: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
e790: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
e7a0: 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   t1;         /* 
e7b0: 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53   16 */.      INS
e7c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
e7d0: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
e7e0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
e7f0: 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20    /*  32 */.    
e800: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 77  COMMIT;.  }.} {w
e810: 61 6c 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  al}.do_test page
e820: 72 31 2d 32 30 2e 33 2e 32 20 7b 0a 20 20 65 78  r1-20.3.2 {.  ex
e830: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
e840: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
e850: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 78 78  TO t2 VALUES('xx
e860: 78 78 27 29 3b 0a 20 20 7d 0a 20 20 72 65 63 75  xx');.  }.  recu
e870: 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20  rsive_select 32 
e880: 74 31 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d  t1.  execsql COM
e890: 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  MIT.} {}..#-----
e8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e8e0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
e8f0: 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 20   a WAL database 
e900: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 65  may not be opene
e910: 64 20 69 66 3a 0a 23 0a 23 20 20 20 70 61 67 65  d if:.#.#   page
e920: 72 31 2d 32 31 2e 31 2e 2a 3a 20 54 68 65 20 56  r1-21.1.*: The V
e930: 46 53 20 68 61 73 20 61 6e 20 69 56 65 72 73 69  FS has an iVersi
e940: 6f 6e 20 6c 65 73 73 20 74 68 61 6e 20 32 2c 20  on less than 2, 
e950: 6f 72 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31  or.#   pager1-21
e960: 2e 32 2e 2a 3a 20 54 68 65 20 56 46 53 20 64 6f  .2.*: The VFS do
e970: 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 78  es not provide x
e980: 53 68 6d 58 58 58 28 29 20 6d 65 74 68 6f 64 73  ShmXXX() methods
e990: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
e9a0: 72 31 2d 32 31 2e 30 20 7b 0a 20 20 66 61 75 6c  r1-21.0 {.  faul
e9b0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
e9c0: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
e9d0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
e9e0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
e9f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
ea00: 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54 20  LE ko(c DEFAULT 
ea10: 27 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c 54  'abc', b DEFAULT
ea20: 20 27 64 65 66 27 29 3b 0a 20 20 20 20 49 4e 53   'def');.    INS
ea30: 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41  ERT INTO ko DEFA
ea40: 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 7d 0a  ULT VALUES;.  }.
ea50: 7d 20 7b 77 61 6c 7d 0a 64 6f 5f 74 65 73 74 20  } {wal}.do_test 
ea60: 70 61 67 65 72 31 2d 32 31 2e 31 20 7b 0a 20 20  pager1-21.1 {.  
ea70: 74 65 73 74 76 66 73 20 74 76 20 2d 6e 6f 73 68  testvfs tv -nosh
ea80: 6d 20 31 0a 20 20 73 71 6c 69 74 65 33 20 64 62  m 1.  sqlite3 db
ea90: 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74  2 test.db -vfs t
eaa0: 76 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  v.  catchsql { S
eab0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20  ELECT * FROM ko 
eac0: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 75 6e 61 62  } db2.} {1 {unab
ead0: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
eae0: 61 73 65 20 66 69 6c 65 7d 7d 0a 64 62 32 20 63  ase file}}.db2 c
eaf0: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 64  lose.tv delete.d
eb00: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 31  o_test pager1-21
eb10: 2e 32 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74  .2 {.  testvfs t
eb20: 76 20 2d 69 76 65 72 73 69 6f 6e 20 31 0a 20 20  v -iversion 1.  
eb30: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
eb40: 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20 63 61  .db -vfs tv.  ca
eb50: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
eb60: 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a  * FROM ko } db2.
eb70: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  } {1 {unable to 
eb80: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
eb90: 6c 65 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 74  le}}.db2 close.t
eba0: 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d  v delete..#-----
ebb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebf0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
ec00: 20 61 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63   a "PRAGMA wal_c
ec10: 68 65 63 6b 70 6f 69 6e 74 22 3a 0a 23 0a 23 20  heckpoint":.#.# 
ec20: 20 20 70 61 67 65 72 31 2d 32 32 2e 31 2e 2a 3a    pager1-22.1.*:
ec30: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61   is a no-op on a
ec40: 20 6e 6f 6e 2d 57 41 4c 20 64 62 2c 20 61 6e 64   non-WAL db, and
ec50: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32 2e 32  .#   pager1-22.2
ec60: 2e 2a 3a 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  .*: does not cau
ec70: 73 65 20 78 53 79 6e 63 20 63 61 6c 6c 73 20 77  se xSync calls w
ec80: 69 74 68 20 61 20 73 79 6e 63 68 72 6f 6e 6f 75  ith a synchronou
ec90: 73 3d 6f 66 66 20 64 62 2e 0a 23 0a 64 6f 5f 74  s=off db..#.do_t
eca0: 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e 31 2e  est pager1-22.1.
ecb0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
ecc0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
ecd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
ece0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f   CREATE TABLE ko
ecf0: 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27  (c DEFAULT 'abc'
ed00: 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66  , b DEFAULT 'def
ed10: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
ed20: 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56  NTO ko DEFAULT V
ed30: 41 4c 55 45 53 3b 0a 20 20 7d 0a 20 20 65 78 65  ALUES;.  }.  exe
ed40: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
ed50: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 7d  l_checkpoint }.}
ed60: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65   {}.do_test page
ed70: 72 31 2d 32 32 2e 32 2e 31 20 7b 0a 20 20 74 65  r1-22.2.1 {.  te
ed80: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
ed90: 74 20 31 0a 20 20 74 76 20 66 69 6c 74 65 72 20  t 1.  tv filter 
eda0: 78 53 79 6e 63 0a 20 20 74 76 20 73 63 72 69 70  xSync.  tv scrip
edb0: 74 20 78 53 79 6e 63 43 62 0a 20 20 70 72 6f 63  t xSyncCb.  proc
edc0: 20 78 53 79 6e 63 43 62 20 7b 61 72 67 73 7d 20   xSyncCb {args} 
edd0: 7b 69 6e 63 72 20 3a 3a 73 79 6e 63 63 6f 75 6e  {incr ::synccoun
ede0: 74 7d 0a 20 20 73 65 74 20 3a 3a 73 79 6e 63 63  t}.  set ::syncc
edf0: 6f 75 6e 74 20 30 0a 20 20 73 71 6c 69 74 65 33  ount 0.  sqlite3
ee00: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
ee10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
ee20: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
ee30: 20 6f 66 66 3b 0a 20 20 20 20 50 52 41 47 4d 41   off;.    PRAGMA
ee40: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
ee50: 57 41 4c 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  WAL;.    INSERT 
ee60: 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20  INTO ko DEFAULT 
ee70: 56 41 4c 55 45 53 3b 0a 20 20 7d 0a 20 20 65 78  VALUES;.  }.  ex
ee80: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
ee90: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
eea0: 20 20 73 65 74 20 73 79 6e 63 63 6f 75 6e 74 0a    set synccount.
eeb0: 7d 20 7b 30 7d 0a 64 62 20 63 6c 6f 73 65 0a 74  } {0}.db close.t
eec0: 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d  v delete..#-----
eed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef10: 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66 6f 72  ----.# Tests for
ef20: 20 63 68 61 6e 67 69 6e 67 20 6a 6f 75 72 6e 61   changing journa
ef30: 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61  l mode..#.#   pa
ef40: 67 65 72 31 2d 32 33 2e 31 2e 2a 3a 20 54 65 73  ger1-23.1.*: Tes
ef50: 74 20 74 68 61 74 20 77 68 65 6e 20 63 68 61 6e  t that when chan
ef60: 67 69 6e 67 20 66 72 6f 6d 20 50 45 52 53 49 53  ging from PERSIS
ef70: 54 20 74 6f 20 44 45 4c 45 54 45 20 6d 6f 64 65  T to DELETE mode
ef80: 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.#             
ef90: 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
efa0: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
efb0: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
efc0: 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74  3.2.*: Same test
efd0: 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77   as above, but w
efe0: 68 69 6c 65 20 61 20 73 68 61 72 65 64 20 6c 6f  hile a shared lo
eff0: 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20 20 20  ck is held.#    
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e                on
f010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f020: 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  le..#.#   pager1
f030: 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d 65 20 74 65  -23.3.*: Same te
f040: 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74  st as above, but
f050: 20 77 68 69 6c 65 20 61 20 72 65 73 65 72 76 65   while a reserve
f060: 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23  d lock is held.#
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f080: 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73    on the databas
f090: 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61  e file..#.#   pa
f0a0: 67 65 72 31 2d 32 33 2e 34 2e 2a 3a 20 41 6e 64  ger1-23.4.*: And
f0b0: 2c 20 66 6f 72 20 66 75 6e 2c 20 77 68 69 6c 65  , for fun, while
f0c0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
f0d0: 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 23 0a 23 20  usive lock..#.# 
f0e0: 20 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 2a 3a    pager1-23.5.*:
f0f0: 20 54 72 79 20 74 6f 20 73 65 74 20 76 61 72 69   Try to set vari
f100: 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20 6a 6f  ous different jo
f110: 75 72 6e 61 6c 20 6d 6f 64 65 73 20 77 69 74 68  urnal modes with
f120: 20 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20   an.#           
f130: 20 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79         in-memory
f140: 20 64 61 74 61 62 61 73 65 20 28 6f 6e 6c 79 20   database (only 
f150: 4d 45 4d 4f 52 59 20 61 6e 64 20 4f 46 46 20 73  MEMORY and OFF s
f160: 68 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a 23 0a 23  hould work)..#.#
f170: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 2a     pager1-23.6.*
f180: 3a 20 54 72 79 20 74 6f 20 73 65 74 20 6c 6f 63  : Try to set loc
f190: 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c  king_mode=normal
f1a0: 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   on an in-memory
f1b0: 20 64 61 74 61 62 61 73 65 0a 23 20 20 20 20 20   database.#     
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64 6f               (do
f1d0: 65 73 6e 27 74 20 77 6f 72 6b 20 2d 20 69 6e 2d  esn't work - in-
f1e0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
f1f0: 20 61 6c 77 61 79 73 20 75 73 65 0a 23 20 20 20   always use.#   
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
f210: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
f220: 75 73 69 76 65 29 2e 0a 23 0a 64 6f 5f 74 65 73  usive)..#.do_tes
f230: 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 31 20  t pager1-23.1.1 
f240: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
f250: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
f260: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
f270: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f280: 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
f290: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
f2a0: 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 66  1(a, b);.  }.  f
f2b0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
f2c0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d  db-journal.} {1}
f2d0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f2e0: 32 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  23.1.2 {.  execs
f2f0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
f300: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
f310: 45 20 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74  E }.  file exist
f320: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f330: 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74  l.} {0}..do_test
f340: 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 31 20 7b   pager1-23.2.1 {
f350: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f360: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f370: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
f380: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f390: 74 31 20 56 41 4c 55 45 53 28 27 43 61 6e 62 65  t1 VALUES('Canbe
f3a0: 72 72 61 27 2c 20 27 41 43 54 27 29 3b 0a 20 20  rra', 'ACT');.  
f3b0: 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45  }.  db eval { SE
f3c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
f3d0: 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b   {.    db eval {
f3e0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f3f0: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a  mode = DELETE }.
f400: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
f410: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f420: 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d  ode }.} {delete}
f430: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f440: 32 33 2e 32 2e 32 20 7b 0a 20 20 66 69 6c 65 20  23.2.2 {.  file 
f450: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
f460: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f  ournal.} {0}..do
f470: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f480: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
f490: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
f4a0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
f4b0: 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  IST;.    INSERT 
f4c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
f4d0: 44 61 72 77 69 6e 27 2c 20 27 4e 54 27 29 3b 0a  Darwin', 'NT');.
f4e0: 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45 44 49      BEGIN IMMEDI
f4f0: 41 54 45 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76  ATE;.  }.  db ev
f500: 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  al { PRAGMA jour
f510: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
f520: 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  E }.  execsql { 
f530: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f540: 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d  ode }.} {delete}
f550: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f560: 32 33 2e 33 2e 32 20 7b 0a 20 20 66 69 6c 65 20  23.3.2 {.  file 
f570: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
f580: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f  ournal.} {0}.do_
f590: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33  test pager1-23.3
f5a0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43  .3 {.  execsql C
f5b0: 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  OMMIT.} {}..do_t
f5c0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e  est pager1-23.4.
f5d0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
f5e0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
f5f0: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
f600: 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  T;.    INSERT IN
f610: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41 64  TO t1 VALUES('Ad
f620: 65 6c 61 69 64 65 27 2c 20 27 53 41 27 29 3b 0a  elaide', 'SA');.
f630: 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53      BEGIN EXCLUS
f640: 49 56 45 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76  IVE;.  }.  db ev
f650: 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  al { PRAGMA jour
f660: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
f670: 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  E }.  execsql { 
f680: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f690: 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d  ode }.} {delete}
f6a0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f6b0: 32 33 2e 34 2e 32 20 7b 0a 20 20 66 69 6c 65 20  23.4.2 {.  file 
f6c0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
f6d0: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f  ournal.} {0}.do_
f6e0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34  test pager1-23.4
f6f0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43  .3 {.  execsql C
f700: 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  OMMIT.} {}..do_t
f710: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  est pager1-23.5.
f720: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
f730: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
f740: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d  .  sqlite3 db :m
f750: 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66 6f 72 65  emory:.} {}.fore
f760: 61 63 68 20 7b 74 6e 20 6d 6f 64 65 20 70 6f 73  ach {tn mode pos
f770: 73 69 62 6c 65 7d 20 7b 0a 20 20 32 20 20 6f 66  sible} {.  2  of
f780: 66 20 20 20 20 20 20 31 0a 20 20 33 20 20 6d 65  f      1.  3  me
f790: 6d 6f 72 79 20 20 20 31 0a 20 20 34 20 20 70 65  mory   1.  4  pe
f7a0: 72 73 69 73 74 20 20 30 0a 20 20 35 20 20 64 65  rsist  0.  5  de
f7b0: 6c 65 74 65 20 20 20 30 0a 20 20 36 20 20 77 61  lete   0.  6  wa
f7c0: 6c 20 20 20 20 20 20 30 0a 20 20 37 20 20 74 72  l      0.  7  tr
f7d0: 75 6e 63 61 74 65 20 30 0a 7d 20 7b 0a 20 20 64  uncate 0.} {.  d
f7e0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f7f0: 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65  .5.$tn.1 {.    e
f800: 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a  xecsql "PRAGMA j
f810: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66  ournal_mode = of
f820: 66 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  f".    execsql "
f830: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f840: 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d  ode = $mode".  }
f850: 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b   [if $possible {
f860: 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73  list $mode} {lis
f870: 74 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f 74 65 73  t off}].  do_tes
f880: 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74  t pager1-23.5.$t
f890: 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.2 {.    execsq
f8a0: 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  l "PRAGMA journa
f8b0: 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 22  l_mode = memory"
f8c0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52  .    execsql "PR
f8d0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f8e0: 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b  e = $mode".  } [
f8f0: 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69  if $possible {li
f900: 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20  st $mode} {list 
f910: 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f 74 65  memory}].}.do_te
f920: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 31  st pager1-23.6.1
f930: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52   {.  execsql {PR
f940: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
f950: 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d 20 7b 65  e = normal}.} {e
f960: 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73  xclusive}.do_tes
f970: 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 32 20  t pager1-23.6.2 
f980: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41  {.  execsql {PRA
f990: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
f9a0: 20 3d 20 65 78 63 6c 75 73 69 76 65 7d 0a 7d 20   = exclusive}.} 
f9b0: 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74  {exclusive}.do_t
f9c0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  est pager1-23.6.
f9d0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  3 {.  execsql {P
f9e0: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
f9f0: 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65  de}.} {exclusive
fa00: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
fa10: 2d 32 33 2e 36 2e 34 20 7b 0a 20 20 65 78 65 63  -23.6.4 {.  exec
fa20: 73 71 6c 20 7b 50 52 41 47 4d 41 20 6d 61 69 6e  sql {PRAGMA main
fa30: 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d  .locking_mode}.}
fa40: 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 0a 23 2d   {exclusive}..#-
fa50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65  --------.#.do_te
faa0: 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 31  st pager1-24.1.1
fab0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
fac0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
fad0: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
fae0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
faf0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
fb00: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
fb10: 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  10;.    PRAGMA a
fb20: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46 55 4c  uto_vacuum = FUL
fb30: 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  L;.    CREATE TA
fb40: 42 4c 45 20 78 31 28 78 2c 20 79 2c 20 7a 2c 20  BLE x1(x, y, z, 
fb50: 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c 20 7a  PRIMARY KEY(y, z
fb60: 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ));.    CREATE T
fb70: 41 42 4c 45 20 78 32 28 78 2c 20 79 2c 20 7a 2c  ABLE x2(x, y, z,
fb80: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c 20   PRIMARY KEY(y, 
fb90: 7a 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  z));.    INSERT 
fba0: 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53 28 61  INTO x2 VALUES(a
fbb0: 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f  _string(400), a_
fbc0: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
fbd0: 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20  tring(600));.   
fbe0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
fbf0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
fc00: 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34  600), a_string(4
fc10: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30  00), a_string(50
fc20: 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
fc30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
fc40: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35  ELECT a_string(5
fc50: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
fc60: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  0), a_string(400
fc70: 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
fc80: 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
fc90: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30  LECT a_string(40
fca0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
fcb0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
fcc0: 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
fcd0: 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
fce0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36 30 30  ECT a_string(600
fcf0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ), a_string(400)
fd00: 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 20  , a_string(500) 
fd10: 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
fd20: 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45  ERT INTO x2 SELE
fd30: 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  CT a_string(500)
fd40: 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c  , a_string(600),
fd50: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
fd60: 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45  ROM x2;.    INSE
fd70: 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43  RT INTO x2 SELEC
fd80: 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c  T a_string(400),
fd90: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
fda0: 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
fdb0: 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52  OM x2;.    INSER
fdc0: 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54  T INTO x1 SELECT
fdd0: 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a   * FROM x2;.  }.
fde0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
fdf0: 65 72 31 2d 32 34 2e 31 2e 32 20 7b 0a 20 20 65  er1-24.1.2 {.  e
fe00: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
fe10: 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
fe20: 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72   FROM x1 WHERE r
fe30: 6f 77 69 64 3c 33 32 3b 0a 20 20 7d 0a 20 20 72  owid<32;.  }.  r
fe40: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
fe50: 36 34 20 78 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  64 x2.} {}.do_te
fe60: 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 33  st pager1-24.1.3
fe70: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
fe80: 20 20 20 20 20 20 55 50 44 41 54 45 20 78 31 20        UPDATE x1 
fe90: 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69 6e 67  SET z = a_string
fea0: 28 33 30 30 29 20 57 48 45 52 45 20 72 6f 77 69  (300) WHERE rowi
feb0: 64 3e 34 30 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  d>40;.    COMMIT
fec0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  ;.    PRAGMA int
fed0: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
fee0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
fef0: 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d  ) FROM x1;.  }.}
ff00: 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73   {ok 33}..do_tes
ff10: 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 34 20  t pager1-24.1.4 
ff20: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
ff30: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31    DELETE FROM x1
ff40: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
ff50: 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O x1 SELECT * FR
ff60: 4f 4d 20 78 32 3b 0a 20 20 20 20 42 45 47 49 4e  OM x2;.    BEGIN
ff70: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
ff80: 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72 6f 77  ROM x1 WHERE row
ff90: 69 64 3c 33 32 3b 0a 20 20 20 20 20 20 55 50 44  id<32;.      UPD
ffa0: 41 54 45 20 78 31 20 53 45 54 20 7a 20 3d 20 61  ATE x1 SET z = a
ffb0: 5f 73 74 72 69 6e 67 28 32 39 39 29 20 57 48 45  _string(299) WHE
ffc0: 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20 20 7d  RE rowid>40;.  }
ffd0: 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  .  recursive_sel
ffe0: 65 63 74 20 36 34 20 78 32 20 7b 64 62 20 65 76  ect 64 x2 {db ev
fff0: 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20 20 65 78 65  al COMMIT}.  exe
10000 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
10010 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
10020 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  k;.    SELECT co
10030 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a  unt(*) FROM x1;.
10040 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64    }.} {ok 33}..d
10050 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34  o_test pager1-24
10060 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.5 {.  execsql
10070 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
10080 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM x1;.    INSER
10090 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54  T INTO x1 SELECT
100a0 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a   * FROM x2;.  }.
100b0 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65    recursive_sele
100c0 63 74 20 36 34 20 78 32 20 7b 20 64 62 20 65 76  ct 64 x2 { db ev
100d0 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45  al {CREATE TABLE
100e0 20 78 33 28 78 2c 20 79 2c 20 7a 29 7d 20 7d 0a   x3(x, y, z)} }.
100f0 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
10100 43 54 20 2a 20 46 52 4f 4d 20 78 33 20 7d 0a 7d  CT * FROM x3 }.}
10110 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
10120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10160 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
10170 2d 32 35 2d 31 20 7b 0a 20 20 66 61 75 6c 74 73  -25-1 {.  faults
10180 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
10190 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
101a0 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
101b0 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b    SAVEPOINT abc;
101c0 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
101d0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
101e0 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
101f0 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d 49  O abc;.    COMMI
10200 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73  T;.  }.  db clos
10210 65 0a 7d 20 7b 7d 0a 62 72 65 61 6b 70 6f 69 6e  e.} {}.breakpoin
10220 74 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  t.do_test pager1
10230 2d 32 35 2d 32 20 7b 0a 20 20 66 61 75 6c 74 73  -25-2 {.  faults
10240 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
10250 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
10260 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61  .    SAVEPOINT a
10270 62 63 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  bc;.      CREATE
10280 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
10290 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  .    ROLLBACK TO
102a0 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   abc;.    COMMIT
102b0 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
102c0 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
102d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10310 2d 0a 23 20 53 65 63 74 6f 72 2d 73 69 7a 65 20  -.# Sector-size 
10320 74 65 73 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  tests..#.do_test
10330 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20   pager1-26.1 {. 
10340 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
10350 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74  ault 1.  tv sect
10360 6f 72 73 69 7a 65 20 34 30 39 36 0a 20 20 66 61  orsize 4096.  fa
10370 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
10380 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
10390 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
103a0 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
103b0 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
103c0 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20  _size = 512;.   
103d0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62   CREATE TABLE tb
103e0 6c 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  l(a PRIMARY KEY,
103f0 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   b UNIQUE);.    
10400 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
10410 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c  ERT INTO tbl VAL
10420 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 35 29  UES(a_string(25)
10430 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 29  , a_string(600))
10440 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
10450 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61  NTO tbl SELECT a
10460 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
10470 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
10480 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  tbl;.      INSER
10490 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
104a0 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
104b0 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
104c0 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
104d0 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
104e0 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
104f0 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10500 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
10510 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
10520 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10530 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
10540 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
10550 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10560 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72  tbl SELECT a_str
10570 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
10580 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b  g(600) FROM tbl;
10590 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
105a0 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f  TO tbl SELECT a_
105b0 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
105c0 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74  ring(600) FROM t
105d0 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bl;.      INSERT
105e0 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
105f0 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
10600 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
10610 4d 20 74 62 6c 3b 0a 20 20 20 20 43 4f 4d 4d 49  M tbl;.    COMMI
10620 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65  T;.  }.} {}.do_e
10630 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
10640 72 31 2d 32 36 2e 31 20 7b 0a 20 20 55 50 44 41  r1-26.1 {.  UPDA
10650 54 45 20 74 62 6c 20 53 45 54 20 62 20 3d 20 61  TE tbl SET b = a
10660 5f 73 74 72 69 6e 67 28 35 35 30 29 3b 0a 7d 20  _string(550);.} 
10670 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  {}.db close.tv d
10680 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  elete..#--------
10690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106d0 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  -.#.do_test page
106e0 72 31 2e 32 37 2e 31 20 7b 0a 20 20 66 61 75 6c  r1.27.1 {.  faul
106f0 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
10700 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33  reopen.  sqlite3
10710 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
10720 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   db.  execsql {.
10730 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
10740 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
10750 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 73 71  (a, b);.  }.  sq
10760 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63  lite3_pager_refc
10770 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65 63 73  ounts db.  execs
10780 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a  ql COMMIT.} {}..
10790 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
107a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
107e0 74 20 74 68 61 74 20 61 74 74 65 6d 70 74 69 6e  t that attemptin
107f0 67 20 74 6f 20 6f 70 65 6e 20 61 20 77 72 69 74  g to open a writ
10800 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  e-transaction wi
10810 74 68 20 0a 23 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  th .# locking_mo
10820 64 65 3d 65 78 63 6c 75 73 69 76 65 20 69 6e 20  de=exclusive in 
10830 57 41 4c 20 6d 6f 64 65 20 66 61 69 6c 73 20 69  WAL mode fails i
10840 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
10850 72 20 63 6c 69 65 6e 74 73 20 6f 6e 20 0a 23 20  r clients on .# 
10860 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
10870 65 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64 62 20  e..#.catch { db 
10880 63 6c 6f 73 65 20 7d 0a 64 6f 5f 6d 75 6c 74 69  close }.do_multi
10890 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b  client_test tn {
108a0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
108b0 31 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  1-28.$tn.1 {.   
108c0 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50   sql1 { .      P
108d0 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
108e0 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20  de = WAL;.      
108f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
10900 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  a, b);.      INS
10910 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
10920 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
10930 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20    }.  } {wal}.  
10940 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10950 38 2e 24 74 6e 2e 32 20 7b 20 73 71 6c 32 20 7b  8.$tn.2 { sql2 {
10960 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
10970 31 20 7d 20 7d 20 7b 61 20 62 7d 0a 0a 20 20 64  1 } } {a b}..  d
10980 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
10990 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20  .$tn.3 { sql1 { 
109a0 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
109b0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 7d 20  ode=exclusive } 
109c0 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 20 20  } {exclusive}.  
109d0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
109e0 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20 63  8.$tn.4 { .    c
109f0 73 71 6c 31 20 7b 20 42 45 47 49 4e 3b 20 49 4e  sql1 { BEGIN; IN
10a00 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
10a10 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 20 7d  UES('c', 'd'); }
10a20 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
10a30 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
10a40 63 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73  code2 { db2 clos
10a50 65 20 3b 20 73 71 6c 69 74 65 33 20 64 62 32 20  e ; sqlite3 db2 
10a60 74 65 73 74 2e 64 62 20 7d 0a 20 20 64 6f 5f 74  test.db }.  do_t
10a70 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
10a80 6e 2e 34 20 7b 20 0a 20 20 20 20 73 71 6c 31 20  n.4 { .    sql1 
10a90 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
10aa0 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27   VALUES('c', 'd'
10ab0 29 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 7d 20  ); COMMIT }.  } 
10ac0 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
10ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b10 0a 23 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65  .# Normally, whe
10b20 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20  n changing from 
10b30 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52  journal_mode=PER
10b40 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 74  SIST to DELETE t
10b50 68 65 20 70 61 67 65 72 0a 23 20 61 74 74 65 6d  he pager.# attem
10b60 70 74 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68  pts to delete th
10b70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
10b80 48 6f 77 65 76 65 72 2c 20 69 66 20 69 74 20 63  However, if it c
10b90 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 20 61 0a 23  annot obtain a.#
10ba0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
10bb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
10bc0 69 6c 65 2c 20 74 68 69 73 20 73 74 65 70 20 69  ile, this step i
10bd0 73 20 73 6b 69 70 70 65 64 2e 0a 23 0a 64 6f 5f  s skipped..#.do_
10be0 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
10bf0 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20   tn {.  do_test 
10c00 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20  pager1-28.$tn.1 
10c10 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20  {.    sql1 { .  
10c20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
10c30 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
10c40 54 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  T;.      CREATE 
10c50 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
10c60 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
10c70 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c  O t1 VALUES('a',
10c80 20 27 62 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   'b');.    }.  }
10c90 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f   {persist}.  do_
10ca0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10cb0 74 6e 2e 32 20 7b 20 66 69 6c 65 20 65 78 69 73  tn.2 { file exis
10cc0 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
10cd0 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74  al } 1.  do_test
10ce0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33   pager1-28.$tn.3
10cf0 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41   { sql1 { PRAGMA
10d00 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
10d10 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74  DELETE } } delet
10d20 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  e.  do_test page
10d30 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 66 69  r1-28.$tn.4 { fi
10d40 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
10d50 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20  b-journal } 0.. 
10d60 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10d70 32 38 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 73  28.$tn.5 {.    s
10d80 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41  ql1 { .      PRA
10d90 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
10da0 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
10db0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
10dc0 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27   VALUES('c', 'd'
10dd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65  );.    }.  } {pe
10de0 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74  rsist}.  do_test
10df0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 36   pager1-28.$tn.6
10e00 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
10e10 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
10e20 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   1.  do_test pag
10e30 65 72 31 2d 32 38 2e 24 74 6e 2e 37 20 7b 0a 20  er1-28.$tn.7 {. 
10e40 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b     sql2 { BEGIN;
10e50 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
10e60 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29  VALUES('e', 'f')
10e70 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ; }.  } {}.  do_
10e80 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10e90 74 6e 2e 38 20 20 7b 20 66 69 6c 65 20 65 78 69  tn.8  { file exi
10ea0 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
10eb0 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  nal } 1.  do_tes
10ec0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10ed0 39 20 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47  9  { sql1 { PRAG
10ee0 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
10ef0 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c  = DELETE } } del
10f00 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ete.  do_test pa
10f10 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 30 20 7b  ger1-28.$tn.10 {
10f20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
10f30 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
10f40 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
10f50 72 31 2d 32 38 2e 24 74 6e 2e 31 31 20 7b 20 73  r1-28.$tn.11 { s
10f60 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a  ql2 COMMIT } {}.
10f70 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10f80 2d 32 38 2e 24 74 6e 2e 31 32 20 7b 20 66 69 6c  -28.$tn.12 { fil
10f90 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
10fa0 2d 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20  -journal } 0..  
10fb0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10fc0 38 2d 24 74 6e 2e 31 33 20 7b 0a 20 20 20 20 63  8-$tn.13 {.    c
10fd0 6f 64 65 31 20 7b 20 73 65 74 20 63 68 61 6e 6e  ode1 { set chann
10fe0 65 6c 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20  el [db incrblob 
10ff0 2d 72 65 61 64 6f 6e 6c 79 20 74 31 20 61 20 32  -readonly t1 a 2
11000 5d 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20  ] }.    sql1 {. 
11010 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
11020 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
11030 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ST;.      INSERT
11040 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
11050 27 67 27 2c 20 27 68 27 29 3b 0a 20 20 20 20 7d  'g', 'h');.    }
11060 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20  .  } {persist}. 
11070 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11080 32 38 2e 24 74 6e 2e 31 34 20 7b 20 66 69 6c 65  28.$tn.14 { file
11090 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
110a0 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f  journal } 1.  do
110b0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
110c0 24 74 6e 2e 31 35 20 7b 0a 20 20 20 20 73 71 6c  $tn.15 {.    sql
110d0 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52  2 { BEGIN; INSER
110e0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
110f0 28 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20  ('e', 'f'); }.  
11100 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
11110 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 36 20  ager1-28.$tn.16 
11120 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20  { sql1 { PRAGMA 
11130 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
11140 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65  ELETE } } delete
11150 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11160 31 2d 32 38 2e 24 74 6e 2e 31 37 20 7b 20 66 69  1-28.$tn.17 { fi
11170 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
11180 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20  b-journal } 1.. 
11190 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
111a0 32 38 2e 24 74 6e 2e 31 37 20 7b 20 63 73 71 6c  28.$tn.17 { csql
111b0 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b  2 { COMMIT } } {
111c0 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
111d0 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ocked}}.  do_tes
111e0 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e  t pager1-28-$tn.
111f0 31 38 20 7b 20 63 6f 64 65 31 20 7b 20 72 65 61  18 { code1 { rea
11200 64 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 63  d $channel } } c
11210 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11220 31 2d 32 38 2d 24 74 6e 2e 31 39 20 7b 20 63 6f  1-28-$tn.19 { co
11230 64 65 31 20 7b 20 63 6c 6f 73 65 20 24 63 68 61  de1 { close $cha
11240 6e 6e 65 6c 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f  nnel } } {}.  do
11250 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11260 24 74 6e 2e 32 30 20 7b 20 73 71 6c 32 20 7b 20  $tn.20 { sql2 { 
11270 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 7d 0a  COMMIT } } {}.}.
11280 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
11290 32 39 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  29.1 {.  faultsi
112a0 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
112b0 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
112c0 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
112d0 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
112e0 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
112f0 75 75 6d 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20  uum = full;.    
11300 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
11310 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 3b 0a 20  ode=exclusive;. 
11320 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
11330 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
11340 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11350 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
11360 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
11370 64 62 0a 7d 20 5b 65 78 70 72 20 31 30 32 34 2a  db.} [expr 1024*
11380 33 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  3].do_test pager
11390 31 2d 32 39 2e 32 20 7b 0a 20 20 65 78 65 63 73  1-29.2 {.  execs
113a0 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
113b0 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36  page_size = 4096
113c0 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20 20  ;.    VACUUM;.  
113d0 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
113e0 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 34 30  st.db.} [expr 40
113f0 39 36 2a 33 5d 0a 0a 0a 66 69 6e 69 73 68 5f 74  96*3]...finish_t
11400 65 73 74 0a                                      est.