/ Hex Artifact Content
Login

Artifact 70c94c895ffaf4dc34ee4b66e6e4cd713af41edc:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e 6f 74 20  n.tcl..# Do not 
0210: 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 20  use a codec for 
0220: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0230: 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 62  le, as the datab
0240: 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d 61  ase file is.# ma
0250: 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 74  nipulated direct
0260: 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 72  ly using tcl scr
0270: 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 20  ipts (using the 
0280: 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 6f  [hexio_write] co
0290: 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f 74  mmand)..#.do_not
02a0: 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 20  _use_codec..#.# 
02b0: 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 74  pager1-1.*: Test
02c0: 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 6c   inter-process l
02d0: 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 20  ocking (clients 
02e0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
02f0: 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 65  esses)..#.# page
0300: 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e 74  r1-2.*: Test int
0310: 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b 69  ra-process locki
0320: 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c 69  ng (multiple cli
0330: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ents in this pro
0340: 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 72  cess)..#.# pager
0350: 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e 74  1-3.*: Savepoint
0360: 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a   related tests..
0370: 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a 20  #.# pager1-4.*: 
0380: 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c 61  Hot-journal rela
0390: 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 70  ted tests..#.# p
03a0: 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 73  ager1-5.*: Cases
03b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c 74   related to mult
03c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
03d0: 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a 20  #.# pager1-6.*: 
03e0: 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f  Cases related to
03f0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
0400: 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 67  e_count".#.# pag
0410: 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 73  er1-7.*: Cases s
0420: 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47  pecific to "PRAG
0430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0440: 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 61  TRUNCATE".#.# pa
0450: 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 20  ger1-8.*: Cases 
0460: 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  using temporary 
0470: 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
0480: 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  tabases..#.# pag
0490: 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 72  er1-9.*: Tests r
04a0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  elated to the ba
04b0: 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 61  ckup API..#.# pa
04c0: 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 20  ger1-10.*: Test 
04d0: 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 64  that the assumed
04e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
04f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d 69  tor-size is limi
0500: 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ted to.#        
0510: 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 20        64KB..#.# 
0520: 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 73  pager1-12.*: Tes
0530: 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 52  ts involving "PR
0540: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
0550: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a 3a  #.# pager1-13.*:
0560: 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 20   Cases specific 
0570: 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  to "PRAGMA journ
0580: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
0590: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e 2a  .#.# pager1-14.*
05a0: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
05b0: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
05c0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 0a  nal_mode=OFF".#.
05d0: 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 56  # pager1-15.*: V
05e0: 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76  arying sqlite3_v
05f0: 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 20  fs.szOsFile.#.# 
0600: 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 72  pager1-16.*: Var
0610: 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ying sqlite3_vfs
0620: 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 20  .mxPathname.#.# 
0630: 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 73  pager1-17.*: Tes
0640: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 50  ts related to "P
0650: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
0660: 6f 63 6b 22 0a 23 0a 23 20 70 61 67 65 72 31 2d  ock".#.# pager1-
0670: 31 38 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  18.*: Test that 
0680: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
0690: 72 65 73 70 6f 6e 64 73 20 63 6f 72 72 65 63 74  responds correct
06a0: 6c 79 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ly if the b-tree
06b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
06c0: 72 65 71 75 65 73 74 73 20 61 6e 20 69 6e 76 61  requests an inva
06d0: 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
06e0: 28 64 75 65 20 74 6f 20 64 62 20 63 6f 72 72 75  (due to db corru
06f0: 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72 6f 63 20  ption)..#..proc 
0700: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
0710: 20 7b 69 64 20 74 61 62 6c 65 20 7b 73 63 72 69   {id table {scri
0720: 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73 65 74 20  pt {}}} {.  set 
0730: 63 6e 74 20 30 0a 20 20 64 62 20 65 76 61 6c 20  cnt 0.  db eval 
0740: 22 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  "SELECT rowid, *
0750: 20 46 52 4f 4d 20 24 74 61 62 6c 65 20 57 48 45   FROM $table WHE
0760: 52 45 20 72 6f 77 69 64 20 3d 20 28 24 69 64 2d  RE rowid = ($id-
0770: 31 29 22 20 7b 0a 20 20 20 20 72 65 63 75 72 73  1)" {.    recurs
0780: 69 76 65 5f 73 65 6c 65 63 74 20 24 72 6f 77 69  ive_select $rowi
0790: 64 20 24 74 61 62 6c 65 20 24 73 63 72 69 70 74  d $table $script
07a0: 0a 20 20 20 20 69 6e 63 72 20 63 6e 74 0a 20 20  .    incr cnt.  
07b0: 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d 3d 30 7d  }.  if {$cnt==0}
07c0: 20 7b 20 65 76 61 6c 20 24 73 63 72 69 70 74 20   { eval $script 
07d0: 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74 72 69 6e  }.}..set a_strin
07e0: 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70 72 6f 63  g_counter 1.proc
07f0: 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d 20 7b 0a   a_string {n} {.
0800: 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74 72 69 6e    global a_strin
0810: 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69 6e 63 72  g_counter.  incr
0820: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
0830: 72 0a 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65  r.  string range
0840: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
0850: 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  "${a_string_coun
0860: 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20 24 6e 0a  ter}." $n] 1 $n.
0870: 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  }.db func a_stri
0880: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 64 6f 5f  ng a_string..do_
0890: 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
08a0: 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72 65 61 74   tn {..  # Creat
08b0: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
08c0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
08d0: 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  using connection
08e0: 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 0a 20 20   [db]. Check .  
08f0: 23 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  # that connectio
0900: 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62  ns [db2] and [db
0910: 33 5d 20 63 61 6e 20 73 65 65 20 74 68 65 20 73  3] can see the s
0920: 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65 6e  chema and conten
0930: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0940: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 20 7b 0a   pager1-$tn.1 {.
0950: 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20      sql1 {.     
0960: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0970: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
0980: 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  b);.      CREATE
0990: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
09a0: 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
09b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
09c0: 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e 53 45 52  1, 'one'); INSER
09d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
09e0: 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20  (2, 'two');.    
09f0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0a00: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 20  st pager1-$tn.2 
0a10: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0a20: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0a30: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0a40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a50: 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  .3 { sql3 { SELE
0a60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a70: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 0a   {1 one 2 two}..
0a80: 20 20 23 20 4f 70 65 6e 20 61 20 74 72 61 6e 73    # Open a trans
0a90: 61 63 74 69 6f 6e 20 61 6e 64 20 61 64 64 20 61  action and add a
0aa0: 20 72 6f 77 20 75 73 69 6e 67 20 5b 64 62 5d 2e   row using [db].
0ab0: 20 54 68 69 73 20 70 75 74 73 20 5b 64 62 5d 20   This puts [db] 
0ac0: 69 6e 0a 20 20 23 20 52 45 53 45 52 56 45 44 20  in.  # RESERVED 
0ad0: 73 74 61 74 65 2e 20 43 68 65 63 6b 20 74 68 61  state. Check tha
0ae0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64  t connections [d
0af0: 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 20 63 61  b2] and [db3] ca
0b00: 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72 65 61 64  n still.  # read
0b10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
0b20: 6e 74 65 6e 74 20 61 73 20 69 74 20 77 61 73 20  ntent as it was 
0b30: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
0b40: 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 23 20 6f  action was.  # o
0b50: 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73 68 6f 75  pened. [db] shou
0b60: 6c 64 20 73 65 65 20 74 68 65 20 69 6e 73 65 72  ld see the inser
0b70: 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a 20 20 64  ted row..  #.  d
0b80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
0b90: 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b  n.4 {.    sql1 {
0ba0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
0bb0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0bc0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27  O t1 VALUES(3, '
0bd0: 74 68 72 65 65 27 29 3b 0a 20 20 20 20 7d 0a 20  three');.    }. 
0be0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0bf0: 70 61 67 65 72 31 2d 24 74 6e 2e 35 20 7b 20 73  pager1-$tn.5 { s
0c00: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
0c10: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
0c20: 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f 5f 74 65  e 2 two}.  do_te
0c30: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 37 20  st pager1-$tn.7 
0c40: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
0c50: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c60: 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72   one 2 two 3 thr
0c70: 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 73 74  ee}..  # [db] st
0c80: 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ill has an open 
0c90: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
0ca0: 6e 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  n. Check that th
0cb0: 69 73 20 70 72 65 76 65 6e 74 73 0a 20 20 23 20  is prevents.  # 
0cc0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
0cd0: 73 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 20  s (specifically 
0ce0: 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77 72 69 74  [db2]) from writ
0cf0: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
0d00: 61 73 65 2e 0a 20 20 23 0a 20 20 23 20 45 76 65  ase..  #.  # Eve
0d10: 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70 65 6e 73  n if [db2] opens
0d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
0d30: 69 72 73 74 2c 20 69 74 20 6d 61 79 20 6e 6f 74  irst, it may not
0d40: 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20   write to the.  
0d50: 23 20 64 61 74 61 62 61 73 65 2e 20 41 66 74 65  # database. Afte
0d60: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
0d70: 20 77 72 69 74 65 20 74 68 65 20 64 62 20 77 69   write the db wi
0d80: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
0d90: 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32 5d 20 69  on, .  # [db2] i
0da0: 73 20 6c 65 66 74 20 77 69 74 68 20 61 6e 20 6f  s left with an o
0db0: 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
0dc0: 20 62 75 74 20 6e 6f 74 20 61 20 72 65 61 64 2d   but not a read-
0dd0: 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74 68 65 20  lock on.  # the 
0de0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 53  main database. S
0df0: 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 70 72  o it does not pr
0e00: 65 76 65 6e 74 20 5b 64 62 5d 20 66 72 6f 6d 20  event [db] from 
0e10: 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20 20 23 0a  committing..  #.
0e20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0e30: 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20 20 63 73  -$tn.8 { .    cs
0e40: 71 6c 32 20 7b 20 55 50 44 41 54 45 20 74 31 20  ql2 { UPDATE t1 
0e50: 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d  SET a = a + 10 }
0e60: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
0e70: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
0e80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0e90: 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63 73 71 6c  tn.9 { .    csql
0ea0: 32 20 7b 20 0a 20 20 20 20 20 20 42 45 47 49 4e  2 { .      BEGIN
0eb0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
0ec0: 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30  1 SET a = a + 10
0ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  ;.    }.  } {1 {
0ee0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
0ef0: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
0f00: 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20 74  db] commit its t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 43 68 65  ransactions. Che
0f20: 63 6b 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6e  ck the other con
0f30: 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a 20 20 23  nections can.  #
0f40: 20 6e 6f 77 20 73 65 65 20 74 68 65 20 6e 65 77   now see the new
0f50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
0f60: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0f70: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 30 20 7b   pager1-$tn.10 {
0f80: 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql1 { COMMIT }
0f90: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0fa0: 70 61 67 65 72 31 2d 24 74 6e 2e 31 31 20 7b 20  pager1-$tn.11 { 
0fb0: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql1 { SELECT * 
0fc0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
0fd0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
0fe0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
0ff0: 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73 71 6c 32  r1-$tn.12 { sql2
1000: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1010: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1020: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20   two 3 three}.  
1030: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1040: 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20 7b 20 53  tn.13 { sql3 { S
1050: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1060: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
1070: 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 43   3 three}..  # C
1080: 68 65 63 6b 20 74 68 61 74 2c 20 61 73 20 6e 6f  heck that, as no
1090: 74 65 64 20 61 62 6f 76 65 2c 20 5b 64 62 32 5d  ted above, [db2]
10a0: 20 72 65 61 6c 6c 79 20 64 69 64 20 6b 65 65 70   really did keep
10b0: 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   an open transac
10c0: 74 69 6f 6e 0a 20 20 23 20 61 66 74 65 72 20 74  tion.  # after t
10d0: 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
10e0: 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
10f0: 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a 20 20 64   failed..  #.  d
1100: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1110: 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.14 { .    csql
1120: 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a 20 20 7d  2 { BEGIN } .  }
1130: 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61 72   {1 {cannot star
1140: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1150: 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1160: 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  tion}}.  do_test
1170: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b   pager1-$tn.15 {
1180: 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42 41 43 4b   sql2 { ROLLBACK
1190: 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61 76   } } {}..  # Hav
11a0: 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 74  e [db2] open a t
11b0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74  ransaction and t
11c0: 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ake a read-lock 
11d0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
11e0: 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20  .  # Check that 
11f0: 74 68 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64  this prevents [d
1200: 62 5d 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  b] from writing 
1210: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1220: 28 6f 75 74 73 69 64 65 0a 20 20 23 20 6f 66 20  (outside.  # of 
1230: 61 6e 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  any transaction)
1240: 2e 20 41 66 74 65 72 20 74 68 69 73 20 66 61 69  . After this fai
1250: 6c 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 5b  ls, check that [
1260: 64 62 33 5d 20 63 61 6e 20 72 65 61 64 0a 20 20  db3] can read.  
1270: 23 20 74 68 65 20 64 62 20 28 73 68 6f 77 69 6e  # the db (showin
1280: 67 20 74 68 61 74 20 5b 64 62 5d 20 64 69 64 20  g that [db] did 
1290: 6e 6f 74 20 74 61 6b 65 20 61 20 50 45 4e 44 49  not take a PENDI
12a0: 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29 0a 20 20  NG lock etc.).  
12b0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  #.  do_test page
12c0: 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a 20 20 20  r1-$tn.15 { .   
12d0: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53   sql2 { BEGIN; S
12e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
12f0: 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32 20   }.  } {1 one 2 
1300: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64  two 3 three}.  d
1310: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1320: 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.16 { .    csql
1330: 31 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  1 { UPDATE t1 SE
1340: 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d 0a 20  T a = a + 10 }. 
1350: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
1360: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
1370: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1380: 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c  .17 { sql3 { SEL
1390: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
13a0: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
13b0: 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 54 68 69   three}..  # Thi
13c0: 73 20 74 69 6d 65 2c 20 68 61 76 65 20 5b 64 62  s time, have [db
13d0: 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63  ] open a transac
13e0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 77 72 69 74  tion before writ
13f0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1400: 2e 0a 20 20 23 20 54 68 69 73 20 77 6f 72 6b 73  ..  # This works
1410: 20 2d 20 5b 64 62 5d 20 67 65 74 73 20 61 20 52   - [db] gets a R
1420: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 69  ESERVED lock whi
1430: 63 68 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 66  ch does not conf
1440: 6c 69 63 74 20 77 69 74 68 0a 20 20 23 20 74 68  lict with.  # th
1450: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 5b 64  e SHARED lock [d
1460: 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e 67 2e 0a  b2] is holding..
1470: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61    #.  do_test pa
1480: 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b 20 0a 20  ger1-$tn.18 { . 
1490: 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20     sql1 { .     
14a0: 20 42 45 47 49 4e 3b 20 20 0a 20 20 20 20 20 20   BEGIN;  .      
14b0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
14c0: 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20 20 20 7d  = a + 10; .    }
14d0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
14e0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2d 31 39 20  t pager1-$tn-19 
14f0: 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 50 52  { .    sql1 { PR
1500: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
1510: 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 72 65   } .  } {main re
1520: 73 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73  served temp clos
1530: 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ed}.  do_test pa
1540: 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b 20 0a 20  ger1-$tn-20 { . 
1550: 20 20 20 73 71 6c 32 20 7b 20 50 52 41 47 4d 41     sql2 { PRAGMA
1560: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20 0a   lock_status } .
1570: 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61 72 65 64    } {main shared
1580: 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 20   temp closed}.. 
1590: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c   # Check that al
15a0: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  l connections ca
15b0: 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74 68 65  n still read the
15c0: 20 64 61 74 61 62 61 73 65 2e 20 4f 6e 6c 79 20   database. Only 
15d0: 5b 64 62 5d 20 73 65 65 73 0a 20 20 23 20 74 68  [db] sees.  # th
15e0: 65 20 75 70 64 61 74 65 64 20 63 6f 6e 74 65 6e  e updated conten
15f0: 74 20 28 61 73 20 74 68 65 20 74 72 61 6e 73 61  t (as the transa
1600: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  ction has not be
1610: 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 79 65 74  en committed yet
1620: 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  )..  #.  do_test
1630: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 31 20 7b   pager1-$tn.21 {
1640: 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a   sql1 { SELECT *
1650: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 31   FROM t1 } } {11
1660: 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33 20 74   one 12 two 13 t
1670: 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  hree}.  do_test 
1680: 70 61 67 65 72 31 2d 24 74 6e 2e 32 32 20 7b 20  pager1-$tn.22 { 
1690: 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
16a0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
16b0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
16c0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
16d0: 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73 71 6c 33  r1-$tn.23 { sql3
16e0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
16f0: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1700: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20   two 3 three}.. 
1710: 20 23 20 42 65 63 61 75 73 65 20 5b 64 62 32 5d   # Because [db2]
1720: 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 53   still has the S
1730: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b 64 62 5d  HARED lock, [db]
1740: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   is unable to co
1750: 6d 6d 69 74 20 74 68 65 0a 20 20 23 20 74 72 61  mmit the.  # tra
1760: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
1770: 74 72 69 65 73 2c 20 61 6e 20 65 72 72 6f 72 20  tries, an error 
1780: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1790: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  the connection .
17a0: 20 20 23 20 75 70 67 72 61 64 65 73 20 74 6f 20    # upgrades to 
17b0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
17c0: 20 20 23 0a 20 20 23 20 4f 6e 63 65 20 74 68 69    #.  # Once thi
17d0: 73 20 68 61 70 70 65 6e 73 2c 20 5b 64 62 5d 20  s happens, [db] 
17e0: 63 61 6e 20 72 65 61 64 20 74 68 65 20 64 61 74  can read the dat
17f0: 61 62 61 73 65 20 61 6e 64 20 73 65 65 20 74 68  abase and see th
1800: 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2c 0a 20  e new content,. 
1810: 20 23 20 5b 64 62 32 5d 20 28 73 74 69 6c 6c 20   # [db2] (still 
1820: 68 6f 6c 64 69 6e 67 20 53 48 41 52 45 44 29 20  holding SHARED) 
1830: 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74  can still read t
1840: 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 2c 20  he old content, 
1850: 62 75 74 20 5b 64 62 33 5d 0a 20 20 23 20 28 6e  but [db3].  # (n
1860: 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c  ot holding any l
1870: 6f 63 6b 29 20 69 73 20 70 72 65 76 65 6e 74 65  ock) is prevente
1880: 64 20 62 79 20 5b 64 62 5d 27 73 20 50 45 4e 44  d by [db]'s PEND
1890: 49 4e 47 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ING from reading
18a0: 0a 20 20 23 20 74 68 65 20 64 61 74 61 62 61 73  .  # the databas
18b0: 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  e..  #.  do_test
18c0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 34 20 7b   pager1-$tn.24 {
18d0: 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20   csql1 { COMMIT 
18e0: 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  } } {1 {database
18f0: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
1900: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1910: 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73 71 6c 31  n-25 { .    sql1
1920: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73   { PRAGMA lock_s
1930: 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61  tatus } .  } {ma
1940: 69 6e 20 70 65 6e 64 69 6e 67 20 74 65 6d 70 20  in pending temp 
1950: 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73  closed}.  do_tes
1960: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 36 20  t pager1-$tn.26 
1970: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
1980: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
1990: 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33  11 one 12 two 13
19a0: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
19b0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37 20  t pager1-$tn.27 
19c0: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
19d0: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
19e0: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
19f0: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1a00: 61 67 65 72 31 2d 24 74 6e 2e 32 38 20 7b 20 63  ager1-$tn.28 { c
1a10: 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql3 { SELECT * 
1a20: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b  FROM t1 } } {1 {
1a30: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
1a40: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
1a50: 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20  db2] commit its 
1a60: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1a70: 2c 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  , releasing the 
1a80: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 74 0a 20  SHARED lock it. 
1a90: 20 23 20 69 73 20 68 6f 6c 64 69 6e 67 2e 20 4e   # is holding. N
1aa0: 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b 64 62 32  ow, neither [db2
1ab0: 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d 61 79 20  ] nor [db3] may 
1ac0: 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1ad0: 65 20 28 61 73 20 5b 64 62 5d 0a 20 20 23 20 69  e (as [db].  # i
1ae0: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
1af0: 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20 20 23 0a  a PENDING)..  #.
1b00: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1b10: 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c 32 20 7b  -$tn.29 { sql2 {
1b20: 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20   COMMIT } } {}. 
1b30: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b40: 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c 32 20 7b  $tn.30 { csql2 {
1b50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1b60: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1b70: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
1b80: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b90: 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c 33 20 7b  $tn.31 { csql3 {
1ba0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1bb0: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1bc0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a  se is locked}}..
1bd0: 20 20 23 20 5b 64 62 5d 20 69 73 20 6e 6f 77 20    # [db] is now 
1be0: 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20 74  able to commit t
1bf0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
1c00: 4f 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61 63  Once the transac
1c10: 74 69 6f 6e 20 69 73 20 0a 20 20 23 20 63 6f 6d  tion is .  # com
1c20: 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74 68 72 65  mitted, all thre
1c30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  e connections ca
1c40: 6e 20 72 65 61 64 20 74 68 65 20 6e 65 77 20 63  n read the new c
1c50: 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f  ontent..  #.  do
1c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1c70: 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20 55 50 44  .25 { sql1 { UPD
1c80: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61  ATE t1 SET a = a
1c90: 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f  +10 } } {}.  do_
1ca0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1cb0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d  26 { sql1 { COMM
1cc0: 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  IT } } {}.  do_t
1cd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1ce0: 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  7 { sql1 { SELEC
1cf0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
1d00: 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32  {21 one 22 two 2
1d10: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
1d20: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37  st pager1-$tn.27
1d30: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1d40: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1d50: 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33  21 one 22 two 23
1d60: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1d70: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1d80: 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20  { sql3 { SELECT 
1d90: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 32  * FROM t1 } } {2
1da0: 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20  1 one 22 two 23 
1db0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 49 6e 73 74  three}..  # Inst
1dc0: 61 6c 6c 20 61 20 62 75 73 79 2d 68 61 6e 64 6c  all a busy-handl
1dd0: 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  er for connectio
1de0: 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20 20 73 65  n [db]..  #.  se
1df0: 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69 73 74 5d  t ::nbusy [list]
1e00: 0a 20 20 70 72 6f 63 20 62 75 73 79 20 7b 6e 7d  .  proc busy {n}
1e10: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a   {.    lappend :
1e20: 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20 20 69 66  :nbusy $n.    if
1e30: 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c 32 20 43   {$n>5} { sql2 C
1e40: 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72 65 74 75  OMMIT }.    retu
1e50: 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62 20 62 75  rn 0.  }.  db bu
1e60: 73 79 20 62 75 73 79 0a 0a 20 20 64 6f 5f 74 65  sy busy..  do_te
1e70: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 39  st pager1-$tn.29
1e80: 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 42   { .    sql1 { B
1e90: 45 47 49 4e 20 3b 20 49 4e 53 45 52 54 20 49 4e  EGIN ; INSERT IN
1ea0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 27  TO t1 VALUES('x'
1eb0: 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d 20 7b 7d  , 'y') } .  } {}
1ec0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1ed0: 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20 20 20 20  1-$tn.30 { .    
1ee0: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20 53  sql2 { BEGIN ; S
1ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1f00: 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e 65 20 32  } .  } {21 one 2
1f10: 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a  2 two 23 three}.
1f20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1f30: 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c 31 20 43  -$tn.31 { sql1 C
1f40: 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f  OMMIT } {}.  do_
1f50: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1f60: 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62 75 73 79  32 { set ::nbusy
1f70: 20 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35 20   } {0 1 2 3 4 5 
1f80: 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  6}.}..#---------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 0a 23 20 53 61 76 65 70 6f 69 6e 74 20 72 65 6c  .# Savepoint rel
1fe0: 61 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e  ated test cases.
1ff0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 33 2e 31 2e  .#.# pager1-3.1.
2000: 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20 73 61 76  2.*: Force a sav
2010: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
2020: 74 6f 20 63 61 75 73 65 20 74 68 65 20 64 61 74  to cause the dat
2030: 61 62 61 73 65 20 66 69 6c 65 0a 23 20 20 20 20  abase file.#    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20               to 
2050: 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67 65 72 31  grow..#.# pager1
2060: 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65 20 61 20  -3.1.3.*: Use a 
2070: 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
2080: 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f  in synchronous=o
2090: 66 66 20 6d 6f 64 65 20 61 73 20 70 61 72 74 0a  ff mode as part.
20a0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
20b0: 20 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74    of a savepoint
20c0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 0a 64 6f   rollback..# .do
20d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31  _test pager1-3.1
20e0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
20f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
2100: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
2110: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2120: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
2130: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
2140: 54 41 42 4c 45 20 63 6f 75 6e 74 65 72 28 0a 20  TABLE counter(. 
2150: 20 20 20 20 20 69 20 43 48 45 43 4b 20 28 69 3c       i CHECK (i<
2160: 35 29 2c 20 0a 20 20 20 20 20 20 75 20 43 48 45  5), .      u CHE
2170: 43 4b 20 28 75 3c 31 30 29 0a 20 20 20 20 29 3b  CK (u<10).    );
2180: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2190: 20 63 6f 75 6e 74 65 72 20 56 41 4c 55 45 53 28   counter VALUES(
21a0: 30 2c 20 30 29 3b 0a 20 20 20 20 43 52 45 41 54  0, 0);.    CREAT
21b0: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 41 46  E TRIGGER tr1 AF
21c0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
21d0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
21e0: 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20  ATE counter SET 
21f0: 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20 45 4e 44  i = i+1;.    END
2200: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
2210: 47 47 45 52 20 74 72 32 20 41 46 54 45 52 20 55  GGER tr2 AFTER U
2220: 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47 49  PDATE ON t1 BEGI
2230: 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 63  N.      UPDATE c
2240: 6f 75 6e 74 65 72 20 53 45 54 20 75 20 3d 20 75  ounter SET u = u
2250: 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  +1;.    END;.  }
2260: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
2270: 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74  ECT * FROM count
2280: 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a 0a 64 6f  er }.} {0 0}..do
2290: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
22a0: 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a 20 20 50  ger1-3.1.2 {.  P
22b0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
22c0: 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a   = 10;.  BEGIN;.
22d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
22e0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
22f0: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2300: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2310: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e  t1 VALUES(2, ran
2320: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2340: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61 6e  t1 VALUES(3, ran
2350: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2360: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2370: 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20 7b 33 20  M counter;.} {3 
2380: 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  0}.do_catchsql_t
2390: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31 2e 33  est pager1-3.1.3
23a0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
23b0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 33  TO t1 SELECT a+3
23c0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
23d0: 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 31 20  0) FROM t1.} {1 
23e0: 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  {constraint fail
23f0: 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ed}}.do_execsql_
2400: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 34 20  test pager1-3.4 
2410: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
2420: 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20 30 7d 0a  counter } {3 0}.
2430: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2440: 70 61 67 65 72 31 2d 33 2e 35 20 7b 20 53 45 4c  pager1-3.5 { SEL
2450: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 7d 20  ECT a FROM t1 } 
2460: 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78 65 63 73  {1 2 3}.do_execs
2470: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2480: 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d  .6 { COMMIT } {}
2490: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71  ..foreach {tn sq
24a0: 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20 20 7b 20  l tcl} {.  7  { 
24b0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
24c0: 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50 52  us = NORMAL ; PR
24d0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20  AGMA temp_store 
24e0: 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74 65 73 74  = 0 } {.    test
24f0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
2500: 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72  1.    tv devchar
2510: 20 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20 7d   safe_append.  }
2520: 0a 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 73  .  8  { PRAGMA s
2530: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52  ynchronous = NOR
2540: 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20 74 65 6d  MAL ; PRAGMA tem
2550: 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d 20 7b 0a  p_store = 2 } {.
2560: 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d      testvfs tv -
2570: 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76  default 1.    tv
2580: 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e 74   devchar sequent
2590: 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20 7b 20 50  ial.  }.  9  { P
25a0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
25b0: 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20 7d 0a 20  s = FULL } { }. 
25c0: 20 31 30 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   10 { PRAGMA syn
25d0: 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41  chronous = NORMA
25e0: 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20 7b 20 50  L } { }.  11 { P
25f0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
2600: 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d 0a 20 20  s = OFF } { }.  
2610: 31 32 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63  12 { PRAGMA sync
2620: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 3b  hronous = FULL ;
2630: 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e   PRAGMA fullfsyn
2640: 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20 20 31 33  c = 1 } { }.  13
2650: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2660: 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b  onous = FULL } {
2670: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
2680: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74  -default 1.    t
2690: 76 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e  v devchar sequen
26a0: 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34 20 7b 20  tial.  }.  14 { 
26b0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
26c0: 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 20  ode = EXCLUSIVE 
26d0: 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20 20 64 6f  } {.  }.} {.  do
26e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24  _test pager1-3.$
26f0: 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76 61 6c 20  tn.1 {.    eval 
2700: 24 74 63 6c 0a 20 20 20 20 66 61 75 6c 74 73 69  $tcl.    faultsi
2710: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
2720: 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20  pen.    db func 
2730: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
2740: 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 73  g.    execsql $s
2750: 71 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  ql.    execsql {
2760: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
2770: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20  to_vacuum = 2;. 
2780: 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
2790: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
27a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
27b0: 7a 28 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d  z(x INTEGER PRIM
27c0: 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
27d0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
27e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
27f0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73  VALUES(NULL, a_s
2800: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
2810: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2820: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2830: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2840: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20 32  OM z;     --   2
2850: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2860: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2870: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2880: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
2890: 20 20 20 34 0a 20 20 20 20 20 20 20 20 49 4e 53     4.        INS
28a0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
28b0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
28c0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
28d0: 20 20 2d 2d 20 20 20 38 0a 20 20 20 20 20 20 20    --   8.       
28e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
28f0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2900: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2910: 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a 20 20 20  ;     --  16.   
2920: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2930: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2940: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2950: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 33 32  OM z;     --  32
2960: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2970: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2980: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2990: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
29a0: 20 20 36 34 0a 20 20 20 20 20 20 20 20 49 4e 53    64.        INS
29b0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
29c0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
29d0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
29e0: 20 20 2d 2d 20 31 32 38 0a 20 20 20 20 20 20 20    -- 128.       
29f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
2a00: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2a10: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2a20: 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a 20 20 20  ;     -- 256.   
2a30: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
2a40: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
2a50: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2a60: 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20 20 64 6f  m }.  } {2}.  do
2a70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
2a80: 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20 7b 0a 20  ger1-3.$tn.2 {. 
2a90: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
2aa0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56 41  INSERT INTO z VA
2ab0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72  LUES(NULL, a_str
2ac0: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20  ing(800));.     
2ad0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56   INSERT INTO z V
2ae0: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74  ALUES(NULL, a_st
2af0: 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20  ring(800));.    
2b00: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
2b10: 0a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  .        UPDATE 
2b20: 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c 4c 20 57  z SET y = NULL W
2b30: 48 45 52 45 20 78 3e 32 35 36 3b 0a 20 20 20 20  HERE x>256;.    
2b40: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65      PRAGMA incre
2b50: 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20  mental_vacuum;. 
2b60: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f         SELECT co
2b70: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 20 57 48  unt(*) FROM z WH
2b80: 45 52 45 20 78 20 3c 20 31 30 30 3b 0a 20 20 20  ERE x < 100;.   
2b90: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
2ba0: 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ne;.    COMMIT;.
2bb0: 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64 6f 5f 65    } {99}..  do_e
2bc0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
2bd0: 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  r1-3.$tn.3 {.   
2be0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41   BEGIN;.      SA
2bf0: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
2c00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2c10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2c20: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
2c30: 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  e;.    COMMIT;. 
2c40: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2c50: 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 7d 20 7b  *) FROM z;.  } {
2c60: 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73  258}..  do_execs
2c70: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2c80: 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 53 41 56  .$tn.4 {.    SAV
2c90: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
2ca0: 20 20 55 50 44 41 54 45 20 7a 20 53 45 54 20 79    UPDATE z SET y
2cb0: 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20 52 4f 4c   = y||x;.    ROL
2cc0: 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
2cd0: 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71  } {}.  do_execsq
2ce0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2cf0: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53 45 4c 45  $tn.5 {.    SELE
2d00: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2d10: 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20   z;.    RELEASE 
2d20: 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  one;.    PRAGMA 
2d30: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
2d40: 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d 0a 0a 20  .  } {258 ok}.. 
2d50: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2d60: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 36 20   pager1-3.$tn.6 
2d70: 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  {.    SAVEPOINT 
2d80: 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45 41 53 45  one;.    RELEASE
2d90: 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 0a 20 20   one;.  } {}..  
2da0: 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68  db close.  catch
2db0: 20 7b 20 74 76 20 64 65 6c 65 74 65 20 7d 0a 7d   { tv delete }.}
2dc0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 48  ------------.# H
2e10: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
2e20: 61 63 6b 20 72 65 6c 61 74 65 64 20 74 65 73 74  ack related test
2e30: 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65   cases..#.# page
2e40: 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73 74 20 74  r1.4.1.*: Test t
2e50: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f  hat the pager mo
2e60: 64 75 6c 65 20 64 65 6c 65 74 65 73 20 76 65 72  dule deletes ver
2e70: 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c 69 64 0a  y small invalid.
2e80: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
2e90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23  journal files..#
2ea0: 0a 23 20 70 61 67 65 72 31 2e 34 2e 32 2e 2a 3a  .# pager1.4.2.*:
2eb0: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
2ec0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2ed0: 20 70 6f 69 6e 74 65 72 20 61 74 20 74 68 65 20   pointer at the 
2ee0: 65 6e 64 20 6f 66 20 61 0a 23 20 20 20 20 20 20  end of a.#      
2ef0: 20 20 20 20 20 20 20 20 20 68 6f 74 2d 6a 6f 75           hot-jou
2f00: 72 6e 61 6c 20 66 69 6c 65 20 61 70 70 65 61 72  rnal file appear
2f10: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 20  s to be corrupt 
2f20: 28 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e  (checksum does n
2f30: 6f 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ot.#            
2f40: 20 20 20 63 6f 6d 70 75 74 65 29 20 74 68 65 20     compute) the 
2f50: 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e  associated journ
2f60: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
2f70: 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20 20 20 20  k (and no.#     
2f80: 20 20 20 20 20 20 20 20 20 20 78 41 63 63 65 73            xAcces
2f90: 73 28 29 20 63 61 6c 6c 20 74 6f 20 63 68 65 63  s() call to chec
2fa0: 6b 20 66 6f 72 20 74 68 65 20 70 72 65 73 65 6e  k for the presen
2fb0: 63 65 20 6f 66 20 61 6e 79 20 6d 61 73 74 65 72  ce of any master
2fc0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
2fd0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
2fe0: 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20 70 61 67  s made)..#.# pag
2ff0: 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65 73 74 20  er1.4.3.*: Test 
3000: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
3010: 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  s of a hot-journ
3020: 61 6c 20 61 72 65 20 69 67 6e 6f 72 65 64 20 69  al are ignored i
3030: 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  f the.#         
3040: 20 20 20 20 20 20 70 61 67 65 2d 73 69 7a 65 20        page-size 
3050: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
3060: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
3070: 61 64 65 72 20 61 70 70 65 61 72 20 74 6f 0a 23  ader appear to.#
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3090: 65 20 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20 6c  e invalid (too l
30a0: 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61 6c 6c 20  arge, too small 
30b0: 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65 72 20 6f  or not a power o
30c0: 66 20 32 29 2e 0a 23 0a 23 20 70 61 67 65 72 31  f 2)..#.# pager1
30d0: 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20 68 6f 74  .4.4.*: Test hot
30e0: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
30f0: 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  k of journal fil
3100: 65 20 77 69 74 68 20 61 20 6d 61 73 74 65 72 0a  e with a master.
3110: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3120: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
3130: 67 65 6e 65 72 61 74 65 64 20 69 6e 20 76 61 72  generated in var
3140: 69 6f 75 73 20 22 50 52 41 47 4d 41 20 73 79 6e  ious "PRAGMA syn
3150: 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20 20 20 20  chronous".#     
3160: 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 73 2e            modes.
3170: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 35 2e  .#.# pager1.4.5.
3180: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 68 6f 74  *: Test that hot
3190: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
31a0: 6b 20 73 74 6f 70 73 20 69 66 20 69 74 20 65 6e  k stops if it en
31b0: 63 6f 75 6e 74 65 72 73 20 61 0a 23 20 20 20 20  counters a.#    
31c0: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
31d0: 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72 20 77 68  al-record for wh
31e0: 69 63 68 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ich the checksum
31f0: 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65   fails..#.# page
3200: 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73 74 20 74  r1.4.6.*: Test t
3210: 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67  hat when rolling
3220: 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
3230: 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nal that contain
3240: 73 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  s a.#           
3250: 20 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e      master journ
3260: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20  al pointer, the 
3270: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
3280: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 0a 23  ile is deleted.#
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
32a0: 66 74 65 72 20 61 6c 6c 20 74 68 65 20 68 6f 74  fter all the hot
32b0: 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61 74 20 72  -journals that r
32c0: 65 66 65 72 20 74 6f 20 69 74 20 61 72 65 20 64  efer to it are d
32d0: 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70 61 67 65  eleted..#.# page
32e0: 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73 74 20 74  r1.4.7.*: Test t
32f0: 68 61 74 20 69 66 20 61 20 68 6f 74 2d 6a 6f 75  hat if a hot-jou
3300: 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
3310: 20 62 75 74 20 61 20 63 6c 69 65 6e 74 20 63 61   but a client ca
3320: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
3330: 20 20 6f 70 65 6e 20 69 74 20 66 6f 72 20 72 65    open it for re
3340: 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74 68 65 20  ading only, the 
3350: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
3360: 62 65 20 61 63 63 65 73 73 65 64 20 61 6e 64 0a  be accessed and.
3370: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3380: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
3390: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 20 0a  is returned..# .
33a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
33b0: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
33c0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
33d0: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  pen.  execsql { 
33e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
33f0: 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20 20 20 49  E x(y, z);.    I
3400: 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41 4c  NSERT INTO x VAL
3410: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
3420: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65   set fd [open te
3430: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d  st.db-journal w]
3440: 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69  .  puts -nonewli
3450: 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f 77 6f 72  ne $fd "hellowor
3460: 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  ld".  close $fd.
3470: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
3480: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
3490: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {1}.do_test page
34a0: 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78 65 63 73  r1.4.1.2 { execs
34b0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
34c0: 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32 7d 0a 64  OM x } } {1 2}.d
34d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
34e0: 31 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  1.3 { file exist
34f0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
3500: 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65 74 20 75  l } {0}..# Set u
3510: 70 20 61 20 5b 74 65 73 74 76 66 73 5d 20 74 6f  p a [testvfs] to
3520: 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   snapshot the fi
3530: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
3540: 65 66 6f 72 65 20 53 51 4c 69 74 65 0a 23 20 64  efore SQLite.# d
3550: 65 6c 65 74 65 73 20 74 68 65 20 6d 61 73 74 65  eletes the maste
3560: 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 63 6f 6d  r-journal to com
3570: 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  mit a multi-file
3580: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
3590: 23 20 49 6e 20 73 75 62 73 65 71 75 65 6e 74 20  # In subsequent 
35a0: 74 65 73 74 20 63 61 73 65 73 2c 20 69 6e 76 6f  test cases, invo
35b0: 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69 6d 5f 72  king [faultsim_r
35c0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
35d0: 6e 5d 20 73 65 74 73 0a 23 20 75 70 20 74 68 65  n] sets.# up the
35e0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
35f0: 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64 61 74 61  contain two data
3600: 62 61 73 65 73 2c 20 74 77 6f 20 68 6f 74 2d 6a  bases, two hot-j
3610: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 6e 64  ournal files and
3620: 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72  .# a master-jour
3630: 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  nal..#.do_test p
3640: 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b 0a 20 20  ager1.4.2.1 {.  
3650: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3660: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3670: 66 73 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  fs filter xDelet
3680: 65 0a 20 20 74 73 74 76 66 73 20 73 63 72 69 70  e.  tstvfs scrip
3690: 74 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63  t xDeleteCallbac
36a0: 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c 65 74 65  k.  proc xDelete
36b0: 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64  Callback {method
36c0: 20 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20   file args} {.  
36d0: 20 20 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65    set file [file
36e0: 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20   tail $file].   
36f0: 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 6d 61   if { [string ma
3700: 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c 65 5d 20  tch *mj* $file] 
3710: 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  } { faultsim_sav
3720: 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  e }.  }.  faults
3730: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
3740: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
3750: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
3760: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3770: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
3780: 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50  2' AS aux;.    P
3790: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
37a0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
37b0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 63 61 63   PRAGMA main.cac
37c0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37d0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 63 61 63    PRAGMA aux.cac
37e0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3800: 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  1(a UNIQUE, b UN
3810: 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54  IQUE);.    CREAT
3820: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61  E TABLE aux.t2(a
3830: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
3840: 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  E);.    INSERT I
3850: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
3860: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
3870: 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20  tring(300));.   
3880: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3890: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38a0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38b0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
38c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
38d0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38e0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
3900: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3910: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3920: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
3930: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3940: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
3950: 67 28 32 30 31 29 2c 20 61 5f 73 74 72 69 6e 67  g(201), a_string
3960: 28 33 30 31 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (301) FROM t1;. 
3970: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3980: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
3990: 69 6e 67 28 32 30 32 29 2c 20 61 5f 73 74 72 69  ing(202), a_stri
39a0: 6e 67 28 33 30 32 29 20 46 52 4f 4d 20 74 31 3b  ng(302) FROM t1;
39b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
39c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
39d0: 74 72 69 6e 67 28 32 30 33 29 2c 20 61 5f 73 74  tring(203), a_st
39e0: 72 69 6e 67 28 33 30 33 29 20 46 52 4f 4d 20 74  ring(303) FROM t
39f0: 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  1;.      INSERT 
3a00: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
3a10: 5f 73 74 72 69 6e 67 28 32 30 34 29 2c 20 61 5f  _string(204), a_
3a20: 73 74 72 69 6e 67 28 33 30 34 29 20 46 52 4f 4d  string(304) FROM
3a30: 20 74 31 3b 0a 20 20 20 20 20 20 52 45 50 4c 41   t1;.      REPLA
3a40: 43 45 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  CE INTO t2 SELEC
3a50: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
3a60: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64   COMMIT;.  }.  d
3a70: 62 20 63 6c 6f 73 65 0a 20 20 74 73 74 76 66 73  b close.  tstvfs
3a80: 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 0a 69 66   delete.} {}..if
3a90: 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
3aa0: 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69  m(platform)!="wi
3ab0: 6e 64 6f 77 73 22 7d 20 7b 0a 64 6f 5f 74 65 73  ndows"} {.do_tes
3ac0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 32 20 7b  t pager1.4.2.2 {
3ad0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
3ae0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
3af0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3b00: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3b10: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3b20: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3b30: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d  ck;.  }.} {4 ok}
3b40: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
3b50: 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75 6c 74 73  4.2.3 {.  faults
3b60: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
3b70: 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61 63 68 20  eopen.  foreach 
3b80: 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2d  f [glob test.db-
3b90: 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65  mj*] { forcedele
3ba0: 74 65 20 24 66 20 7d 0a 20 20 65 78 65 63 73 71  te $f }.  execsq
3bb0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  l {.    SELECT c
3bc0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
3bd0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
3be0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
3bf0: 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f 5f 74 65  .} {64 ok}.do_te
3c00: 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 34 20  st pager1.4.2.4 
3c10: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
3c20: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
3c30: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
3c40: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
3c50: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
3c60: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d  est.db-journal]-
3c70: 32 30 5d 20 31 32 33 34 35 36 0a 20 20 65 78 65  20] 123456.  exe
3c80: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3c90: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3ca0: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3cb0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3cc0: 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f    }.} {4 ok}.do_
3cd0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3ce0: 35 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  5 {.  faultsim_r
3cf0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3d00: 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  n.  hexio_write 
3d10: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
3d20: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
3d30: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3d40: 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20 66  ]-20] 123456.  f
3d50: 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 74  oreach f [glob t
3d60: 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f  est.db-mj*] { fo
3d70: 72 63 65 64 65 6c 65 74 65 20 24 66 20 7d 0a 20  rcedelete $f }. 
3d80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3d90: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3da0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3db0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3dc0: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d  ck;.  }.} {4 ok}
3dd0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  .}..do_test page
3de0: 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20 74 65 73  r1.4.3.1 {.  tes
3df0: 74 76 66 73 20 74 73 74 76 66 73 20 2d 64 65 66  tvfs tstvfs -def
3e00: 61 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73 20  ault 1.  tstvfs 
3e10: 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74  filter xSync.  t
3e20: 73 74 76 66 73 20 73 63 72 69 70 74 20 78 53 79  stvfs script xSy
3e30: 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f  ncCallback.  pro
3e40: 63 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 20  c xSyncCallback 
3e50: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72 67  {method file arg
3e60: 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c  s} {.    set fil
3e70: 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  e [file tail $fi
3e80: 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 30 3d 3d  le].    if { 0==
3e90: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a  [string match *j
3ea0: 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d 20 7d 20  ournal $file] } 
3eb0: 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20  { faultsim_save 
3ec0: 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  }.  }.  faultsim
3ed0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
3ee0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
3ef0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
3f00: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
3f10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3f20: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
3f30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3f40: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
3f50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3f60: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
3f70: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  }.  db close.  t
3f80: 73 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b  stvfs delete.} {
3f90: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6f  }..foreach {tn o
3fa0: 66 73 74 20 76 61 6c 75 65 20 72 65 73 75 6c 74  fst value result
3fb0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 32 20  } {.          2 
3fc0: 20 20 32 30 20 20 20 20 33 31 20 20 20 20 20 20    20    31      
3fd0: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20   {1 2 3 4}.     
3fe0: 20 20 20 20 20 33 20 20 20 32 30 20 20 20 20 33       3   20    3
3ff0: 32 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  2       {1 2 3 4
4000: 7d 0a 20 20 20 20 20 20 20 20 20 20 34 20 20 20  }.          4   
4010: 32 30 20 20 20 20 33 33 20 20 20 20 20 20 20 7b  20    33       {
4020: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4030: 20 20 20 35 20 20 20 32 30 20 20 20 20 36 35 35     5   20    655
4040: 33 36 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  36    {1 2 3 4}.
4050: 20 20 20 20 20 20 20 20 20 20 36 20 20 20 32 30            6   20
4060: 20 20 20 20 31 33 31 30 37 32 20 20 20 7b 31 20      131072   {1 
4070: 32 20 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20  2 3 4}..        
4080: 20 20 37 20 20 20 32 34 20 20 20 20 35 31 31 20    7   24    511 
4090: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20       {1 2 3 4}. 
40a0: 20 20 20 20 20 20 20 20 20 38 20 20 20 32 34 20           8   24 
40b0: 20 20 20 35 31 33 20 20 20 20 20 20 7b 31 20 32     513      {1 2
40c0: 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20   3 4}.          
40d0: 39 20 20 20 32 34 20 20 20 20 31 33 31 30 37 32  9   24    131072
40e0: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20     {1 2 3 4}..  
40f0: 20 20 20 20 20 20 20 31 30 20 20 20 33 32 20 20         10   32  
4100: 20 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 7d    65536    {1 2}
4110: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  .} {.  do_test p
4120: 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e 20 7b 0a  ager1.4.3.$tn {.
4130: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
4140: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
4150: 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20      hexio_write 
4160: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
4170: 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74 20 25 2e  $ofst [format %.
4180: 38 78 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 65  8x $value].    e
4190: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
41a0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
41b0: 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20 63 6c 6f  $result.}.db clo
41c0: 73 65 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56  se..# Set up a V
41d0: 46 53 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  FS that snapshot
41e0: 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
41f0: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 61 20  m just before a 
4200: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 23  master journal.#
4210: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
4220: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75 6c   to commit a mul
4230: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
4240: 69 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c 6c  ion. Specificall
4250: 79 2c 20 74 68 65 0a 23 20 66 69 6c 65 2d 73 79  y, the.# file-sy
4260: 73 74 65 6d 20 69 73 20 73 61 76 65 64 20 6a 75  stem is saved ju
4270: 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 78 44  st before the xD
4280: 65 6c 65 74 65 28 29 20 63 61 6c 6c 20 74 6f 20  elete() call to 
4290: 72 65 6d 6f 76 65 20 74 68 65 20 0a 23 20 6d 61  remove the .# ma
42a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
42b0: 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d  e from the file-
42c0: 73 79 73 74 65 6d 2e 0a 23 0a 74 65 73 74 76 66  system..#.testvf
42d0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
42e0: 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f  tv script copy_o
42f0: 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73 65 74 20  n_mj_delete.set 
4300: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65  ::mj_filename_le
4310: 6e 67 74 68 20 30 0a 70 72 6f 63 20 63 6f 70 79  ngth 0.proc copy
4320: 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d  _on_mj_delete {m
4330: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
4340: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
4350: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20  ring match *mj* 
4360: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
4370: 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73  name]]} { .    s
4380: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
4390: 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67 20  _length [string 
43a0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65  length $filename
43b0: 5d 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73  ].    faultsim_s
43c0: 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave .  }.  retur
43d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 73  n SQLITE_OK.}..s
43e0: 65 74 20 70 77 64 20 5b 70 77 64 5d 0a 66 6f 72  et pwd [pwd].for
43f0: 65 61 63 68 20 7b 74 6e 31 20 74 63 6c 7d 20 7b  each {tn1 tcl} {
4400: 0a 20 20 31 20 7b 20 73 65 74 20 70 72 65 66 69  .  1 { set prefi
4410: 78 20 22 74 65 73 74 2e 64 62 22 20 7d 0a 20 20  x "test.db" }.  
4420: 32 20 7b 20 0a 20 20 20 20 23 20 54 68 69 73 20  2 { .    # This 
4430: 74 65 73 74 20 64 65 70 65 6e 64 73 20 6f 6e 20  test depends on 
4440: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  the underlying V
4450: 46 53 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f  FS being able to
4460: 20 6f 70 65 6e 20 70 61 74 68 73 0a 20 20 20 20   open paths.    
4470: 23 20 35 31 32 20 62 79 74 65 73 20 69 6e 20 6c  # 512 bytes in l
4480: 65 6e 67 74 68 2e 20 54 68 65 20 69 64 65 61 20  ength. The idea 
4490: 69 73 20 74 6f 20 63 72 65 61 74 65 20 61 20 68  is to create a h
44a0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
44b0: 74 68 61 74 0a 20 20 20 20 23 20 63 6f 6e 74 61  that.    # conta
44c0: 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75  ins a master-jou
44d0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20  rnal pointer so 
44e0: 6c 61 72 67 65 20 74 68 61 74 20 69 74 20 63 6f  large that it co
44f0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  uld contain.    
4500: 23 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 72  # a valid page r
4510: 65 63 6f 72 64 20 28 69 66 20 74 68 65 20 66 69  ecord (if the fi
4520: 6c 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  le page-size is 
4530: 35 31 32 20 62 79 74 65 73 29 2e 20 53 6f 20 61  512 bytes). So a
4540: 73 20 74 6f 0a 20 20 20 20 23 20 6d 61 6b 65 20  s to.    # make 
4550: 73 75 72 65 20 53 51 4c 69 74 65 20 64 6f 65 73  sure SQLite does
4560: 6e 27 74 20 67 65 74 20 63 6f 6e 66 75 73 65 64  n't get confused
4570: 20 62 79 20 74 68 69 73 2e 0a 20 20 20 20 23 0a   by this..    #.
4580: 20 20 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67      set nPadding
4590: 20 5b 65 78 70 72 20 35 31 31 20 2d 20 24 3a 3a   [expr 511 - $::
45a0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67  mj_filename_leng
45b0: 74 68 5d 0a 20 20 20 20 69 66 20 7b 24 74 63 6c  th].    if {$tcl
45c0: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
45d0: 72 6d 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d 20  rm)=="windows"} 
45e0: 7b 0a 20 20 20 20 20 20 23 20 54 42 44 20 6e 65  {.      # TBD ne
45f0: 65 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  ed to figure out
4600: 20 68 6f 77 20 74 6f 20 64 6f 20 74 68 69 73 20   how to do this 
4610: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 57 69  correctly for Wi
4620: 6e 64 6f 77 73 21 21 21 0a 20 20 20 20 20 20 73  ndows!!!.      s
4630: 65 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70  et nPadding [exp
4640: 72 20 32 35 35 20 2d 20 24 3a 3a 6d 6a 5f 66 69  r 255 - $::mj_fi
4650: 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20  lename_length]. 
4660: 20 20 20 7d 0a 0a 20 20 20 20 23 20 57 65 20 63     }..    # We c
4670: 61 6e 6e 6f 74 20 6a 75 73 74 20 63 72 65 61 74  annot just creat
4680: 65 20 61 20 72 65 61 6c 6c 79 20 6c 6f 6e 67 20  e a really long 
4690: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
46a0: 6d 65 20 74 6f 20 6f 70 65 6e 2c 20 61 73 0a 20  me to open, as. 
46b0: 20 20 20 23 20 4c 69 6e 75 78 20 6c 69 6d 69 74     # Linux limit
46c0: 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70 6f  s a single compo
46d0: 6e 65 6e 74 20 6f 66 20 61 20 70 61 74 68 20 74  nent of a path t
46e0: 6f 20 32 35 35 20 62 79 74 65 73 20 62 79 20 64  o 255 bytes by d
46f0: 65 66 61 75 6c 74 0a 20 20 20 20 23 20 28 61 6e  efault.    # (an
4700: 64 20 70 72 65 73 75 6d 61 62 6c 79 20 6f 74 68  d presumably oth
4710: 65 72 20 73 79 73 74 65 6d 73 20 68 61 76 65 20  er systems have 
4720: 6c 69 6d 69 74 73 20 74 6f 6f 29 2e 20 53 6f 20  limits too). So 
4730: 63 72 65 61 74 65 20 61 20 64 69 72 65 63 74 6f  create a directo
4740: 72 79 0a 20 20 20 20 23 20 68 69 65 72 61 72 63  ry.    # hierarc
4750: 68 79 20 74 6f 20 77 6f 72 6b 20 69 6e 2e 0a 20  hy to work in.. 
4760: 20 20 20 23 0a 20 20 20 20 73 65 74 20 64 69 72     #.    set dir
4770: 6e 61 6d 65 20 22 64 31 32 33 34 35 36 37 38 39  name "d123456789
4780: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
4790: 36 37 38 39 30 2f 22 0a 20 20 20 20 73 65 74 20  67890/".    set 
47a0: 6e 44 69 72 20 5b 65 78 70 72 20 24 6e 50 61 64  nDir [expr $nPad
47b0: 64 69 6e 67 20 2f 20 33 32 5d 0a 20 20 20 20 69  ding / 32].    i
47c0: 66 20 7b 20 24 6e 44 69 72 20 7d 20 7b 0a 20 20  f { $nDir } {.  
47d0: 20 20 20 20 73 65 74 20 70 20 5b 73 74 72 69 6e      set p [strin
47e0: 67 20 72 65 70 65 61 74 20 24 64 69 72 6e 61 6d  g repeat $dirnam
47f0: 65 20 24 6e 44 69 72 5d 0a 20 20 20 20 20 20 66  e $nDir].      f
4800: 69 6c 65 20 6d 6b 64 69 72 20 24 70 0a 20 20 20  ile mkdir $p.   
4810: 20 20 20 63 64 20 24 70 0a 20 20 20 20 7d 0a 0a     cd $p.    }..
4820: 20 20 20 20 73 65 74 20 70 61 64 64 69 6e 67 20      set padding 
4830: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78  [string repeat x
4840: 20 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67   [expr $nPadding
4850: 20 25 33 32 5d 5d 0a 20 20 20 20 73 65 74 20 70   %32]].    set p
4860: 72 65 66 69 78 20 22 74 65 73 74 2e 64 62 24 7b  refix "test.db${
4870: 70 61 64 64 69 6e 67 7d 22 0a 20 20 7d 0a 7d 20  padding}".  }.} 
4880: 7b 0a 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20  {.  eval $tcl.  
4890: 66 6f 72 65 61 63 68 20 7b 74 6e 32 20 73 71 6c  foreach {tn2 sql
48a0: 7d 20 7b 0a 20 20 20 20 6f 20 7b 20 0a 20 20 20  } {.    o { .   
48b0: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73     PRAGMA main.s
48c0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a  ynchronous=OFF;.
48d0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
48e0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46  .synchronous=OFF
48f0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
4900: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
4910: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LETE;.    }.    
4920: 6f 35 31 32 20 7b 20 0a 20 20 20 20 20 20 50 52  o512 { .      PR
4930: 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72  AGMA main.synchr
4940: 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20  onous=OFF;.     
4950: 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63   PRAGMA aux.sync
4960: 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20  hronous=OFF;.   
4970: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70     PRAGMA main.p
4980: 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a  age_size = 512;.
4990: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
49a0: 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32  .page_size = 512
49b0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
49c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
49d0: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LETE;.    }.    
49e0: 6e 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d  n { .      PRAGM
49f0: 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f  A main.synchrono
4a00: 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  us=NORMAL;.     
4a10: 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63   PRAGMA aux.sync
4a20: 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a  hronous=NORMAL;.
4a30: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
4a40: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
4a50: 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 20  TE;.    }.    f 
4a60: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
4a70: 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73  main.synchronous
4a80: 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41  =FULL;.      PRA
4a90: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
4aa0: 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ous=FULL;.      
4ab0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
4ac0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
4ad0: 20 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 73    }.  } {..    s
4ae0: 65 74 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24 7b  et tn "${tn1}.${
4af0: 74 6e 32 7d 22 0a 20 20 0a 20 20 20 20 23 20 53  tn2}".  .    # S
4b00: 65 74 20 75 70 20 61 20 63 6f 6e 6e 65 63 74 69  et up a connecti
4b10: 6f 6e 20 74 6f 20 68 61 76 65 20 74 77 6f 20 64  on to have two d
4b20: 61 74 61 62 61 73 65 73 2c 20 74 65 73 74 2e 64  atabases, test.d
4b30: 62 20 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20 20  b (main) and .  
4b40: 20 20 23 20 74 65 73 74 2e 64 62 32 20 28 61 75    # test.db2 (au
4b50: 78 29 2e 20 54 68 65 6e 20 72 75 6e 20 61 20 6d  x). Then run a m
4b60: 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
4b70: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20 54  ction on them. T
4b80: 68 65 0a 20 20 20 20 23 20 56 46 53 20 77 69 6c  he.    # VFS wil
4b90: 6c 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66  l snapshot the f
4ba0: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20  ile-system just 
4bb0: 62 65 66 6f 72 65 20 74 68 65 20 6d 61 73 74 65  before the maste
4bc0: 72 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23 20  r-journal.    # 
4bd0: 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
4be0: 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
4bf0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 23  ansaction..    #
4c00: 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 78  .    tv filter x
4c10: 44 65 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74 65  Delete.    do_te
4c20: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
4c30: 6e 2e 31 20 7b 0a 20 20 20 20 20 20 66 61 75 6c  n.1 {.      faul
4c40: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
4c50: 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20  reopen $prefix. 
4c60: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20       execsql ". 
4c70: 20 20 20 20 20 20 20 41 54 54 41 43 48 20 27 24         ATTACH '$
4c80: 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75  {prefix}2' AS au
4c90: 78 3b 0a 20 20 20 20 20 20 20 20 24 73 71 6c 0a  x;.        $sql.
4ca0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
4cb0: 41 42 4c 45 20 61 28 78 29 3b 0a 20 20 20 20 20  ABLE a(x);.     
4cc0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4cd0: 61 75 78 2e 62 28 78 29 3b 0a 20 20 20 20 20 20  aux.b(x);.      
4ce0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20    INSERT INTO a 
4cf0: 56 41 4c 55 45 53 28 27 64 6f 75 62 6c 65 2d 79  VALUES('double-y
4d00: 6f 75 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  ou');.        IN
4d10: 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55  SERT INTO a VALU
4d20: 45 53 28 27 77 68 79 27 29 3b 0a 20 20 20 20 20  ES('why');.     
4d30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
4d40: 20 56 41 4c 55 45 53 28 27 7a 65 64 27 29 3b 0a   VALUES('zed');.
4d50: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4d60: 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 77 6f  NTO b VALUES('wo
4d70: 6e 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  n');.        INS
4d80: 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45  ERT INTO b VALUE
4d90: 53 28 27 74 6f 6f 27 29 3b 0a 20 20 20 20 20 20  S('too');.      
4da0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
4db0: 56 41 4c 55 45 53 28 27 66 72 65 65 27 29 3b 0a  VALUES('free');.
4dc0: 20 20 20 20 20 20 22 0a 20 20 20 20 20 20 65 78        ".      ex
4dd0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20  ecsql {.        
4de0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 20  BEGIN;.         
4df0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 53   INSERT INTO a S
4e00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 20 57  ELECT * FROM b W
4e10: 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20  HERE rowid<=3;. 
4e20: 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20           INSERT 
4e30: 49 4e 54 4f 20 62 20 53 45 4c 45 43 54 20 2a 20  INTO b SELECT * 
4e40: 46 52 4f 4d 20 61 20 57 48 45 52 45 20 72 6f 77  FROM a WHERE row
4e50: 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 43  id<=3;.        C
4e60: 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20  OMMIT;.      }. 
4e70: 20 20 20 7d 20 7b 7d 0a 20 20 20 20 74 76 20 66     } {}.    tv f
4e80: 69 6c 74 65 72 20 7b 7d 0a 20 20 20 20 0a 20 20  ilter {}.    .  
4e90: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74    # Check that t
4ea0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
4eb0: 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 73 75 63  as committed suc
4ec0: 63 65 73 73 66 75 6c 6c 79 2e 0a 20 20 20 20 23  cessfully..    #
4ed0: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
4ee0: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
4ef0: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 53 45  $tn.2 {.      SE
4f00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20  LECT * FROM a.  
4f10: 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20    } {double-you 
4f20: 77 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20  why zed won too 
4f30: 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65  free}.    do_exe
4f40: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
4f50: 2d 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  -4.4.$tn.3 {.   
4f60: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4f70: 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f   b.    } {won to
4f80: 6f 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f  o free double-yo
4f90: 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 0a  u why zed}.    .
4fa0: 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74 68      # Restore th
4fb0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e  e file-system an
4fc0: 64 20 72 65 6f 70 65 6e 20 74 68 65 20 64 61 74  d reopen the dat
4fd0: 61 62 61 73 65 73 2e 20 43 68 65 63 6b 20 74 68  abases. Check th
4fe0: 61 74 20 69 74 20 6e 6f 77 0a 20 20 20 20 23 20  at it now.    # 
4ff0: 61 70 70 65 61 72 73 20 74 68 61 74 20 74 68 65  appears that the
5000: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
5010: 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 20 28   not committed (
5020: 62 65 63 61 75 73 65 20 74 68 65 20 66 69 6c 65  because the file
5030: 2d 73 79 73 74 65 6d 0a 20 20 20 20 23 20 77 61  -system.    # wa
5040: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68  s restored to th
5050: 65 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  e state where it
5060: 20 68 61 64 20 6e 6f 74 20 62 65 65 6e 29 2e 0a   had not been)..
5070: 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73      #.    do_tes
5080: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
5090: 2e 34 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74  .4 {.      fault
50a0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
50b0: 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20  reopen $prefix. 
50c0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 41 54       execsql "AT
50d0: 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32  TACH '${prefix}2
50e0: 27 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20  ' AS aux".    } 
50f0: 7b 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71  {}.    do_execsq
5100: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  l_test pager1-4.
5110: 34 2e 24 74 6e 2e 35 20 7b 53 45 4c 45 43 54 20  4.$tn.5 {SELECT 
5120: 2a 20 46 52 4f 4d 20 61 7d 20 7b 64 6f 75 62 6c  * FROM a} {doubl
5130: 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20  e-you why zed}. 
5140: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
5150: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5160: 6e 2e 36 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  n.6 {SELECT * FR
5170: 4f 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66  OM b} {won too f
5180: 72 65 65 7d 0a 20 20 20 20 0a 20 20 20 20 23 20  ree}.    .    # 
5190: 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  Restore the file
51a0: 2d 73 79 73 74 65 6d 20 61 67 61 69 6e 2e 20 54  -system again. T
51b0: 68 69 73 20 74 69 6d 65 2c 20 62 65 66 6f 72 65  his time, before
51c0: 20 72 65 6f 70 65 6e 69 6e 67 20 74 68 65 20 64   reopening the d
51d0: 61 74 61 62 61 73 65 73 2c 0a 20 20 20 20 23 20  atabases,.    # 
51e0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
51f0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r-journal file f
5200: 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73  rom the file-sys
5210: 74 65 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70 65  tem. It now appe
5220: 61 72 73 20 74 68 61 74 0a 20 20 20 20 23 20 74  ars that.    # t
5230: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
5240: 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e 6f  as committed (no
5250: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5260: 66 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c 62  file == no rollb
5270: 61 63 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20 20  ack)..    #.    
5280: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  do_test pager1-4
5290: 2e 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 20  .4.$tn.7 {.     
52a0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
52b0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72  e_and_reopen $pr
52c0: 65 66 69 78 0a 20 20 20 20 20 20 66 6f 72 65 61  efix.      forea
52d0: 63 68 20 66 20 5b 67 6c 6f 62 20 24 7b 70 72 65  ch f [glob ${pre
52e0: 66 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63  fix}-mj*] { forc
52f0: 65 64 65 6c 65 74 65 20 24 66 20 7d 0a 20 20 20  edelete $f }.   
5300: 20 20 20 65 78 65 63 73 71 6c 20 22 41 54 54 41     execsql "ATTA
5310: 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32 27 20  CH '${prefix}2' 
5320: 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d  AS aux".    } {}
5330: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
5340: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
5350: 24 74 6e 2e 38 20 7b 0a 20 20 20 20 20 20 53 45  $tn.8 {.      SE
5360: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20  LECT * FROM a.  
5370: 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20    } {double-you 
5380: 77 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20  why zed won too 
5390: 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65  free}.    do_exe
53a0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
53b0: 2d 34 2e 34 2e 24 74 6e 2e 39 20 7b 0a 20 20 20  -4.4.$tn.9 {.   
53c0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
53d0: 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f   b.    } {won to
53e0: 6f 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f  o free double-yo
53f0: 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 7d 0a 0a  u why zed}.  }..
5400: 20 20 63 64 20 24 70 77 64 0a 7d 0a 64 62 20 63    cd $pwd.}.db c
5410: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 66  lose.tv delete.f
5420: 6f 72 63 65 64 65 6c 65 74 65 20 24 64 69 72 6e  orcedelete $dirn
5430: 61 6d 65 0a 0a 0a 23 20 53 65 74 20 75 70 20 61  ame...# Set up a
5440: 20 56 46 53 20 74 6f 20 6d 61 6b 65 20 61 20 63   VFS to make a c
5450: 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  opy of the file-
5460: 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f  system just befo
5470: 72 65 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20  re deleting a.# 
5480: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
5490: 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  commit a transac
54a0: 74 69 6f 6e 2e 20 54 68 65 20 74 72 61 6e 73 61  tion. The transa
54b0: 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65  ction modifies e
54c0: 78 61 63 74 6c 79 0a 23 20 74 77 6f 20 64 61 74  xactly.# two dat
54d0: 61 62 61 73 65 20 70 61 67 65 73 20 28 61 6e 64  abase pages (and
54e0: 20 70 61 67 65 20 31 20 2d 20 74 68 65 20 63 68   page 1 - the ch
54f0: 61 6e 67 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23  ange counter)..#
5500: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
5510: 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72  ault 1.tv sector
5520: 73 69 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69  size 512.tv scri
5530: 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e  pt copy_on_journ
5540: 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c  al_delete.tv fil
5550: 74 65 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63  ter xDelete.proc
5560: 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c   copy_on_journal
5570: 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20  _delete {method 
5580: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
5590: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  .  if {[string m
55a0: 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66  atch *journal $f
55b0: 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73  ilename]} faults
55c0: 69 6d 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72  im_save .  retur
55d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61  n SQLITE_OK.}.fa
55e0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
55f0: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63  d_reopen.do_exec
5600: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5610: 34 2e 35 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  4.5.1 {.  PRAGMA
5620: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
5630: 44 45 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41  DELETE;.  PRAGMA
5640: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
5650: 34 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  4;.  CREATE TABL
5660: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52  E t1(a, b);.  CR
5670: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
5680: 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   b);.  INSERT IN
5690: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 27  TO t1 VALUES('I'
56a0: 2c 20 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52  , 'II');.  INSER
56b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
56c0: 28 27 49 49 49 27 2c 20 27 49 56 27 29 3b 0a 20  ('III', 'IV');. 
56d0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
56e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
56f0: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
5700: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
5710: 45 53 28 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d  ES(3, 4);.  COMM
5720: 49 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74  IT;.} {delete}.t
5730: 76 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43  v filter {}..# C
5740: 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  heck the transac
5750: 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
5760: 65 64 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ed:.#.do_execsql
5770: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5780: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .2 {.  SELECT * 
5790: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
57a0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
57b0: 49 20 49 49 20 31 20 32 20 49 49 49 20 49 56 20  I II 1 2 III IV 
57c0: 33 20 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20  3 4}..# Now try 
57d0: 66 6f 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20  four tests:.#.# 
57e0: 20 70 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52   pager1-4.5.3: R
57f0: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5800: 73 79 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68  system. Check th
5810: 61 74 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  at the whole tra
5820: 6e 73 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20  nsaction .#     
5830: 20 20 20 20 20 20 20 20 20 20 20 69 73 20 72 6f             is ro
5840: 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20  lled back..#.#  
5850: 70 61 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65  pager1-4.5.4: Re
5860: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73  store the file-s
5870: 79 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74  ystem. Corrupt t
5880: 68 65 20 66 69 72 73 74 20 72 65 63 6f 72 64 20  he first record 
5890: 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  in the.#        
58a0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e          journal.
58b0: 20 43 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73   Check the trans
58c0: 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f  action is not ro
58d0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20  lled back..#.#  
58e0: 70 61 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65  pager1-4.5.5: Re
58f0: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73  store the file-s
5900: 79 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74  ystem. Corrupt t
5910: 68 65 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64  he second record
5920: 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20   in the.#       
5930: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
5940: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  . Check that the
5950: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
5960: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
5970: 20 69 73 20 0a 23 20 20 20 20 20 20 20 20 20 20   is .#          
5980: 20 20 20 20 20 20 70 6c 61 79 65 64 20 62 61 63        played bac
5990: 6b 2c 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73  k, but not the s
59a0: 65 63 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65  econd..#.#  page
59b0: 72 31 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72  r1-4.5.6: Restor
59c0: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
59d0: 6d 2e 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74  m. Try to open t
59e0: 68 65 20 64 61 74 61 62 61 73 65 20 77 69 74 68  he database with
59f0: 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20   a.#            
5a00: 20 20 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e      readonly con
5a10: 6e 65 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68  nection. This sh
5a20: 6f 75 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20  ould fail, as a 
5a30: 72 65 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20  read-only.#     
5a40: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65             conne
5a50: 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c  ction cannot rol
5a60: 6c 20 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  l back the datab
5a70: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c  ase file..#.faul
5a80: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5a90: 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73  _reopen.do_execs
5aa0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5ab0: 2e 35 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.3 {.  SELECT 
5ac0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
5ad0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
5ae0: 20 7b 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66   {I II III IV}.f
5af0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
5b00: 61 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f  and_reopen.hexio
5b10: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a  _write test.db-j
5b20: 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32  ournal [expr 512
5b30: 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30  +4+1024 - 202] 0
5b40: 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0a  123456789ABCDEF.
5b50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5b60: 70 61 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20  pager1.4.5.4 {. 
5b70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5b80: 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  1;.  SELECT * FR
5b90: 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31  OM t2;.} {I II 1
5ba0: 20 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66   2 III IV 3 4}.f
5bb0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
5bc0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f  and_reopen.hexio
5bd0: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a  _write test.db-j
5be0: 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32  ournal [expr 512
5bf0: 2b 34 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34  +4+1024+4+4+1024
5c00: 20 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37   - 202] 01234567
5c10: 38 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63  89ABCDEF.do_exec
5c20: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5c30: 34 2e 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54  4.5.5 {.  SELECT
5c40: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
5c50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
5c60: 7d 20 7b 49 20 49 49 20 49 49 49 20 49 56 20 33  } {I II III IV 3
5c70: 20 34 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65   4}..faultsim_re
5c80: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5c90: 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65  .db close.sqlite
5ca0: 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65  3 db test.db -re
5cb0: 61 64 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63  adonly 1.do_catc
5cc0: 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  hsql_test pager1
5cd0: 2e 34 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43  .4.5.6 {.  SELEC
5ce0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53  T * FROM t1;.  S
5cf0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
5d00: 0a 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20  .} {1 {disk I/O 
5d10: 65 72 72 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65  error}}.db close
5d20: 0a 0a 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65  ..# Snapshot the
5d30: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73   file-system jus
5d40: 74 20 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66  t before multi-f
5d50: 69 6c 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65  ile commit. Save
5d60: 20 74 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74   the name.# of t
5d70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5d80: 6c 20 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f  l file in $::mj_
5d90: 66 69 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73  filename..#.tv s
5da0: 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a  cript copy_on_mj
5db0: 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65  _delete.tv filte
5dc0: 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63  r xDelete.proc c
5dd0: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
5de0: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
5df0: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
5e00: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d  [string match *m
5e10: 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  j* [file tail $f
5e20: 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20  ilename]]} { .  
5e30: 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e    set ::mj_filen
5e40: 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20  ame $filename.  
5e50: 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20    faultsim_save 
5e60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5e70: 4c 49 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73  LITE_OK.}.do_tes
5e80: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b  t pager1.4.6.1 {
5e90: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
5ea0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
5eb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
5ec0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
5ed0: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20  e = DELETE;.    
5ee0: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32  ATTACH 'test.db2
5ef0: 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20 43 52  ' AS two;.    CR
5f00: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
5f10: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
5f20: 54 41 42 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20  TABLE two.t2(a, 
5f30: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
5f40: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
5f50: 20 27 74 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e   't1.1');.    IN
5f60: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
5f70: 55 45 53 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a  UES(1, 't2.1');.
5f80: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
5f90: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
5fa0: 20 3d 20 27 74 31 2e 32 27 3b 0a 20 20 20 20 20   = 't1.2';.     
5fb0: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62   UPDATE t2 SET b
5fc0: 20 3d 20 27 74 32 2e 32 27 3b 0a 20 20 20 20 43   = 't2.2';.    C
5fd0: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20  OMMIT;.  }.  tv 
5fe0: 66 69 6c 74 65 72 20 7b 7d 0a 20 20 64 62 20 63  filter {}.  db c
5ff0: 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74  lose.} {}..fault
6000: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
6010: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
6020: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
6030: 36 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  6.2 { SELECT * F
6040: 52 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20  ROM t1 }        
6050: 20 20 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74     {1 t1.1}.do_t
6060: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
6070: 72 31 2e 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20  r1.4.6.3 { file 
6080: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
6090: 65 6e 61 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65  ename } {1}.do_e
60a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
60b0: 72 31 2e 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54  r1.4.6.4 {.  ATT
60c0: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
60d0: 53 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20  S two;.  SELECT 
60e0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20  * FROM t2;.} {1 
60f0: 74 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61  t2.1}.do_test pa
6100: 67 65 72 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c  ger1.4.6.5 { fil
6110: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
6120: 69 6c 65 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66  ilename } {0}..f
6130: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
6140: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c  and_reopen.db cl
6150: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ose.do_test page
6160: 72 31 2e 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74  r1.4.6.8 {.  set
6170: 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20   ::mj_filename1 
6180: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20  $::mj_filename. 
6190: 20 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65   tv filter xDele
61a0: 74 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  te.  sqlite3 db 
61b0: 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73  test.db2.  execs
61c0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
61d0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
61e0: 45 4c 45 54 45 3b 0a 20 20 20 20 41 54 54 41 43  ELETE;.    ATTAC
61f0: 48 20 27 74 65 73 74 2e 64 62 33 27 20 41 53 20  H 'test.db3' AS 
6200: 74 68 72 65 65 3b 0a 20 20 20 20 43 52 45 41 54  three;.    CREAT
6210: 45 20 54 41 42 4c 45 20 74 68 72 65 65 2e 74 33  E TABLE three.t3
6220: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
6230: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
6240: 53 28 31 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20  S(1, 't3.1');.  
6250: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55    BEGIN;.      U
6260: 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d  PDATE t2 SET b =
6270: 20 27 74 32 2e 33 27 3b 0a 20 20 20 20 20 20 55   't2.3';.      U
6280: 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d  PDATE t3 SET b =
6290: 20 27 74 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d   't3.3';.    COM
62a0: 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20  MIT;.  }.  expr 
62b0: 7b 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31  {$::mj_filename1
62c0: 20 21 3d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61   != $::mj_filena
62d0: 6d 65 7d 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73  me}.} {1}.faults
62e0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
62f0: 65 6f 70 65 6e 0a 74 76 20 66 69 6c 74 65 72 20  eopen.tv filter 
6300: 7b 7d 0a 0a 23 20 54 68 65 20 66 69 6c 65 2d 73  {}..# The file-s
6310: 79 73 74 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69  ystem now contai
6320: 6e 73 3a 0a 23 0a 23 20 20 20 2a 20 74 68 72 65  ns:.#.#   * thre
6330: 65 20 64 61 74 61 62 61 73 65 73 0a 23 20 20 20  e databases.#   
6340: 2a 20 74 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72  * three hot-jour
6350: 6e 61 6c 20 66 69 6c 65 73 0a 23 20 20 20 2a 20  nal files.#   * 
6360: 74 77 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  two master-journ
6370: 61 6c 20 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68  al files..#.# Th
6380: 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61  e hot-journals a
6390: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
63a0: 65 73 74 2e 64 62 32 20 61 6e 64 20 74 65 73 74  est.db2 and test
63b0: 2e 64 62 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20  .db3 point to.# 
63c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24  master journal $
63d0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54  ::mj_filename. T
63e0: 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  he hot-journal f
63f0: 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
6400: 69 74 68 0a 23 20 74 65 73 74 2e 64 62 20 70 6f  ith.# test.db po
6410: 69 6e 74 73 20 74 6f 20 6d 61 73 74 65 72 20 6a  ints to master j
6420: 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c  ournal $::mj_fil
6430: 65 6e 61 6d 65 31 2e 20 53 6f 20 72 65 61 64 69  ename1. So readi
6440: 6e 67 20 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64  ng from.# test.d
6450: 62 20 73 68 6f 75 6c 64 20 64 65 6c 65 74 65 20  b should delete 
6460: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e  $::mj_filename1.
6470: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
6480: 31 2e 34 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72  1.4.6.9 {.  lsor
6490: 74 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a  t [glob test.db*
64a0: 5d 0a 7d 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74  ].} [lsort [list
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 20 20 20 20 20 20 20 20                  
64d0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74             \.  t
64e0: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 20  est.db test.db2 
64f0: 74 65 73 74 2e 64 62 33 20 20 20 20 20 20 20 20  test.db3        
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64        \.  test.d
6520: 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64  b-journal test.d
6530: 62 32 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e  b2-journal test.
6540: 64 62 33 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20  db3-journal     
6550: 20 5c 0a 20 20 5b 66 69 6c 65 20 74 61 69 6c 20   \.  [file tail 
6560: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20  $::mj_filename] 
6570: 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a  [file tail $::mj
6580: 5f 66 69 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a  _filename1].]]..
6590: 23 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  # The master-jou
65a0: 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  rnal $::mj_filen
65b0: 61 6d 65 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f  ame1 contains po
65c0: 69 6e 74 65 72 73 20 74 6f 20 74 65 73 74 2e 64  inters to test.d
65d0: 62 20 61 6e 64 20 0a 23 20 74 65 73 74 2e 64 62  b and .# test.db
65e0: 32 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 68  2. However the h
65f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63  ot-journal assoc
6600: 69 61 74 65 64 20 77 69 74 68 20 74 65 73 74 2e  iated with test.
6610: 64 62 32 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20  db2 points to.# 
6620: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
6630: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72  er-journal. Ther
6640: 65 66 6f 72 65 2c 20 72 65 61 64 69 6e 67 20 66  efore, reading f
6650: 72 6f 6d 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79  rom test.db only
6660: 20 73 68 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f   should.# be eno
6670: 75 67 68 20 74 6f 20 63 61 75 73 65 20 53 51 4c  ugh to cause SQL
6680: 69 74 65 20 74 6f 20 64 65 6c 65 74 65 20 24 3a  ite to delete $:
6690: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23  :mj_filename1..#
66a0: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
66b0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b   pager1.4.6.10 {
66c0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
66d0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b  mj_filename  } {
66e0: 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20  1}.do_test      
66f0: 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 31     pager1.4.6.11
6700: 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24   { file exists $
6710: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d  ::mj_filename1 }
6720: 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {1}.do_execsql_
6730: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6740: 31 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  12 { SELECT * FR
6750: 4f 4d 20 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d  OM t1 } {1 t1.1}
6760: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
6770: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b   pager1.4.6.13 {
6780: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
6790: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b  mj_filename  } {
67a0: 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20  1}.do_test      
67b0: 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34     pager1.4.6.14
67c0: 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24   { file exists $
67d0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d  ::mj_filename1 }
67e0: 20 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   {0}..do_execsql
67f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36  _test pager1.4.6
6800: 2e 31 32 20 7b 0a 20 20 41 54 54 41 43 48 20 27  .12 {.  ATTACH '
6810: 74 65 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f  test.db2' AS two
6820: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
6830: 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d  M t2;.} {1 t2.1}
6840: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
6850: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b   pager1.4.6.13 {
6860: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
6870: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b  mj_filename }  {
6880: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
6890: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34  st pager1.4.6.14
68a0: 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73   {.  ATTACH 'tes
68b0: 74 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b  t.db3' AS three;
68c0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
68d0: 20 74 33 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a   t3;.} {1 t3.1}.
68e0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
68f0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20  pager1.4.6.15 { 
6900: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6910: 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30  j_filename }  {0
6920: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  }..db close.tv d
6930: 65 6c 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74  elete..testvfs t
6940: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20  v -default 1.tv 
6950: 73 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74  sectorsize 512.t
6960: 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e  v script copy_on
6970: 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a  _journal_delete.
6980: 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  tv filter xDelet
6990: 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a  e.proc copy_on_j
69a0: 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d  ournal_delete {m
69b0: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
69c0: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
69d0: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72  ring match *jour
69e0: 6e 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20  nal $filename]} 
69f0: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20  faultsim_save . 
6a00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6a10: 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c  K.}.faultsim_del
6a20: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ete_and_reopen.d
6a30: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
6a40: 61 67 65 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20  ager1.4.7.1 {.  
6a50: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
6a60: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
6a70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
6a80: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
6a90: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
6aa0: 58 20 69 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20  X i1 ON t1(y);. 
6ab0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6ac0: 56 41 4c 55 45 53 28 27 49 27 2c 20 20 20 27 6f  VALUES('I',   'o
6ad0: 6e 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ne');.  INSERT I
6ae0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49  NTO t1 VALUES('I
6af0: 49 27 2c 20 20 27 66 6f 75 72 27 29 3b 0a 20 20  I',  'four');.  
6b00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6b10: 41 4c 55 45 53 28 27 49 49 49 27 2c 20 27 6e 69  ALUES('III', 'ni
6b20: 6e 65 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  ne');.  BEGIN;. 
6b30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6b40: 31 20 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27  1 VALUES('IV', '
6b50: 73 69 78 74 65 65 6e 27 29 3b 0a 20 20 20 20 49  sixteen');.    I
6b60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6b70: 4c 55 45 53 28 27 56 27 20 2c 20 27 74 77 65 6e  LUES('V' , 'twen
6b80: 74 79 66 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d  tyfive');.  COMM
6b90: 49 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74  IT;.} {delete}.t
6ba0: 76 20 66 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63  v filter {}.db c
6bb0: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 20 0a  lose.tv delete .
6bc0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
6bd0: 2e 37 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69  .7.2 {.  faultsi
6be0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6bf0: 6f 70 65 6e 0a 20 20 63 61 74 63 68 20 7b 66 69  open.  catch {fi
6c00: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
6c10: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70  st.db-journal -p
6c20: 65 72 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d  ermissions r----
6c30: 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66  ----}.  catch {f
6c40: 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74  ile attributes t
6c50: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d  est.db-journal -
6c60: 72 65 61 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61  readonly 1}.  ca
6c70: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
6c80: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
6c90: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
6ca0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
6cb0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
6cc0: 34 2e 37 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f  4.7.3 {.  db clo
6cd0: 73 65 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65  se.  catch {file
6ce0: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
6cf0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72  .db-journal -per
6d00: 6d 69 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72  missions rw-rw-r
6d10: 77 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c  w-}.  catch {fil
6d20: 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73  e attributes tes
6d30: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65  t.db-journal -re
6d40: 61 64 6f 6e 6c 79 20 30 7d 0a 20 20 64 65 6c 65  adonly 0}.  dele
6d50: 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d  te_file test.db-
6d60: 6a 6f 75 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65  journal.  file e
6d70: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
6d80: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d  urnal.} {0}..#--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
6de0: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 64 65  llowing tests de
6df0: 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 2d 66 69  al with multi-fi
6e00: 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20  le commits..#.# 
6e10: 70 61 67 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68  pager1-5.1.*: Th
6e20: 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
6e30: 75 6c 74 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74  ulti-file cannot
6e40: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 62 65   be committed be
6e50: 63 61 75 73 65 0a 23 20 20 20 20 20 20 20 20 20  cause.#         
6e60: 20 20 20 20 20 20 61 6e 6f 74 68 65 72 20 63 6f        another co
6e70: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
6e80: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
6e90: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a  k on one of the.
6ea0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
6eb0: 66 69 6c 65 73 2e 20 41 66 74 65 72 20 74 68 65  files. After the
6ec0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
6ed0: 72 65 6d 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d  removed, the COM
6ee0: 4d 49 54 20 73 75 63 63 65 65 64 73 2e 0a 23 0a  MIT succeeds..#.
6ef0: 23 20 70 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20  # pager1-5.2.*: 
6f00: 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  Multi-file commi
6f10: 74 73 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  ts with journal_
6f20: 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23  mode=memory..#.#
6f30: 20 70 61 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d   pager1-5.3.*: M
6f40: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
6f50: 73 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  s with journal_m
6f60: 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20  ode=memory..#.# 
6f70: 70 61 67 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68  pager1-5.4.*: Ch
6f80: 65 63 6b 20 74 68 61 74 20 77 69 74 68 20 73 79  eck that with sy
6f90: 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c  nchronous=normal
6fa0: 2c 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  , the master-jou
6fb0: 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20  rnal file.#     
6fc0: 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 20 69            name i
6fd0: 73 20 61 64 64 65 64 20 74 6f 20 61 20 6a 6f 75  s added to a jou
6fe0: 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69  rnal file immedi
6ff0: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
7000: 6c 61 73 74 0a 23 20 20 20 20 20 20 20 20 20 20  last.#          
7010: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63       journal rec
7020: 6f 72 64 2e 20 42 75 74 20 77 69 74 68 20 73 79  ord. But with sy
7030: 6e 63 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20  nchronous=full, 
7040: 65 78 74 72 61 20 75 6e 75 73 65 64 20 73 70 61  extra unused spa
7050: 63 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ce.#            
7060: 20 20 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20     is allocated 
7070: 62 65 74 77 65 65 6e 20 74 68 65 20 6c 61 73 74  between the last
7080: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
7090: 61 6e 64 20 74 68 65 20 0a 23 20 20 20 20 20 20  and the .#      
70a0: 20 20 20 20 20 20 20 20 20 6d 61 73 74 65 72 2d           master-
70b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
70c0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6d 61  e so that the ma
70d0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
70e0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
70f0: 20 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20    name does not 
7100: 6c 69 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  lie on the same 
7110: 73 65 63 74 6f 72 20 61 73 20 74 68 65 20 6c 61  sector as the la
7120: 73 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  st journal file.
7130: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
7140: 72 65 63 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65  record..#.# page
7150: 72 31 2d 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20  r1-5.5.*: Check 
7160: 74 68 61 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  that in journal_
7170: 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 6d 6f 64  mode=PERSIST mod
7180: 65 2c 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e, a journal fil
7190: 65 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20  e is.#          
71a0: 20 20 20 20 20 74 72 75 6e 63 61 74 65 64 20 74       truncated t
71b0: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 77 68 65  o zero bytes whe
71c0: 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  n a multi-file t
71d0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23  ransaction is .#
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
71f0: 6f 6d 6d 69 74 74 65 64 20 28 69 6e 73 74 65 61  ommitted (instea
7200: 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 63  d of the first c
7210: 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 62  ouple of bytes b
7220: 65 69 6e 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a  eing zeroed)..#.
7230: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
7240: 2d 35 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  -5.1.1 {.  fault
7250: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
7260: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
7270: 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  {.    ATTACH 'te
7280: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a  st.db2' AS aux;.
7290: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
72a0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t1(a, b);.    C
72b0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e  REATE TABLE aux.
72c0: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t2(a, b);.    IN
72d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
72e0: 55 45 53 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29  UES(17, 'Lenin')
72f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
7300: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 32 2c 20  O t1 VALUES(22, 
7310: 27 53 74 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49  'Stalin');.    I
7320: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7330: 4c 55 45 53 28 35 33 2c 20 27 4b 68 72 75 73 68  LUES(53, 'Khrush
7340: 63 68 65 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  chev');.  }.} {}
7350: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7360: 35 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  5.1.2 {.  execsq
7370: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
7380: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
7390: 20 74 31 20 56 41 4c 55 45 53 28 36 34 2c 20 27   t1 VALUES(64, '
73a0: 42 72 65 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20  Brezhnev');.    
73b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
73c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
73d0: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
73e0: 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20   db2 test.db2.  
73f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
7400: 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  GIN;.      SELEC
7410: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
7420: 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73   db2.} {}.do_tes
7430: 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b  t pager1-5.1.3 {
7440: 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d  .  catchsql COMM
7450: 49 54 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  IT.} {1 {databas
7460: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f  e is locked}}.do
7470: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
7480: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43  .4 {.  execsql C
7490: 4f 4d 4d 49 54 20 64 62 32 0a 20 20 65 78 65 63  OMMIT db2.  exec
74a0: 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65  sql COMMIT.  exe
74b0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
74c0: 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20  FROM t2 } db2.} 
74d0: 7b 31 37 20 4c 65 6e 69 6e 20 32 32 20 53 74 61  {17 Lenin 22 Sta
74e0: 6c 69 6e 20 35 33 20 4b 68 72 75 73 68 63 68 65  lin 53 Khrushche
74f0: 76 20 36 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64  v 64 Brezhnev}.d
7500: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7510: 31 2e 35 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73  1.5 {.  db2 clos
7520: 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  e.} {}..do_test 
7530: 70 61 67 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20  pager1-5.2.1 {. 
7540: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
7550: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
7560: 64 65 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20  de = memory;.   
7570: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
7580: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
7590: 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f  UES(84, 'Andropo
75a0: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
75b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
75c0: 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29  (84, 'Andropov')
75d0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
75e0: 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f  }.} {memory}.do_
75f0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 33 2e  test pager1-5.3.
7600: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
7610: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7620: 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20  al_mode = off;. 
7630: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
7640: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
7650: 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61  ALUES(85, 'Gorba
7660: 63 68 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e  chev');.      IN
7670: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
7680: 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68  UES(85, 'Gorbach
7690: 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  ev');.    COMMIT
76a0: 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64  ;.  }.} {off}..d
76b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
76c0: 34 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  4.1 {.  db close
76d0: 0a 20 20 74 65 73 74 76 66 73 20 74 76 0a 20 20  .  testvfs tv.  
76e0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
76f0: 64 62 20 2d 76 66 73 20 74 76 0a 20 20 65 78 65  db -vfs tv.  exe
7700: 63 73 71 6c 20 7b 20 41 54 54 41 43 48 20 27 74  csql { ATTACH 't
7710: 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 20  est.db2' AS aux 
7720: 7d 0a 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78  }..  tv filter x
7730: 44 65 6c 65 74 65 0a 20 20 74 76 20 73 63 72 69  Delete.  tv scri
7740: 70 74 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73  pt max_journal_s
7750: 69 7a 65 0a 20 20 74 76 20 73 65 63 74 6f 72 73  ize.  tv sectors
7760: 69 7a 65 20 35 31 32 0a 20 20 73 65 74 20 3a 3a  ize 512.  set ::
7770: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20  max_journal 0.  
7780: 70 72 6f 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c  proc max_journal
7790: 5f 73 69 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72  _size {method ar
77a0: 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 7a  gs} {.    set sz
77b0: 20 30 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73   0.    catch { s
77c0: 65 74 20 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65  et sz [file size
77d0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
77e0: 5d 20 7d 0a 20 20 20 20 69 66 20 7b 24 73 7a 20  ] }.    if {$sz 
77f0: 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  > $::max_journal
7800: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a  } {.      set ::
7810: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a  max_journal $sz.
7820: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
7830: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20   SQLITE_OK.  }. 
7840: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
7850: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
7860: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
7870: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
7880: 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20  ous = NORMAL;.  
7890: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
78a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
78b0: 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63  LUES(85, 'Gorbac
78c0: 68 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  hev');.      INS
78d0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
78e0: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
78f0: 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  v');.    COMMIT;
7900: 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78  .  }.  set ::max
7910: 5f 6a 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72  _journal.} [expr
7920: 20 32 36 31 35 2b 5b 73 74 72 69 6e 67 20 6c 65   2615+[string le
7930: 6e 67 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 6f 5f  ngth [pwd]]].do_
7940: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e  test pager1-5.4.
7950: 32 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f  2 {.  set ::max_
7960: 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 65 78 65 63  journal 0.  exec
7970: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
7980: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66   synchronous = f
7990: 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ull;.    BEGIN;.
79a0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
79b0: 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27  M t1 WHERE b = '
79c0: 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 20 20 44 45  Lenin';.      DE
79d0: 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45  LETE FROM t2 WHE
79e0: 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a  RE b = 'Lenin';.
79f0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
7a00: 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72    set ::max_jour
7a10: 6e 61 6c 0a 7d 20 5b 65 78 70 72 20 33 31 31 31  nal.} [expr 3111
7a20: 2b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  +[string length 
7a30: 5b 70 77 64 5d 5d 5d 0a 64 62 20 63 6c 6f 73 65  [pwd]]].db close
7a40: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 64 6f 5f 74  .tv delete..do_t
7a50: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 31  est pager1-5.5.1
7a60: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
7a70: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
7a80: 6c 20 7b 20 0a 20 20 20 20 41 54 54 41 43 48 20  l { .    ATTACH 
7a90: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75  'test.db2' AS au
7aa0: 78 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  x;.    PRAGMA jo
7ab0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
7ac0: 53 49 53 54 3b 0a 20 20 20 20 43 52 45 41 54 45  SIST;.    CREATE
7ad0: 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b   TABLE t3(a, b);
7ae0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7af0: 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t3 SELECT rando
7b00: 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
7b10: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
7b20: 4f 4d 20 74 31 3b 0a 20 20 20 20 55 50 44 41 54  OM t1;.    UPDAT
7b30: 45 20 74 33 20 53 45 54 20 62 20 3d 20 72 61 6e  E t3 SET b = ran
7b40: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 3b 0a 20  domblob(1500);. 
7b50: 20 7d 0a 20 20 65 78 70 72 20 5b 66 69 6c 65 20   }.  expr [file 
7b60: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
7b70: 72 6e 61 6c 5d 20 3e 20 31 35 30 30 30 0a 7d 20  rnal] > 15000.} 
7b80: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {1}.do_test page
7b90: 72 31 2d 35 2e 35 2e 32 20 7b 0a 20 20 65 78 65  r1-5.5.2 {.  exe
7ba0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
7bb0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
7bc0: 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b  full;.    BEGIN;
7bd0: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
7be0: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20  OM t1 WHERE b = 
7bf0: 27 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 20 20  'Stalin';.      
7c00: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57  DELETE FROM t2 W
7c10: 48 45 52 45 20 62 20 3d 20 27 53 74 61 6c 69 6e  HERE b = 'Stalin
7c20: 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  ';.    COMMIT;. 
7c30: 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
7c40: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d  est.db-journal.}
7c50: 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   {0}...#--------
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 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
7cb0: 67 20 74 65 73 74 73 20 77 6f 72 6b 20 77 69 74  g tests work wit
7cc0: 68 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61  h "PRAGMA max_pa
7cd0: 67 65 5f 63 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74  ge_count".#.do_t
7ce0: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 20 7b  est pager1-6.1 {
7cf0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
7d00: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
7d10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
7d20: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
7d30: 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41   = none;.    PRA
7d40: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
7d50: 6e 74 20 3d 20 31 30 3b 0a 20 20 20 20 43 52 45  nt = 10;.    CRE
7d60: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
7d70: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
7d80: 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20  ABLE t3(a, b);. 
7d90: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7da0: 74 34 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t4(a, b);.    CR
7db0: 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c  EATE TABLE t5(a,
7dc0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
7dd0: 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a  TABLE t6(a, b);.
7de0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7df0: 20 74 37 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t7(a, b);.    C
7e00: 52 45 41 54 45 20 54 41 42 4c 45 20 74 38 28 61  REATE TABLE t8(a
7e10: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
7e20: 20 54 41 42 4c 45 20 74 39 28 61 2c 20 62 29 3b   TABLE t9(a, b);
7e30: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7e40: 45 20 74 31 30 28 61 2c 20 62 29 3b 0a 20 20 7d  E t10(a, b);.  }
7e50: 0a 7d 20 7b 31 30 7d 0a 64 6f 5f 63 61 74 63 68  .} {10}.do_catch
7e60: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
7e70: 36 2e 32 20 7b 0a 20 20 43 52 45 41 54 45 20 54  6.2 {.  CREATE T
7e80: 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29 0a 7d  ABLE t11(a, b).}
7e90: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 6f 72   {1 {database or
7ea0: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a   disk is full}}.
7eb0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7ec0: 70 61 67 65 72 31 2d 36 2e 34 20 7b 20 50 52 41  pager1-6.4 { PRA
7ed0: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
7ee0: 6e 74 20 20 20 20 20 20 7d 20 7b 31 30 7d 0a 64  nt      } {10}.d
7ef0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
7f00: 61 67 65 72 31 2d 36 2e 35 20 7b 20 50 52 41 47  ager1-6.5 { PRAG
7f10: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
7f20: 74 20 3d 20 31 35 20 7d 20 7b 31 35 7d 0a 64 6f  t = 15 } {15}.do
7f30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
7f40: 67 65 72 31 2d 36 2e 36 20 7b 20 43 52 45 41 54  ger1-6.6 { CREAT
7f50: 45 20 54 41 42 4c 45 20 74 31 31 28 61 2c 20 62  E TABLE t11(a, b
7f60: 29 20 20 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78  )     } {}.do_ex
7f70: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
7f80: 31 2d 36 2e 37 20 7b 0a 20 20 42 45 47 49 4e 3b  1-6.7 {.  BEGIN;
7f90: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7fa0: 20 74 31 31 20 56 41 4c 55 45 53 28 31 2c 20 32   t11 VALUES(1, 2
7fb0: 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61  );.    PRAGMA ma
7fc0: 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31  x_page_count = 1
7fd0: 33 3b 0a 7d 20 7b 31 33 7d 0a 64 6f 5f 65 78 65  3;.} {13}.do_exe
7fe0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
7ff0: 2d 36 2e 38 20 7b 0a 20 20 20 20 49 4e 53 45 52  -6.8 {.    INSER
8000: 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45  T INTO t11 VALUE
8010: 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 50 52 41  S(3, 4);.    PRA
8020: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
8030: 6e 74 20 3d 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a  nt = 10;.} {11}.
8040: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8050: 70 61 67 65 72 31 2d 36 2e 39 20 7b 20 43 4f 4d  pager1-6.9 { COM
8060: 4d 49 54 20 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65  MIT } {}..do_exe
8070: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
8080: 2d 36 2e 31 30 20 7b 20 50 52 41 47 4d 41 20 6d  -6.10 { PRAGMA m
8090: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20  ax_page_count = 
80a0: 31 30 20 7d 20 7b 31 31 7d 0a 64 6f 5f 65 78 65  10 } {11}.do_exe
80b0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
80c0: 2d 36 2e 31 31 20 7b 20 53 45 4c 45 43 54 20 2a  -6.11 { SELECT *
80d0: 20 46 52 4f 4d 20 74 31 31 20 7d 20 20 20 20 20   FROM t11 }     
80e0: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 64       {1 2 3 4}.d
80f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
8100: 61 67 65 72 31 2d 36 2e 31 32 20 7b 20 50 52 41  ager1-6.12 { PRA
8110: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
8120: 6e 74 20 7d 20 20 20 20 20 20 7b 31 31 7d 0a 0a  nt }      {11}..
8130: 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
8180: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
8190: 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52 41  s work with "PRA
81a0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
81b0: 3d 54 52 55 4e 43 41 54 45 22 20 61 6e 64 0a 23  =TRUNCATE" and.#
81c0: 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67   "PRAGMA locking
81d0: 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 22  _mode=EXCLUSIVE"
81e0: 2e 0a 23 0a 23 20 45 61 63 68 20 74 65 73 74 20  ..#.# Each test 
81f0: 69 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  is specified wit
8200: 68 20 35 20 76 61 72 69 61 62 6c 65 73 2e 20 41  h 5 variables. A
8210: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20  s follows:.#.#  
8220: 20 24 74 6e 3a 20 20 54 65 73 74 20 4e 75 6d 62   $tn:  Test Numb
8230: 65 72 2e 20 55 73 65 64 20 61 73 20 70 61 72 74  er. Used as part
8240: 20 6f 66 20 74 68 65 20 5b 64 6f 5f 74 65 73 74   of the [do_test
8250: 5d 20 74 65 73 74 20 6e 61 6d 65 73 2e 0a 23 20  ] test names..# 
8260: 20 20 24 73 71 6c 3a 20 53 51 4c 20 74 6f 20 65    $sql: SQL to e
8270: 78 65 63 75 74 65 2e 0a 23 20 20 20 24 72 65 73  xecute..#   $res
8280: 3a 20 45 78 70 65 63 74 65 64 20 72 65 73 75 6c  : Expected resul
8290: 74 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20 24  t of executing $
82a0: 73 71 6c 2e 0a 23 20 20 20 24 6a 73 3a 20 20 54  sql..#   $js:  T
82b0: 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65  he expected size
82c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
82d0: 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20  file, in bytes, 
82e0: 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a  after executing.
82f0: 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51  #         the SQ
8300: 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20  L script. Or -1 
8310: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  if the journal i
8320: 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74  s not expected t
8330: 6f 20 65 78 69 73 74 2e 0a 23 20 20 20 24 77 73  o exist..#   $ws
8340: 3a 20 20 54 68 65 20 65 78 70 65 63 74 65 64 20  :  The expected 
8350: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 41 4c 20  size of the WAL 
8360: 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20  file, in bytes, 
8370: 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a  after executing.
8380: 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51  #         the SQ
8390: 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20  L script. Or -1 
83a0: 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
83b0: 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65 78  t expected to ex
83c0: 69 73 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  ist..#.ifcapable
83d0: 20 77 61 6c 20 7b 0a 20 20 66 61 75 6c 74 73 69   wal {.  faultsi
83e0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
83f0: 70 65 6e 0a 20 20 66 6f 72 65 61 63 68 20 7b 74  pen.  foreach {t
8400: 6e 20 73 71 6c 20 72 65 73 20 6a 73 20 77 73 7d  n sql res js ws}
8410: 20 5b 73 75 62 73 74 20 7b 0a 20 20 0a 20 20 20   [subst {.  .   
8420: 20 31 20 20 7b 0a 20 20 20 20 20 20 43 52 45 41   1  {.      CREA
8430: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
8440: 29 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  );.      PRAGMA 
8450: 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b  auto_vacuum=OFF;
8460: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 73 79  .      PRAGMA sy
8470: 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
8480: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70  ;.      PRAGMA p
8490: 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20  age_size=1024;. 
84a0: 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
84b0: 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
84c0: 56 45 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  VE;.      PRAGMA
84d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52   journal_mode=TR
84e0: 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 49 4e  UNCATE;.      IN
84f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
8500: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d  UES(1, 2);.    }
8510: 20 7b 65 78 63 6c 75 73 69 76 65 20 74 72 75 6e   {exclusive trun
8520: 63 61 74 65 7d 20 30 20 2d 31 0a 20 20 0a 20 20  cate} 0 -1.  .  
8530: 20 20 32 20 20 7b 0a 20 20 20 20 20 20 42 45 47    2  {.      BEG
8540: 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20  IN IMMEDIATE;.  
8550: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
8560: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f  ROM t1;.      CO
8570: 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32  MMIT;.    } {1 2
8580: 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 33 20  } 0 -1.  .    3 
8590: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
85a0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
85b0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
85c0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31  COMMIT;.    } {1
85d0: 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20   2} 0 -1.  .    
85e0: 34 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  4  { PRAGMA jour
85f0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d  nal_mode = WAL }
8600: 20 20 20 20 77 61 6c 20 20 20 20 20 20 20 2d 31      wal       -1
8610: 20 2d 31 0a 20 20 20 20 35 20 20 7b 20 49 4e 53   -1.    5  { INS
8620: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8630: 45 53 28 33 2c 20 34 29 20 7d 20 20 7b 7d 20 20  ES(3, 4) }  {}  
8640: 20 20 20 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69        -1 [wal_fi
8650: 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a  le_size 1 1024].
8660: 20 20 20 20 36 20 20 7b 20 50 52 41 47 4d 41 20      6  { PRAGMA 
8670: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 4e  locking_mode = N
8680: 4f 52 4d 41 4c 20 7d 20 65 78 63 6c 75 73 69 76  ORMAL } exclusiv
8690: 65 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  e -1 [wal_file_s
86a0: 69 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 20 20  ize 1 1024].    
86b0: 37 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  7  { INSERT INTO
86c0: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29   t1 VALUES(5, 6)
86d0: 3b 20 7d 20 7b 7d 20 20 20 20 20 20 20 20 2d 31  ; } {}        -1
86e0: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
86f0: 32 20 31 30 32 34 5d 0a 20 20 0a 20 20 20 20 38  2 1024].  .    8
8700: 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e    { PRAGMA journ
8710: 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41  al_mode = TRUNCA
8720: 54 45 20 7d 20 74 72 75 6e 63 61 74 65 20 20 20  TE } truncate   
8730: 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20 20 20         0 -1.    
8740: 39 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  9  { INSERT INTO
8750: 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38 29   t1 VALUES(7, 8)
8760: 20 7d 20 20 20 20 7b 7d 20 20 20 20 20 20 20 20   }    {}        
8770: 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20 20          0 -1.   
8780: 20 31 30 20 7b 20 53 45 4c 45 43 54 20 2a 20 46   10 { SELECT * F
8790: 52 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20  ROM t1 }        
87a0: 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 20         {1 2 3 4 
87b0: 35 20 36 20 37 20 38 7d 20 30 20 2d 31 0a 20 20  5 6 7 8} 0 -1.  
87c0: 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 64 6f 5f 65  .  }] {.    do_e
87d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
87e0: 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20 24 73 71  r1-7.1.$tn.1 $sq
87f0: 6c 20 24 72 65 73 0a 20 20 20 20 63 61 74 63 68  l $res.    catch
8800: 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b 20 73 65   { set J -1 ; se
8810: 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  t J [file size t
8820: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20  est.db-journal] 
8830: 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73 65  }.    catch { se
8840: 74 20 57 20 2d 31 20 3b 20 73 65 74 20 57 20 5b  t W -1 ; set W [
8850: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
8860: 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20 64 6f 5f  b-wal] }.    do_
8870: 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 31 2e  test pager1-7.1.
8880: 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20 24 4a 20  $tn.2 { list $J 
8890: 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a 73 20 24  $W } [list $js $
88a0: 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65  ws].  }.}..do_te
88b0: 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 31 20  st pager1-7.2.1 
88c0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
88d0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
88e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
88f0: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
8900: 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 3b 0a  de = EXCLUSIVE;.
8910: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8920: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 42   t1(a, b);.    B
8930: 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 52 41 47  EGIN;.      PRAG
8940: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
8950: 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 20 20  = delete;.      
8960: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
8970: 6f 64 65 20 3d 20 74 72 75 6e 63 61 74 65 3b 0a  ode = truncate;.
8980: 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65    }.} {exclusive
8990: 20 64 65 6c 65 74 65 20 74 72 75 6e 63 61 74 65   delete truncate
89a0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
89b0: 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  -7.2.2 {.  execs
89c0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
89d0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
89e0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
89f0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8a00: 64 65 20 3d 20 70 65 72 73 69 73 74 20 7d 0a 7d  de = persist }.}
8a10: 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64 6f 5f 74   {truncate}.do_t
8a20: 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 33  est pager1-7.2.3
8a30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
8a40: 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65 63 73 71  OMMIT }.  execsq
8a50: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
8a60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65  ournal_mode = pe
8a70: 72 73 69 73 74 3b 0a 20 20 20 20 50 52 41 47 4d  rsist;.    PRAGM
8a80: 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  A journal_size_l
8a90: 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b 70 65 72  imit;.  }.} {per
8aa0: 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d 2d  sist -1}..#-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8af0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
8b00: 77 69 6e 67 20 74 65 73 74 73 2c 20 70 61 67 65  wing tests, page
8b10: 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20 74 68 61  r1-8.*, test tha
8b20: 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 66 69  t the special fi
8b30: 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a 6d 65 6d  lenames .# ":mem
8b40: 6f 72 79 3a 22 20 61 6e 64 20 22 22 20 6f 70 65  ory:" and "" ope
8b50: 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  n temporary data
8b60: 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68  bases..#.foreach
8b70: 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65 7d 20 7b   {tn filename} {
8b80: 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20  .  1 :memory:.  
8b90: 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65  2 "".} {.  do_te
8ba0: 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e  st pager1-8.$tn.
8bb0: 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d  1 {.    faultsim
8bc0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
8bd0: 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a  en.    db close.
8be0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 24      sqlite3 db $
8bf0: 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 65 78 65  filename.    exe
8c00: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
8c10: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
8c20: 3d 20 31 3b 0a 20 20 20 20 20 20 43 52 45 41 54  = 1;.      CREAT
8c30: 45 20 54 41 42 4c 45 20 78 31 28 78 29 3b 0a 20  E TABLE x1(x);. 
8c40: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
8c50: 20 78 31 20 56 41 4c 55 45 53 28 27 43 68 61 72   x1 VALUES('Char
8c60: 6c 65 73 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  les');.      INS
8c70: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
8c80: 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a 20 20 20  ES('James');.   
8c90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
8ca0: 31 20 56 41 4c 55 45 53 28 27 4d 61 72 79 27 29  1 VALUES('Mary')
8cb0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
8cc0: 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 7d 0a   FROM x1;.    }.
8cd0: 20 20 7d 20 7b 43 68 61 72 6c 65 73 20 4a 61 6d    } {Charles Jam
8ce0: 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64 6f 5f 74  es Mary}..  do_t
8cf0: 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e  est pager1-8.$tn
8d00: 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .2 {.    sqlite3
8d10: 20 64 62 32 20 24 66 69 6c 65 6e 61 6d 65 0a 20   db2 $filename. 
8d20: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45     catchsql { SE
8d30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d  LECT * FROM x1 }
8d40: 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20   db2.  } {1 {no 
8d50: 73 75 63 68 20 74 61 62 6c 65 3a 20 78 31 7d 7d  such table: x1}}
8d60: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
8d70: 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e  est pager1-8.$tn
8d80: 2e 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  .3 {.    BEGIN;.
8d90: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
8da0: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 57 69 6c  O x1 VALUES('Wil
8db0: 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20 20 49 4e  liam');.      IN
8dc0: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
8dd0: 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a 20 20 20  UES('Anne');.   
8de0: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20 7b   ROLLBACK;.  } {
8df0: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8e40: 23 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  # The next block
8e50: 20 6f 66 20 74 65 73 74 73 20 2d 20 70 61 67 65   of tests - page
8e60: 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c 20 77 69  r1-9.* - deal wi
8e70: 74 68 20 69 6e 74 65 72 61 63 74 69 6f 6e 73 20  th interactions 
8e80: 62 65 74 77 65 65 6e 0a 23 20 74 68 65 20 70 61  between.# the pa
8e90: 67 65 72 20 61 6e 64 20 74 68 65 20 62 61 63 6b  ger and the back
8ea0: 75 70 20 41 50 49 2e 20 54 65 73 74 20 63 61 73  up API. Test cas
8eb0: 65 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31  es:.#.#   pager1
8ec0: 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61  -9.1.*: Test tha
8ed0: 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c  t a backup compl
8ee0: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
8ef0: 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20  y even if the.# 
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 73 6f 75 72 63 65 20 64 62 20 69 73 20 77 72 69  source db is wri
8f20: 74 74 65 6e 20 74 6f 20 64 75 72 69 6e 67 20 74  tten to during t
8f30: 68 65 20 62 61 63 6b 75 70 20 6f 70 2e 0a 23 0a  he backup op..#.
8f40: 23 20 20 20 70 61 67 65 72 31 2d 39 2e 32 2e 2a  #   pager1-9.2.*
8f50: 3a 20 54 65 73 74 20 74 68 61 74 20 61 20 62 61  : Test that a ba
8f60: 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65 73 20 73  ckup completes s
8f70: 75 63 63 65 73 73 66 75 6c 6c 79 20 65 76 65 6e  uccessfully even
8f80: 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20 20   if the.#       
8f90: 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65            source
8fa0: 20 64 62 20 69 73 20 77 72 69 74 74 65 6e 20 74   db is written t
8fb0: 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f 6c 6c 65  o and then rolle
8fc0: 64 20 62 61 63 6b 20 64 75 72 69 6e 67 20 61 20  d back during a 
8fd0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
8fe0: 20 20 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74     backup operat
8ff0: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ion..#.do_test p
9000: 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b 0a 20 20  ager1-9.0.1 {.  
9010: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
9020: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
9030: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
9040: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
9050: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
9060: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
9070: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
9080: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 28  CREATE TABLE ab(
9090: 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20  a, b, UNIQUE(a, 
90a0: 62 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  b));.      INSER
90b0: 54 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53  T INTO ab VALUES
90c0: 28 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  ( a_string(200),
90d0: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 29   a_string(300) )
90e0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
90f0: 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f  NTO ab SELECT a_
9100: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
9110: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
9120: 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ab;.      INSERT
9130: 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20   INTO ab SELECT 
9140: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
9150: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
9160: 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45  M ab;.      INSE
9170: 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43  RT INTO ab SELEC
9180: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
9190: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
91a0: 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e  ROM ab;.      IN
91b0: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c  SERT INTO ab SEL
91c0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
91d0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
91e0: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20   FROM ab;.      
91f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53  INSERT INTO ab S
9200: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
9210: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
9220: 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20  0) FROM ab;.    
9230: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
9240: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
9250: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
9260: 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20  300) FROM ab;.  
9270: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9280: 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  ab SELECT a_stri
9290: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
92a0: 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a  g(300) FROM ab;.
92b0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
92c0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
92d0: 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20 20 73 71  er1-9.0.2 {.  sq
92e0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
92f0: 62 32 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 20  b2.  db2 eval { 
9300: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
9310: 65 20 3d 20 31 30 20 7d 0a 20 20 73 71 6c 69 74  e = 10 }.  sqlit
9320: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
9330: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c  main db main.  l
9340: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
9350: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
9360: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
9370: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
9380: 70 61 67 65 72 31 2d 39 2e 30 2e 33 20 7b 0a 20  pager1-9.0.3 {. 
9390: 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  db one {SELECT m
93a0: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
93b0: 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20   ab}.} [db2 one 
93c0: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
93d0: 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 0a  , b) FROM ab}]..
93e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
93f0: 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.1 {.  execsql
9400: 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54   { UPDATE ab SET
9410: 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30   a = a_string(20
9420: 31 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  1) }.  sqlite3_b
9430: 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e  ackup B db2 main
9440: 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65   db main.  B ste
9450: 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f  p 30.} {SQLITE_O
9460: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
9470: 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  1-9.1.2 {.  exec
9480: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20  sql { UPDATE ab 
9490: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
94a0: 28 33 30 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b  (301) }.  list [
94b0: 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42  B step 10000] [B
94c0: 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49   finish].} {SQLI
94d0: 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f  TE_DONE SQLITE_O
94e0: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
94f0: 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62 20 6f 6e  1-9.1.3 {. db on
9500: 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  e {SELECT md5sum
9510: 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a  (a, b) FROM ab}.
9520: 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45  } [db2 one {SELE
9530: 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20  CT md5sum(a, b) 
9540: 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73  FROM ab}].do_tes
9550: 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 34 20 7b  t pager1-9.1.4 {
9560: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
9570: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9580: 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 0a 64 6f  ab } } {128}..do
9590: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32  _test pager1-9.2
95a0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
95b0: 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20 61   UPDATE ab SET a
95c0: 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29   = a_string(202)
95d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63   }.  sqlite3_bac
95e0: 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64  kup B db2 main d
95f0: 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20  b main.  B step 
9600: 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  30.} {SQLITE_OK}
9610: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9620: 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  9.2.2 {.  execsq
9630: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
9640: 20 20 20 20 20 20 55 50 44 41 54 45 20 61 62 20        UPDATE ab 
9650: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
9660: 28 33 30 31 29 3b 0a 20 20 20 20 52 4f 4c 4c 42  (301);.    ROLLB
9670: 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20  ACK;.  }.  list 
9680: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
9690: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
96a0: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
96b0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
96c0: 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64 62 20 6f  r1-9.2.3 {. db o
96d0: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
96e0: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
96f0: 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c  .} [db2 one {SEL
9700: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
9710: 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65   FROM ab}].do_te
9720: 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 34 20  st pager1-9.2.4 
9730: 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45  { execsql { SELE
9740: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
9750: 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 64 62   ab } } {128}.db
9760: 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65   close.db2 close
9770: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
9780: 2d 39 2e 33 2e 31 20 7b 0a 20 20 74 65 73 74 76  -9.3.1 {.  testv
9790: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
97a0: 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65  .  tv sectorsize
97b0: 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69 6d   4096.  faultsim
97c0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
97d0: 65 6e 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  en..  execsql { 
97e0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
97f0: 20 3d 20 31 30 32 34 20 7d 0a 20 20 66 6f 72 20   = 1024 }.  for 
9800: 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69 20  {set ii 0} {$ii 
9810: 3c 20 34 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b  < 4} {incr ii} {
9820: 20 65 78 65 63 73 71 6c 20 22 43 52 45 41 54 45   execsql "CREATE
9830: 20 54 41 42 4c 45 20 74 24 7b 69 69 7d 28 61 2c   TABLE t${ii}(a,
9840: 20 62 29 22 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74   b)" }.} {}.do_t
9850: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e 32  est pager1-9.3.2
9860: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
9870: 20 74 65 73 74 2e 64 62 32 0a 0a 20 20 65 78 65   test.db2..  exe
9880: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
9890: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30  A page_size = 40
98a0: 39 36 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73  96;.    PRAGMA s
98b0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46  ynchronous = OFF
98c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
98d0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
98e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
98f0: 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a  (a, b);.  } db2.
9900: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
9910: 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20  p B db2 main db 
9920: 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30  main.  B step 30
9930: 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20  .  list [B step 
9940: 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68  10000] [B finish
9950: 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45  ].} {SQLITE_DONE
9960: 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74   SQLITE_OK}.do_t
9970: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e 33  est pager1-9.3.3
9980: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20   {.  db2 close. 
9990: 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64   db close.  tv d
99a0: 65 6c 65 74 65 0a 20 20 66 69 6c 65 20 73 69 7a  elete.  file siz
99b0: 65 20 74 65 73 74 2e 64 62 32 0a 7d 20 5b 66 69  e test.db2.} [fi
99c0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
99d0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
99e0: 2d 39 2e 34 2e 31 20 7b 0a 20 20 66 61 75 6c 74  -9.4.1 {.  fault
99f0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
9a00: 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20  eopen.  sqlite3 
9a10: 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65  db2 test.db2.  e
9a20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
9a30: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
9a40: 34 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54 45  4096;.    CREATE
9a50: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
9a60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9a70: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20  E t2(a, b);.  } 
9a80: 64 62 32 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  db2.  sqlite3_ba
9a90: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
9aa0: 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74 20 5b  db main.  list [
9ab0: 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42  B step 10000] [B
9ac0: 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49   finish].} {SQLI
9ad0: 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f  TE_DONE SQLITE_O
9ae0: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
9af0: 31 2d 39 2e 34 2e 32 20 7b 0a 20 20 6c 69 73 74  1-9.4.2 {.  list
9b00: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
9b10: 2e 64 62 32 5d 20 5b 66 69 6c 65 20 73 69 7a 65  .db2] [file size
9b20: 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 30 20 30   test.db].} {0 0
9b30: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d  }.db2 close..#--
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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b80: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
9b90: 68 61 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f  hat regardless o
9ba0: 66 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  f the value retu
9bb0: 72 6e 65 64 20 62 79 20 78 53 65 63 74 6f 72 53  rned by xSectorS
9bc0: 69 7a 65 28 29 2c 20 74 68 65 0a 23 20 6d 69 6e  ize(), the.# min
9bd0: 69 6d 75 6d 20 65 66 66 65 63 74 69 76 65 20 73  imum effective s
9be0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 35 31  ector-size is 51
9bf0: 32 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  2 and the maximu
9c00: 6d 20 36 35 35 33 36 20 62 79 74 65 73 2e 0a 23  m 65536 bytes..#
9c10: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
9c20: 61 75 6c 74 20 31 0a 66 6f 72 65 61 63 68 20 73  ault 1.foreach s
9c30: 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20 20 20  ectorsize {.    
9c40: 33 32 20 20 20 36 34 20 20 20 31 32 38 20 20 20  32   64   128   
9c50: 32 35 36 20 20 20 35 31 32 20 20 20 31 30 32 34  256   512   1024
9c60: 20 20 20 32 30 34 38 20 0a 20 20 20 20 34 30 39     2048 .    409
9c70: 36 20 38 31 39 32 20 31 36 33 38 34 20 33 32 37  6 8192 16384 327
9c80: 36 38 20 36 35 35 33 36 20 31 33 31 30 37 32 20  68 65536 131072 
9c90: 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74 76 20  262144.} {.  tv 
9ca0: 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63 74  sectorsize $sect
9cb0: 6f 72 73 69 7a 65 0a 20 20 73 65 74 20 65 66 66  orsize.  set eff
9cc0: 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 69   $sectorsize.  i
9cd0: 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3c  f {$sectorsize <
9ce0: 20 35 31 32 7d 20 20 20 7b 20 73 65 74 20 65 66   512}   { set ef
9cf0: 66 20 35 31 32 20 7d 0a 20 20 69 66 20 7b 24 73  f 512 }.  if {$s
9d00: 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33  ectorsize > 6553
9d10: 36 7d 20 7b 20 73 65 74 20 65 66 66 20 36 35 35  6} { set eff 655
9d20: 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  36 }..  do_test 
9d30: 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74 6f  pager1-10.$secto
9d40: 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 66 61  rsize.1 {.    fa
9d50: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
9d60: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20  d_reopen.    db 
9d70: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
9d80: 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73  string.    execs
9d90: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
9da0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
9db0: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20   PERSIST;.      
9dc0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
9dd0: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20 42   = 1024;.      B
9de0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52  EGIN;.        CR
9df0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(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 32 28 61 2c 20  ATE TABLE t2(a, 
9e20: 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  b);.        CREA
9e30: 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62  TE TABLE t3(a, b
9e40: 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  );.      COMMIT;
9e50: 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 20  .    }.    file 
9e60: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
9e70: 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24  rnal.  } [expr $
9e80: 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35  sectorsize > 655
9e90: 33 36 20 3f 20 36 35 35 33 36 20 3a 20 24 73 65  36 ? 65536 : $se
9ea0: 63 74 6f 72 73 69 7a 65 5d 0a 0a 20 20 64 6f 5f  ctorsize]..  do_
9eb0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
9ec0: 73 65 63 74 6f 72 73 69 7a 65 2e 32 20 7b 0a 20  sectorsize.2 {. 
9ed0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
9ee0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9ef0: 74 33 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t3 VALUES(a_stri
9f00: 6e 67 28 33 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(300), a_strin
9f10: 67 28 33 30 30 29 29 3b 0a 20 20 20 20 20 20 49  g(300));.      I
9f20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
9f30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20  LECT * FROM t3; 
9f40: 20 20 20 20 20 20 20 2f 2a 20 20 32 20 2a 2f 0a         /*  2 */.
9f50: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9f60: 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52  O t3 SELECT * FR
9f70: 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a  OM t3;        /*
9f80: 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    4 */.      INS
9f90: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
9fa0: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20  CT * FROM t3;   
9fb0: 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20       /*  8 */.  
9fc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9fd0: 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t3 SELECT * FROM
9fe0: 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 31   t3;        /* 1
9ff0: 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  6 */.      INSER
a000: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
a010: 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20   * FROM t3;     
a020: 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20     /* 32 */.    
a030: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74  }.  } {}..  do_t
a040: 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73  est pager1-10.$s
a050: 65 63 74 6f 72 73 69 7a 65 2e 33 20 7b 0a 20 20  ectorsize.3 {.  
a060: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73    db close.    s
a070: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
a080: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  b.    execsql { 
a090: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61  .      PRAGMA ca
a0a0: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
a0b0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
a0c0: 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65 5f  }.    recursive_
a0d0: 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62  select 32 t3 {db
a0e0: 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e   eval "INSERT IN
a0f0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
a100: 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  2)"}.    execsql
a110: 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b   {.      COMMIT;
a120: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
a130: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20  FROM t2;.    }. 
a140: 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f 74   } {1 2}..  do_t
a150: 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73  est pager1-10.$s
a160: 65 63 74 6f 72 73 69 7a 65 2e 34 20 7b 0a 20 20  ectorsize.4 {.  
a170: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a180: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a190: 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43  6(a, b);.      C
a1a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61  REATE TABLE t7(a
a1b0: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , b);.      CREA
a1c0: 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62  TE TABLE t5(a, b
a1d0: 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41  );.      DROP TA
a1e0: 42 4c 45 20 74 36 3b 0a 20 20 20 20 20 20 44 52  BLE t6;.      DR
a1f0: 4f 50 20 54 41 42 4c 45 20 74 37 3b 0a 20 20 20  OP TABLE t7;.   
a200: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
a210: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
a220: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
a230: 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20  LE t6(a, b);.   
a240: 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65   }.    recursive
a250: 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64  _select 32 t3 {d
a260: 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49  b eval "INSERT I
a270: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c  NTO t5 VALUES(1,
a280: 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71   2)"}.    execsq
a290: 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  l {.      COMMIT
a2a0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
a2b0: 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d 0a   FROM t5;.    }.
a2c0: 20 20 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a 64    } {1 2}.  .}.d
a2d0: 62 20 63 6c 6f 73 65 0a 0a 74 76 20 73 65 63 74  b close..tv sect
a2e0: 6f 72 73 69 7a 65 20 34 30 39 36 0a 64 6f 5f 74  orsize 4096.do_t
a2f0: 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e  est pager1.10.x.
a300: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
a310: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
a320: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a330: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
a340: 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20  uum = none;.    
a350: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
a360: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
a370: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
a380: 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  .  }.  for {set 
a390: 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20 7b 69 6e  i 0} {$i<30} {in
a3a0: 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63  cr i} {.    exec
a3b0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
a3c0: 4f 20 74 31 20 56 41 4c 55 45 53 28 7a 65 72 6f  O t1 VALUES(zero
a3d0: 62 6c 6f 62 28 39 30 30 29 29 20 7d 0a 20 20 7d  blob(900)) }.  }
a3e0: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
a3f0: 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d 0a 64  t.db.} {32768}.d
a400: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30  o_test pager1.10
a410: 2e 78 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .x.2 {.  execsql
a420: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
a430: 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 44  BLE t2(x);.    D
a440: 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20  ROP TABLE t2;.  
a450: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
a460: 73 74 2e 64 62 0a 7d 20 7b 33 33 37 39 32 7d 0a  st.db.} {33792}.
a470: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31  do_test pager1.1
a480: 30 2e 78 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  0.x.3 {.  execsq
a490: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
a4a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a4b0: 74 32 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65 63  t2(x);.  }.  rec
a4c0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 30  ursive_select 30
a4d0: 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   t1.  execsql {.
a4e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a4f0: 20 74 33 28 78 29 3b 0a 20 20 20 20 43 4f 4d 4d   t3(x);.    COMM
a500: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 62  IT;.  }.} {}..db
a510: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
a520: 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  ..testvfs tv -de
a530: 66 61 75 6c 74 20 31 0a 66 61 75 6c 74 73 69 6d  fault 1.faultsim
a540: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
a550: 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72  en.db func a_str
a560: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 64 6f 5f  ing a_string.do_
a570: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
a580: 65 72 31 2d 31 31 2e 31 20 7b 0a 20 20 50 52 41  er1-11.1 {.  PRA
a590: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
a5a0: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 50 52 41   = DELETE;.  PRA
a5b0: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
a5c0: 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20   10;.  BEGIN;.  
a5d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a    CREATE TABLE z
a5e0: 7a 28 74 6f 70 20 50 52 49 4d 41 52 59 20 4b 45  z(top PRIMARY KE
a5f0: 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  Y);.    INSERT I
a600: 4e 54 4f 20 7a 7a 20 56 41 4c 55 45 53 28 61 5f  NTO zz VALUES(a_
a610: 73 74 72 69 6e 67 28 32 32 32 29 29 3b 0a 20 20  string(222));.  
a620: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
a630: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
a640: 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78  ((SELECT 222+max
a650: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29  (rowid) FROM zz)
a660: 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49  ) FROM zz;.    I
a670: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
a680: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
a690: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
a6a0: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
a6b0: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
a6c0: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
a6d0: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
a6e0: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
a6f0: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
a700: 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   zz;.    INSERT 
a710: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
a720: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
a730: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
a740: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
a750: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
a760: 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74  O zz SELECT a_st
a770: 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32  ring((SELECT 222
a780: 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d  +max(rowid) FROM
a790: 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20   zz)) FROM zz;. 
a7a0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 42 45 47 49 4e   COMMIT;.  BEGIN
a7b0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 7a 20  ;.    UPDATE zz 
a7c0: 53 45 54 20 74 6f 70 20 3d 20 61 5f 73 74 72 69  SET top = a_stri
a7d0: 6e 67 28 33 34 35 29 3b 0a 7d 20 7b 64 65 6c 65  ng(345);.} {dele
a7e0: 74 65 7d 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75  te}..proc lockou
a7f0: 74 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20  t {method args} 
a800: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
a810: 49 4f 45 52 52 20 7d 0a 74 76 20 73 63 72 69 70  IOERR }.tv scrip
a820: 74 20 6c 6f 63 6b 6f 75 74 0a 74 76 20 66 69 6c  t lockout.tv fil
a830: 74 65 72 20 7b 78 57 72 69 74 65 20 78 54 72 75  ter {xWrite xTru
a840: 6e 63 61 74 65 20 78 53 79 6e 63 7d 0a 64 6f 5f  ncate xSync}.do_
a850: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61  catchsql_test pa
a860: 67 65 72 31 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d  ger1-11.2 { COMM
a870: 49 54 20 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f  IT } {1 {disk I/
a880: 4f 20 65 72 72 6f 72 7d 7d 0a 0a 74 76 20 73 63  O error}}..tv sc
a890: 72 69 70 74 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  ript {}.do_test 
a8a0: 70 61 67 65 72 31 2d 31 31 2e 33 20 7b 0a 20 20  pager1-11.3 {.  
a8b0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
a8c0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
a8d0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
a8e0: 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41  al_mode = TRUNCA
a8f0: 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  TE;.    PRAGMA i
a900: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
a910: 20 20 7d 20 64 62 32 0a 7d 20 7b 74 72 75 6e 63    } db2.} {trunc
a920: 61 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20  ate ok}.do_test 
a930: 70 61 67 65 72 31 2d 31 31 2e 34 20 7b 0a 20 20  pager1-11.4 {.  
a940: 64 62 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65  db2 close.  file
a950: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
a960: 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f  journal.} {0}.do
a970: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
a980: 67 65 72 31 2d 31 31 2e 35 20 7b 20 53 45 4c 45  ger1-11.5 { SELE
a990: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
a9a0: 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62 20 63 6c   zz } {32}.db cl
a9b0: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 20 20  ose.tv delete.  
a9c0: 0a 23 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 2d 2d 2d 2d  ----------------
a9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
aa10: 73 74 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f  st "PRAGMA page_
aa20: 73 69 7a 65 22 0a 23 0a 74 65 73 74 76 66 73 20  size".#.testvfs 
aa30: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76  tv -default 1.tv
aa40: 20 73 65 63 74 6f 72 73 69 7a 65 20 31 30 32 34   sectorsize 1024
aa50: 0a 66 6f 72 65 61 63 68 20 70 61 67 65 73 69 7a  .foreach pagesiz
aa60: 65 20 7b 0a 20 20 20 20 35 31 32 20 20 20 31 30  e {.    512   10
aa70: 32 34 20 20 20 32 30 34 38 20 34 30 39 36 20 38  24   2048 4096 8
aa80: 31 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20  192 16384 32768 
aa90: 0a 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .} {.  faultsim_
aaa0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
aab0: 6e 0a 0a 20 20 23 20 54 68 65 20 73 65 63 74 6f  n..  # The secto
aac0: 72 2d 73 69 7a 65 20 28 61 63 63 6f 72 64 69 6e  r-size (accordin
aad0: 67 20 74 6f 20 74 68 65 20 56 46 53 29 20 69 73  g to the VFS) is
aae0: 20 31 30 32 34 20 62 79 74 65 73 2e 20 53 6f 20   1024 bytes. So 
aaf0: 69 66 20 74 68 65 0a 20 20 23 20 70 61 67 65 2d  if the.  # page-
ab00: 73 69 7a 65 20 72 65 71 75 65 73 74 65 64 20 75  size requested u
ab10: 73 69 6e 67 20 22 50 52 41 47 4d 41 20 70 61 67  sing "PRAGMA pag
ab20: 65 5f 73 69 7a 65 22 20 69 73 20 67 72 65 61 74  e_size" is great
ab30: 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 23 20  er than the.  # 
ab40: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c  compile time val
ab50: 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 4d 41 58  ue of SQLITE_MAX
ab60: 5f 50 41 47 45 5f 53 49 5a 45 2c 20 74 68 65 6e  _PAGE_SIZE, then
ab70: 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 0a   the effective .
ab80: 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72 65    # page-size re
ab90: 6d 61 69 6e 73 20 31 30 32 34 20 62 79 74 65 73  mains 1024 bytes
aba0: 2e 0a 20 20 23 0a 20 20 73 65 74 20 65 66 66 20  ..  #.  set eff 
abb0: 24 70 61 67 65 73 69 7a 65 0a 20 20 69 66 20 7b  $pagesize.  if {
abc0: 24 65 66 66 20 3e 20 24 3a 3a 53 51 4c 49 54 45  $eff > $::SQLITE
abd0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 7d 20  _MAX_PAGE_SIZE} 
abe0: 7b 20 73 65 74 20 65 66 66 20 31 30 32 34 20 7d  { set eff 1024 }
abf0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
ac00: 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e  r1-12.$pagesize.
ac10: 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  1 {.    sqlite3 
ac20: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20  db2 test.db.    
ac30: 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20  execsql ".      
ac40: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
ac50: 20 3d 20 24 70 61 67 65 73 69 7a 65 3b 0a 20 20   = $pagesize;.  
ac60: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
ac70: 76 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  v AS SELECT * FR
ac80: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
ac90: 3b 0a 20 20 20 20 22 20 64 62 32 0a 20 20 20 20  ;.    " db2.    
aca0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
acb0: 62 0a 20 20 7d 20 24 65 66 66 0a 20 20 64 6f 5f  b.  } $eff.  do_
acc0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24  test pager1-12.$
acd0: 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20  pagesize.2 {.   
ace0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
acf0: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
ad00: 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54   { .      SELECT
ad10: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76   count(*) FROM v
ad20: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d  ;.      PRAGMA m
ad30: 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20  ain.page_size;. 
ad40: 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69     } db2.  } [li
ad50: 73 74 20 31 20 24 65 66 66 5d 0a 20 20 64 6f 5f  st 1 $eff].  do_
ad60: 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24  test pager1-12.$
ad70: 70 61 67 65 73 69 7a 65 2e 33 20 7b 0a 20 20 20  pagesize.3 {.   
ad80: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
ad90: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
ada0: 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20  ) FROM v;.      
adb0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65  PRAGMA main.page
adc0: 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  _size;.    }.  }
add0: 20 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a 20   [list 1 $eff]. 
ade0: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 64 62 20   db2 close.}.db 
adf0: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
ae00: 0a 23 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 2d 2d 2d 2d  ----------------
ae30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
ae50: 73 74 20 73 70 65 63 61 6c 20 22 50 52 41 47 4d  st specal "PRAGM
ae60: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50  A journal_mode=P
ae70: 45 52 53 49 53 54 22 20 74 65 73 74 20 63 61 73  ERSIST" test cas
ae80: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31  es..#.# pager1-1
ae90: 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73 74  3.1.*: This test
aea0: 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
aeb0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20   encountered in 
aec0: 70 65 72 73 69 73 74 65 6e 74 20 0a 23 20 20 20  persistent .#   
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
aee0: 72 6e 61 6c 20 6d 6f 64 65 3a 20 49 66 20 74 68  rnal mode: If th
aef0: 65 20 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69  e journal associ
af00: 61 74 65 64 20 77 69 74 68 20 61 20 74 72 61 6e  ated with a tran
af10: 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20  saction.#       
af20: 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
af30: 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6a 6f 75  ler than the jou
af40: 72 6e 61 6c 20 66 69 6c 65 20 28 62 65 63 61 75  rnal file (becau
af50: 73 65 20 61 20 70 72 65 76 69 6f 75 73 20 0a 23  se a previous .#
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65 66 74  transaction left
af80: 20 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e 6f   a very large no
af90: 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  n-hot journal fi
afa0: 6c 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20  le in the.#     
afb0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 2d             file-
afc0: 73 79 73 74 65 6d 29 2c 20 74 68 65 6e 20 53 51  system), then SQ
afd0: 4c 69 74 65 20 68 61 73 20 74 6f 20 62 65 20 63  Lite has to be c
afe0: 61 72 65 66 75 6c 20 74 68 61 74 20 74 68 65 72  areful that ther
aff0: 65 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20  e is.#          
b000: 20 20 20 20 20 20 6e 6f 74 20 61 20 6a 6f 75 72        not a jour
b010: 6e 61 6c 2d 68 65 61 64 65 72 20 6c 65 66 74 20  nal-header left 
b020: 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 65 76  over from a prev
b030: 69 6f 75 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  ious transaction
b040: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b050: 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f    immediately fo
b060: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6a 6f 75 72  llowing the jour
b070: 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6a 75 73 74  nal content just
b080: 20 77 72 69 74 74 65 6e 2e 0a 23 20 20 20 20 20   written..#     
b090: 20 20 20 20 20 20 20 20 20 20 20 49 66 20 74 68             If th
b0a0: 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 65 20  ere is, and the 
b0b0: 70 72 6f 63 65 73 73 20 63 72 61 73 68 65 73 20  process crashes 
b0c0: 73 6f 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  so that the jour
b0d0: 6e 61 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20  nal.#           
b0e0: 20 20 20 20 20 62 65 63 6f 6d 65 73 20 61 20 68       becomes a h
b0f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d  ot-journal and m
b100: 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
b110: 63 6b 20 62 79 20 61 6e 6f 74 68 65 72 0a 23 20  ck by another.# 
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b130: 72 6f 63 65 73 73 2c 20 74 68 65 72 65 20 69 73  rocess, there is
b140: 20 61 20 64 61 6e 67 65 72 20 74 68 61 74 20 74   a danger that t
b150: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
b160: 20 6d 61 79 20 72 6f 6c 6c 0a 23 20 20 20 20 20   may roll.#     
b170: 20 20 20 20 20 20 20 20 20 20 20 62 61 63 6b 20             back 
b180: 74 68 65 20 61 62 6f 72 74 65 64 20 74 72 61 6e  the aborted tran
b190: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f  saction, then co
b1a0: 6e 74 69 6e 75 65 20 63 6f 70 79 69 6e 67 20 64  ntinue copying d
b1b0: 61 74 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  ata.#           
b1c0: 20 20 20 20 20 66 72 6f 6d 20 61 6e 20 6f 6c 64       from an old
b1d0: 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  er transaction f
b1e0: 72 6f 6d 20 74 68 65 20 72 65 6d 61 69 6e 64 65  rom the remainde
b1f0: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
b200: 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  ..#             
b210: 20 20 20 53 65 65 20 74 68 65 20 73 79 6e 63 4a     See the syncJ
b220: 6f 75 72 6e 61 6c 28 29 20 66 75 6e 63 74 69 6f  ournal() functio
b230: 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 23  n for details..#
b240: 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 2a  .# pager1-13.2.*
b250: 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 74  : Same test as t
b260: 68 65 20 70 72 65 76 69 6f 75 73 2e 20 54 68 69  he previous. Thi
b270: 73 20 74 69 6d 65 2c 20 74 68 72 6f 77 20 61 6e  s time, throw an
b280: 20 69 6e 64 65 78 20 69 6e 74 6f 0a 23 20 20 20   index into.#   
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
b2a0: 20 6d 69 78 20 74 6f 20 6d 61 6b 65 20 74 68 65   mix to make the
b2b0: 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
b2c0: 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20   more likely to 
b2d0: 63 61 74 63 68 0a 23 20 20 20 20 20 20 20 20 20  catch.#         
b2e0: 20 20 20 20 20 20 20 65 72 72 6f 72 73 2e 0a 23         errors..#
b2f0: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
b300: 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74  ault 1.tv script
b310: 20 78 53 79 6e 63 43 62 0a 74 76 20 66 69 6c 74   xSyncCb.tv filt
b320: 65 72 20 78 53 79 6e 63 0a 70 72 6f 63 20 78 53  er xSync.proc xS
b330: 79 6e 63 43 62 20 7b 6d 65 74 68 6f 64 20 66 69  yncCb {method fi
b340: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
b350: 20 73 65 74 20 74 20 5b 66 69 6c 65 20 74 61 69   set t [file tai
b360: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 69  l $filename].  i
b370: 66 20 7b 24 74 20 3d 3d 20 22 74 65 73 74 2e 64  f {$t == "test.d
b380: 62 22 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  b"} faultsim_sav
b390: 65 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e.  return SQLIT
b3a0: 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f  E_OK.}.faultsim_
b3b0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
b3c0: 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  n.db func a_stri
b3d0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 23 20 54  ng a_string..# T
b3e0: 68 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  he UPDATE statem
b3f0: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
b400: 66 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  f this test case
b410: 20 63 72 65 61 74 65 73 20 61 20 72 65 61 6c 6c   creates a reall
b420: 79 20 62 69 67 0a 23 20 6a 6f 75 72 6e 61 6c 2e  y big.# journal.
b430: 20 53 69 6e 63 65 20 74 68 65 20 63 61 63 68 65   Since the cache
b440: 2d 73 69 7a 65 20 69 73 20 6f 6e 6c 79 20 31 30  -size is only 10
b450: 20 70 61 67 65 73 2c 20 74 68 65 20 6a 6f 75 72   pages, the jour
b460: 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 0a 23 20  nal contains .# 
b470: 66 72 65 71 75 65 6e 74 20 6a 6f 75 72 6e 61 6c  frequent journal
b480: 20 68 65 61 64 65 72 73 2e 0a 23 0a 64 6f 5f 65   headers..#.do_e
b490: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
b4a0: 72 31 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 50 52  r1-13.1.1 {.  PR
b4b0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
b4c0: 20 31 30 32 34 3b 0a 20 20 50 52 41 47 4d 41 20   1024;.  PRAGMA 
b4d0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
b4e0: 45 52 53 49 53 54 3b 0a 20 20 50 52 41 47 4d 41  ERSIST;.  PRAGMA
b4f0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
b500: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43  ;.  BEGIN;.    C
b510: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
b520: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
b530: 20 4b 45 59 2c 20 62 20 42 4c 4f 42 29 3b 0a 20   KEY, b BLOB);. 
b540: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
b550: 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61  1 VALUES(NULL, a
b560: 5f 73 74 72 69 6e 67 28 34 30 30 29 29 3b 0a 20  _string(400));. 
b570: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
b580: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  1 SELECT NULL, a
b590: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
b5a0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f  M t1;          /
b5b0: 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 49 4e 53  *   2 */.    INS
b5c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
b5d0: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
b5e0: 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(400) FROM t1; 
b5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34 20           /*   4 
b600: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
b610: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
b620: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  L, a_string(400)
b630: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
b640: 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20     /*   8 */.   
b650: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
b660: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
b670: 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20  tring(400) FROM 
b680: 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t1;          /* 
b690: 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52   16 */.    INSER
b6a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
b6b0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
b6c0: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  400) FROM t1;   
b6d0: 20 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f         /*  32 */
b6e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b6f0: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
b700: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
b710: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
b720: 20 2f 2a 20 20 36 34 20 2a 2f 0a 20 20 20 20 49   /*  64 */.    I
b730: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
b740: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
b750: 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31  ing(400) FROM t1
b760: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 32  ;          /* 12
b770: 38 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20  8 */.  COMMIT;. 
b780: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
b790: 20 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29   = a_string(400)
b7a0: 3b 0a 7d 20 7b 70 65 72 73 69 73 74 7d 0a 0a 69  ;.} {persist}..i
b7b0: 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  f {$::tcl_platfo
b7c0: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77  rm(platform)!="w
b7d0: 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 52 75 6e  indows"} {.# Run
b7e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66   transactions of
b7f0: 20 69 6e 63 72 65 61 73 69 6e 67 20 73 69 7a 65   increasing size
b800: 73 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f  s. Eventually, o
b810: 6e 65 20 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e  ne (or more than
b820: 20 6f 6e 65 29 0a 23 20 6f 66 20 74 68 65 73 65   one).# of these
b830: 20 77 69 6c 6c 20 77 72 69 74 65 20 6a 75 73 74   will write just
b840: 20 65 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20   enough content 
b850: 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
b860: 6f 6c 64 20 68 65 61 64 65 72 73 20 63 72 65 61  old headers crea
b870: 74 65 64 20 0a 23 20 62 79 20 74 68 65 20 74 72  ted .# by the tr
b880: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
b890: 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65   block above lie
b8a0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  s immediately af
b8b0: 74 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  ter the content.
b8c0: 23 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20  # journalled by 
b8d0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
b8e0: 73 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b  saction..#.for {
b8f0: 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70  set nUp 1} {$nUp
b900: 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20  <64} {incr nUp} 
b910: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
b920: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e  est pager1-13.1.
b930: 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20  2.$nUp.1 { .    
b940: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
b950: 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20  = a_string(399) 
b960: 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a  WHERE a <= $nUp.
b970: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63    } {}.  do_exec
b980: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b990: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20  13.1.2.$nUp.2 { 
b9a0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
b9b0: 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a  _check } {ok} ..
b9c0: 20 20 23 20 54 72 79 20 74 6f 20 61 63 63 65 73    # Try to acces
b9d0: 73 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f  s the snapshot o
b9e0: 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
b9f0: 6d 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33  m..  #.  sqlite3
ba00: 20 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a   db2 sv_test.db.
ba10: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ba20: 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b  -13.1.2.$nUp.3 {
ba30: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
ba40: 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68  ELECT sum(length
ba50: 28 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64  (b)) FROM t1 } d
ba60: 62 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32  b2.  } [expr {12
ba70: 38 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29  8*400 - ($nUp-1)
ba80: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }].  do_test pag
ba90: 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e  er1-13.1.2.$nUp.
baa0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
bab0: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
bac0: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20  ty_check } db2. 
bad0: 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c   } {ok}.  db2 cl
bae0: 6f 73 65 0a 7d 0a 7d 0a 0a 69 66 20 7b 24 3a 3a  ose.}.}..if {$::
baf0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
bb00: 74 66 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73  tform)!="windows
bb10: 22 7d 20 7b 0a 23 20 53 61 6d 65 20 74 65 73 74  "} {.# Same test
bb20: 20 61 73 20 61 62 6f 76 65 2e 20 42 75 74 20 74   as above. But t
bb30: 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 61 6e  his time with an
bb40: 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61   index on the ta
bb50: 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ble..#.do_execsq
bb60: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
bb70: 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .2.1 {.  CREATE 
bb80: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62  INDEX i1 ON t1(b
bb90: 29 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53  );.  UPDATE t1 S
bba0: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
bbb0: 34 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b  400);.} {}.for {
bbc0: 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70  set nUp 1} {$nUp
bbd0: 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20  <64} {incr nUp} 
bbe0: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
bbf0: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
bc00: 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20  2.$nUp.1 { .    
bc10: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
bc20: 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20  = a_string(399) 
bc30: 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a  WHERE a <= $nUp.
bc40: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63    } {}.  do_exec
bc50: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
bc60: 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20  13.2.2.$nUp.2 { 
bc70: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
bc80: 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20  _check } {ok} . 
bc90: 20 73 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f   sqlite3 db2 sv_
bca0: 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73  test.db.  do_tes
bcb0: 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e  t pager1-13.2.2.
bcc0: 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65  $nUp.3 {.    exe
bcd0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75  csql { SELECT su
bce0: 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f  m(length(b)) FRO
bcf0: 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b  M t1 } db2.  } [
bd00: 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20  expr {128*400 - 
bd10: 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f  ($nUp-1)}].  do_
bd20: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32  test pager1-13.2
bd30: 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20  .2.$nUp.4 {.    
bd40: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
bd50: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
bd60: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a   } db2.  } {ok}.
bd70: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a    db2 close.}.}.
bd80: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
bd90: 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete..#----------
bda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
bde0: 23 20 54 65 73 74 20 73 70 65 63 61 6c 20 22 50  # Test specal "P
bdf0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
be00: 64 65 3d 4f 46 46 22 20 74 65 73 74 20 63 61 73  de=OFF" test cas
be10: 65 73 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64  es..#.faultsim_d
be20: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
be30: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
be40: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b   pager1-14.1.1 {
be50: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
be60: 6c 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20  l_mode = OFF;.  
be70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
be80: 61 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a  a, b);.  BEGIN;.
be90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bea0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
beb0: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c  .  COMMIT;.  SEL
bec0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d  ECT * FROM t1;.}
bed0: 20 7b 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61   {off 1 2}.do_ca
bee0: 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65  tchsql_test page
bef0: 72 31 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45  r1-14.1.2 {.  BE
bf00: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
bf10: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
bf20: 2c 20 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b  , 4);.  ROLLBACK
bf30: 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78  ;.} {0 {}}.do_ex
bf40: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
bf50: 31 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  1-14.1.3 {.  SEL
bf60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d  ECT * FROM t1;.}
bf70: 20 7b 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73   {1 2}.do_catchs
bf80: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
bf90: 34 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b  4.1.4 {.  BEGIN;
bfa0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
bfb0: 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29   t1(rowid, a, b)
bfc0: 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20   SELECT a+3, b, 
bfd0: 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  b FROM t1;.    I
bfe0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f  NSERT INTO t1(ro
bff0: 77 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43  wid, a, b) SELEC
c000: 54 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d  T a+3, b, b FROM
c010: 20 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d 41   t1;.} {1 {PRIMA
c020: 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20 75  RY KEY must be u
c030: 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65 63 73  nique}}.do_execs
c040: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c050: 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49 54  4.1.5 {.  COMMIT
c060: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
c070: 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20 32 20 32  M t1;.} {1 2 2 2
c080: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
c090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
c0d0: 54 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e 64  Test opening and
c0e0: 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67   closing the pag
c0f0: 65 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77 69  er sub-system wi
c100: 74 68 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c  th different val
c110: 75 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73 71  ues.# for the sq
c120: 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69  lite3_vfs.szOsFi
c130: 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a 66  le variable..#.f
c140: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
c150: 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65  nd_reopen.do_exe
c160: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c170: 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  -15.0 {.  CREATE
c180: 20 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29 3b   TABLE tx(y, z);
c190: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
c1a0: 78 20 56 41 4c 55 45 53 28 27 41 79 75 74 74 68  x VALUES('Ayutth
c1b0: 61 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27 29  aya', 'Beijing')
c1c0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
c1d0: 74 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64 6f  tx VALUES('Londo
c1e0: 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d 20  n', 'Tokyo');.} 
c1f0: 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 20  {}.db close.for 
c200: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35 31  {set i 0} {$i<51
c210: 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b 0a  3} {incr i 3} {.
c220: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65    testvfs tv -de
c230: 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69 6c  fault 1 -szosfil
c240: 65 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20 64  e $i.  sqlite3 d
c250: 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 65  b test.db.  do_e
c260: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
c270: 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20 20  r1-15.$i.1 {.   
c280: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
c290: 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61 79  x;.  } {Ayutthay
c2a0: 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f 6e  a Beijing London
c2b0: 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c 6f   Tokyo}.  db clo
c2c0: 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d  se.  tv delete.}
c2d0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
c2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43  ------------.# C
c320: 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20  heck that it is 
c330: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
c340: 6f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  open a database 
c350: 66 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c 6c  file if the full
c360: 20 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20 61   path.# to the a
c370: 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e 61  ssociated journa
c380: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6c  l file will be l
c390: 6f 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69 74  onger than sqlit
c3a0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
c3b0: 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20  e..#.testvfs tv 
c3c0: 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63  -default 1.tv sc
c3d0: 72 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76 20  ript xOpenCb.tv 
c3e0: 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72 6f  filter xOpen.pro
c3f0: 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68 6f  c xOpenCb {metho
c400: 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d  d filename args}
c410: 20 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c 65 5f   {.  set ::file_
c420: 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  len [string leng
c430: 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 7d 0a  th $filename].}.
c440: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
c450: 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  db.db close.tv d
c460: 65 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65 74 20  elete..for {set 
c470: 69 69 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65  ii [expr $::file
c480: 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20 3c 20  _len-5]} {$ii < 
c490: 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65  [expr $::file_le
c4a0: 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69 69 7d  n+20]} {incr ii}
c4b0: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
c4c0: 2d 64 65 66 61 75 6c 74 20 31 20 2d 6d 78 70 61  -default 1 -mxpa
c4d0: 74 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20 23 20  thname $ii..  # 
c4e0: 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  The length of th
c4f0: 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 66  e full path to f
c500: 69 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a 6f 75  ile "test.db-jou
c510: 72 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66 69 6c  rnal" is ($::fil
c520: 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20 49 66  e_len+8)..  # If
c530: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20   the configured 
c540: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
c550: 74 68 6e 61 6d 65 20 76 61 6c 75 65 20 67 72 65  thname value gre
c560: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
c570: 61 6c 20 74 6f 0a 20 20 23 20 74 68 69 73 2c 20  al to.  # this, 
c580: 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 63 61  then the file ca
c590: 6e 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f 74 68  n be opened. Oth
c5a0: 65 72 77 69 73 65 2c 20 69 74 20 63 61 6e 6e 6f  erwise, it canno
c5b0: 74 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 69 69  t..  #.  if {$ii
c5c0: 20 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c   >= [expr $::fil
c5d0: 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20 20 20  e_len+8]} {.    
c5e0: 73 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d 0a 20  set res {0 {}}. 
c5f0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65   } else {.    se
c600: 74 20 72 65 73 20 7b 31 20 7b 75 6e 61 62 6c 65  t res {1 {unable
c610: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
c620: 65 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a 20 20  e file}}.  }..  
c630: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
c640: 36 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20 6c 69  6.1.$ii {.    li
c650: 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69  st [catch { sqli
c660: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d  te3 db test.db }
c670: 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 24   msg] $msg.  } $
c680: 72 65 73 0a 0a 20 20 63 61 74 63 68 20 7b 64 62  res..  catch {db
c690: 20 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64 65 6c   close}.  tv del
c6a0: 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ete.}..#--------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6f0: 2d 0a 23 20 54 65 73 74 20 22 50 52 41 47 4d 41  -.# Test "PRAGMA
c700: 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 22 2e   omit_readlock".
c710: 20 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 31   .#.#   pager1-1
c720: 37 2e 24 74 6e 2e 31 2e 2a 3a 20 54 65 73 74 20  7.$tn.1.*: Test 
c730: 74 68 61 74 20 69 66 20 61 20 73 65 63 6f 6e 64  that if a second
c740: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
c750: 61 6e 20 6f 70 65 6e 20 0a 23 20 20 20 20 20 20  an open .#      
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
c780: 2c 20 69 74 20 69 73 20 6e 6f 74 20 75 73 75 61  , it is not usua
c790: 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  lly possible to 
c7a0: 77 72 69 74 65 20 0a 23 20 20 20 20 20 20 20 20  write .#        
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
c7c0: 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 23 20  e database..#.# 
c7d0: 20 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e    pager1-17.$tn.
c7e0: 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69  2.*: Test that i
c7f0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e  f the second con
c800: 6e 65 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  nection was open
c810: 65 64 20 77 69 74 68 0a 23 20 20 20 20 20 20 20  ed with.#       
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
c830: 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  he SQLITE_OPEN_R
c840: 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20 61 6e  EADONLY flag, an
c850: 64 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  d .#            
c860: 20 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d            "PRAGM
c870: 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20  A omit_readlock 
c880: 3d 20 31 22 20 69 73 20 65 78 65 63 75 74 65 64  = 1" is executed
c890: 20 62 65 66 6f 72 65 20 61 74 74 61 63 68 69 6e   before attachin
c8a0: 67 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  g.#             
c8b0: 20 20 20 20 20 20 20 20 20 74 68 65 20 64 61 74           the dat
c8c0: 61 62 61 73 65 20 61 6e 64 20 6f 70 65 6e 69 6e  abase and openin
c8d0: 67 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  g a read-transac
c8e0: 74 69 6f 6e 20 6f 6e 20 69 74 2c 20 69 74 20 69  tion on it, it i
c8f0: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
c900: 20 20 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c           possibl
c910: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64  e to write the d
c920: 62 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  b..#.#   pager1-
c930: 31 37 2e 24 74 6e 2e 33 2e 2a 3a 20 54 65 73 74  17.$tn.3.*: Test
c940: 20 74 68 61 74 20 69 66 20 74 68 65 20 73 65 63   that if the sec
c950: 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ond connection w
c960: 61 73 20 2a 6e 6f 74 2a 20 6f 70 65 6e 65 64 20  as *not* opened 
c970: 77 69 74 68 0a 23 20 20 20 20 20 20 20 20 20 20  with.#          
c980: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
c990: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
c9a0: 4f 4e 4c 59 20 66 6c 61 67 2c 20 65 78 65 63 75  ONLY flag, execu
c9b0: 74 69 6e 67 20 0a 23 20 20 20 20 20 20 20 20 20  ting .#         
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50 52               "PR
c9d0: 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f  AGMA omit_readlo
c9e0: 63 6b 20 3d 20 31 22 20 68 61 73 20 6e 6f 20 65  ck = 1" has no e
c9f0: 66 66 65 63 74 2e 0a 23 0a 64 6f 5f 6d 75 6c 74  ffect..#.do_mult
ca00: 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20  iclient_test tn 
ca10: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  {.  do_test page
ca20: 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 31 20 7b 0a  r1-17.$tn.1.1 {.
ca30: 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20      sql1 { .    
ca40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
ca50: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49  1(a, b);.      I
ca60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
ca70: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
ca80: 7d 0a 20 20 20 20 73 71 6c 32 20 7b 0a 20 20 20  }.    sql2 {.   
ca90: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
caa0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
cab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32  ;.    }.  } {1 2
cac0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
cad0: 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 32 20 7b 0a  r1-17.$tn.1.2 {.
cae0: 20 20 20 20 63 73 71 6c 31 20 7b 20 49 4e 53 45      csql1 { INSE
caf0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
cb00: 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 31  S(3, 4) }.  } {1
cb10: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
cb20: 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  cked}}.  do_test
cb30: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31   pager1-17.$tn.1
cb40: 2e 33 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  .3 {.    sql2 { 
cb50: 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 73 71 6c  COMMIT }.    sql
cb60: 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  1 { INSERT INTO 
cb70: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20  t1 VALUES(3, 4) 
cb80: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74  }.  } {}..  do_t
cb90: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
cba0: 6e 2e 32 2e 31 20 7b 0a 20 20 20 20 63 6f 64 65  n.2.1 {.    code
cbb0: 32 20 7b 0a 20 20 20 20 20 20 64 62 32 20 63 6c  2 {.      db2 cl
cbc0: 6f 73 65 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ose.      sqlite
cbd0: 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79 3a 20 2d  3 db2 :memory: -
cbe0: 72 65 61 64 6f 6e 6c 79 20 31 0a 20 20 20 20 7d  readonly 1.    }
cbf0: 0a 20 20 20 20 73 71 6c 32 20 7b 20 0a 20 20 20  .    sql2 { .   
cc00: 20 20 20 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72     PRAGMA omit_r
cc10: 65 61 64 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  eadlock = 1;.   
cc20: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
cc30: 64 62 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20  db' AS two;.    
cc40: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
cc50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
cc60: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20  .    }.  } {1 2 
cc70: 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  3 4}.  do_test p
cc80: 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 32  ager1-17.$tn.2.2
cc90: 20 7b 20 73 71 6c 31 20 22 49 4e 53 45 52 54 20   { sql1 "INSERT 
cca0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35  INTO t1 VALUES(5
ccb0: 2c 20 36 29 22 20 7d 20 7b 7d 0a 20 20 64 6f 5f  , 6)" } {}.  do_
ccc0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24  test pager1-17.$
ccd0: 74 6e 2e 32 2e 33 20 7b 20 73 71 6c 32 20 22 53  tn.2.3 { sql2 "S
cce0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22  ELECT * FROM t1"
ccf0: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b 31   }            {1
cd00: 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73   2 3 4}.  do_tes
cd10: 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e  t pager1-17.$tn.
cd20: 32 2e 34 20 7b 20 73 71 6c 32 20 22 43 4f 4d 4d  2.4 { sql2 "COMM
cd30: 49 54 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  IT ; SELECT * FR
cd40: 4f 4d 20 74 31 22 20 7d 20 20 20 7b 31 20 32 20  OM t1" }   {1 2 
cd50: 33 20 34 20 35 20 36 7d 0a 0a 20 20 64 6f 5f 74  3 4 5 6}..  do_t
cd60: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
cd70: 6e 2e 33 2e 31 20 7b 0a 20 20 20 20 63 6f 64 65  n.3.1 {.    code
cd80: 32 20 7b 0a 20 20 20 20 20 20 64 62 32 20 63 6c  2 {.      db2 cl
cd90: 6f 73 65 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ose.      sqlite
cda0: 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79 3a 0a 20  3 db2 :memory:. 
cdb0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20     }.    sql2 { 
cdc0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6f 6d  .      PRAGMA om
cdd0: 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 3b  it_readlock = 1;
cde0: 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74  .      ATTACH 't
cdf0: 65 73 74 2e 64 62 27 20 41 53 20 74 77 6f 3b 0a  est.db' AS two;.
ce00: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
ce10: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
ce20: 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t1;.    }.  } {
ce30: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20 64  1 2 3 4 5 6}.  d
ce40: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37  o_test pager1-17
ce50: 2e 24 74 6e 2e 33 2e 32 20 7b 0a 20 20 63 73 71  .$tn.3.2 {.  csq
ce60: 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l1 { INSERT INTO
ce70: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
ce80: 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62   }.  } {1 {datab
ce90: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
cea0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ceb0: 2d 31 37 2e 24 74 6e 2e 33 2e 33 20 7b 20 73 71  -17.$tn.3.3 { sq
cec0: 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 7d  l2 COMMIT } {}.}
ced0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
cee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
cf20: 65 73 74 20 74 68 65 20 70 61 67 65 72 73 20 72  est the pagers r
cf30: 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 62  esponse to the b
cf40: 2d 74 72 65 65 20 6c 61 79 65 72 20 72 65 71 75  -tree layer requ
cf50: 65 73 74 69 6e 67 20 69 6c 6c 65 67 61 6c 20 70  esting illegal p
cf60: 61 67 65 20 0a 23 20 6e 75 6d 62 65 72 73 3a 0a  age .# numbers:.
cf70: 23 0a 23 20 20 20 2b 20 54 68 65 20 6c 6f 63 6b  #.#   + The lock
cf80: 69 6e 67 20 70 61 67 65 2c 0a 23 20 20 20 2b 20  ing page,.#   + 
cf90: 50 61 67 65 20 30 2c 0a 23 20 20 20 2b 20 41 20  Page 0,.#   + A 
cfa0: 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
cfb0: 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
cfc0: 74 68 61 6e 20 28 32 5e 33 31 2d 31 29 2e 0a 23  than (2^31-1)..#
cfd0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
cfe0: 31 38 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  18.1 {.  faultsi
cff0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
d000: 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
d010: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
d020: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
d030: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
d040: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
d050: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
d060: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
d070: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
d080: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
d090: 73 74 72 69 6e 67 28 32 30 30 29 29 3b 0a 20 20  string(200));.  
d0a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d0b0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d0c0: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d0d0: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d0e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d0f0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d100: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d110: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d120: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d130: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d140: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d150: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d160: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d170: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d180: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d190: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d1a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d1b0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d1c0: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d1d0: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d1e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d1f0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d200: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d210: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d220: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d230: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
d240: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
d250: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
d260: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
d270: 61 67 65 72 31 2d 31 38 2e 32 20 7b 0a 20 20 73  ager1-18.2 {.  s
d280: 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20  et root [db one 
d290: 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65  "SELECT rootpage
d2a0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
d2b0: 74 65 72 22 5d 0a 20 20 73 65 74 20 6c 6f 63 6b  ter"].  set lock
d2c0: 69 6e 67 70 61 67 65 20 5b 65 78 70 72 20 28 30  ingpage [expr (0
d2d0: 78 31 30 30 30 30 2f 31 30 32 34 29 20 2b 20 31  x10000/1024) + 1
d2e0: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ].  execsql {.  
d2f0: 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c    PRAGMA writabl
d300: 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  e_schema = 1;.  
d310: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
d320: 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70  master SET rootp
d330: 61 67 65 20 3d 20 24 6c 6f 63 6b 69 6e 67 70 61  age = $lockingpa
d340: 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
d350: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
d360: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
d370: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
d380: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t1 } db2.} {1 {d
d390: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d3a0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d3b0: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
d3c0: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 33 20  est pager1-18.3 
d3d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
d3e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
d3f0: 32 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  2(x);.    INSERT
d400: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
d410: 61 5f 73 74 72 69 6e 67 28 35 30 30 30 29 29 3b  a_string(5000));
d420: 0a 20 20 7d 0a 20 20 73 65 74 20 70 67 6e 6f 20  .  }.  set pgno 
d430: 5b 65 78 70 72 20 28 5b 66 69 6c 65 20 73 69 7a  [expr ([file siz
d440: 65 20 74 65 73 74 2e 64 62 5d 20 2f 20 31 30 32  e test.db] / 102
d450: 34 29 2d 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72  4)-2].  hexio_wr
d460: 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ite test.db [exp
d470: 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34  r ($pgno-1)*1024
d480: 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 00000000.  sql
d490: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
d4a0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d4b0: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46  LECT length(x) F
d4c0: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
d4d0: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
d4e0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
d4f0: 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  med}}.db2 close.
d500: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d510: 38 2e 34 20 7b 0a 20 20 68 65 78 69 6f 5f 77 72  8.4 {.  hexio_wr
d520: 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ite test.db [exp
d530: 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34  r ($pgno-1)*1024
d540: 5d 20 39 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 90000000.  sql
d550: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
d560: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d570: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46  LECT length(x) F
d580: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
d590: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
d5a0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
d5b0: 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  med}}.db2 close.
d5c0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d5d0: 38 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  8.5 {.  sqlite3 
d5e0: 64 62 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20  db "".  execsql 
d5f0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
d600: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
d610: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
d620: 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47  (a, b);.    PRAG
d630: 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
d640: 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41  ma = 1;.    UPDA
d650: 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TE sqlite_master
d660: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 35 20   SET rootpage=5 
d670: 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d  WHERE tbl_name =
d680: 20 27 74 31 27 3b 0a 20 20 20 20 50 52 41 47 4d   't1';.    PRAGM
d690: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
d6a0: 61 20 3d 20 30 3b 0a 20 20 20 20 41 4c 54 45 52  a = 0;.    ALTER
d6b0: 20 54 41 42 4c 45 20 74 31 20 52 45 4e 41 4d 45   TABLE t1 RENAME
d6c0: 20 54 4f 20 78 31 3b 0a 20 20 7d 0a 20 20 63 61   TO x1;.  }.  ca
d6d0: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
d6e0: 2a 20 46 52 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31  * FROM x1 }.} {1
d6f0: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
d700: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
d710: 65 64 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 64  ed}}.db close..d
d720: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38  o_test pager1-18
d730: 2e 36 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .6 {.  faultsim_
d740: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
d750: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
d760: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
d770: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
d780: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
d790: 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
d7a0: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
d7b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
d7c0: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
d7d0: 67 28 38 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  g(800));.    INS
d7e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
d7f0: 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29  ES(a_string(800)
d800: 29 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 6f  );.  }..  set ro
d810: 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45  ot [db one "SELE
d820: 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
d830: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d   sqlite_master"]
d840: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 0a 20 20 68  .  db close..  h
d850: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
d860: 64 62 20 5b 65 78 70 72 20 28 24 72 6f 6f 74 2d  db [expr ($root-
d870: 31 29 2a 31 30 32 34 20 2b 20 38 5d 20 30 30 30  1)*1024 + 8] 000
d880: 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
d890: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  db test.db.  cat
d8a0: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c  chsql { SELECT l
d8b0: 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20 74 31  ength(x) FROM t1
d8c0: 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73   }.} {1 {databas
d8d0: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
d8e0: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 0a 64 6f 5f  malformed}}..do_
d8f0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 39 2e 31  test pager1-19.1
d900: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
d910: 22 22 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73  "".  db func a_s
d920: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
d930: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
d940: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
d950: 3d 20 35 31 32 3b 0a 20 20 20 20 50 52 41 47 4d  = 512;.    PRAGM
d960: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
d970: 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  1;.    CREATE TA
d980: 42 4c 45 20 74 31 28 61 61 2c 20 61 62 2c 20 61  BLE t1(aa, ab, a
d990: 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61  c, ad, ae, af, a
d9a0: 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61  g, ah, ai, aj, a
d9b0: 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20  k, al, am, an,. 
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62     ba, bb, bc, b
d9e0: 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62  d, be, bf, bg, b
d9f0: 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62  h, bi, bj, bk, b
da00: 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20  l, bm, bn,.     
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
da20: 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63  a, cb, cc, cd, c
da30: 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63  e, cf, cg, ch, c
da40: 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63  i, cj, ck, cl, c
da50: 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, cn,.         
da60: 20 20 20 20 20 20 20 20 20 20 20 64 61 2c 20 64             da, d
da70: 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64  b, dc, dd, de, d
da80: 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64  f, dg, dh, di, d
da90: 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64  j, dk, dl, dm, d
daa0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dab0: 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65         ea, eb, e
dac0: 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65  c, ed, ee, ef, e
dad0: 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65  g, eh, ei, ej, e
dae0: 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20  k, el, em, en,. 
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66     fa, fb, fc, f
db10: 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66  d, fe, ff, fg, f
db20: 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66  h, fi, fj, fk, f
db30: 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20  l, fm, fn,.     
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
db50: 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67  a, gb, gc, gd, g
db60: 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67  e, gf, gg, gh, g
db70: 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67  i, gj, gk, gl, g
db80: 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, gn,.         
db90: 20 20 20 20 20 20 20 20 20 20 20 68 61 2c 20 68             ha, h
dba0: 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68  b, hc, hd, he, h
dbb0: 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68  f, hg, hh, hi, h
dbc0: 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68  j, hk, hl, hm, h
dbd0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dbe0: 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69         ia, ib, i
dbf0: 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69  c, id, ie, if, i
dc00: 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69  g, ih, ii, ij, i
dc10: 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20  k, il, im, ix,. 
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a     ja, jb, jc, j
dc40: 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a  d, je, jf, jg, j
dc50: 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a  h, ji, jj, jk, j
dc60: 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20  l, jm, jn,.     
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
dc80: 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b  a, kb, kc, kd, k
dc90: 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b  e, kf, kg, kh, k
dca0: 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b  i, kj, kk, kl, k
dcb0: 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, kn,.         
dcc0: 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c             la, l
dcd0: 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c  b, lc, ld, le, l
dce0: 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c  f, lg, lh, li, l
dcf0: 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c  j, lk, ll, lm, l
dd00: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dd10: 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d         ma, mb, m
dd20: 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d  c, md, me, mf, m
dd30: 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d  g, mh, mi, mj, m
dd40: 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20  k, ml, mm, mn.  
dd50: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
dd60: 54 41 42 4c 45 20 74 32 28 61 61 2c 20 61 62 2c  TABLE t2(aa, ab,
dd70: 20 61 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c   ac, ad, ae, af,
dd80: 20 61 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c   ag, ah, ai, aj,
dd90: 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c   ak, al, am, an,
dda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ddb0: 20 20 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c       ba, bb, bc,
ddc0: 20 62 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c   bd, be, bf, bg,
ddd0: 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c   bh, bi, bj, bk,
dde0: 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20   bl, bm, bn,.   
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 63 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c   ca, cb, cc, cd,
de10: 20 63 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c   ce, cf, cg, ch,
de20: 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c   ci, cj, ck, cl,
de30: 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20   cm, cn,.       
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 2c               da,
de50: 20 64 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c   db, dc, dd, de,
de60: 20 64 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c   df, dg, dh, di,
de70: 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c   dj, dk, dl, dm,
de80: 20 64 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   dn,.           
de90: 20 20 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c           ea, eb,
dea0: 20 65 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c   ec, ed, ee, ef,
deb0: 20 65 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c   eg, eh, ei, ej,
dec0: 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c   ek, el, em, en,
ded0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dee0: 20 20 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c       fa, fb, fc,
def0: 20 66 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c   fd, fe, ff, fg,
df00: 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c   fh, fi, fj, fk,
df10: 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20   fl, fm, fn,.   
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 67 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c   ga, gb, gc, gd,
df40: 20 67 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c   ge, gf, gg, gh,
df50: 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c   gi, gj, gk, gl,
df60: 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20   gm, gn,.       
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 2c               ha,
df80: 20 68 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c   hb, hc, hd, he,
df90: 20 68 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c   hf, hg, hh, hi,
dfa0: 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c   hj, hk, hl, hm,
dfb0: 20 68 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   hn,.           
dfc0: 20 20 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c           ia, ib,
dfd0: 20 69 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c   ic, id, ie, if,
dfe0: 20 69 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c   ig, ih, ii, ij,
dff0: 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c   ik, il, im, ix,
e000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e010: 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c       ja, jb, jc,
e020: 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c   jd, je, jf, jg,
e030: 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c   jh, ji, jj, jk,
e040: 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20   jl, jm, jn,.   
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c   ka, kb, kc, kd,
e070: 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c   ke, kf, kg, kh,
e080: 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c   ki, kj, kk, kl,
e090: 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20   km, kn,.       
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c               la,
e0b0: 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c   lb, lc, ld, le,
e0c0: 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c   lf, lg, lh, li,
e0d0: 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c   lj, lk, ll, lm,
e0e0: 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   ln,.           
e0f0: 20 20 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c           ma, mb,
e100: 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c   mc, md, me, mf,
e110: 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c   mg, mh, mi, mj,
e120: 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a   mk, ml, mm, mn.
e130: 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52      );.    INSER
e140: 54 20 49 4e 54 4f 20 74 31 28 61 61 29 20 56 41  T INTO t1(aa) VA
e150: 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31  LUES( a_string(1
e160: 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20 49 4e  00000) );.    IN
e170: 53 45 52 54 20 49 4e 54 4f 20 74 32 28 61 61 29  SERT INTO t2(aa)
e180: 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e   VALUES( a_strin
e190: 67 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20 20  g(100000) );.   
e1a0: 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b   VACUUM;.  }.} {
e1b0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
e1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
e200: 54 65 73 74 20 61 20 63 6f 75 70 6c 65 20 6f 66  Test a couple of
e210: 20 73 70 65 63 69 61 6c 20 63 61 73 65 73 20 74   special cases t
e220: 68 61 74 20 63 6f 6d 65 20 75 70 20 77 68 69 6c  hat come up whil
e230: 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 0a 23 20  e committing .# 
e240: 74 72 61 6e 73 61 63 74 69 6f 6e 73 3a 0a 23 0a  transactions:.#.
e250: 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e 31 2e  #   pager1-20.1.
e260: 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61 6e  *: Committing an
e270: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
e280: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ase transaction 
e290: 77 68 65 6e 20 74 68 65 20 0a 23 20 20 20 20 20  when the .#     
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
e2b0: 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65  abase has not be
e2c0: 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 74 20 61  en modified at a
e2d0: 6c 6c 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  ll..#.#   pager1
e2e0: 2d 32 30 2e 32 2e 2a 3a 20 41 73 20 61 62 6f 76  -20.2.*: As abov
e2f0: 65 2c 20 62 75 74 20 77 69 74 68 20 61 20 6e 6f  e, but with a no
e300: 72 6d 61 6c 20 64 62 20 69 6e 20 65 78 63 6c 75  rmal db in exclu
e310: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
e320: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
e330: 32 30 2e 33 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69  20.3.*: Committi
e340: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
e350: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 77 68 65   in WAL mode whe
e360: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
e370: 68 61 73 0a 23 20 20 20 20 20 20 20 20 20 20 20  has.#           
e380: 20 20 20 20 20 20 20 62 65 65 6e 20 6d 6f 64 69         been modi
e390: 66 69 65 64 2c 20 62 75 74 20 61 6c 6c 20 64 69  fied, but all di
e3a0: 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20 62  rty pages have b
e3b0: 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 0a  een flushed to .
e3c0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
e3d0: 20 20 20 64 69 73 6b 20 62 65 66 6f 72 65 20 74     disk before t
e3e0: 68 65 20 63 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f  he commit..#.do_
e3f0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31  test pager1-20.1
e400: 2e 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62  .1 {.  catch {db
e410: 20 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65   close}.  sqlite
e420: 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20  3 db :memory:.  
e430: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
e440: 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74  EATE TABLE one(t
e450: 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20  wo, three);.    
e460: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20  INSERT INTO one 
e470: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
e480: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
e490: 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 32  st pager1-20.1.2
e4a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
e4b0: 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49     BEGIN EXCLUSI
e4c0: 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  VE;.    COMMIT;.
e4d0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73    }.} {}..do_tes
e4e0: 74 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 31 20  t pager1-20.2.1 
e4f0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
e500: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
e510: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
e520: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
e530: 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a  de = exclusive;.
e540: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
e550: 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73  al_mode = persis
e560: 74 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  t;.    CREATE TA
e570: 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72  BLE one(two, thr
e580: 65 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ee);.    INSERT 
e590: 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28  INTO one VALUES(
e5a0: 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d  'a', 'b');.  }.}
e5b0: 20 7b 65 78 63 6c 75 73 69 76 65 20 70 65 72 73   {exclusive pers
e5c0: 69 73 74 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ist}.do_test pag
e5d0: 65 72 31 2d 32 30 2e 32 2e 32 20 7b 0a 20 20 65  er1-20.2.2 {.  e
e5e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
e5f0: 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  IN EXCLUSIVE;.  
e600: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
e610: 7b 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 77 61  {}..ifcapable wa
e620: 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  l {.  do_test pa
e630: 67 65 72 31 2d 32 30 2e 33 2e 31 20 7b 0a 20 20  ger1-20.3.1 {.  
e640: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
e650: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20  e_and_reopen.   
e660: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
e670: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65  g a_string.    e
e680: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
e690: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
e6a0: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 50 52 41   = 10;.      PRA
e6b0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
e6c0: 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 42 45   = wal;.      BE
e6d0: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45  GIN;.        CRE
e6e0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
e6f0: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
e700: 54 41 42 4c 45 20 74 32 28 79 29 3b 0a 20 20 20  TABLE t2(y);.   
e710: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
e720: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
e730: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20  ing(800));.     
e740: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e750: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
e760: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
e770: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a          /*   2 *
e780: 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  /.        INSERT
e790: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
e7a0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
e7b0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
e7c0: 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 20  *   4 */.       
e7d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
e7e0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
e7f0: 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  800) FROM t1;   
e800: 20 20 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a        /*   8 */.
e810: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
e820: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
e830: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
e840: 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   t1;         /* 
e850: 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 49   16 */.        I
e860: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
e870: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
e880: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
e890: 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20      /*  32 */.  
e8a0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
e8b0: 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f  }.  } {wal}.  do
e8c0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e  _test pager1-20.
e8d0: 33 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  3.2 {.    execsq
e8e0: 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  l {.      BEGIN;
e8f0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
e900: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 78 78  TO t2 VALUES('xx
e910: 78 78 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xx');.    }.    
e920: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
e930: 20 33 32 20 74 31 0a 20 20 20 20 65 78 65 63 73   32 t1.    execs
e940: 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d  ql COMMIT.  } {}
e950: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
e960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
e9a0: 20 54 65 73 74 20 74 68 61 74 20 61 20 57 41 4c   Test that a WAL
e9b0: 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f   database may no
e9c0: 74 20 62 65 20 6f 70 65 6e 65 64 20 69 66 3a 0a  t be opened if:.
e9d0: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e  #.#   pager1-21.
e9e0: 31 2e 2a 3a 20 54 68 65 20 56 46 53 20 68 61 73  1.*: The VFS has
e9f0: 20 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c 65 73   an iVersion les
ea00: 73 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23 20 20  s than 2, or.#  
ea10: 20 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a 3a 20   pager1-21.2.*: 
ea20: 54 68 65 20 56 46 53 20 64 6f 65 73 20 6e 6f 74  The VFS does not
ea30: 20 70 72 6f 76 69 64 65 20 78 53 68 6d 58 58 58   provide xShmXXX
ea40: 28 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a 69 66  () methods..#.if
ea50: 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20  capable wal {.  
ea60: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
ea70: 31 2e 30 20 7b 0a 20 20 20 20 66 61 75 6c 74 73  1.0 {.    faults
ea80: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
ea90: 6f 70 65 6e 0a 20 20 20 20 65 78 65 63 73 71 6c  open.    execsql
eaa0: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
eab0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
eac0: 41 4c 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  AL;.      CREATE
ead0: 20 54 41 42 4c 45 20 6b 6f 28 63 20 44 45 46 41   TABLE ko(c DEFA
eae0: 55 4c 54 20 27 61 62 63 27 2c 20 62 20 44 45 46  ULT 'abc', b DEF
eaf0: 41 55 4c 54 20 27 64 65 66 27 29 3b 0a 20 20 20  AULT 'def');.   
eb00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b     INSERT INTO k
eb10: 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53  o DEFAULT VALUES
eb20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c  ;.    }.  } {wal
eb30: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
eb40: 72 31 2d 32 31 2e 31 20 7b 0a 20 20 20 20 74 65  r1-21.1 {.    te
eb50: 73 74 76 66 73 20 74 76 20 2d 6e 6f 73 68 6d 20  stvfs tv -noshm 
eb60: 31 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  1.    sqlite3 db
eb70: 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74  2 test.db -vfs t
eb80: 76 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  v.    catchsql {
eb90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b   SELECT * FROM k
eba0: 6f 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b  o } db2.  } {1 {
ebb0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
ebc0: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20  atabase file}}. 
ebd0: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20   db2 close.  tv 
ebe0: 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74  delete.  do_test
ebf0: 20 70 61 67 65 72 31 2d 32 31 2e 32 20 7b 0a 20   pager1-21.2 {. 
ec00: 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 69     testvfs tv -i
ec10: 76 65 72 73 69 6f 6e 20 31 0a 20 20 20 20 73 71  version 1.    sq
ec20: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
ec30: 62 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61  b -vfs tv.    ca
ec40: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
ec50: 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a  * FROM ko } db2.
ec60: 20 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74    } {1 {unable t
ec70: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
ec80: 66 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f  file}}.  db2 clo
ec90: 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d  se.  tv delete.}
eca0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
ecb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ece0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
ecf0: 65 73 74 20 74 68 61 74 20 61 20 22 50 52 41 47  est that a "PRAG
ed00: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
ed10: 74 22 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31  t":.#.#   pager1
ed20: 2d 32 32 2e 31 2e 2a 3a 20 69 73 20 61 20 6e 6f  -22.1.*: is a no
ed30: 2d 6f 70 20 6f 6e 20 61 20 6e 6f 6e 2d 57 41 4c  -op on a non-WAL
ed40: 20 64 62 2c 20 61 6e 64 0a 23 20 20 20 70 61 67   db, and.#   pag
ed50: 65 72 31 2d 32 32 2e 32 2e 2a 3a 20 64 6f 65 73  er1-22.2.*: does
ed60: 20 6e 6f 74 20 63 61 75 73 65 20 78 53 79 6e 63   not cause xSync
ed70: 20 63 61 6c 6c 73 20 77 69 74 68 20 61 20 73 79   calls with a sy
ed80: 6e 63 68 72 6f 6e 6f 75 73 3d 6f 66 66 20 64 62  nchronous=off db
ed90: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
eda0: 72 31 2d 32 32 2e 31 2e 31 20 7b 0a 20 20 66 61  r1-22.1.1 {.  fa
edb0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
edc0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
edd0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
ede0: 54 41 42 4c 45 20 6b 6f 28 63 20 44 45 46 41 55  TABLE ko(c DEFAU
edf0: 4c 54 20 27 61 62 63 27 2c 20 62 20 44 45 46 41  LT 'abc', b DEFA
ee00: 55 4c 54 20 27 64 65 66 27 29 3b 0a 20 20 20 20  ULT 'def');.    
ee10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44  INSERT INTO ko D
ee20: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20  EFAULT VALUES;. 
ee30: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
ee40: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
ee50: 6f 69 6e 74 20 7d 0a 7d 20 7b 30 20 2d 31 20 2d  oint }.} {0 -1 -
ee60: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
ee70: 31 2d 32 32 2e 32 2e 31 20 7b 0a 20 20 74 65 73  1-22.2.1 {.  tes
ee80: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
ee90: 20 31 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78   1.  tv filter x
eea0: 53 79 6e 63 0a 20 20 74 76 20 73 63 72 69 70 74  Sync.  tv script
eeb0: 20 78 53 79 6e 63 43 62 0a 20 20 70 72 6f 63 20   xSyncCb.  proc 
eec0: 78 53 79 6e 63 43 62 20 7b 61 72 67 73 7d 20 7b  xSyncCb {args} {
eed0: 69 6e 63 72 20 3a 3a 73 79 6e 63 63 6f 75 6e 74  incr ::synccount
eee0: 7d 0a 20 20 73 65 74 20 3a 3a 73 79 6e 63 63 6f  }.  set ::syncco
eef0: 75 6e 74 20 30 0a 20 20 73 71 6c 69 74 65 33 20  unt 0.  sqlite3 
ef00: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
ef10: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
ef20: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
ef30: 6f 66 66 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  off;.    PRAGMA 
ef40: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
ef50: 41 4c 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  AL;.    INSERT I
ef60: 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56  NTO ko DEFAULT V
ef70: 41 4c 55 45 53 3b 0a 20 20 7d 0a 20 20 65 78 65  ALUES;.  }.  exe
ef80: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
ef90: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
efa0: 20 73 65 74 20 73 79 6e 63 63 6f 75 6e 74 0a 7d   set synccount.}
efb0: 20 7b 30 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76   {0}.db close.tv
efc0: 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d   delete..#------
efd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f010: 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66 6f 72 20  ---.# Tests for 
f020: 63 68 61 6e 67 69 6e 67 20 6a 6f 75 72 6e 61 6c  changing journal
f030: 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61 67   mode..#.#   pag
f040: 65 72 31 2d 32 33 2e 31 2e 2a 3a 20 54 65 73 74  er1-23.1.*: Test
f050: 20 74 68 61 74 20 77 68 65 6e 20 63 68 61 6e 67   that when chang
f060: 69 6e 67 20 66 72 6f 6d 20 50 45 52 53 49 53 54  ing from PERSIST
f070: 20 74 6f 20 44 45 4c 45 54 45 20 6d 6f 64 65 2c   to DELETE mode,
f080: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
f090: 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
f0a0: 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 2e  file is deleted.
f0b0: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33  .#.#   pager1-23
f0c0: 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20  .2.*: Same test 
f0d0: 61 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77 68  as above, but wh
f0e0: 69 6c 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ile a shared loc
f0f0: 6b 20 69 73 20 68 65 6c 64 0a 23 20 20 20 20 20  k is held.#     
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20               on 
f110: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f120: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
f130: 32 33 2e 33 2e 2a 3a 20 53 61 6d 65 20 74 65 73  23.3.*: Same tes
f140: 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74 20  t as above, but 
f150: 77 68 69 6c 65 20 61 20 72 65 73 65 72 76 65 64  while a reserved
f160: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20   lock is held.# 
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
f190: 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67   file..#.#   pag
f1a0: 65 72 31 2d 32 33 2e 34 2e 2a 3a 20 41 6e 64 2c  er1-23.4.*: And,
f1b0: 20 66 6f 72 20 66 75 6e 2c 20 77 68 69 6c 65 20   for fun, while 
f1c0: 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75  holding an exclu
f1d0: 73 69 76 65 20 6c 6f 63 6b 2e 0a 23 0a 23 20 20  sive lock..#.#  
f1e0: 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 2a 3a 20   pager1-23.5.*: 
f1f0: 54 72 79 20 74 6f 20 73 65 74 20 76 61 72 69 6f  Try to set vario
f200: 75 73 20 64 69 66 66 65 72 65 6e 74 20 6a 6f 75  us different jou
f210: 72 6e 61 6c 20 6d 6f 64 65 73 20 77 69 74 68 20  rnal modes with 
f220: 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  an.#            
f230: 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20        in-memory 
f240: 64 61 74 61 62 61 73 65 20 28 6f 6e 6c 79 20 4d  database (only M
f250: 45 4d 4f 52 59 20 61 6e 64 20 4f 46 46 20 73 68  EMORY and OFF sh
f260: 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a 23 0a 23 20  ould work)..#.# 
f270: 20 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 2a 3a    pager1-23.6.*:
f280: 20 54 72 79 20 74 6f 20 73 65 74 20 6c 6f 63 6b   Try to set lock
f290: 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20  ing_mode=normal 
f2a0: 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  on an in-memory 
f2b0: 64 61 74 61 62 61 73 65 0a 23 20 20 20 20 20 20  database.#      
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 64 6f 65              (doe
f2d0: 73 6e 27 74 20 77 6f 72 6b 20 2d 20 69 6e 2d 6d  sn't work - in-m
f2e0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 20  emory databases 
f2f0: 61 6c 77 61 79 73 20 75 73 65 0a 23 20 20 20 20  always use.#    
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f                lo
f310: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
f320: 73 69 76 65 29 2e 0a 23 0a 64 6f 5f 74 65 73 74  sive)..#.do_test
f330: 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 31 20 7b   pager1-23.1.1 {
f340: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
f350: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
f360: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
f370: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f380: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
f390: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
f3a0: 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 66 69  (a, b);.  }.  fi
f3b0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
f3c0: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a  b-journal.} {1}.
f3d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f3e0: 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  3.1.2 {.  execsq
f3f0: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
f400: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
f410: 20 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   }.  file exists
f420: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
f430: 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20  .} {0}..do_test 
f440: 70 61 67 65 72 31 2d 32 33 2e 32 2e 31 20 7b 0a  pager1-23.2.1 {.
f450: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
f460: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f470: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
f480: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
f490: 31 20 56 41 4c 55 45 53 28 27 43 61 6e 62 65 72  1 VALUES('Canber
f4a0: 72 61 27 2c 20 27 41 43 54 27 29 3b 0a 20 20 7d  ra', 'ACT');.  }
f4b0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c  .  db eval { SEL
f4c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
f4d0: 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20  {.    db eval { 
f4e0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f4f0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f500: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
f510: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f520: 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a  de }.} {delete}.
f530: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f540: 33 2e 32 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65  3.2.2 {.  file e
f550: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
f560: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f  urnal.} {0}..do_
f570: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33  test pager1-23.3
f580: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
f590: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
f5a0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
f5b0: 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ST;.    INSERT I
f5c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 44  NTO t1 VALUES('D
f5d0: 61 72 77 69 6e 27 2c 20 27 4e 54 27 29 3b 0a 20  arwin', 'NT');. 
f5e0: 20 20 20 42 45 47 49 4e 20 49 4d 4d 45 44 49 41     BEGIN IMMEDIA
f5f0: 54 45 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61  TE;.  }.  db eva
f600: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
f610: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
f620: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
f630: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f640: 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a  de }.} {delete}.
f650: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f660: 33 2e 33 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65  3.3.2 {.  file e
f670: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
f680: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74  urnal.} {0}.do_t
f690: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e  est pager1-23.3.
f6a0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f  3 {.  execsql CO
f6b0: 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  MMIT.} {}..do_te
f6c0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 31  st pager1-23.4.1
f6d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
f6e0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
f6f0: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
f700: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
f710: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41 64 65  O t1 VALUES('Ade
f720: 6c 61 69 64 65 27 2c 20 27 53 41 27 29 3b 0a 20  laide', 'SA');. 
f730: 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49     BEGIN EXCLUSI
f740: 56 45 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61  VE;.  }.  db eva
f750: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
f760: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
f770: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
f780: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f790: 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a  de }.} {delete}.
f7a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f7b0: 33 2e 34 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65  3.4.2 {.  file e
f7c0: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
f7d0: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74  urnal.} {0}.do_t
f7e0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e  est pager1-23.4.
f7f0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f  3 {.  execsql CO
f800: 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  MMIT.} {}..do_te
f810: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 31  st pager1-23.5.1
f820: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
f830: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
f840: 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65    sqlite3 db :me
f850: 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66 6f 72 65 61  mory:.} {}.forea
f860: 63 68 20 7b 74 6e 20 6d 6f 64 65 20 70 6f 73 73  ch {tn mode poss
f870: 69 62 6c 65 7d 20 7b 0a 20 20 32 20 20 6f 66 66  ible} {.  2  off
f880: 20 20 20 20 20 20 31 0a 20 20 33 20 20 6d 65 6d        1.  3  mem
f890: 6f 72 79 20 20 20 31 0a 20 20 34 20 20 70 65 72  ory   1.  4  per
f8a0: 73 69 73 74 20 20 30 0a 20 20 35 20 20 64 65 6c  sist  0.  5  del
f8b0: 65 74 65 20 20 20 30 0a 20 20 36 20 20 77 61 6c  ete   0.  6  wal
f8c0: 20 20 20 20 20 20 30 0a 20 20 37 20 20 74 72 75        0.  7  tru
f8d0: 6e 63 61 74 65 20 30 0a 7d 20 7b 0a 20 20 64 6f  ncate 0.} {.  do
f8e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f8f0: 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78  5.$tn.1 {.    ex
f900: 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f  ecsql "PRAGMA jo
f910: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66  urnal_mode = off
f920: 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50  ".    execsql "P
f930: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f940: 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d 20  de = $mode".  } 
f950: 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b 6c  [if $possible {l
f960: 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73 74  ist $mode} {list
f970: 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f 74 65 73 74   off}].  do_test
f980: 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74 6e   pager1-23.5.$tn
f990: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
f9a0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
f9b0: 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 22 0a  _mode = memory".
f9c0: 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41      execsql "PRA
f9d0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f9e0: 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69   = $mode".  } [i
f9f0: 66 20 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73  f $possible {lis
fa00: 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6d  t $mode} {list m
fa10: 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f 74 65 73  emory}].}.do_tes
fa20: 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 31 20  t pager1-23.6.1 
fa30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41  {.  execsql {PRA
fa40: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
fa50: 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d 20 7b 65 78   = normal}.} {ex
fa60: 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74  clusive}.do_test
fa70: 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 32 20 7b   pager1-23.6.2 {
fa80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47  .  execsql {PRAG
fa90: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
faa0: 3d 20 65 78 63 6c 75 73 69 76 65 7d 0a 7d 20 7b  = exclusive}.} {
fab0: 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65  exclusive}.do_te
fac0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 33  st pager1-23.6.3
fad0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52   {.  execsql {PR
fae0: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
faf0: 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d  e}.} {exclusive}
fb00: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
fb10: 32 33 2e 36 2e 34 20 7b 0a 20 20 65 78 65 63 73  23.6.4 {.  execs
fb20: 71 6c 20 7b 50 52 41 47 4d 41 20 6d 61 69 6e 2e  ql {PRAGMA main.
fb30: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20  locking_mode}.} 
fb40: 7b 65 78 63 6c 75 73 69 76 65 7d 0a 0a 23 2d 2d  {exclusive}..#--
fb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb90: 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73  -------.#.do_tes
fba0: 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 31 20  t pager1-24.1.1 
fbb0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
fbc0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
fbd0: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
fbe0: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
fbf0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
fc00: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
fc10: 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75  0;.    PRAGMA au
fc20: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46 55 4c 4c  to_vacuum = FULL
fc30: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
fc40: 4c 45 20 78 31 28 78 2c 20 79 2c 20 7a 2c 20 50  LE x1(x, y, z, P
fc50: 52 49 4d 41 52 59 20 4b 45 59 28 79 2c 20 7a 29  RIMARY KEY(y, z)
fc60: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
fc70: 42 4c 45 20 78 32 28 78 2c 20 79 2c 20 7a 2c 20  BLE x2(x, y, z, 
fc80: 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c 20 7a  PRIMARY KEY(y, z
fc90: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
fca0: 4e 54 4f 20 78 32 20 56 41 4c 55 45 53 28 61 5f  NTO x2 VALUES(a_
fcb0: 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73  string(400), a_s
fcc0: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
fcd0: 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20 20  ring(600));.    
fce0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
fcf0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36  ELECT a_string(6
fd00: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  00), a_string(40
fd10: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
fd20: 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
fd30: 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
fd40: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
fd50: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
fd60: 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ), a_string(400)
fd70: 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
fd80: 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
fd90: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30  ECT a_string(400
fda0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ), a_string(500)
fdb0: 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
fdc0: 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
fdd0: 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45  ERT INTO x2 SELE
fde0: 43 54 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  CT a_string(600)
fdf0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c  , a_string(400),
fe00: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46   a_string(500) F
fe10: 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45  ROM x2;.    INSE
fe20: 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43  RT INTO x2 SELEC
fe30: 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  T a_string(500),
fe40: 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20   a_string(600), 
fe50: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
fe60: 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52  OM x2;.    INSER
fe70: 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54  T INTO x2 SELECT
fe80: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20   a_string(400), 
fe90: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
fea0: 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
feb0: 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x2;.    INSERT
fec0: 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20   INTO x1 SELECT 
fed0: 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a 7d  * FROM x2;.  }.}
fee0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65   {}.do_test page
fef0: 72 31 2d 32 34 2e 31 2e 32 20 7b 0a 20 20 65 78  r1-24.1.2 {.  ex
ff00: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
ff10: 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  N;.      DELETE 
ff20: 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72 6f  FROM x1 WHERE ro
ff30: 77 69 64 3c 33 32 3b 0a 20 20 7d 0a 20 20 72 65  wid<32;.  }.  re
ff40: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36  cursive_select 6
ff50: 34 20 78 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  4 x2.} {}.do_tes
ff60: 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 33 20  t pager1-24.1.3 
ff70: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
ff80: 20 20 20 20 20 55 50 44 41 54 45 20 78 31 20 53       UPDATE x1 S
ff90: 45 54 20 7a 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET z = a_string(
ffa0: 33 30 30 29 20 57 48 45 52 45 20 72 6f 77 69 64  300) WHERE rowid
ffb0: 3e 34 30 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  >40;.    COMMIT;
ffc0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
ffd0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20  grity_check;.   
ffe0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
fff0: 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20   FROM x1;.  }.} 
10000 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73 74  {ok 33}..do_test
10010 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 34 20 7b   pager1-24.1.4 {
10020 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10030 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 3b   DELETE FROM x1;
10040 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10050 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   x1 SELECT * FRO
10060 4d 20 78 32 3b 0a 20 20 20 20 42 45 47 49 4e 3b  M x2;.    BEGIN;
10070 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
10080 4f 4d 20 78 31 20 57 48 45 52 45 20 72 6f 77 69  OM x1 WHERE rowi
10090 64 3c 33 32 3b 0a 20 20 20 20 20 20 55 50 44 41  d<32;.      UPDA
100a0 54 45 20 78 31 20 53 45 54 20 7a 20 3d 20 61 5f  TE x1 SET z = a_
100b0 73 74 72 69 6e 67 28 32 39 39 29 20 57 48 45 52  string(299) WHER
100c0 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20 20 7d 0a  E rowid>40;.  }.
100d0 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65    recursive_sele
100e0 63 74 20 36 34 20 78 32 20 7b 64 62 20 65 76 61  ct 64 x2 {db eva
100f0 6c 20 43 4f 4d 4d 49 54 7d 0a 20 20 65 78 65 63  l COMMIT}.  exec
10100 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
10110 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
10120 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
10130 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20  nt(*) FROM x1;. 
10140 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f   }.} {ok 33}..do
10150 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e  _test pager1-24.
10160 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.5 {.  execsql 
10170 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
10180 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x1;.    INSERT
10190 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20   INTO x1 SELECT 
101a0 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a 20  * FROM x2;.  }. 
101b0 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63   recursive_selec
101c0 74 20 36 34 20 78 32 20 7b 20 64 62 20 65 76 61  t 64 x2 { db eva
101d0 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  l {CREATE TABLE 
101e0 78 33 28 78 2c 20 79 2c 20 7a 29 7d 20 7d 0a 20  x3(x, y, z)} }. 
101f0 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
10200 54 20 2a 20 46 52 4f 4d 20 78 33 20 7d 0a 7d 20  T * FROM x3 }.} 
10210 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
10220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
10260 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
10270 32 35 2d 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  25-1 {.  faultsi
10280 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
10290 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
102a0 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
102b0 20 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a   SAVEPOINT abc;.
102c0 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
102d0 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
102e0 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
102f0 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   abc;.    COMMIT
10300 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
10310 0a 7d 20 7b 7d 0a 62 72 65 61 6b 70 6f 69 6e 74  .} {}.breakpoint
10320 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
10330 32 35 2d 32 20 7b 0a 20 20 66 61 75 6c 74 73 69  25-2 {.  faultsi
10340 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
10350 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
10360 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62      SAVEPOINT ab
10370 63 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  c;.      CREATE 
10380 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
10390 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
103a0 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  abc;.    COMMIT;
103b0 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
103c0 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
103d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10410 0a 23 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 74  .# Sector-size t
10420 65 73 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ests..#.do_test 
10430 70 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20  pager1-26.1 {.  
10440 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
10450 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74 6f  ult 1.  tv secto
10460 72 73 69 7a 65 20 34 30 39 36 0a 20 20 66 61 75  rsize 4096.  fau
10470 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
10480 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
10490 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
104a0 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
104b0 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
104c0 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20  size = 512;.    
104d0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c  CREATE TABLE tbl
104e0 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
104f0 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 42  b UNIQUE);.    B
10500 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
10510 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
10520 45 53 28 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  ES(a_string(25),
10530 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b   a_string(600));
10540 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10550 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f  TO tbl SELECT a_
10560 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
10570 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74  ring(600) FROM t
10580 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bl;.      INSERT
10590 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
105a0 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
105b0 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
105c0 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
105d0 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
105e0 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
105f0 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10600 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
10610 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
10620 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10630 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
10640 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  0) FROM tbl;.   
10650 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10660 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
10670 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
10680 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
10690 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
106a0 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
106b0 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
106c0 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
106d0 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
106e0 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
106f0 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
10700 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10710 20 74 62 6c 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   tbl;.    COMMIT
10720 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78  ;.  }.} {}.do_ex
10730 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
10740 31 2d 32 36 2e 31 20 7b 0a 20 20 55 50 44 41 54  1-26.1 {.  UPDAT
10750 45 20 74 62 6c 20 53 45 54 20 62 20 3d 20 61 5f  E tbl SET b = a_
10760 73 74 72 69 6e 67 28 35 35 30 29 3b 0a 7d 20 7b  string(550);.} {
10770 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  }.db close.tv de
10780 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lete..#---------
10790 2d 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 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
107e0 31 2e 32 37 2e 31 20 7b 0a 20 20 66 61 75 6c 74  1.27.1 {.  fault
107f0 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
10800 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 5f  eopen.  sqlite3_
10810 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20  pager_refcounts 
10820 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
10830 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
10840 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
10850 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  a, b);.  }.  sql
10860 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f  ite3_pager_refco
10870 75 6e 74 73 20 64 62 0a 20 20 65 78 65 63 73 71  unts db.  execsq
10880 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23  l COMMIT.} {}..#
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
108e0 20 74 68 61 74 20 61 74 74 65 6d 70 74 69 6e 67   that attempting
108f0 20 74 6f 20 6f 70 65 6e 20 61 20 77 72 69 74 65   to open a write
10900 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74  -transaction wit
10910 68 20 0a 23 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  h .# locking_mod
10920 65 3d 65 78 63 6c 75 73 69 76 65 20 69 6e 20 57  e=exclusive in W
10930 41 4c 20 6d 6f 64 65 20 66 61 69 6c 73 20 69 66  AL mode fails if
10940 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
10950 20 63 6c 69 65 6e 74 73 20 6f 6e 20 0a 23 20 74   clients on .# t
10960 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
10970 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64 62 20 63  ..#.catch { db c
10980 6c 6f 73 65 20 7d 0a 69 66 63 61 70 61 62 6c 65  lose }.ifcapable
10990 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 6d 75 6c 74   wal {.  do_mult
109a0 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20  iclient_test tn 
109b0 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  {.    do_test pa
109c0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a  ger1-28.$tn.1 {.
109d0 20 20 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20        sql1 { .  
109e0 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
109f0 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
10a00 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
10a10 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
10a20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
10a30 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61  NTO t1 VALUES('a
10a40 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 20 20 7d  ', 'b');.      }
10a50 0a 20 20 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 20  .    } {wal}.   
10a60 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10a70 32 38 2e 24 74 6e 2e 32 20 7b 20 73 71 6c 32 20  28.$tn.2 { sql2 
10a80 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
10a90 74 31 20 7d 20 7d 20 7b 61 20 62 7d 0a 0a 20 20  t1 } } {a b}..  
10aa0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10ab0 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31  -28.$tn.3 { sql1
10ac0 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
10ad0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
10ae0 20 7d 20 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d   } } {exclusive}
10af0 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
10b00 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 0a  er1-28.$tn.4 { .
10b10 20 20 20 20 20 20 63 73 71 6c 31 20 7b 20 42 45        csql1 { BE
10b20 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  GIN; INSERT INTO
10b30 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20   t1 VALUES('c', 
10b40 27 64 27 29 3b 20 7d 0a 20 20 20 20 7d 20 7b 31  'd'); }.    } {1
10b50 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
10b60 63 6b 65 64 7d 7d 0a 20 20 20 20 63 6f 64 65 32  cked}}.    code2
10b70 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 3b 20 73   { db2 close ; s
10b80 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
10b90 64 62 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  db }.    do_test
10ba0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34   pager1-28.$tn.4
10bb0 20 7b 20 0a 20 20 20 20 20 20 73 71 6c 31 20 7b   { .      sql1 {
10bc0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
10bd0 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29  VALUES('c', 'd')
10be0 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 7d  ; COMMIT }.    }
10bf0 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d   {}.  }.}..#----
10c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c40 2d 2d 2d 2d 2d 0a 23 20 4e 6f 72 6d 61 6c 6c 79  -----.# Normally
10c50 2c 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20  , when changing 
10c60 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  from journal_mod
10c70 65 3d 50 45 52 53 49 53 54 20 74 6f 20 44 45 4c  e=PERSIST to DEL
10c80 45 54 45 20 74 68 65 20 70 61 67 65 72 0a 23 20  ETE the pager.# 
10c90 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 6c 65  attempts to dele
10ca0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
10cb0 69 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ile. However, if
10cc0 20 69 74 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   it cannot obtai
10cd0 6e 20 61 0a 23 20 52 45 53 45 52 56 45 44 20 6c  n a.# RESERVED l
10ce0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
10cf0 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 73  ase file, this s
10d00 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  tep is skipped..
10d10 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74  #.do_multiclient
10d20 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f 5f  _test tn {.  do_
10d30 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10d40 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20  tn.1 {.    sql1 
10d50 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
10d60 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
10d70 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 43 52  ERSIST;.      CR
10d80 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
10d90 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
10da0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
10db0 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
10dc0 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a  }.  } {persist}.
10dd0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10de0 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 66 69 6c 65  -28.$tn.2 { file
10df0 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
10e00 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f  journal } 1.  do
10e10 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10e20 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20 7b 20 50  $tn.3 { sql1 { P
10e30 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
10e40 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20  de = DELETE } } 
10e50 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74  delete.  do_test
10e60 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34   pager1-28.$tn.4
10e70 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
10e80 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
10e90 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   0..  do_test pa
10ea0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 35 20 7b 0a  ger1-28.$tn.5 {.
10eb0 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20      sql1 { .    
10ec0 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
10ed0 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
10ee0 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10ef0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27  TO t1 VALUES('c'
10f00 2c 20 27 64 27 29 3b 0a 20 20 20 20 7d 0a 20 20  , 'd');.    }.  
10f10 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f  } {persist}.  do
10f20 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10f30 24 74 6e 2e 36 20 7b 20 66 69 6c 65 20 65 78 69  $tn.6 { file exi
10f40 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
10f50 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73  nal } 1.  do_tes
10f60 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10f70 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42  7 {.    sql2 { B
10f80 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54  EGIN; INSERT INT
10f90 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65 27 2c  O t1 VALUES('e',
10fa0 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a   'f'); }.  } {}.
10fb0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10fc0 2d 32 38 2e 24 74 6e 2e 38 20 20 7b 20 66 69 6c  -28.$tn.8  { fil
10fd0 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
10fe0 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64  -journal } 1.  d
10ff0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11000 2e 24 74 6e 2e 39 20 20 7b 20 73 71 6c 31 20 7b  .$tn.9  { sql1 {
11010 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
11020 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20  mode = DELETE } 
11030 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65  } delete.  do_te
11040 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11050 2e 31 30 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .10 { file exist
11060 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
11070 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 1..  do_test
11080 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
11090 31 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20  1 { sql2 COMMIT 
110a0 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
110b0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 32 20  ager1-28.$tn.12 
110c0 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
110d0 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
110e0 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  0..  do_test pag
110f0 65 72 31 2d 32 38 2d 24 74 6e 2e 31 33 20 7b 0a  er1-28-$tn.13 {.
11100 20 20 20 20 63 6f 64 65 31 20 7b 20 73 65 74 20      code1 { set 
11110 63 68 61 6e 6e 65 6c 20 5b 64 62 20 69 6e 63 72  channel [db incr
11120 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c 79 20 74  blob -readonly t
11130 31 20 61 20 32 5d 20 7d 0a 20 20 20 20 73 71 6c  1 a 2] }.    sql
11140 31 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  1 {.      PRAGMA
11150 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
11160 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 49  PERSIST;.      I
11170 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11180 4c 55 45 53 28 27 67 27 2c 20 27 68 27 29 3b 0a  LUES('g', 'h');.
11190 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69      }.  } {persi
111a0 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  st}.  do_test pa
111b0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 34 20 7b  ger1-28.$tn.14 {
111c0 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
111d0 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
111e0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
111f0 31 2d 32 38 2e 24 74 6e 2e 31 35 20 7b 0a 20 20  1-28.$tn.15 {.  
11200 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20    sql2 { BEGIN; 
11210 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
11220 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29 3b  ALUES('e', 'f');
11230 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
11240 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
11250 6e 2e 31 36 20 7b 20 73 71 6c 31 20 7b 20 50 52  n.16 { sql1 { PR
11260 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
11270 65 20 3d 20 44 45 4c 45 54 45 20 7d 20 7d 20 64  e = DELETE } } d
11280 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20  elete.  do_test 
11290 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 37  pager1-28.$tn.17
112a0 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
112b0 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
112c0 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   1..  do_test pa
112d0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 37 20 7b  ger1-28.$tn.17 {
112e0 20 63 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20   csql2 { COMMIT 
112f0 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  } } {1 {database
11300 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
11310 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11320 2d 24 74 6e 2e 31 38 20 7b 20 63 6f 64 65 31 20  -$tn.18 { code1 
11330 7b 20 72 65 61 64 20 24 63 68 61 6e 6e 65 6c 20  { read $channel 
11340 7d 20 7d 20 63 0a 20 20 64 6f 5f 74 65 73 74 20  } } c.  do_test 
11350 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 39  pager1-28-$tn.19
11360 20 7b 20 63 6f 64 65 31 20 7b 20 63 6c 6f 73 65   { code1 { close
11370 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 7b 7d   $channel } } {}
11380 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11390 31 2d 32 38 2e 24 74 6e 2e 32 30 20 7b 20 73 71  1-28.$tn.20 { sq
113a0 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20  l2 { COMMIT } } 
113b0 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  {}.}..do_test pa
113c0 67 65 72 31 2d 32 39 2e 31 20 7b 0a 20 20 66 61  ger1-29.1 {.  fa
113d0 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
113e0 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
113f0 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
11400 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
11410 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  ;.    PRAGMA aut
11420 6f 5f 76 61 63 75 75 6d 20 3d 20 66 75 6c 6c 3b  o_vacuum = full;
11430 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
11440 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
11450 76 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ve;.    CREATE T
11460 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
11470 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11480 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
11490 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20    }.  file size 
114a0 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20  test.db.} [expr 
114b0 31 30 32 34 2a 33 5d 0a 64 6f 5f 74 65 73 74 20  1024*3].do_test 
114c0 70 61 67 65 72 31 2d 32 39 2e 32 20 7b 0a 20 20  pager1-29.2 {.  
114d0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
114e0 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
114f0 20 34 30 39 36 3b 0a 20 20 20 20 56 41 43 55 55   4096;.    VACUU
11500 4d 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  M;.  }.  file si
11510 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78  ze test.db.} [ex
11520 70 72 20 34 30 39 36 2a 33 5d 0a 0a 23 2d 2d 2d  pr 4096*3]..#---
11530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11570 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
11580 61 74 20 69 66 20 61 6e 20 65 6d 70 74 79 20 64  at if an empty d
11590 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73 69  atabase file (si
115a0 7a 65 20 30 20 62 79 74 65 73 29 20 69 73 20 6f  ze 0 bytes) is o
115b0 70 65 6e 65 64 20 69 6e 20 0a 23 20 65 78 63 6c  pened in .# excl
115c0 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
115d0 64 65 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  de, any journal 
115e0 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
115f0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79  from the file-sy
11600 73 74 65 6d 0a 23 20 77 69 74 68 6f 75 74 20 62  stem.# without b
11610 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
11620 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 52  . And that the R
11630 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 62 74  ESERVED lock obt
11640 61 69 6e 65 64 20 77 68 69 6c 65 0a 23 20 64 6f  ained while.# do
11650 69 6e 67 20 74 68 69 73 20 69 73 20 6e 6f 74 20  ing this is not 
11660 72 65 6c 65 61 73 65 64 2e 0a 23 0a 64 6f 5f 74  released..#.do_t
11670 65 73 74 20 70 61 67 65 72 31 2d 33 30 2e 31 20  est pager1-30.1 
11680 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64  {.  db close.  d
11690 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73 74 2e  elete_file test.
116a0 64 62 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65  db.  delete_file
116b0 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
116c0 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20  .  set fd [open 
116d0 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
116e0 77 5d 0a 20 20 73 65 65 6b 20 24 66 64 20 5b 65  w].  seek $fd [e
116f0 78 70 72 20 35 31 32 2b 31 30 33 32 2a 32 5d 0a  xpr 512+1032*2].
11700 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
11710 65 20 24 66 64 20 78 0a 20 20 63 6c 6f 73 65 20  e $fd x.  close 
11720 24 66 64 0a 0a 20 20 73 71 6c 69 74 65 33 20 64  $fd..  sqlite3 d
11730 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
11740 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
11750 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
11760 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 53 45 4c  CLUSIVE;.    SEL
11770 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
11780 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
11790 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
117a0 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b  _status;.  }.} {
117b0 65 78 63 6c 75 73 69 76 65 20 30 20 6d 61 69 6e  exclusive 0 main
117c0 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63   reserved temp c
117d0 6c 6f 73 65 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  losed}..#-------
117e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11820 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  --.# Test that i
11830 66 20 74 68 65 20 22 70 61 67 65 2d 73 69 7a 65  f the "page-size
11840 22 20 66 69 65 6c 64 20 69 6e 20 61 20 6a 6f 75  " field in a jou
11850 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 30  rnal-header is 0
11860 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20  , the journal.# 
11870 66 69 6c 65 20 63 61 6e 20 73 74 69 6c 6c 20 62  file can still b
11880 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
11890 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
118a0 66 6f 72 20 62 61 63 6b 77 61 72 64 20 63 6f 6d  for backward com
118b0 70 61 74 69 62 69 6c 69 74 79 20 2d 0a 23 20 76  patibility -.# v
118c0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
118d0 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38  e prior to 3.5.8
118e0 20 61 6c 77 61 79 73 20 73 65 74 20 74 68 69 73   always set this
118f0 20 66 69 65 6c 64 20 74 6f 20 7a 65 72 6f 2e 0a   field to zero..
11900 23 0a 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66  #.if {$tcl_platf
11910 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22  orm(platform)=="
11920 75 6e 69 78 22 7d 20 7b 0a 64 6f 5f 74 65 73 74  unix"} {.do_test
11930 20 70 61 67 65 72 31 2d 33 31 2e 31 20 7b 0a 20   pager1-31.1 {. 
11940 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
11950 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
11960 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
11970 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
11980 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  10;.    PRAGMA p
11990 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
119a0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
119b0 45 20 74 31 28 78 2c 20 79 2c 20 55 4e 49 51 55  E t1(x, y, UNIQU
119c0 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 49 4e  E(x, y));.    IN
119d0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
119e0 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  UES(randomblob(1
119f0 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
11a00 28 31 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  (1500));.    INS
11a10 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11a20 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
11a30 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
11a40 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
11a50 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11a60 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
11a70 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11a80 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
11a90 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
11aa0 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
11ab0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
11ac0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11ad0 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
11ae0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
11af0 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
11b00 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
11b10 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
11b20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11b30 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
11b40 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
11b50 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
11b60 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
11b70 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
11b80 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11b90 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
11ba0 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
11bb0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11bc0 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
11bd0 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11be0 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
11bf0 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
11c00 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
11c10 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
11c20 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
11c30 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
11c40 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11c50 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
11c60 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
11c70 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
11c80 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11c90 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
11ca0 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11cb0 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
11cc0 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   t1;.    BEGIN;.
11cd0 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
11ce0 53 45 54 20 79 20 3d 20 72 61 6e 64 6f 6d 62 6c  SET y = randombl
11cf0 6f 62 28 31 34 39 39 29 3b 0a 20 20 7d 0a 20 20  ob(1499);.  }.  
11d00 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64  copy_file test.d
11d10 62 20 74 65 73 74 2e 64 62 32 0a 20 20 63 6f 70  b test.db2.  cop
11d20 79 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a  y_file test.db-j
11d30 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d  ournal test.db2-
11d40 6a 6f 75 72 6e 61 6c 0a 20 20 0a 20 20 68 65 78  journal.  .  hex
11d50 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
11d60 32 2d 6a 6f 75 72 6e 61 6c 20 32 34 20 30 30 30  2-journal 24 000
11d70 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
11d80 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65  db2 test.db2.  e
11d90 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
11da0 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
11db0 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 7d 0a 0a  } db2.} {ok}.}..
11dc0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
11dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
11e10 74 20 74 68 61 74 20 61 20 64 61 74 61 62 61 73  t that a databas
11e20 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 22 70  e file can be "p
11e30 72 65 2d 68 69 6e 74 65 64 22 20 74 6f 20 61 20  re-hinted" to a 
11e40 63 65 72 74 61 69 6e 20 73 69 7a 65 20 61 6e 64  certain size and
11e50 20 74 68 61 74 0a 23 20 73 75 62 73 65 71 75 65   that.# subseque
11e60 6e 74 20 73 70 69 6c 6c 69 6e 67 20 6f 66 20 74  nt spilling of t
11e70 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 64  he pager cache d
11e80 6f 65 73 20 6e 6f 74 20 72 65 73 75 6c 74 20 69  oes not result i
11e90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 23  n the database.#
11ea0 20 66 69 6c 65 20 62 65 69 6e 67 20 73 68 72 75   file being shru
11eb0 6e 6b 2e 0a 23 0a 63 61 74 63 68 20 7b 64 62 20  nk..#.catch {db 
11ec0 63 6c 6f 73 65 7d 0a 66 6f 72 63 65 64 65 6c 65  close}.forcedele
11ed0 74 65 20 74 65 73 74 2e 64 62 0a 0a 64 6f 5f 74  te test.db..do_t
11ee0 65 73 74 20 70 61 67 65 72 31 2d 33 32 2e 31 20  est pager1-32.1 
11ef0 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  {.  sqlite3 db t
11f00 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
11f10 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
11f20 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20  BLE t1(x, y);.  
11f30 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  }.  db close.  s
11f40 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
11f50 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
11f60 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
11f70 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
11f80 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(1, randomblob
11f90 28 31 30 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20  (10000));.  }.  
11fa0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a  file_control_siz
11fb0 65 68 69 6e 74 5f 74 65 73 74 20 64 62 20 6d 61  ehint_test db ma
11fc0 69 6e 20 32 30 39 37 31 35 32 30 3b 20 23 20 32  in 20971520; # 2
11fd0 30 4d 42 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0MB.  execsql {.
11fe0 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
11ff0 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
12000 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
12010 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62  ALUES(1, randomb
12020 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20  lob(10000));.   
12030 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
12040 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d  VALUES(2, random
12050 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20  blob(10000));.  
12060 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12070 20 53 45 4c 45 43 54 20 78 2b 32 2c 20 72 61 6e   SELECT x+2, ran
12080 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66  domblob(10000) f
12090 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  rom t1;.    INSE
120a0 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
120b0 54 20 78 2b 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f  T x+4, randomblo
120c0 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31  b(10000) from t1
120d0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
120e0 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 38 2c  O t1 SELECT x+8,
120f0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
12100 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20  0) from t1;.    
12110 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12120 45 4c 45 43 54 20 78 2b 31 36 2c 20 72 61 6e 64  ELECT x+16, rand
12130 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72  omblob(10000) fr
12140 6f 6d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43  om t1;.    SELEC
12150 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
12160 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  t1;.    COMMIT;.
12170 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20    }.  db close. 
12180 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
12190 64 62 0a 7d 20 7b 32 30 39 37 31 35 32 30 7d 0a  db.} {20971520}.
121a0 0a 23 20 43 6c 65 61 6e 75 70 20 32 30 4d 42 20  .# Cleanup 20MB 
121b0 66 69 6c 65 20 6c 65 66 74 20 62 79 20 74 68 65  file left by the
121c0 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 2e 0a   previous test..
121d0 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
121e0 2e 64 62 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  .db..finish_test
121f0 0a                                               .