/ Hex Artifact Content
Login

Artifact 12ad20280db1ba25f1f0d7ddebf0971a305d8f80:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e 6f 74 20  n.tcl..# Do not 
0210: 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 20  use a codec for 
0220: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0230: 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 62  le, as the datab
0240: 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d 61  ase file is.# ma
0250: 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 74  nipulated direct
0260: 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 72  ly using tcl scr
0270: 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 20  ipts (using the 
0280: 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 6f  [hexio_write] co
0290: 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f 74  mmand)..#.do_not
02a0: 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 20  _use_codec..#.# 
02b0: 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 74  pager1-1.*: Test
02c0: 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 6c   inter-process l
02d0: 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 20  ocking (clients 
02e0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
02f0: 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 65  esses)..#.# page
0300: 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e 74  r1-2.*: Test int
0310: 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b 69  ra-process locki
0320: 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c 69  ng (multiple cli
0330: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ents in this pro
0340: 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 72  cess)..#.# pager
0350: 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e 74  1-3.*: Savepoint
0360: 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a   related tests..
0370: 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a 20  #.# pager1-4.*: 
0380: 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c 61  Hot-journal rela
0390: 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 70  ted tests..#.# p
03a0: 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 73  ager1-5.*: Cases
03b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c 74   related to mult
03c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
03d0: 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a 20  #.# pager1-6.*: 
03e0: 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f  Cases related to
03f0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
0400: 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 67  e_count".#.# pag
0410: 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 73  er1-7.*: Cases s
0420: 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47  pecific to "PRAG
0430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0440: 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 61  TRUNCATE".#.# pa
0450: 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 20  ger1-8.*: Cases 
0460: 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  using temporary 
0470: 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
0480: 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  tabases..#.# pag
0490: 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 72  er1-9.*: Tests r
04a0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  elated to the ba
04b0: 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 61  ckup API..#.# pa
04c0: 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 20  ger1-10.*: Test 
04d0: 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 64  that the assumed
04e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
04f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d 69  tor-size is limi
0500: 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ted to.#        
0510: 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 20        64KB..#.# 
0520: 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 73  pager1-12.*: Tes
0530: 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 52  ts involving "PR
0540: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
0550: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a 3a  #.# pager1-13.*:
0560: 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 20   Cases specific 
0570: 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  to "PRAGMA journ
0580: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
0590: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e 2a  .#.# pager1-14.*
05a0: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
05b0: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
05c0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 0a  nal_mode=OFF".#.
05d0: 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 56  # pager1-15.*: V
05e0: 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76  arying sqlite3_v
05f0: 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 20  fs.szOsFile.#.# 
0600: 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 72  pager1-16.*: Var
0610: 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ying sqlite3_vfs
0620: 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 20  .mxPathname.#.# 
0630: 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 73  pager1-17.*: Tes
0640: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 50  ts related to "P
0650: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
0660: 6f 63 6b 22 0a 23 0a 23 20 70 61 67 65 72 31 2d  ock".#.# pager1-
0670: 31 38 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  18.*: Test that 
0680: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
0690: 72 65 73 70 6f 6e 64 73 20 63 6f 72 72 65 63 74  responds correct
06a0: 6c 79 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ly if the b-tree
06b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
06c0: 72 65 71 75 65 73 74 73 20 61 6e 20 69 6e 76 61  requests an inva
06d0: 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
06e0: 28 64 75 65 20 74 6f 20 64 62 20 63 6f 72 72 75  (due to db corru
06f0: 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72 6f 63 20  ption)..#..proc 
0700: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
0710: 20 7b 69 64 20 74 61 62 6c 65 20 7b 73 63 72 69   {id table {scri
0720: 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73 65 74 20  pt {}}} {.  set 
0730: 63 6e 74 20 30 0a 20 20 64 62 20 65 76 61 6c 20  cnt 0.  db eval 
0740: 22 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  "SELECT rowid, *
0750: 20 46 52 4f 4d 20 24 74 61 62 6c 65 20 57 48 45   FROM $table WHE
0760: 52 45 20 72 6f 77 69 64 20 3d 20 28 24 69 64 2d  RE rowid = ($id-
0770: 31 29 22 20 7b 0a 20 20 20 20 72 65 63 75 72 73  1)" {.    recurs
0780: 69 76 65 5f 73 65 6c 65 63 74 20 24 72 6f 77 69  ive_select $rowi
0790: 64 20 24 74 61 62 6c 65 20 24 73 63 72 69 70 74  d $table $script
07a0: 0a 20 20 20 20 69 6e 63 72 20 63 6e 74 0a 20 20  .    incr cnt.  
07b0: 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d 3d 30 7d  }.  if {$cnt==0}
07c0: 20 7b 20 65 76 61 6c 20 24 73 63 72 69 70 74 20   { eval $script 
07d0: 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74 72 69 6e  }.}..set a_strin
07e0: 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70 72 6f 63  g_counter 1.proc
07f0: 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d 20 7b 0a   a_string {n} {.
0800: 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74 72 69 6e    global a_strin
0810: 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69 6e 63 72  g_counter.  incr
0820: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
0830: 72 0a 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65  r.  string range
0840: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
0850: 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  "${a_string_coun
0860: 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20 24 6e 0a  ter}." $n] 1 $n.
0870: 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  }.db func a_stri
0880: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 64 6f 5f  ng a_string..do_
0890: 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
08a0: 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72 65 61 74   tn {..  # Creat
08b0: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
08c0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
08d0: 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  using connection
08e0: 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 0a 20 20   [db]. Check .  
08f0: 23 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  # that connectio
0900: 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62  ns [db2] and [db
0910: 33 5d 20 63 61 6e 20 73 65 65 20 74 68 65 20 73  3] can see the s
0920: 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65 6e  chema and conten
0930: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0940: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 20 7b 0a   pager1-$tn.1 {.
0950: 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20      sql1 {.     
0960: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0970: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
0980: 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  b);.      CREATE
0990: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
09a0: 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
09b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
09c0: 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e 53 45 52  1, 'one'); INSER
09d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
09e0: 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20  (2, 'two');.    
09f0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0a00: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 20  st pager1-$tn.2 
0a10: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0a20: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0a30: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0a40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a50: 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  .3 { sql3 { SELE
0a60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a70: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 0a   {1 one 2 two}..
0a80: 20 20 23 20 4f 70 65 6e 20 61 20 74 72 61 6e 73    # Open a trans
0a90: 61 63 74 69 6f 6e 20 61 6e 64 20 61 64 64 20 61  action and add a
0aa0: 20 72 6f 77 20 75 73 69 6e 67 20 5b 64 62 5d 2e   row using [db].
0ab0: 20 54 68 69 73 20 70 75 74 73 20 5b 64 62 5d 20   This puts [db] 
0ac0: 69 6e 0a 20 20 23 20 52 45 53 45 52 56 45 44 20  in.  # RESERVED 
0ad0: 73 74 61 74 65 2e 20 43 68 65 63 6b 20 74 68 61  state. Check tha
0ae0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64  t connections [d
0af0: 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 20 63 61  b2] and [db3] ca
0b00: 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72 65 61 64  n still.  # read
0b10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
0b20: 6e 74 65 6e 74 20 61 73 20 69 74 20 77 61 73 20  ntent as it was 
0b30: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
0b40: 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 23 20 6f  action was.  # o
0b50: 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73 68 6f 75  pened. [db] shou
0b60: 6c 64 20 73 65 65 20 74 68 65 20 69 6e 73 65 72  ld see the inser
0b70: 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a 20 20 64  ted row..  #.  d
0b80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
0b90: 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b  n.4 {.    sql1 {
0ba0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
0bb0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0bc0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27  O t1 VALUES(3, '
0bd0: 74 68 72 65 65 27 29 3b 0a 20 20 20 20 7d 0a 20  three');.    }. 
0be0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0bf0: 70 61 67 65 72 31 2d 24 74 6e 2e 35 20 7b 20 73  pager1-$tn.5 { s
0c00: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
0c10: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
0c20: 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f 5f 74 65  e 2 two}.  do_te
0c30: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 37 20  st pager1-$tn.7 
0c40: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
0c50: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c60: 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72   one 2 two 3 thr
0c70: 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 73 74  ee}..  # [db] st
0c80: 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ill has an open 
0c90: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
0ca0: 6e 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  n. Check that th
0cb0: 69 73 20 70 72 65 76 65 6e 74 73 0a 20 20 23 20  is prevents.  # 
0cc0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
0cd0: 73 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 20  s (specifically 
0ce0: 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77 72 69 74  [db2]) from writ
0cf0: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
0d00: 61 73 65 2e 0a 20 20 23 0a 20 20 23 20 45 76 65  ase..  #.  # Eve
0d10: 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70 65 6e 73  n if [db2] opens
0d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
0d30: 69 72 73 74 2c 20 69 74 20 6d 61 79 20 6e 6f 74  irst, it may not
0d40: 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20   write to the.  
0d50: 23 20 64 61 74 61 62 61 73 65 2e 20 41 66 74 65  # database. Afte
0d60: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
0d70: 20 77 72 69 74 65 20 74 68 65 20 64 62 20 77 69   write the db wi
0d80: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
0d90: 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32 5d 20 69  on, .  # [db2] i
0da0: 73 20 6c 65 66 74 20 77 69 74 68 20 61 6e 20 6f  s left with an o
0db0: 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
0dc0: 20 62 75 74 20 6e 6f 74 20 61 20 72 65 61 64 2d   but not a read-
0dd0: 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74 68 65 20  lock on.  # the 
0de0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 53  main database. S
0df0: 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 70 72  o it does not pr
0e00: 65 76 65 6e 74 20 5b 64 62 5d 20 66 72 6f 6d 20  event [db] from 
0e10: 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20 20 23 0a  committing..  #.
0e20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0e30: 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20 20 63 73  -$tn.8 { .    cs
0e40: 71 6c 32 20 7b 20 55 50 44 41 54 45 20 74 31 20  ql2 { UPDATE t1 
0e50: 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d  SET a = a + 10 }
0e60: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
0e70: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
0e80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0e90: 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63 73 71 6c  tn.9 { .    csql
0ea0: 32 20 7b 20 0a 20 20 20 20 20 20 42 45 47 49 4e  2 { .      BEGIN
0eb0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
0ec0: 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30  1 SET a = a + 10
0ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  ;.    }.  } {1 {
0ee0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
0ef0: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
0f00: 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20 74  db] commit its t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 43 68 65  ransactions. Che
0f20: 63 6b 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6e  ck the other con
0f30: 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a 20 20 23  nections can.  #
0f40: 20 6e 6f 77 20 73 65 65 20 74 68 65 20 6e 65 77   now see the new
0f50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
0f60: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0f70: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 30 20 7b   pager1-$tn.10 {
0f80: 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql1 { COMMIT }
0f90: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0fa0: 70 61 67 65 72 31 2d 24 74 6e 2e 31 31 20 7b 20  pager1-$tn.11 { 
0fb0: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql1 { SELECT * 
0fc0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
0fd0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
0fe0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
0ff0: 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73 71 6c 32  r1-$tn.12 { sql2
1000: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1010: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1020: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20   two 3 three}.  
1030: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1040: 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20 7b 20 53  tn.13 { sql3 { S
1050: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1060: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
1070: 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 43   3 three}..  # C
1080: 68 65 63 6b 20 74 68 61 74 2c 20 61 73 20 6e 6f  heck that, as no
1090: 74 65 64 20 61 62 6f 76 65 2c 20 5b 64 62 32 5d  ted above, [db2]
10a0: 20 72 65 61 6c 6c 79 20 64 69 64 20 6b 65 65 70   really did keep
10b0: 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   an open transac
10c0: 74 69 6f 6e 0a 20 20 23 20 61 66 74 65 72 20 74  tion.  # after t
10d0: 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
10e0: 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
10f0: 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a 20 20 64   failed..  #.  d
1100: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1110: 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.14 { .    csql
1120: 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a 20 20 7d  2 { BEGIN } .  }
1130: 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61 72   {1 {cannot star
1140: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1150: 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1160: 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  tion}}.  do_test
1170: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b   pager1-$tn.15 {
1180: 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42 41 43 4b   sql2 { ROLLBACK
1190: 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61 76   } } {}..  # Hav
11a0: 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 74  e [db2] open a t
11b0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74  ransaction and t
11c0: 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ake a read-lock 
11d0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
11e0: 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20  .  # Check that 
11f0: 74 68 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64  this prevents [d
1200: 62 5d 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  b] from writing 
1210: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1220: 28 6f 75 74 73 69 64 65 0a 20 20 23 20 6f 66 20  (outside.  # of 
1230: 61 6e 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  any transaction)
1240: 2e 20 41 66 74 65 72 20 74 68 69 73 20 66 61 69  . After this fai
1250: 6c 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 5b  ls, check that [
1260: 64 62 33 5d 20 63 61 6e 20 72 65 61 64 0a 20 20  db3] can read.  
1270: 23 20 74 68 65 20 64 62 20 28 73 68 6f 77 69 6e  # the db (showin
1280: 67 20 74 68 61 74 20 5b 64 62 5d 20 64 69 64 20  g that [db] did 
1290: 6e 6f 74 20 74 61 6b 65 20 61 20 50 45 4e 44 49  not take a PENDI
12a0: 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29 0a 20 20  NG lock etc.).  
12b0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  #.  do_test page
12c0: 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a 20 20 20  r1-$tn.15 { .   
12d0: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53   sql2 { BEGIN; S
12e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
12f0: 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32 20   }.  } {1 one 2 
1300: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64  two 3 three}.  d
1310: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1320: 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.16 { .    csql
1330: 31 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  1 { UPDATE t1 SE
1340: 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d 0a 20  T a = a + 10 }. 
1350: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
1360: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
1370: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1380: 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c  .17 { sql3 { SEL
1390: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
13a0: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
13b0: 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 54 68 69   three}..  # Thi
13c0: 73 20 74 69 6d 65 2c 20 68 61 76 65 20 5b 64 62  s time, have [db
13d0: 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63  ] open a transac
13e0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 77 72 69 74  tion before writ
13f0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1400: 2e 0a 20 20 23 20 54 68 69 73 20 77 6f 72 6b 73  ..  # This works
1410: 20 2d 20 5b 64 62 5d 20 67 65 74 73 20 61 20 52   - [db] gets a R
1420: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 69  ESERVED lock whi
1430: 63 68 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 66  ch does not conf
1440: 6c 69 63 74 20 77 69 74 68 0a 20 20 23 20 74 68  lict with.  # th
1450: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 5b 64  e SHARED lock [d
1460: 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e 67 2e 0a  b2] is holding..
1470: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61    #.  do_test pa
1480: 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b 20 0a 20  ger1-$tn.18 { . 
1490: 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20     sql1 { .     
14a0: 20 42 45 47 49 4e 3b 20 20 0a 20 20 20 20 20 20   BEGIN;  .      
14b0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
14c0: 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20 20 20 7d  = a + 10; .    }
14d0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
14e0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2d 31 39 20  t pager1-$tn-19 
14f0: 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 50 52  { .    sql1 { PR
1500: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
1510: 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 72 65   } .  } {main re
1520: 73 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73  served temp clos
1530: 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ed}.  do_test pa
1540: 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b 20 0a 20  ger1-$tn-20 { . 
1550: 20 20 20 73 71 6c 32 20 7b 20 50 52 41 47 4d 41     sql2 { PRAGMA
1560: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20 0a   lock_status } .
1570: 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61 72 65 64    } {main shared
1580: 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 20   temp closed}.. 
1590: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c   # Check that al
15a0: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  l connections ca
15b0: 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74 68 65  n still read the
15c0: 20 64 61 74 61 62 61 73 65 2e 20 4f 6e 6c 79 20   database. Only 
15d0: 5b 64 62 5d 20 73 65 65 73 0a 20 20 23 20 74 68  [db] sees.  # th
15e0: 65 20 75 70 64 61 74 65 64 20 63 6f 6e 74 65 6e  e updated conten
15f0: 74 20 28 61 73 20 74 68 65 20 74 72 61 6e 73 61  t (as the transa
1600: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  ction has not be
1610: 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 79 65 74  en committed yet
1620: 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  )..  #.  do_test
1630: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 31 20 7b   pager1-$tn.21 {
1640: 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a   sql1 { SELECT *
1650: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 31   FROM t1 } } {11
1660: 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33 20 74   one 12 two 13 t
1670: 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  hree}.  do_test 
1680: 70 61 67 65 72 31 2d 24 74 6e 2e 32 32 20 7b 20  pager1-$tn.22 { 
1690: 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
16a0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
16b0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
16c0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
16d0: 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73 71 6c 33  r1-$tn.23 { sql3
16e0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
16f0: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1700: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20   two 3 three}.. 
1710: 20 23 20 42 65 63 61 75 73 65 20 5b 64 62 32 5d   # Because [db2]
1720: 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 53   still has the S
1730: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b 64 62 5d  HARED lock, [db]
1740: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   is unable to co
1750: 6d 6d 69 74 20 74 68 65 0a 20 20 23 20 74 72 61  mmit the.  # tra
1760: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
1770: 74 72 69 65 73 2c 20 61 6e 20 65 72 72 6f 72 20  tries, an error 
1780: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1790: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  the connection .
17a0: 20 20 23 20 75 70 67 72 61 64 65 73 20 74 6f 20    # upgrades to 
17b0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
17c0: 20 20 23 0a 20 20 23 20 4f 6e 63 65 20 74 68 69    #.  # Once thi
17d0: 73 20 68 61 70 70 65 6e 73 2c 20 5b 64 62 5d 20  s happens, [db] 
17e0: 63 61 6e 20 72 65 61 64 20 74 68 65 20 64 61 74  can read the dat
17f0: 61 62 61 73 65 20 61 6e 64 20 73 65 65 20 74 68  abase and see th
1800: 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2c 0a 20  e new content,. 
1810: 20 23 20 5b 64 62 32 5d 20 28 73 74 69 6c 6c 20   # [db2] (still 
1820: 68 6f 6c 64 69 6e 67 20 53 48 41 52 45 44 29 20  holding SHARED) 
1830: 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74  can still read t
1840: 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 2c 20  he old content, 
1850: 62 75 74 20 5b 64 62 33 5d 0a 20 20 23 20 28 6e  but [db3].  # (n
1860: 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c  ot holding any l
1870: 6f 63 6b 29 20 69 73 20 70 72 65 76 65 6e 74 65  ock) is prevente
1880: 64 20 62 79 20 5b 64 62 5d 27 73 20 50 45 4e 44  d by [db]'s PEND
1890: 49 4e 47 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ING from reading
18a0: 0a 20 20 23 20 74 68 65 20 64 61 74 61 62 61 73  .  # the databas
18b0: 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  e..  #.  do_test
18c0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 34 20 7b   pager1-$tn.24 {
18d0: 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20   csql1 { COMMIT 
18e0: 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  } } {1 {database
18f0: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
1900: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1910: 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73 71 6c 31  n-25 { .    sql1
1920: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73   { PRAGMA lock_s
1930: 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61  tatus } .  } {ma
1940: 69 6e 20 70 65 6e 64 69 6e 67 20 74 65 6d 70 20  in pending temp 
1950: 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73  closed}.  do_tes
1960: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 36 20  t pager1-$tn.26 
1970: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
1980: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
1990: 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33  11 one 12 two 13
19a0: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
19b0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37 20  t pager1-$tn.27 
19c0: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
19d0: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
19e0: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
19f0: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1a00: 61 67 65 72 31 2d 24 74 6e 2e 32 38 20 7b 20 63  ager1-$tn.28 { c
1a10: 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql3 { SELECT * 
1a20: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b  FROM t1 } } {1 {
1a30: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
1a40: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
1a50: 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20  db2] commit its 
1a60: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1a70: 2c 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  , releasing the 
1a80: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 74 0a 20  SHARED lock it. 
1a90: 20 23 20 69 73 20 68 6f 6c 64 69 6e 67 2e 20 4e   # is holding. N
1aa0: 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b 64 62 32  ow, neither [db2
1ab0: 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d 61 79 20  ] nor [db3] may 
1ac0: 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1ad0: 65 20 28 61 73 20 5b 64 62 5d 0a 20 20 23 20 69  e (as [db].  # i
1ae0: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
1af0: 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20 20 23 0a  a PENDING)..  #.
1b00: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1b10: 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c 32 20 7b  -$tn.29 { sql2 {
1b20: 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20   COMMIT } } {}. 
1b30: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b40: 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c 32 20 7b  $tn.30 { csql2 {
1b50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1b60: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1b70: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
1b80: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b90: 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c 33 20 7b  $tn.31 { csql3 {
1ba0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1bb0: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1bc0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a  se is locked}}..
1bd0: 20 20 23 20 5b 64 62 5d 20 69 73 20 6e 6f 77 20    # [db] is now 
1be0: 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20 74  able to commit t
1bf0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
1c00: 4f 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61 63  Once the transac
1c10: 74 69 6f 6e 20 69 73 20 0a 20 20 23 20 63 6f 6d  tion is .  # com
1c20: 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74 68 72 65  mitted, all thre
1c30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  e connections ca
1c40: 6e 20 72 65 61 64 20 74 68 65 20 6e 65 77 20 63  n read the new c
1c50: 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f  ontent..  #.  do
1c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1c70: 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20 55 50 44  .25 { sql1 { UPD
1c80: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61  ATE t1 SET a = a
1c90: 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f  +10 } } {}.  do_
1ca0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1cb0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d  26 { sql1 { COMM
1cc0: 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  IT } } {}.  do_t
1cd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1ce0: 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  7 { sql1 { SELEC
1cf0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
1d00: 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32  {21 one 22 two 2
1d10: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
1d20: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37  st pager1-$tn.27
1d30: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1d40: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1d50: 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33  21 one 22 two 23
1d60: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1d70: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1d80: 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20  { sql3 { SELECT 
1d90: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 32  * FROM t1 } } {2
1da0: 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20  1 one 22 two 23 
1db0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 49 6e 73 74  three}..  # Inst
1dc0: 61 6c 6c 20 61 20 62 75 73 79 2d 68 61 6e 64 6c  all a busy-handl
1dd0: 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  er for connectio
1de0: 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20 20 73 65  n [db]..  #.  se
1df0: 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69 73 74 5d  t ::nbusy [list]
1e00: 0a 20 20 70 72 6f 63 20 62 75 73 79 20 7b 6e 7d  .  proc busy {n}
1e10: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a   {.    lappend :
1e20: 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20 20 69 66  :nbusy $n.    if
1e30: 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c 32 20 43   {$n>5} { sql2 C
1e40: 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72 65 74 75  OMMIT }.    retu
1e50: 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62 20 62 75  rn 0.  }.  db bu
1e60: 73 79 20 62 75 73 79 0a 0a 20 20 64 6f 5f 74 65  sy busy..  do_te
1e70: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 39  st pager1-$tn.29
1e80: 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 42   { .    sql1 { B
1e90: 45 47 49 4e 20 3b 20 49 4e 53 45 52 54 20 49 4e  EGIN ; INSERT IN
1ea0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 27  TO t1 VALUES('x'
1eb0: 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d 20 7b 7d  , 'y') } .  } {}
1ec0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1ed0: 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20 20 20 20  1-$tn.30 { .    
1ee0: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20 53  sql2 { BEGIN ; S
1ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1f00: 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e 65 20 32  } .  } {21 one 2
1f10: 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a  2 two 23 three}.
1f20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1f30: 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c 31 20 43  -$tn.31 { sql1 C
1f40: 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f  OMMIT } {}.  do_
1f50: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1f60: 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62 75 73 79  32 { set ::nbusy
1f70: 20 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35 20   } {0 1 2 3 4 5 
1f80: 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  6}.}..#---------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 0a 23 20 53 61 76 65 70 6f 69 6e 74 20 72 65 6c  .# Savepoint rel
1fe0: 61 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e  ated test cases.
1ff0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 33 2e 31 2e  .#.# pager1-3.1.
2000: 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20 73 61 76  2.*: Force a sav
2010: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
2020: 74 6f 20 63 61 75 73 65 20 74 68 65 20 64 61 74  to cause the dat
2030: 61 62 61 73 65 20 66 69 6c 65 0a 23 20 20 20 20  abase file.#    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20               to 
2050: 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67 65 72 31  grow..#.# pager1
2060: 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65 20 61 20  -3.1.3.*: Use a 
2070: 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
2080: 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f  in synchronous=o
2090: 66 66 20 6d 6f 64 65 20 61 73 20 70 61 72 74 0a  ff mode as part.
20a0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
20b0: 20 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74    of a savepoint
20c0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 0a 64 6f   rollback..# .do
20d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31  _test pager1-3.1
20e0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
20f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
2100: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
2110: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2120: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
2130: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
2140: 54 41 42 4c 45 20 63 6f 75 6e 74 65 72 28 0a 20  TABLE counter(. 
2150: 20 20 20 20 20 69 20 43 48 45 43 4b 20 28 69 3c       i CHECK (i<
2160: 35 29 2c 20 0a 20 20 20 20 20 20 75 20 43 48 45  5), .      u CHE
2170: 43 4b 20 28 75 3c 31 30 29 0a 20 20 20 20 29 3b  CK (u<10).    );
2180: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2190: 20 63 6f 75 6e 74 65 72 20 56 41 4c 55 45 53 28   counter VALUES(
21a0: 30 2c 20 30 29 3b 0a 20 20 20 20 43 52 45 41 54  0, 0);.    CREAT
21b0: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 41 46  E TRIGGER tr1 AF
21c0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
21d0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
21e0: 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20  ATE counter SET 
21f0: 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20 45 4e 44  i = i+1;.    END
2200: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
2210: 47 47 45 52 20 74 72 32 20 41 46 54 45 52 20 55  GGER tr2 AFTER U
2220: 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47 49  PDATE ON t1 BEGI
2230: 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 63  N.      UPDATE c
2240: 6f 75 6e 74 65 72 20 53 45 54 20 75 20 3d 20 75  ounter SET u = u
2250: 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  +1;.    END;.  }
2260: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
2270: 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74  ECT * FROM count
2280: 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a 0a 64 6f  er }.} {0 0}..do
2290: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
22a0: 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a 20 20 50  ger1-3.1.2 {.  P
22b0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
22c0: 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a   = 10;.  BEGIN;.
22d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
22e0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
22f0: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2300: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2310: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e  t1 VALUES(2, ran
2320: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2340: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61 6e  t1 VALUES(3, ran
2350: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2360: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2370: 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20 7b 33 20  M counter;.} {3 
2380: 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  0}.do_catchsql_t
2390: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31 2e 33  est pager1-3.1.3
23a0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
23b0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 33  TO t1 SELECT a+3
23c0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
23d0: 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 31 20  0) FROM t1.} {1 
23e0: 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  {constraint fail
23f0: 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ed}}.do_execsql_
2400: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 34 20  test pager1-3.4 
2410: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
2420: 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20 30 7d 0a  counter } {3 0}.
2430: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2440: 70 61 67 65 72 31 2d 33 2e 35 20 7b 20 53 45 4c  pager1-3.5 { SEL
2450: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 7d 20  ECT a FROM t1 } 
2460: 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78 65 63 73  {1 2 3}.do_execs
2470: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2480: 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d  .6 { COMMIT } {}
2490: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71  ..foreach {tn sq
24a0: 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20 20 7b 20  l tcl} {.  7  { 
24b0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
24c0: 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50 52  us = NORMAL ; PR
24d0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20  AGMA temp_store 
24e0: 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74 65 73 74  = 0 } {.    test
24f0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
2500: 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72  1.    tv devchar
2510: 20 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20 7d   safe_append.  }
2520: 0a 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 73  .  8  { PRAGMA s
2530: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52  ynchronous = NOR
2540: 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20 74 65 6d  MAL ; PRAGMA tem
2550: 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d 20 7b 0a  p_store = 2 } {.
2560: 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d      testvfs tv -
2570: 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76  default 1.    tv
2580: 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e 74   devchar sequent
2590: 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20 7b 20 50  ial.  }.  9  { P
25a0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
25b0: 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20 7d 0a 20  s = FULL } { }. 
25c0: 20 31 30 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   10 { PRAGMA syn
25d0: 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41  chronous = NORMA
25e0: 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20 7b 20 50  L } { }.  11 { P
25f0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
2600: 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d 0a 20 20  s = OFF } { }.  
2610: 31 32 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63  12 { PRAGMA sync
2620: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 3b  hronous = FULL ;
2630: 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e   PRAGMA fullfsyn
2640: 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20 20 31 33  c = 1 } { }.  13
2650: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2660: 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b  onous = FULL } {
2670: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
2680: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74  -default 1.    t
2690: 76 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e  v devchar sequen
26a0: 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34 20 7b 20  tial.  }.  14 { 
26b0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
26c0: 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 20  ode = EXCLUSIVE 
26d0: 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20 20 64 6f  } {.  }.} {.  do
26e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24  _test pager1-3.$
26f0: 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76 61 6c 20  tn.1 {.    eval 
2700: 24 74 63 6c 0a 20 20 20 20 66 61 75 6c 74 73 69  $tcl.    faultsi
2710: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
2720: 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20  pen.    db func 
2730: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
2740: 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 73  g.    execsql $s
2750: 71 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  ql.    execsql {
2760: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
2770: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20  to_vacuum = 2;. 
2780: 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
2790: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
27a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
27b0: 7a 28 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d  z(x INTEGER PRIM
27c0: 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
27d0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
27e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
27f0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73  VALUES(NULL, a_s
2800: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
2810: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2820: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2830: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2840: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20 32  OM z;     --   2
2850: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2860: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2870: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2880: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
2890: 20 20 20 34 0a 20 20 20 20 20 20 20 20 49 4e 53     4.        INS
28a0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
28b0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
28c0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
28d0: 20 20 2d 2d 20 20 20 38 0a 20 20 20 20 20 20 20    --   8.       
28e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
28f0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2900: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2910: 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a 20 20 20  ;     --  16.   
2920: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2930: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2940: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2950: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 33 32  OM z;     --  32
2960: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2970: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2980: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2990: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
29a0: 20 20 36 34 0a 20 20 20 20 20 20 20 20 49 4e 53    64.        INS
29b0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
29c0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
29d0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
29e0: 20 20 2d 2d 20 31 32 38 0a 20 20 20 20 20 20 20    -- 128.       
29f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
2a00: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2a10: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2a20: 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a 20 20 20  ;     -- 256.   
2a30: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
2a40: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
2a50: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2a60: 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20 20 64 6f  m }.  } {2}.  do
2a70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
2a80: 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20 7b 0a 20  ger1-3.$tn.2 {. 
2a90: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
2aa0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56 41  INSERT INTO z VA
2ab0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72  LUES(NULL, a_str
2ac0: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20  ing(800));.     
2ad0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56   INSERT INTO z V
2ae0: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74  ALUES(NULL, a_st
2af0: 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20  ring(800));.    
2b00: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
2b10: 0a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  .        UPDATE 
2b20: 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c 4c 20 57  z SET y = NULL W
2b30: 48 45 52 45 20 78 3e 32 35 36 3b 0a 20 20 20 20  HERE x>256;.    
2b40: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65      PRAGMA incre
2b50: 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20  mental_vacuum;. 
2b60: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f         SELECT co
2b70: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 20 57 48  unt(*) FROM z WH
2b80: 45 52 45 20 78 20 3c 20 31 30 30 3b 0a 20 20 20  ERE x < 100;.   
2b90: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
2ba0: 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ne;.    COMMIT;.
2bb0: 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64 6f 5f 65    } {99}..  do_e
2bc0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
2bd0: 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  r1-3.$tn.3 {.   
2be0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41   BEGIN;.      SA
2bf0: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
2c00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2c10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2c20: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
2c30: 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  e;.    COMMIT;. 
2c40: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2c50: 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 7d 20 7b  *) FROM z;.  } {
2c60: 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73  258}..  do_execs
2c70: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2c80: 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 53 41 56  .$tn.4 {.    SAV
2c90: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
2ca0: 20 20 55 50 44 41 54 45 20 7a 20 53 45 54 20 79    UPDATE z SET y
2cb0: 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20 52 4f 4c   = y||x;.    ROL
2cc0: 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
2cd0: 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71  } {}.  do_execsq
2ce0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2cf0: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53 45 4c 45  $tn.5 {.    SELE
2d00: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2d10: 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20   z;.    RELEASE 
2d20: 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  one;.    PRAGMA 
2d30: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
2d40: 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d 0a 0a 20  .  } {258 ok}.. 
2d50: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2d60: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 36 20   pager1-3.$tn.6 
2d70: 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  {.    SAVEPOINT 
2d80: 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45 41 53 45  one;.    RELEASE
2d90: 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 0a 20 20   one;.  } {}..  
2da0: 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68  db close.  catch
2db0: 20 7b 20 74 76 20 64 65 6c 65 74 65 20 7d 0a 7d   { tv delete }.}
2dc0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 48  ------------.# H
2e10: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
2e20: 61 63 6b 20 72 65 6c 61 74 65 64 20 74 65 73 74  ack related test
2e30: 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65   cases..#.# page
2e40: 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73 74 20 74  r1.4.1.*: Test t
2e50: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f  hat the pager mo
2e60: 64 75 6c 65 20 64 65 6c 65 74 65 73 20 76 65 72  dule deletes ver
2e70: 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c 69 64 0a  y small invalid.
2e80: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
2e90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23  journal files..#
2ea0: 0a 23 20 70 61 67 65 72 31 2e 34 2e 32 2e 2a 3a  .# pager1.4.2.*:
2eb0: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
2ec0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2ed0: 20 70 6f 69 6e 74 65 72 20 61 74 20 74 68 65 20   pointer at the 
2ee0: 65 6e 64 20 6f 66 20 61 0a 23 20 20 20 20 20 20  end of a.#      
2ef0: 20 20 20 20 20 20 20 20 20 68 6f 74 2d 6a 6f 75           hot-jou
2f00: 72 6e 61 6c 20 66 69 6c 65 20 61 70 70 65 61 72  rnal file appear
2f10: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 20  s to be corrupt 
2f20: 28 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e  (checksum does n
2f30: 6f 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ot.#            
2f40: 20 20 20 63 6f 6d 70 75 74 65 29 20 74 68 65 20     compute) the 
2f50: 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e  associated journ
2f60: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
2f70: 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20 20 20 20  k (and no.#     
2f80: 20 20 20 20 20 20 20 20 20 20 78 41 63 63 65 73            xAcces
2f90: 73 28 29 20 63 61 6c 6c 20 74 6f 20 63 68 65 63  s() call to chec
2fa0: 6b 20 66 6f 72 20 74 68 65 20 70 72 65 73 65 6e  k for the presen
2fb0: 63 65 20 6f 66 20 61 6e 79 20 6d 61 73 74 65 72  ce of any master
2fc0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
2fd0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
2fe0: 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20 70 61 67  s made)..#.# pag
2ff0: 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65 73 74 20  er1.4.3.*: Test 
3000: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
3010: 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  s of a hot-journ
3020: 61 6c 20 61 72 65 20 69 67 6e 6f 72 65 64 20 69  al are ignored i
3030: 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  f the.#         
3040: 20 20 20 20 20 20 70 61 67 65 2d 73 69 7a 65 20        page-size 
3050: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
3060: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
3070: 61 64 65 72 20 61 70 70 65 61 72 20 74 6f 0a 23  ader appear to.#
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3090: 65 20 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20 6c  e invalid (too l
30a0: 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61 6c 6c 20  arge, too small 
30b0: 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65 72 20 6f  or not a power o
30c0: 66 20 32 29 2e 0a 23 0a 23 20 70 61 67 65 72 31  f 2)..#.# pager1
30d0: 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20 68 6f 74  .4.4.*: Test hot
30e0: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
30f0: 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  k of journal fil
3100: 65 20 77 69 74 68 20 61 20 6d 61 73 74 65 72 0a  e with a master.
3110: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3120: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
3130: 67 65 6e 65 72 61 74 65 64 20 69 6e 20 76 61 72  generated in var
3140: 69 6f 75 73 20 22 50 52 41 47 4d 41 20 73 79 6e  ious "PRAGMA syn
3150: 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20 20 20 20  chronous".#     
3160: 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 73 2e            modes.
3170: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 35 2e  .#.# pager1.4.5.
3180: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 68 6f 74  *: Test that hot
3190: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
31a0: 6b 20 73 74 6f 70 73 20 69 66 20 69 74 20 65 6e  k stops if it en
31b0: 63 6f 75 6e 74 65 72 73 20 61 0a 23 20 20 20 20  counters a.#    
31c0: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
31d0: 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72 20 77 68  al-record for wh
31e0: 69 63 68 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ich the checksum
31f0: 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65   fails..#.# page
3200: 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73 74 20 74  r1.4.6.*: Test t
3210: 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67  hat when rolling
3220: 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
3230: 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nal that contain
3240: 73 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  s a.#           
3250: 20 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e      master journ
3260: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20  al pointer, the 
3270: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
3280: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 0a 23  ile is deleted.#
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
32a0: 66 74 65 72 20 61 6c 6c 20 74 68 65 20 68 6f 74  fter all the hot
32b0: 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61 74 20 72  -journals that r
32c0: 65 66 65 72 20 74 6f 20 69 74 20 61 72 65 20 64  efer to it are d
32d0: 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70 61 67 65  eleted..#.# page
32e0: 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73 74 20 74  r1.4.7.*: Test t
32f0: 68 61 74 20 69 66 20 61 20 68 6f 74 2d 6a 6f 75  hat if a hot-jou
3300: 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
3310: 20 62 75 74 20 61 20 63 6c 69 65 6e 74 20 63 61   but a client ca
3320: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
3330: 20 20 6f 70 65 6e 20 69 74 20 66 6f 72 20 72 65    open it for re
3340: 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74 68 65 20  ading only, the 
3350: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
3360: 62 65 20 61 63 63 65 73 73 65 64 20 61 6e 64 0a  be accessed and.
3370: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3380: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
3390: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 20 0a  is returned..# .
33a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
33b0: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
33c0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
33d0: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  pen.  execsql { 
33e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
33f0: 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20 20 20 49  E x(y, z);.    I
3400: 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41 4c  NSERT INTO x VAL
3410: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
3420: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65   set fd [open te
3430: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d  st.db-journal w]
3440: 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69  .  puts -nonewli
3450: 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f 77 6f 72  ne $fd "hellowor
3460: 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  ld".  close $fd.
3470: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
3480: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
3490: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {1}.do_test page
34a0: 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78 65 63 73  r1.4.1.2 { execs
34b0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
34c0: 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32 7d 0a 64  OM x } } {1 2}.d
34d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
34e0: 31 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  1.3 { file exist
34f0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
3500: 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65 74 20 75  l } {0}..# Set u
3510: 70 20 61 20 5b 74 65 73 74 76 66 73 5d 20 74 6f  p a [testvfs] to
3520: 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   snapshot the fi
3530: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
3540: 65 66 6f 72 65 20 53 51 4c 69 74 65 0a 23 20 64  efore SQLite.# d
3550: 65 6c 65 74 65 73 20 74 68 65 20 6d 61 73 74 65  eletes the maste
3560: 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 63 6f 6d  r-journal to com
3570: 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  mit a multi-file
3580: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
3590: 23 20 49 6e 20 73 75 62 73 65 71 75 65 6e 74 20  # In subsequent 
35a0: 74 65 73 74 20 63 61 73 65 73 2c 20 69 6e 76 6f  test cases, invo
35b0: 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69 6d 5f 72  king [faultsim_r
35c0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
35d0: 6e 5d 20 73 65 74 73 0a 23 20 75 70 20 74 68 65  n] sets.# up the
35e0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
35f0: 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64 61 74 61  contain two data
3600: 62 61 73 65 73 2c 20 74 77 6f 20 68 6f 74 2d 6a  bases, two hot-j
3610: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 6e 64  ournal files and
3620: 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72  .# a master-jour
3630: 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  nal..#.do_test p
3640: 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b 0a 20 20  ager1.4.2.1 {.  
3650: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3660: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3670: 66 73 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  fs filter xDelet
3680: 65 0a 20 20 74 73 74 76 66 73 20 73 63 72 69 70  e.  tstvfs scrip
3690: 74 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63  t xDeleteCallbac
36a0: 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c 65 74 65  k.  proc xDelete
36b0: 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64  Callback {method
36c0: 20 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20   file args} {.  
36d0: 20 20 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65    set file [file
36e0: 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20   tail $file].   
36f0: 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 6d 61   if { [string ma
3700: 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c 65 5d 20  tch *mj* $file] 
3710: 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  } { faultsim_sav
3720: 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  e }.  }.  faults
3730: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
3740: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
3750: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
3760: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3770: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
3780: 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50  2' AS aux;.    P
3790: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
37a0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
37b0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 63 61 63   PRAGMA main.cac
37c0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37d0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 63 61 63    PRAGMA aux.cac
37e0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3800: 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  1(a UNIQUE, b UN
3810: 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54  IQUE);.    CREAT
3820: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61  E TABLE aux.t2(a
3830: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
3840: 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  E);.    INSERT I
3850: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
3860: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
3870: 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20  tring(300));.   
3880: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3890: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38a0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38b0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
38c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
38d0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38e0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
3900: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3910: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3920: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
3930: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3940: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
3950: 67 28 32 30 31 29 2c 20 61 5f 73 74 72 69 6e 67  g(201), a_string
3960: 28 33 30 31 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (301) FROM t1;. 
3970: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3980: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
3990: 69 6e 67 28 32 30 32 29 2c 20 61 5f 73 74 72 69  ing(202), a_stri
39a0: 6e 67 28 33 30 32 29 20 46 52 4f 4d 20 74 31 3b  ng(302) FROM t1;
39b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
39c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
39d0: 74 72 69 6e 67 28 32 30 33 29 2c 20 61 5f 73 74  tring(203), a_st
39e0: 72 69 6e 67 28 33 30 33 29 20 46 52 4f 4d 20 74  ring(303) FROM t
39f0: 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  1;.      INSERT 
3a00: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
3a10: 5f 73 74 72 69 6e 67 28 32 30 34 29 2c 20 61 5f  _string(204), a_
3a20: 73 74 72 69 6e 67 28 33 30 34 29 20 46 52 4f 4d  string(304) FROM
3a30: 20 74 31 3b 0a 20 20 20 20 20 20 52 45 50 4c 41   t1;.      REPLA
3a40: 43 45 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  CE INTO t2 SELEC
3a50: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
3a60: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64   COMMIT;.  }.  d
3a70: 62 20 63 6c 6f 73 65 0a 20 20 74 73 74 76 66 73  b close.  tstvfs
3a80: 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 64 6f 5f   delete.} {}.do_
3a90: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3aa0: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
3ab0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3ac0: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3ad0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3ae0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3af0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3b00: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3b10: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
3b20: 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75  r1.4.2.3 {.  fau
3b30: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
3b40: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
3b50: 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e  ch f [glob test.
3b60: 64 62 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20 64  db-mj*] { file d
3b70: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66 20  elete -force $f 
3b80: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3b90: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3ba0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3bb0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3bc0: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 36 34  check;.  }.} {64
3bd0: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   ok}.do_test pag
3be0: 65 72 31 2e 34 2e 32 2e 34 20 7b 0a 20 20 66 61  er1.4.2.4 {.  fa
3bf0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
3c00: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65 78 69  nd_reopen.  hexi
3c10: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d  o_write test.db-
3c20: 6a 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 5b 66  journal [expr [f
3c30: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
3c40: 2d 6a 6f 75 72 6e 61 6c 5d 2d 32 30 5d 20 31 32  -journal]-20] 12
3c50: 33 34 35 36 0a 20 20 65 78 65 63 73 71 6c 20 7b  3456.  execsql {
3c60: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
3c70: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
3c80: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
3c90: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
3ca0: 7b 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70  {4 ok}.do_test p
3cb0: 61 67 65 72 31 2e 34 2e 32 2e 35 20 7b 0a 20 20  ager1.4.2.5 {.  
3cc0: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
3cd0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65  _and_reopen.  he
3ce0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
3cf0: 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20  b-journal [expr 
3d00: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
3d10: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d 32 30 5d 20  db-journal]-20] 
3d20: 31 32 33 34 35 36 0a 20 20 66 6f 72 65 61 63 68  123456.  foreach
3d30: 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62   f [glob test.db
3d40: 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20 64 65 6c  -mj*] { file del
3d50: 65 74 65 20 2d 66 6f 72 63 65 20 24 66 20 7d 0a  ete -force $f }.
3d60: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3d70: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
3d80: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41  FROM t1;.    PRA
3d90: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
3da0: 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b  eck;.  }.} {4 ok
3db0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
3dc0: 31 2e 34 2e 33 2e 31 20 7b 0a 20 20 74 65 73 74  1.4.3.1 {.  test
3dd0: 76 66 73 20 74 73 74 76 66 73 20 2d 64 65 66 61  vfs tstvfs -defa
3de0: 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73 20 66  ult 1.  tstvfs f
3df0: 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74 73  ilter xSync.  ts
3e00: 74 76 66 73 20 73 63 72 69 70 74 20 78 53 79 6e  tvfs script xSyn
3e10: 63 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f 63  cCallback.  proc
3e20: 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 20 7b   xSyncCallback {
3e30: 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72 67 73  method file args
3e40: 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c 65  } {.    set file
3e50: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
3e60: 65 5d 0a 20 20 20 20 69 66 20 7b 20 30 3d 3d 5b  e].    if { 0==[
3e70: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f  string match *jo
3e80: 75 72 6e 61 6c 20 24 66 69 6c 65 5d 20 7d 20 7b  urnal $file] } {
3e90: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 7d   faultsim_save }
3ea0: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
3eb0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
3ec0: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3ed0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
3ee0: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
3ef0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3f00: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
3f10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3f20: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
3f30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3f40: 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d  ALUES(3, 4);.  }
3f50: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73  .  db close.  ts
3f60: 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d  tvfs delete.} {}
3f70: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6f 66  ..foreach {tn of
3f80: 73 74 20 76 61 6c 75 65 20 72 65 73 75 6c 74 7d  st value result}
3f90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 32 20 20   {.          2  
3fa0: 20 32 30 20 20 20 20 33 31 20 20 20 20 20 20 20   20    31       
3fb0: 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20  {1 2 3 4}.      
3fc0: 20 20 20 20 33 20 20 20 32 30 20 20 20 20 33 32      3   20    32
3fd0: 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d         {1 2 3 4}
3fe0: 0a 20 20 20 20 20 20 20 20 20 20 34 20 20 20 32  .          4   2
3ff0: 30 20 20 20 20 33 33 20 20 20 20 20 20 20 7b 31  0    33       {1
4000: 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20   2 3 4}.        
4010: 20 20 35 20 20 20 32 30 20 20 20 20 36 35 35 33    5   20    6553
4020: 36 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20  6    {1 2 3 4}. 
4030: 20 20 20 20 20 20 20 20 20 36 20 20 20 32 30 20           6   20 
4040: 20 20 20 31 33 31 30 37 32 20 20 20 7b 31 20 32     131072   {1 2
4050: 20 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20 20   3 4}..         
4060: 20 37 20 20 20 32 34 20 20 20 20 35 31 31 20 20   7   24    511  
4070: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
4080: 20 20 20 20 20 20 20 20 38 20 20 20 32 34 20 20          8   24  
4090: 20 20 35 31 33 20 20 20 20 20 20 7b 31 20 32 20    513      {1 2 
40a0: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 39  3 4}.          9
40b0: 20 20 20 32 34 20 20 20 20 31 33 31 30 37 32 20     24    131072 
40c0: 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 20    {1 2 3 4}..   
40d0: 20 20 20 20 20 20 31 30 20 20 20 33 32 20 20 20        10   32   
40e0: 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 7d 0a   65536    {1 2}.
40f0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } {.  do_test pa
4100: 67 65 72 31 2e 34 2e 33 2e 24 74 6e 20 7b 0a 20  ger1.4.3.$tn {. 
4110: 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74     faultsim_rest
4120: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
4130: 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74     hexio_write t
4140: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 24  est.db-journal $
4150: 6f 66 73 74 20 5b 66 6f 72 6d 61 74 20 25 2e 38  ofst [format %.8
4160: 78 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 65 78  x $value].    ex
4170: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
4180: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 24   FROM t1 }.  } $
4190: 72 65 73 75 6c 74 0a 7d 0a 64 62 20 63 6c 6f 73  result.}.db clos
41a0: 65 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56 46  e..# Set up a VF
41b0: 53 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 73  S that snapshots
41c0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
41d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 61 20 6d   just before a m
41e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 23 20  aster journal.# 
41f0: 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
4200: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74  to commit a mult
4210: 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
4220: 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79  on. Specifically
4230: 2c 20 74 68 65 0a 23 20 66 69 6c 65 2d 73 79 73  , the.# file-sys
4240: 74 65 6d 20 69 73 20 73 61 76 65 64 20 6a 75 73  tem is saved jus
4250: 74 20 62 65 66 6f 72 65 20 74 68 65 20 78 44 65  t before the xDe
4260: 6c 65 74 65 28 29 20 63 61 6c 6c 20 74 6f 20 72  lete() call to r
4270: 65 6d 6f 76 65 20 74 68 65 20 0a 23 20 6d 61 73  emove the .# mas
4280: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
4290: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73   from the file-s
42a0: 79 73 74 65 6d 2e 0a 23 0a 74 65 73 74 76 66 73  ystem..#.testvfs
42b0: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74   tv -default 1.t
42c0: 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e  v script copy_on
42d0: 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73 65 74 20 3a  _mj_delete.set :
42e0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e  :mj_filename_len
42f0: 67 74 68 20 30 0a 70 72 6f 63 20 63 6f 70 79 5f  gth 0.proc copy_
4300: 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d 65  on_mj_delete {me
4310: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
4320: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
4330: 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 5b  ing match *mj* [
4340: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e  file tail $filen
4350: 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73 65  ame]]} { .    se
4360: 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f  t ::mj_filename_
4370: 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67 20 6c  length [string l
4380: 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d  ength $filename]
4390: 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73 61  .    faultsim_sa
43a0: 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ve .  }.  return
43b0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 73 65   SQLITE_OK.}..se
43c0: 74 20 70 77 64 20 5b 70 77 64 5d 0a 66 6f 72 65  t pwd [pwd].fore
43d0: 61 63 68 20 7b 74 6e 31 20 74 63 6c 7d 20 7b 0a  ach {tn1 tcl} {.
43e0: 20 20 31 20 7b 20 73 65 74 20 70 72 65 66 69 78    1 { set prefix
43f0: 20 22 74 65 73 74 2e 64 62 22 20 7d 0a 20 20 32   "test.db" }.  2
4400: 20 7b 20 0a 20 20 20 20 23 20 54 68 69 73 20 74   { .    # This t
4410: 65 73 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  est depends on t
4420: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46  he underlying VF
4430: 53 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20  S being able to 
4440: 6f 70 65 6e 20 70 61 74 68 73 0a 20 20 20 20 23  open paths.    #
4450: 20 35 31 32 20 62 79 74 65 73 20 69 6e 20 6c 65   512 bytes in le
4460: 6e 67 74 68 2e 20 54 68 65 20 69 64 65 61 20 69  ngth. The idea i
4470: 73 20 74 6f 20 63 72 65 61 74 65 20 61 20 68 6f  s to create a ho
4480: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t-journal file t
4490: 68 61 74 0a 20 20 20 20 23 20 63 6f 6e 74 61 69  hat.    # contai
44a0: 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72  ns a master-jour
44b0: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20 6c  nal pointer so l
44c0: 61 72 67 65 20 74 68 61 74 20 69 74 20 63 6f 75  arge that it cou
44d0: 6c 64 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 23  ld contain.    #
44e0: 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 72 65   a valid page re
44f0: 63 6f 72 64 20 28 69 66 20 74 68 65 20 66 69 6c  cord (if the fil
4500: 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 35  e page-size is 5
4510: 31 32 20 62 79 74 65 73 29 2e 20 53 6f 20 61 73  12 bytes). So as
4520: 20 74 6f 0a 20 20 20 20 23 20 6d 61 6b 65 20 73   to.    # make s
4530: 75 72 65 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ure SQLite doesn
4540: 27 74 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  't get confused 
4550: 62 79 20 74 68 69 73 2e 0a 20 20 20 20 23 0a 20  by this..    #. 
4560: 20 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67 20     set nPadding 
4570: 5b 65 78 70 72 20 35 31 31 20 2d 20 24 3a 3a 6d  [expr 511 - $::m
4580: 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74  j_filename_lengt
4590: 68 5d 0a 20 20 20 20 69 66 20 7b 24 74 63 6c 5f  h].    if {$tcl_
45a0: 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72  platform(platfor
45b0: 6d 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b  m)=="windows"} {
45c0: 0a 20 20 20 20 20 20 23 20 54 42 44 20 6e 65 65  .      # TBD nee
45d0: 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  d to figure out 
45e0: 68 6f 77 20 74 6f 20 64 6f 20 74 68 69 73 20 63  how to do this c
45f0: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 57 69 6e  orrectly for Win
4600: 64 6f 77 73 21 21 21 0a 20 20 20 20 20 20 73 65  dows!!!.      se
4610: 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72  t nPadding [expr
4620: 20 32 35 35 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c   255 - $::mj_fil
4630: 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20  ename_length].  
4640: 20 20 7d 0a 0a 20 20 20 20 23 20 57 65 20 63 61    }..    # We ca
4650: 6e 6e 6f 74 20 6a 75 73 74 20 63 72 65 61 74 65  nnot just create
4660: 20 61 20 72 65 61 6c 6c 79 20 6c 6f 6e 67 20 64   a really long d
4670: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
4680: 65 20 74 6f 20 6f 70 65 6e 2c 20 61 73 0a 20 20  e to open, as.  
4690: 20 20 23 20 4c 69 6e 75 78 20 6c 69 6d 69 74 73    # Linux limits
46a0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70 6f 6e   a single compon
46b0: 65 6e 74 20 6f 66 20 61 20 70 61 74 68 20 74 6f  ent of a path to
46c0: 20 32 35 35 20 62 79 74 65 73 20 62 79 20 64 65   255 bytes by de
46d0: 66 61 75 6c 74 0a 20 20 20 20 23 20 28 61 6e 64  fault.    # (and
46e0: 20 70 72 65 73 75 6d 61 62 6c 79 20 6f 74 68 65   presumably othe
46f0: 72 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 6c  r systems have l
4700: 69 6d 69 74 73 20 74 6f 6f 29 2e 20 53 6f 20 63  imits too). So c
4710: 72 65 61 74 65 20 61 20 64 69 72 65 63 74 6f 72  reate a director
4720: 79 0a 20 20 20 20 23 20 68 69 65 72 61 72 63 68  y.    # hierarch
4730: 79 20 74 6f 20 77 6f 72 6b 20 69 6e 2e 0a 20 20  y to work in..  
4740: 20 20 23 0a 20 20 20 20 73 65 74 20 64 69 72 6e    #.    set dirn
4750: 61 6d 65 20 22 64 31 32 33 34 35 36 37 38 39 30  ame "d1234567890
4760: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
4770: 37 38 39 30 2f 22 0a 20 20 20 20 73 65 74 20 6e  7890/".    set n
4780: 44 69 72 20 5b 65 78 70 72 20 24 6e 50 61 64 64  Dir [expr $nPadd
4790: 69 6e 67 20 2f 20 33 32 5d 0a 20 20 20 20 69 66  ing / 32].    if
47a0: 20 7b 20 24 6e 44 69 72 20 7d 20 7b 0a 20 20 20   { $nDir } {.   
47b0: 20 20 20 73 65 74 20 70 20 5b 73 74 72 69 6e 67     set p [string
47c0: 20 72 65 70 65 61 74 20 24 64 69 72 6e 61 6d 65   repeat $dirname
47d0: 20 24 6e 44 69 72 5d 0a 20 20 20 20 20 20 66 69   $nDir].      fi
47e0: 6c 65 20 6d 6b 64 69 72 20 24 70 0a 20 20 20 20  le mkdir $p.    
47f0: 20 20 63 64 20 24 70 0a 20 20 20 20 7d 0a 0a 20    cd $p.    }.. 
4800: 20 20 20 73 65 74 20 70 61 64 64 69 6e 67 20 5b     set padding [
4810: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78 20  string repeat x 
4820: 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20  [expr $nPadding 
4830: 25 33 32 5d 5d 0a 20 20 20 20 73 65 74 20 70 72  %32]].    set pr
4840: 65 66 69 78 20 22 74 65 73 74 2e 64 62 24 7b 70  efix "test.db${p
4850: 61 64 64 69 6e 67 7d 22 0a 20 20 7d 0a 7d 20 7b  adding}".  }.} {
4860: 0a 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20 66  .  eval $tcl.  f
4870: 6f 72 65 61 63 68 20 7b 74 6e 32 20 73 71 6c 7d  oreach {tn2 sql}
4880: 20 7b 0a 20 20 20 20 6f 20 7b 20 0a 20 20 20 20   {.    o { .    
4890: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
48a0: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20  nchronous=OFF;. 
48b0: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
48c0: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b  synchronous=OFF;
48d0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
48e0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
48f0: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ETE;.    }.    o
4900: 35 31 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41  512 { .      PRA
4910: 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f  GMA main.synchro
4920: 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20  nous=OFF;.      
4930: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
4940: 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20  ronous=OFF;.    
4950: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61    PRAGMA main.pa
4960: 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
4970: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
4980: 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b  page_size = 512;
4990: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
49a0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
49b0: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ETE;.    }.    n
49c0: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
49d0: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
49e0: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
49f0: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
4a00: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
4a10: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
4a20: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
4a30: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 20 7b  E;.    }.    f {
4a40: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d   .      PRAGMA m
4a50: 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ain.synchronous=
4a60: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41 47  FULL;.      PRAG
4a70: 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f  MA aux.synchrono
4a80: 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50  us=FULL;.      P
4a90: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4aa0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4ab0: 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 73 65   }.  } {..    se
4ac0: 74 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24 7b 74  t tn "${tn1}.${t
4ad0: 6e 32 7d 22 0a 20 20 0a 20 20 20 20 23 20 53 65  n2}".  .    # Se
4ae0: 74 20 75 70 20 61 20 63 6f 6e 6e 65 63 74 69 6f  t up a connectio
4af0: 6e 20 74 6f 20 68 61 76 65 20 74 77 6f 20 64 61  n to have two da
4b00: 74 61 62 61 73 65 73 2c 20 74 65 73 74 2e 64 62  tabases, test.db
4b10: 20 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20 20 20   (main) and .   
4b20: 20 23 20 74 65 73 74 2e 64 62 32 20 28 61 75 78   # test.db2 (aux
4b30: 29 2e 20 54 68 65 6e 20 72 75 6e 20 61 20 6d 75  ). Then run a mu
4b40: 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
4b50: 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20 54 68  tion on them. Th
4b60: 65 0a 20 20 20 20 23 20 56 46 53 20 77 69 6c 6c  e.    # VFS will
4b70: 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   snapshot the fi
4b80: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
4b90: 65 66 6f 72 65 20 74 68 65 20 6d 61 73 74 65 72  efore the master
4ba0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23 20 66  -journal.    # f
4bb0: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 74  ile is deleted t
4bc0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
4bd0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 23 0a  nsaction..    #.
4be0: 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 78 44      tv filter xD
4bf0: 65 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74 65 73  elete.    do_tes
4c00: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
4c10: 2e 31 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74  .1 {.      fault
4c20: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
4c30: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
4c40: 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
4c50: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 24 7b        ATTACH '${
4c60: 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78  prefix}2' AS aux
4c70: 3b 0a 20 20 20 20 20 20 20 20 24 73 71 6c 0a 20  ;.        $sql. 
4c80: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
4c90: 42 4c 45 20 61 28 78 29 3b 0a 20 20 20 20 20 20  BLE a(x);.      
4ca0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
4cb0: 75 78 2e 62 28 78 29 3b 0a 20 20 20 20 20 20 20  ux.b(x);.       
4cc0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56   INSERT INTO a V
4cd0: 41 4c 55 45 53 28 27 64 6f 75 62 6c 65 2d 79 6f  ALUES('double-yo
4ce0: 75 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  u');.        INS
4cf0: 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45  ERT INTO a VALUE
4d00: 53 28 27 77 68 79 27 29 3b 0a 20 20 20 20 20 20  S('why');.      
4d10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20    INSERT INTO a 
4d20: 56 41 4c 55 45 53 28 27 7a 65 64 27 29 3b 0a 20  VALUES('zed');. 
4d30: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4d40: 54 4f 20 62 20 56 41 4c 55 45 53 28 27 77 6f 6e  TO b VALUES('won
4d50: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
4d60: 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53  RT INTO b VALUES
4d70: 28 27 74 6f 6f 27 29 3b 0a 20 20 20 20 20 20 20  ('too');.       
4d80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56   INSERT INTO b V
4d90: 41 4c 55 45 53 28 27 66 72 65 65 27 29 3b 0a 20  ALUES('free');. 
4da0: 20 20 20 20 20 22 0a 20 20 20 20 20 20 65 78 65       ".      exe
4db0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 42  csql {.        B
4dc0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  EGIN;.          
4dd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 53 45  INSERT INTO a SE
4de0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 20 57 48  LECT * FROM b WH
4df0: 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20  ERE rowid<=3;.  
4e00: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4e10: 4e 54 4f 20 62 20 53 45 4c 45 43 54 20 2a 20 46  NTO b SELECT * F
4e20: 52 4f 4d 20 61 20 57 48 45 52 45 20 72 6f 77 69  ROM a WHERE rowi
4e30: 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 43 4f  d<=3;.        CO
4e40: 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  MMIT;.      }.  
4e50: 20 20 7d 20 7b 7d 0a 20 20 20 20 74 76 20 66 69    } {}.    tv fi
4e60: 6c 74 65 72 20 7b 7d 0a 20 20 20 20 0a 20 20 20  lter {}.    .   
4e70: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68   # Check that th
4e80: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
4e90: 73 20 63 6f 6d 6d 69 74 74 65 64 20 73 75 63 63  s committed succ
4ea0: 65 73 73 66 75 6c 6c 79 2e 0a 20 20 20 20 23 0a  essfully..    #.
4eb0: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
4ec0: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
4ed0: 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 53 45 4c  tn.2 {.      SEL
4ee0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20  ECT * FROM a.   
4ef0: 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77   } {double-you w
4f00: 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66  hy zed won too f
4f10: 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63  ree}.    do_exec
4f20: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
4f30: 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  4.4.$tn.3 {.    
4f40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4f50: 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f  b.    } {won too
4f60: 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75   free double-you
4f70: 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 0a 20   why zed}.    . 
4f80: 20 20 20 23 20 52 65 73 74 6f 72 65 20 74 68 65     # Restore the
4f90: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64   file-system and
4fa0: 20 72 65 6f 70 65 6e 20 74 68 65 20 64 61 74 61   reopen the data
4fb0: 62 61 73 65 73 2e 20 43 68 65 63 6b 20 74 68 61  bases. Check tha
4fc0: 74 20 69 74 20 6e 6f 77 0a 20 20 20 20 23 20 61  t it now.    # a
4fd0: 70 70 65 61 72 73 20 74 68 61 74 20 74 68 65 20  ppears that the 
4fe0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
4ff0: 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 20 28 62  not committed (b
5000: 65 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 2d  ecause the file-
5010: 73 79 73 74 65 6d 0a 20 20 20 20 23 20 77 61 73  system.    # was
5020: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68 65   restored to the
5030: 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
5040: 68 61 64 20 6e 6f 74 20 62 65 65 6e 29 2e 0a 20  had not been).. 
5050: 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74     #.    do_test
5060: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5070: 34 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73  4 {.      faults
5080: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5090: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
50a0: 20 20 20 20 65 78 65 63 73 71 6c 20 22 41 54 54      execsql "ATT
50b0: 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32 27  ACH '${prefix}2'
50c0: 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20 7b   AS aux".    } {
50d0: 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c  }.    do_execsql
50e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
50f0: 2e 24 74 6e 2e 35 20 7b 53 45 4c 45 43 54 20 2a  .$tn.5 {SELECT *
5100: 20 46 52 4f 4d 20 61 7d 20 7b 64 6f 75 62 6c 65   FROM a} {double
5110: 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20  -you why zed}.  
5120: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
5130: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
5140: 2e 36 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  .6 {SELECT * FRO
5150: 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72  M b} {won too fr
5160: 65 65 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52  ee}.    .    # R
5170: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5180: 73 79 73 74 65 6d 20 61 67 61 69 6e 2e 20 54 68  system again. Th
5190: 69 73 20 74 69 6d 65 2c 20 62 65 66 6f 72 65 20  is time, before 
51a0: 72 65 6f 70 65 6e 69 6e 67 20 74 68 65 20 64 61  reopening the da
51b0: 74 61 62 61 73 65 73 2c 0a 20 20 20 20 23 20 64  tabases,.    # d
51c0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
51d0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72  -journal file fr
51e0: 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  om the file-syst
51f0: 65 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70 65 61  em. It now appea
5200: 72 73 20 74 68 61 74 0a 20 20 20 20 23 20 74 68  rs that.    # th
5210: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
5220: 73 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e 6f 20  s committed (no 
5230: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
5240: 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c 62 61  ile == no rollba
5250: 63 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20 20 64  ck)..    #.    d
5260: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  o_test pager1-4.
5270: 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 20 20  4.$tn.7 {.      
5280: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
5290: 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 65  _and_reopen $pre
52a0: 66 69 78 0a 20 20 20 20 20 20 66 6f 72 65 61 63  fix.      foreac
52b0: 68 20 66 20 5b 67 6c 6f 62 20 24 7b 70 72 65 66  h f [glob ${pref
52c0: 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20  ix}-mj*] { file 
52d0: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66  delete -force $f
52e0: 20 7d 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   }.      execsql
52f0: 20 22 41 54 54 41 43 48 20 27 24 7b 70 72 65 66   "ATTACH '${pref
5300: 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a 20 20  ix}2' AS aux".  
5310: 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f 65 78    } {}.    do_ex
5320: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
5330: 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b 0a 20 20  1-4.4.$tn.8 {.  
5340: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
5350: 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62 6c  M a.    } {doubl
5360: 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77 6f  e-you why zed wo
5370: 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20  n too free}.    
5380: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5390: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 39  pager1-4.4.$tn.9
53a0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
53b0: 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20 7b  * FROM b.    } {
53c0: 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f 75  won too free dou
53d0: 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d  ble-you why zed}
53e0: 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70 77 64 0a  .  }..  cd $pwd.
53f0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  }.db close.tv de
5400: 6c 65 74 65 0a 66 69 6c 65 20 64 65 6c 65 74 65  lete.file delete
5410: 20 2d 66 6f 72 63 65 20 24 64 69 72 6e 61 6d 65   -force $dirname
5420: 0a 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56 46  ...# Set up a VF
5430: 53 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  S to make a copy
5440: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
5450: 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20  tem just before 
5460: 64 65 6c 65 74 69 6e 67 20 61 0a 23 20 6a 6f 75  deleting a.# jou
5470: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 63 6f 6d  rnal file to com
5480: 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
5490: 6e 2e 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  n. The transacti
54a0: 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65 78 61 63  on modifies exac
54b0: 74 6c 79 0a 23 20 74 77 6f 20 64 61 74 61 62 61  tly.# two databa
54c0: 73 65 20 70 61 67 65 73 20 28 61 6e 64 20 70 61  se pages (and pa
54d0: 67 65 20 31 20 2d 20 74 68 65 20 63 68 61 6e 67  ge 1 - the chang
54e0: 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23 0a 74 65  e counter)..#.te
54f0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
5500: 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a  t 1.tv sectorsiz
5510: 65 20 35 31 32 0a 74 76 20 73 63 72 69 70 74 20  e 512.tv script 
5520: 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f  copy_on_journal_
5530: 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72  delete.tv filter
5540: 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f   xDelete.proc co
5550: 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65  py_on_journal_de
5560: 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c  lete {method fil
5570: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
5580: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
5590: 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65  h *journal $file
55a0: 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f  name]} faultsim_
55b0: 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53  save .  return S
55c0: 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74  QLITE_OK.}.fault
55d0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
55e0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
55f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5600: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f  .1 {.  PRAGMA jo
5610: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
5620: 45 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 70 61  ETE;.  PRAGMA pa
5630: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
5640: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
5650: 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54  1(a, b);.  CREAT
5660: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
5670: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
5680: 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27  t1 VALUES('I', '
5690: 49 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  II');.  INSERT I
56a0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 49  NTO t2 VALUES('I
56b0: 49 49 27 2c 20 27 49 56 27 29 3b 0a 20 20 42 45  II', 'IV');.  BE
56c0: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
56d0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
56e0: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
56f0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
5700: 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b  3, 4);.  COMMIT;
5710: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20 66  .} {delete}.tv f
5720: 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65 63  ilter {}..# Chec
5730: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
5740: 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 3a  n was committed:
5750: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
5760: 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32 20  st pager1.4.5.2 
5770: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
5780: 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a  M t1;.  SELECT *
5790: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49   FROM t2;.} {I I
57a0: 49 20 31 20 32 20 49 49 49 20 49 56 20 33 20 34  I 1 2 III IV 3 4
57b0: 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f 75  }..# Now try fou
57c0: 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70 61  r tests:.#.#  pa
57d0: 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73 74  ger1-4.5.3: Rest
57e0: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
57f0: 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74 20  tem. Check that 
5800: 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
5810: 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20 20  ction .#        
5820: 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c 65          is rolle
5830: 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67  d back..#.#  pag
5840: 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74 6f  er1-4.5.4: Resto
5850: 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  re the file-syst
5860: 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20  em. Corrupt the 
5870: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
5880: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
5890: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68       journal. Ch
58a0: 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  eck the transact
58b0: 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c 65  ion is not rolle
58c0: 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67  d back..#.#  pag
58d0: 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74 6f  er1-4.5.5: Resto
58e0: 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  re the file-syst
58f0: 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20  em. Corrupt the 
5900: 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69 6e  second record in
5910: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
5920: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43        journal. C
5930: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66 69  heck that the fi
5940: 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68  rst record in th
5950: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
5960: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
5970: 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20     played back, 
5980: 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63 6f  but not the seco
5990: 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  nd..#.#  pager1-
59a0: 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20 74  4.5.6: Restore t
59b0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
59c0: 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  Try to open the 
59d0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 0a  database with a.
59e0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
59f0: 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65 63   readonly connec
5a00: 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c  tion. This shoul
5a10: 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65 61  d fail, as a rea
5a20: 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20 20  d-only.#        
5a30: 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
5a40: 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20 62  on cannot roll b
5a50: 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
5a60: 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69   file..#.faultsi
5a70: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
5a80: 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  open.do_execsql_
5a90: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
5aa0: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  3 {.  SELECT * F
5ab0: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
5ac0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49   * FROM t2;.} {I
5ad0: 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75 6c   II III IV}.faul
5ae0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5af0: 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 72  _reopen.hexio_wr
5b00: 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ite test.db-jour
5b10: 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 2b  nal [expr 512+4+
5b20: 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32 33  1024 - 202] 0123
5b30: 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f 5f  456789ABCDEF.do_
5b40: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
5b50: 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53 45  er1.4.5.4 {.  SE
5b60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
5b70: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5b80: 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 20  t2;.} {I II 1 2 
5b90: 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75 6c  III IV 3 4}.faul
5ba0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5bb0: 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 72  _reopen.hexio_wr
5bc0: 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ite test.db-jour
5bd0: 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 2b  nal [expr 512+4+
5be0: 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d 20  1024+4+4+1024 - 
5bf0: 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39 41  202] 0123456789A
5c00: 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71 6c  BCDEF.do_execsql
5c10: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5c20: 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .5 {.  SELECT * 
5c30: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
5c40: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
5c50: 49 20 49 49 20 49 49 49 20 49 56 20 33 20 34 7d  I II III IV 3 4}
5c60: 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f  ..faultsim_resto
5c70: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62  re_and_reopen.db
5c80: 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64   close.sqlite3 d
5c90: 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f  b test.db -reado
5ca0: 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73 71  nly 1.do_catchsq
5cb0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5cc0: 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.6 {.  SELECT *
5cd0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5ce0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5cf0: 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72  {1 {disk I/O err
5d00: 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 23  or}}.db close..#
5d10: 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   Snapshot the fi
5d20: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
5d30: 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69 6c 65  efore multi-file
5d40: 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20 74 68   commit. Save th
5d50: 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68 65 20  e name.# of the 
5d60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5d70: 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66 69 6c  ile in $::mj_fil
5d80: 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63 72 69  ename..#.tv scri
5d90: 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65  pt copy_on_mj_de
5da0: 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78  lete.tv filter x
5db0: 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79  Delete.proc copy
5dc0: 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d  _on_mj_delete {m
5dd0: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
5de0: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
5df0: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20  ring match *mj* 
5e00: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
5e10: 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73  name]]} { .    s
5e20: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
5e30: 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 66   $filename.    f
5e40: 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20  aultsim_save .  
5e50: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5e60: 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20 70  E_OK.}.do_test p
5e70: 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a 20 20  ager1.4.6.1 {.  
5e80: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
5e90: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
5ea0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
5eb0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
5ec0: 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 41 54 54   DELETE;.    ATT
5ed0: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
5ee0: 53 20 74 77 6f 3b 0a 20 20 20 20 43 52 45 41 54  S two;.    CREAT
5ef0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
5f00: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
5f10: 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20 62 29 3b  LE two.t2(a, b);
5f20: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5f30: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 74   t1 VALUES(1, 't
5f40: 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  1.1');.    INSER
5f50: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5f60: 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20 20 20  (1, 't2.1');.   
5f70: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
5f80: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
5f90: 27 74 31 2e 32 27 3b 0a 20 20 20 20 20 20 55 50  't1.2';.      UP
5fa0: 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20  DATE t2 SET b = 
5fb0: 27 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f 4d 4d  't2.2';.    COMM
5fc0: 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66 69 6c  IT;.  }.  tv fil
5fd0: 74 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c 6f 73  ter {}.  db clos
5fe0: 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73 69 6d  e.} {}..faultsim
5ff0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
6000: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
6010: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 32  est pager1.4.6.2
6020: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
6030: 20 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20   t1 }           
6040: 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74  {1 t1.1}.do_test
6050: 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e           pager1.
6060: 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65 78 69  4.6.3 { file exi
6070: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6080: 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63  me } {1}.do_exec
6090: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
60a0: 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41 43 48  4.6.4 {.  ATTACH
60b0: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74   'test.db2' AS t
60c0: 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  wo;.  SELECT * F
60d0: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e  ROM t2;.} {1 t2.
60e0: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
60f0: 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65 20 65  1.4.6.5 { file e
6100: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6110: 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61 75 6c  name } {0}..faul
6120: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
6130: 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65  _reopen.db close
6140: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
6150: 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20 3a 3a  4.6.8 {.  set ::
6160: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24 3a 3a  mj_filename1 $::
6170: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20 74 76  mj_filename.  tv
6180: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
6190: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
61a0: 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20  t.db2.  execsql 
61b0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
61c0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
61d0: 54 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27  TE;.    ATTACH '
61e0: 74 65 73 74 2e 64 62 33 27 20 41 53 20 74 68 72  test.db3' AS thr
61f0: 65 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ee;.    CREATE T
6200: 41 42 4c 45 20 74 68 72 65 65 2e 74 33 28 61 2c  ABLE three.t3(a,
6210: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
6220: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31  INTO t3 VALUES(1
6230: 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20 20 20 42  , 't3.1');.    B
6240: 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41  EGIN;.      UPDA
6250: 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27 74  TE t2 SET b = 't
6260: 32 2e 33 27 3b 0a 20 20 20 20 20 20 55 50 44 41  2.3';.      UPDA
6270: 54 45 20 74 33 20 53 45 54 20 62 20 3d 20 27 74  TE t3 SET b = 't
6280: 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  3.3';.    COMMIT
6290: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a  ;.  }.  expr {$:
62a0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 21 3d  :mj_filename1 !=
62b0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 7d   $::mj_filename}
62c0: 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73 69 6d 5f  .} {1}.faultsim_
62d0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
62e0: 65 6e 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a  en.tv filter {}.
62f0: 0a 23 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74  .# The file-syst
6300: 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 3a  em now contains:
6310: 0a 23 0a 23 20 20 20 2a 20 74 68 72 65 65 20 64  .#.#   * three d
6320: 61 74 61 62 61 73 65 73 0a 23 20 20 20 2a 20 74  atabases.#   * t
6330: 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  hree hot-journal
6340: 20 66 69 6c 65 73 0a 23 20 20 20 2a 20 74 77 6f   files.#   * two
6350: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6360: 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68 65 20 68  files..#.# The h
6370: 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61 73 73 6f  ot-journals asso
6380: 63 69 61 74 65 64 20 77 69 74 68 20 74 65 73 74  ciated with test
6390: 2e 64 62 32 20 61 6e 64 20 74 65 73 74 2e 64 62  .db2 and test.db
63a0: 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20 6d 61 73  3 point to.# mas
63b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d  ter journal $::m
63c0: 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54 68 65 20  j_filename. The 
63d0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
63e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
63f0: 0a 23 20 74 65 73 74 2e 64 62 20 70 6f 69 6e 74  .# test.db point
6400: 73 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s to master jour
6410: 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  nal $::mj_filena
6420: 6d 65 31 2e 20 53 6f 20 72 65 61 64 69 6e 67 20  me1. So reading 
6430: 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64 62 20 73  from.# test.db s
6440: 68 6f 75 6c 64 20 64 65 6c 65 74 65 20 24 3a 3a  hould delete $::
6450: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a  mj_filename1..#.
6460: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
6470: 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72 74 20 5b  .6.9 {.  lsort [
6480: 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d 0a 7d  glob test.db*].}
6490: 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74 20 20 20   [lsort [list   
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 5c 0a 20 20 74 65 73 74          \.  test
64d0: 2e 64 62 20 74 65 73 74 2e 64 62 32 20 74 65 73  .db test.db2 tes
64e0: 74 2e 64 62 33 20 20 20 20 20 20 20 20 20 20 20  t.db3           
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6500: 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 2d 6a     \.  test.db-j
6510: 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d  ournal test.db2-
6520: 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 33  journal test.db3
6530: 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20 5c 0a  -journal      \.
6540: 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a    [file tail $::
6550: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b 66 69  mj_filename] [fi
6560: 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69  le tail $::mj_fi
6570: 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23 20 54  lename1].]]..# T
6580: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
6590: 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  l $::mj_filename
65a0: 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  1 contains point
65b0: 65 72 73 20 74 6f 20 74 65 73 74 2e 64 62 20 61  ers to test.db a
65c0: 6e 64 20 0a 23 20 74 65 73 74 2e 64 62 32 2e 20  nd .# test.db2. 
65d0: 48 6f 77 65 76 65 72 20 74 68 65 20 68 6f 74 2d  However the hot-
65e0: 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61 74  journal associat
65f0: 65 64 20 77 69 74 68 20 74 65 73 74 2e 64 62 32  ed with test.db2
6600: 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20 61 20 64   points to.# a d
6610: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 2d  ifferent master-
6620: 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72 65 66 6f  journal. Therefo
6630: 72 65 2c 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  re, reading from
6640: 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79 20 73 68   test.db only sh
6650: 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f 75 67 68  ould.# be enough
6660: 20 74 6f 20 63 61 75 73 65 20 53 51 4c 69 74 65   to cause SQLite
6670: 20 74 6f 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a   to delete $::mj
6680: 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f  _filename1..#.do
6690: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
66a0: 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b 20 66 69  ger1.4.6.10 { fi
66b0: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
66c0: 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a  filename  } {1}.
66d0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
66e0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 31 20 7b 20  pager1.4.6.11 { 
66f0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6700: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 31  j_filename1 } {1
6710: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
6720: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20  t pager1.4.6.12 
6730: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6740: 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d 0a 64 6f  t1 } {1 t1.1}.do
6750: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
6760: 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69  ger1.4.6.13 { fi
6770: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
6780: 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a  filename  } {1}.
6790: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
67a0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b 20  pager1.4.6.14 { 
67b0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
67c0: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 30  j_filename1 } {0
67d0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
67e0: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32  st pager1.4.6.12
67f0: 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73   {.  ATTACH 'tes
6800: 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20  t.db2' AS two;. 
6810: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6820: 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f  2;.} {1 t2.1}.do
6830: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
6840: 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69  ger1.4.6.13 { fi
6850: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
6860: 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 31 7d 0a  filename }  {1}.
6870: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6880: 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b 0a  pager1.4.6.14 {.
6890: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
68a0: 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20  b3' AS three;.  
68b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
68c0: 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a 64 6f 5f  ;.} {1 t3.1}.do_
68d0: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
68e0: 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20 66 69 6c  er1.4.6.15 { fil
68f0: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
6900: 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30 7d 0a 0a  ilename }  {0}..
6910: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
6920: 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d  te..testvfs tv -
6930: 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65 63  default 1.tv sec
6940: 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76 20 73  torsize 512.tv s
6950: 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f  cript copy_on_jo
6960: 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20  urnal_delete.tv 
6970: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70  filter xDelete.p
6980: 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72  roc copy_on_jour
6990: 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68  nal_delete {meth
69a0: 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73  od filename args
69b0: 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e  } {.  if {[strin
69c0: 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c  g match *journal
69d0: 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75   $filename]} fau
69e0: 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 72 65  ltsim_save .  re
69f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
6a00: 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65  .faultsim_delete
6a10: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65  _and_reopen.do_e
6a20: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
6a30: 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20 50 52 41  r1.4.7.1 {.  PRA
6a40: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
6a50: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 43 52 45   = DELETE;.  CRE
6a60: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50  ATE TABLE t1(x P
6a70: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
6a80: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
6a90: 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20 20 49 4e  1 ON t1(y);.  IN
6aa0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6ab0: 55 45 53 28 27 49 27 2c 20 20 20 27 6f 6e 65 27  UES('I',   'one'
6ac0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
6ad0: 20 74 31 20 56 41 4c 55 45 53 28 27 49 49 27 2c   t1 VALUES('II',
6ae0: 20 20 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53    'four');.  INS
6af0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6b00: 45 53 28 27 49 49 49 27 2c 20 27 6e 69 6e 65 27  ES('III', 'nine'
6b10: 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  );.  BEGIN;.    
6b20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6b30: 41 4c 55 45 53 28 27 49 56 27 2c 20 27 73 69 78  ALUES('IV', 'six
6b40: 74 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  teen');.    INSE
6b50: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6b60: 53 28 27 56 27 20 2c 20 27 74 77 65 6e 74 79 66  S('V' , 'twentyf
6b70: 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b  ive');.  COMMIT;
6b80: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20 66  .} {delete}.tv f
6b90: 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63 6c 6f 73  ilter {}.db clos
6ba0: 65 0a 74 76 20 64 65 6c 65 74 65 20 0a 64 6f 5f  e.tv delete .do_
6bb0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e  test pager1.4.7.
6bc0: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
6bd0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
6be0: 6e 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20  n.  catch {file 
6bf0: 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e  attributes test.
6c00: 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d  db-journal -perm
6c10: 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d 2d  issions r-------
6c20: 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65  -}.  catch {file
6c30: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
6c40: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61  .db-journal -rea
6c50: 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61 74 63 68  donly 1}.  catch
6c60: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
6c70: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 75  ROM t1 }.} {1 {u
6c80: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
6c90: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 64 6f  tabase file}}.do
6ca0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37  _test pager1.4.7
6cb0: 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .3 {.  db close.
6cc0: 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74    catch {file at
6cd0: 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62  tributes test.db
6ce0: 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69 73  -journal -permis
6cf0: 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d  sions rw-rw-rw-}
6d00: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
6d10: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
6d20: 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64 6f  b-journal -reado
6d30: 6e 6c 79 20 30 7d 0a 20 20 66 69 6c 65 20 64 65  nly 0}.  file de
6d40: 6c 65 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  lete test.db-jou
6d50: 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65 78 69 73  rnal.  file exis
6d60: 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
6d70: 61 6c 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d  al.} {0}..#-----
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dc0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
6dd0: 77 69 6e 67 20 74 65 73 74 73 20 64 65 61 6c 20  wing tests deal 
6de0: 77 69 74 68 20 6d 75 6c 74 69 2d 66 69 6c 65 20  with multi-file 
6df0: 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20 70 61 67  commits..#.# pag
6e00: 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68 65 20 63  er1-5.1.*: The c
6e10: 61 73 65 20 77 68 65 72 65 20 61 20 6d 75 6c 74  ase where a mult
6e20: 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  i-file cannot be
6e30: 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 63 61 75   committed becau
6e40: 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  se.#            
6e50: 20 20 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65     another conne
6e60: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
6e70: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
6e80: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a 23 20 20  n one of the.#  
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
6ea0: 65 73 2e 20 41 66 74 65 72 20 74 68 65 20 53 48  es. After the SH
6eb0: 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 6d  ARED lock is rem
6ec0: 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d 4d 49 54  oved, the COMMIT
6ed0: 20 73 75 63 63 65 65 64 73 2e 0a 23 0a 23 20 70   succeeds..#.# p
6ee0: 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20 4d 75 6c  ager1-5.2.*: Mul
6ef0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20  ti-file commits 
6f00: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
6f10: 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61  e=memory..#.# pa
6f20: 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d 75 6c 74  ger1-5.3.*: Mult
6f30: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20 77  i-file commits w
6f40: 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
6f50: 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61 67  =memory..#.# pag
6f60: 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68 65 63 6b  er1-5.4.*: Check
6f70: 20 74 68 61 74 20 77 69 74 68 20 73 79 6e 63 68   that with synch
6f80: 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c 2c 20 74  ronous=normal, t
6f90: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
6fa0: 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20  l file.#        
6fb0: 20 20 20 20 20 20 20 6e 61 6d 65 20 69 73 20 61         name is a
6fc0: 64 64 65 64 20 74 6f 20 61 20 6a 6f 75 72 6e 61  dded to a journa
6fd0: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
6fe0: 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  ly after the las
6ff0: 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  t.#             
7000: 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64    journal record
7010: 2e 20 42 75 74 20 77 69 74 68 20 73 79 6e 63 68  . But with synch
7020: 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20 65 78 74  ronous=full, ext
7030: 72 61 20 75 6e 75 73 65 64 20 73 70 61 63 65 0a  ra unused space.
7040: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
7050: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 74  is allocated bet
7060: 77 65 65 6e 20 74 68 65 20 6c 61 73 74 20 6a 6f  ween the last jo
7070: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 61 6e 64  urnal record and
7080: 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20 20   the .#         
7090: 20 20 20 20 20 20 6d 61 73 74 65 72 2d 6a 6f 75        master-jou
70a0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 73  rnal file name s
70b0: 6f 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65  o that the maste
70c0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23  r-journal file.#
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
70e0: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 6c 69 65  ame does not lie
70f0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63   on the same sec
7100: 74 6f 72 20 61 73 20 74 68 65 20 6c 61 73 74 20  tor as the last 
7110: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20  journal file.#  
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 63               rec
7130: 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  ord..#.# pager1-
7140: 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61  5.5.*: Check tha
7150: 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  t in journal_mod
7160: 65 3d 50 45 52 53 49 53 54 20 6d 6f 64 65 2c 20  e=PERSIST mode, 
7170: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
7180: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
7190: 20 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a    truncated to z
71a0: 65 72 6f 20 62 79 74 65 73 20 77 68 65 6e 20 61  ero bytes when a
71b0: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
71c0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 20 20  saction is .#   
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d              comm
71e0: 69 74 74 65 64 20 28 69 6e 73 74 65 61 64 20 6f  itted (instead o
71f0: 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  f the first coup
7200: 6c 65 20 6f 66 20 62 79 74 65 73 20 62 65 69 6e  le of bytes bein
7210: 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a 23 0a 64  g zeroed)..#.#.d
7220: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7230: 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
7240: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
7250: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
7260: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
7270: 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20  db2' AS aux;.   
7280: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
7290: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
72a0: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28  TE TABLE aux.t2(
72b0: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
72c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
72d0: 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29 3b 0a 20  (17, 'Lenin');. 
72e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
72f0: 31 20 56 41 4c 55 45 53 28 32 32 2c 20 27 53 74  1 VALUES(22, 'St
7300: 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  alin');.    INSE
7310: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7320: 53 28 35 33 2c 20 27 4b 68 72 75 73 68 63 68 65  S(53, 'Khrushche
7330: 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  v');.  }.} {}.do
7340: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
7350: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
7360: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7370: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7380: 20 56 41 4c 55 45 53 28 36 34 2c 20 27 42 72 65   VALUES(64, 'Bre
7390: 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20 20 20 49  zhnev');.      I
73a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
73b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
73c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
73d0: 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65  2 test.db2.  exe
73e0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
73f0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
7400: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 64 62   FROM t2;.  } db
7410: 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  2.} {}.do_test p
7420: 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b 0a 20 20  ager1-5.1.3 {.  
7430: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
7440: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
7450: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65  s locked}}.do_te
7460: 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 34 20  st pager1-5.1.4 
7470: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
7480: 49 54 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c  IT db2.  execsql
7490: 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63 73 71   COMMIT.  execsq
74a0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
74b0: 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 37  M t2 } db2.} {17
74c0: 20 4c 65 6e 69 6e 20 32 32 20 53 74 61 6c 69 6e   Lenin 22 Stalin
74d0: 20 35 33 20 4b 68 72 75 73 68 63 68 65 76 20 36   53 Khrushchev 6
74e0: 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64 6f 5f 74  4 Brezhnev}.do_t
74f0: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 35  est pager1-5.1.5
7500: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d   {.  db2 close.}
7510: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67   {}..do_test pag
7520: 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20 20 65 78  er1-5.2.1 {.  ex
7530: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
7540: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7550: 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20 20 42 45  = memory;.    BE
7560: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
7570: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
7580: 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29  (84, 'Andropov')
7590: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
75a0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38 34  NTO t2 VALUES(84
75b0: 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a 20  , 'Andropov');. 
75c0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
75d0: 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f 74 65 73   {memory}.do_tes
75e0: 74 20 70 61 67 65 72 31 2d 35 2e 33 2e 31 20 7b  t pager1-5.3.1 {
75f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7600: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
7610: 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20 20 20 20  mode = off;.    
7620: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
7630: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7640: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
7650: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
7660: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
7670: 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27  (85, 'Gorbachev'
7680: 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  );.    COMMIT;. 
7690: 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64 6f 5f 74   }.} {off}..do_t
76a0: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 31  est pager1-5.4.1
76b0: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
76c0: 74 65 73 74 76 66 73 20 74 76 0a 20 20 73 71 6c  testvfs tv.  sql
76d0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20  ite3 db test.db 
76e0: 2d 76 66 73 20 74 76 0a 20 20 65 78 65 63 73 71  -vfs tv.  execsq
76f0: 6c 20 7b 20 41 54 54 41 43 48 20 27 74 65 73 74  l { ATTACH 'test
7700: 2e 64 62 32 27 20 41 53 20 61 75 78 20 7d 0a 0a  .db2' AS aux }..
7710: 20 20 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c    tv filter xDel
7720: 65 74 65 0a 20 20 74 76 20 73 63 72 69 70 74 20  ete.  tv script 
7730: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  max_journal_size
7740: 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65  .  tv sectorsize
7750: 20 35 31 32 0a 20 20 73 65 74 20 3a 3a 6d 61 78   512.  set ::max
7760: 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 70 72 6f  _journal 0.  pro
7770: 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69  c max_journal_si
7780: 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d  ze {method args}
7790: 20 7b 0a 20 20 20 20 73 65 74 20 73 7a 20 30 0a   {.    set sz 0.
77a0: 20 20 20 20 63 61 74 63 68 20 7b 20 73 65 74 20      catch { set 
77b0: 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  sz [file size te
77c0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d  st.db-journal] }
77d0: 0a 20 20 20 20 69 66 20 7b 24 73 7a 20 3e 20 24  .    if {$sz > $
77e0: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 7d 20 7b  ::max_journal} {
77f0: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 61 78  .      set ::max
7800: 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a 20 20 20  _journal $sz.   
7810: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
7820: 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 65 78  LITE_OK.  }.  ex
7830: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
7840: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7850: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50 52  = DELETE;.    PR
7860: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
7870: 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 42   = NORMAL;.    B
7880: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
7890: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
78a0: 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76  S(85, 'Gorbachev
78b0: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
78c0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
78d0: 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27 29  85, 'Gorbachev')
78e0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
78f0: 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f  }.  set ::max_jo
7900: 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72 20 32 36  urnal.} [expr 26
7910: 31 35 2b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  15+[string lengt
7920: 68 20 5b 70 77 64 5d 5d 5d 0a 64 6f 5f 74 65 73  h [pwd]]].do_tes
7930: 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 32 20 7b  t pager1-5.4.2 {
7940: 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75  .  set ::max_jou
7950: 72 6e 61 6c 20 30 0a 20 20 65 78 65 63 73 71 6c  rnal 0.  execsql
7960: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79   {.    PRAGMA sy
7970: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c  nchronous = full
7980: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
7990: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
79a0: 31 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e  1 WHERE b = 'Len
79b0: 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  in';.      DELET
79c0: 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  E FROM t2 WHERE 
79d0: 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20  b = 'Lenin';.   
79e0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 73   COMMIT;.  }.  s
79f0: 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  et ::max_journal
7a00: 0a 7d 20 5b 65 78 70 72 20 33 31 31 31 2b 5b 73  .} [expr 3111+[s
7a10: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 70 77  tring length [pw
7a20: 64 5d 5d 5d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  d]]].db close.tv
7a30: 20 64 65 6c 65 74 65 0a 0a 64 6f 5f 74 65 73 74   delete..do_test
7a40: 20 70 61 67 65 72 31 2d 35 2e 35 2e 31 20 7b 0a   pager1-5.5.1 {.
7a50: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
7a60: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
7a70: 20 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65   .    ATTACH 'te
7a80: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a  st.db2' AS aux;.
7a90: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7aa0: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
7ab0: 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  T;.    CREATE TA
7ac0: 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20  BLE t3(a, b);.  
7ad0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
7ae0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
7af0: 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
7b00: 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
7b10: 74 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74  t1;.    UPDATE t
7b20: 33 20 53 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d  3 SET b = random
7b30: 62 6c 6f 62 28 31 35 30 30 29 3b 0a 20 20 7d 0a  blob(1500);.  }.
7b40: 20 20 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a    expr [file siz
7b50: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
7b60: 6c 5d 20 3e 20 31 35 30 30 30 0a 7d 20 7b 31 7d  l] > 15000.} {1}
7b70: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7b80: 35 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  5.5.2 {.  execsq
7b90: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73  l {.    PRAGMA s
7ba0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c  ynchronous = ful
7bb0: 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  l;.    BEGIN;.  
7bc0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
7bd0: 74 31 20 57 48 45 52 45 20 62 20 3d 20 27 53 74  t1 WHERE b = 'St
7be0: 61 6c 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c  alin';.      DEL
7bf0: 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52  ETE FROM t2 WHER
7c00: 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a  E b = 'Stalin';.
7c10: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
7c20: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
7c30: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30  .db-journal.} {0
7c40: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
7c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
7c90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
7ca0: 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22  ests work with "
7cb0: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
7cc0: 63 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74 65 73 74  count".#.do_test
7cd0: 20 70 61 67 65 72 31 2d 36 2e 31 20 7b 0a 20 20   pager1-6.1 {.  
7ce0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
7cf0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
7d00: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
7d10: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
7d20: 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41  none;.    PRAGMA
7d30: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
7d40: 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45  = 10;.    CREATE
7d50: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
7d60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7d70: 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t3(a, b);.    
7d80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
7d90: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
7da0: 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29  E TABLE t5(a, b)
7db0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7dc0: 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20  LE t6(a, b);.   
7dd0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
7de0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
7df0: 54 45 20 54 41 42 4c 45 20 74 38 28 61 2c 20 62  TE TABLE t8(a, b
7e00: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
7e10: 42 4c 45 20 74 39 28 61 2c 20 62 29 3b 0a 20 20  BLE t9(a, b);.  
7e20: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7e30: 31 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20  10(a, b);.  }.} 
7e40: 7b 31 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  {10}.do_catchsql
7e50: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 32  _test pager1-6.2
7e60: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
7e70: 45 20 74 31 31 28 61 2c 20 62 29 0a 7d 20 7b 31  E t11(a, b).} {1
7e80: 20 7b 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   {database or di
7e90: 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 64 6f 5f  sk is full}}.do_
7ea0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
7eb0: 65 72 31 2d 36 2e 34 20 7b 20 50 52 41 47 4d 41  er1-6.4 { PRAGMA
7ec0: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
7ed0: 20 20 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65       } {10}.do_e
7ee0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
7ef0: 72 31 2d 36 2e 35 20 7b 20 50 52 41 47 4d 41 20  r1-6.5 { PRAGMA 
7f00: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d  max_page_count =
7f10: 20 31 35 20 7d 20 7b 31 35 7d 0a 64 6f 5f 65 78   15 } {15}.do_ex
7f20: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
7f30: 31 2d 36 2e 36 20 7b 20 43 52 45 41 54 45 20 54  1-6.6 { CREATE T
7f40: 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29 20 20  ABLE t11(a, b)  
7f50: 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73     } {}.do_execs
7f60: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  ql_test pager1-6
7f70: 2e 37 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  .7 {.  BEGIN;.  
7f80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7f90: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
7fa0: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70      PRAGMA max_p
7fb0: 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 33 3b 0a  age_count = 13;.
7fc0: 7d 20 7b 31 33 7d 0a 64 6f 5f 65 78 65 63 73 71  } {13}.do_execsq
7fd0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
7fe0: 38 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  8 {.    INSERT I
7ff0: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 33  NTO t11 VALUES(3
8000: 2c 20 34 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  , 4);.    PRAGMA
8010: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8020: 3d 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a 64 6f 5f  = 10;.} {11}.do_
8030: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
8040: 65 72 31 2d 36 2e 39 20 7b 20 43 4f 4d 4d 49 54  er1-6.9 { COMMIT
8050: 20 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   } {}..do_execsq
8060: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
8070: 31 30 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f  10 { PRAGMA max_
8080: 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 20  page_count = 10 
8090: 7d 20 7b 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71  } {10}.do_execsq
80a0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
80b0: 31 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  11 { SELECT * FR
80c0: 4f 4d 20 74 31 31 20 7d 20 20 20 20 20 20 20 20  OM t11 }        
80d0: 20 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 65    {1 2 3 4}.do_e
80e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
80f0: 72 31 2d 36 2e 31 32 20 7b 20 50 52 41 47 4d 41  r1-6.12 { PRAGMA
8100: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8110: 7d 20 20 20 20 20 20 7b 31 31 7d 0a 0a 0a 23 2d  }      {11}...#-
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
8170: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77  ollowing tests w
8180: 6f 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41  ork with "PRAGMA
8190: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52   journal_mode=TR
81a0: 55 4e 43 41 54 45 22 20 61 6e 64 0a 23 20 22 50  UNCATE" and.# "P
81b0: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
81c0: 64 65 3d 45 58 43 4c 55 53 49 56 45 22 2e 0a 23  de=EXCLUSIVE"..#
81d0: 0a 23 20 45 61 63 68 20 74 65 73 74 20 69 73 20  .# Each test is 
81e0: 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20 35  specified with 5
81f0: 20 76 61 72 69 61 62 6c 65 73 2e 20 41 73 20 66   variables. As f
8200: 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 24 74  ollows:.#.#   $t
8210: 6e 3a 20 20 54 65 73 74 20 4e 75 6d 62 65 72 2e  n:  Test Number.
8220: 20 55 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   Used as part of
8230: 20 74 68 65 20 5b 64 6f 5f 74 65 73 74 5d 20 74   the [do_test] t
8240: 65 73 74 20 6e 61 6d 65 73 2e 0a 23 20 20 20 24  est names..#   $
8250: 73 71 6c 3a 20 53 51 4c 20 74 6f 20 65 78 65 63  sql: SQL to exec
8260: 75 74 65 2e 0a 23 20 20 20 24 72 65 73 3a 20 45  ute..#   $res: E
8270: 78 70 65 63 74 65 64 20 72 65 73 75 6c 74 20 6f  xpected result o
8280: 66 20 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c  f executing $sql
8290: 2e 0a 23 20 20 20 24 6a 73 3a 20 20 54 68 65 20  ..#   $js:  The 
82a0: 65 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66  expected size of
82b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
82c0: 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74  e, in bytes, aft
82d0: 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20  er executing.#  
82e0: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73         the SQL s
82f0: 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20  cript. Or -1 if 
8300: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
8310: 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65  ot expected to e
8320: 78 69 73 74 2e 0a 23 20 20 20 24 77 73 3a 20 20  xist..#   $ws:  
8330: 54 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a  The expected siz
8340: 65 20 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c  e of the WAL fil
8350: 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74  e, in bytes, aft
8360: 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20  er executing.#  
8370: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73         the SQL s
8380: 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20  cript. Or -1 if 
8390: 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 65  the WAL is not e
83a0: 78 70 65 63 74 65 64 20 74 6f 20 65 78 69 73 74  xpected to exist
83b0: 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61  ..#.ifcapable wa
83c0: 6c 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  l {.  faultsim_d
83d0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
83e0: 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  .  foreach {tn s
83f0: 71 6c 20 72 65 73 20 6a 73 20 77 73 7d 20 5b 73  ql res js ws} [s
8400: 75 62 73 74 20 7b 0a 20 20 0a 20 20 20 20 31 20  ubst {.  .    1 
8410: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
8420: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
8430: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 74        PRAGMA aut
8440: 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a 20 20  o_vacuum=OFF;.  
8450: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
8460: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
8470: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
8480: 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20 20 20  _size=1024;.    
8490: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
84a0: 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b  _mode=EXCLUSIVE;
84b0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
84c0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43  urnal_mode=TRUNC
84d0: 41 54 45 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ATE;.      INSER
84e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
84f0: 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 20 7b 65  (1, 2);.    } {e
8500: 78 63 6c 75 73 69 76 65 20 74 72 75 6e 63 61 74  xclusive truncat
8510: 65 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 32  e} 0 -1.  .    2
8520: 20 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 20    {.      BEGIN 
8530: 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20 20 20 20  IMMEDIATE;.     
8540: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
8550: 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49   t1;.      COMMI
8560: 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d 20 30  T;.    } {1 2} 0
8570: 20 2d 31 0a 20 20 0a 20 20 20 20 33 20 20 7b 0a   -1.  .    3  {.
8580: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
8590: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
85a0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d  OM t1;.      COM
85b0: 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d  MIT;.    } {1 2}
85c0: 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 34 20 20   0 -1.  .    4  
85d0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
85e0: 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20 20 20  _mode = WAL }   
85f0: 20 77 61 6c 20 20 20 20 2d 31 20 2d 31 0a 20 20   wal    -1 -1.  
8600: 20 20 35 20 20 7b 20 49 4e 53 45 52 54 20 49 4e    5  { INSERT IN
8610: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
8620: 34 29 20 7d 20 20 7b 7d 20 20 20 20 20 2d 31 20  4) }  {}     -1 
8630: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31  [wal_file_size 1
8640: 20 31 30 32 34 5d 0a 20 20 20 20 36 20 20 7b 20   1024].    6  { 
8650: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
8660: 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20 6e  ode = NORMAL } n
8670: 6f 72 6d 61 6c 20 2d 31 20 5b 77 61 6c 5f 66 69  ormal -1 [wal_fi
8680: 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a  le_size 1 1024].
8690: 20 20 20 20 37 20 20 7b 20 49 4e 53 45 52 54 20      7  { INSERT 
86a0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35  INTO t1 VALUES(5
86b0: 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20 20 2d  , 6); } {}     -
86c0: 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  1 [wal_file_size
86d0: 20 32 20 31 30 32 34 5d 0a 20 20 0a 20 20 20 20   2 1024].  .    
86e0: 38 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  8  { PRAGMA jour
86f0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43  nal_mode = TRUNC
8700: 41 54 45 20 7d 20 74 72 75 6e 63 61 74 65 20 20  ATE } truncate  
8710: 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20 20          0 -1.   
8720: 20 39 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54   9  { INSERT INT
8730: 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38  O t1 VALUES(7, 8
8740: 29 20 7d 20 20 20 20 7b 7d 20 20 20 20 20 20 20  ) }    {}       
8750: 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20           0 -1.  
8760: 20 20 31 30 20 7b 20 53 45 4c 45 43 54 20 2a 20    10 { SELECT * 
8770: 46 52 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20  FROM t1 }       
8780: 20 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34          {1 2 3 4
8790: 20 35 20 36 20 37 20 38 7d 20 30 20 2d 31 0a 20   5 6 7 8} 0 -1. 
87a0: 20 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 64 6f 5f   .  }] {.    do_
87b0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
87c0: 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20 24 73  er1-7.1.$tn.1 $s
87d0: 71 6c 20 24 72 65 73 0a 20 20 20 20 63 61 74 63  ql $res.    catc
87e0: 68 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b 20 73  h { set J -1 ; s
87f0: 65 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a 65 20  et J [file size 
8800: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d  test.db-journal]
8810: 20 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73   }.    catch { s
8820: 65 74 20 57 20 2d 31 20 3b 20 73 65 74 20 57 20  et W -1 ; set W 
8830: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
8840: 64 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20 64 6f  db-wal] }.    do
8850: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 31  _test pager1-7.1
8860: 2e 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20 24 4a  .$tn.2 { list $J
8870: 20 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a 73 20   $W } [list $js 
8880: 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74  $ws].  }.}..do_t
8890: 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 31  est pager1-7.2.1
88a0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
88b0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
88c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
88d0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
88e0: 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 3b  ode = EXCLUSIVE;
88f0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8900: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
8910: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 52 41  BEGIN;.      PRA
8920: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8930: 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 20   = delete;.     
8940: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
8950: 6d 6f 64 65 20 3d 20 74 72 75 6e 63 61 74 65 3b  mode = truncate;
8960: 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  .  }.} {exclusiv
8970: 65 20 64 65 6c 65 74 65 20 74 72 75 6e 63 61 74  e delete truncat
8980: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
8990: 31 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63  1-7.2.2 {.  exec
89a0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
89b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
89c0: 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ) }.  execsql { 
89d0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
89e0: 6f 64 65 20 3d 20 70 65 72 73 69 73 74 20 7d 0a  ode = persist }.
89f0: 7d 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64 6f 5f  } {truncate}.do_
8a00: 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e  test pager1-7.2.
8a10: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
8a20: 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65 63 73  COMMIT }.  execs
8a30: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
8a40: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70  journal_mode = p
8a50: 65 72 73 69 73 74 3b 0a 20 20 20 20 50 52 41 47  ersist;.    PRAG
8a60: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  MA journal_size_
8a70: 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b 70 65  limit;.  }.} {pe
8a80: 72 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d  rsist -1}..#----
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ad0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
8ae0: 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 70 61 67  owing tests, pag
8af0: 65 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20 74 68  er1-8.*, test th
8b00: 61 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 66  at the special f
8b10: 69 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a 6d 65  ilenames .# ":me
8b20: 6d 6f 72 79 3a 22 20 61 6e 64 20 22 22 20 6f 70  mory:" and "" op
8b30: 65 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  en temporary dat
8b40: 61 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65 61 63  abases..#.foreac
8b50: 68 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65 7d 20  h {tn filename} 
8b60: 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a 0a 20  {.  1 :memory:. 
8b70: 20 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74   2 "".} {.  do_t
8b80: 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e  est pager1-8.$tn
8b90: 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  .1 {.    faultsi
8ba0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
8bb0: 70 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f 73 65  pen.    db close
8bc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
8bd0: 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 65 78  $filename.    ex
8be0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
8bf0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
8c00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 43 52 45 41   = 1;.      CREA
8c10: 54 45 20 54 41 42 4c 45 20 78 31 28 78 29 3b 0a  TE TABLE x1(x);.
8c20: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
8c30: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 43 68 61  O x1 VALUES('Cha
8c40: 72 6c 65 73 27 29 3b 0a 20 20 20 20 20 20 49 4e  rles');.      IN
8c50: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
8c60: 55 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a 20 20  UES('James');.  
8c70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8c80: 78 31 20 56 41 4c 55 45 53 28 27 4d 61 72 79 27  x1 VALUES('Mary'
8c90: 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  );.      SELECT 
8ca0: 2a 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 7d  * FROM x1;.    }
8cb0: 0a 20 20 7d 20 7b 43 68 61 72 6c 65 73 20 4a 61  .  } {Charles Ja
8cc0: 6d 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64 6f 5f  mes Mary}..  do_
8cd0: 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74  test pager1-8.$t
8ce0: 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  n.2 {.    sqlite
8cf0: 33 20 64 62 32 20 24 66 69 6c 65 6e 61 6d 65 0a  3 db2 $filename.
8d00: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53      catchsql { S
8d10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20  ELECT * FROM x1 
8d20: 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 6e 6f  } db2.  } {1 {no
8d30: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 78 31 7d   such table: x1}
8d40: 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  }..  do_execsql_
8d50: 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74  test pager1-8.$t
8d60: 6e 2e 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  n.3 {.    BEGIN;
8d70: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
8d80: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 57 69  TO x1 VALUES('Wi
8d90: 6c 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20 20 49  lliam');.      I
8da0: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41  NSERT INTO x1 VA
8db0: 4c 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a 20 20  LUES('Anne');.  
8dc0: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20    ROLLBACK;.  } 
8dd0: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
8de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 0a 23 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  .# The next bloc
8e30: 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 70 61 67  k of tests - pag
8e40: 65 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c 20 77  er1-9.* - deal w
8e50: 69 74 68 20 69 6e 74 65 72 61 63 74 69 6f 6e 73  ith interactions
8e60: 20 62 65 74 77 65 65 6e 0a 23 20 74 68 65 20 70   between.# the p
8e70: 61 67 65 72 20 61 6e 64 20 74 68 65 20 62 61 63  ager and the bac
8e80: 6b 75 70 20 41 50 49 2e 20 54 65 73 74 20 63 61  kup API. Test ca
8e90: 73 65 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72  ses:.#.#   pager
8ea0: 31 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68  1-9.1.*: Test th
8eb0: 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70  at a backup comp
8ec0: 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c  letes successful
8ed0: 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23  ly even if the.#
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ef0: 20 73 6f 75 72 63 65 20 64 62 20 69 73 20 77 72   source db is wr
8f00: 69 74 74 65 6e 20 74 6f 20 64 75 72 69 6e 67 20  itten to during 
8f10: 74 68 65 20 62 61 63 6b 75 70 20 6f 70 2e 0a 23  the backup op..#
8f20: 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e 32 2e  .#   pager1-9.2.
8f30: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61 20 62  *: Test that a b
8f40: 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65 73 20  ackup completes 
8f50: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65 76 65  successfully eve
8f60: 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20  n if the.#      
8f70: 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63             sourc
8f80: 65 20 64 62 20 69 73 20 77 72 69 74 74 65 6e 20  e db is written 
8f90: 74 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f 6c 6c  to and then roll
8fa0: 65 64 20 62 61 63 6b 20 64 75 72 69 6e 67 20 61  ed back during a
8fb0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
8fc0: 20 20 20 20 62 61 63 6b 75 70 20 6f 70 65 72 61      backup opera
8fd0: 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  tion..#.do_test 
8fe0: 70 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b 0a 20  pager1-9.0.1 {. 
8ff0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
9000: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62  _and_reopen.  db
9010: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
9020: 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
9030: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
9040: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
9050: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
9060: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
9070: 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c  (a, b, UNIQUE(a,
9080: 20 62 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45   b));.      INSE
9090: 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45  RT INTO ab VALUE
90a0: 53 28 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  S( a_string(200)
90b0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
90c0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
90d0: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
90e0: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
90f0: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
9100: 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   ab;.      INSER
9110: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
9120: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
9130: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
9140: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
9150: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
9160: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
9170: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
9180: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
9190: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
91a0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
91b0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
91c0: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
91d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
91e0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
91f0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9200: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
9210: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
9220: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
9230: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
9240: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
9250: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9260: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
9270: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
9280: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
9290: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
92a0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
92b0: 67 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20 20 73  ger1-9.0.2 {.  s
92c0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
92d0: 64 62 32 0a 20 20 64 62 32 20 65 76 61 6c 20 7b  db2.  db2 eval {
92e0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
92f0: 7a 65 20 3d 20 31 30 20 7d 0a 20 20 73 71 6c 69  ze = 10 }.  sqli
9300: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
9310: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
9320: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
9330: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
9340: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
9350: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9360: 20 70 61 67 65 72 31 2d 39 2e 30 2e 33 20 7b 0a   pager1-9.0.3 {.
9370: 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20   db one {SELECT 
9380: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9390: 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65  M ab}.} [db2 one
93a0: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
93b0: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a  a, b) FROM ab}].
93c0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
93d0: 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  9.1.1 {.  execsq
93e0: 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45  l { UPDATE ab SE
93f0: 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32  T a = a_string(2
9400: 30 31 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  01) }.  sqlite3_
9410: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
9420: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74  n db main.  B st
9430: 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f  ep 30.} {SQLITE_
9440: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9450: 72 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65 78 65  r1-9.1.2 {.  exe
9460: 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62  csql { UPDATE ab
9470: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
9480: 67 28 33 30 31 29 20 7d 0a 20 20 6c 69 73 74 20  g(301) }.  list 
9490: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
94a0: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
94b0: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
94c0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
94d0: 72 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62 20 6f  r1-9.1.3 {. db o
94e0: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
94f0: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
9500: 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c  .} [db2 one {SEL
9510: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
9520: 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65   FROM ab}].do_te
9530: 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 34 20  st pager1-9.1.4 
9540: 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45  { execsql { SELE
9550: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
9560: 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 0a 64   ab } } {128}..d
9570: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9580: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
9590: 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20  { UPDATE ab SET 
95a0: 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 32  a = a_string(202
95b0: 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  ) }.  sqlite3_ba
95c0: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
95d0: 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70  db main.  B step
95e0: 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   30.} {SQLITE_OK
95f0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
9600: 2d 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  -9.2.2 {.  execs
9610: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
9620: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 61 62  .      UPDATE ab
9630: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
9640: 67 28 33 30 31 29 3b 0a 20 20 20 20 52 4f 4c 4c  g(301);.    ROLL
9650: 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69 73 74  BACK;.  }.  list
9660: 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20   [B step 10000] 
9670: 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51  [B finish].} {SQ
9680: 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45  LITE_DONE SQLITE
9690: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  _OK}.do_test pag
96a0: 65 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64 62 20  er1-9.2.3 {. db 
96b0: 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73  one {SELECT md5s
96c0: 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62  um(a, b) FROM ab
96d0: 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45  }.} [db2 one {SE
96e0: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
96f0: 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74  ) FROM ab}].do_t
9700: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 34  est pager1-9.2.4
9710: 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c   { execsql { SEL
9720: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
9730: 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 64  M ab } } {128}.d
9740: 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73  b close.db2 clos
9750: 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e..do_test pager
9760: 31 2d 39 2e 33 2e 31 20 7b 0a 20 20 74 65 73 74  1-9.3.1 {.  test
9770: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
9780: 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  1.  tv sectorsiz
9790: 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69  e 4096.  faultsi
97a0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
97b0: 70 65 6e 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b  pen..  execsql {
97c0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
97d0: 65 20 3d 20 31 30 32 34 20 7d 0a 20 20 66 6f 72  e = 1024 }.  for
97e0: 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69   {set ii 0} {$ii
97f0: 20 3c 20 34 7d 20 7b 69 6e 63 72 20 69 69 7d 20   < 4} {incr ii} 
9800: 7b 20 65 78 65 63 73 71 6c 20 22 43 52 45 41 54  { execsql "CREAT
9810: 45 20 54 41 42 4c 45 20 74 24 7b 69 69 7d 28 61  E TABLE t${ii}(a
9820: 2c 20 62 29 22 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  , b)" }.} {}.do_
9830: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e  test pager1-9.3.
9840: 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  2 {.  sqlite3 db
9850: 32 20 74 65 73 74 2e 64 62 32 0a 0a 20 20 65 78  2 test.db2..  ex
9860: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
9870: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34  MA page_size = 4
9880: 30 39 36 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  096;.    PRAGMA 
9890: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46  synchronous = OF
98a0: 46 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  F;.    CREATE TA
98b0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
98c0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
98d0: 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32  2(a, b);.  } db2
98e0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ..  sqlite3_back
98f0: 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62  up B db2 main db
9900: 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33   main.  B step 3
9910: 30 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70  0.  list [B step
9920: 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73   10000] [B finis
9930: 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e  h].} {SQLITE_DON
9940: 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f  E SQLITE_OK}.do_
9950: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e  test pager1-9.3.
9960: 33 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  3 {.  db2 close.
9970: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20    db close.  tv 
9980: 64 65 6c 65 74 65 0a 20 20 66 69 6c 65 20 73 69  delete.  file si
9990: 7a 65 20 74 65 73 74 2e 64 62 32 0a 7d 20 5b 66  ze test.db2.} [f
99a0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
99b0: 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  ]..do_test pager
99c0: 31 2d 39 2e 34 2e 31 20 7b 0a 20 20 66 61 75 6c  1-9.4.1 {.  faul
99d0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
99e0: 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33  reopen.  sqlite3
99f0: 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20   db2 test.db2.  
9a00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
9a10: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
9a20: 20 34 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54   4096;.    CREAT
9a30: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
9a40: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
9a50: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d  LE t2(a, b);.  }
9a60: 20 64 62 32 0a 20 20 73 71 6c 69 74 65 33 5f 62   db2.  sqlite3_b
9a70: 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e  ackup B db2 main
9a80: 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74 20   db main.  list 
9a90: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
9aa0: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
9ab0: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
9ac0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9ad0: 72 31 2d 39 2e 34 2e 32 20 7b 0a 20 20 6c 69 73  r1-9.4.2 {.  lis
9ae0: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
9af0: 74 2e 64 62 32 5d 20 5b 66 69 6c 65 20 73 69 7a  t.db2] [file siz
9b00: 65 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 30 20  e test.db].} {0 
9b10: 30 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23 2d  0}.db2 close..#-
9b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
9b70: 74 68 61 74 20 72 65 67 61 72 64 6c 65 73 73 20  that regardless 
9b80: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  of the value ret
9b90: 75 72 6e 65 64 20 62 79 20 78 53 65 63 74 6f 72  urned by xSector
9ba0: 53 69 7a 65 28 29 2c 20 74 68 65 0a 23 20 6d 69  Size(), the.# mi
9bb0: 6e 69 6d 75 6d 20 65 66 66 65 63 74 69 76 65 20  nimum effective 
9bc0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 35  sector-size is 5
9bd0: 31 32 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  12 and the maxim
9be0: 75 6d 20 36 35 35 33 36 20 62 79 74 65 73 2e 0a  um 65536 bytes..
9bf0: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
9c00: 66 61 75 6c 74 20 31 0a 66 6f 72 65 61 63 68 20  fault 1.foreach 
9c10: 73 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20 20  sectorsize {.   
9c20: 20 33 32 20 20 20 36 34 20 20 20 31 32 38 20 20   32   64   128  
9c30: 20 32 35 36 20 20 20 35 31 32 20 20 20 31 30 32   256   512   102
9c40: 34 20 20 20 32 30 34 38 20 0a 20 20 20 20 34 30  4   2048 .    40
9c50: 39 36 20 38 31 39 32 20 31 36 33 38 34 20 33 32  96 8192 16384 32
9c60: 37 36 38 20 36 35 35 33 36 20 31 33 31 30 37 32  768 65536 131072
9c70: 20 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74 76   262144.} {.  tv
9c80: 20 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63   sectorsize $sec
9c90: 74 6f 72 73 69 7a 65 0a 20 20 73 65 74 20 65 66  torsize.  set ef
9ca0: 66 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20  f $sectorsize.  
9cb0: 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20  if {$sectorsize 
9cc0: 3c 20 35 31 32 7d 20 20 20 7b 20 73 65 74 20 65  < 512}   { set e
9cd0: 66 66 20 35 31 32 20 7d 0a 20 20 69 66 20 7b 24  ff 512 }.  if {$
9ce0: 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35  sectorsize > 655
9cf0: 33 36 7d 20 7b 20 73 65 74 20 65 66 66 20 36 35  36} { set eff 65
9d00: 35 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  536 }..  do_test
9d10: 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74   pager1-10.$sect
9d20: 6f 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 66  orsize.1 {.    f
9d30: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
9d40: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62  nd_reopen.    db
9d50: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
9d60: 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63  _string.    exec
9d70: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
9d80: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
9d90: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20  = PERSIST;.     
9da0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
9db0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20  e = 1024;.      
9dc0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43  BEGIN;.        C
9dd0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
9de0: 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52  , b);.        CR
9df0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
9e00: 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45   b);.        CRE
9e10: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
9e20: 62 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  b);.      COMMIT
9e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65  ;.    }.    file
9e40: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
9e50: 75 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72 20  urnal.  } [expr 
9e60: 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35  $sectorsize > 65
9e70: 35 33 36 20 3f 20 36 35 35 33 36 20 3a 20 24 73  536 ? 65536 : $s
9e80: 65 63 74 6f 72 73 69 7a 65 5d 0a 0a 20 20 64 6f  ectorsize]..  do
9e90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e  _test pager1-10.
9ea0: 24 73 65 63 74 6f 72 73 69 7a 65 2e 32 20 7b 0a  $sectorsize.2 {.
9eb0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
9ec0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9ed0: 20 74 33 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t3 VALUES(a_str
9ee0: 69 6e 67 28 33 30 30 29 2c 20 61 5f 73 74 72 69  ing(300), a_stri
9ef0: 6e 67 28 33 30 30 29 29 3b 0a 20 20 20 20 20 20  ng(300));.      
9f00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
9f10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
9f20: 20 20 20 20 20 20 20 20 2f 2a 20 20 32 20 2a 2f          /*  2 */
9f30: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9f40: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46  TO t3 SELECT * F
9f50: 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f  ROM t3;        /
9f60: 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  4 */.      IN
9f70: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
9f80: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20  ECT * FROM t3;  
9f90: 20 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20        /*  8 */. 
9fa0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9fb0: 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t3 SELECT * FRO
9fc0: 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20  M t3;        /* 
9fd0: 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  16 */.      INSE
9fe0: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
9ff0: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20  T * FROM t3;    
a000: 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20      /* 32 */.   
a010: 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f   }.  } {}..  do_
a020: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
a030: 73 65 63 74 6f 72 73 69 7a 65 2e 33 20 7b 0a 20  sectorsize.3 {. 
a040: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
a050: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
a060: 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  db.    execsql {
a070: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63   .      PRAGMA c
a080: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
a090: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
a0a0: 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65   }.    recursive
a0b0: 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64  _select 32 t3 {d
a0c0: 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49  b eval "INSERT I
a0d0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
a0e0: 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71   2)"}.    execsq
a0f0: 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  l {.      COMMIT
a100: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
a110: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a   FROM t2;.    }.
a120: 20 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f    } {1 2}..  do_
a130: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
a140: 73 65 63 74 6f 72 73 69 7a 65 2e 34 20 7b 0a 20  sectorsize.4 {. 
a150: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
a160: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a170: 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t6(a, b);.      
a180: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28  CREATE TABLE t7(
a190: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  a, b);.      CRE
a1a0: 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20  ATE TABLE t5(a, 
a1b0: 62 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54  b);.      DROP T
a1c0: 41 42 4c 45 20 74 36 3b 0a 20 20 20 20 20 20 44  ABLE t6;.      D
a1d0: 52 4f 50 20 54 41 42 4c 45 20 74 37 3b 0a 20 20  ROP TABLE t7;.  
a1e0: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
a1f0: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
a200: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
a210: 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20  BLE t6(a, b);.  
a220: 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76    }.    recursiv
a230: 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b  e_select 32 t3 {
a240: 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20  db eval "INSERT 
a250: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31  INTO t5 VALUES(1
a260: 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73  , 2)"}.    execs
a270: 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49  ql {.      COMMI
a280: 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  T;.      SELECT 
a290: 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d  * FROM t5;.    }
a2a0: 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a  .  } {1 2}.  .}.
a2b0: 64 62 20 63 6c 6f 73 65 0a 0a 74 76 20 73 65 63  db close..tv sec
a2c0: 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 64 6f 5f  torsize 4096.do_
a2d0: 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78  test pager1.10.x
a2e0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
a2f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
a300: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
a310: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
a320: 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20  cuum = none;.   
a330: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
a340: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
a350: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
a360: 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74  ;.  }.  for {set
a370: 20 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20 7b 69   i 0} {$i<30} {i
a380: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65  ncr i} {.    exe
a390: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
a3a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 7a 65 72  TO t1 VALUES(zer
a3b0: 6f 62 6c 6f 62 28 39 30 30 29 29 20 7d 0a 20 20  oblob(900)) }.  
a3c0: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
a3d0: 73 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d 0a  st.db.} {32768}.
a3e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31  do_test pager1.1
a3f0: 30 2e 78 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  0.x.2 {.  execsq
a400: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
a410: 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20  ABLE t2(x);.    
a420: 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20  DROP TABLE t2;. 
a430: 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
a440: 65 73 74 2e 64 62 0a 7d 20 7b 33 33 37 39 32 7d  est.db.} {33792}
a450: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
a460: 31 30 2e 78 2e 33 20 7b 0a 20 20 65 78 65 63 73  10.x.3 {.  execs
a470: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
a480: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a490: 20 74 32 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65   t2(x);.  }.  re
a4a0: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33  cursive_select 3
a4b0: 30 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20 7b  0 t1.  execsql {
a4c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
a4d0: 45 20 74 33 28 78 29 3b 0a 20 20 20 20 43 4f 4d  E t3(x);.    COM
a4e0: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  MIT;.  }.} {}..d
a4f0: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
a500: 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64  e..testvfs tv -d
a510: 65 66 61 75 6c 74 20 31 0a 66 61 75 6c 74 73 69  efault 1.faultsi
a520: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
a530: 70 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74  pen.db func a_st
a540: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 64 6f  ring a_string.do
a550: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
a560: 67 65 72 31 2d 31 31 2e 31 20 7b 0a 20 20 50 52  ger1-11.1 {.  PR
a570: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
a580: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 50 52  e = DELETE;.  PR
a590: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
a5a0: 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  = 10;.  BEGIN;. 
a5b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a5c0: 7a 7a 28 74 6f 70 20 50 52 49 4d 41 52 59 20 4b  zz(top PRIMARY K
a5d0: 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  EY);.    INSERT 
a5e0: 49 4e 54 4f 20 7a 7a 20 56 41 4c 55 45 53 28 61  INTO zz VALUES(a
a5f0: 5f 73 74 72 69 6e 67 28 32 32 32 29 29 3b 0a 20  _string(222));. 
a600: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
a610: 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  z SELECT a_strin
a620: 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61  g((SELECT 222+ma
a630: 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a  x(rowid) FROM zz
a640: 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20  )) FROM zz;.    
a650: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53  INSERT INTO zz S
a660: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28  ELECT a_string((
a670: 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72  SELECT 222+max(r
a680: 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20  owid) FROM zz)) 
a690: 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53  FROM zz;.    INS
a6a0: 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45  ERT INTO zz SELE
a6b0: 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c  CT a_string((SEL
a6c0: 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69  ECT 222+max(rowi
a6d0: 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f  d) FROM zz)) FRO
a6e0: 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54  M zz;.    INSERT
a6f0: 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20   INTO zz SELECT 
a700: 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54  a_string((SELECT
a710: 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20   222+max(rowid) 
a720: 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a  FROM zz)) FROM z
a730: 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  z;.    INSERT IN
a740: 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73  TO zz SELECT a_s
a750: 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32  tring((SELECT 22
a760: 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f  2+max(rowid) FRO
a770: 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a  M zz)) FROM zz;.
a780: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 42 45 47 49    COMMIT;.  BEGI
a790: 4e 3b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 7a  N;.    UPDATE zz
a7a0: 20 53 45 54 20 74 6f 70 20 3d 20 61 5f 73 74 72   SET top = a_str
a7b0: 69 6e 67 28 33 34 35 29 3b 0a 7d 20 7b 64 65 6c  ing(345);.} {del
a7c0: 65 74 65 7d 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f  ete}..proc locko
a7d0: 75 74 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d  ut {method args}
a7e0: 20 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   { return SQLITE
a7f0: 5f 49 4f 45 52 52 20 7d 0a 74 76 20 73 63 72 69  _IOERR }.tv scri
a800: 70 74 20 6c 6f 63 6b 6f 75 74 0a 74 76 20 66 69  pt lockout.tv fi
a810: 6c 74 65 72 20 7b 78 57 72 69 74 65 20 78 54 72  lter {xWrite xTr
a820: 75 6e 63 61 74 65 20 78 53 79 6e 63 7d 0a 64 6f  uncate xSync}.do
a830: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
a840: 61 67 65 72 31 2d 31 31 2e 32 20 7b 20 43 4f 4d  ager1-11.2 { COM
a850: 4d 49 54 20 7d 20 7b 31 20 7b 64 69 73 6b 20 49  MIT } {1 {disk I
a860: 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a 74 76 20 73  /O error}}..tv s
a870: 63 72 69 70 74 20 7b 7d 0a 64 6f 5f 74 65 73 74  cript {}.do_test
a880: 20 70 61 67 65 72 31 2d 31 31 2e 33 20 7b 0a 20   pager1-11.3 {. 
a890: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
a8a0: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
a8b0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
a8c0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43  nal_mode = TRUNC
a8d0: 41 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ATE;.    PRAGMA 
a8e0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
a8f0: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 74 72 75 6e  .  } db2.} {trun
a900: 63 61 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74  cate ok}.do_test
a910: 20 70 61 67 65 72 31 2d 31 31 2e 34 20 7b 0a 20   pager1-11.4 {. 
a920: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c   db2 close.  fil
a930: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
a940: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
a950: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
a960: 61 67 65 72 31 2d 31 31 2e 35 20 7b 20 53 45 4c  ager1-11.5 { SEL
a970: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
a980: 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62 20 63  M zz } {32}.db c
a990: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 20  lose.tv delete. 
a9a0: 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   .#-------------
a9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
a9f0: 65 73 74 20 22 50 52 41 47 4d 41 20 70 61 67 65  est "PRAGMA page
aa00: 5f 73 69 7a 65 22 0a 23 0a 74 65 73 74 76 66 73  _size".#.testvfs
aa10: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74   tv -default 1.t
aa20: 76 20 73 65 63 74 6f 72 73 69 7a 65 20 31 30 32  v sectorsize 102
aa30: 34 0a 66 6f 72 65 61 63 68 20 70 61 67 65 73 69  4.foreach pagesi
aa40: 7a 65 20 7b 0a 20 20 20 20 35 31 32 20 20 20 31  ze {.    512   1
aa50: 30 32 34 20 20 20 32 30 34 38 20 34 30 39 36 20  024   2048 4096 
aa60: 38 31 39 32 20 31 36 33 38 34 20 33 32 37 36 38  8192 16384 32768
aa70: 20 0a 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d   .} {.  faultsim
aa80: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
aa90: 65 6e 0a 0a 20 20 23 20 54 68 65 20 73 65 63 74  en..  # The sect
aaa0: 6f 72 2d 73 69 7a 65 20 28 61 63 63 6f 72 64 69  or-size (accordi
aab0: 6e 67 20 74 6f 20 74 68 65 20 56 46 53 29 20 69  ng to the VFS) i
aac0: 73 20 31 30 32 34 20 62 79 74 65 73 2e 20 53 6f  s 1024 bytes. So
aad0: 20 69 66 20 74 68 65 0a 20 20 23 20 70 61 67 65   if the.  # page
aae0: 2d 73 69 7a 65 20 72 65 71 75 65 73 74 65 64 20  -size requested 
aaf0: 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 70 61  using "PRAGMA pa
ab00: 67 65 5f 73 69 7a 65 22 20 69 73 20 67 72 65 61  ge_size" is grea
ab10: 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 23  ter than the.  #
ab20: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
ab30: 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 4d 41  lue of SQLITE_MA
ab40: 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 74 68 65  X_PAGE_SIZE, the
ab50: 6e 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  n the effective 
ab60: 0a 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72  .  # page-size r
ab70: 65 6d 61 69 6e 73 20 31 30 32 34 20 62 79 74 65  emains 1024 byte
ab80: 73 2e 0a 20 20 23 0a 20 20 73 65 74 20 65 66 66  s..  #.  set eff
ab90: 20 24 70 61 67 65 73 69 7a 65 0a 20 20 69 66 20   $pagesize.  if 
aba0: 7b 24 65 66 66 20 3e 20 24 3a 3a 53 51 4c 49 54  {$eff > $::SQLIT
abb0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 7d  E_MAX_PAGE_SIZE}
abc0: 20 7b 20 73 65 74 20 65 66 66 20 31 30 32 34 20   { set eff 1024 
abd0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
abe0: 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65  er1-12.$pagesize
abf0: 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .1 {.    sqlite3
ac00: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20   db2 test.db.   
ac10: 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20   execsql ".     
ac20: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
ac30: 65 20 3d 20 24 70 61 67 65 73 69 7a 65 3b 0a 20  e = $pagesize;. 
ac40: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
ac50: 20 76 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46   v AS SELECT * F
ac60: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
ac70: 72 3b 0a 20 20 20 20 22 20 64 62 32 0a 20 20 20  r;.    " db2.   
ac80: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
ac90: 64 62 0a 20 20 7d 20 24 65 66 66 0a 20 20 64 6f  db.  } $eff.  do
aca0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e  _test pager1-12.
acb0: 24 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20  $pagesize.2 {.  
acc0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
acd0: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
ace0: 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43  l { .      SELEC
acf0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
ad00: 76 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  v;.      PRAGMA 
ad10: 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a  main.page_size;.
ad20: 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c      } db2.  } [l
ad30: 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20 64 6f  ist 1 $eff].  do
ad40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e  _test pager1-12.
ad50: 24 70 61 67 65 73 69 7a 65 2e 33 20 7b 0a 20 20  $pagesize.3 {.  
ad60: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
ad70: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
ad80: 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20  *) FROM v;.     
ad90: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67   PRAGMA main.pag
ada0: 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  e_size;.    }.  
adb0: 7d 20 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a  } [list 1 $eff].
adc0: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 64 62    db2 close.}.db
add0: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
ade0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
adf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
ae30: 65 73 74 20 73 70 65 63 61 6c 20 22 50 52 41 47  est specal "PRAG
ae40: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
ae50: 50 45 52 53 49 53 54 22 20 74 65 73 74 20 63 61  PERSIST" test ca
ae60: 73 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  ses..#.# pager1-
ae70: 31 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73  13.1.*: This tes
ae80: 74 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  ts a special cas
ae90: 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  e encountered in
aea0: 20 70 65 72 73 69 73 74 65 6e 74 20 0a 23 20 20   persistent .#  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
aec0: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 49 66 20 74  urnal mode: If t
aed0: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63  he journal assoc
aee0: 69 61 74 65 64 20 77 69 74 68 20 61 20 74 72 61  iated with a tra
aef0: 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20  nsaction.#      
af00: 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
af10: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6a 6f  ller than the jo
af20: 75 72 6e 61 6c 20 66 69 6c 65 20 28 62 65 63 61  urnal file (beca
af30: 75 73 65 20 61 20 70 72 65 76 69 6f 75 73 20 0a  use a previous .
af40: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
af50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65 66   transaction lef
af60: 74 20 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e  t a very large n
af70: 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66  on-hot journal f
af80: 69 6c 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20  ile in the.#    
af90: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
afa0: 2d 73 79 73 74 65 6d 29 2c 20 74 68 65 6e 20 53  -system), then S
afb0: 51 4c 69 74 65 20 68 61 73 20 74 6f 20 62 65 20  QLite has to be 
afc0: 63 61 72 65 66 75 6c 20 74 68 61 74 20 74 68 65  careful that the
afd0: 72 65 20 69 73 0a 23 20 20 20 20 20 20 20 20 20  re is.#         
afe0: 20 20 20 20 20 20 20 6e 6f 74 20 61 20 6a 6f 75         not a jou
aff0: 72 6e 61 6c 2d 68 65 61 64 65 72 20 6c 65 66 74  rnal-header left
b000: 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 65   over from a pre
b010: 76 69 6f 75 73 20 74 72 61 6e 73 61 63 74 69 6f  vious transactio
b020: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
b030: 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66     immediately f
b040: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6a 6f 75  ollowing the jou
b050: 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6a 75 73  rnal content jus
b060: 74 20 77 72 69 74 74 65 6e 2e 0a 23 20 20 20 20  t written..#    
b070: 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 74              If t
b080: 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 65  here is, and the
b090: 20 70 72 6f 63 65 73 73 20 63 72 61 73 68 65 73   process crashes
b0a0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a 6f 75   so that the jou
b0b0: 72 6e 61 6c 0a 23 20 20 20 20 20 20 20 20 20 20  rnal.#          
b0c0: 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20 61 20        becomes a 
b0d0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
b0e0: 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
b0f0: 61 63 6b 20 62 79 20 61 6e 6f 74 68 65 72 0a 23  ack by another.#
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 70 72 6f 63 65 73 73 2c 20 74 68 65 72 65 20 69  process, there i
b120: 73 20 61 20 64 61 6e 67 65 72 20 74 68 61 74 20  s a danger that 
b130: 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  the other proces
b140: 73 20 6d 61 79 20 72 6f 6c 6c 0a 23 20 20 20 20  s may roll.#    
b150: 20 20 20 20 20 20 20 20 20 20 20 20 62 61 63 6b              back
b160: 20 74 68 65 20 61 62 6f 72 74 65 64 20 74 72 61   the aborted tra
b170: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63  nsaction, then c
b180: 6f 6e 74 69 6e 75 65 20 63 6f 70 79 69 6e 67 20  ontinue copying 
b190: 64 61 74 61 0a 23 20 20 20 20 20 20 20 20 20 20  data.#          
b1a0: 20 20 20 20 20 20 66 72 6f 6d 20 61 6e 20 6f 6c        from an ol
b1b0: 64 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  der transaction 
b1c0: 66 72 6f 6d 20 74 68 65 20 72 65 6d 61 69 6e 64  from the remaind
b1d0: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
b1e0: 6c 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  l..#            
b1f0: 20 20 20 20 53 65 65 20 74 68 65 20 73 79 6e 63      See the sync
b200: 4a 6f 75 72 6e 61 6c 28 29 20 66 75 6e 63 74 69  Journal() functi
b210: 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  on for details..
b220: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  #.# pager1-13.2.
b230: 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20  *: Same test as 
b240: 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 54 68  the previous. Th
b250: 69 73 20 74 69 6d 65 2c 20 74 68 72 6f 77 20 61  is time, throw a
b260: 6e 20 69 6e 64 65 78 20 69 6e 74 6f 0a 23 20 20  n index into.#  
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
b280: 65 20 6d 69 78 20 74 6f 20 6d 61 6b 65 20 74 68  e mix to make th
b290: 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
b2a0: 6b 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f  k more likely to
b2b0: 20 63 61 74 63 68 0a 23 20 20 20 20 20 20 20 20   catch.#        
b2c0: 20 20 20 20 20 20 20 20 65 72 72 6f 72 73 2e 0a          errors..
b2d0: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
b2e0: 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70  fault 1.tv scrip
b2f0: 74 20 78 53 79 6e 63 43 62 0a 74 76 20 66 69 6c  t xSyncCb.tv fil
b300: 74 65 72 20 78 53 79 6e 63 0a 70 72 6f 63 20 78  ter xSync.proc x
b310: 53 79 6e 63 43 62 20 7b 6d 65 74 68 6f 64 20 66  SyncCb {method f
b320: 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a  ilename args} {.
b330: 20 20 73 65 74 20 74 20 5b 66 69 6c 65 20 74 61    set t [file ta
b340: 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20  il $filename].  
b350: 69 66 20 7b 24 74 20 3d 3d 20 22 74 65 73 74 2e  if {$t == "test.
b360: 64 62 22 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61  db"} faultsim_sa
b370: 76 65 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ve.  return SQLI
b380: 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d  TE_OK.}.faultsim
b390: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
b3a0: 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72  en.db func a_str
b3b0: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 23 20  ing a_string..# 
b3c0: 54 68 65 20 55 50 44 41 54 45 20 73 74 61 74 65  The UPDATE state
b3d0: 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  ment at the end 
b3e0: 6f 66 20 74 68 69 73 20 74 65 73 74 20 63 61 73  of this test cas
b3f0: 65 20 63 72 65 61 74 65 73 20 61 20 72 65 61 6c  e creates a real
b400: 6c 79 20 62 69 67 0a 23 20 6a 6f 75 72 6e 61 6c  ly big.# journal
b410: 2e 20 53 69 6e 63 65 20 74 68 65 20 63 61 63 68  . Since the cach
b420: 65 2d 73 69 7a 65 20 69 73 20 6f 6e 6c 79 20 31  e-size is only 1
b430: 30 20 70 61 67 65 73 2c 20 74 68 65 20 6a 6f 75  0 pages, the jou
b440: 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 0a 23  rnal contains .#
b450: 20 66 72 65 71 75 65 6e 74 20 6a 6f 75 72 6e 61   frequent journa
b460: 6c 20 68 65 61 64 65 72 73 2e 0a 23 0a 64 6f 5f  l headers..#.do_
b470: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
b480: 65 72 31 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 50  er1-13.1.1 {.  P
b490: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
b4a0: 3d 20 31 30 32 34 3b 0a 20 20 50 52 41 47 4d 41  = 1024;.  PRAGMA
b4b0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
b4c0: 50 45 52 53 49 53 54 3b 0a 20 20 50 52 41 47 4d  PERSIST;.  PRAGM
b4d0: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
b4e0: 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  0;.  BEGIN;.    
b4f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
b500: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
b510: 59 20 4b 45 59 2c 20 62 20 42 4c 4f 42 29 3b 0a  Y KEY, b BLOB);.
b520: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b530: 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  t1 VALUES(NULL, 
b540: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 29 3b 0a  a_string(400));.
b550: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b560: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
b570: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
b580: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
b590: 2f 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 49 4e  /*   2 */.    IN
b5a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
b5b0: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
b5c0: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
b5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34            /*   4
b5e0: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
b5f0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
b600: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
b610: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
b620: 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20      /*   8 */.  
b630: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
b640: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
b650: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
b660: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
b670: 20 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45    16 */.    INSE
b680: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
b690: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
b6a0: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
b6b0: 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a          /*  32 *
b6c0: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
b6d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
b6e0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
b6f0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
b700: 20 20 2f 2a 20 20 36 34 20 2a 2f 0a 20 20 20 20    /*  64 */.    
b710: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
b720: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
b730: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
b740: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31  1;          /* 1
b750: 32 38 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a  28 */.  COMMIT;.
b760: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
b770: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30  b = a_string(400
b780: 29 3b 0a 7d 20 7b 70 65 72 73 69 73 74 7d 0a 0a  );.} {persist}..
b790: 23 20 52 75 6e 20 74 72 61 6e 73 61 63 74 69 6f  # Run transactio
b7a0: 6e 73 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67  ns of increasing
b7b0: 20 73 69 7a 65 73 2e 20 45 76 65 6e 74 75 61 6c   sizes. Eventual
b7c0: 6c 79 2c 20 6f 6e 65 20 28 6f 72 20 6d 6f 72 65  ly, one (or more
b7d0: 20 74 68 61 6e 20 6f 6e 65 29 0a 23 20 6f 66 20   than one).# of 
b7e0: 74 68 65 73 65 20 77 69 6c 6c 20 77 72 69 74 65  these will write
b7f0: 20 6a 75 73 74 20 65 6e 6f 75 67 68 20 63 6f 6e   just enough con
b800: 74 65 6e 74 20 74 68 61 74 20 6f 6e 65 20 6f 66  tent that one of
b810: 20 74 68 65 20 6f 6c 64 20 68 65 61 64 65 72 73   the old headers
b820: 20 63 72 65 61 74 65 64 20 0a 23 20 62 79 20 74   created .# by t
b830: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
b840: 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
b850: 65 20 6c 69 65 73 20 69 6d 6d 65 64 69 61 74 65  e lies immediate
b860: 6c 79 20 61 66 74 65 72 20 74 68 65 20 63 6f 6e  ly after the con
b870: 74 65 6e 74 0a 23 20 6a 6f 75 72 6e 61 6c 6c 65  tent.# journalle
b880: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
b890: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
b8a0: 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20  for {set nUp 1} 
b8b0: 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20  {$nUp<64} {incr 
b8c0: 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63  nUp} {.  do_exec
b8d0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b8e0: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 31 20 7b 20  13.1.2.$nUp.1 { 
b8f0: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
b900: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
b910: 33 39 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20  399) WHERE a <= 
b920: 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  $nUp.  } {}.  do
b930: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
b940: 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70  ger1-13.1.2.$nUp
b950: 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  .2 { PRAGMA inte
b960: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f  grity_check } {o
b970: 6b 7d 20 0a 0a 20 20 23 20 54 72 79 20 74 6f 20  k} ..  # Try to 
b980: 61 63 63 65 73 73 20 74 68 65 20 73 6e 61 70 73  access the snaps
b990: 68 6f 74 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  hot of the file-
b9a0: 73 79 73 74 65 6d 2e 0a 20 20 23 0a 20 20 73 71  system..  #.  sq
b9b0: 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74 65 73  lite3 db2 sv_tes
b9c0: 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 70  t.db.  do_test p
b9d0: 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55  ager1-13.1.2.$nU
b9e0: 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  p.3 {.    execsq
b9f0: 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 6c  l { SELECT sum(l
ba00: 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d 20 74  ength(b)) FROM t
ba10: 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78 70  1 } db2.  } [exp
ba20: 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28 24 6e  r {128*400 - ($n
ba30: 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65 73  Up-1)}].  do_tes
ba40: 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e  t pager1-13.1.2.
ba50: 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65 78 65  $nUp.4 {.    exe
ba60: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  csql { PRAGMA in
ba70: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
ba80: 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64  db2.  } {ok}.  d
ba90: 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a 23 20 53 61  b2 close.}..# Sa
baa0: 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65  me test as above
bab0: 2e 20 42 75 74 20 74 68 69 73 20 74 69 6d 65 20  . But this time 
bac0: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 6f 6e  with an index on
bad0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a 64 6f   the table..#.do
bae0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
baf0: 67 65 72 31 2d 31 33 2e 32 2e 31 20 7b 0a 20 20  ger1-13.2.1 {.  
bb00: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
bb10: 4f 4e 20 74 31 28 62 29 3b 0a 20 20 55 50 44 41  ON t1(b);.  UPDA
bb20: 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f  TE t1 SET b = a_
bb30: 73 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b  string(400);.} {
bb40: 7d 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31  }.for {set nUp 1
bb50: 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63  } {$nUp<64} {inc
bb60: 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78  r nUp} {.  do_ex
bb70: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
bb80: 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 31 20  1-13.2.2.$nUp.1 
bb90: 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 74 31  { .    UPDATE t1
bba0: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
bbb0: 67 28 33 39 39 29 20 57 48 45 52 45 20 61 20 3c  g(399) WHERE a <
bbc0: 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20  = $nUp.  } {}.  
bbd0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
bbe0: 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e  pager1-13.2.2.$n
bbf0: 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e  Up.2 { PRAGMA in
bc00: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
bc10: 7b 6f 6b 7d 20 0a 20 20 73 71 6c 69 74 65 33 20  {ok} .  sqlite3 
bc20: 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20  db2 sv_test.db. 
bc30: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
bc40: 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a  13.2.2.$nUp.3 {.
bc50: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
bc60: 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28  LECT sum(length(
bc70: 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  b)) FROM t1 } db
bc80: 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38  2.  } [expr {128
bc90: 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d  *400 - ($nUp-1)}
bca0: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
bcb0: 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 34  r1-13.2.2.$nUp.4
bcc0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
bcd0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
bce0: 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20  y_check } db2.  
bcf0: 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f  } {ok}.  db2 clo
bd00: 73 65 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74  se.}..db close.t
bd10: 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d  v delete..#-----
bd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd60: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63  ----.# Test spec
bd70: 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  al "PRAGMA journ
bd80: 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 20 74 65 73  al_mode=OFF" tes
bd90: 74 20 63 61 73 65 73 2e 0a 23 0a 66 61 75 6c 74  t cases..#.fault
bda0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
bdb0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
bdc0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e  _test pager1-14.
bdd0: 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a  1.1 {.  PRAGMA j
bde0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 4f 46  ournal_mode = OF
bdf0: 46 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  F;.  CREATE TABL
be00: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 42 45  E t1(a, b);.  BE
be10: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
be20: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
be30: 2c 20 32 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a  , 2);.  COMMIT;.
be40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
be50: 74 31 3b 0a 7d 20 7b 6f 66 66 20 31 20 32 7d 0a  t1;.} {off 1 2}.
be60: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
be70: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 32 20 7b   pager1-14.1.2 {
be80: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e  .  BEGIN;.    IN
be90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
bea0: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 52 4f 4c  UES(3, 4);.  ROL
beb0: 4c 42 41 43 4b 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a  LBACK;.} {0 {}}.
bec0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
bed0: 70 61 67 65 72 31 2d 31 34 2e 31 2e 33 20 7b 0a  pager1-14.1.3 {.
bee0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
bef0: 74 31 3b 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a  t1;.} {1 2 3 4}.
bf00: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
bf10: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 34 20 7b   pager1-14.1.4 {
bf20: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e  .  BEGIN;.    IN
bf30: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77  SERT INTO t1(row
bf40: 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54  id, a, b) SELECT
bf50: 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20   a+3, b, b FROM 
bf60: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
bf70: 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c  NTO t1(rowid, a,
bf80: 20 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20   b) SELECT a+3, 
bf90: 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  b, b FROM t1;.} 
bfa0: 7b 31 20 7b 50 52 49 4d 41 52 59 20 4b 45 59 20  {1 {PRIMARY KEY 
bfb0: 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 7d 7d  must be unique}}
bfc0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
bfd0: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 35 20 7b   pager1-14.1.5 {
bfe0: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c  .  COMMIT;.  SEL
bff0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d  ECT * FROM t1;.}
c000: 20 7b 31 20 32 20 33 20 34 20 32 20 32 20 34 20   {1 2 3 4 2 2 4 
c010: 34 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  4}..#-----------
c020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
c060: 20 54 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e   Test opening an
c070: 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61  d closing the pa
c080: 67 65 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77  ger sub-system w
c090: 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 76 61  ith different va
c0a0: 6c 75 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73  lues.# for the s
c0b0: 71 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46  qlite3_vfs.szOsF
c0c0: 69 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a  ile variable..#.
c0d0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
c0e0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78  and_reopen.do_ex
c0f0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
c100: 31 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54  1-15.0 {.  CREAT
c110: 45 20 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29  E TABLE tx(y, z)
c120: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
c130: 74 78 20 56 41 4c 55 45 53 28 27 41 79 75 74 74  tx VALUES('Ayutt
c140: 68 61 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27  haya', 'Beijing'
c150: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
c160: 20 74 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64   tx VALUES('Lond
c170: 6f 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d  on', 'Tokyo');.}
c180: 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72   {}.db close.for
c190: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35   {set i 0} {$i<5
c1a0: 31 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b  13} {incr i 3} {
c1b0: 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
c1c0: 65 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69  efault 1 -szosfi
c1d0: 6c 65 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20  le $i.  sqlite3 
c1e0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f  db test.db.  do_
c1f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c200: 65 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20  er1-15.$i.1 {.  
c210: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
c220: 74 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61  tx;.  } {Ayuttha
c230: 79 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f  ya Beijing Londo
c240: 6e 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c  n Tokyo}.  db cl
c250: 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a  ose.  tv delete.
c260: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
c270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
c2b0: 43 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73  Check that it is
c2c0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
c2d0: 20 6f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   open a database
c2e0: 20 66 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c   file if the ful
c2f0: 6c 20 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20  l path.# to the 
c300: 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e  associated journ
c310: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
c320: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69  longer than sqli
c330: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
c340: 6d 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  me..#.testvfs tv
c350: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
c360: 63 72 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76  cript xOpenCb.tv
c370: 20 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72   filter xOpen.pr
c380: 6f 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68  oc xOpenCb {meth
c390: 6f 64 20 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20  od filename} {. 
c3a0: 20 73 65 74 20 3a 3a 66 69 6c 65 5f 6c 65 6e 20   set ::file_len 
c3b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
c3c0: 66 69 6c 65 6e 61 6d 65 5d 0a 7d 0a 73 71 6c 69  filename].}.sqli
c3d0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64  te3 db test.db.d
c3e0: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
c3f0: 65 0a 0a 66 6f 72 20 7b 73 65 74 20 69 69 20 5b  e..for {set ii [
c400: 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e  expr $::file_len
c410: 2d 35 5d 7d 20 7b 24 69 69 20 3c 20 5b 65 78 70  -5]} {$ii < [exp
c420: 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 32 30  r $::file_len+20
c430: 5d 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20  ]} {incr ii} {. 
c440: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
c450: 61 75 6c 74 20 31 20 2d 6d 78 70 61 74 68 6e 61  ault 1 -mxpathna
c460: 6d 65 20 24 69 69 0a 0a 20 20 23 20 54 68 65 20  me $ii..  # The 
c470: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75  length of the fu
c480: 6c 6c 20 70 61 74 68 20 74 6f 20 66 69 6c 65 20  ll path to file 
c490: 22 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c  "test.db-journal
c4a0: 22 20 69 73 20 28 24 3a 3a 66 69 6c 65 5f 6c 65  " is ($::file_le
c4b0: 6e 2b 38 29 2e 0a 20 20 23 20 49 66 20 74 68 65  n+8)..  # If the
c4c0: 20 63 6f 6e 66 69 67 75 72 65 64 20 73 71 6c 69   configured sqli
c4d0: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
c4e0: 6d 65 20 76 61 6c 75 65 20 67 72 65 61 74 65 72  me value greater
c4f0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
c500: 6f 0a 20 20 23 20 74 68 69 73 2c 20 74 68 65 6e  o.  # this, then
c510: 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
c520: 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77 69   opened. Otherwi
c530: 73 65 2c 20 69 74 20 63 61 6e 6e 6f 74 2e 0a 20  se, it cannot.. 
c540: 20 23 0a 20 20 69 66 20 7b 24 69 69 20 3e 3d 20   #.  if {$ii >= 
c550: 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65  [expr $::file_le
c560: 6e 2b 38 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20  n+8]} {.    set 
c570: 72 65 73 20 7b 30 20 7b 7d 7d 0a 20 20 7d 20 65  res {0 {}}.  } e
c580: 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 72 65  lse {.    set re
c590: 73 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  s {1 {unable to 
c5a0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
c5b0: 6c 65 7d 7d 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74  le}}.  }..  do_t
c5c0: 65 73 74 20 70 61 67 65 72 31 2d 31 36 2e 31 2e  est pager1-16.1.
c5d0: 24 69 69 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b  $ii {.    list [
c5e0: 63 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33 20  catch { sqlite3 
c5f0: 64 62 20 74 65 73 74 2e 64 62 20 7d 20 6d 73 67  db test.db } msg
c600: 5d 20 24 6d 73 67 0a 20 20 7d 20 24 72 65 73 0a  ] $msg.  } $res.
c610: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
c620: 73 65 7d 0a 20 20 74 76 20 64 65 6c 65 74 65 0a  se}.  tv delete.
c630: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
c640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
c680: 54 65 73 74 20 22 50 52 41 47 4d 41 20 6f 6d 69  Test "PRAGMA omi
c690: 74 5f 72 65 61 64 6c 6f 63 6b 22 2e 20 0a 23 0a  t_readlock". .#.
c6a0: 23 20 20 20 70 61 67 65 72 31 2d 31 37 2e 24 74  #   pager1-17.$t
c6b0: 6e 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  n.1.*: Test that
c6c0: 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 6f 6e   if a second con
c6d0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 20 6f  nection has an o
c6e0: 70 65 6e 20 0a 23 20 20 20 20 20 20 20 20 20 20  pen .#          
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
c700: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74  -transaction, it
c710: 20 69 73 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20   is not usually 
c720: 70 6f 73 73 69 62 6c 65 20 74 6f 20 77 72 69 74  possible to writ
c730: 65 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  e .#            
c740: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64 61            the da
c750: 74 61 62 61 73 65 2e 0a 23 0a 23 20 20 20 70 61  tabase..#.#   pa
c760: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 2a 3a  ger1-17.$tn.2.*:
c770: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
c780: 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74  e second connect
c790: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77  ion was opened w
c7a0: 69 74 68 0a 23 20 20 20 20 20 20 20 20 20 20 20  ith.#           
c7b0: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 53             the S
c7c0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
c7d0: 4e 4c 59 20 66 6c 61 67 2c 20 61 6e 64 20 0a 23  NLY flag, and .#
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 6f 6d        "PRAGMA om
c800: 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 22  it_readlock = 1"
c810: 20 69 73 20 65 78 65 63 75 74 65 64 20 62 65 66   is executed bef
c820: 6f 72 65 20 61 74 74 61 63 68 69 6e 67 0a 23 20  ore attaching.# 
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
c850: 65 20 61 6e 64 20 6f 70 65 6e 69 6e 67 20 61 20  e and opening a 
c860: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
c870: 20 6f 6e 20 69 74 2c 20 69 74 20 69 73 0a 23 20   on it, it is.# 
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 20 20 70 6f 73 73 69 62 6c 65 20 74 6f       possible to
c8a0: 20 77 72 69 74 65 20 74 68 65 20 64 62 2e 0a 23   write the db..#
c8b0: 0a 23 20 20 20 70 61 67 65 72 31 2d 31 37 2e 24  .#   pager1-17.$
c8c0: 74 6e 2e 33 2e 2a 3a 20 54 65 73 74 20 74 68 61  tn.3.*: Test tha
c8d0: 74 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t if the second 
c8e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 2a  connection was *
c8f0: 6e 6f 74 2a 20 6f 70 65 6e 65 64 20 77 69 74 68  not* opened with
c900: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
c910: 20 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 49          the SQLI
c920: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
c930: 20 66 6c 61 67 2c 20 65 78 65 63 75 74 69 6e 67   flag, executing
c940: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
c950: 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41           "PRAGMA
c960: 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d   omit_readlock =
c970: 20 31 22 20 68 61 73 20 6e 6f 20 65 66 66 65 63   1" has no effec
c980: 74 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69  t..#.do_multicli
c990: 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20  ent_test tn {.  
c9a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
c9b0: 37 2e 24 74 6e 2e 31 2e 31 20 7b 0a 20 20 20 20  7.$tn.1.1 {.    
c9c0: 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 43 52  sql1 { .      CR
c9d0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
c9e0: 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
c9f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
ca00: 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20  (1, 2);.    }.  
ca10: 20 20 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 42    sql2 {.      B
ca20: 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45  EGIN;.      SELE
ca30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
ca40: 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20    }.  } {1 2}.  
ca50: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
ca60: 37 2e 24 74 6e 2e 31 2e 32 20 7b 0a 20 20 20 20  7.$tn.1.2 {.    
ca70: 63 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49  csql1 { INSERT I
ca80: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
ca90: 20 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61   4) }.  } {1 {da
caa0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
cab0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }}.  do_test pag
cac0: 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 33 20 7b  er1-17.$tn.1.3 {
cad0: 0a 20 20 20 20 73 71 6c 32 20 7b 20 43 4f 4d 4d  .    sql2 { COMM
cae0: 49 54 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 20  IT }.    sql1 { 
caf0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
cb00: 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20 20  ALUES(3, 4) }.  
cb10: 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  } {}..  do_test 
cb20: 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e  pager1-17.$tn.2.
cb30: 31 20 7b 0a 20 20 20 20 63 6f 64 65 32 20 7b 0a  1 {.    code2 {.
cb40: 20 20 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a        db2 close.
cb50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
cb60: 32 20 3a 6d 65 6d 6f 72 79 3a 20 2d 72 65 61 64  2 :memory: -read
cb70: 6f 6e 6c 79 20 31 0a 20 20 20 20 7d 0a 20 20 20  only 1.    }.   
cb80: 20 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 50   sql2 { .      P
cb90: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
cba0: 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 41  ock = 1;.      A
cbb0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 27 20  TTACH 'test.db' 
cbc0: 41 53 20 74 77 6f 3b 0a 20 20 20 20 20 20 42 45  AS two;.      BE
cbd0: 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  GIN;.      SELEC
cbe0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
cbf0: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d   }.  } {1 2 3 4}
cc00: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
cc10: 31 2d 31 37 2e 24 74 6e 2e 32 2e 32 20 7b 20 73  1-17.$tn.2.2 { s
cc20: 71 6c 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ql1 "INSERT INTO
cc30: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29   t1 VALUES(5, 6)
cc40: 22 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  " } {}.  do_test
cc50: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32   pager1-17.$tn.2
cc60: 2e 33 20 7b 20 73 71 6c 32 20 22 53 45 4c 45 43  .3 { sql2 "SELEC
cc70: 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 7d 20 20  T * FROM t1" }  
cc80: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33            {1 2 3
cc90: 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   4}.  do_test pa
cca0: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 34 20  ger1-17.$tn.2.4 
ccb0: 7b 20 73 71 6c 32 20 22 43 4f 4d 4d 49 54 20 3b  { sql2 "COMMIT ;
ccc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
ccd0: 31 22 20 7d 20 20 20 7b 31 20 32 20 33 20 34 20  1" }   {1 2 3 4 
cce0: 35 20 36 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  5 6}..  do_test 
ccf0: 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e  pager1-17.$tn.3.
cd00: 31 20 7b 0a 20 20 20 20 63 6f 64 65 32 20 7b 0a  1 {.    code2 {.
cd10: 20 20 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a        db2 close.
cd20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
cd30: 32 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 20 20 7d  2 :memory:.    }
cd40: 0a 20 20 20 20 73 71 6c 32 20 7b 20 0a 20 20 20  .    sql2 { .   
cd50: 20 20 20 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72     PRAGMA omit_r
cd60: 65 61 64 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  eadlock = 1;.   
cd70: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
cd80: 64 62 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20  db' AS two;.    
cd90: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
cda0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
cdb0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20  .    }.  } {1 2 
cdc0: 33 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65  3 4 5 6}.  do_te
cdd0: 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e  st pager1-17.$tn
cde0: 2e 33 2e 32 20 7b 0a 20 20 63 73 71 6c 31 20 7b  .3.2 {.  csql1 {
cdf0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ce00: 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20  VALUES(3, 4) }. 
ce10: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
ce20: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
ce30: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
ce40: 24 74 6e 2e 33 2e 33 20 7b 20 73 71 6c 32 20 43  $tn.3.3 { sql2 C
ce50: 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d  OMMIT } {}.}..#-
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
ceb0: 74 68 65 20 70 61 67 65 72 73 20 72 65 73 70 6f  the pagers respo
cec0: 6e 73 65 20 74 6f 20 74 68 65 20 62 2d 74 72 65  nse to the b-tre
ced0: 65 20 6c 61 79 65 72 20 72 65 71 75 65 73 74 69  e layer requesti
cee0: 6e 67 20 69 6c 6c 65 67 61 6c 20 70 61 67 65 20  ng illegal page 
cef0: 0a 23 20 6e 75 6d 62 65 72 73 3a 0a 23 0a 23 20  .# numbers:.#.# 
cf00: 20 20 2b 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20    + The locking 
cf10: 70 61 67 65 2c 0a 23 20 20 20 2b 20 50 61 67 65  page,.#   + Page
cf20: 20 30 2c 0a 23 20 20 20 2b 20 41 20 70 61 67 65   0,.#   + A page
cf30: 20 77 69 74 68 20 61 20 70 61 67 65 20 6e 75 6d   with a page num
cf40: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
cf50: 20 28 32 5e 33 31 2d 31 29 2e 0a 23 0a 64 6f 5f   (2^31-1)..#.do_
cf60: 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 31  test pager1-18.1
cf70: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
cf80: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
cf90: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
cfa0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
cfb0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
cfc0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
cfd0: 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
cfe0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
cff0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d000: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
d010: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
d020: 6e 67 28 32 30 30 29 29 3b 0a 20 20 20 20 49 4e  ng(200));.    IN
d030: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d040: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d050: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d060: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d070: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d080: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d090: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d0a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d0b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d0c0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d0d0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d0e0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d0f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d100: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d110: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d120: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d130: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d140: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d150: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d160: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d170: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d180: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d190: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d1a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d1b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d1c0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d1d0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d1e0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
d1f0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
d200: 31 2d 31 38 2e 32 20 7b 0a 20 20 73 65 74 20 72  1-18.2 {.  set r
d210: 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c  oot [db one "SEL
d220: 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
d230: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
d240: 5d 0a 20 20 73 65 74 20 6c 6f 63 6b 69 6e 67 70  ].  set lockingp
d250: 61 67 65 20 5b 65 78 70 72 20 28 30 78 31 30 30  age [expr (0x100
d260: 30 30 2f 31 30 32 34 29 20 2b 20 31 5d 0a 20 20  00/1024) + 1].  
d270: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
d280: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
d290: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50  hema = 1;.    UP
d2a0: 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  DATE sqlite_mast
d2b0: 65 72 20 53 45 54 20 72 6f 6f 74 70 61 67 65 20  er SET rootpage 
d2c0: 3d 20 24 6c 6f 63 6b 69 6e 67 70 61 67 65 3b 0a  = $lockingpage;.
d2d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
d2e0: 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  2 test.db.  catc
d2f0: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  hsql { SELECT co
d300: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d  unt(*) FROM t1 }
d310: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
d320: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d330: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
d340: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
d350: 70 61 67 65 72 31 2d 31 38 2e 33 20 7b 0a 20 20  pager1-18.3 {.  
d360: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
d370: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29  EATE TABLE t2(x)
d380: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d390: 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73 74  O t2 VALUES(a_st
d3a0: 72 69 6e 67 28 35 30 30 30 29 29 3b 0a 20 20 7d  ring(5000));.  }
d3b0: 0a 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78 70  .  set pgno [exp
d3c0: 72 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  r ([file size te
d3d0: 73 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d 32  st.db] / 1024)-2
d3e0: 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ].  hexio_write 
d3f0: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
d400: 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30  pgno-1)*1024] 00
d410: 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  000000.  sqlite3
d420: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63   db2 test.db.  c
d430: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
d440: 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20   length(x) FROM 
d450: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t2 } db2.} {1 {d
d460: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d470: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d480: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
d490: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 34 20  est pager1-18.4 
d4a0: 7b 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  {.  hexio_write 
d4b0: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
d4c0: 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 39 30  pgno-1)*1024] 90
d4d0: 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  000000.  sqlite3
d4e0: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63   db2 test.db.  c
d4f0: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
d500: 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20   length(x) FROM 
d510: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t2 } db2.} {1 {d
d520: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d530: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d540: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
d550: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 35 20  est pager1-18.5 
d560: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22  {.  sqlite3 db "
d570: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
d580: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
d590: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
d5a0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
d5b0: 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  b);.    PRAGMA w
d5c0: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
d5d0: 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73   1;.    UPDATE s
d5e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54  qlite_master SET
d5f0: 20 72 6f 6f 74 70 61 67 65 3d 35 20 57 48 45 52   rootpage=5 WHER
d600: 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74 31  E tbl_name = 't1
d610: 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72  ';.    PRAGMA wr
d620: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
d630: 30 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42  0;.    ALTER TAB
d640: 4c 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20  LE t1 RENAME TO 
d650: 78 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73  x1;.  }.  catchs
d660: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
d670: 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31 20 7b 64 61  OM x1 }.} {1 {da
d680: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
d690: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
d6a0: 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65  .db close..do_te
d6b0: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 36 20 7b  st pager1-18.6 {
d6c0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
d6d0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
d6e0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
d6f0: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
d700: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
d710: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
d720: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
d730: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49  BLE t1(x);.    I
d740: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
d750: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30  LUES(a_string(80
d760: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
d770: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
d780: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
d790: 20 7d 0a 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b   }..  set root [
d7a0: 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72  db one "SELECT r
d7b0: 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c  ootpage FROM sql
d7c0: 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 64  ite_master"].  d
d7d0: 62 20 63 6c 6f 73 65 0a 0a 20 20 68 65 78 69 6f  b close..  hexio
d7e0: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b  _write test.db [
d7f0: 65 78 70 72 20 28 24 72 6f 6f 74 2d 31 29 2a 31  expr ($root-1)*1
d800: 30 32 34 20 2b 20 38 5d 20 30 30 30 30 30 30 30  024 + 8] 0000000
d810: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  0.  sqlite3 db t
d820: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
d830: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
d840: 68 28 78 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  h(x) FROM t1 }.}
d850: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
d860: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
d870: 6f 72 6d 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74  ormed}}..do_test
d880: 20 70 61 67 65 72 31 2d 31 39 2e 31 20 7b 0a 20   pager1-19.1 {. 
d890: 20 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20   sqlite3 db "". 
d8a0: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
d8b0: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
d8c0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
d8d0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31  A page_size = 51
d8e0: 32 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75  2;.    PRAGMA au
d8f0: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20  to_vacuum = 1;. 
d900: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d910: 74 31 28 61 61 2c 20 61 62 2c 20 61 63 2c 20 61  t1(aa, ab, ac, a
d920: 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c 20 61  d, ae, af, ag, a
d930: 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61  h, ai, aj, ak, a
d940: 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20  l, am, an,.     
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
d960: 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c 20 62  a, bb, bc, bd, b
d970: 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c 20 62  e, bf, bg, bh, b
d980: 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62  i, bj, bk, bl, b
d990: 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, bn,.         
d9a0: 20 20 20 20 20 20 20 20 20 20 20 63 61 2c 20 63             ca, c
d9b0: 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c 20 63  b, cc, cd, ce, c
d9c0: 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c 20 63  f, cg, ch, ci, c
d9d0: 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63  j, ck, cl, cm, c
d9e0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d9f0: 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c 20 64         da, db, d
da00: 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c 20 64  c, dd, de, df, d
da10: 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64  g, dh, di, dj, d
da20: 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20  k, dl, dm, dn,. 
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c 20 65     ea, eb, ec, e
da50: 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c 20 65  d, ee, ef, eg, e
da60: 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65  h, ei, ej, ek, e
da70: 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20  l, em, en,.     
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
da90: 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c 20 66  a, fb, fc, fd, f
daa0: 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c 20 66  e, ff, fg, fh, f
dab0: 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66  i, fj, fk, fl, f
dac0: 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, fn,.         
dad0: 20 20 20 20 20 20 20 20 20 20 20 67 61 2c 20 67             ga, g
dae0: 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c 20 67  b, gc, gd, ge, g
daf0: 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c 20 67  f, gg, gh, gi, g
db00: 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67  j, gk, gl, gm, g
db10: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
db20: 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c 20 68         ha, hb, h
db30: 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c 20 68  c, hd, he, hf, h
db40: 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68  g, hh, hi, hj, h
db50: 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20  k, hl, hm, hn,. 
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c 20 69     ia, ib, ic, i
db80: 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c 20 69  d, ie, if, ig, i
db90: 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69  h, ii, ij, ik, i
dba0: 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20  l, im, ix,.     
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
dbc0: 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a  a, jb, jc, jd, j
dbd0: 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a  e, jf, jg, jh, j
dbe0: 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a  i, jj, jk, jl, j
dbf0: 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, jn,.         
dc00: 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c 20 6b             ka, k
dc10: 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b  b, kc, kd, ke, k
dc20: 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b  f, kg, kh, ki, k
dc30: 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b  j, kk, kl, km, k
dc40: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dc50: 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c         la, lb, l
dc60: 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c  c, ld, le, lf, l
dc70: 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c  g, lh, li, lj, l
dc80: 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20  k, ll, lm, ln,. 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d     ma, mb, mc, m
dcb0: 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d  d, me, mf, mg, m
dcc0: 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d  h, mi, mj, mk, m
dcd0: 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b  l, mm, mn.    );
dce0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
dcf0: 45 20 74 32 28 61 61 2c 20 61 62 2c 20 61 63 2c  E t2(aa, ab, ac,
dd00: 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c   ad, ae, af, ag,
dd10: 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c   ah, ai, aj, ak,
dd20: 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20   al, am, an,.   
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c   ba, bb, bc, bd,
dd50: 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c   be, bf, bg, bh,
dd60: 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c   bi, bj, bk, bl,
dd70: 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20   bm, bn,.       
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 2c               ca,
dd90: 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c   cb, cc, cd, ce,
dda0: 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c   cf, cg, ch, ci,
ddb0: 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c   cj, ck, cl, cm,
ddc0: 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   cn,.           
ddd0: 20 20 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c           da, db,
dde0: 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c   dc, dd, de, df,
ddf0: 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c   dg, dh, di, dj,
de00: 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c   dk, dl, dm, dn,
de10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de20: 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c       ea, eb, ec,
de30: 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c   ed, ee, ef, eg,
de40: 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c   eh, ei, ej, ek,
de50: 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20   el, em, en,.   
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c   fa, fb, fc, fd,
de80: 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c   fe, ff, fg, fh,
de90: 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c   fi, fj, fk, fl,
dea0: 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20   fm, fn,.       
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 61 2c               ga,
dec0: 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c   gb, gc, gd, ge,
ded0: 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c   gf, gg, gh, gi,
dee0: 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c   gj, gk, gl, gm,
def0: 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   gn,.           
df00: 20 20 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c           ha, hb,
df10: 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c   hc, hd, he, hf,
df20: 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c   hg, hh, hi, hj,
df30: 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c   hk, hl, hm, hn,
df40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df50: 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c       ia, ib, ic,
df60: 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c   id, ie, if, ig,
df70: 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c   ih, ii, ij, ik,
df80: 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20   il, im, ix,.   
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c   ja, jb, jc, jd,
dfb0: 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c   je, jf, jg, jh,
dfc0: 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c   ji, jj, jk, jl,
dfd0: 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20   jm, jn,.       
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c               ka,
dff0: 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c   kb, kc, kd, ke,
e000: 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c   kf, kg, kh, ki,
e010: 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c   kj, kk, kl, km,
e020: 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   kn,.           
e030: 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c           la, lb,
e040: 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c   lc, ld, le, lf,
e050: 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c   lg, lh, li, lj,
e060: 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c   lk, ll, lm, ln,
e070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e080: 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c       ma, mb, mc,
e090: 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c   md, me, mf, mg,
e0a0: 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c   mh, mi, mj, mk,
e0b0: 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20   ml, mm, mn.    
e0c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
e0d0: 54 4f 20 74 31 28 61 61 29 20 56 41 4c 55 45 53  TO t1(aa) VALUES
e0e0: 28 20 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30  ( a_string(10000
e0f0: 30 29 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  0) );.    INSERT
e100: 20 49 4e 54 4f 20 74 32 28 61 61 29 20 56 41 4c   INTO t2(aa) VAL
e110: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30  UES( a_string(10
e120: 30 30 30 30 29 20 29 3b 0a 20 20 20 20 56 41 43  0000) );.    VAC
e130: 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23  UUM;.  }.} {}..#
e140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
e190: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 73 70 65   a couple of spe
e1a0: 63 69 61 6c 20 63 61 73 65 73 20 74 68 61 74 20  cial cases that 
e1b0: 63 6f 6d 65 20 75 70 20 77 68 69 6c 65 20 63 6f  come up while co
e1c0: 6d 6d 69 74 74 69 6e 67 20 0a 23 20 74 72 61 6e  mmitting .# tran
e1d0: 73 61 63 74 69 6f 6e 73 3a 0a 23 0a 23 20 20 20  sactions:.#.#   
e1e0: 70 61 67 65 72 31 2d 32 30 2e 31 2e 2a 3a 20 43  pager1-20.1.*: C
e1f0: 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 20 69 6e 2d  ommitting an in-
e200: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
e210: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68 65 6e  transaction when
e220: 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20 20   the .#         
e230: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
e240: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  e has not been m
e250: 6f 64 69 66 69 65 64 20 61 74 20 61 6c 6c 2e 0a  odified at all..
e260: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e  #.#   pager1-20.
e270: 32 2e 2a 3a 20 41 73 20 61 62 6f 76 65 2c 20 62  2.*: As above, b
e280: 75 74 20 77 69 74 68 20 61 20 6e 6f 72 6d 61 6c  ut with a normal
e290: 20 64 62 20 69 6e 20 65 78 63 6c 75 73 69 76 65   db in exclusive
e2a0: 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 23  -locking mode..#
e2b0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e 33  .#   pager1-20.3
e2c0: 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61  .*: Committing a
e2d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
e2e0: 57 41 4c 20 6d 6f 64 65 20 77 68 65 72 65 20 74  WAL mode where t
e2f0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 0a  he database has.
e300: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
e310: 20 20 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64     been modified
e320: 2c 20 62 75 74 20 61 6c 6c 20 64 69 72 74 79 20  , but all dirty 
e330: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
e340: 66 6c 75 73 68 65 64 20 74 6f 20 0a 23 20 20 20  flushed to .#   
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
e360: 69 73 6b 20 62 65 66 6f 72 65 20 74 68 65 20 63  isk before the c
e370: 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74 65 73 74  ommit..#.do_test
e380: 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 31 20 7b   pager1-20.1.1 {
e390: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
e3a0: 73 65 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62  se}.  sqlite3 db
e3b0: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78 65 63   :memory:.  exec
e3c0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
e3d0: 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20   TABLE one(two, 
e3e0: 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53 45  three);.    INSE
e3f0: 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55  RT INTO one VALU
e400: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
e410: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
e420: 61 67 65 72 31 2d 32 30 2e 31 2e 32 20 7b 0a 20  ager1-20.1.2 {. 
e430: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
e440: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a  EGIN EXCLUSIVE;.
e450: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
e460: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
e470: 67 65 72 31 2d 32 30 2e 32 2e 31 20 7b 0a 20 20  ger1-20.2.1 {.  
e480: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
e490: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
e4a0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
e4b0: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
e4c0: 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20   exclusive;.    
e4d0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
e4e0: 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20  ode = persist;. 
e4f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e500: 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29 3b  one(two, three);
e510: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
e520: 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27 2c   one VALUES('a',
e530: 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 65 78   'b');.  }.} {ex
e540: 63 6c 75 73 69 76 65 20 70 65 72 73 69 73 74 7d  clusive persist}
e550: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
e560: 32 30 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  20.2.2 {.  execs
e570: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45  ql {.    BEGIN E
e580: 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f  XCLUSIVE;.    CO
e590: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  MMIT;.  }.} {}..
e5a0: 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a  ifcapable wal {.
e5b0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
e5c0: 2d 32 30 2e 33 2e 31 20 7b 0a 20 20 20 20 66 61  -20.3.1 {.    fa
e5d0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
e5e0: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20  d_reopen.    db 
e5f0: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
e600: 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73  string.    execs
e610: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
e620: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
e630: 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  0;.      PRAGMA 
e640: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77  journal_mode = w
e650: 61 6c 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  al;.      BEGIN;
e660: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
e670: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
e680: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
e690: 45 20 74 32 28 79 29 3b 0a 20 20 20 20 20 20 20  E t2(y);.       
e6a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
e6b0: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
e6c0: 38 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20 49  800));.        I
e6d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
e6e0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
e6f0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
e700: 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a 20 20      /*   2 */.  
e710: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
e720: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
e730: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
e740: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20  1;         /*   
e750: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53  4 */.        INS
e760: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
e770: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
e780: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
e790: 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20    /*   8 */.    
e7a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e7b0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
e7c0: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(800) FROM t1;
e7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36 20           /*  16 
e7e0: 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  */.        INSER
e7f0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
e800: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
e810: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
e820: 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 20 20  /*  32 */.      
e830: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20  COMMIT;.    }.  
e840: 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73  } {wal}.  do_tes
e850: 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 32 20  t pager1-20.3.2 
e860: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
e870: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
e880: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e890: 32 20 56 41 4c 55 45 53 28 27 78 78 78 78 27 29  2 VALUES('xxxx')
e8a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75  ;.    }.    recu
e8b0: 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20  rsive_select 32 
e8c0: 74 31 0a 20 20 20 20 65 78 65 63 73 71 6c 20 43  t1.    execsql C
e8d0: 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a  OMMIT.  } {}.}..
e8e0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
e8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
e930: 74 20 74 68 61 74 20 61 20 57 41 4c 20 64 61 74  t that a WAL dat
e940: 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65  abase may not be
e950: 20 6f 70 65 6e 65 64 20 69 66 3a 0a 23 0a 23 20   opened if:.#.# 
e960: 20 20 70 61 67 65 72 31 2d 32 31 2e 31 2e 2a 3a    pager1-21.1.*:
e970: 20 54 68 65 20 56 46 53 20 68 61 73 20 61 6e 20   The VFS has an 
e980: 69 56 65 72 73 69 6f 6e 20 6c 65 73 73 20 74 68  iVersion less th
e990: 61 6e 20 32 2c 20 6f 72 0a 23 20 20 20 70 61 67  an 2, or.#   pag
e9a0: 65 72 31 2d 32 31 2e 32 2e 2a 3a 20 54 68 65 20  er1-21.2.*: The 
e9b0: 56 46 53 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  VFS does not pro
e9c0: 76 69 64 65 20 78 53 68 6d 58 58 58 28 29 20 6d  vide xShmXXX() m
e9d0: 65 74 68 6f 64 73 2e 0a 23 0a 69 66 63 61 70 61  ethods..#.ifcapa
e9e0: 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 74  ble wal {.  do_t
e9f0: 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e 30 20  est pager1-21.0 
ea00: 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64  {.    faultsim_d
ea10: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
ea20: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
ea30: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
ea40: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
ea50: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
ea60: 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54 20  LE ko(c DEFAULT 
ea70: 27 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c 54  'abc', b DEFAULT
ea80: 20 27 64 65 66 27 29 3b 0a 20 20 20 20 20 20 49   'def');.      I
ea90: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45  NSERT INTO ko DE
eaa0: 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20  FAULT VALUES;.  
eab0: 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20    }.  } {wal}.  
eac0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
ead0: 31 2e 31 20 7b 0a 20 20 20 20 74 65 73 74 76 66  1.1 {.    testvf
eae0: 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31 0a 20 20  s tv -noshm 1.  
eaf0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
eb00: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20  st.db -vfs tv.  
eb10: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
eb20: 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20  ECT * FROM ko } 
eb30: 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75 6e 61 62  db2.  } {1 {unab
eb40: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
eb50: 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 64 62 32  ase file}}.  db2
eb60: 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65   close.  tv dele
eb70: 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  te.  do_test pag
eb80: 65 72 31 2d 32 31 2e 32 20 7b 0a 20 20 20 20 74  er1-21.2 {.    t
eb90: 65 73 74 76 66 73 20 74 76 20 2d 69 76 65 72 73  estvfs tv -ivers
eba0: 69 6f 6e 20 31 0a 20 20 20 20 73 71 6c 69 74 65  ion 1.    sqlite
ebb0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76  3 db2 test.db -v
ebc0: 66 73 20 74 76 0a 20 20 20 20 63 61 74 63 68 73  fs tv.    catchs
ebd0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
ebe0: 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20 20 7d 20  OM ko } db2.  } 
ebf0: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70  {1 {unable to op
ec00: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
ec10: 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20  }}.  db2 close. 
ec20: 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d   tv delete.}..#-
ec30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec70: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
ec80: 74 68 61 74 20 61 20 22 50 52 41 47 4d 41 20 77  that a "PRAGMA w
ec90: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 3a 0a  al_checkpoint":.
eca0: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32 2e  #.#   pager1-22.
ecb0: 31 2e 2a 3a 20 69 73 20 61 20 6e 6f 2d 6f 70 20  1.*: is a no-op 
ecc0: 6f 6e 20 61 20 6e 6f 6e 2d 57 41 4c 20 64 62 2c  on a non-WAL db,
ecd0: 20 61 6e 64 0a 23 20 20 20 70 61 67 65 72 31 2d   and.#   pager1-
ece0: 32 32 2e 32 2e 2a 3a 20 64 6f 65 73 20 6e 6f 74  22.2.*: does not
ecf0: 20 63 61 75 73 65 20 78 53 79 6e 63 20 63 61 6c   cause xSync cal
ed00: 6c 73 20 77 69 74 68 20 61 20 73 79 6e 63 68 72  ls with a synchr
ed10: 6f 6e 6f 75 73 3d 6f 66 66 20 64 62 2e 0a 23 0a  onous=off db..#.
ed20: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
ed30: 32 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  2.1.1 {.  faults
ed40: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
ed50: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
ed60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
ed70: 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54 20 27  E ko(c DEFAULT '
ed80: 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c 54 20  abc', b DEFAULT 
ed90: 27 64 65 66 27 29 3b 0a 20 20 20 20 49 4e 53 45  'def');.    INSE
eda0: 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55  RT INTO ko DEFAU
edb0: 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 7d 0a 20  LT VALUES;.  }. 
edc0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
edd0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
ede0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
edf0: 70 61 67 65 72 31 2d 32 32 2e 32 2e 31 20 7b 0a  pager1-22.2.1 {.
ee00: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65    testvfs tv -de
ee10: 66 61 75 6c 74 20 31 0a 20 20 74 76 20 66 69 6c  fault 1.  tv fil
ee20: 74 65 72 20 78 53 79 6e 63 0a 20 20 74 76 20 73  ter xSync.  tv s
ee30: 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 20 20  cript xSyncCb.  
ee40: 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 61 72  proc xSyncCb {ar
ee50: 67 73 7d 20 7b 69 6e 63 72 20 3a 3a 73 79 6e 63  gs} {incr ::sync
ee60: 63 6f 75 6e 74 7d 0a 20 20 73 65 74 20 3a 3a 73  count}.  set ::s
ee70: 79 6e 63 63 6f 75 6e 74 20 30 0a 20 20 73 71 6c  ynccount 0.  sql
ee80: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
ee90: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
eea0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
eeb0: 75 73 20 3d 20 6f 66 66 3b 0a 20 20 20 20 50 52  us = off;.    PR
eec0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
eed0: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 49 4e 53  e = WAL;.    INS
eee0: 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41  ERT INTO ko DEFA
eef0: 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 7d 0a  ULT VALUES;.  }.
ef00: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
ef10: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
ef20: 74 20 7d 0a 20 20 73 65 74 20 73 79 6e 63 63 6f  t }.  set syncco
ef30: 75 6e 74 0a 7d 20 7b 30 7d 0a 64 62 20 63 6c 6f  unt.} {0}.db clo
ef40: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d  se.tv delete..#-
ef50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73  --------.# Tests
efa0: 20 66 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a 6f   for changing jo
efb0: 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20  urnal mode..#.# 
efc0: 20 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a 3a    pager1-23.1.*:
efd0: 20 54 65 73 74 20 74 68 61 74 20 77 68 65 6e 20   Test that when 
efe0: 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50 45  changing from PE
eff0: 52 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20  RSIST to DELETE 
f000: 6d 6f 64 65 2c 0a 23 20 20 20 20 20 20 20 20 20  mode,.#         
f010: 20 20 20 20 20 20 20 20 20 74 68 65 20 6a 6f 75           the jou
f020: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c  rnal file is del
f030: 65 74 65 64 2e 0a 23 0a 23 20 20 20 70 61 67 65  eted..#.#   page
f040: 72 31 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 20  r1-23.2.*: Same 
f050: 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62  test as above, b
f060: 75 74 20 77 68 69 6c 65 20 61 20 73 68 61 72 65  ut while a share
f070: 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23  d lock is held.#
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f090: 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73    on the databas
f0a0: 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61  e file..#.#   pa
f0b0: 67 65 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d  ger1-23.3.*: Sam
f0c0: 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c  e test as above,
f0d0: 20 62 75 74 20 77 68 69 6c 65 20 61 20 72 65 73   but while a res
f0e0: 65 72 76 65 64 20 6c 6f 63 6b 20 69 73 20 68 65  erved lock is he
f0f0: 6c 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ld.#            
f100: 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
f110: 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20  abase file..#.# 
f120: 20 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a 3a    pager1-23.4.*:
f130: 20 41 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20 77   And, for fun, w
f140: 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  hile holding an 
f150: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
f160: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e  #.#   pager1-23.
f170: 35 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20  5.*: Try to set 
f180: 76 61 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e  various differen
f190: 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20  t journal modes 
f1a0: 77 69 74 68 20 61 6e 0a 23 20 20 20 20 20 20 20  with an.#       
f1b0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 2d 6d 65             in-me
f1c0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6f  mory database (o
f1d0: 6e 6c 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20 4f  nly MEMORY and O
f1e0: 46 46 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29 2e  FF should work).
f1f0: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33  .#.#   pager1-23
f200: 2e 36 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74  .6.*: Try to set
f210: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f   locking_mode=no
f220: 72 6d 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  rmal on an in-me
f230: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 23 20  mory database.# 
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 28 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 2d   (doesn't work -
f260: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f270: 61 73 65 73 20 61 6c 77 61 79 73 20 75 73 65 0a  ases always use.
f280: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
f290: 20 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d     locking_mode=
f2a0: 65 78 63 6c 75 73 69 76 65 29 2e 0a 23 0a 64 6f  exclusive)..#.do
f2b0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f2c0: 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
f2d0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
f2e0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
f2f0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
f300: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
f310: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
f320: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d  LE t1(a, b);.  }
f330: 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74  .  file exists t
f340: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d  est.db-journal.}
f350: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   {1}.do_test pag
f360: 65 72 31 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 65  er1-23.1.2 {.  e
f370: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
f380: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
f390: 45 4c 45 54 45 20 7d 0a 20 20 66 69 6c 65 20 65  ELETE }.  file e
f3a0: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
f3b0: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f  urnal.} {0}..do_
f3c0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32  test pager1-23.2
f3d0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
f3e0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
f3f0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
f400: 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ST;.    INSERT I
f410: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 43  NTO t1 VALUES('C
f420: 61 6e 62 65 72 72 61 27 2c 20 27 41 43 54 27 29  anberra', 'ACT')
f430: 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20  ;.  }.  db eval 
f440: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
f450: 74 31 20 7d 20 7b 0a 20 20 20 20 64 62 20 65 76  t1 } {.    db ev
f460: 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  al { PRAGMA jour
f470: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
f480: 45 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  E }.  }.  execsq
f490: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
f4a0: 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c  al_mode }.} {del
f4b0: 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ete}.do_test pag
f4c0: 65 72 31 2d 32 33 2e 32 2e 32 20 7b 0a 20 20 66  er1-23.2.2 {.  f
f4d0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
f4e0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
f4f0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
f500: 2d 32 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63  -23.3.1 {.  exec
f510: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
f520: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f530: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53  PERSIST;.    INS
f540: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
f550: 45 53 28 27 44 61 72 77 69 6e 27 2c 20 27 4e 54  ES('Darwin', 'NT
f560: 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d  ');.    BEGIN IM
f570: 4d 45 44 49 41 54 45 3b 0a 20 20 7d 0a 20 20 64  MEDIATE;.  }.  d
f580: 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  b eval { PRAGMA 
f590: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
f5a0: 45 4c 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71  ELETE }.  execsq
f5b0: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
f5c0: 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c  al_mode }.} {del
f5d0: 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ete}.do_test pag
f5e0: 65 72 31 2d 32 33 2e 33 2e 32 20 7b 0a 20 20 66  er1-23.3.2 {.  f
f5f0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
f600: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
f610: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f620: 32 33 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63 73  23.3.3 {.  execs
f630: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a  ql COMMIT.} {}..
f640: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f650: 33 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.4.1 {.  execsq
f660: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
f670: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
f680: 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52  RSIST;.    INSER
f690: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
f6a0: 28 27 41 64 65 6c 61 69 64 65 27 2c 20 27 53 41  ('Adelaide', 'SA
f6b0: 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 45 58  ');.    BEGIN EX
f6c0: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 64  CLUSIVE;.  }.  d
f6d0: 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  b eval { PRAGMA 
f6e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
f6f0: 45 4c 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71  ELETE }.  execsq
f700: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
f710: 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c  al_mode }.} {del
f720: 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ete}.do_test pag
f730: 65 72 31 2d 32 33 2e 34 2e 32 20 7b 0a 20 20 66  er1-23.4.2 {.  f
f740: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
f750: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
f760: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f770: 32 33 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73  23.4.3 {.  execs
f780: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a  ql COMMIT.} {}..
f790: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f7a0: 33 2e 35 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  3.5.1 {.  faults
f7b0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
f7c0: 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64  open.  sqlite3 d
f7d0: 62 20 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a  b :memory:.} {}.
f7e0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 6d 6f 64 65  foreach {tn mode
f7f0: 20 70 6f 73 73 69 62 6c 65 7d 20 7b 0a 20 20 32   possible} {.  2
f800: 20 20 6f 66 66 20 20 20 20 20 20 31 0a 20 20 33    off      1.  3
f810: 20 20 6d 65 6d 6f 72 79 20 20 20 31 0a 20 20 34    memory   1.  4
f820: 20 20 70 65 72 73 69 73 74 20 20 30 0a 20 20 35    persist  0.  5
f830: 20 20 64 65 6c 65 74 65 20 20 20 30 0a 20 20 36    delete   0.  6
f840: 20 20 77 61 6c 20 20 20 20 20 20 30 0a 20 20 37    wal      0.  7
f850: 20 20 74 72 75 6e 63 61 74 65 20 30 0a 7d 20 7b    truncate 0.} {
f860: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
f870: 31 2d 32 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20  1-23.5.$tn.1 {. 
f880: 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47     execsql "PRAG
f890: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f8a0: 3d 20 6f 66 66 22 0a 20 20 20 20 65 78 65 63 73  = off".    execs
f8b0: 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  ql "PRAGMA journ
f8c0: 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22  al_mode = $mode"
f8d0: 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62  .  } [if $possib
f8e0: 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20  le {list $mode} 
f8f0: 7b 6c 69 73 74 20 6f 66 66 7d 5d 0a 20 20 64 6f  {list off}].  do
f900: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f910: 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78  5.$tn.2 {.    ex
f920: 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f  ecsql "PRAGMA jo
f930: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d  urnal_mode = mem
f940: 6f 72 79 22 0a 20 20 20 20 65 78 65 63 73 71 6c  ory".    execsql
f950: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
f960: 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20  _mode = $mode". 
f970: 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65   } [if $possible
f980: 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c   {list $mode} {l
f990: 69 73 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64  ist memory}].}.d
f9a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f9b0: 2e 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .6.1 {.  execsql
f9c0: 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67   {PRAGMA locking
f9d0: 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a  _mode = normal}.
f9e0: 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f  } {exclusive}.do
f9f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fa00: 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.2 {.  execsql 
fa10: 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  {PRAGMA locking_
fa20: 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65  mode = exclusive
fa30: 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a  }.} {exclusive}.
fa40: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
fa50: 33 2e 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  3.6.3 {.  execsq
fa60: 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e  l {PRAGMA lockin
fa70: 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75  g_mode}.} {exclu
fa80: 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61  sive}.do_test pa
fa90: 67 65 72 31 2d 32 33 2e 36 2e 34 20 7b 0a 20 20  ger1-23.6.4 {.  
faa0: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
fab0: 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  main.locking_mod
fac0: 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d  e}.} {exclusive}
fad0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
fae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
faf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64  ------------.#.d
fb20: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34  o_test pager1-24
fb30: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
fb40: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
fb50: 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
fb60: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
fb70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
fb80: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
fb90: 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47  e = 10;.    PRAG
fba0: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
fbb0: 20 46 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54   FULL;.    CREAT
fbc0: 45 20 54 41 42 4c 45 20 78 31 28 78 2c 20 79 2c  E TABLE x1(x, y,
fbd0: 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   z, PRIMARY KEY(
fbe0: 79 2c 20 7a 29 29 3b 0a 20 20 20 20 43 52 45 41  y, z));.    CREA
fbf0: 54 45 20 54 41 42 4c 45 20 78 32 28 78 2c 20 79  TE TABLE x2(x, y
fc00: 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , z, PRIMARY KEY
fc10: 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20 49 4e 53  (y, z));.    INS
fc20: 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55  ERT INTO x2 VALU
fc30: 45 53 28 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ES(a_string(400)
fc40: 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  , a_string(500),
fc50: 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b   a_string(600));
fc60: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
fc70: 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   x2 SELECT a_str
fc80: 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69  ing(600), a_stri
fc90: 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(400), a_strin
fca0: 67 28 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a  g(500) FROM x2;.
fcb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
fcc0: 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  x2 SELECT a_stri
fcd0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
fce0: 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(600), a_string
fcf0: 28 34 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20  (400) FROM x2;. 
fd00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
fd10: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
fd20: 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(400), a_string
fd30: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
fd40: 36 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  600) FROM x2;.  
fd50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
fd60: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
fd70: 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (600), a_string(
fd80: 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35  400), a_string(5
fd90: 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
fda0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
fdb0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
fdc0: 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  500), a_string(6
fdd0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  00), a_string(40
fde0: 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
fdf0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
fe00: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34  ELECT a_string(4
fe10: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30  00), a_string(50
fe20: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
fe30: 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
fe40: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45  NSERT INTO x1 SE
fe50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a  LECT * FROM x2;.
fe60: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
fe70: 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 32 20 7b   pager1-24.1.2 {
fe80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
fe90: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45   BEGIN;.      DE
fea0: 4c 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45  LETE FROM x1 WHE
feb0: 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 7d  RE rowid<32;.  }
fec0: 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  .  recursive_sel
fed0: 65 63 74 20 36 34 20 78 32 0a 7d 20 7b 7d 0a 64  ect 64 x2.} {}.d
fee0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34  o_test pager1-24
fef0: 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
ff00: 20 7b 20 0a 20 20 20 20 20 20 55 50 44 41 54 45   { .      UPDATE
ff10: 20 78 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74   x1 SET z = a_st
ff20: 72 69 6e 67 28 33 30 30 29 20 57 48 45 52 45 20  ring(300) WHERE 
ff30: 72 6f 77 69 64 3e 34 30 3b 0a 20 20 20 20 43 4f  rowid>40;.    CO
ff40: 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41  MMIT;.    PRAGMA
ff50: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
ff60: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
ff70: 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20  nt(*) FROM x1;. 
ff80: 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f   }.} {ok 33}..do
ff90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e  _test pager1-24.
ffa0: 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.4 {.  execsql 
ffb0: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
ffc0: 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x1;.    INSERT
ffd0: 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20   INTO x1 SELECT 
ffe0: 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 42  * FROM x2;.    B
fff0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
10000 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45  TE FROM x1 WHERE
10010 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 20 20 20   rowid<32;.     
10020 20 55 50 44 41 54 45 20 78 31 20 53 45 54 20 7a   UPDATE x1 SET z
10030 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 39 39 29   = a_string(299)
10040 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b   WHERE rowid>40;
10050 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65  .  }.  recursive
10060 5f 73 65 6c 65 63 74 20 36 34 20 78 32 20 7b 64  _select 64 x2 {d
10070 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20  b eval COMMIT}. 
10080 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
10090 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
100a0 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43  check;.    SELEC
100b0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
100c0 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33  x1;.  }.} {ok 33
100d0 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
100e0 31 2d 32 34 2e 31 2e 35 20 7b 0a 20 20 65 78 65  1-24.1.5 {.  exe
100f0 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
10100 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49  E FROM x1;.    I
10110 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45  NSERT INTO x1 SE
10120 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a  LECT * FROM x2;.
10130 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f    }.  recursive_
10140 73 65 6c 65 63 74 20 36 34 20 78 32 20 7b 20 64  select 64 x2 { d
10150 62 20 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54  b eval {CREATE T
10160 41 42 4c 45 20 78 33 28 78 2c 20 79 2c 20 7a 29  ABLE x3(x, y, z)
10170 7d 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  } }.  execsql { 
10180 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 33  SELECT * FROM x3
10190 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   }.} {}..#------
101a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101e0 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ---.#.do_test pa
101f0 67 65 72 31 2d 32 35 2d 31 20 7b 0a 20 20 66 61  ger1-25-1 {.  fa
10200 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
10210 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
10220 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
10230 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
10240 61 62 63 3b 0a 20 20 20 20 20 20 20 20 43 52 45  abc;.        CRE
10250 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
10260 62 29 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41  b);.      ROLLBA
10270 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43  CK TO abc;.    C
10280 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20  OMMIT;.  }.  db 
10290 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 62 72 65 61 6b  close.} {}.break
102a0 70 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20 70 61  point.do_test pa
102b0 67 65 72 31 2d 32 35 2d 32 20 7b 0a 20 20 66 61  ger1-25-2 {.  fa
102c0 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
102d0 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
102e0 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49  ql {.    SAVEPOI
102f0 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20 43 52  NT abc;.      CR
10300 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
10310 20 62 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43   b);.    ROLLBAC
10320 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f  K TO abc;.    CO
10330 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63  MMIT;.  }.  db c
10340 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  lose.} {}..#----
10350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10390 2d 2d 2d 2d 2d 0a 23 20 53 65 63 74 6f 72 2d 73  -----.# Sector-s
103a0 69 7a 65 20 74 65 73 74 73 2e 0a 23 0a 64 6f 5f  ize tests..#.do_
103b0 74 65 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31  test pager1-26.1
103c0 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
103d0 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20  -default 1.  tv 
103e0 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a  sectorsize 4096.
103f0 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
10400 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
10410 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
10420 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
10430 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
10440 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b  page_size = 512;
10450 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
10460 45 20 74 62 6c 28 61 20 50 52 49 4d 41 52 59 20  E tbl(a PRIMARY 
10470 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  KEY, b UNIQUE);.
10480 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
10490 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
104a0 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
104b0 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
104c0 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
104d0 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
104e0 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
104f0 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
10500 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49  ROM tbl;.      I
10510 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
10520 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
10530 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
10540 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
10550 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
10560 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
10570 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
10580 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
10590 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
105a0 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
105b0 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
105c0 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
105d0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
105e0 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61  NTO tbl SELECT a
105f0 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
10600 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
10610 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  tbl;.      INSER
10620 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
10630 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
10640 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
10650 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
10660 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
10670 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
10680 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10690 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 43   FROM tbl;.    C
106a0 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
106b0 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
106c0 70 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20  pager1-26.1 {.  
106d0 55 50 44 41 54 45 20 74 62 6c 20 53 45 54 20 62  UPDATE tbl SET b
106e0 20 3d 20 61 5f 73 74 72 69 6e 67 28 35 35 30 29   = a_string(550)
106f0 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a  ;.} {}.db close.
10700 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d  tv delete..#----
10710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10750 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20  -----.#.do_test 
10760 70 61 67 65 72 31 2e 32 37 2e 31 20 7b 0a 20 20  pager1.27.1 {.  
10770 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
10780 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c  and_reopen.  sql
10790 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f  ite3_pager_refco
107a0 75 6e 74 73 20 64 62 0a 20 20 65 78 65 63 73 71  unts db.  execsq
107b0 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
107c0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
107d0 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a  E t1(a, b);.  }.
107e0 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f    sqlite3_pager_
107f0 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65  refcounts db.  e
10800 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  xecsql COMMIT.} 
10810 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
10820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
10860 20 54 65 73 74 20 74 68 61 74 20 61 74 74 65 6d   Test that attem
10870 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20 61 20  pting to open a 
10880 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10890 6e 20 77 69 74 68 20 0a 23 20 6c 6f 63 6b 69 6e  n with .# lockin
108a0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
108b0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 66 61 69   in WAL mode fai
108c0 6c 73 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ls if there are 
108d0 6f 74 68 65 72 20 63 6c 69 65 6e 74 73 20 6f 6e  other clients on
108e0 20 0a 23 20 74 68 65 20 73 61 6d 65 20 64 61 74   .# the same dat
108f0 61 62 61 73 65 2e 0a 23 0a 63 61 74 63 68 20 7b  abase..#.catch {
10900 20 64 62 20 63 6c 6f 73 65 20 7d 0a 69 66 63 61   db close }.ifca
10910 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f  pable wal {.  do
10920 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73  _multiclient_tes
10930 74 20 74 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65  t tn {.    do_te
10940 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
10950 2e 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20  .1 {.      sql1 
10960 7b 20 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d  { .        PRAGM
10970 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
10980 20 57 41 4c 3b 0a 20 20 20 20 20 20 20 20 43 52   WAL;.        CR
10990 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
109a0 20 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53   b);.        INS
109b0 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
109c0 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
109d0 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c      }.    } {wal
109e0 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  }.    do_test pa
109f0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20  ger1-28.$tn.2 { 
10a00 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
10a10 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 61 20 62  FROM t1 } } {a b
10a20 7d 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70  }..    do_test p
10a30 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b  ager1-28.$tn.3 {
10a40 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c   sql1 { PRAGMA l
10a50 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
10a60 75 73 69 76 65 20 7d 20 7d 20 7b 65 78 63 6c 75  usive } } {exclu
10a70 73 69 76 65 7d 0a 20 20 20 20 64 6f 5f 74 65 73  sive}.    do_tes
10a80 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
10a90 34 20 7b 20 0a 20 20 20 20 20 20 63 73 71 6c 31  4 { .      csql1
10aa0 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54   { BEGIN; INSERT
10ab0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
10ac0 27 63 27 2c 20 27 64 27 29 3b 20 7d 0a 20 20 20  'c', 'd'); }.   
10ad0 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
10ae0 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 20 20  is locked}}.    
10af0 63 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73  code2 { db2 clos
10b00 65 20 3b 20 73 71 6c 69 74 65 33 20 64 62 32 20  e ; sqlite3 db2 
10b10 74 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 64 6f  test.db }.    do
10b20 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10b30 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 73  $tn.4 { .      s
10b40 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  ql1 { INSERT INT
10b50 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c  O t1 VALUES('c',
10b60 20 27 64 27 29 3b 20 43 4f 4d 4d 49 54 20 7d 0a   'd'); COMMIT }.
10b70 20 20 20 20 7d 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a      } {}.  }.}..
10b80 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
10b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e 6f 72  ----------.# Nor
10bd0 6d 61 6c 6c 79 2c 20 77 68 65 6e 20 63 68 61 6e  mally, when chan
10be0 67 69 6e 67 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ging from journa
10bf0 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 74  l_mode=PERSIST t
10c00 6f 20 44 45 4c 45 54 45 20 74 68 65 20 70 61 67  o DELETE the pag
10c10 65 72 0a 23 20 61 74 74 65 6d 70 74 73 20 74 6f  er.# attempts to
10c20 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
10c30 6e 61 6c 20 66 69 6c 65 2e 20 48 6f 77 65 76 65  nal file. Howeve
10c40 72 2c 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 20  r, if it cannot 
10c50 6f 62 74 61 69 6e 20 61 0a 23 20 52 45 53 45 52  obtain a.# RESER
10c60 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
10c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
10c80 68 69 73 20 73 74 65 70 20 69 73 20 73 6b 69 70  his step is skip
10c90 70 65 64 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63  ped..#.do_multic
10ca0 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a  lient_test tn {.
10cb0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10cc0 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  -28.$tn.1 {.    
10cd0 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52  sql1 { .      PR
10ce0 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
10cf0 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
10d00 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10d10 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
10d20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
10d30 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
10d40 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73  .    }.  } {pers
10d50 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ist}.  do_test p
10d60 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b  ager1-28.$tn.2 {
10d70 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
10d80 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
10d90 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10da0 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c  1-28.$tn.3 { sql
10db0 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  1 { PRAGMA journ
10dc0 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
10dd0 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f   } } delete.  do
10de0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10df0 24 74 6e 2e 34 20 7b 20 66 69 6c 65 20 65 78 69  $tn.4 { file exi
10e00 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
10e10 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65  nal } 0..  do_te
10e20 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
10e30 2e 35 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20  .5 {.    sql1 { 
10e40 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
10e50 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
10e60 53 49 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45  SIST;.      INSE
10e70 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
10e80 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20  S('c', 'd');.   
10e90 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d   }.  } {persist}
10ea0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10eb0 31 2d 32 38 2e 24 74 6e 2e 36 20 7b 20 66 69 6c  1-28.$tn.6 { fil
10ec0 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
10ed0 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64  -journal } 1.  d
10ee0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
10ef0 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c  .$tn.7 {.    sql
10f00 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52  2 { BEGIN; INSER
10f10 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
10f20 28 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20  ('e', 'f'); }.  
10f30 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
10f40 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 38 20 20  ager1-28.$tn.8  
10f50 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
10f60 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
10f70 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  1.  do_test page
10f80 72 31 2d 32 38 2e 24 74 6e 2e 39 20 20 7b 20 73  r1-28.$tn.9  { s
10f90 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  ql1 { PRAGMA jou
10fa0 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
10fb0 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20  TE } } delete.  
10fc0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10fd0 38 2e 24 74 6e 2e 31 30 20 7b 20 66 69 6c 65 20  8.$tn.10 { file 
10fe0 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
10ff0 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f  ournal } 1..  do
11000 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11010 24 74 6e 2e 31 31 20 7b 20 73 71 6c 32 20 43 4f  $tn.11 { sql2 CO
11020 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  MMIT } {}.  do_t
11030 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
11040 6e 2e 31 32 20 7b 20 66 69 6c 65 20 65 78 69 73  n.12 { file exis
11050 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
11060 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73  al } 0..  do_tes
11070 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e  t pager1-28-$tn.
11080 31 33 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b  13 {.    code1 {
11090 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 5b 64 62   set channel [db
110a0 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f   incrblob -reado
110b0 6e 6c 79 20 74 31 20 61 20 32 5d 20 7d 0a 20 20  nly t1 a 2] }.  
110c0 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50    sql1 {.      P
110d0 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
110e0 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
110f0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11100 74 31 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27  t1 VALUES('g', '
11110 68 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  h');.    }.  } {
11120 70 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65  persist}.  do_te
11130 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11140 2e 31 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .14 { file exist
11150 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
11160 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20  l } 1.  do_test 
11170 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 35  pager1-28.$tn.15
11180 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45   {.    sql2 { BE
11190 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  GIN; INSERT INTO
111a0 20 74 31 20 56 41 4c 55 45 53 28 27 65 27 2c 20   t1 VALUES('e', 
111b0 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20  'f'); }.  } {}. 
111c0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
111d0 32 38 2e 24 74 6e 2e 31 36 20 7b 20 73 71 6c 31  28.$tn.16 { sql1
111e0 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
111f0 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
11200 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f  } } delete.  do_
11210 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11220 74 6e 2e 31 37 20 7b 20 66 69 6c 65 20 65 78 69  tn.17 { file exi
11230 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
11240 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65  nal } 1..  do_te
11250 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11260 2e 31 37 20 7b 20 63 73 71 6c 32 20 7b 20 43 4f  .17 { csql2 { CO
11270 4d 4d 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74  MMIT } } {1 {dat
11280 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
11290 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
112a0 72 31 2d 32 38 2d 24 74 6e 2e 31 38 20 7b 20 63  r1-28-$tn.18 { c
112b0 6f 64 65 31 20 7b 20 72 65 61 64 20 24 63 68 61  ode1 { read $cha
112c0 6e 6e 65 6c 20 7d 20 7d 20 63 0a 20 20 64 6f 5f  nnel } } c.  do_
112d0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24  test pager1-28-$
112e0 74 6e 2e 31 39 20 7b 20 63 6f 64 65 31 20 7b 20  tn.19 { code1 { 
112f0 63 6c 6f 73 65 20 24 63 68 61 6e 6e 65 6c 20 7d  close $channel }
11300 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
11310 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 30  pager1-28.$tn.20
11320 20 7b 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54   { sql2 { COMMIT
11330 20 7d 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65   } } {}.}..do_te
11340 73 74 20 70 61 67 65 72 31 2d 32 39 2e 31 20 7b  st pager1-29.1 {
11350 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
11360 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
11370 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
11380 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
11390 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d   1024;.    PRAGM
113a0 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
113b0 66 75 6c 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41  full;.    PRAGMA
113c0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
113d0 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 43 52 45  clusive;.    CRE
113e0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
113f0 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
11400 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
11410 20 32 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20   2);.  }.  file 
11420 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b  size test.db.} [
11430 65 78 70 72 20 31 30 32 34 2a 33 5d 0a 64 6f 5f  expr 1024*3].do_
11440 74 65 73 74 20 70 61 67 65 72 31 2d 32 39 2e 32  test pager1-29.2
11450 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
11460 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
11470 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  ize = 4096;.    
11480 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 20 20 66 69  VACUUM;.  }.  fi
11490 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
114a0 7d 20 5b 65 78 70 72 20 34 30 39 36 2a 33 5d 0a  } [expr 4096*3].
114b0 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.