/ Hex Artifact Content
Login

Artifact 1b630b3248c7d28862fe9e190cfe52234b502504:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e 6f 74 20  n.tcl..# Do not 
0210: 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 20  use a codec for 
0220: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0230: 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 62  le, as the datab
0240: 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d 61  ase file is.# ma
0250: 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 74  nipulated direct
0260: 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 72  ly using tcl scr
0270: 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 20  ipts (using the 
0280: 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 6f  [hexio_write] co
0290: 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f 74  mmand)..#.do_not
02a0: 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 20  _use_codec..#.# 
02b0: 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 74  pager1-1.*: Test
02c0: 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 6c   inter-process l
02d0: 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 20  ocking (clients 
02e0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
02f0: 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 65  esses)..#.# page
0300: 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e 74  r1-2.*: Test int
0310: 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b 69  ra-process locki
0320: 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c 69  ng (multiple cli
0330: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ents in this pro
0340: 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 72  cess)..#.# pager
0350: 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e 74  1-3.*: Savepoint
0360: 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a   related tests..
0370: 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a 20  #.# pager1-4.*: 
0380: 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c 61  Hot-journal rela
0390: 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 70  ted tests..#.# p
03a0: 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 73  ager1-5.*: Cases
03b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c 74   related to mult
03c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
03d0: 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a 20  #.# pager1-6.*: 
03e0: 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f  Cases related to
03f0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
0400: 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 67  e_count".#.# pag
0410: 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 73  er1-7.*: Cases s
0420: 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47  pecific to "PRAG
0430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0440: 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 61  TRUNCATE".#.# pa
0450: 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 20  ger1-8.*: Cases 
0460: 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  using temporary 
0470: 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
0480: 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  tabases..#.# pag
0490: 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 72  er1-9.*: Tests r
04a0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  elated to the ba
04b0: 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 61  ckup API..#.# pa
04c0: 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 20  ger1-10.*: Test 
04d0: 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 64  that the assumed
04e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
04f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d 69  tor-size is limi
0500: 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ted to.#        
0510: 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 20        64KB..#.# 
0520: 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 73  pager1-12.*: Tes
0530: 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 52  ts involving "PR
0540: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
0550: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a 3a  #.# pager1-13.*:
0560: 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 20   Cases specific 
0570: 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  to "PRAGMA journ
0580: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
0590: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e 2a  .#.# pager1-14.*
05a0: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
05b0: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
05c0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 0a  nal_mode=OFF".#.
05d0: 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 56  # pager1-15.*: V
05e0: 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76  arying sqlite3_v
05f0: 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 20  fs.szOsFile.#.# 
0600: 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 72  pager1-16.*: Var
0610: 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ying sqlite3_vfs
0620: 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 20  .mxPathname.#.# 
0630: 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 73  pager1-17.*: Tes
0640: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 50  ts related to "P
0650: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
0660: 6f 63 6b 22 0a 23 0a 23 20 70 61 67 65 72 31 2d  ock".#.# pager1-
0670: 31 38 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  18.*: Test that 
0680: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
0690: 72 65 73 70 6f 6e 64 73 20 63 6f 72 72 65 63 74  responds correct
06a0: 6c 79 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ly if the b-tree
06b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
06c0: 72 65 71 75 65 73 74 73 20 61 6e 20 69 6e 76 61  requests an inva
06d0: 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
06e0: 28 64 75 65 20 74 6f 20 64 62 20 63 6f 72 72 75  (due to db corru
06f0: 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72 6f 63 20  ption)..#..proc 
0700: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
0710: 20 7b 69 64 20 74 61 62 6c 65 20 7b 73 63 72 69   {id table {scri
0720: 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73 65 74 20  pt {}}} {.  set 
0730: 63 6e 74 20 30 0a 20 20 64 62 20 65 76 61 6c 20  cnt 0.  db eval 
0740: 22 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  "SELECT rowid, *
0750: 20 46 52 4f 4d 20 24 74 61 62 6c 65 20 57 48 45   FROM $table WHE
0760: 52 45 20 72 6f 77 69 64 20 3d 20 28 24 69 64 2d  RE rowid = ($id-
0770: 31 29 22 20 7b 0a 20 20 20 20 72 65 63 75 72 73  1)" {.    recurs
0780: 69 76 65 5f 73 65 6c 65 63 74 20 24 72 6f 77 69  ive_select $rowi
0790: 64 20 24 74 61 62 6c 65 20 24 73 63 72 69 70 74  d $table $script
07a0: 0a 20 20 20 20 69 6e 63 72 20 63 6e 74 0a 20 20  .    incr cnt.  
07b0: 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d 3d 30 7d  }.  if {$cnt==0}
07c0: 20 7b 20 65 76 61 6c 20 24 73 63 72 69 70 74 20   { eval $script 
07d0: 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74 72 69 6e  }.}..set a_strin
07e0: 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70 72 6f 63  g_counter 1.proc
07f0: 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d 20 7b 0a   a_string {n} {.
0800: 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74 72 69 6e    global a_strin
0810: 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69 6e 63 72  g_counter.  incr
0820: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
0830: 72 0a 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65  r.  string range
0840: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
0850: 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  "${a_string_coun
0860: 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20 24 6e 0a  ter}." $n] 1 $n.
0870: 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  }.db func a_stri
0880: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 64 6f 5f  ng a_string..do_
0890: 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
08a0: 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72 65 61 74   tn {..  # Creat
08b0: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
08c0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
08d0: 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  using connection
08e0: 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 0a 20 20   [db]. Check .  
08f0: 23 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  # that connectio
0900: 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62  ns [db2] and [db
0910: 33 5d 20 63 61 6e 20 73 65 65 20 74 68 65 20 73  3] can see the s
0920: 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65 6e  chema and conten
0930: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0940: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 20 7b 0a   pager1-$tn.1 {.
0950: 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20      sql1 {.     
0960: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0970: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
0980: 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  b);.      CREATE
0990: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
09a0: 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
09b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
09c0: 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e 53 45 52  1, 'one'); INSER
09d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
09e0: 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20  (2, 'two');.    
09f0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0a00: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 20  st pager1-$tn.2 
0a10: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0a20: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0a30: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0a40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a50: 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  .3 { sql3 { SELE
0a60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a70: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 0a   {1 one 2 two}..
0a80: 20 20 23 20 4f 70 65 6e 20 61 20 74 72 61 6e 73    # Open a trans
0a90: 61 63 74 69 6f 6e 20 61 6e 64 20 61 64 64 20 61  action and add a
0aa0: 20 72 6f 77 20 75 73 69 6e 67 20 5b 64 62 5d 2e   row using [db].
0ab0: 20 54 68 69 73 20 70 75 74 73 20 5b 64 62 5d 20   This puts [db] 
0ac0: 69 6e 0a 20 20 23 20 52 45 53 45 52 56 45 44 20  in.  # RESERVED 
0ad0: 73 74 61 74 65 2e 20 43 68 65 63 6b 20 74 68 61  state. Check tha
0ae0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64  t connections [d
0af0: 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 20 63 61  b2] and [db3] ca
0b00: 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72 65 61 64  n still.  # read
0b10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
0b20: 6e 74 65 6e 74 20 61 73 20 69 74 20 77 61 73 20  ntent as it was 
0b30: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
0b40: 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 23 20 6f  action was.  # o
0b50: 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73 68 6f 75  pened. [db] shou
0b60: 6c 64 20 73 65 65 20 74 68 65 20 69 6e 73 65 72  ld see the inser
0b70: 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a 20 20 64  ted row..  #.  d
0b80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
0b90: 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b  n.4 {.    sql1 {
0ba0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
0bb0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0bc0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27  O t1 VALUES(3, '
0bd0: 74 68 72 65 65 27 29 3b 0a 20 20 20 20 7d 0a 20  three');.    }. 
0be0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0bf0: 70 61 67 65 72 31 2d 24 74 6e 2e 35 20 7b 20 73  pager1-$tn.5 { s
0c00: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
0c10: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
0c20: 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f 5f 74 65  e 2 two}.  do_te
0c30: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 37 20  st pager1-$tn.7 
0c40: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
0c50: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c60: 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72   one 2 two 3 thr
0c70: 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 73 74  ee}..  # [db] st
0c80: 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ill has an open 
0c90: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
0ca0: 6e 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  n. Check that th
0cb0: 69 73 20 70 72 65 76 65 6e 74 73 0a 20 20 23 20  is prevents.  # 
0cc0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
0cd0: 73 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 20  s (specifically 
0ce0: 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77 72 69 74  [db2]) from writ
0cf0: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
0d00: 61 73 65 2e 0a 20 20 23 0a 20 20 23 20 45 76 65  ase..  #.  # Eve
0d10: 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70 65 6e 73  n if [db2] opens
0d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
0d30: 69 72 73 74 2c 20 69 74 20 6d 61 79 20 6e 6f 74  irst, it may not
0d40: 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20   write to the.  
0d50: 23 20 64 61 74 61 62 61 73 65 2e 20 41 66 74 65  # database. Afte
0d60: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
0d70: 20 77 72 69 74 65 20 74 68 65 20 64 62 20 77 69   write the db wi
0d80: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
0d90: 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32 5d 20 69  on, .  # [db2] i
0da0: 73 20 6c 65 66 74 20 77 69 74 68 20 61 6e 20 6f  s left with an o
0db0: 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
0dc0: 20 62 75 74 20 6e 6f 74 20 61 20 72 65 61 64 2d   but not a read-
0dd0: 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74 68 65 20  lock on.  # the 
0de0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 53  main database. S
0df0: 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 70 72  o it does not pr
0e00: 65 76 65 6e 74 20 5b 64 62 5d 20 66 72 6f 6d 20  event [db] from 
0e10: 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20 20 23 0a  committing..  #.
0e20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0e30: 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20 20 63 73  -$tn.8 { .    cs
0e40: 71 6c 32 20 7b 20 55 50 44 41 54 45 20 74 31 20  ql2 { UPDATE t1 
0e50: 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d  SET a = a + 10 }
0e60: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
0e70: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
0e80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0e90: 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63 73 71 6c  tn.9 { .    csql
0ea0: 32 20 7b 20 0a 20 20 20 20 20 20 42 45 47 49 4e  2 { .      BEGIN
0eb0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
0ec0: 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30  1 SET a = a + 10
0ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  ;.    }.  } {1 {
0ee0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
0ef0: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
0f00: 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20 74  db] commit its t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 43 68 65  ransactions. Che
0f20: 63 6b 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6e  ck the other con
0f30: 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a 20 20 23  nections can.  #
0f40: 20 6e 6f 77 20 73 65 65 20 74 68 65 20 6e 65 77   now see the new
0f50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
0f60: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0f70: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 30 20 7b   pager1-$tn.10 {
0f80: 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql1 { COMMIT }
0f90: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0fa0: 70 61 67 65 72 31 2d 24 74 6e 2e 31 31 20 7b 20  pager1-$tn.11 { 
0fb0: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql1 { SELECT * 
0fc0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
0fd0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
0fe0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
0ff0: 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73 71 6c 32  r1-$tn.12 { sql2
1000: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1010: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1020: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20   two 3 three}.  
1030: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1040: 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20 7b 20 53  tn.13 { sql3 { S
1050: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1060: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
1070: 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 43   3 three}..  # C
1080: 68 65 63 6b 20 74 68 61 74 2c 20 61 73 20 6e 6f  heck that, as no
1090: 74 65 64 20 61 62 6f 76 65 2c 20 5b 64 62 32 5d  ted above, [db2]
10a0: 20 72 65 61 6c 6c 79 20 64 69 64 20 6b 65 65 70   really did keep
10b0: 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   an open transac
10c0: 74 69 6f 6e 0a 20 20 23 20 61 66 74 65 72 20 74  tion.  # after t
10d0: 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
10e0: 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
10f0: 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a 20 20 64   failed..  #.  d
1100: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1110: 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.14 { .    csql
1120: 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a 20 20 7d  2 { BEGIN } .  }
1130: 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61 72   {1 {cannot star
1140: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1150: 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1160: 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  tion}}.  do_test
1170: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b   pager1-$tn.15 {
1180: 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42 41 43 4b   sql2 { ROLLBACK
1190: 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61 76   } } {}..  # Hav
11a0: 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 74  e [db2] open a t
11b0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74  ransaction and t
11c0: 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ake a read-lock 
11d0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
11e0: 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20  .  # Check that 
11f0: 74 68 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64  this prevents [d
1200: 62 5d 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  b] from writing 
1210: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1220: 28 6f 75 74 73 69 64 65 0a 20 20 23 20 6f 66 20  (outside.  # of 
1230: 61 6e 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  any transaction)
1240: 2e 20 41 66 74 65 72 20 74 68 69 73 20 66 61 69  . After this fai
1250: 6c 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 5b  ls, check that [
1260: 64 62 33 5d 20 63 61 6e 20 72 65 61 64 0a 20 20  db3] can read.  
1270: 23 20 74 68 65 20 64 62 20 28 73 68 6f 77 69 6e  # the db (showin
1280: 67 20 74 68 61 74 20 5b 64 62 5d 20 64 69 64 20  g that [db] did 
1290: 6e 6f 74 20 74 61 6b 65 20 61 20 50 45 4e 44 49  not take a PENDI
12a0: 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29 0a 20 20  NG lock etc.).  
12b0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  #.  do_test page
12c0: 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a 20 20 20  r1-$tn.15 { .   
12d0: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53   sql2 { BEGIN; S
12e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
12f0: 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32 20   }.  } {1 one 2 
1300: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64  two 3 three}.  d
1310: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1320: 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.16 { .    csql
1330: 31 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  1 { UPDATE t1 SE
1340: 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d 0a 20  T a = a + 10 }. 
1350: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
1360: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
1370: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1380: 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c  .17 { sql3 { SEL
1390: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
13a0: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
13b0: 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 54 68 69   three}..  # Thi
13c0: 73 20 74 69 6d 65 2c 20 68 61 76 65 20 5b 64 62  s time, have [db
13d0: 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63  ] open a transac
13e0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 77 72 69 74  tion before writ
13f0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1400: 2e 0a 20 20 23 20 54 68 69 73 20 77 6f 72 6b 73  ..  # This works
1410: 20 2d 20 5b 64 62 5d 20 67 65 74 73 20 61 20 52   - [db] gets a R
1420: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 69  ESERVED lock whi
1430: 63 68 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 66  ch does not conf
1440: 6c 69 63 74 20 77 69 74 68 0a 20 20 23 20 74 68  lict with.  # th
1450: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 5b 64  e SHARED lock [d
1460: 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e 67 2e 0a  b2] is holding..
1470: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61    #.  do_test pa
1480: 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b 20 0a 20  ger1-$tn.18 { . 
1490: 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20     sql1 { .     
14a0: 20 42 45 47 49 4e 3b 20 20 0a 20 20 20 20 20 20   BEGIN;  .      
14b0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
14c0: 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20 20 20 7d  = a + 10; .    }
14d0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
14e0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2d 31 39 20  t pager1-$tn-19 
14f0: 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 50 52  { .    sql1 { PR
1500: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
1510: 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 72 65   } .  } {main re
1520: 73 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73  served temp clos
1530: 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ed}.  do_test pa
1540: 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b 20 0a 20  ger1-$tn-20 { . 
1550: 20 20 20 73 71 6c 32 20 7b 20 50 52 41 47 4d 41     sql2 { PRAGMA
1560: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20 0a   lock_status } .
1570: 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61 72 65 64    } {main shared
1580: 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 20   temp closed}.. 
1590: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c   # Check that al
15a0: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  l connections ca
15b0: 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74 68 65  n still read the
15c0: 20 64 61 74 61 62 61 73 65 2e 20 4f 6e 6c 79 20   database. Only 
15d0: 5b 64 62 5d 20 73 65 65 73 0a 20 20 23 20 74 68  [db] sees.  # th
15e0: 65 20 75 70 64 61 74 65 64 20 63 6f 6e 74 65 6e  e updated conten
15f0: 74 20 28 61 73 20 74 68 65 20 74 72 61 6e 73 61  t (as the transa
1600: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  ction has not be
1610: 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 79 65 74  en committed yet
1620: 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  )..  #.  do_test
1630: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 31 20 7b   pager1-$tn.21 {
1640: 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a   sql1 { SELECT *
1650: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 31   FROM t1 } } {11
1660: 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33 20 74   one 12 two 13 t
1670: 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  hree}.  do_test 
1680: 70 61 67 65 72 31 2d 24 74 6e 2e 32 32 20 7b 20  pager1-$tn.22 { 
1690: 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
16a0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
16b0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
16c0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
16d0: 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73 71 6c 33  r1-$tn.23 { sql3
16e0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
16f0: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1700: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20   two 3 three}.. 
1710: 20 23 20 42 65 63 61 75 73 65 20 5b 64 62 32 5d   # Because [db2]
1720: 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 53   still has the S
1730: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b 64 62 5d  HARED lock, [db]
1740: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   is unable to co
1750: 6d 6d 69 74 20 74 68 65 0a 20 20 23 20 74 72 61  mmit the.  # tra
1760: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
1770: 74 72 69 65 73 2c 20 61 6e 20 65 72 72 6f 72 20  tries, an error 
1780: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1790: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  the connection .
17a0: 20 20 23 20 75 70 67 72 61 64 65 73 20 74 6f 20    # upgrades to 
17b0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
17c0: 20 20 23 0a 20 20 23 20 4f 6e 63 65 20 74 68 69    #.  # Once thi
17d0: 73 20 68 61 70 70 65 6e 73 2c 20 5b 64 62 5d 20  s happens, [db] 
17e0: 63 61 6e 20 72 65 61 64 20 74 68 65 20 64 61 74  can read the dat
17f0: 61 62 61 73 65 20 61 6e 64 20 73 65 65 20 74 68  abase and see th
1800: 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2c 0a 20  e new content,. 
1810: 20 23 20 5b 64 62 32 5d 20 28 73 74 69 6c 6c 20   # [db2] (still 
1820: 68 6f 6c 64 69 6e 67 20 53 48 41 52 45 44 29 20  holding SHARED) 
1830: 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74  can still read t
1840: 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 2c 20  he old content, 
1850: 62 75 74 20 5b 64 62 33 5d 0a 20 20 23 20 28 6e  but [db3].  # (n
1860: 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c  ot holding any l
1870: 6f 63 6b 29 20 69 73 20 70 72 65 76 65 6e 74 65  ock) is prevente
1880: 64 20 62 79 20 5b 64 62 5d 27 73 20 50 45 4e 44  d by [db]'s PEND
1890: 49 4e 47 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ING from reading
18a0: 0a 20 20 23 20 74 68 65 20 64 61 74 61 62 61 73  .  # the databas
18b0: 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  e..  #.  do_test
18c0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 34 20 7b   pager1-$tn.24 {
18d0: 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20   csql1 { COMMIT 
18e0: 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  } } {1 {database
18f0: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
1900: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1910: 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73 71 6c 31  n-25 { .    sql1
1920: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73   { PRAGMA lock_s
1930: 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61  tatus } .  } {ma
1940: 69 6e 20 70 65 6e 64 69 6e 67 20 74 65 6d 70 20  in pending temp 
1950: 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73  closed}.  do_tes
1960: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 36 20  t pager1-$tn.26 
1970: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
1980: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
1990: 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33  11 one 12 two 13
19a0: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
19b0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37 20  t pager1-$tn.27 
19c0: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
19d0: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
19e0: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
19f0: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1a00: 61 67 65 72 31 2d 24 74 6e 2e 32 38 20 7b 20 63  ager1-$tn.28 { c
1a10: 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql3 { SELECT * 
1a20: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b  FROM t1 } } {1 {
1a30: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
1a40: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
1a50: 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20  db2] commit its 
1a60: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1a70: 2c 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  , releasing the 
1a80: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 74 0a 20  SHARED lock it. 
1a90: 20 23 20 69 73 20 68 6f 6c 64 69 6e 67 2e 20 4e   # is holding. N
1aa0: 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b 64 62 32  ow, neither [db2
1ab0: 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d 61 79 20  ] nor [db3] may 
1ac0: 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1ad0: 65 20 28 61 73 20 5b 64 62 5d 0a 20 20 23 20 69  e (as [db].  # i
1ae0: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
1af0: 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20 20 23 0a  a PENDING)..  #.
1b00: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1b10: 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c 32 20 7b  -$tn.29 { sql2 {
1b20: 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20   COMMIT } } {}. 
1b30: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b40: 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c 32 20 7b  $tn.30 { csql2 {
1b50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1b60: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1b70: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
1b80: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b90: 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c 33 20 7b  $tn.31 { csql3 {
1ba0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1bb0: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1bc0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a  se is locked}}..
1bd0: 20 20 23 20 5b 64 62 5d 20 69 73 20 6e 6f 77 20    # [db] is now 
1be0: 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20 74  able to commit t
1bf0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
1c00: 4f 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61 63  Once the transac
1c10: 74 69 6f 6e 20 69 73 20 0a 20 20 23 20 63 6f 6d  tion is .  # com
1c20: 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74 68 72 65  mitted, all thre
1c30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  e connections ca
1c40: 6e 20 72 65 61 64 20 74 68 65 20 6e 65 77 20 63  n read the new c
1c50: 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f  ontent..  #.  do
1c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1c70: 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20 55 50 44  .25 { sql1 { UPD
1c80: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61  ATE t1 SET a = a
1c90: 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f  +10 } } {}.  do_
1ca0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1cb0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d  26 { sql1 { COMM
1cc0: 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  IT } } {}.  do_t
1cd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1ce0: 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  7 { sql1 { SELEC
1cf0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
1d00: 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32  {21 one 22 two 2
1d10: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
1d20: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37  st pager1-$tn.27
1d30: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1d40: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1d50: 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33  21 one 22 two 23
1d60: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1d70: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1d80: 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20  { sql3 { SELECT 
1d90: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 32  * FROM t1 } } {2
1da0: 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20  1 one 22 two 23 
1db0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 49 6e 73 74  three}..  # Inst
1dc0: 61 6c 6c 20 61 20 62 75 73 79 2d 68 61 6e 64 6c  all a busy-handl
1dd0: 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  er for connectio
1de0: 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20 20 73 65  n [db]..  #.  se
1df0: 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69 73 74 5d  t ::nbusy [list]
1e00: 0a 20 20 70 72 6f 63 20 62 75 73 79 20 7b 6e 7d  .  proc busy {n}
1e10: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a   {.    lappend :
1e20: 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20 20 69 66  :nbusy $n.    if
1e30: 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c 32 20 43   {$n>5} { sql2 C
1e40: 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72 65 74 75  OMMIT }.    retu
1e50: 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62 20 62 75  rn 0.  }.  db bu
1e60: 73 79 20 62 75 73 79 0a 0a 20 20 64 6f 5f 74 65  sy busy..  do_te
1e70: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 39  st pager1-$tn.29
1e80: 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 42   { .    sql1 { B
1e90: 45 47 49 4e 20 3b 20 49 4e 53 45 52 54 20 49 4e  EGIN ; INSERT IN
1ea0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 27  TO t1 VALUES('x'
1eb0: 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d 20 7b 7d  , 'y') } .  } {}
1ec0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1ed0: 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20 20 20 20  1-$tn.30 { .    
1ee0: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20 53  sql2 { BEGIN ; S
1ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1f00: 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e 65 20 32  } .  } {21 one 2
1f10: 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a  2 two 23 three}.
1f20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1f30: 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c 31 20 43  -$tn.31 { sql1 C
1f40: 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f  OMMIT } {}.  do_
1f50: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1f60: 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62 75 73 79  32 { set ::nbusy
1f70: 20 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35 20   } {0 1 2 3 4 5 
1f80: 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  6}.}..#---------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 0a 23 20 53 61 76 65 70 6f 69 6e 74 20 72 65 6c  .# Savepoint rel
1fe0: 61 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e  ated test cases.
1ff0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 33 2e 31 2e  .#.# pager1-3.1.
2000: 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20 73 61 76  2.*: Force a sav
2010: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
2020: 74 6f 20 63 61 75 73 65 20 74 68 65 20 64 61 74  to cause the dat
2030: 61 62 61 73 65 20 66 69 6c 65 0a 23 20 20 20 20  abase file.#    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20               to 
2050: 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67 65 72 31  grow..#.# pager1
2060: 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65 20 61 20  -3.1.3.*: Use a 
2070: 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
2080: 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f  in synchronous=o
2090: 66 66 20 6d 6f 64 65 20 61 73 20 70 61 72 74 0a  ff mode as part.
20a0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
20b0: 20 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74    of a savepoint
20c0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 0a 64 6f   rollback..# .do
20d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31  _test pager1-3.1
20e0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
20f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
2100: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
2110: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2120: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
2130: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
2140: 54 41 42 4c 45 20 63 6f 75 6e 74 65 72 28 0a 20  TABLE counter(. 
2150: 20 20 20 20 20 69 20 43 48 45 43 4b 20 28 69 3c       i CHECK (i<
2160: 35 29 2c 20 0a 20 20 20 20 20 20 75 20 43 48 45  5), .      u CHE
2170: 43 4b 20 28 75 3c 31 30 29 0a 20 20 20 20 29 3b  CK (u<10).    );
2180: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2190: 20 63 6f 75 6e 74 65 72 20 56 41 4c 55 45 53 28   counter VALUES(
21a0: 30 2c 20 30 29 3b 0a 20 20 20 20 43 52 45 41 54  0, 0);.    CREAT
21b0: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 41 46  E TRIGGER tr1 AF
21c0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
21d0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
21e0: 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20  ATE counter SET 
21f0: 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20 45 4e 44  i = i+1;.    END
2200: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
2210: 47 47 45 52 20 74 72 32 20 41 46 54 45 52 20 55  GGER tr2 AFTER U
2220: 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47 49  PDATE ON t1 BEGI
2230: 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 63  N.      UPDATE c
2240: 6f 75 6e 74 65 72 20 53 45 54 20 75 20 3d 20 75  ounter SET u = u
2250: 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  +1;.    END;.  }
2260: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
2270: 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74  ECT * FROM count
2280: 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a 0a 64 6f  er }.} {0 0}..do
2290: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
22a0: 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a 20 20 50  ger1-3.1.2 {.  P
22b0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
22c0: 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a   = 10;.  BEGIN;.
22d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
22e0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
22f0: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2300: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2310: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e  t1 VALUES(2, ran
2320: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2340: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61 6e  t1 VALUES(3, ran
2350: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2360: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2370: 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20 7b 33 20  M counter;.} {3 
2380: 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  0}.do_catchsql_t
2390: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31 2e 33  est pager1-3.1.3
23a0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
23b0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 33  TO t1 SELECT a+3
23c0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
23d0: 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 31 20  0) FROM t1.} {1 
23e0: 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  {constraint fail
23f0: 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ed}}.do_execsql_
2400: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 34 20  test pager1-3.4 
2410: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
2420: 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20 30 7d 0a  counter } {3 0}.
2430: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2440: 70 61 67 65 72 31 2d 33 2e 35 20 7b 20 53 45 4c  pager1-3.5 { SEL
2450: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 7d 20  ECT a FROM t1 } 
2460: 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78 65 63 73  {1 2 3}.do_execs
2470: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2480: 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d  .6 { COMMIT } {}
2490: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71  ..foreach {tn sq
24a0: 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20 20 7b 20  l tcl} {.  7  { 
24b0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
24c0: 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50 52  us = NORMAL ; PR
24d0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20  AGMA temp_store 
24e0: 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74 65 73 74  = 0 } {.    test
24f0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
2500: 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72  1.    tv devchar
2510: 20 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20 7d   safe_append.  }
2520: 0a 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 73  .  8  { PRAGMA s
2530: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52  ynchronous = NOR
2540: 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20 74 65 6d  MAL ; PRAGMA tem
2550: 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d 20 7b 0a  p_store = 2 } {.
2560: 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d      testvfs tv -
2570: 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76  default 1.    tv
2580: 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e 74   devchar sequent
2590: 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20 7b 20 50  ial.  }.  9  { P
25a0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
25b0: 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20 7d 0a 20  s = FULL } { }. 
25c0: 20 31 30 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   10 { PRAGMA syn
25d0: 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41  chronous = NORMA
25e0: 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20 7b 20 50  L } { }.  11 { P
25f0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
2600: 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d 0a 20 20  s = OFF } { }.  
2610: 31 32 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63  12 { PRAGMA sync
2620: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 3b  hronous = FULL ;
2630: 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e   PRAGMA fullfsyn
2640: 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20 20 31 33  c = 1 } { }.  13
2650: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2660: 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b  onous = FULL } {
2670: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
2680: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74  -default 1.    t
2690: 76 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e  v devchar sequen
26a0: 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34 20 7b 20  tial.  }.  14 { 
26b0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
26c0: 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 20  ode = EXCLUSIVE 
26d0: 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20 20 64 6f  } {.  }.} {.  do
26e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24  _test pager1-3.$
26f0: 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76 61 6c 20  tn.1 {.    eval 
2700: 24 74 63 6c 0a 20 20 20 20 66 61 75 6c 74 73 69  $tcl.    faultsi
2710: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
2720: 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20  pen.    db func 
2730: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
2740: 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 73  g.    execsql $s
2750: 71 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  ql.    execsql {
2760: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
2770: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20  to_vacuum = 2;. 
2780: 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
2790: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
27a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
27b0: 7a 28 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d  z(x INTEGER PRIM
27c0: 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
27d0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
27e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
27f0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73  VALUES(NULL, a_s
2800: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
2810: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2820: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2830: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2840: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20 32  OM z;     --   2
2850: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2860: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2870: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2880: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
2890: 20 20 20 34 0a 20 20 20 20 20 20 20 20 49 4e 53     4.        INS
28a0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
28b0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
28c0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
28d0: 20 20 2d 2d 20 20 20 38 0a 20 20 20 20 20 20 20    --   8.       
28e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
28f0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2900: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2910: 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a 20 20 20  ;     --  16.   
2920: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2930: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2940: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2950: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 33 32  OM z;     --  32
2960: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2970: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2980: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2990: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
29a0: 20 20 36 34 0a 20 20 20 20 20 20 20 20 49 4e 53    64.        INS
29b0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
29c0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
29d0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
29e0: 20 20 2d 2d 20 31 32 38 0a 20 20 20 20 20 20 20    -- 128.       
29f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
2a00: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2a10: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2a20: 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a 20 20 20  ;     -- 256.   
2a30: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
2a40: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
2a50: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2a60: 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20 20 64 6f  m }.  } {2}.  do
2a70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
2a80: 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20 7b 0a 20  ger1-3.$tn.2 {. 
2a90: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
2aa0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56 41  INSERT INTO z VA
2ab0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72  LUES(NULL, a_str
2ac0: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20  ing(800));.     
2ad0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56   INSERT INTO z V
2ae0: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74  ALUES(NULL, a_st
2af0: 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20  ring(800));.    
2b00: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
2b10: 0a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  .        UPDATE 
2b20: 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c 4c 20 57  z SET y = NULL W
2b30: 48 45 52 45 20 78 3e 32 35 36 3b 0a 20 20 20 20  HERE x>256;.    
2b40: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65      PRAGMA incre
2b50: 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20  mental_vacuum;. 
2b60: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f         SELECT co
2b70: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 20 57 48  unt(*) FROM z WH
2b80: 45 52 45 20 78 20 3c 20 31 30 30 3b 0a 20 20 20  ERE x < 100;.   
2b90: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
2ba0: 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ne;.    COMMIT;.
2bb0: 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64 6f 5f 65    } {99}..  do_e
2bc0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
2bd0: 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  r1-3.$tn.3 {.   
2be0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41   BEGIN;.      SA
2bf0: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
2c00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2c10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2c20: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
2c30: 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  e;.    COMMIT;. 
2c40: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2c50: 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 7d 20 7b  *) FROM z;.  } {
2c60: 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73  258}..  do_execs
2c70: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2c80: 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 53 41 56  .$tn.4 {.    SAV
2c90: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
2ca0: 20 20 55 50 44 41 54 45 20 7a 20 53 45 54 20 79    UPDATE z SET y
2cb0: 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20 52 4f 4c   = y||x;.    ROL
2cc0: 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
2cd0: 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71  } {}.  do_execsq
2ce0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2cf0: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53 45 4c 45  $tn.5 {.    SELE
2d00: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2d10: 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20   z;.    RELEASE 
2d20: 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  one;.    PRAGMA 
2d30: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
2d40: 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d 0a 0a 20  .  } {258 ok}.. 
2d50: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2d60: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 36 20   pager1-3.$tn.6 
2d70: 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  {.    SAVEPOINT 
2d80: 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45 41 53 45  one;.    RELEASE
2d90: 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 0a 20 20   one;.  } {}..  
2da0: 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68  db close.  catch
2db0: 20 7b 20 74 76 20 64 65 6c 65 74 65 20 7d 0a 7d   { tv delete }.}
2dc0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 48  ------------.# H
2e10: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
2e20: 61 63 6b 20 72 65 6c 61 74 65 64 20 74 65 73 74  ack related test
2e30: 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65   cases..#.# page
2e40: 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73 74 20 74  r1.4.1.*: Test t
2e50: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f  hat the pager mo
2e60: 64 75 6c 65 20 64 65 6c 65 74 65 73 20 76 65 72  dule deletes ver
2e70: 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c 69 64 0a  y small invalid.
2e80: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
2e90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23  journal files..#
2ea0: 0a 23 20 70 61 67 65 72 31 2e 34 2e 32 2e 2a 3a  .# pager1.4.2.*:
2eb0: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
2ec0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2ed0: 20 70 6f 69 6e 74 65 72 20 61 74 20 74 68 65 20   pointer at the 
2ee0: 65 6e 64 20 6f 66 20 61 0a 23 20 20 20 20 20 20  end of a.#      
2ef0: 20 20 20 20 20 20 20 20 20 68 6f 74 2d 6a 6f 75           hot-jou
2f00: 72 6e 61 6c 20 66 69 6c 65 20 61 70 70 65 61 72  rnal file appear
2f10: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 20  s to be corrupt 
2f20: 28 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e  (checksum does n
2f30: 6f 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ot.#            
2f40: 20 20 20 63 6f 6d 70 75 74 65 29 20 74 68 65 20     compute) the 
2f50: 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e  associated journ
2f60: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
2f70: 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20 20 20 20  k (and no.#     
2f80: 20 20 20 20 20 20 20 20 20 20 78 41 63 63 65 73            xAcces
2f90: 73 28 29 20 63 61 6c 6c 20 74 6f 20 63 68 65 63  s() call to chec
2fa0: 6b 20 66 6f 72 20 74 68 65 20 70 72 65 73 65 6e  k for the presen
2fb0: 63 65 20 6f 66 20 61 6e 79 20 6d 61 73 74 65 72  ce of any master
2fc0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
2fd0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
2fe0: 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20 70 61 67  s made)..#.# pag
2ff0: 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65 73 74 20  er1.4.3.*: Test 
3000: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
3010: 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  s of a hot-journ
3020: 61 6c 20 61 72 65 20 69 67 6e 6f 72 65 64 20 69  al are ignored i
3030: 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  f the.#         
3040: 20 20 20 20 20 20 70 61 67 65 2d 73 69 7a 65 20        page-size 
3050: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
3060: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
3070: 61 64 65 72 20 61 70 70 65 61 72 20 74 6f 0a 23  ader appear to.#
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3090: 65 20 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20 6c  e invalid (too l
30a0: 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61 6c 6c 20  arge, too small 
30b0: 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65 72 20 6f  or not a power o
30c0: 66 20 32 29 2e 0a 23 0a 23 20 70 61 67 65 72 31  f 2)..#.# pager1
30d0: 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20 68 6f 74  .4.4.*: Test hot
30e0: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
30f0: 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  k of journal fil
3100: 65 20 77 69 74 68 20 61 20 6d 61 73 74 65 72 0a  e with a master.
3110: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3120: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
3130: 67 65 6e 65 72 61 74 65 64 20 69 6e 20 76 61 72  generated in var
3140: 69 6f 75 73 20 22 50 52 41 47 4d 41 20 73 79 6e  ious "PRAGMA syn
3150: 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20 20 20 20  chronous".#     
3160: 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 73 2e            modes.
3170: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 35 2e  .#.# pager1.4.5.
3180: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 68 6f 74  *: Test that hot
3190: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
31a0: 6b 20 73 74 6f 70 73 20 69 66 20 69 74 20 65 6e  k stops if it en
31b0: 63 6f 75 6e 74 65 72 73 20 61 0a 23 20 20 20 20  counters a.#    
31c0: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
31d0: 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72 20 77 68  al-record for wh
31e0: 69 63 68 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ich the checksum
31f0: 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65   fails..#.# page
3200: 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73 74 20 74  r1.4.6.*: Test t
3210: 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67  hat when rolling
3220: 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
3230: 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nal that contain
3240: 73 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  s a.#           
3250: 20 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e      master journ
3260: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20  al pointer, the 
3270: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
3280: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 0a 23  ile is deleted.#
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
32a0: 66 74 65 72 20 61 6c 6c 20 74 68 65 20 68 6f 74  fter all the hot
32b0: 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61 74 20 72  -journals that r
32c0: 65 66 65 72 20 74 6f 20 69 74 20 61 72 65 20 64  efer to it are d
32d0: 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70 61 67 65  eleted..#.# page
32e0: 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73 74 20 74  r1.4.7.*: Test t
32f0: 68 61 74 20 69 66 20 61 20 68 6f 74 2d 6a 6f 75  hat if a hot-jou
3300: 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
3310: 20 62 75 74 20 61 20 63 6c 69 65 6e 74 20 63 61   but a client ca
3320: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
3330: 20 20 6f 70 65 6e 20 69 74 20 66 6f 72 20 72 65    open it for re
3340: 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74 68 65 20  ading only, the 
3350: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
3360: 62 65 20 61 63 63 65 73 73 65 64 20 61 6e 64 0a  be accessed and.
3370: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3380: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
3390: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 20 0a  is returned..# .
33a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
33b0: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
33c0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
33d0: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  pen.  execsql { 
33e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
33f0: 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20 20 20 49  E x(y, z);.    I
3400: 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41 4c  NSERT INTO x VAL
3410: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
3420: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65   set fd [open te
3430: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d  st.db-journal w]
3440: 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69  .  puts -nonewli
3450: 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f 77 6f 72  ne $fd "hellowor
3460: 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  ld".  close $fd.
3470: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
3480: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
3490: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {1}.do_test page
34a0: 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78 65 63 73  r1.4.1.2 { execs
34b0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
34c0: 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32 7d 0a 64  OM x } } {1 2}.d
34d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
34e0: 31 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  1.3 { file exist
34f0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
3500: 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65 74 20 75  l } {0}..# Set u
3510: 70 20 61 20 5b 74 65 73 74 76 66 73 5d 20 74 6f  p a [testvfs] to
3520: 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   snapshot the fi
3530: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
3540: 65 66 6f 72 65 20 53 51 4c 69 74 65 0a 23 20 64  efore SQLite.# d
3550: 65 6c 65 74 65 73 20 74 68 65 20 6d 61 73 74 65  eletes the maste
3560: 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 63 6f 6d  r-journal to com
3570: 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  mit a multi-file
3580: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
3590: 23 20 49 6e 20 73 75 62 73 65 71 75 65 6e 74 20  # In subsequent 
35a0: 74 65 73 74 20 63 61 73 65 73 2c 20 69 6e 76 6f  test cases, invo
35b0: 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69 6d 5f 72  king [faultsim_r
35c0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
35d0: 6e 5d 20 73 65 74 73 0a 23 20 75 70 20 74 68 65  n] sets.# up the
35e0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
35f0: 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64 61 74 61  contain two data
3600: 62 61 73 65 73 2c 20 74 77 6f 20 68 6f 74 2d 6a  bases, two hot-j
3610: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 6e 64  ournal files and
3620: 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72  .# a master-jour
3630: 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  nal..#.do_test p
3640: 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b 0a 20 20  ager1.4.2.1 {.  
3650: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3660: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3670: 66 73 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  fs filter xDelet
3680: 65 0a 20 20 74 73 74 76 66 73 20 73 63 72 69 70  e.  tstvfs scrip
3690: 74 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63  t xDeleteCallbac
36a0: 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c 65 74 65  k.  proc xDelete
36b0: 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64  Callback {method
36c0: 20 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20   file args} {.  
36d0: 20 20 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65    set file [file
36e0: 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20   tail $file].   
36f0: 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 6d 61   if { [string ma
3700: 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c 65 5d 20  tch *mj* $file] 
3710: 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  } { faultsim_sav
3720: 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  e }.  }.  faults
3730: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
3740: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
3750: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
3760: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3770: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
3780: 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50  2' AS aux;.    P
3790: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
37a0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
37b0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 63 61 63   PRAGMA main.cac
37c0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37d0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 63 61 63    PRAGMA aux.cac
37e0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3800: 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  1(a UNIQUE, b UN
3810: 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54  IQUE);.    CREAT
3820: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61  E TABLE aux.t2(a
3830: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
3840: 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  E);.    INSERT I
3850: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
3860: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
3870: 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20  tring(300));.   
3880: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3890: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38a0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38b0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
38c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
38d0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38e0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
3900: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3910: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3920: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
3930: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3940: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
3950: 67 28 32 30 31 29 2c 20 61 5f 73 74 72 69 6e 67  g(201), a_string
3960: 28 33 30 31 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (301) FROM t1;. 
3970: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3980: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
3990: 69 6e 67 28 32 30 32 29 2c 20 61 5f 73 74 72 69  ing(202), a_stri
39a0: 6e 67 28 33 30 32 29 20 46 52 4f 4d 20 74 31 3b  ng(302) FROM t1;
39b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
39c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
39d0: 74 72 69 6e 67 28 32 30 33 29 2c 20 61 5f 73 74  tring(203), a_st
39e0: 72 69 6e 67 28 33 30 33 29 20 46 52 4f 4d 20 74  ring(303) FROM t
39f0: 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  1;.      INSERT 
3a00: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
3a10: 5f 73 74 72 69 6e 67 28 32 30 34 29 2c 20 61 5f  _string(204), a_
3a20: 73 74 72 69 6e 67 28 33 30 34 29 20 46 52 4f 4d  string(304) FROM
3a30: 20 74 31 3b 0a 20 20 20 20 20 20 52 45 50 4c 41   t1;.      REPLA
3a40: 43 45 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  CE INTO t2 SELEC
3a50: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
3a60: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64   COMMIT;.  }.  d
3a70: 62 20 63 6c 6f 73 65 0a 20 20 74 73 74 76 66 73  b close.  tstvfs
3a80: 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 0a 69 66   delete.} {}..if
3a90: 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
3aa0: 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69  m(platform)!="wi
3ab0: 6e 64 6f 77 73 22 7d 20 7b 0a 64 6f 5f 74 65 73  ndows"} {.do_tes
3ac0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 32 20 7b  t pager1.4.2.2 {
3ad0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
3ae0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
3af0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3b00: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3b10: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3b20: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3b30: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d  ck;.  }.} {4 ok}
3b40: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
3b50: 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75 6c 74 73  4.2.3 {.  faults
3b60: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
3b70: 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61 63 68 20  eopen.  foreach 
3b80: 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2d  f [glob test.db-
3b90: 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65  mj*] { forcedele
3ba0: 74 65 20 24 66 20 7d 0a 20 20 65 78 65 63 73 71  te $f }.  execsq
3bb0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  l {.    SELECT c
3bc0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
3bd0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
3be0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
3bf0: 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f 5f 74 65  .} {64 ok}.do_te
3c00: 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 34 20  st pager1.4.2.4 
3c10: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
3c20: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
3c30: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
3c40: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
3c50: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
3c60: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d  est.db-journal]-
3c70: 32 30 5d 20 31 32 33 34 35 36 0a 20 20 65 78 65  20] 123456.  exe
3c80: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3c90: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3ca0: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3cb0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3cc0: 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f    }.} {4 ok}.do_
3cd0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3ce0: 35 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  5 {.  faultsim_r
3cf0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3d00: 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  n.  hexio_write 
3d10: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
3d20: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
3d30: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3d40: 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20 66  ]-20] 123456.  f
3d50: 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 74  oreach f [glob t
3d60: 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f  est.db-mj*] { fo
3d70: 72 63 65 64 65 6c 65 74 65 20 24 66 20 7d 0a 20  rcedelete $f }. 
3d80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3d90: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3da0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3db0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3dc0: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d  ck;.  }.} {4 ok}
3dd0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  .}..do_test page
3de0: 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20 74 65 73  r1.4.3.1 {.  tes
3df0: 74 76 66 73 20 74 73 74 76 66 73 20 2d 64 65 66  tvfs tstvfs -def
3e00: 61 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73 20  ault 1.  tstvfs 
3e10: 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74  filter xSync.  t
3e20: 73 74 76 66 73 20 73 63 72 69 70 74 20 78 53 79  stvfs script xSy
3e30: 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f  ncCallback.  pro
3e40: 63 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 20  c xSyncCallback 
3e50: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72 67  {method file arg
3e60: 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c  s} {.    set fil
3e70: 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  e [file tail $fi
3e80: 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 30 3d 3d  le].    if { 0==
3e90: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a  [string match *j
3ea0: 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d 20 7d 20  ournal $file] } 
3eb0: 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20  { faultsim_save 
3ec0: 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  }.  }.  faultsim
3ed0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
3ee0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
3ef0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
3f00: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
3f10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3f20: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
3f30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3f40: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
3f50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3f60: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
3f70: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  }.  db close.  t
3f80: 73 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b  stvfs delete.} {
3f90: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6f  }..foreach {tn o
3fa0: 66 73 74 20 76 61 6c 75 65 20 72 65 73 75 6c 74  fst value result
3fb0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 32 20  } {.          2 
3fc0: 20 20 32 30 20 20 20 20 33 31 20 20 20 20 20 20    20    31      
3fd0: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20   {1 2 3 4}.     
3fe0: 20 20 20 20 20 33 20 20 20 32 30 20 20 20 20 33       3   20    3
3ff0: 32 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  2       {1 2 3 4
4000: 7d 0a 20 20 20 20 20 20 20 20 20 20 34 20 20 20  }.          4   
4010: 32 30 20 20 20 20 33 33 20 20 20 20 20 20 20 7b  20    33       {
4020: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4030: 20 20 20 35 20 20 20 32 30 20 20 20 20 36 35 35     5   20    655
4040: 33 36 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  36    {1 2 3 4}.
4050: 20 20 20 20 20 20 20 20 20 20 36 20 20 20 32 30            6   20
4060: 20 20 20 20 31 33 31 30 37 32 20 20 20 7b 31 20      131072   {1 
4070: 32 20 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20  2 3 4}..        
4080: 20 20 37 20 20 20 32 34 20 20 20 20 35 31 31 20    7   24    511 
4090: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20       {1 2 3 4}. 
40a0: 20 20 20 20 20 20 20 20 20 38 20 20 20 32 34 20           8   24 
40b0: 20 20 20 35 31 33 20 20 20 20 20 20 7b 31 20 32     513      {1 2
40c0: 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20   3 4}.          
40d0: 39 20 20 20 32 34 20 20 20 20 31 33 31 30 37 32  9   24    131072
40e0: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20     {1 2 3 4}..  
40f0: 20 20 20 20 20 20 20 31 30 20 20 20 33 32 20 20         10   32  
4100: 20 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 7d    65536    {1 2}
4110: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  .} {.  do_test p
4120: 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e 20 7b 0a  ager1.4.3.$tn {.
4130: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
4140: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
4150: 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20      hexio_write 
4160: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
4170: 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74 20 25 2e  $ofst [format %.
4180: 38 78 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 65  8x $value].    e
4190: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
41a0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
41b0: 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20 63 6c 6f  $result.}.db clo
41c0: 73 65 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56  se..# Set up a V
41d0: 46 53 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  FS that snapshot
41e0: 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
41f0: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 61 20  m just before a 
4200: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 23  master journal.#
4210: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
4220: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75 6c   to commit a mul
4230: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
4240: 69 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c 6c  ion. Specificall
4250: 79 2c 20 74 68 65 0a 23 20 66 69 6c 65 2d 73 79  y, the.# file-sy
4260: 73 74 65 6d 20 69 73 20 73 61 76 65 64 20 6a 75  stem is saved ju
4270: 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 78 44  st before the xD
4280: 65 6c 65 74 65 28 29 20 63 61 6c 6c 20 74 6f 20  elete() call to 
4290: 72 65 6d 6f 76 65 20 74 68 65 20 0a 23 20 6d 61  remove the .# ma
42a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
42b0: 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d  e from the file-
42c0: 73 79 73 74 65 6d 2e 0a 23 0a 74 65 73 74 76 66  system..#.testvf
42d0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
42e0: 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f  tv script copy_o
42f0: 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73 65 74 20  n_mj_delete.set 
4300: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65  ::mj_filename_le
4310: 6e 67 74 68 20 30 0a 70 72 6f 63 20 63 6f 70 79  ngth 0.proc copy
4320: 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d  _on_mj_delete {m
4330: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
4340: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
4350: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20  ring match *mj* 
4360: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
4370: 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73  name]]} { .    s
4380: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
4390: 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67 20  _length [string 
43a0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65  length $filename
43b0: 5d 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73  ].    faultsim_s
43c0: 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave .  }.  retur
43d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 73  n SQLITE_OK.}..s
43e0: 65 74 20 70 77 64 20 5b 70 77 64 5d 0a 66 6f 72  et pwd [pwd].for
43f0: 65 61 63 68 20 7b 74 6e 31 20 74 63 6c 7d 20 7b  each {tn1 tcl} {
4400: 0a 20 20 31 20 7b 20 73 65 74 20 70 72 65 66 69  .  1 { set prefi
4410: 78 20 22 74 65 73 74 2e 64 62 22 20 7d 0a 20 20  x "test.db" }.  
4420: 32 20 7b 20 0a 20 20 20 20 23 20 54 68 69 73 20  2 { .    # This 
4430: 74 65 73 74 20 64 65 70 65 6e 64 73 20 6f 6e 20  test depends on 
4440: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  the underlying V
4450: 46 53 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f  FS being able to
4460: 20 6f 70 65 6e 20 70 61 74 68 73 0a 20 20 20 20   open paths.    
4470: 23 20 35 31 32 20 62 79 74 65 73 20 69 6e 20 6c  # 512 bytes in l
4480: 65 6e 67 74 68 2e 20 54 68 65 20 69 64 65 61 20  ength. The idea 
4490: 69 73 20 74 6f 20 63 72 65 61 74 65 20 61 20 68  is to create a h
44a0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
44b0: 74 68 61 74 0a 20 20 20 20 23 20 63 6f 6e 74 61  that.    # conta
44c0: 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75  ins a master-jou
44d0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20  rnal pointer so 
44e0: 6c 61 72 67 65 20 74 68 61 74 20 69 74 20 63 6f  large that it co
44f0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  uld contain.    
4500: 23 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 72  # a valid page r
4510: 65 63 6f 72 64 20 28 69 66 20 74 68 65 20 66 69  ecord (if the fi
4520: 6c 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  le page-size is 
4530: 35 31 32 20 62 79 74 65 73 29 2e 20 53 6f 20 61  512 bytes). So a
4540: 73 20 74 6f 0a 20 20 20 20 23 20 6d 61 6b 65 20  s to.    # make 
4550: 73 75 72 65 20 53 51 4c 69 74 65 20 64 6f 65 73  sure SQLite does
4560: 6e 27 74 20 67 65 74 20 63 6f 6e 66 75 73 65 64  n't get confused
4570: 20 62 79 20 74 68 69 73 2e 0a 20 20 20 20 23 0a   by this..    #.
4580: 20 20 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67      set nPadding
4590: 20 5b 65 78 70 72 20 35 31 31 20 2d 20 24 3a 3a   [expr 511 - $::
45a0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67  mj_filename_leng
45b0: 74 68 5d 0a 20 20 20 20 69 66 20 7b 24 74 63 6c  th].    if {$tcl
45c0: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
45d0: 72 6d 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d 20  rm)=="windows"} 
45e0: 7b 0a 20 20 20 20 20 20 23 20 54 42 44 20 6e 65  {.      # TBD ne
45f0: 65 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  ed to figure out
4600: 20 68 6f 77 20 74 6f 20 64 6f 20 74 68 69 73 20   how to do this 
4610: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 57 69  correctly for Wi
4620: 6e 64 6f 77 73 21 21 21 0a 20 20 20 20 20 20 73  ndows!!!.      s
4630: 65 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70  et nPadding [exp
4640: 72 20 32 35 35 20 2d 20 24 3a 3a 6d 6a 5f 66 69  r 255 - $::mj_fi
4650: 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20  lename_length]. 
4660: 20 20 20 7d 0a 0a 20 20 20 20 23 20 57 65 20 63     }..    # We c
4670: 61 6e 6e 6f 74 20 6a 75 73 74 20 63 72 65 61 74  annot just creat
4680: 65 20 61 20 72 65 61 6c 6c 79 20 6c 6f 6e 67 20  e a really long 
4690: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
46a0: 6d 65 20 74 6f 20 6f 70 65 6e 2c 20 61 73 0a 20  me to open, as. 
46b0: 20 20 20 23 20 4c 69 6e 75 78 20 6c 69 6d 69 74     # Linux limit
46c0: 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70 6f  s a single compo
46d0: 6e 65 6e 74 20 6f 66 20 61 20 70 61 74 68 20 74  nent of a path t
46e0: 6f 20 32 35 35 20 62 79 74 65 73 20 62 79 20 64  o 255 bytes by d
46f0: 65 66 61 75 6c 74 0a 20 20 20 20 23 20 28 61 6e  efault.    # (an
4700: 64 20 70 72 65 73 75 6d 61 62 6c 79 20 6f 74 68  d presumably oth
4710: 65 72 20 73 79 73 74 65 6d 73 20 68 61 76 65 20  er systems have 
4720: 6c 69 6d 69 74 73 20 74 6f 6f 29 2e 20 53 6f 20  limits too). So 
4730: 63 72 65 61 74 65 20 61 20 64 69 72 65 63 74 6f  create a directo
4740: 72 79 0a 20 20 20 20 23 20 68 69 65 72 61 72 63  ry.    # hierarc
4750: 68 79 20 74 6f 20 77 6f 72 6b 20 69 6e 2e 0a 20  hy to work in.. 
4760: 20 20 20 23 0a 20 20 20 20 73 65 74 20 64 69 72     #.    set dir
4770: 6e 61 6d 65 20 22 64 31 32 33 34 35 36 37 38 39  name "d123456789
4780: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
4790: 36 37 38 39 30 2f 22 0a 20 20 20 20 73 65 74 20  67890/".    set 
47a0: 6e 44 69 72 20 5b 65 78 70 72 20 24 6e 50 61 64  nDir [expr $nPad
47b0: 64 69 6e 67 20 2f 20 33 32 5d 0a 20 20 20 20 69  ding / 32].    i
47c0: 66 20 7b 20 24 6e 44 69 72 20 7d 20 7b 0a 20 20  f { $nDir } {.  
47d0: 20 20 20 20 73 65 74 20 70 20 5b 73 74 72 69 6e      set p [strin
47e0: 67 20 72 65 70 65 61 74 20 24 64 69 72 6e 61 6d  g repeat $dirnam
47f0: 65 20 24 6e 44 69 72 5d 0a 20 20 20 20 20 20 66  e $nDir].      f
4800: 69 6c 65 20 6d 6b 64 69 72 20 24 70 0a 20 20 20  ile mkdir $p.   
4810: 20 20 20 63 64 20 24 70 0a 20 20 20 20 7d 0a 0a     cd $p.    }..
4820: 20 20 20 20 73 65 74 20 70 61 64 64 69 6e 67 20      set padding 
4830: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78  [string repeat x
4840: 20 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67   [expr $nPadding
4850: 20 25 33 32 5d 5d 0a 20 20 20 20 73 65 74 20 70   %32]].    set p
4860: 72 65 66 69 78 20 22 74 65 73 74 2e 64 62 24 7b  refix "test.db${
4870: 70 61 64 64 69 6e 67 7d 22 0a 20 20 7d 0a 7d 20  padding}".  }.} 
4880: 7b 0a 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20  {.  eval $tcl.  
4890: 66 6f 72 65 61 63 68 20 7b 74 6e 32 20 73 71 6c  foreach {tn2 sql
48a0: 7d 20 7b 0a 20 20 20 20 6f 20 7b 20 0a 20 20 20  } {.    o { .   
48b0: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73     PRAGMA main.s
48c0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a  ynchronous=OFF;.
48d0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
48e0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46  .synchronous=OFF
48f0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
4900: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
4910: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LETE;.    }.    
4920: 6f 35 31 32 20 7b 20 0a 20 20 20 20 20 20 50 52  o512 { .      PR
4930: 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72  AGMA main.synchr
4940: 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20  onous=OFF;.     
4950: 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63   PRAGMA aux.sync
4960: 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20  hronous=OFF;.   
4970: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70     PRAGMA main.p
4980: 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a  age_size = 512;.
4990: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
49a0: 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32  .page_size = 512
49b0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
49c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
49d0: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LETE;.    }.    
49e0: 6e 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d  n { .      PRAGM
49f0: 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f  A main.synchrono
4a00: 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  us=NORMAL;.     
4a10: 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63   PRAGMA aux.sync
4a20: 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a  hronous=NORMAL;.
4a30: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
4a40: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
4a50: 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 20  TE;.    }.    f 
4a60: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
4a70: 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73  main.synchronous
4a80: 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41  =FULL;.      PRA
4a90: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
4aa0: 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ous=FULL;.      
4ab0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
4ac0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
4ad0: 20 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 73    }.  } {..    s
4ae0: 65 74 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24 7b  et tn "${tn1}.${
4af0: 74 6e 32 7d 22 0a 20 20 0a 20 20 20 20 23 20 53  tn2}".  .    # S
4b00: 65 74 20 75 70 20 61 20 63 6f 6e 6e 65 63 74 69  et up a connecti
4b10: 6f 6e 20 74 6f 20 68 61 76 65 20 74 77 6f 20 64  on to have two d
4b20: 61 74 61 62 61 73 65 73 2c 20 74 65 73 74 2e 64  atabases, test.d
4b30: 62 20 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20 20  b (main) and .  
4b40: 20 20 23 20 74 65 73 74 2e 64 62 32 20 28 61 75    # test.db2 (au
4b50: 78 29 2e 20 54 68 65 6e 20 72 75 6e 20 61 20 6d  x). Then run a m
4b60: 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
4b70: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20 54  ction on them. T
4b80: 68 65 0a 20 20 20 20 23 20 56 46 53 20 77 69 6c  he.    # VFS wil
4b90: 6c 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66  l snapshot the f
4ba0: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20  ile-system just 
4bb0: 62 65 66 6f 72 65 20 74 68 65 20 6d 61 73 74 65  before the maste
4bc0: 72 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23 20  r-journal.    # 
4bd0: 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
4be0: 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
4bf0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 23  ansaction..    #
4c00: 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 78  .    tv filter x
4c10: 44 65 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74 65  Delete.    do_te
4c20: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
4c30: 6e 2e 31 20 7b 0a 20 20 20 20 20 20 66 61 75 6c  n.1 {.      faul
4c40: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
4c50: 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20  reopen $prefix. 
4c60: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20       execsql ". 
4c70: 20 20 20 20 20 20 20 41 54 54 41 43 48 20 27 24         ATTACH '$
4c80: 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75  {prefix}2' AS au
4c90: 78 3b 0a 20 20 20 20 20 20 20 20 24 73 71 6c 0a  x;.        $sql.
4ca0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
4cb0: 41 42 4c 45 20 61 28 78 29 3b 0a 20 20 20 20 20  ABLE a(x);.     
4cc0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4cd0: 61 75 78 2e 62 28 78 29 3b 0a 20 20 20 20 20 20  aux.b(x);.      
4ce0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20    INSERT INTO a 
4cf0: 56 41 4c 55 45 53 28 27 64 6f 75 62 6c 65 2d 79  VALUES('double-y
4d00: 6f 75 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  ou');.        IN
4d10: 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55  SERT INTO a VALU
4d20: 45 53 28 27 77 68 79 27 29 3b 0a 20 20 20 20 20  ES('why');.     
4d30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
4d40: 20 56 41 4c 55 45 53 28 27 7a 65 64 27 29 3b 0a   VALUES('zed');.
4d50: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4d60: 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 77 6f  NTO b VALUES('wo
4d70: 6e 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  n');.        INS
4d80: 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45  ERT INTO b VALUE
4d90: 53 28 27 74 6f 6f 27 29 3b 0a 20 20 20 20 20 20  S('too');.      
4da0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
4db0: 56 41 4c 55 45 53 28 27 66 72 65 65 27 29 3b 0a  VALUES('free');.
4dc0: 20 20 20 20 20 20 22 0a 20 20 20 20 20 20 65 78        ".      ex
4dd0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20  ecsql {.        
4de0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 20  BEGIN;.         
4df0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 53   INSERT INTO a S
4e00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 20 57  ELECT * FROM b W
4e10: 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20  HERE rowid<=3;. 
4e20: 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20           INSERT 
4e30: 49 4e 54 4f 20 62 20 53 45 4c 45 43 54 20 2a 20  INTO b SELECT * 
4e40: 46 52 4f 4d 20 61 20 57 48 45 52 45 20 72 6f 77  FROM a WHERE row
4e50: 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 43  id<=3;.        C
4e60: 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20  OMMIT;.      }. 
4e70: 20 20 20 7d 20 7b 7d 0a 20 20 20 20 74 76 20 66     } {}.    tv f
4e80: 69 6c 74 65 72 20 7b 7d 0a 20 20 20 20 0a 20 20  ilter {}.    .  
4e90: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74    # Check that t
4ea0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
4eb0: 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 73 75 63  as committed suc
4ec0: 63 65 73 73 66 75 6c 6c 79 2e 0a 20 20 20 20 23  cessfully..    #
4ed0: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
4ee0: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
4ef0: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 53 45  $tn.2 {.      SE
4f00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20  LECT * FROM a.  
4f10: 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20    } {double-you 
4f20: 77 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20  why zed won too 
4f30: 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65  free}.    do_exe
4f40: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
4f50: 2d 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  -4.4.$tn.3 {.   
4f60: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4f70: 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f   b.    } {won to
4f80: 6f 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f  o free double-yo
4f90: 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 0a  u why zed}.    .
4fa0: 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74 68      # Restore th
4fb0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e  e file-system an
4fc0: 64 20 72 65 6f 70 65 6e 20 74 68 65 20 64 61 74  d reopen the dat
4fd0: 61 62 61 73 65 73 2e 20 43 68 65 63 6b 20 74 68  abases. Check th
4fe0: 61 74 20 69 74 20 6e 6f 77 0a 20 20 20 20 23 20  at it now.    # 
4ff0: 61 70 70 65 61 72 73 20 74 68 61 74 20 74 68 65  appears that the
5000: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
5010: 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 20 28   not committed (
5020: 62 65 63 61 75 73 65 20 74 68 65 20 66 69 6c 65  because the file
5030: 2d 73 79 73 74 65 6d 0a 20 20 20 20 23 20 77 61  -system.    # wa
5040: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68  s restored to th
5050: 65 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  e state where it
5060: 20 68 61 64 20 6e 6f 74 20 62 65 65 6e 29 2e 0a   had not been)..
5070: 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73      #.    do_tes
5080: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
5090: 2e 34 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74  .4 {.      fault
50a0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
50b0: 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20  reopen $prefix. 
50c0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 41 54       execsql "AT
50d0: 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32  TACH '${prefix}2
50e0: 27 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20  ' AS aux".    } 
50f0: 7b 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71  {}.    do_execsq
5100: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  l_test pager1-4.
5110: 34 2e 24 74 6e 2e 35 20 7b 53 45 4c 45 43 54 20  4.$tn.5 {SELECT 
5120: 2a 20 46 52 4f 4d 20 61 7d 20 7b 64 6f 75 62 6c  * FROM a} {doubl
5130: 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20  e-you why zed}. 
5140: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
5150: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5160: 6e 2e 36 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  n.6 {SELECT * FR
5170: 4f 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66  OM b} {won too f
5180: 72 65 65 7d 0a 20 20 20 20 0a 20 20 20 20 23 20  ree}.    .    # 
5190: 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  Restore the file
51a0: 2d 73 79 73 74 65 6d 20 61 67 61 69 6e 2e 20 54  -system again. T
51b0: 68 69 73 20 74 69 6d 65 2c 20 62 65 66 6f 72 65  his time, before
51c0: 20 72 65 6f 70 65 6e 69 6e 67 20 74 68 65 20 64   reopening the d
51d0: 61 74 61 62 61 73 65 73 2c 0a 20 20 20 20 23 20  atabases,.    # 
51e0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
51f0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r-journal file f
5200: 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73  rom the file-sys
5210: 74 65 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70 65  tem. It now appe
5220: 61 72 73 20 74 68 61 74 0a 20 20 20 20 23 20 74  ars that.    # t
5230: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
5240: 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e 6f  as committed (no
5250: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5260: 66 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c 62  file == no rollb
5270: 61 63 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20 20  ack)..    #.    
5280: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  do_test pager1-4
5290: 2e 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 20  .4.$tn.7 {.     
52a0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
52b0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72  e_and_reopen $pr
52c0: 65 66 69 78 0a 20 20 20 20 20 20 66 6f 72 65 61  efix.      forea
52d0: 63 68 20 66 20 5b 67 6c 6f 62 20 24 7b 70 72 65  ch f [glob ${pre
52e0: 66 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63  fix}-mj*] { forc
52f0: 65 64 65 6c 65 74 65 20 24 66 20 7d 0a 20 20 20  edelete $f }.   
5300: 20 20 20 65 78 65 63 73 71 6c 20 22 41 54 54 41     execsql "ATTA
5310: 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32 27 20  CH '${prefix}2' 
5320: 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d  AS aux".    } {}
5330: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
5340: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
5350: 24 74 6e 2e 38 20 7b 0a 20 20 20 20 20 20 53 45  $tn.8 {.      SE
5360: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20  LECT * FROM a.  
5370: 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20    } {double-you 
5380: 77 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20  why zed won too 
5390: 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65  free}.    do_exe
53a0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
53b0: 2d 34 2e 34 2e 24 74 6e 2e 39 20 7b 0a 20 20 20  -4.4.$tn.9 {.   
53c0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
53d0: 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f   b.    } {won to
53e0: 6f 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f  o free double-yo
53f0: 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 7d 0a 0a  u why zed}.  }..
5400: 20 20 63 64 20 24 70 77 64 0a 7d 0a 64 62 20 63    cd $pwd.}.db c
5410: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 66  lose.tv delete.f
5420: 6f 72 63 65 64 65 6c 65 74 65 20 24 64 69 72 6e  orcedelete $dirn
5430: 61 6d 65 0a 0a 0a 23 20 53 65 74 20 75 70 20 61  ame...# Set up a
5440: 20 56 46 53 20 74 6f 20 6d 61 6b 65 20 61 20 63   VFS to make a c
5450: 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  opy of the file-
5460: 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f  system just befo
5470: 72 65 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20  re deleting a.# 
5480: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
5490: 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  commit a transac
54a0: 74 69 6f 6e 2e 20 54 68 65 20 74 72 61 6e 73 61  tion. The transa
54b0: 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65  ction modifies e
54c0: 78 61 63 74 6c 79 0a 23 20 74 77 6f 20 64 61 74  xactly.# two dat
54d0: 61 62 61 73 65 20 70 61 67 65 73 20 28 61 6e 64  abase pages (and
54e0: 20 70 61 67 65 20 31 20 2d 20 74 68 65 20 63 68   page 1 - the ch
54f0: 61 6e 67 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23  ange counter)..#
5500: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
5510: 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72  ault 1.tv sector
5520: 73 69 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69  size 512.tv scri
5530: 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e  pt copy_on_journ
5540: 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c  al_delete.tv fil
5550: 74 65 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63  ter xDelete.proc
5560: 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c   copy_on_journal
5570: 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20  _delete {method 
5580: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
5590: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  .  if {[string m
55a0: 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66  atch *journal $f
55b0: 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73  ilename]} faults
55c0: 69 6d 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72  im_save .  retur
55d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61  n SQLITE_OK.}.fa
55e0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
55f0: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63  d_reopen.do_exec
5600: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5610: 34 2e 35 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  4.5.1 {.  PRAGMA
5620: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
5630: 44 45 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41  DELETE;.  PRAGMA
5640: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
5650: 34 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  4;.  CREATE TABL
5660: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52  E t1(a, b);.  CR
5670: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
5680: 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   b);.  INSERT IN
5690: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 27  TO t1 VALUES('I'
56a0: 2c 20 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52  , 'II');.  INSER
56b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
56c0: 28 27 49 49 49 27 2c 20 27 49 56 27 29 3b 0a 20  ('III', 'IV');. 
56d0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
56e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
56f0: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
5700: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
5710: 45 53 28 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d  ES(3, 4);.  COMM
5720: 49 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74  IT;.} {delete}.t
5730: 76 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43  v filter {}..# C
5740: 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  heck the transac
5750: 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
5760: 65 64 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ed:.#.do_execsql
5770: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5780: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .2 {.  SELECT * 
5790: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
57a0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
57b0: 49 20 49 49 20 31 20 32 20 49 49 49 20 49 56 20  I II 1 2 III IV 
57c0: 33 20 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20  3 4}..# Now try 
57d0: 66 6f 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20  four tests:.#.# 
57e0: 20 70 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52   pager1-4.5.3: R
57f0: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5800: 73 79 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68  system. Check th
5810: 61 74 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  at the whole tra
5820: 6e 73 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20  nsaction .#     
5830: 20 20 20 20 20 20 20 20 20 20 20 69 73 20 72 6f             is ro
5840: 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20  lled back..#.#  
5850: 70 61 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65  pager1-4.5.4: Re
5860: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73  store the file-s
5870: 79 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74  ystem. Corrupt t
5880: 68 65 20 66 69 72 73 74 20 72 65 63 6f 72 64 20  he first record 
5890: 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  in the.#        
58a0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e          journal.
58b0: 20 43 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73   Check the trans
58c0: 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f  action is not ro
58d0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20  lled back..#.#  
58e0: 70 61 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65  pager1-4.5.5: Re
58f0: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73  store the file-s
5900: 79 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74  ystem. Corrupt t
5910: 68 65 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64  he second record
5920: 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20   in the.#       
5930: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
5940: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  . Check that the
5950: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
5960: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
5970: 20 69 73 20 0a 23 20 20 20 20 20 20 20 20 20 20   is .#          
5980: 20 20 20 20 20 20 70 6c 61 79 65 64 20 62 61 63        played bac
5990: 6b 2c 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73  k, but not the s
59a0: 65 63 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65  econd..#.#  page
59b0: 72 31 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72  r1-4.5.6: Restor
59c0: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
59d0: 6d 2e 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74  m. Try to open t
59e0: 68 65 20 64 61 74 61 62 61 73 65 20 77 69 74 68  he database with
59f0: 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20   a.#            
5a00: 20 20 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e      readonly con
5a10: 6e 65 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68  nection. This sh
5a20: 6f 75 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20  ould fail, as a 
5a30: 72 65 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20  read-only.#     
5a40: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65             conne
5a50: 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c  ction cannot rol
5a60: 6c 20 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  l back the datab
5a70: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c  ase file..#.faul
5a80: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5a90: 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73  _reopen.do_execs
5aa0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5ab0: 2e 35 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.3 {.  SELECT 
5ac0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
5ad0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
5ae0: 20 7b 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66   {I II III IV}.f
5af0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
5b00: 61 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f  and_reopen.hexio
5b10: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a  _write test.db-j
5b20: 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32  ournal [expr 512
5b30: 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30  +4+1024 - 202] 0
5b40: 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0a  123456789ABCDEF.
5b50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5b60: 70 61 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20  pager1.4.5.4 {. 
5b70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5b80: 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  1;.  SELECT * FR
5b90: 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31  OM t2;.} {I II 1
5ba0: 20 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66   2 III IV 3 4}.f
5bb0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
5bc0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f  and_reopen.hexio
5bd0: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a  _write test.db-j
5be0: 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32  ournal [expr 512
5bf0: 2b 34 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34  +4+1024+4+4+1024
5c00: 20 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37   - 202] 01234567
5c10: 38 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63  89ABCDEF.do_exec
5c20: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5c30: 34 2e 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54  4.5.5 {.  SELECT
5c40: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
5c50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
5c60: 7d 20 7b 49 20 49 49 20 49 49 49 20 49 56 20 33  } {I II III IV 3
5c70: 20 34 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65   4}..faultsim_re
5c80: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5c90: 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65  .db close.sqlite
5ca0: 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65  3 db test.db -re
5cb0: 61 64 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63  adonly 1.do_catc
5cc0: 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  hsql_test pager1
5cd0: 2e 34 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43  .4.5.6 {.  SELEC
5ce0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53  T * FROM t1;.  S
5cf0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
5d00: 0a 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20  .} {1 {disk I/O 
5d10: 65 72 72 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65  error}}.db close
5d20: 0a 0a 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65  ..# Snapshot the
5d30: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73   file-system jus
5d40: 74 20 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66  t before multi-f
5d50: 69 6c 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65  ile commit. Save
5d60: 20 74 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74   the name.# of t
5d70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5d80: 6c 20 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f  l file in $::mj_
5d90: 66 69 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73  filename..#.tv s
5da0: 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a  cript copy_on_mj
5db0: 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65  _delete.tv filte
5dc0: 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63  r xDelete.proc c
5dd0: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
5de0: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
5df0: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
5e00: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d  [string match *m
5e10: 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  j* [file tail $f
5e20: 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20  ilename]]} { .  
5e30: 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e    set ::mj_filen
5e40: 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20  ame $filename.  
5e50: 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20    faultsim_save 
5e60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5e70: 4c 49 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73  LITE_OK.}.do_tes
5e80: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b  t pager1.4.6.1 {
5e90: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
5ea0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
5eb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
5ec0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
5ed0: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20  e = DELETE;.    
5ee0: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32  ATTACH 'test.db2
5ef0: 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20 43 52  ' AS two;.    CR
5f00: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
5f10: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
5f20: 54 41 42 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20  TABLE two.t2(a, 
5f30: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
5f40: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
5f50: 20 27 74 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e   't1.1');.    IN
5f60: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
5f70: 55 45 53 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a  UES(1, 't2.1');.
5f80: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
5f90: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
5fa0: 20 3d 20 27 74 31 2e 32 27 3b 0a 20 20 20 20 20   = 't1.2';.     
5fb0: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62   UPDATE t2 SET b
5fc0: 20 3d 20 27 74 32 2e 32 27 3b 0a 20 20 20 20 43   = 't2.2';.    C
5fd0: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20  OMMIT;.  }.  tv 
5fe0: 66 69 6c 74 65 72 20 7b 7d 0a 20 20 64 62 20 63  filter {}.  db c
5ff0: 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74  lose.} {}..fault
6000: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
6010: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
6020: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
6030: 36 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  6.2 { SELECT * F
6040: 52 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20  ROM t1 }        
6050: 20 20 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74     {1 t1.1}.do_t
6060: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
6070: 72 31 2e 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20  r1.4.6.3 { file 
6080: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
6090: 65 6e 61 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65  ename } {1}.do_e
60a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
60b0: 72 31 2e 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54  r1.4.6.4 {.  ATT
60c0: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
60d0: 53 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20  S two;.  SELECT 
60e0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20  * FROM t2;.} {1 
60f0: 74 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61  t2.1}.do_test pa
6100: 67 65 72 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c  ger1.4.6.5 { fil
6110: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
6120: 69 6c 65 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66  ilename } {0}..f
6130: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
6140: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c  and_reopen.db cl
6150: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ose.do_test page
6160: 72 31 2e 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74  r1.4.6.8 {.  set
6170: 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20   ::mj_filename1 
6180: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20  $::mj_filename. 
6190: 20 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65   tv filter xDele
61a0: 74 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  te.  sqlite3 db 
61b0: 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73  test.db2.  execs
61c0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
61d0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
61e0: 45 4c 45 54 45 3b 0a 20 20 20 20 41 54 54 41 43  ELETE;.    ATTAC
61f0: 48 20 27 74 65 73 74 2e 64 62 33 27 20 41 53 20  H 'test.db3' AS 
6200: 74 68 72 65 65 3b 0a 20 20 20 20 43 52 45 41 54  three;.    CREAT
6210: 45 20 54 41 42 4c 45 20 74 68 72 65 65 2e 74 33  E TABLE three.t3
6220: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
6230: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
6240: 53 28 31 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20  S(1, 't3.1');.  
6250: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55    BEGIN;.      U
6260: 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d  PDATE t2 SET b =
6270: 20 27 74 32 2e 33 27 3b 0a 20 20 20 20 20 20 55   't2.3';.      U
6280: 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d  PDATE t3 SET b =
6290: 20 27 74 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d   't3.3';.    COM
62a0: 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20  MIT;.  }.  expr 
62b0: 7b 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31  {$::mj_filename1
62c0: 20 21 3d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61   != $::mj_filena
62d0: 6d 65 7d 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73  me}.} {1}.faults
62e0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
62f0: 65 6f 70 65 6e 0a 74 76 20 66 69 6c 74 65 72 20  eopen.tv filter 
6300: 7b 7d 0a 0a 23 20 54 68 65 20 66 69 6c 65 2d 73  {}..# The file-s
6310: 79 73 74 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69  ystem now contai
6320: 6e 73 3a 0a 23 0a 23 20 20 20 2a 20 74 68 72 65  ns:.#.#   * thre
6330: 65 20 64 61 74 61 62 61 73 65 73 0a 23 20 20 20  e databases.#   
6340: 2a 20 74 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72  * three hot-jour
6350: 6e 61 6c 20 66 69 6c 65 73 0a 23 20 20 20 2a 20  nal files.#   * 
6360: 74 77 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  two master-journ
6370: 61 6c 20 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68  al files..#.# Th
6380: 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61  e hot-journals a
6390: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
63a0: 65 73 74 2e 64 62 32 20 61 6e 64 20 74 65 73 74  est.db2 and test
63b0: 2e 64 62 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20  .db3 point to.# 
63c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24  master journal $
63d0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54  ::mj_filename. T
63e0: 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  he hot-journal f
63f0: 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
6400: 69 74 68 0a 23 20 74 65 73 74 2e 64 62 20 70 6f  ith.# test.db po
6410: 69 6e 74 73 20 74 6f 20 6d 61 73 74 65 72 20 6a  ints to master j
6420: 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c  ournal $::mj_fil
6430: 65 6e 61 6d 65 31 2e 20 53 6f 20 72 65 61 64 69  ename1. So readi
6440: 6e 67 20 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64  ng from.# test.d
6450: 62 20 73 68 6f 75 6c 64 20 64 65 6c 65 74 65 20  b should delete 
6460: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e  $::mj_filename1.
6470: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
6480: 31 2e 34 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72  1.4.6.9 {.  lsor
6490: 74 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a  t [glob test.db*
64a0: 5d 0a 7d 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74  ].} [lsort [list
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74             \.  t
64e0: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 20  est.db test.db2 
64f0: 74 65 73 74 2e 64 62 33 20 20 20 20 20 20 20 20  test.db3        
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64        \.  test.d
6520: 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64  b-journal test.d
6530: 62 32 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e  b2-journal test.
6540: 64 62 33 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20  db3-journal     
6550: 20 5c 0a 20 20 5b 66 69 6c 65 20 74 61 69 6c 20   \.  [file tail 
6560: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20  $::mj_filename] 
6570: 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a  [file tail $::mj
6580: 5f 66 69 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a  _filename1].]]..
6590: 23 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  # The master-jou
65a0: 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  rnal $::mj_filen
65b0: 61 6d 65 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f  ame1 contains po
65c0: 69 6e 74 65 72 73 20 74 6f 20 74 65 73 74 2e 64  inters to test.d
65d0: 62 20 61 6e 64 20 0a 23 20 74 65 73 74 2e 64 62  b and .# test.db
65e0: 32 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 68  2. However the h
65f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63  ot-journal assoc
6600: 69 61 74 65 64 20 77 69 74 68 20 74 65 73 74 2e  iated with test.
6610: 64 62 32 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20  db2 points to.# 
6620: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
6630: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72  er-journal. Ther
6640: 65 66 6f 72 65 2c 20 72 65 61 64 69 6e 67 20 66  efore, reading f
6650: 72 6f 6d 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79  rom test.db only
6660: 20 73 68 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f   should.# be eno
6670: 75 67 68 20 74 6f 20 63 61 75 73 65 20 53 51 4c  ugh to cause SQL
6680: 69 74 65 20 74 6f 20 64 65 6c 65 74 65 20 24 3a  ite to delete $:
6690: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23  :mj_filename1..#
66a0: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
66b0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b   pager1.4.6.10 {
66c0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
66d0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b  mj_filename  } {
66e0: 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20  1}.do_test      
66f0: 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 31     pager1.4.6.11
6700: 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24   { file exists $
6710: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d  ::mj_filename1 }
6720: 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {1}.do_execsql_
6730: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6740: 31 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  12 { SELECT * FR
6750: 4f 4d 20 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d  OM t1 } {1 t1.1}
6760: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
6770: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b   pager1.4.6.13 {
6780: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
6790: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b  mj_filename  } {
67a0: 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20  1}.do_test      
67b0: 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34     pager1.4.6.14
67c0: 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24   { file exists $
67d0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d  ::mj_filename1 }
67e0: 20 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   {0}..do_execsql
67f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36  _test pager1.4.6
6800: 2e 31 32 20 7b 0a 20 20 41 54 54 41 43 48 20 27  .12 {.  ATTACH '
6810: 74 65 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f  test.db2' AS two
6820: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
6830: 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d  M t2;.} {1 t2.1}
6840: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
6850: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b   pager1.4.6.13 {
6860: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
6870: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b  mj_filename }  {
6880: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
6890: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34  st pager1.4.6.14
68a0: 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73   {.  ATTACH 'tes
68b0: 74 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b  t.db3' AS three;
68c0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
68d0: 20 74 33 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a   t3;.} {1 t3.1}.
68e0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
68f0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20  pager1.4.6.15 { 
6900: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6910: 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30  j_filename }  {0
6920: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  }..db close.tv d
6930: 65 6c 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74  elete..testvfs t
6940: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20  v -default 1.tv 
6950: 73 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74  sectorsize 512.t
6960: 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e  v script copy_on
6970: 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a  _journal_delete.
6980: 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  tv filter xDelet
6990: 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a  e.proc copy_on_j
69a0: 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d  ournal_delete {m
69b0: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
69c0: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
69d0: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72  ring match *jour
69e0: 6e 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20  nal $filename]} 
69f0: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20  faultsim_save . 
6a00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6a10: 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c  K.}.faultsim_del
6a20: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ete_and_reopen.d
6a30: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
6a40: 61 67 65 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20  ager1.4.7.1 {.  
6a50: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
6a60: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
6a70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
6a80: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
6a90: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
6aa0: 58 20 69 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20  X i1 ON t1(y);. 
6ab0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6ac0: 56 41 4c 55 45 53 28 27 49 27 2c 20 20 20 27 6f  VALUES('I',   'o
6ad0: 6e 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ne');.  INSERT I
6ae0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49  NTO t1 VALUES('I
6af0: 49 27 2c 20 20 27 66 6f 75 72 27 29 3b 0a 20 20  I',  'four');.  
6b00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6b10: 41 4c 55 45 53 28 27 49 49 49 27 2c 20 27 6e 69  ALUES('III', 'ni
6b20: 6e 65 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  ne');.  BEGIN;. 
6b30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6b40: 31 20 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27  1 VALUES('IV', '
6b50: 73 69 78 74 65 65 6e 27 29 3b 0a 20 20 20 20 49  sixteen');.    I
6b60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6b70: 4c 55 45 53 28 27 56 27 20 2c 20 27 74 77 65 6e  LUES('V' , 'twen
6b80: 74 79 66 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d  tyfive');.  COMM
6b90: 49 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74  IT;.} {delete}.t
6ba0: 76 20 66 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63  v filter {}.db c
6bb0: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 20 0a  lose.tv delete .
6bc0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
6bd0: 2e 37 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69  .7.2 {.  faultsi
6be0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6bf0: 6f 70 65 6e 0a 20 20 63 61 74 63 68 20 7b 66 69  open.  catch {fi
6c00: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
6c10: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70  st.db-journal -p
6c20: 65 72 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d  ermissions r----
6c30: 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66  ----}.  catch {f
6c40: 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74  ile attributes t
6c50: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d  est.db-journal -
6c60: 72 65 61 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61  readonly 1}.  ca
6c70: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
6c80: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
6c90: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
6ca0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
6cb0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
6cc0: 34 2e 37 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f  4.7.3 {.  db clo
6cd0: 73 65 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65  se.  catch {file
6ce0: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
6cf0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72  .db-journal -per
6d00: 6d 69 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72  missions rw-rw-r
6d10: 77 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c  w-}.  catch {fil
6d20: 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73  e attributes tes
6d30: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65  t.db-journal -re
6d40: 61 64 6f 6e 6c 79 20 30 7d 0a 20 20 64 65 6c 65  adonly 0}.  dele
6d50: 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d  te_file test.db-
6d60: 6a 6f 75 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65  journal.  file e
6d70: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
6d80: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d  urnal.} {0}..#--
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
6de0: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 64 65  llowing tests de
6df0: 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 2d 66 69  al with multi-fi
6e00: 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20  le commits..#.# 
6e10: 70 61 67 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68  pager1-5.1.*: Th
6e20: 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
6e30: 75 6c 74 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74  ulti-file cannot
6e40: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 62 65   be committed be
6e50: 63 61 75 73 65 0a 23 20 20 20 20 20 20 20 20 20  cause.#         
6e60: 20 20 20 20 20 20 61 6e 6f 74 68 65 72 20 63 6f        another co
6e70: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
6e80: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
6e90: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a  k on one of the.
6ea0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
6eb0: 66 69 6c 65 73 2e 20 41 66 74 65 72 20 74 68 65  files. After the
6ec0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
6ed0: 72 65 6d 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d  removed, the COM
6ee0: 4d 49 54 20 73 75 63 63 65 65 64 73 2e 0a 23 0a  MIT succeeds..#.
6ef0: 23 20 70 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20  # pager1-5.2.*: 
6f00: 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  Multi-file commi
6f10: 74 73 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  ts with journal_
6f20: 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23  mode=memory..#.#
6f30: 20 70 61 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d   pager1-5.3.*: M
6f40: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
6f50: 73 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  s with journal_m
6f60: 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20  ode=memory..#.# 
6f70: 70 61 67 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68  pager1-5.4.*: Ch
6f80: 65 63 6b 20 74 68 61 74 20 77 69 74 68 20 73 79  eck that with sy
6f90: 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c  nchronous=normal
6fa0: 2c 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  , the master-jou
6fb0: 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20  rnal file.#     
6fc0: 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 20 69            name i
6fd0: 73 20 61 64 64 65 64 20 74 6f 20 61 20 6a 6f 75  s added to a jou
6fe0: 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69  rnal file immedi
6ff0: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
7000: 6c 61 73 74 0a 23 20 20 20 20 20 20 20 20 20 20  last.#          
7010: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63       journal rec
7020: 6f 72 64 2e 20 42 75 74 20 77 69 74 68 20 73 79  ord. But with sy
7030: 6e 63 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20  nchronous=full, 
7040: 65 78 74 72 61 20 75 6e 75 73 65 64 20 73 70 61  extra unused spa
7050: 63 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ce.#            
7060: 20 20 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20     is allocated 
7070: 62 65 74 77 65 65 6e 20 74 68 65 20 6c 61 73 74  between the last
7080: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
7090: 61 6e 64 20 74 68 65 20 0a 23 20 20 20 20 20 20  and the .#      
70a0: 20 20 20 20 20 20 20 20 20 6d 61 73 74 65 72 2d           master-
70b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
70c0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6d 61  e so that the ma
70d0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
70e0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
70f0: 20 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20    name does not 
7100: 6c 69 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  lie on the same 
7110: 73 65 63 74 6f 72 20 61 73 20 74 68 65 20 6c 61  sector as the la
7120: 73 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  st journal file.
7130: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
7140: 72 65 63 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65  record..#.# page
7150: 72 31 2d 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20  r1-5.5.*: Check 
7160: 74 68 61 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  that in journal_
7170: 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 6d 6f 64  mode=PERSIST mod
7180: 65 2c 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e, a journal fil
7190: 65 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20  e is.#          
71a0: 20 20 20 20 20 74 72 75 6e 63 61 74 65 64 20 74       truncated t
71b0: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 77 68 65  o zero bytes whe
71c0: 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  n a multi-file t
71d0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23  ransaction is .#
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
71f0: 6f 6d 6d 69 74 74 65 64 20 28 69 6e 73 74 65 61  ommitted (instea
7200: 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 63  d of the first c
7210: 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 62  ouple of bytes b
7220: 65 69 6e 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a  eing zeroed)..#.
7230: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
7240: 2d 35 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  -5.1.1 {.  fault
7250: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
7260: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
7270: 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  {.    ATTACH 'te
7280: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a  st.db2' AS aux;.
7290: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
72a0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t1(a, b);.    C
72b0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e  REATE TABLE aux.
72c0: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t2(a, b);.    IN
72d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
72e0: 55 45 53 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29  UES(17, 'Lenin')
72f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
7300: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 32 2c 20  O t1 VALUES(22, 
7310: 27 53 74 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49  'Stalin');.    I
7320: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7330: 4c 55 45 53 28 35 33 2c 20 27 4b 68 72 75 73 68  LUES(53, 'Khrush
7340: 63 68 65 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  chev');.  }.} {}
7350: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7360: 35 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  5.1.2 {.  execsq
7370: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
7380: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
7390: 20 74 31 20 56 41 4c 55 45 53 28 36 34 2c 20 27   t1 VALUES(64, '
73a0: 42 72 65 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20  Brezhnev');.    
73b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
73c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
73d0: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
73e0: 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20   db2 test.db2.  
73f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
7400: 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  GIN;.      SELEC
7410: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
7420: 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73   db2.} {}.do_tes
7430: 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b  t pager1-5.1.3 {
7440: 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d  .  catchsql COMM
7450: 49 54 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  IT.} {1 {databas
7460: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f  e is locked}}.do
7470: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
7480: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43  .4 {.  execsql C
7490: 4f 4d 4d 49 54 20 64 62 32 0a 20 20 65 78 65 63  OMMIT db2.  exec
74a0: 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65  sql COMMIT.  exe
74b0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
74c0: 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20  FROM t2 } db2.} 
74d0: 7b 31 37 20 4c 65 6e 69 6e 20 32 32 20 53 74 61  {17 Lenin 22 Sta
74e0: 6c 69 6e 20 35 33 20 4b 68 72 75 73 68 63 68 65  lin 53 Khrushche
74f0: 76 20 36 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64  v 64 Brezhnev}.d
7500: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7510: 31 2e 35 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73  1.5 {.  db2 clos
7520: 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  e.} {}..do_test 
7530: 70 61 67 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20  pager1-5.2.1 {. 
7540: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
7550: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
7560: 64 65 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20  de = memory;.   
7570: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
7580: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
7590: 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f  UES(84, 'Andropo
75a0: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
75b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
75c0: 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29  (84, 'Andropov')
75d0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
75e0: 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f  }.} {memory}.do_
75f0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 33 2e  test pager1-5.3.
7600: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
7610: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7620: 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20  al_mode = off;. 
7630: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
7640: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
7650: 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61  ALUES(85, 'Gorba
7660: 63 68 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e  chev');.      IN
7670: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
7680: 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68  UES(85, 'Gorbach
7690: 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  ev');.    COMMIT
76a0: 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64  ;.  }.} {off}..d
76b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
76c0: 34 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  4.1 {.  db close
76d0: 0a 20 20 74 65 73 74 76 66 73 20 74 76 0a 20 20  .  testvfs tv.  
76e0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
76f0: 64 62 20 2d 76 66 73 20 74 76 0a 20 20 65 78 65  db -vfs tv.  exe
7700: 63 73 71 6c 20 7b 20 41 54 54 41 43 48 20 27 74  csql { ATTACH 't
7710: 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 20  est.db2' AS aux 
7720: 7d 0a 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78  }..  tv filter x
7730: 44 65 6c 65 74 65 0a 20 20 74 76 20 73 63 72 69  Delete.  tv scri
7740: 70 74 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73  pt max_journal_s
7750: 69 7a 65 0a 20 20 74 76 20 73 65 63 74 6f 72 73  ize.  tv sectors
7760: 69 7a 65 20 35 31 32 0a 20 20 73 65 74 20 3a 3a  ize 512.  set ::
7770: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20  max_journal 0.  
7780: 70 72 6f 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c  proc max_journal
7790: 5f 73 69 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72  _size {method ar
77a0: 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 7a  gs} {.    set sz
77b0: 20 30 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73   0.    catch { s
77c0: 65 74 20 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65  et sz [file size
77d0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
77e0: 5d 20 7d 0a 20 20 20 20 69 66 20 7b 24 73 7a 20  ] }.    if {$sz 
77f0: 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  > $::max_journal
7800: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a  } {.      set ::
7810: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a  max_journal $sz.
7820: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
7830: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20   SQLITE_OK.  }. 
7840: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
7850: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
7860: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
7870: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
7880: 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20  ous = NORMAL;.  
7890: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
78a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
78b0: 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63  LUES(85, 'Gorbac
78c0: 68 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  hev');.      INS
78d0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
78e0: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
78f0: 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  v');.    COMMIT;
7900: 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78  .  }.  set ::max
7910: 5f 6a 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72  _journal.} [expr
7920: 20 32 36 31 35 2b 5b 73 74 72 69 6e 67 20 6c 65   2615+[string le
7930: 6e 67 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 6f 5f  ngth [pwd]]].do_
7940: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e  test pager1-5.4.
7950: 32 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f  2 {.  set ::max_
7960: 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 65 78 65 63  journal 0.  exec
7970: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
7980: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66   synchronous = f
7990: 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ull;.    BEGIN;.
79a0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
79b0: 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27  M t1 WHERE b = '
79c0: 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 20 20 44 45  Lenin';.      DE
79d0: 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45  LETE FROM t2 WHE
79e0: 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a  RE b = 'Lenin';.
79f0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
7a00: 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72    set ::max_jour
7a10: 6e 61 6c 0a 7d 20 5b 65 78 70 72 20 33 31 31 31  nal.} [expr 3111
7a20: 2b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  +[string length 
7a30: 5b 70 77 64 5d 5d 5d 0a 64 62 20 63 6c 6f 73 65  [pwd]]].db close
7a40: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 64 6f 5f 74  .tv delete..do_t
7a50: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 31  est pager1-5.5.1
7a60: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
7a70: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
7a80: 6c 20 7b 20 0a 20 20 20 20 41 54 54 41 43 48 20  l { .    ATTACH 
7a90: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75  'test.db2' AS au
7aa0: 78 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  x;.    PRAGMA jo
7ab0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
7ac0: 53 49 53 54 3b 0a 20 20 20 20 43 52 45 41 54 45  SIST;.    CREATE
7ad0: 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b   TABLE t3(a, b);
7ae0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7af0: 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t3 SELECT rando
7b00: 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
7b10: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
7b20: 4f 4d 20 74 31 3b 0a 20 20 20 20 55 50 44 41 54  OM t1;.    UPDAT
7b30: 45 20 74 33 20 53 45 54 20 62 20 3d 20 72 61 6e  E t3 SET b = ran
7b40: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 3b 0a 20  domblob(1500);. 
7b50: 20 7d 0a 20 20 65 78 70 72 20 5b 66 69 6c 65 20   }.  expr [file 
7b60: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
7b70: 72 6e 61 6c 5d 20 3e 20 31 35 30 30 30 0a 7d 20  rnal] > 15000.} 
7b80: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {1}.do_test page
7b90: 72 31 2d 35 2e 35 2e 32 20 7b 0a 20 20 65 78 65  r1-5.5.2 {.  exe
7ba0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
7bb0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
7bc0: 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b  full;.    BEGIN;
7bd0: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
7be0: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20  OM t1 WHERE b = 
7bf0: 27 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 20 20  'Stalin';.      
7c00: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57  DELETE FROM t2 W
7c10: 48 45 52 45 20 62 20 3d 20 27 53 74 61 6c 69 6e  HERE b = 'Stalin
7c20: 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  ';.    COMMIT;. 
7c30: 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   }.  file size t
7c40: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d  est.db-journal.}
7c50: 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   {0}...#--------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
7cb0: 67 20 74 65 73 74 73 20 77 6f 72 6b 20 77 69 74  g tests work wit
7cc0: 68 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61  h "PRAGMA max_pa
7cd0: 67 65 5f 63 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74  ge_count".#.do_t
7ce0: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 20 7b  est pager1-6.1 {
7cf0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
7d00: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
7d10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
7d20: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
7d30: 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41   = none;.    PRA
7d40: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
7d50: 6e 74 20 3d 20 31 30 3b 0a 20 20 20 20 43 52 45  nt = 10;.    CRE
7d60: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
7d70: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
7d80: 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20  ABLE t3(a, b);. 
7d90: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7da0: 74 34 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t4(a, b);.    CR
7db0: 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c  EATE TABLE t5(a,
7dc0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
7dd0: 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a  TABLE t6(a, b);.
7de0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7df0: 20 74 37 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t7(a, b);.    C
7e00: 52 45 41 54 45 20 54 41 42 4c 45 20 74 38 28 61  REATE TABLE t8(a
7e10: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
7e20: 20 54 41 42 4c 45 20 74 39 28 61 2c 20 62 29 3b   TABLE t9(a, b);
7e30: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7e40: 45 20 74 31 30 28 61 2c 20 62 29 3b 0a 20 20 7d  E t10(a, b);.  }
7e50: 0a 7d 20 7b 31 30 7d 0a 64 6f 5f 63 61 74 63 68  .} {10}.do_catch
7e60: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
7e70: 36 2e 32 20 7b 0a 20 20 43 52 45 41 54 45 20 54  6.2 {.  CREATE T
7e80: 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29 0a 7d  ABLE t11(a, b).}
7e90: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 6f 72   {1 {database or
7ea0: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a   disk is full}}.
7eb0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7ec0: 70 61 67 65 72 31 2d 36 2e 34 20 7b 20 50 52 41  pager1-6.4 { PRA
7ed0: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
7ee0: 6e 74 20 20 20 20 20 20 7d 20 7b 31 30 7d 0a 64  nt      } {10}.d
7ef0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
7f00: 61 67 65 72 31 2d 36 2e 35 20 7b 20 50 52 41 47  ager1-6.5 { PRAG
7f10: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
7f20: 74 20 3d 20 31 35 20 7d 20 7b 31 35 7d 0a 64 6f  t = 15 } {15}.do
7f30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
7f40: 67 65 72 31 2d 36 2e 36 20 7b 20 43 52 45 41 54  ger1-6.6 { CREAT
7f50: 45 20 54 41 42 4c 45 20 74 31 31 28 61 2c 20 62  E TABLE t11(a, b
7f60: 29 20 20 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78  )     } {}.do_ex
7f70: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
7f80: 31 2d 36 2e 37 20 7b 0a 20 20 42 45 47 49 4e 3b  1-6.7 {.  BEGIN;
7f90: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7fa0: 20 74 31 31 20 56 41 4c 55 45 53 28 31 2c 20 32   t11 VALUES(1, 2
7fb0: 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61  );.    PRAGMA ma
7fc0: 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31  x_page_count = 1
7fd0: 33 3b 0a 7d 20 7b 31 33 7d 0a 64 6f 5f 65 78 65  3;.} {13}.do_exe
7fe0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
7ff0: 2d 36 2e 38 20 7b 0a 20 20 20 20 49 4e 53 45 52  -6.8 {.    INSER
8000: 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45  T INTO t11 VALUE
8010: 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 50 52 41  S(3, 4);.    PRA
8020: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
8030: 6e 74 20 3d 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a  nt = 10;.} {11}.
8040: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8050: 70 61 67 65 72 31 2d 36 2e 39 20 7b 20 43 4f 4d  pager1-6.9 { COM
8060: 4d 49 54 20 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65  MIT } {}..do_exe
8070: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
8080: 2d 36 2e 31 30 20 7b 20 50 52 41 47 4d 41 20 6d  -6.10 { PRAGMA m
8090: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20  ax_page_count = 
80a0: 31 30 20 7d 20 7b 31 31 7d 0a 64 6f 5f 65 78 65  10 } {11}.do_exe
80b0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
80c0: 2d 36 2e 31 31 20 7b 20 53 45 4c 45 43 54 20 2a  -6.11 { SELECT *
80d0: 20 46 52 4f 4d 20 74 31 31 20 7d 20 20 20 20 20   FROM t11 }     
80e0: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 64       {1 2 3 4}.d
80f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
8100: 61 67 65 72 31 2d 36 2e 31 32 20 7b 20 50 52 41  ager1-6.12 { PRA
8110: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
8120: 6e 74 20 7d 20 20 20 20 20 20 7b 31 31 7d 0a 0a  nt }      {11}..
8130: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
8180: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
8190: 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52 41  s work with "PRA
81a0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
81b0: 3d 54 52 55 4e 43 41 54 45 22 20 61 6e 64 0a 23  =TRUNCATE" and.#
81c0: 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67   "PRAGMA locking
81d0: 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 22  _mode=EXCLUSIVE"
81e0: 2e 0a 23 0a 23 20 45 61 63 68 20 74 65 73 74 20  ..#.# Each test 
81f0: 69 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  is specified wit
8200: 68 20 35 20 76 61 72 69 61 62 6c 65 73 2e 20 41  h 5 variables. A
8210: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20  s follows:.#.#  
8220: 20 24 74 6e 3a 20 20 54 65 73 74 20 4e 75 6d 62   $tn:  Test Numb
8230: 65 72 2e 20 55 73 65 64 20 61 73 20 70 61 72 74  er. Used as part
8240: 20 6f 66 20 74 68 65 20 5b 64 6f 5f 74 65 73 74   of the [do_test
8250: 5d 20 74 65 73 74 20 6e 61 6d 65 73 2e 0a 23 20  ] test names..# 
8260: 20 20 24 73 71 6c 3a 20 53 51 4c 20 74 6f 20 65    $sql: SQL to e
8270: 78 65 63 75 74 65 2e 0a 23 20 20 20 24 72 65 73  xecute..#   $res
8280: 3a 20 45 78 70 65 63 74 65 64 20 72 65 73 75 6c  : Expected resul
8290: 74 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20 24  t of executing $
82a0: 73 71 6c 2e 0a 23 20 20 20 24 6a 73 3a 20 20 54  sql..#   $js:  T
82b0: 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65  he expected size
82c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
82d0: 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20  file, in bytes, 
82e0: 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a  after executing.
82f0: 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51  #         the SQ
8300: 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20  L script. Or -1 
8310: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  if the journal i
8320: 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74  s not expected t
8330: 6f 20 65 78 69 73 74 2e 0a 23 20 20 20 24 77 73  o exist..#   $ws
8340: 3a 20 20 54 68 65 20 65 78 70 65 63 74 65 64 20  :  The expected 
8350: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 41 4c 20  size of the WAL 
8360: 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20  file, in bytes, 
8370: 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a  after executing.
8380: 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51  #         the SQ
8390: 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20  L script. Or -1 
83a0: 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
83b0: 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65 78  t expected to ex
83c0: 69 73 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  ist..#.ifcapable
83d0: 20 77 61 6c 20 7b 0a 20 20 66 61 75 6c 74 73 69   wal {.  faultsi
83e0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
83f0: 70 65 6e 0a 20 20 66 6f 72 65 61 63 68 20 7b 74  pen.  foreach {t
8400: 6e 20 73 71 6c 20 72 65 73 20 6a 73 20 77 73 7d  n sql res js ws}
8410: 20 5b 73 75 62 73 74 20 7b 0a 20 20 0a 20 20 20   [subst {.  .   
8420: 20 31 20 20 7b 0a 20 20 20 20 20 20 43 52 45 41   1  {.      CREA
8430: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
8440: 29 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  );.      PRAGMA 
8450: 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b  auto_vacuum=OFF;
8460: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 73 79  .      PRAGMA sy
8470: 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
8480: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70  ;.      PRAGMA p
8490: 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20  age_size=1024;. 
84a0: 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
84b0: 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
84c0: 56 45 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  VE;.      PRAGMA
84d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52   journal_mode=TR
84e0: 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 49 4e  UNCATE;.      IN
84f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
8500: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d  UES(1, 2);.    }
8510: 20 7b 65 78 63 6c 75 73 69 76 65 20 74 72 75 6e   {exclusive trun
8520: 63 61 74 65 7d 20 30 20 2d 31 0a 20 20 0a 20 20  cate} 0 -1.  .  
8530: 20 20 32 20 20 7b 0a 20 20 20 20 20 20 42 45 47    2  {.      BEG
8540: 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20  IN IMMEDIATE;.  
8550: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
8560: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f  ROM t1;.      CO
8570: 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32  MMIT;.    } {1 2
8580: 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 33 20  } 0 -1.  .    3 
8590: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
85a0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
85b0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
85c0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31  COMMIT;.    } {1
85d0: 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20   2} 0 -1.  .    
85e0: 34 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  4  { PRAGMA jour
85f0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d  nal_mode = WAL }
8600: 20 20 20 20 77 61 6c 20 20 20 20 20 20 20 2d 31      wal       -1
8610: 20 2d 31 0a 20 20 20 20 35 20 20 7b 20 49 4e 53   -1.    5  { INS
8620: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8630: 45 53 28 33 2c 20 34 29 20 7d 20 20 7b 7d 20 20  ES(3, 4) }  {}  
8640: 20 20 20 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69        -1 [wal_fi
8650: 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a  le_size 1 1024].
8660: 20 20 20 20 36 20 20 7b 20 50 52 41 47 4d 41 20      6  { PRAGMA 
8670: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 4e  locking_mode = N
8680: 4f 52 4d 41 4c 20 7d 20 65 78 63 6c 75 73 69 76  ORMAL } exclusiv
8690: 65 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  e -1 [wal_file_s
86a0: 69 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 20 20  ize 1 1024].    
86b0: 37 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  7  { INSERT INTO
86c0: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29   t1 VALUES(5, 6)
86d0: 3b 20 7d 20 7b 7d 20 20 20 20 20 20 20 20 2d 31  ; } {}        -1
86e0: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
86f0: 32 20 31 30 32 34 5d 0a 20 20 0a 20 20 20 20 38  2 1024].  .    8
8700: 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e    { PRAGMA journ
8710: 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41  al_mode = TRUNCA
8720: 54 45 20 7d 20 74 72 75 6e 63 61 74 65 20 20 20  TE } truncate   
8730: 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20 20 20         0 -1.    
8740: 39 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  9  { INSERT INTO
8750: 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38 29   t1 VALUES(7, 8)
8760: 20 7d 20 20 20 20 7b 7d 20 20 20 20 20 20 20 20   }    {}        
8770: 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20 20 20          0 -1.   
8780: 20 31 30 20 7b 20 53 45 4c 45 43 54 20 2a 20 46   10 { SELECT * F
8790: 52 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20  ROM t1 }        
87a0: 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 20         {1 2 3 4 
87b0: 35 20 36 20 37 20 38 7d 20 30 20 2d 31 0a 20 20  5 6 7 8} 0 -1.  
87c0: 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 64 6f 5f 65  .  }] {.    do_e
87d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
87e0: 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20 24 73 71  r1-7.1.$tn.1 $sq
87f0: 6c 20 24 72 65 73 0a 20 20 20 20 63 61 74 63 68  l $res.    catch
8800: 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b 20 73 65   { set J -1 ; se
8810: 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  t J [file size t
8820: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20  est.db-journal] 
8830: 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73 65  }.    catch { se
8840: 74 20 57 20 2d 31 20 3b 20 73 65 74 20 57 20 5b  t W -1 ; set W [
8850: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
8860: 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20 64 6f 5f  b-wal] }.    do_
8870: 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 31 2e  test pager1-7.1.
8880: 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20 24 4a 20  $tn.2 { list $J 
8890: 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a 73 20 24  $W } [list $js $
88a0: 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65  ws].  }.}..do_te
88b0: 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 31 20  st pager1-7.2.1 
88c0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
88d0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
88e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
88f0: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
8900: 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 3b 0a  de = EXCLUSIVE;.
8910: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8920: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 42   t1(a, b);.    B
8930: 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 52 41 47  EGIN;.      PRAG
8940: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
8950: 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 20 20  = delete;.      
8960: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
8970: 6f 64 65 20 3d 20 74 72 75 6e 63 61 74 65 3b 0a  ode = truncate;.
8980: 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65    }.} {exclusive
8990: 20 64 65 6c 65 74 65 20 74 72 75 6e 63 61 74 65   delete truncate
89a0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
89b0: 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  -7.2.2 {.  execs
89c0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
89d0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
89e0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
89f0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8a00: 64 65 20 3d 20 70 65 72 73 69 73 74 20 7d 0a 7d  de = persist }.}
8a10: 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64 6f 5f 74   {truncate}.do_t
8a20: 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 2e 33  est pager1-7.2.3
8a30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
8a40: 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65 63 73 71  OMMIT }.  execsq
8a50: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
8a60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65  ournal_mode = pe
8a70: 72 73 69 73 74 3b 0a 20 20 20 20 50 52 41 47 4d  rsist;.    PRAGM
8a80: 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  A journal_size_l
8a90: 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b 70 65 72  imit;.  }.} {per
8aa0: 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d 2d  sist -1}..#-----
8ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8af0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
8b00: 77 69 6e 67 20 74 65 73 74 73 2c 20 70 61 67 65  wing tests, page
8b10: 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20 74 68 61  r1-8.*, test tha
8b20: 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 66 69  t the special fi
8b30: 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a 6d 65 6d  lenames .# ":mem
8b40: 6f 72 79 3a 22 20 61 6e 64 20 22 22 20 6f 70 65  ory:" and "" ope
8b50: 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  n temporary data
8b60: 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68  bases..#.foreach
8b70: 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65 7d 20 7b   {tn filename} {
8b80: 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20  .  1 :memory:.  
8b90: 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65  2 "".} {.  do_te
8ba0: 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e  st pager1-8.$tn.
8bb0: 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d  1 {.    faultsim
8bc0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
8bd0: 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a  en.    db close.
8be0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 24      sqlite3 db $
8bf0: 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 65 78 65  filename.    exe
8c00: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
8c10: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
8c20: 3d 20 31 3b 0a 20 20 20 20 20 20 43 52 45 41 54  = 1;.      CREAT
8c30: 45 20 54 41 42 4c 45 20 78 31 28 78 29 3b 0a 20  E TABLE x1(x);. 
8c40: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
8c50: 20 78 31 20 56 41 4c 55 45 53 28 27 43 68 61 72   x1 VALUES('Char
8c60: 6c 65 73 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  les');.      INS
8c70: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
8c80: 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a 20 20 20  ES('James');.   
8c90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
8ca0: 31 20 56 41 4c 55 45 53 28 27 4d 61 72 79 27 29  1 VALUES('Mary')
8cb0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
8cc0: 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 7d 0a   FROM x1;.    }.
8cd0: 20 20 7d 20 7b 43 68 61 72 6c 65 73 20 4a 61 6d    } {Charles Jam
8ce0: 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64 6f 5f 74  es Mary}..  do_t
8cf0: 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e  est pager1-8.$tn
8d00: 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .2 {.    sqlite3
8d10: 20 64 62 32 20 24 66 69 6c 65 6e 61 6d 65 0a 20   db2 $filename. 
8d20: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45     catchsql { SE
8d30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d  LECT * FROM x1 }
8d40: 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20   db2.  } {1 {no 
8d50: 73 75 63 68 20 74 61 62 6c 65 3a 20 78 31 7d 7d  such table: x1}}
8d60: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
8d70: 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e  est pager1-8.$tn
8d80: 2e 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  .3 {.    BEGIN;.
8d90: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
8da0: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 57 69 6c  O x1 VALUES('Wil
8db0: 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20 20 49 4e  liam');.      IN
8dc0: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
8dd0: 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a 20 20 20  UES('Anne');.   
8de0: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20 7b   ROLLBACK;.  } {
8df0: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8e40: 23 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  # The next block
8e50: 20 6f 66 20 74 65 73 74 73 20 2d 20 70 61 67 65   of tests - page
8e60: 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c 20 77 69  r1-9.* - deal wi
8e70: 74 68 20 69 6e 74 65 72 61 63 74 69 6f 6e 73 20  th interactions 
8e80: 62 65 74 77 65 65 6e 0a 23 20 74 68 65 20 70 61  between.# the pa
8e90: 67 65 72 20 61 6e 64 20 74 68 65 20 62 61 63 6b  ger and the back
8ea0: 75 70 20 41 50 49 2e 20 54 65 73 74 20 63 61 73  up API. Test cas
8eb0: 65 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31  es:.#.#   pager1
8ec0: 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61  -9.1.*: Test tha
8ed0: 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c  t a backup compl
8ee0: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
8ef0: 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20  y even if the.# 
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 73 6f 75 72 63 65 20 64 62 20 69 73 20 77 72 69  source db is wri
8f20: 74 74 65 6e 20 74 6f 20 64 75 72 69 6e 67 20 74  tten to during t
8f30: 68 65 20 62 61 63 6b 75 70 20 6f 70 2e 0a 23 0a  he backup op..#.
8f40: 23 20 20 20 70 61 67 65 72 31 2d 39 2e 32 2e 2a  #   pager1-9.2.*
8f50: 3a 20 54 65 73 74 20 74 68 61 74 20 61 20 62 61  : Test that a ba
8f60: 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65 73 20 73  ckup completes s
8f70: 75 63 63 65 73 73 66 75 6c 6c 79 20 65 76 65 6e  uccessfully even
8f80: 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20 20   if the.#       
8f90: 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65            source
8fa0: 20 64 62 20 69 73 20 77 72 69 74 74 65 6e 20 74   db is written t
8fb0: 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f 6c 6c 65  o and then rolle
8fc0: 64 20 62 61 63 6b 20 64 75 72 69 6e 67 20 61 20  d back during a 
8fd0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
8fe0: 20 20 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74     backup operat
8ff0: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ion..#.do_test p
9000: 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b 0a 20 20  ager1-9.0.1 {.  
9010: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
9020: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
9030: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
9040: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
9050: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
9060: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
9070: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
9080: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 28  CREATE TABLE ab(
9090: 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20  a, b, UNIQUE(a, 
90a0: 62 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  b));.      INSER
90b0: 54 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53  T INTO ab VALUES
90c0: 28 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  ( a_string(200),
90d0: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 29   a_string(300) )
90e0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
90f0: 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f  NTO ab SELECT a_
9100: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
9110: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
9120: 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ab;.      INSERT
9130: 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20   INTO ab SELECT 
9140: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
9150: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
9160: 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45  M ab;.      INSE
9170: 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43  RT INTO ab SELEC
9180: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
9190: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
91a0: 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e  ROM ab;.      IN
91b0: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c  SERT INTO ab SEL
91c0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
91d0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
91e0: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20   FROM ab;.      
91f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53  INSERT INTO ab S
9200: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
9210: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
9220: 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20  0) FROM ab;.    
9230: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
9240: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
9250: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
9260: 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20  300) FROM ab;.  
9270: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9280: 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  ab SELECT a_stri
9290: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
92a0: 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a  g(300) FROM ab;.
92b0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
92c0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
92d0: 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20 20 73 71  er1-9.0.2 {.  sq
92e0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
92f0: 62 32 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 20  b2.  db2 eval { 
9300: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
9310: 65 20 3d 20 31 30 20 7d 0a 20 20 73 71 6c 69 74  e = 10 }.  sqlit
9320: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
9330: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c  main db main.  l
9340: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
9350: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
9360: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
9370: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
9380: 70 61 67 65 72 31 2d 39 2e 30 2e 33 20 7b 0a 20  pager1-9.0.3 {. 
9390: 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  db one {SELECT m
93a0: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
93b0: 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20   ab}.} [db2 one 
93c0: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
93d0: 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 0a  , b) FROM ab}]..
93e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
93f0: 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.1 {.  execsql
9400: 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54   { UPDATE ab SET
9410: 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30   a = a_string(20
9420: 31 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  1) }.  sqlite3_b
9430: 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e  ackup B db2 main
9440: 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65   db main.  B ste
9450: 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f  p 30.} {SQLITE_O
9460: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
9470: 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  1-9.1.2 {.  exec
9480: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20  sql { UPDATE ab 
9490: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
94a0: 28 33 30 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b  (301) }.  list [
94b0: 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42  B step 10000] [B
94c0: 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49   finish].} {SQLI
94d0: 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f  TE_DONE SQLITE_O
94e0: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
94f0: 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62 20 6f 6e  1-9.1.3 {. db on
9500: 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  e {SELECT md5sum
9510: 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a  (a, b) FROM ab}.
9520: 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45  } [db2 one {SELE
9530: 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20  CT md5sum(a, b) 
9540: 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73  FROM ab}].do_tes
9550: 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 34 20 7b  t pager1-9.1.4 {
9560: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
9570: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9580: 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 0a 64 6f  ab } } {128}..do
9590: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32  _test pager1-9.2
95a0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
95b0: 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20 61   UPDATE ab SET a
95c0: 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29   = a_string(202)
95d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63   }.  sqlite3_bac
95e0: 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64  kup B db2 main d
95f0: 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20  b main.  B step 
9600: 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  30.} {SQLITE_OK}
9610: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9620: 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  9.2.2 {.  execsq
9630: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
9640: 20 20 20 20 20 20 55 50 44 41 54 45 20 61 62 20        UPDATE ab 
9650: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
9660: 28 33 30 31 29 3b 0a 20 20 20 20 52 4f 4c 4c 42  (301);.    ROLLB
9670: 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20  ACK;.  }.  list 
9680: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
9690: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
96a0: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
96b0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
96c0: 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64 62 20 6f  r1-9.2.3 {. db o
96d0: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
96e0: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
96f0: 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c  .} [db2 one {SEL
9700: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
9710: 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65   FROM ab}].do_te
9720: 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 34 20  st pager1-9.2.4 
9730: 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45  { execsql { SELE
9740: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
9750: 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 64 62   ab } } {128}.db
9760: 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65   close.db2 close
9770: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
9780: 2d 39 2e 33 2e 31 20 7b 0a 20 20 74 65 73 74 76  -9.3.1 {.  testv
9790: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
97a0: 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65  .  tv sectorsize
97b0: 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69 6d   4096.  faultsim
97c0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
97d0: 65 6e 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  en..  execsql { 
97e0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
97f0: 20 3d 20 31 30 32 34 20 7d 0a 20 20 66 6f 72 20   = 1024 }.  for 
9800: 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69 20  {set ii 0} {$ii 
9810: 3c 20 34 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b  < 4} {incr ii} {
9820: 20 65 78 65 63 73 71 6c 20 22 43 52 45 41 54 45   execsql "CREATE
9830: 20 54 41 42 4c 45 20 74 24 7b 69 69 7d 28 61 2c   TABLE t${ii}(a,
9840: 20 62 29 22 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74   b)" }.} {}.do_t
9850: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e 32  est pager1-9.3.2
9860: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
9870: 20 74 65 73 74 2e 64 62 32 0a 0a 20 20 65 78 65   test.db2..  exe
9880: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
9890: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30  A page_size = 40
98a0: 39 36 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73  96;.    PRAGMA s
98b0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46  ynchronous = OFF
98c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
98d0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
98e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
98f0: 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a  (a, b);.  } db2.
9900: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
9910: 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20  p B db2 main db 
9920: 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30  main.  B step 30
9930: 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20  .  list [B step 
9940: 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68  10000] [B finish
9950: 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45  ].} {SQLITE_DONE
9960: 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74   SQLITE_OK}.do_t
9970: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e 33  est pager1-9.3.3
9980: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20   {.  db2 close. 
9990: 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64   db close.  tv d
99a0: 65 6c 65 74 65 0a 20 20 66 69 6c 65 20 73 69 7a  elete.  file siz
99b0: 65 20 74 65 73 74 2e 64 62 32 0a 7d 20 5b 66 69  e test.db2.} [fi
99c0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
99d0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
99e0: 2d 39 2e 34 2e 31 20 7b 0a 20 20 66 61 75 6c 74  -9.4.1 {.  fault
99f0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
9a00: 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20  eopen.  sqlite3 
9a10: 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65  db2 test.db2.  e
9a20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
9a30: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
9a40: 34 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54 45  4096;.    CREATE
9a50: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
9a60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9a70: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20  E t2(a, b);.  } 
9a80: 64 62 32 0a 20 20 73 71 6c 69 74 65 33 5f 62 61  db2.  sqlite3_ba
9a90: 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20  ckup B db2 main 
9aa0: 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74 20 5b  db main.  list [
9ab0: 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42  B step 10000] [B
9ac0: 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49   finish].} {SQLI
9ad0: 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f  TE_DONE SQLITE_O
9ae0: 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  K}.do_test pager
9af0: 31 2d 39 2e 34 2e 32 20 7b 0a 20 20 6c 69 73 74  1-9.4.2 {.  list
9b00: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
9b10: 2e 64 62 32 5d 20 5b 66 69 6c 65 20 73 69 7a 65  .db2] [file size
9b20: 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 30 20 30   test.db].} {0 0
9b30: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d  }.db2 close..#--
9b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b80: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
9b90: 68 61 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f  hat regardless o
9ba0: 66 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  f the value retu
9bb0: 72 6e 65 64 20 62 79 20 78 53 65 63 74 6f 72 53  rned by xSectorS
9bc0: 69 7a 65 28 29 2c 20 74 68 65 0a 23 20 6d 69 6e  ize(), the.# min
9bd0: 69 6d 75 6d 20 65 66 66 65 63 74 69 76 65 20 73  imum effective s
9be0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 35 31  ector-size is 51
9bf0: 32 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  2 and the maximu
9c00: 6d 20 36 35 35 33 36 20 62 79 74 65 73 2e 0a 23  m 65536 bytes..#
9c10: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
9c20: 61 75 6c 74 20 31 0a 66 6f 72 65 61 63 68 20 73  ault 1.foreach s
9c30: 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20 20 20  ectorsize {.    
9c40: 33 32 20 20 20 36 34 20 20 20 31 32 38 20 20 20  32   64   128   
9c50: 32 35 36 20 20 20 35 31 32 20 20 20 31 30 32 34  256   512   1024
9c60: 20 20 20 32 30 34 38 20 0a 20 20 20 20 34 30 39     2048 .    409
9c70: 36 20 38 31 39 32 20 31 36 33 38 34 20 33 32 37  6 8192 16384 327
9c80: 36 38 20 36 35 35 33 36 20 31 33 31 30 37 32 20  68 65536 131072 
9c90: 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74 76 20  262144.} {.  tv 
9ca0: 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63 74  sectorsize $sect
9cb0: 6f 72 73 69 7a 65 0a 20 20 73 65 74 20 65 66 66  orsize.  set eff
9cc0: 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 69   $sectorsize.  i
9cd0: 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3c  f {$sectorsize <
9ce0: 20 35 31 32 7d 20 20 20 7b 20 73 65 74 20 65 66   512}   { set ef
9cf0: 66 20 35 31 32 20 7d 0a 20 20 69 66 20 7b 24 73  f 512 }.  if {$s
9d00: 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33  ectorsize > 6553
9d10: 36 7d 20 7b 20 73 65 74 20 65 66 66 20 36 35 35  6} { set eff 655
9d20: 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  36 }..  do_test 
9d30: 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74 6f  pager1-10.$secto
9d40: 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 66 61  rsize.1 {.    fa
9d50: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
9d60: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20  d_reopen.    db 
9d70: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
9d80: 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73  string.    execs
9d90: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
9da0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
9db0: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20   PERSIST;.      
9dc0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
9dd0: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20 42   = 1024;.      B
9de0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52  EGIN;.        CR
9df0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
9e00: 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45   b);.        CRE
9e10: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
9e20: 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  b);.        CREA
9e30: 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62  TE TABLE t3(a, b
9e40: 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  );.      COMMIT;
9e50: 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 20  .    }.    file 
9e60: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
9e70: 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24  rnal.  } [expr $
9e80: 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35  sectorsize > 655
9e90: 33 36 20 3f 20 36 35 35 33 36 20 3a 20 24 73 65  36 ? 65536 : $se
9ea0: 63 74 6f 72 73 69 7a 65 5d 0a 0a 20 20 64 6f 5f  ctorsize]..  do_
9eb0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
9ec0: 73 65 63 74 6f 72 73 69 7a 65 2e 32 20 7b 0a 20  sectorsize.2 {. 
9ed0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
9ee0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9ef0: 74 33 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t3 VALUES(a_stri
9f00: 6e 67 28 33 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(300), a_strin
9f10: 67 28 33 30 30 29 29 3b 0a 20 20 20 20 20 20 49  g(300));.      I
9f20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
9f30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20  LECT * FROM t3; 
9f40: 20 20 20 20 20 20 20 2f 2a 20 20 32 20 2a 2f 0a         /*  2 */.
9f50: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9f60: 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52  O t3 SELECT * FR
9f70: 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a  OM t3;        /*
9f80: 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    4 */.      INS
9f90: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
9fa0: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20  CT * FROM t3;   
9fb0: 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20       /*  8 */.  
9fc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9fd0: 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t3 SELECT * FROM
9fe0: 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 31   t3;        /* 1
9ff0: 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  6 */.      INSER
a000: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
a010: 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20   * FROM t3;     
a020: 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20     /* 32 */.    
a030: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74  }.  } {}..  do_t
a040: 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73  est pager1-10.$s
a050: 65 63 74 6f 72 73 69 7a 65 2e 33 20 7b 0a 20 20  ectorsize.3 {.  
a060: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73    db close.    s
a070: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
a080: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  b.    execsql { 
a090: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61  .      PRAGMA ca
a0a0: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
a0b0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
a0c0: 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65 5f  }.    recursive_
a0d0: 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62  select 32 t3 {db
a0e0: 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e   eval "INSERT IN
a0f0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
a100: 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  2)"}.    execsql
a110: 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b   {.      COMMIT;
a120: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
a130: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20  FROM t2;.    }. 
a140: 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f 74   } {1 2}..  do_t
a150: 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73  est pager1-10.$s
a160: 65 63 74 6f 72 73 69 7a 65 2e 34 20 7b 0a 20 20  ectorsize.4 {.  
a170: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a180: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a190: 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43  6(a, b);.      C
a1a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61  REATE TABLE t7(a
a1b0: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , b);.      CREA
a1c0: 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62  TE TABLE t5(a, b
a1d0: 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41  );.      DROP TA
a1e0: 42 4c 45 20 74 36 3b 0a 20 20 20 20 20 20 44 52  BLE t6;.      DR
a1f0: 4f 50 20 54 41 42 4c 45 20 74 37 3b 0a 20 20 20  OP TABLE t7;.   
a200: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
a210: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
a220: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
a230: 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20  LE t6(a, b);.   
a240: 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76 65   }.    recursive
a250: 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b 64  _select 32 t3 {d
a260: 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20 49  b eval "INSERT I
a270: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c  NTO t5 VALUES(1,
a280: 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73 71   2)"}.    execsq
a290: 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  l {.      COMMIT
a2a0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
a2b0: 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d 0a   FROM t5;.    }.
a2c0: 20 20 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a 64    } {1 2}.  .}.d
a2d0: 62 20 63 6c 6f 73 65 0a 0a 74 76 20 73 65 63 74  b close..tv sect
a2e0: 6f 72 73 69 7a 65 20 34 30 39 36 0a 64 6f 5f 74  orsize 4096.do_t
a2f0: 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e  est pager1.10.x.
a300: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
a310: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
a320: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a330: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
a340: 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20  uum = none;.    
a350: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
a360: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
a370: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
a380: 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  .  }.  for {set 
a390: 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20 7b 69 6e  i 0} {$i<30} {in
a3a0: 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63  cr i} {.    exec
a3b0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
a3c0: 4f 20 74 31 20 56 41 4c 55 45 53 28 7a 65 72 6f  O t1 VALUES(zero
a3d0: 62 6c 6f 62 28 39 30 30 29 29 20 7d 0a 20 20 7d  blob(900)) }.  }
a3e0: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
a3f0: 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d 0a 64  t.db.} {32768}.d
a400: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30  o_test pager1.10
a410: 2e 78 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .x.2 {.  execsql
a420: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
a430: 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 44  BLE t2(x);.    D
a440: 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20  ROP TABLE t2;.  
a450: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
a460: 73 74 2e 64 62 0a 7d 20 7b 33 33 37 39 32 7d 0a  st.db.} {33792}.
a470: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31  do_test pager1.1
a480: 30 2e 78 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  0.x.3 {.  execsq
a490: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
a4a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a4b0: 74 32 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65 63  t2(x);.  }.  rec
a4c0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 30  ursive_select 30
a4d0: 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   t1.  execsql {.
a4e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a4f0: 20 74 33 28 78 29 3b 0a 20 20 20 20 43 4f 4d 4d   t3(x);.    COMM
a500: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 62  IT;.  }.} {}..db
a510: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
a520: 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  ..testvfs tv -de
a530: 66 61 75 6c 74 20 31 0a 66 61 75 6c 74 73 69 6d  fault 1.faultsim
a540: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
a550: 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72  en.db func a_str
a560: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 64 6f 5f  ing a_string.do_
a570: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
a580: 65 72 31 2d 31 31 2e 31 20 7b 0a 20 20 50 52 41  er1-11.1 {.  PRA
a590: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
a5a0: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 50 52 41   = DELETE;.  PRA
a5b0: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
a5c0: 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20   10;.  BEGIN;.  
a5d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a    CREATE TABLE z
a5e0: 7a 28 74 6f 70 20 50 52 49 4d 41 52 59 20 4b 45  z(top PRIMARY KE
a5f0: 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  Y);.    INSERT I
a600: 4e 54 4f 20 7a 7a 20 56 41 4c 55 45 53 28 61 5f  NTO zz VALUES(a_
a610: 73 74 72 69 6e 67 28 32 32 32 29 29 3b 0a 20 20  string(222));.  
a620: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
a630: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
a640: 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78  ((SELECT 222+max
a650: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29  (rowid) FROM zz)
a660: 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49  ) FROM zz;.    I
a670: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
a680: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
a690: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
a6a0: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
a6b0: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
a6c0: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
a6d0: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
a6e0: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
a6f0: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
a700: 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   zz;.    INSERT 
a710: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
a720: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
a730: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
a740: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
a750: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
a760: 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74  O zz SELECT a_st
a770: 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32  ring((SELECT 222
a780: 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d  +max(rowid) FROM
a790: 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20   zz)) FROM zz;. 
a7a0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 42 45 47 49 4e   COMMIT;.  BEGIN
a7b0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 7a 20  ;.    UPDATE zz 
a7c0: 53 45 54 20 74 6f 70 20 3d 20 61 5f 73 74 72 69  SET top = a_stri
a7d0: 6e 67 28 33 34 35 29 3b 0a 7d 20 7b 64 65 6c 65  ng(345);.} {dele
a7e0: 74 65 7d 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75  te}..proc lockou
a7f0: 74 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20  t {method args} 
a800: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
a810: 49 4f 45 52 52 20 7d 0a 74 76 20 73 63 72 69 70  IOERR }.tv scrip
a820: 74 20 6c 6f 63 6b 6f 75 74 0a 74 76 20 66 69 6c  t lockout.tv fil
a830: 74 65 72 20 7b 78 57 72 69 74 65 20 78 54 72 75  ter {xWrite xTru
a840: 6e 63 61 74 65 20 78 53 79 6e 63 7d 0a 64 6f 5f  ncate xSync}.do_
a850: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61  catchsql_test pa
a860: 67 65 72 31 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d  ger1-11.2 { COMM
a870: 49 54 20 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f  IT } {1 {disk I/
a880: 4f 20 65 72 72 6f 72 7d 7d 0a 0a 74 76 20 73 63  O error}}..tv sc
a890: 72 69 70 74 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  ript {}.do_test 
a8a0: 70 61 67 65 72 31 2d 31 31 2e 33 20 7b 0a 20 20  pager1-11.3 {.  
a8b0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
a8c0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
a8d0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
a8e0: 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41  al_mode = TRUNCA
a8f0: 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  TE;.    PRAGMA i
a900: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
a910: 20 20 7d 20 64 62 32 0a 7d 20 7b 74 72 75 6e 63    } db2.} {trunc
a920: 61 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20  ate ok}.do_test 
a930: 70 61 67 65 72 31 2d 31 31 2e 34 20 7b 0a 20 20  pager1-11.4 {.  
a940: 64 62 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65  db2 close.  file
a950: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
a960: 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f  journal.} {0}.do
a970: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
a980: 67 65 72 31 2d 31 31 2e 35 20 7b 20 53 45 4c 45  ger1-11.5 { SELE
a990: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
a9a0: 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62 20 63 6c   zz } {32}.db cl
a9b0: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 20 20  ose.tv delete.  
a9c0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
a9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
aa10: 73 74 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f  st "PRAGMA page_
aa20: 73 69 7a 65 22 0a 23 0a 74 65 73 74 76 66 73 20  size".#.testvfs 
aa30: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76  tv -default 1.tv
aa40: 20 73 65 63 74 6f 72 73 69 7a 65 20 31 30 32 34   sectorsize 1024
aa50: 0a 66 6f 72 65 61 63 68 20 70 61 67 65 73 69 7a  .foreach pagesiz
aa60: 65 20 7b 0a 20 20 20 20 35 31 32 20 20 20 31 30  e {.    512   10
aa70: 32 34 20 20 20 32 30 34 38 20 34 30 39 36 20 38  24   2048 4096 8
aa80: 31 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20  192 16384 32768 
aa90: 0a 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .} {.  faultsim_
aaa0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
aab0: 6e 0a 0a 20 20 23 20 54 68 65 20 73 65 63 74 6f  n..  # The secto
aac0: 72 2d 73 69 7a 65 20 28 61 63 63 6f 72 64 69 6e  r-size (accordin
aad0: 67 20 74 6f 20 74 68 65 20 56 46 53 29 20 69 73  g to the VFS) is
aae0: 20 31 30 32 34 20 62 79 74 65 73 2e 20 53 6f 20   1024 bytes. So 
aaf0: 69 66 20 74 68 65 0a 20 20 23 20 70 61 67 65 2d  if the.  # page-
ab00: 73 69 7a 65 20 72 65 71 75 65 73 74 65 64 20 75  size requested u
ab10: 73 69 6e 67 20 22 50 52 41 47 4d 41 20 70 61 67  sing "PRAGMA pag
ab20: 65 5f 73 69 7a 65 22 20 69 73 20 67 72 65 61 74  e_size" is great
ab30: 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 23 20  er than the.  # 
ab40: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c  compile time val
ab50: 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 4d 41 58  ue of SQLITE_MAX
ab60: 5f 50 41 47 45 5f 53 49 5a 45 2c 20 74 68 65 6e  _PAGE_SIZE, then
ab70: 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 0a   the effective .
ab80: 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72 65    # page-size re
ab90: 6d 61 69 6e 73 20 31 30 32 34 20 62 79 74 65 73  mains 1024 bytes
aba0: 2e 0a 20 20 23 0a 20 20 73 65 74 20 65 66 66 20  ..  #.  set eff 
abb0: 24 70 61 67 65 73 69 7a 65 0a 20 20 69 66 20 7b  $pagesize.  if {
abc0: 24 65 66 66 20 3e 20 24 3a 3a 53 51 4c 49 54 45  $eff > $::SQLITE
abd0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 7d 20  _MAX_PAGE_SIZE} 
abe0: 7b 20 73 65 74 20 65 66 66 20 31 30 32 34 20 7d  { set eff 1024 }
abf0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
ac00: 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e  r1-12.$pagesize.
ac10: 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  1 {.    sqlite3 
ac20: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20  db2 test.db.    
ac30: 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20  execsql ".      
ac40: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
ac50: 20 3d 20 24 70 61 67 65 73 69 7a 65 3b 0a 20 20   = $pagesize;.  
ac60: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
ac70: 76 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  v AS SELECT * FR
ac80: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
ac90: 3b 0a 20 20 20 20 22 20 64 62 32 0a 20 20 20 20  ;.    " db2.    
aca0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
acb0: 62 0a 20 20 7d 20 24 65 66 66 0a 20 20 64 6f 5f  b.  } $eff.  do_
acc0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24  test pager1-12.$
acd0: 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20  pagesize.2 {.   
ace0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
acf0: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
ad00: 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54   { .      SELECT
ad10: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76   count(*) FROM v
ad20: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d  ;.      PRAGMA m
ad30: 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20  ain.page_size;. 
ad40: 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69     } db2.  } [li
ad50: 73 74 20 31 20 24 65 66 66 5d 0a 20 20 64 6f 5f  st 1 $eff].  do_
ad60: 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24  test pager1-12.$
ad70: 70 61 67 65 73 69 7a 65 2e 33 20 7b 0a 20 20 20  pagesize.3 {.   
ad80: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
ad90: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
ada0: 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20  ) FROM v;.      
adb0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65  PRAGMA main.page
adc0: 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  _size;.    }.  }
add0: 20 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a 20   [list 1 $eff]. 
ade0: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 64 62 20   db2 close.}.db 
adf0: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
ae00: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
ae10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
ae50: 73 74 20 73 70 65 63 61 6c 20 22 50 52 41 47 4d  st specal "PRAGM
ae60: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50  A journal_mode=P
ae70: 45 52 53 49 53 54 22 20 74 65 73 74 20 63 61 73  ERSIST" test cas
ae80: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31  es..#.# pager1-1
ae90: 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73 74  3.1.*: This test
aea0: 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
aeb0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20   encountered in 
aec0: 70 65 72 73 69 73 74 65 6e 74 20 0a 23 20 20 20  persistent .#   
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
aee0: 72 6e 61 6c 20 6d 6f 64 65 3a 20 49 66 20 74 68  rnal mode: If th
aef0: 65 20 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69  e journal associ
af00: 61 74 65 64 20 77 69 74 68 20 61 20 74 72 61 6e  ated with a tran
af10: 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20  saction.#       
af20: 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
af30: 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6a 6f 75  ler than the jou
af40: 72 6e 61 6c 20 66 69 6c 65 20 28 62 65 63 61 75  rnal file (becau
af50: 73 65 20 61 20 70 72 65 76 69 6f 75 73 20 0a 23  se a previous .#
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65 66 74  transaction left
af80: 20 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e 6f   a very large no
af90: 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  n-hot journal fi
afa0: 6c 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20  le in the.#     
afb0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 2d             file-
afc0: 73 79 73 74 65 6d 29 2c 20 74 68 65 6e 20 53 51  system), then SQ
afd0: 4c 69 74 65 20 68 61 73 20 74 6f 20 62 65 20 63  Lite has to be c
afe0: 61 72 65 66 75 6c 20 74 68 61 74 20 74 68 65 72  areful that ther
aff0: 65 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20  e is.#          
b000: 20 20 20 20 20 20 6e 6f 74 20 61 20 6a 6f 75 72        not a jour
b010: 6e 61 6c 2d 68 65 61 64 65 72 20 6c 65 66 74 20  nal-header left 
b020: 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 65 76  over from a prev
b030: 69 6f 75 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  ious transaction
b040: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b050: 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f    immediately fo
b060: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6a 6f 75 72  llowing the jour
b070: 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6a 75 73 74  nal content just
b080: 20 77 72 69 74 74 65 6e 2e 0a 23 20 20 20 20 20   written..#     
b090: 20 20 20 20 20 20 20 20 20 20 20 49 66 20 74 68             If th
b0a0: 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 65 20  ere is, and the 
b0b0: 70 72 6f 63 65 73 73 20 63 72 61 73 68 65 73 20  process crashes 
b0c0: 73 6f 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  so that the jour
b0d0: 6e 61 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20  nal.#           
b0e0: 20 20 20 20 20 62 65 63 6f 6d 65 73 20 61 20 68       becomes a h
b0f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d  ot-journal and m
b100: 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
b110: 63 6b 20 62 79 20 61 6e 6f 74 68 65 72 0a 23 20  ck by another.# 
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b130: 72 6f 63 65 73 73 2c 20 74 68 65 72 65 20 69 73  rocess, there is
b140: 20 61 20 64 61 6e 67 65 72 20 74 68 61 74 20 74   a danger that t
b150: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
b160: 20 6d 61 79 20 72 6f 6c 6c 0a 23 20 20 20 20 20   may roll.#     
b170: 20 20 20 20 20 20 20 20 20 20 20 62 61 63 6b 20             back 
b180: 74 68 65 20 61 62 6f 72 74 65 64 20 74 72 61 6e  the aborted tran
b190: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f  saction, then co
b1a0: 6e 74 69 6e 75 65 20 63 6f 70 79 69 6e 67 20 64  ntinue copying d
b1b0: 61 74 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  ata.#           
b1c0: 20 20 20 20 20 66 72 6f 6d 20 61 6e 20 6f 6c 64       from an old
b1d0: 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  er transaction f
b1e0: 72 6f 6d 20 74 68 65 20 72 65 6d 61 69 6e 64 65  rom the remainde
b1f0: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
b200: 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  ..#             
b210: 20 20 20 53 65 65 20 74 68 65 20 73 79 6e 63 4a     See the syncJ
b220: 6f 75 72 6e 61 6c 28 29 20 66 75 6e 63 74 69 6f  ournal() functio
b230: 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 23  n for details..#
b240: 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 2a  .# pager1-13.2.*
b250: 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 74  : Same test as t
b260: 68 65 20 70 72 65 76 69 6f 75 73 2e 20 54 68 69  he previous. Thi
b270: 73 20 74 69 6d 65 2c 20 74 68 72 6f 77 20 61 6e  s time, throw an
b280: 20 69 6e 64 65 78 20 69 6e 74 6f 0a 23 20 20 20   index into.#   
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
b2a0: 20 6d 69 78 20 74 6f 20 6d 61 6b 65 20 74 68 65   mix to make the
b2b0: 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
b2c0: 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20   more likely to 
b2d0: 63 61 74 63 68 0a 23 20 20 20 20 20 20 20 20 20  catch.#         
b2e0: 20 20 20 20 20 20 20 65 72 72 6f 72 73 2e 0a 23         errors..#
b2f0: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
b300: 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74  ault 1.tv script
b310: 20 78 53 79 6e 63 43 62 0a 74 76 20 66 69 6c 74   xSyncCb.tv filt
b320: 65 72 20 78 53 79 6e 63 0a 70 72 6f 63 20 78 53  er xSync.proc xS
b330: 79 6e 63 43 62 20 7b 6d 65 74 68 6f 64 20 66 69  yncCb {method fi
b340: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
b350: 20 73 65 74 20 74 20 5b 66 69 6c 65 20 74 61 69   set t [file tai
b360: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 69  l $filename].  i
b370: 66 20 7b 24 74 20 3d 3d 20 22 74 65 73 74 2e 64  f {$t == "test.d
b380: 62 22 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  b"} faultsim_sav
b390: 65 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e.  return SQLIT
b3a0: 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f  E_OK.}.faultsim_
b3b0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
b3c0: 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  n.db func a_stri
b3d0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 23 20 54  ng a_string..# T
b3e0: 68 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  he UPDATE statem
b3f0: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
b400: 66 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  f this test case
b410: 20 63 72 65 61 74 65 73 20 61 20 72 65 61 6c 6c   creates a reall
b420: 79 20 62 69 67 0a 23 20 6a 6f 75 72 6e 61 6c 2e  y big.# journal.
b430: 20 53 69 6e 63 65 20 74 68 65 20 63 61 63 68 65   Since the cache
b440: 2d 73 69 7a 65 20 69 73 20 6f 6e 6c 79 20 31 30  -size is only 10
b450: 20 70 61 67 65 73 2c 20 74 68 65 20 6a 6f 75 72   pages, the jour
b460: 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 0a 23 20  nal contains .# 
b470: 66 72 65 71 75 65 6e 74 20 6a 6f 75 72 6e 61 6c  frequent journal
b480: 20 68 65 61 64 65 72 73 2e 0a 23 0a 64 6f 5f 65   headers..#.do_e
b490: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
b4a0: 72 31 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 50 52  r1-13.1.1 {.  PR
b4b0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
b4c0: 20 31 30 32 34 3b 0a 20 20 50 52 41 47 4d 41 20   1024;.  PRAGMA 
b4d0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
b4e0: 45 52 53 49 53 54 3b 0a 20 20 50 52 41 47 4d 41  ERSIST;.  PRAGMA
b4f0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
b500: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43  ;.  BEGIN;.    C
b510: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
b520: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
b530: 20 4b 45 59 2c 20 62 20 42 4c 4f 42 29 3b 0a 20   KEY, b BLOB);. 
b540: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
b550: 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61  1 VALUES(NULL, a
b560: 5f 73 74 72 69 6e 67 28 34 30 30 29 29 3b 0a 20  _string(400));. 
b570: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
b580: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  1 SELECT NULL, a
b590: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
b5a0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f  M t1;          /
b5b0: 2a 20 20 20 32 20 2a 2f 0a 20 20 20 20 49 4e 53  *   2 */.    INS
b5c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
b5d0: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
b5e0: 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(400) FROM t1; 
b5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34 20           /*   4 
b600: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
b610: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
b620: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  L, a_string(400)
b630: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
b640: 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20     /*   8 */.   
b650: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
b660: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
b670: 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20  tring(400) FROM 
b680: 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t1;          /* 
b690: 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52   16 */.    INSER
b6a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
b6b0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
b6c0: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  400) FROM t1;   
b6d0: 20 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f         /*  32 */
b6e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b6f0: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
b700: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
b710: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
b720: 20 2f 2a 20 20 36 34 20 2a 2f 0a 20 20 20 20 49   /*  64 */.    I
b730: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
b740: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
b750: 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31  ing(400) FROM t1
b760: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 32  ;          /* 12
b770: 38 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20  8 */.  COMMIT;. 
b780: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
b790: 20 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29   = a_string(400)
b7a0: 3b 0a 7d 20 7b 70 65 72 73 69 73 74 7d 0a 0a 69  ;.} {persist}..i
b7b0: 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  f {$::tcl_platfo
b7c0: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77  rm(platform)!="w
b7d0: 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 52 75 6e  indows"} {.# Run
b7e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66   transactions of
b7f0: 20 69 6e 63 72 65 61 73 69 6e 67 20 73 69 7a 65   increasing size
b800: 73 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f  s. Eventually, o
b810: 6e 65 20 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e  ne (or more than
b820: 20 6f 6e 65 29 0a 23 20 6f 66 20 74 68 65 73 65   one).# of these
b830: 20 77 69 6c 6c 20 77 72 69 74 65 20 6a 75 73 74   will write just
b840: 20 65 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20   enough content 
b850: 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
b860: 6f 6c 64 20 68 65 61 64 65 72 73 20 63 72 65 61  old headers crea
b870: 74 65 64 20 0a 23 20 62 79 20 74 68 65 20 74 72  ted .# by the tr
b880: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
b890: 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65   block above lie
b8a0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  s immediately af
b8b0: 74 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  ter the content.
b8c0: 23 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20  # journalled by 
b8d0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
b8e0: 73 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b  saction..#.for {
b8f0: 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70  set nUp 1} {$nUp
b900: 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20  <64} {incr nUp} 
b910: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
b920: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e  est pager1-13.1.
b930: 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20  2.$nUp.1 { .    
b940: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
b950: 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20  = a_string(399) 
b960: 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a  WHERE a <= $nUp.
b970: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63    } {}.  do_exec
b980: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b990: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20  13.1.2.$nUp.2 { 
b9a0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
b9b0: 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a  _check } {ok} ..
b9c0: 20 20 23 20 54 72 79 20 74 6f 20 61 63 63 65 73    # Try to acces
b9d0: 73 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f  s the snapshot o
b9e0: 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
b9f0: 6d 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33  m..  #.  sqlite3
ba00: 20 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a   db2 sv_test.db.
ba10: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ba20: 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b  -13.1.2.$nUp.3 {
ba30: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
ba40: 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68  ELECT sum(length
ba50: 28 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64  (b)) FROM t1 } d
ba60: 62 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32  b2.  } [expr {12
ba70: 38 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29  8*400 - ($nUp-1)
ba80: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }].  do_test pag
ba90: 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e  er1-13.1.2.$nUp.
baa0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
bab0: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
bac0: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20  ty_check } db2. 
bad0: 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c   } {ok}.  db2 cl
bae0: 6f 73 65 0a 7d 0a 7d 0a 0a 69 66 20 7b 24 3a 3a  ose.}.}..if {$::
baf0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
bb00: 74 66 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73  tform)!="windows
bb10: 22 7d 20 7b 0a 23 20 53 61 6d 65 20 74 65 73 74  "} {.# Same test
bb20: 20 61 73 20 61 62 6f 76 65 2e 20 42 75 74 20 74   as above. But t
bb30: 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 61 6e  his time with an
bb40: 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61   index on the ta
bb50: 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ble..#.do_execsq
bb60: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
bb70: 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .2.1 {.  CREATE 
bb80: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62  INDEX i1 ON t1(b
bb90: 29 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53  );.  UPDATE t1 S
bba0: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
bbb0: 34 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b  400);.} {}.for {
bbc0: 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70  set nUp 1} {$nUp
bbd0: 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20  <64} {incr nUp} 
bbe0: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
bbf0: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
bc00: 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20  2.$nUp.1 { .    
bc10: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
bc20: 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20  = a_string(399) 
bc30: 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a  WHERE a <= $nUp.
bc40: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63    } {}.  do_exec
bc50: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
bc60: 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20  13.2.2.$nUp.2 { 
bc70: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
bc80: 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20  _check } {ok} . 
bc90: 20 73 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f   sqlite3 db2 sv_
bca0: 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73  test.db.  do_tes
bcb0: 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e  t pager1-13.2.2.
bcc0: 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65  $nUp.3 {.    exe
bcd0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75  csql { SELECT su
bce0: 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f  m(length(b)) FRO
bcf0: 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b  M t1 } db2.  } [
bd00: 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20  expr {128*400 - 
bd10: 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f  ($nUp-1)}].  do_
bd20: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32  test pager1-13.2
bd30: 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20  .2.$nUp.4 {.    
bd40: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
bd50: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
bd60: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a   } db2.  } {ok}.
bd70: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a    db2 close.}.}.
bd80: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
bd90: 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete..#----------
bda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
bde0: 23 20 54 65 73 74 20 73 70 65 63 61 6c 20 22 50  # Test specal "P
bdf0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
be00: 64 65 3d 4f 46 46 22 20 74 65 73 74 20 63 61 73  de=OFF" test cas
be10: 65 73 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64  es..#.faultsim_d
be20: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
be30: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
be40: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b   pager1-14.1.1 {
be50: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
be60: 6c 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20  l_mode = OFF;.  
be70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
be80: 61 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a  a, b);.  BEGIN;.
be90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bea0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
beb0: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c  .  COMMIT;.  SEL
bec0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d  ECT * FROM t1;.}
bed0: 20 7b 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61   {off 1 2}.do_ca
bee0: 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65  tchsql_test page
bef0: 72 31 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45  r1-14.1.2 {.  BE
bf00: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
bf10: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
bf20: 2c 20 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b  , 4);.  ROLLBACK
bf30: 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78  ;.} {0 {}}.do_ex
bf40: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
bf50: 31 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  1-14.1.3 {.  SEL
bf60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d  ECT * FROM t1;.}
bf70: 20 7b 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73   {1 2}.do_catchs
bf80: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
bf90: 34 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b  4.1.4 {.  BEGIN;
bfa0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
bfb0: 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29   t1(rowid, a, b)
bfc0: 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20   SELECT a+3, b, 
bfd0: 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  b FROM t1;.    I
bfe0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f  NSERT INTO t1(ro
bff0: 77 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43  wid, a, b) SELEC
c000: 54 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d  T a+3, b, b FROM
c010: 20 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d 41   t1;.} {1 {PRIMA
c020: 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20 75  RY KEY must be u
c030: 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65 63 73  nique}}.do_execs
c040: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c050: 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49 54  4.1.5 {.  COMMIT
c060: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
c070: 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20 32 20 32  M t1;.} {1 2 2 2
c080: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
c090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
c0d0: 54 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e 64  Test opening and
c0e0: 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67   closing the pag
c0f0: 65 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77 69  er sub-system wi
c100: 74 68 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c  th different val
c110: 75 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73 71  ues.# for the sq
c120: 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69  lite3_vfs.szOsFi
c130: 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a 66  le variable..#.f
c140: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
c150: 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65  nd_reopen.do_exe
c160: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c170: 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  -15.0 {.  CREATE
c180: 20 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29 3b   TABLE tx(y, z);
c190: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
c1a0: 78 20 56 41 4c 55 45 53 28 27 41 79 75 74 74 68  x VALUES('Ayutth
c1b0: 61 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27 29  aya', 'Beijing')
c1c0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
c1d0: 74 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64 6f  tx VALUES('Londo
c1e0: 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d 20  n', 'Tokyo');.} 
c1f0: 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 20  {}.db close.for 
c200: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35 31  {set i 0} {$i<51
c210: 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b 0a  3} {incr i 3} {.
c220: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65    testvfs tv -de
c230: 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69 6c  fault 1 -szosfil
c240: 65 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20 64  e $i.  sqlite3 d
c250: 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 65  b test.db.  do_e
c260: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
c270: 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20 20  r1-15.$i.1 {.   
c280: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
c290: 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61 79  x;.  } {Ayutthay
c2a0: 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f 6e  a Beijing London
c2b0: 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c 6f   Tokyo}.  db clo
c2c0: 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d  se.  tv delete.}
c2d0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
c2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43  ------------.# C
c320: 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20  heck that it is 
c330: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
c340: 6f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  open a database 
c350: 66 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c 6c  file if the full
c360: 20 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20 61   path.# to the a
c370: 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e 61  ssociated journa
c380: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6c  l file will be l
c390: 6f 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69 74  onger than sqlit
c3a0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
c3b0: 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20  e..#.testvfs tv 
c3c0: 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63  -default 1.tv sc
c3d0: 72 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76 20  ript xOpenCb.tv 
c3e0: 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72 6f  filter xOpen.pro
c3f0: 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68 6f  c xOpenCb {metho
c400: 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d  d filename args}
c410: 20 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c 65 5f   {.  set ::file_
c420: 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  len [string leng
c430: 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 7d 0a  th $filename].}.
c440: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
c450: 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  db.db close.tv d
c460: 65 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65 74 20  elete..for {set 
c470: 69 69 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65  ii [expr $::file
c480: 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20 3c 20  _len-5]} {$ii < 
c490: 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65  [expr $::file_le
c4a0: 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69 69 7d  n+20]} {incr ii}
c4b0: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
c4c0: 2d 64 65 66 61 75 6c 74 20 31 20 2d 6d 78 70 61  -default 1 -mxpa
c4d0: 74 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20 23 20  thname $ii..  # 
c4e0: 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  The length of th
c4f0: 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 66  e full path to f
c500: 69 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a 6f 75  ile "test.db-jou
c510: 72 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66 69 6c  rnal" is ($::fil
c520: 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20 49 66  e_len+8)..  # If
c530: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20   the configured 
c540: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
c550: 74 68 6e 61 6d 65 20 76 61 6c 75 65 20 67 72 65  thname value gre
c560: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
c570: 61 6c 20 74 6f 0a 20 20 23 20 74 68 69 73 2c 20  al to.  # this, 
c580: 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 63 61  then the file ca
c590: 6e 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f 74 68  n be opened. Oth
c5a0: 65 72 77 69 73 65 2c 20 69 74 20 63 61 6e 6e 6f  erwise, it canno
c5b0: 74 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 69 69  t..  #.  if {$ii
c5c0: 20 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c   >= [expr $::fil
c5d0: 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20 20 20  e_len+8]} {.    
c5e0: 73 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d 0a 20  set res {0 {}}. 
c5f0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65   } else {.    se
c600: 74 20 72 65 73 20 7b 31 20 7b 75 6e 61 62 6c 65  t res {1 {unable
c610: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
c620: 65 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a 20 20  e file}}.  }..  
c630: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
c640: 36 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20 6c 69  6.1.$ii {.    li
c650: 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69  st [catch { sqli
c660: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d  te3 db test.db }
c670: 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 24   msg] $msg.  } $
c680: 72 65 73 0a 0a 20 20 63 61 74 63 68 20 7b 64 62  res..  catch {db
c690: 20 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64 65 6c   close}.  tv del
c6a0: 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ete.}..#--------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6f0: 2d 0a 23 20 54 65 73 74 20 22 50 52 41 47 4d 41  -.# Test "PRAGMA
c700: 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 22 2e   omit_readlock".
c710: 20 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 31   .#.#   pager1-1
c720: 37 2e 24 74 6e 2e 31 2e 2a 3a 20 54 65 73 74 20  7.$tn.1.*: Test 
c730: 74 68 61 74 20 69 66 20 61 20 73 65 63 6f 6e 64  that if a second
c740: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
c750: 61 6e 20 6f 70 65 6e 20 0a 23 20 20 20 20 20 20  an open .#      
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
c780: 2c 20 69 74 20 69 73 20 6e 6f 74 20 75 73 75 61  , it is not usua
c790: 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  lly possible to 
c7a0: 77 72 69 74 65 20 0a 23 20 20 20 20 20 20 20 20  write .#        
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
c7c0: 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 23 20  e database..#.# 
c7d0: 20 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e    pager1-17.$tn.
c7e0: 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69  2.*: Test that i
c7f0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e  f the second con
c800: 6e 65 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  nection was open
c810: 65 64 20 77 69 74 68 0a 23 20 20 20 20 20 20 20  ed with.#       
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
c830: 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  he SQLITE_OPEN_R
c840: 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20 61 6e  EADONLY flag, an
c850: 64 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  d .#            
c860: 20 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d            "PRAGM
c870: 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20  A omit_readlock 
c880: 3d 20 31 22 20 69 73 20 65 78 65 63 75 74 65 64  = 1" is executed
c890: 20 62 65 66 6f 72 65 20 61 74 74 61 63 68 69 6e   before attachin
c8a0: 67 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  g.#             
c8b0: 20 20 20 20 20 20 20 20 20 74 68 65 20 64 61 74           the dat
c8c0: 61 62 61 73 65 20 61 6e 64 20 6f 70 65 6e 69 6e  abase and openin
c8d0: 67 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  g a read-transac
c8e0: 74 69 6f 6e 20 6f 6e 20 69 74 2c 20 69 74 20 69  tion on it, it i
c8f0: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
c900: 20 20 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c           possibl
c910: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64  e to write the d
c920: 62 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  b..#.#   pager1-
c930: 31 37 2e 24 74 6e 2e 33 2e 2a 3a 20 54 65 73 74  17.$tn.3.*: Test
c940: 20 74 68 61 74 20 69 66 20 74 68 65 20 73 65 63   that if the sec
c950: 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ond connection w
c960: 61 73 20 2a 6e 6f 74 2a 20 6f 70 65 6e 65 64 20  as *not* opened 
c970: 77 69 74 68 0a 23 20 20 20 20 20 20 20 20 20 20  with.#          
c980: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
c990: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
c9a0: 4f 4e 4c 59 20 66 6c 61 67 2c 20 65 78 65 63 75  ONLY flag, execu
c9b0: 74 69 6e 67 20 0a 23 20 20 20 20 20 20 20 20 20  ting .#         
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50 52               "PR
c9d0: 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f  AGMA omit_readlo
c9e0: 63 6b 20 3d 20 31 22 20 68 61 73 20 6e 6f 20 65  ck = 1" has no e
c9f0: 66 66 65 63 74 2e 0a 23 0a 64 6f 5f 6d 75 6c 74  ffect..#.do_mult
ca00: 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20  iclient_test tn 
ca10: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  {.  do_test page
ca20: 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 31 20 7b 0a  r1-17.$tn.1.1 {.
ca30: 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20      sql1 { .    
ca40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
ca50: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49  1(a, b);.      I
ca60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
ca70: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
ca80: 7d 0a 20 20 20 20 73 71 6c 32 20 7b 0a 20 20 20  }.    sql2 {.   
ca90: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
caa0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
cab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32  ;.    }.  } {1 2
cac0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
cad0: 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 32 20 7b 0a  r1-17.$tn.1.2 {.
cae0: 20 20 20 20 63 73 71 6c 31 20 7b 20 49 4e 53 45      csql1 { INSE
caf0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
cb00: 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 31  S(3, 4) }.  } {1
cb10: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
cb20: 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  cked}}.  do_test
cb30: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31   pager1-17.$tn.1
cb40: 2e 33 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  .3 {.    sql2 { 
cb50: 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 73 71 6c  COMMIT }.    sql
cb60: 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  1 { INSERT INTO 
cb70: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20  t1 VALUES(3, 4) 
cb80: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74  }.  } {}..  do_t
cb90: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
cba0: 6e 2e 32 2e 31 20 7b 0a 20 20 20 20 63 6f 64 65  n.2.1 {.    code
cbb0: 32 20 7b 0a 20 20 20 20 20 20 64 62 32 20 63 6c  2 {.      db2 cl
cbc0: 6f 73 65 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ose.      sqlite
cbd0: 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79 3a 20 2d  3 db2 :memory: -
cbe0: 72 65 61 64 6f 6e 6c 79 20 31 0a 20 20 20 20 7d  readonly 1.    }
cbf0: 0a 20 20 20 20 73 71 6c 32 20 7b 20 0a 20 20 20  .    sql2 { .   
cc00: 20 20 20 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72     PRAGMA omit_r
cc10: 65 61 64 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  eadlock = 1;.   
cc20: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
cc30: 64 62 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20  db' AS two;.    
cc40: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
cc50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
cc60: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20  .    }.  } {1 2 
cc70: 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  3 4}.  do_test p
cc80: 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 32  ager1-17.$tn.2.2
cc90: 20 7b 20 73 71 6c 31 20 22 49 4e 53 45 52 54 20   { sql1 "INSERT 
cca0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35  INTO t1 VALUES(5
ccb0: 2c 20 36 29 22 20 7d 20 7b 7d 0a 20 20 64 6f 5f  , 6)" } {}.  do_
ccc0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24  test pager1-17.$
ccd0: 74 6e 2e 32 2e 33 20 7b 20 73 71 6c 32 20 22 53  tn.2.3 { sql2 "S
cce0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22  ELECT * FROM t1"
ccf0: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b 31   }            {1
cd00: 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73   2 3 4}.  do_tes
cd10: 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e  t pager1-17.$tn.
cd20: 32 2e 34 20 7b 20 73 71 6c 32 20 22 43 4f 4d 4d  2.4 { sql2 "COMM
cd30: 49 54 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  IT ; SELECT * FR
cd40: 4f 4d 20 74 31 22 20 7d 20 20 20 7b 31 20 32 20  OM t1" }   {1 2 
cd50: 33 20 34 20 35 20 36 7d 0a 0a 20 20 64 6f 5f 74  3 4 5 6}..  do_t
cd60: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
cd70: 6e 2e 33 2e 31 20 7b 0a 20 20 20 20 63 6f 64 65  n.3.1 {.    code
cd80: 32 20 7b 0a 20 20 20 20 20 20 64 62 32 20 63 6c  2 {.      db2 cl
cd90: 6f 73 65 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ose.      sqlite
cda0: 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79 3a 0a 20  3 db2 :memory:. 
cdb0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20     }.    sql2 { 
cdc0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6f 6d  .      PRAGMA om
cdd0: 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 3b  it_readlock = 1;
cde0: 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74  .      ATTACH 't
cdf0: 65 73 74 2e 64 62 27 20 41 53 20 74 77 6f 3b 0a  est.db' AS two;.
ce00: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
ce10: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
ce20: 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t1;.    }.  } {
ce30: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20 64  1 2 3 4 5 6}.  d
ce40: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37  o_test pager1-17
ce50: 2e 24 74 6e 2e 33 2e 32 20 7b 0a 20 20 63 73 71  .$tn.3.2 {.  csq
ce60: 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l1 { INSERT INTO
ce70: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
ce80: 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62   }.  } {1 {datab
ce90: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
cea0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ceb0: 2d 31 37 2e 24 74 6e 2e 33 2e 33 20 7b 20 73 71  -17.$tn.3.3 { sq
cec0: 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 7d  l2 COMMIT } {}.}
ced0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
cee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
cf20: 65 73 74 20 74 68 65 20 70 61 67 65 72 73 20 72  est the pagers r
cf30: 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 62  esponse to the b
cf40: 2d 74 72 65 65 20 6c 61 79 65 72 20 72 65 71 75  -tree layer requ
cf50: 65 73 74 69 6e 67 20 69 6c 6c 65 67 61 6c 20 70  esting illegal p
cf60: 61 67 65 20 0a 23 20 6e 75 6d 62 65 72 73 3a 0a  age .# numbers:.
cf70: 23 0a 23 20 20 20 2b 20 54 68 65 20 6c 6f 63 6b  #.#   + The lock
cf80: 69 6e 67 20 70 61 67 65 2c 0a 23 20 20 20 2b 20  ing page,.#   + 
cf90: 50 61 67 65 20 30 2c 0a 23 20 20 20 2b 20 41 20  Page 0,.#   + A 
cfa0: 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
cfb0: 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
cfc0: 74 68 61 6e 20 28 32 5e 33 31 2d 31 29 2e 0a 23  than (2^31-1)..#
cfd0: 0a 23 20 54 68 65 73 65 20 74 65 73 74 73 20 77  .# These tests w
cfe0: 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  ill not work if 
cff0: 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
d000: 45 52 46 4c 4f 57 5f 52 45 41 44 20 69 73 20 64  ERFLOW_READ is d
d010: 65 66 69 6e 65 64 2e 20 49 6e 0a 23 20 74 68 61  efined. In.# tha
d020: 74 20 63 61 73 65 20 49 4f 20 65 72 72 6f 72 73  t case IO errors
d030: 20 61 72 65 20 73 6f 6d 65 74 69 6d 65 73 20 72   are sometimes r
d040: 65 70 6f 72 74 65 64 20 69 6e 73 74 65 61 64 20  eported instead 
d050: 6f 66 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  of SQLITE_CORRUP
d060: 54 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 21  T..#.ifcapable !
d070: 64 69 72 65 63 74 5f 72 65 61 64 20 7b 0a 64 6f  direct_read {.do
d080: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e  _test pager1-18.
d090: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
d0a0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
d0b0: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
d0c0: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65  ing a_string.  e
d0d0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52  xecsql { .    PR
d0e0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
d0f0: 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
d100: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
d110: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d120: 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74  O t1 VALUES(a_st
d130: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
d140: 69 6e 67 28 32 30 30 29 29 3b 0a 20 20 20 20 49  ing(200));.    I
d150: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
d160: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
d170: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30  0), a_string(200
d180: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
d190: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
d1a0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
d1b0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30  0), a_string(200
d1c0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
d1d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
d1e0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
d1f0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30  0), a_string(200
d200: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
d210: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
d220: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
d230: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30  0), a_string(200
d240: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
d250: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
d260: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
d270: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30  0), a_string(200
d280: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
d290: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
d2a0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
d2b0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30  0), a_string(200
d2c0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
d2d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
d2e0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
d2f0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30  0), a_string(200
d300: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  ) FROM t1;.  }.}
d310: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65   {}.do_test page
d320: 72 31 2d 31 38 2e 32 20 7b 0a 20 20 73 65 74 20  r1-18.2 {.  set 
d330: 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45  root [db one "SE
d340: 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52  LECT rootpage FR
d350: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
d360: 22 5d 0a 20 20 73 65 74 20 6c 6f 63 6b 69 6e 67  "].  set locking
d370: 70 61 67 65 20 5b 65 78 70 72 20 28 30 78 31 30  page [expr (0x10
d380: 30 30 30 2f 31 30 32 34 29 20 2b 20 31 5d 0a 20  000/1024) + 1]. 
d390: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
d3a0: 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
d3b0: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55  chema = 1;.    U
d3c0: 50 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61 73  PDATE sqlite_mas
d3d0: 74 65 72 20 53 45 54 20 72 6f 6f 74 70 61 67 65  ter SET rootpage
d3e0: 20 3d 20 24 6c 6f 63 6b 69 6e 67 70 61 67 65 3b   = $lockingpage;
d3f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  .  }.  sqlite3 d
d400: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  b2 test.db.  cat
d410: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  chsql { SELECT c
d420: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
d430: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
d440: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
d450: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64  is malformed}}.d
d460: 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  b2 close.do_test
d470: 20 70 61 67 65 72 31 2d 31 38 2e 33 20 7b 0a 20   pager1-18.3 {. 
d480: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
d490: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
d4a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
d4b0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73  TO t2 VALUES(a_s
d4c0: 74 72 69 6e 67 28 35 30 30 30 29 29 3b 0a 20 20  tring(5000));.  
d4d0: 7d 0a 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78  }.  set pgno [ex
d4e0: 70 72 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74  pr ([file size t
d4f0: 65 73 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d  est.db] / 1024)-
d500: 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  2].  hexio_write
d510: 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28   test.db [expr (
d520: 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30  $pgno-1)*1024] 0
d530: 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65  0000000.  sqlite
d540: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
d550: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
d560: 54 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d  T length(x) FROM
d570: 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b   t2 } db2.} {1 {
d580: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
d590: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
d5a0: 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f  }}.db2 close.do_
d5b0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 34  test pager1-18.4
d5c0: 20 7b 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65   {.  hexio_write
d5d0: 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28   test.db [expr (
d5e0: 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 39  $pgno-1)*1024] 9
d5f0: 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65  0000000.  sqlite
d600: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
d610: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
d620: 54 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d  T length(x) FROM
d630: 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b   t2 } db2.} {1 {
d640: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
d650: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
d660: 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f  }}.db2 close.do_
d670: 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 35  test pager1-18.5
d680: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
d690: 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  "".  execsql {. 
d6a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d6b0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
d6c0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
d6d0: 20 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   b);.    PRAGMA 
d6e0: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
d6f0: 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20  = 1;.    UPDATE 
d700: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45  sqlite_master SE
d710: 54 20 72 6f 6f 74 70 61 67 65 3d 35 20 57 48 45  T rootpage=5 WHE
d720: 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74  RE tbl_name = 't
d730: 31 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  1';.    PRAGMA w
d740: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
d750: 20 30 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41   0;.    ALTER TA
d760: 42 4c 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f  BLE t1 RENAME TO
d770: 20 78 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68   x1;.  }.  catch
d780: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
d790: 52 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31 20 7b 64  ROM x1 }.} {1 {d
d7a0: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d7b0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d7c0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74  }.db close..do_t
d7d0: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 36 20  est pager1-18.6 
d7e0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
d7f0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
d800: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
d810: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
d820: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
d830: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
d840: 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  24;.    CREATE T
d850: 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
d860: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
d870: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38  ALUES(a_string(8
d880: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
d890: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
d8a0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
d8b0: 20 20 7d 0a 0a 20 20 73 65 74 20 72 6f 6f 74 20    }..  set root 
d8c0: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
d8d0: 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
d8e0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20  lite_master"].  
d8f0: 64 62 20 63 6c 6f 73 65 0a 0a 20 20 68 65 78 69  db close..  hexi
d900: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
d910: 5b 65 78 70 72 20 28 24 72 6f 6f 74 2d 31 29 2a  [expr ($root-1)*
d920: 31 30 32 34 20 2b 20 38 5d 20 30 30 30 30 30 30  1024 + 8] 000000
d930: 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  00.  sqlite3 db 
d940: 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73  test.db.  catchs
d950: 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67  ql { SELECT leng
d960: 74 68 28 78 29 20 46 52 4f 4d 20 74 31 20 7d 0a  th(x) FROM t1 }.
d970: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64  } {1 {database d
d980: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
d990: 66 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 74  formed}}.}..do_t
d9a0: 65 73 74 20 70 61 67 65 72 31 2d 31 39 2e 31 20  est pager1-19.1 
d9b0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22  {.  sqlite3 db "
d9c0: 22 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  ".  db func a_st
d9d0: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
d9e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
d9f0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
da00: 20 35 31 32 3b 0a 20 20 20 20 50 52 41 47 4d 41   512;.    PRAGMA
da10: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31   auto_vacuum = 1
da20: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
da30: 4c 45 20 74 31 28 61 61 2c 20 61 62 2c 20 61 63  LE t1(aa, ab, ac
da40: 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67  , ad, ae, af, ag
da50: 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b  , ah, ai, aj, ak
da60: 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20  , al, am, an,.  
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64    ba, bb, bc, bd
da90: 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68  , be, bf, bg, bh
daa0: 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c  , bi, bj, bk, bl
dab0: 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20  , bm, bn,.      
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
dad0: 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65  , cb, cc, cd, ce
dae0: 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69  , cf, cg, ch, ci
daf0: 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d  , cj, ck, cl, cm
db00: 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , cn,.          
db10: 20 20 20 20 20 20 20 20 20 20 64 61 2c 20 64 62            da, db
db20: 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66  , dc, dd, de, df
db30: 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a  , dg, dh, di, dj
db40: 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e  , dk, dl, dm, dn
db50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
db60: 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63        ea, eb, ec
db70: 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67  , ed, ee, ef, eg
db80: 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b  , eh, ei, ej, ek
db90: 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20  , el, em, en,.  
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64    fa, fb, fc, fd
dbc0: 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68  , fe, ff, fg, fh
dbd0: 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c  , fi, fj, fk, fl
dbe0: 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20  , fm, fn,.      
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 61                ga
dc00: 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65  , gb, gc, gd, ge
dc10: 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69  , gf, gg, gh, gi
dc20: 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d  , gj, gk, gl, gm
dc30: 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , gn,.          
dc40: 20 20 20 20 20 20 20 20 20 20 68 61 2c 20 68 62            ha, hb
dc50: 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66  , hc, hd, he, hf
dc60: 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a  , hg, hh, hi, hj
dc70: 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e  , hk, hl, hm, hn
dc80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dc90: 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63        ia, ib, ic
dca0: 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67  , id, ie, if, ig
dcb0: 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b  , ih, ii, ij, ik
dcc0: 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20  , il, im, ix,.  
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64    ja, jb, jc, jd
dcf0: 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68  , je, jf, jg, jh
dd00: 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c  , ji, jj, jk, jl
dd10: 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20  , jm, jn,.      
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 61                ka
dd30: 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65  , kb, kc, kd, ke
dd40: 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69  , kf, kg, kh, ki
dd50: 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d  , kj, kk, kl, km
dd60: 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , kn,.          
dd70: 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62            la, lb
dd80: 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66  , lc, ld, le, lf
dd90: 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a  , lg, lh, li, lj
dda0: 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e  , lk, ll, lm, ln
ddb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ddc0: 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63        ma, mb, mc
ddd0: 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67  , md, me, mf, mg
dde0: 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b  , mh, mi, mj, mk
ddf0: 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20  , ml, mm, mn.   
de00: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
de10: 41 42 4c 45 20 74 32 28 61 61 2c 20 61 62 2c 20  ABLE t2(aa, ab, 
de20: 61 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20  ac, ad, ae, af, 
de30: 61 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20  ag, ah, ai, aj, 
de40: 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a  ak, al, am, an,.
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20      ba, bb, bc, 
de70: 62 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20  bd, be, bf, bg, 
de80: 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20  bh, bi, bj, bk, 
de90: 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20  bl, bm, bn,.    
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 63 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20  ca, cb, cc, cd, 
dec0: 63 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20  ce, cf, cg, ch, 
ded0: 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20  ci, cj, ck, cl, 
dee0: 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20  cm, cn,.        
def0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 2c 20              da, 
df00: 64 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20  db, dc, dd, de, 
df10: 64 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20  df, dg, dh, di, 
df20: 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20  dj, dk, dl, dm, 
df30: 64 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dn,.            
df40: 20 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20          ea, eb, 
df50: 65 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20  ec, ed, ee, ef, 
df60: 65 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20  eg, eh, ei, ej, 
df70: 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a  ek, el, em, en,.
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 20 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20      fa, fb, fc, 
dfa0: 66 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20  fd, fe, ff, fg, 
dfb0: 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20  fh, fi, fj, fk, 
dfc0: 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20  fl, fm, fn,.    
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 67 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20  ga, gb, gc, gd, 
dff0: 67 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20  ge, gf, gg, gh, 
e000: 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20  gi, gj, gk, gl, 
e010: 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20  gm, gn,.        
e020: 20 20 20 20 20 20 20 20 20 20 20 20 68 61 2c 20              ha, 
e030: 68 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20  hb, hc, hd, he, 
e040: 68 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20  hf, hg, hh, hi, 
e050: 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20  hj, hk, hl, hm, 
e060: 68 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  hn,.            
e070: 20 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20          ia, ib, 
e080: 69 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20  ic, id, ie, if, 
e090: 69 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20  ig, ih, ii, ij, 
e0a0: 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a  ik, il, im, ix,.
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20      ja, jb, jc, 
e0d0: 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20  jd, je, jf, jg, 
e0e0: 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20  jh, ji, jj, jk, 
e0f0: 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20  jl, jm, jn,.    
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20  ka, kb, kc, kd, 
e120: 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20  ke, kf, kg, kh, 
e130: 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20  ki, kj, kk, kl, 
e140: 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20  km, kn,.        
e150: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20              la, 
e160: 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20  lb, lc, ld, le, 
e170: 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20  lf, lg, lh, li, 
e180: 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20  lj, lk, ll, lm, 
e190: 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ln,.            
e1a0: 20 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20          ma, mb, 
e1b0: 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20  mc, md, me, mf, 
e1c0: 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20  mg, mh, mi, mj, 
e1d0: 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20  mk, ml, mm, mn. 
e1e0: 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54     );.    INSERT
e1f0: 20 49 4e 54 4f 20 74 31 28 61 61 29 20 56 41 4c   INTO t1(aa) VAL
e200: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30  UES( a_string(10
e210: 30 30 30 30 29 20 29 3b 0a 20 20 20 20 49 4e 53  0000) );.    INS
e220: 45 52 54 20 49 4e 54 4f 20 74 32 28 61 61 29 20  ERT INTO t2(aa) 
e230: 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67  VALUES( a_string
e240: 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20  (100000) );.    
e250: 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d  VACUUM;.  }.} {}
e260: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
e270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
e2b0: 65 73 74 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  est a couple of 
e2c0: 73 70 65 63 69 61 6c 20 63 61 73 65 73 20 74 68  special cases th
e2d0: 61 74 20 63 6f 6d 65 20 75 70 20 77 68 69 6c 65  at come up while
e2e0: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 0a 23 20 74   committing .# t
e2f0: 72 61 6e 73 61 63 74 69 6f 6e 73 3a 0a 23 0a 23  ransactions:.#.#
e300: 20 20 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 2a     pager1-20.1.*
e310: 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 20  : Committing an 
e320: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
e330: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  se transaction w
e340: 68 65 6e 20 74 68 65 20 0a 23 20 20 20 20 20 20  hen the .#      
e350: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
e360: 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65 65  base has not bee
e370: 6e 20 6d 6f 64 69 66 69 65 64 20 61 74 20 61 6c  n modified at al
e380: 6c 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  l..#.#   pager1-
e390: 32 30 2e 32 2e 2a 3a 20 41 73 20 61 62 6f 76 65  20.2.*: As above
e3a0: 2c 20 62 75 74 20 77 69 74 68 20 61 20 6e 6f 72  , but with a nor
e3b0: 6d 61 6c 20 64 62 20 69 6e 20 65 78 63 6c 75 73  mal db in exclus
e3c0: 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
e3d0: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
e3e0: 30 2e 33 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e  0.3.*: Committin
e3f0: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
e400: 69 6e 20 57 41 4c 20 6d 6f 64 65 20 77 68 65 72  in WAL mode wher
e410: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  e the database h
e420: 61 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  as.#            
e430: 20 20 20 20 20 20 62 65 65 6e 20 6d 6f 64 69 66        been modif
e440: 69 65 64 2c 20 62 75 74 20 61 6c 6c 20 64 69 72  ied, but all dir
e450: 74 79 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ty pages have be
e460: 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 0a 23  en flushed to .#
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 64 69 73 6b 20 62 65 66 6f 72 65 20 74 68    disk before th
e490: 65 20 63 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74  e commit..#.do_t
e4a0: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e  est pager1-20.1.
e4b0: 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20  1 {.  catch {db 
e4c0: 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65 33  close}.  sqlite3
e4d0: 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65   db :memory:.  e
e4e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
e4f0: 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77  ATE TABLE one(tw
e500: 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49  o, three);.    I
e510: 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56  NSERT INTO one V
e520: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
e530: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
e540: 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 32 20  t pager1-20.1.2 
e550: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
e560: 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56    BEGIN EXCLUSIV
e570: 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  E;.    COMMIT;. 
e580: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
e590: 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 31 20 7b   pager1-20.2.1 {
e5a0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
e5b0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
e5c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
e5d0: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
e5e0: 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20  e = exclusive;. 
e5f0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
e600: 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74  l_mode = persist
e610: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
e620: 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65  LE one(two, thre
e630: 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  e);.    INSERT I
e640: 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27  NTO one VALUES('
e650: 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20  a', 'b');.  }.} 
e660: 7b 65 78 63 6c 75 73 69 76 65 20 70 65 72 73 69  {exclusive persi
e670: 73 74 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  st}.do_test page
e680: 72 31 2d 32 30 2e 32 2e 32 20 7b 0a 20 20 65 78  r1-20.2.2 {.  ex
e690: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
e6a0: 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  N EXCLUSIVE;.   
e6b0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
e6c0: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c  }..ifcapable wal
e6d0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
e6e0: 65 72 31 2d 32 30 2e 33 2e 31 20 7b 0a 20 20 20  er1-20.3.1 {.   
e6f0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
e700: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
e710: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
e720: 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78   a_string.    ex
e730: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
e740: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
e750: 3d 20 31 30 3b 0a 20 20 20 20 20 20 50 52 41 47  = 10;.      PRAG
e760: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
e770: 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 42 45 47  = wal;.      BEG
e780: 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  IN;.        CREA
e790: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
e7a0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
e7b0: 41 42 4c 45 20 74 32 28 79 29 3b 0a 20 20 20 20  ABLE t2(y);.    
e7c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e7d0: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
e7e0: 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20 20  ng(800));.      
e7f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
e800: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
e810: 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (800) FROM t1;  
e820: 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f         /*   2 */
e830: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
e840: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
e850: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
e860: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  M t1;         /*
e870: 20 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20     4 */.        
e880: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
e890: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38  ELECT a_string(8
e8a0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
e8b0: 20 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20       /*   8 */. 
e8c0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
e8d0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
e8e0: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
e8f0: 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20  t1;         /*  
e900: 31 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e  16 */.        IN
e910: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
e920: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
e930: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
e940: 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20     /*  32 */.   
e950: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
e960: 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f  .  } {wal}.  do_
e970: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33  test pager1-20.3
e980: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
e990: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
e9a0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
e9b0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 78 78 78  O t2 VALUES('xxx
e9c0: 78 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  x');.    }.    r
e9d0: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
e9e0: 33 32 20 74 31 0a 20 20 20 20 65 78 65 63 73 71  32 t1.    execsq
e9f0: 6c 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a  l COMMIT.  } {}.
ea00: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
ea10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
ea50: 54 65 73 74 20 74 68 61 74 20 61 20 57 41 4c 20  Test that a WAL 
ea60: 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74  database may not
ea70: 20 62 65 20 6f 70 65 6e 65 64 20 69 66 3a 0a 23   be opened if:.#
ea80: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e 31  .#   pager1-21.1
ea90: 2e 2a 3a 20 54 68 65 20 56 46 53 20 68 61 73 20  .*: The VFS has 
eaa0: 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c 65 73 73  an iVersion less
eab0: 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23 20 20 20   than 2, or.#   
eac0: 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a 3a 20 54  pager1-21.2.*: T
ead0: 68 65 20 56 46 53 20 64 6f 65 73 20 6e 6f 74 20  he VFS does not 
eae0: 70 72 6f 76 69 64 65 20 78 53 68 6d 58 58 58 28  provide xShmXXX(
eaf0: 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a 69 66 63  ) methods..#.ifc
eb00: 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64  apable wal {.  d
eb10: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 31  o_test pager1-21
eb20: 2e 30 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  .0 {.    faultsi
eb30: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
eb40: 70 65 6e 0a 20 20 20 20 65 78 65 63 73 71 6c 20  pen.    execsql 
eb50: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  {.      PRAGMA j
eb60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
eb70: 4c 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  L;.      CREATE 
eb80: 54 41 42 4c 45 20 6b 6f 28 63 20 44 45 46 41 55  TABLE ko(c DEFAU
eb90: 4c 54 20 27 61 62 63 27 2c 20 62 20 44 45 46 41  LT 'abc', b DEFA
eba0: 55 4c 54 20 27 64 65 66 27 29 3b 0a 20 20 20 20  ULT 'def');.    
ebb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f    INSERT INTO ko
ebc0: 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b   DEFAULT VALUES;
ebd0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d  .    }.  } {wal}
ebe0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
ebf0: 31 2d 32 31 2e 31 20 7b 0a 20 20 20 20 74 65 73  1-21.1 {.    tes
ec00: 74 76 66 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31  tvfs tv -noshm 1
ec10: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
ec20: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76   test.db -vfs tv
ec30: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
ec40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f  SELECT * FROM ko
ec50: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75   } db2.  } {1 {u
ec60: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
ec70: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20  tabase file}}.  
ec80: 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20 64  db2 close.  tv d
ec90: 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20  elete.  do_test 
eca0: 70 61 67 65 72 31 2d 32 31 2e 32 20 7b 0a 20 20  pager1-21.2 {.  
ecb0: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 69 76    testvfs tv -iv
ecc0: 65 72 73 69 6f 6e 20 31 0a 20 20 20 20 73 71 6c  ersion 1.    sql
ecd0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
ece0: 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61 74   -vfs tv.    cat
ecf0: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
ed00: 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20   FROM ko } db2. 
ed10: 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f   } {1 {unable to
ed20: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
ed30: 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73  ile}}.  db2 clos
ed40: 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a  e.  tv delete.}.
ed50: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
ed60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
eda0: 73 74 20 74 68 61 74 20 61 20 22 50 52 41 47 4d  st that a "PRAGM
edb0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
edc0: 22 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  ":.#.#   pager1-
edd0: 32 32 2e 31 2e 2a 3a 20 69 73 20 61 20 6e 6f 2d  22.1.*: is a no-
ede0: 6f 70 20 6f 6e 20 61 20 6e 6f 6e 2d 57 41 4c 20  op on a non-WAL 
edf0: 64 62 2c 20 61 6e 64 0a 23 20 20 20 70 61 67 65  db, and.#   page
ee00: 72 31 2d 32 32 2e 32 2e 2a 3a 20 64 6f 65 73 20  r1-22.2.*: does 
ee10: 6e 6f 74 20 63 61 75 73 65 20 78 53 79 6e 63 20  not cause xSync 
ee20: 63 61 6c 6c 73 20 77 69 74 68 20 61 20 73 79 6e  calls with a syn
ee30: 63 68 72 6f 6e 6f 75 73 3d 6f 66 66 20 64 62 2e  chronous=off db.
ee40: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c  .#.ifcapable wal
ee50: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
ee60: 65 72 31 2d 32 32 2e 31 2e 31 20 7b 0a 20 20 20  er1-22.1.1 {.   
ee70: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
ee80: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
ee90: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
eea0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28  CREATE TABLE ko(
eeb0: 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c  c DEFAULT 'abc',
eec0: 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66 27   b DEFAULT 'def'
eed0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
eee0: 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20  INTO ko DEFAULT 
eef0: 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20 20  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 7d 20 7b 30 20 2d 31 20 2d 31  t }.  } {0 -1 -1
ef30: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
ef40: 72 31 2d 32 32 2e 32 2e 31 20 7b 0a 20 20 20 20  r1-22.2.1 {.    
ef50: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
ef60: 75 6c 74 20 31 0a 20 20 20 20 74 76 20 66 69 6c  ult 1.    tv fil
ef70: 74 65 72 20 78 53 79 6e 63 0a 20 20 20 20 74 76  ter xSync.    tv
ef80: 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a   script xSyncCb.
ef90: 20 20 20 20 70 72 6f 63 20 78 53 79 6e 63 43 62      proc xSyncCb
efa0: 20 7b 61 72 67 73 7d 20 7b 69 6e 63 72 20 3a 3a   {args} {incr ::
efb0: 73 79 6e 63 63 6f 75 6e 74 7d 0a 20 20 20 20 73  synccount}.    s
efc0: 65 74 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 20 30  et ::synccount 0
efd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
efe0: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63  test.db.    exec
eff0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
f000: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
f010: 20 6f 66 66 3b 0a 20 20 20 20 20 20 50 52 41 47   off;.      PRAG
f020: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f030: 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 49 4e 53  = WAL;.      INS
f040: 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41  ERT INTO ko DEFA
f050: 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20  ULT VALUES;.    
f060: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
f070: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
f080: 70 6f 69 6e 74 20 7d 0a 20 20 20 20 73 65 74 20  point }.    set 
f090: 73 79 6e 63 63 6f 75 6e 74 0a 20 20 7d 20 7b 30  synccount.  } {0
f0a0: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  }.  db close.  t
f0b0: 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d  v delete.}..#---
f0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f100: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66  ------.# Tests f
f110: 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a 6f 75 72  or changing jour
f120: 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20  nal mode..#.#   
f130: 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a 3a 20 54  pager1-23.1.*: T
f140: 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 63 68  est that when ch
f150: 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50 45 52 53  anging from PERS
f160: 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 6d 6f  IST to DELETE mo
f170: 64 65 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20  de,.#           
f180: 20 20 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e         the journ
f190: 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  al file is delet
f1a0: 65 64 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  ed..#.#   pager1
f1b0: 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65  -23.2.*: Same te
f1c0: 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74  st as above, but
f1d0: 20 77 68 69 6c 65 20 61 20 73 68 61 72 65 64 20   while a shared 
f1e0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20  lock is held.#  
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f210: 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65  file..#.#   page
f220: 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d 65 20  r1-23.3.*: Same 
f230: 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62  test as above, b
f240: 75 74 20 77 68 69 6c 65 20 61 20 72 65 73 65 72  ut while a reser
f250: 76 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ved lock is held
f260: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
f270: 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
f280: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20  ase file..#.#   
f290: 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a 3a 20 41  pager1-23.4.*: A
f2a0: 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20 77 68 69  nd, for fun, whi
f2b0: 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  le holding an ex
f2c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 23 0a  clusive lock..#.
f2d0: 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  #   pager1-23.5.
f2e0: 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 76 61  *: Try to set va
f2f0: 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20  rious different 
f300: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 77 69  journal modes wi
f310: 74 68 20 61 6e 0a 23 20 20 20 20 20 20 20 20 20  th an.#         
f320: 20 20 20 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f           in-memo
f330: 72 79 20 64 61 74 61 62 61 73 65 20 28 6f 6e 6c  ry database (onl
f340: 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20 4f 46 46  y MEMORY and OFF
f350: 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a 23   should work)..#
f360: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 36  .#   pager1-23.6
f370: 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 6c  .*: Try to set l
f380: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
f390: 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  al on an in-memo
f3a0: 72 79 20 64 61 74 61 62 61 73 65 0a 23 20 20 20  ry database.#   
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f3c0: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 2d 20 69  doesn't work - i
f3d0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
f3e0: 65 73 20 61 6c 77 61 79 73 20 75 73 65 0a 23 20  es always use.# 
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
f410: 63 6c 75 73 69 76 65 29 2e 0a 23 0a 64 6f 5f 74  clusive)..#.do_t
f420: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  est pager1-23.1.
f430: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
f440: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
f450: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f460: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f470: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
f480: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
f490: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20   t1(a, b);.  }. 
f4a0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
f4b0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
f4c0: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
f4d0: 31 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65  1-23.1.2 {.  exe
f4e0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
f4f0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
f500: 45 54 45 20 7d 0a 20 20 66 69 6c 65 20 65 78 69  ETE }.  file exi
f510: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
f520: 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65  nal.} {0}..do_te
f530: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 31  st pager1-23.2.1
f540: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
f550: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
f560: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
f570: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
f580: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 43 61 6e  O t1 VALUES('Can
f590: 62 65 72 72 61 27 2c 20 27 41 43 54 27 29 3b 0a  berra', 'ACT');.
f5a0: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
f5b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
f5c0: 20 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c   } {.    db eval
f5d0: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f5e0: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
f5f0: 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  }.  }.  execsql 
f600: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
f610: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
f620: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
f630: 31 2d 32 33 2e 32 2e 32 20 7b 0a 20 20 66 69 6c  1-23.2.2 {.  fil
f640: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
f650: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a  -journal.} {0}..
f660: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f670: 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.3.1 {.  execsq
f680: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
f690: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
f6a0: 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52  RSIST;.    INSER
f6b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
f6c0: 28 27 44 61 72 77 69 6e 27 2c 20 27 4e 54 27 29  ('Darwin', 'NT')
f6d0: 3b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45  ;.    BEGIN IMME
f6e0: 44 49 41 54 45 3b 0a 20 20 7d 0a 20 20 64 62 20  DIATE;.  }.  db 
f6f0: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
f700: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
f710: 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
f720: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
f730: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
f740: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
f750: 31 2d 32 33 2e 33 2e 32 20 7b 0a 20 20 66 69 6c  1-23.3.2 {.  fil
f760: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
f770: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
f780: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f790: 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.3 {.  execsql
f7a0: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
f7b0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f7c0: 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
f7d0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
f7e0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
f7f0: 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  IST;.    INSERT 
f800: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
f810: 41 64 65 6c 61 69 64 65 27 2c 20 27 53 41 27 29  Adelaide', 'SA')
f820: 3b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c  ;.    BEGIN EXCL
f830: 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 64 62 20  USIVE;.  }.  db 
f840: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
f850: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
f860: 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
f870: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
f880: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
f890: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
f8a0: 31 2d 32 33 2e 34 2e 32 20 7b 0a 20 20 66 69 6c  1-23.4.2 {.  fil
f8b0: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
f8c0: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
f8d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f8e0: 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.3 {.  execsql
f8f0: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
f900: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f910: 35 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  5.1 {.  faultsim
f920: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
f930: 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  en.  sqlite3 db 
f940: 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66 6f  :memory:.} {}.fo
f950: 72 65 61 63 68 20 7b 74 6e 20 6d 6f 64 65 20 70  reach {tn mode p
f960: 6f 73 73 69 62 6c 65 7d 20 7b 0a 20 20 32 20 20  ossible} {.  2  
f970: 6f 66 66 20 20 20 20 20 20 31 0a 20 20 33 20 20  off      1.  3  
f980: 6d 65 6d 6f 72 79 20 20 20 31 0a 20 20 34 20 20  memory   1.  4  
f990: 70 65 72 73 69 73 74 20 20 30 0a 20 20 35 20 20  persist  0.  5  
f9a0: 64 65 6c 65 74 65 20 20 20 30 0a 20 20 36 20 20  delete   0.  6  
f9b0: 77 61 6c 20 20 20 20 20 20 30 0a 20 20 37 20 20  wal      0.  7  
f9c0: 74 72 75 6e 63 61 74 65 20 30 0a 7d 20 7b 0a 20  truncate 0.} {. 
f9d0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
f9e0: 32 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  23.5.$tn.1 {.   
f9f0: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
fa00: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
fa10: 6f 66 66 22 0a 20 20 20 20 65 78 65 63 73 71 6c  off".    execsql
fa20: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
fa30: 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20  _mode = $mode". 
fa40: 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65   } [if $possible
fa50: 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c   {list $mode} {l
fa60: 69 73 74 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f 74  ist off}].  do_t
fa70: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  est pager1-23.5.
fa80: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  $tn.2 {.    exec
fa90: 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  sql "PRAGMA jour
faa0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72  nal_mode = memor
fab0: 79 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  y".    execsql "
fac0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
fad0: 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d  ode = $mode".  }
fae0: 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b   [if $possible {
faf0: 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73  list $mode} {lis
fb00: 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f  t memory}].}.do_
fb10: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
fb20: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
fb30: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
fb40: 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d 20  ode = normal}.} 
fb50: 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74  {exclusive}.do_t
fb60: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  est pager1-23.6.
fb70: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  2 {.  execsql {P
fb80: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
fb90: 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 7d 0a  de = exclusive}.
fba0: 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f  } {exclusive}.do
fbb0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fbc0: 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.3 {.  execsql 
fbd0: 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  {PRAGMA locking_
fbe0: 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  mode}.} {exclusi
fbf0: 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ve}.do_test page
fc00: 72 31 2d 32 33 2e 36 2e 34 20 7b 0a 20 20 65 78  r1-23.6.4 {.  ex
fc10: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6d 61  ecsql {PRAGMA ma
fc20: 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d  in.locking_mode}
fc30: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 0a  .} {exclusive}..
fc40: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
fc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
fc90: 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
fca0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
fcb0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
fcc0: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
fcd0: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
fce0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
fcf0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
fd00: 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41  = 10;.    PRAGMA
fd10: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46   auto_vacuum = F
fd20: 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ULL;.    CREATE 
fd30: 54 41 42 4c 45 20 78 31 28 78 2c 20 79 2c 20 7a  TABLE x1(x, y, z
fd40: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c  , PRIMARY KEY(y,
fd50: 20 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   z));.    CREATE
fd60: 20 54 41 42 4c 45 20 78 32 28 78 2c 20 79 2c 20   TABLE x2(x, y, 
fd70: 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79  z, PRIMARY KEY(y
fd80: 2c 20 7a 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  , z));.    INSER
fd90: 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53  T INTO x2 VALUES
fda0: 28 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20  (a_string(400), 
fdb0: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
fdc0: 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20  _string(600));. 
fdd0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
fde0: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
fdf0: 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(600), a_string
fe00: 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
fe10: 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  500) FROM x2;.  
fe20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
fe30: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
fe40: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
fe50: 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34  600), a_string(4
fe60: 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
fe70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
fe80: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
fe90: 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35  400), a_string(5
fea0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
feb0: 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
fec0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
fed0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36  ELECT a_string(6
fee0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  00), a_string(40
fef0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
ff00: 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
ff10: 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
ff20: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
ff30: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
ff40: 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ), a_string(400)
ff50: 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
ff60: 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
ff70: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30  ECT a_string(400
ff80: 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ), a_string(500)
ff90: 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
ffa0: 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
ffb0: 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
ffc0: 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
ffd0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
ffe0: 61 67 65 72 31 2d 32 34 2e 31 2e 32 20 7b 0a 20  ager1-24.1.2 {. 
fff0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
10000 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
10010 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45  TE FROM x1 WHERE
10020 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 7d 0a 20   rowid<32;.  }. 
10030 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63   recursive_selec
10040 74 20 36 34 20 78 32 0a 7d 20 7b 7d 0a 64 6f 5f  t 64 x2.} {}.do_
10050 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
10060 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
10070 20 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78   .      UPDATE x
10080 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69  1 SET z = a_stri
10090 6e 67 28 33 30 30 29 20 57 48 45 52 45 20 72 6f  ng(300) WHERE ro
100a0 77 69 64 3e 34 30 3b 0a 20 20 20 20 43 4f 4d 4d  wid>40;.    COMM
100b0 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  IT;.    PRAGMA i
100c0 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
100d0 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
100e0 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d  (*) FROM x1;.  }
100f0 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74  .} {ok 33}..do_t
10100 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e  est pager1-24.1.
10110 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
10120 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
10130 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x1;.    INSERT I
10140 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20  NTO x1 SELECT * 
10150 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 42 45 47  FROM x2;.    BEG
10160 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
10170 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72   FROM x1 WHERE r
10180 6f 77 69 64 3c 33 32 3b 0a 20 20 20 20 20 20 55  owid<32;.      U
10190 50 44 41 54 45 20 78 31 20 53 45 54 20 7a 20 3d  PDATE x1 SET z =
101a0 20 61 5f 73 74 72 69 6e 67 28 32 39 39 29 20 57   a_string(299) W
101b0 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20  HERE rowid>40;. 
101c0 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73   }.  recursive_s
101d0 65 6c 65 63 74 20 36 34 20 78 32 20 7b 64 62 20  elect 64 x2 {db 
101e0 65 76 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20 20 65  eval COMMIT}.  e
101f0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
10200 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
10210 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  eck;.    SELECT 
10220 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31  count(*) FROM x1
10230 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a  ;.  }.} {ok 33}.
10240 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
10250 32 34 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  24.1.5 {.  execs
10260 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
10270 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53  FROM x1;.    INS
10280 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
10290 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
102a0 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65  }.  recursive_se
102b0 6c 65 63 74 20 36 34 20 78 32 20 7b 20 64 62 20  lect 64 x2 { db 
102c0 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42  eval {CREATE TAB
102d0 4c 45 20 78 33 28 78 2c 20 79 2c 20 7a 29 7d 20  LE x3(x, y, z)} 
102e0 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
102f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 33 20 7d  LECT * FROM x3 }
10300 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
10310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10350 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  -.#.do_test page
10360 72 31 2d 32 35 2d 31 20 7b 0a 20 20 66 61 75 6c  r1-25-1 {.  faul
10370 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
10380 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
10390 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
103a0 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62      SAVEPOINT ab
103b0 63 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  c;.        CREAT
103c0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
103d0 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ;.      ROLLBACK
103e0 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d   TO abc;.    COM
103f0 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c  MIT;.  }.  db cl
10400 6f 73 65 0a 7d 20 7b 7d 0a 62 72 65 61 6b 70 6f  ose.} {}.breakpo
10410 69 6e 74 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  int.do_test page
10420 72 31 2d 32 35 2d 32 20 7b 0a 20 20 66 61 75 6c  r1-25-2 {.  faul
10430 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
10440 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
10450 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54   {.    SAVEPOINT
10460 20 61 62 63 3b 0a 20 20 20 20 20 20 43 52 45 41   abc;.      CREA
10470 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
10480 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  );.    ROLLBACK 
10490 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d  TO abc;.    COMM
104a0 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f  IT;.  }.  db clo
104b0 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  se.} {}..#------
104c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10500 2d 2d 2d 0a 23 20 53 65 63 74 6f 72 2d 73 69 7a  ---.# Sector-siz
10510 65 20 74 65 73 74 73 2e 0a 23 0a 64 6f 5f 74 65  e tests..#.do_te
10520 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b  st pager1-26.1 {
10530 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
10540 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65  efault 1.  tv se
10550 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 20 20  ctorsize 4096.  
10560 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
10570 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
10580 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
10590 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
105a0 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
105b0 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
105c0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
105d0 74 62 6c 28 61 20 50 52 49 4d 41 52 59 20 4b 45  tbl(a PRIMARY KE
105e0 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20  Y, b UNIQUE);.  
105f0 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
10600 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56  NSERT INTO tbl V
10610 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32  ALUES(a_string(2
10620 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
10630 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
10640 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
10650 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
10660 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
10670 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
10680 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
10690 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
106a0 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
106b0 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
106c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
106d0 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
106e0 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
106f0 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  0) FROM tbl;.   
10700 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10710 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
10720 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
10730 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
10740 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
10750 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
10760 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
10770 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
10780 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
10790 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
107a0 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
107b0 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
107c0 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45   tbl;.      INSE
107d0 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
107e0 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
107f0 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
10800 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 43 4f 4d  ROM tbl;.    COM
10810 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  MIT;.  }.} {}.do
10820 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
10830 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20 55 50  ger1-26.1 {.  UP
10840 44 41 54 45 20 74 62 6c 20 53 45 54 20 62 20 3d  DATE tbl SET b =
10850 20 61 5f 73 74 72 69 6e 67 28 35 35 30 29 3b 0a   a_string(550);.
10860 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  } {}.db close.tv
10870 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d   delete..#------
10880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108c0 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ---.#.do_test pa
108d0 67 65 72 31 2e 32 37 2e 31 20 7b 0a 20 20 66 61  ger1.27.1 {.  fa
108e0 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
108f0 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74  d_reopen.  sqlit
10900 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
10910 74 73 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20  ts db.  execsql 
10920 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
10930 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10940 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20  t1(a, b);.  }.  
10950 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
10960 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65  fcounts db.  exe
10970 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d  csql COMMIT.} {}
10980 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
10990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
109d0 65 73 74 20 74 68 61 74 20 61 74 74 65 6d 70 74  est that attempt
109e0 69 6e 67 20 74 6f 20 6f 70 65 6e 20 61 20 77 72  ing to open a wr
109f0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
10a00 77 69 74 68 20 0a 23 20 6c 6f 63 6b 69 6e 67 5f  with .# locking_
10a10 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 69  mode=exclusive i
10a20 6e 20 57 41 4c 20 6d 6f 64 65 20 66 61 69 6c 73  n WAL mode fails
10a30 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   if there are ot
10a40 68 65 72 20 63 6c 69 65 6e 74 73 20 6f 6e 20 0a  her clients on .
10a50 23 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  # the same datab
10a60 61 73 65 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64  ase..#.catch { d
10a70 62 20 63 6c 6f 73 65 20 7d 0a 69 66 63 61 70 61  b close }.ifcapa
10a80 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 6d  ble wal {.  do_m
10a90 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20  ulticlient_test 
10aa0 74 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74  tn {.    do_test
10ab0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
10ac0 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 20   {.      sql1 { 
10ad0 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  .        PRAGMA 
10ae0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
10af0 41 4c 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  AL;.        CREA
10b00 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
10b10 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
10b20 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
10b30 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
10b40 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d 0a    }.    } {wal}.
10b50 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
10b60 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 73 71  r1-28.$tn.2 { sq
10b70 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l2 { SELECT * FR
10b80 4f 4d 20 74 31 20 7d 20 7d 20 7b 61 20 62 7d 0a  OM t1 } } {a b}.
10b90 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
10ba0 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73  er1-28.$tn.3 { s
10bb0 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63  ql1 { PRAGMA loc
10bc0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
10bd0 69 76 65 20 7d 20 7d 20 7b 65 78 63 6c 75 73 69  ive } } {exclusi
10be0 76 65 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  ve}.    do_test 
10bf0 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20  pager1-28.$tn.4 
10c00 7b 20 0a 20 20 20 20 20 20 63 73 71 6c 31 20 7b  { .      csql1 {
10c10 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49   BEGIN; INSERT I
10c20 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63  NTO t1 VALUES('c
10c30 27 2c 20 27 64 27 29 3b 20 7d 0a 20 20 20 20 7d  ', 'd'); }.    }
10c40 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
10c50 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 20 20 63 6f   locked}}.    co
10c60 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73 65 20  de2 { db2 close 
10c70 3b 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65  ; sqlite3 db2 te
10c80 73 74 2e 64 62 20 7d 0a 20 20 20 20 64 6f 5f 74  st.db }.    do_t
10c90 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
10ca0 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 73 71 6c  n.4 { .      sql
10cb0 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  1 { INSERT INTO 
10cc0 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27  t1 VALUES('c', '
10cd0 64 27 29 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  d'); COMMIT }.  
10ce0 20 20 7d 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d    } {}.  }.}..#-
10cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d30 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e 6f 72 6d 61  --------.# Norma
10d40 6c 6c 79 2c 20 77 68 65 6e 20 63 68 61 6e 67 69  lly, when changi
10d50 6e 67 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f  ng from journal_
10d60 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 74 6f 20  mode=PERSIST to 
10d70 44 45 4c 45 54 45 20 74 68 65 20 70 61 67 65 72  DELETE the pager
10d80 0a 23 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  .# attempts to d
10d90 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
10da0 6c 20 66 69 6c 65 2e 20 48 6f 77 65 76 65 72 2c  l file. However,
10db0 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 20 6f 62   if it cannot ob
10dc0 74 61 69 6e 20 61 0a 23 20 52 45 53 45 52 56 45  tain a.# RESERVE
10dd0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
10de0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
10df0 73 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  s step is skippe
10e00 64 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69  d..#.do_multicli
10e10 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20  ent_test tn {.  
10e20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10e30 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71  8.$tn.1 {.    sq
10e40 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  l1 { .      PRAG
10e50 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
10e60 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20  = PERSIST;.     
10e70 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
10e80 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e  (a, b);.      IN
10e90 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
10ea0 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
10eb0 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73     }.  } {persis
10ec0 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  t}.  do_test pag
10ed0 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 66  er1-28.$tn.2 { f
10ee0 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
10ef0 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20  db-journal } 1. 
10f00 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10f10 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20  28.$tn.3 { sql1 
10f20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
10f30 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d  _mode = DELETE }
10f40 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74   } delete.  do_t
10f50 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
10f60 6e 2e 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74  n.4 { file exist
10f70 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
10f80 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 0..  do_test
10f90 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 35   pager1-28.$tn.5
10fa0 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20   {.    sql1 { . 
10fb0 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
10fc0 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
10fd0 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ST;.      INSERT
10fe0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
10ff0 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20 7d  'c', 'd');.    }
11000 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20  .  } {persist}. 
11010 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11020 32 38 2e 24 74 6e 2e 36 20 7b 20 66 69 6c 65 20  28.$tn.6 { file 
11030 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
11040 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f  ournal } 1.  do_
11050 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11060 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32 20  tn.7 {.    sql2 
11070 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20  { BEGIN; INSERT 
11080 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
11090 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20  e', 'f'); }.  } 
110a0 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  {}.  do_test pag
110b0 65 72 31 2d 32 38 2e 24 74 6e 2e 38 20 20 7b 20  er1-28.$tn.8  { 
110c0 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
110d0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a  .db-journal } 1.
110e0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
110f0 2d 32 38 2e 24 74 6e 2e 39 20 20 7b 20 73 71 6c  -28.$tn.9  { sql
11100 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  1 { PRAGMA journ
11110 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
11120 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f   } } delete.  do
11130 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11140 24 74 6e 2e 31 30 20 7b 20 66 69 6c 65 20 65 78  $tn.10 { file ex
11150 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
11160 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74  rnal } 1..  do_t
11170 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
11180 6e 2e 31 31 20 7b 20 73 71 6c 32 20 43 4f 4d 4d  n.11 { sql2 COMM
11190 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  IT } {}.  do_tes
111a0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
111b0 31 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  12 { file exists
111c0 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
111d0 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20   } 0..  do_test 
111e0 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 33  pager1-28-$tn.13
111f0 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b 20 73   {.    code1 { s
11200 65 74 20 63 68 61 6e 6e 65 6c 20 5b 64 62 20 69  et channel [db i
11210 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c  ncrblob -readonl
11220 79 20 74 31 20 61 20 32 5d 20 7d 0a 20 20 20 20  y t1 a 2] }.    
11230 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50 52 41  sql1 {.      PRA
11240 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
11250 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
11260 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11270 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68 27   VALUES('g', 'h'
11280 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65  );.    }.  } {pe
11290 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74  rsist}.  do_test
112a0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
112b0 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  4 { file exists 
112c0 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
112d0 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } 1.  do_test pa
112e0 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 35 20 7b  ger1-28.$tn.15 {
112f0 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49  .    sql2 { BEGI
11300 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  N; INSERT INTO t
11310 31 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66  1 VALUES('e', 'f
11320 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64  '); }.  } {}.  d
11330 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11340 2e 24 74 6e 2e 31 36 20 7b 20 73 71 6c 31 20 7b  .$tn.16 { sql1 {
11350 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
11360 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20  mode = DELETE } 
11370 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65  } delete.  do_te
11380 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11390 2e 31 37 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .17 { file exist
113a0 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
113b0 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 1..  do_test
113c0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
113d0 37 20 7b 20 63 73 71 6c 32 20 7b 20 43 4f 4d 4d  7 { csql2 { COMM
113e0 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  IT } } {1 {datab
113f0 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
11400 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11410 2d 32 38 2d 24 74 6e 2e 31 38 20 7b 20 63 6f 64  -28-$tn.18 { cod
11420 65 31 20 7b 20 72 65 61 64 20 24 63 68 61 6e 6e  e1 { read $chann
11430 65 6c 20 7d 20 7d 20 63 0a 20 20 64 6f 5f 74 65  el } } c.  do_te
11440 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e  st pager1-28-$tn
11450 2e 31 39 20 7b 20 63 6f 64 65 31 20 7b 20 63 6c  .19 { code1 { cl
11460 6f 73 65 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d  ose $channel } }
11470 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
11480 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 30 20 7b  ger1-28.$tn.20 {
11490 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql2 { COMMIT }
114a0 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74   } {}.}..do_test
114b0 20 70 61 67 65 72 31 2d 32 39 2e 31 20 7b 0a 20   pager1-29.1 {. 
114c0 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
114d0 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
114e0 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
114f0 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
11500 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  024;.    PRAGMA 
11510 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 66 75  auto_vacuum = fu
11520 6c 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c  ll;.    PRAGMA l
11530 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
11540 75 73 69 76 65 3b 0a 20 20 20 20 43 52 45 41 54  usive;.    CREAT
11550 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
11560 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11570 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
11580 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  );.  }.  file si
11590 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78  ze test.db.} [ex
115a0 70 72 20 31 30 32 34 2a 33 5d 0a 64 6f 5f 74 65  pr 1024*3].do_te
115b0 73 74 20 70 61 67 65 72 31 2d 32 39 2e 32 20 7b  st pager1-29.2 {
115c0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
115d0 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
115e0 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 56 41  e = 4096;.    VA
115f0 43 55 55 4d 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  CUUM;.  }.  file
11600 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
11610 5b 65 78 70 72 20 34 30 39 36 2a 33 5d 0a 0a 23  [expr 4096*3]..#
11620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11660 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
11670 20 74 68 61 74 20 69 66 20 61 6e 20 65 6d 70 74   that if an empt
11680 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
11690 28 73 69 7a 65 20 30 20 62 79 74 65 73 29 20 69  (size 0 bytes) i
116a0 73 20 6f 70 65 6e 65 64 20 69 6e 20 0a 23 20 65  s opened in .# e
116b0 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
116c0 20 6d 6f 64 65 2c 20 61 6e 79 20 6a 6f 75 72 6e   mode, any journ
116d0 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  al file is delet
116e0 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
116f0 2d 73 79 73 74 65 6d 0a 23 20 77 69 74 68 6f 75  -system.# withou
11700 74 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  t being rolled b
11710 61 63 6b 2e 20 41 6e 64 20 74 68 61 74 20 74 68  ack. And that th
11720 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
11730 6f 62 74 61 69 6e 65 64 20 77 68 69 6c 65 0a 23  obtained while.#
11740 20 64 6f 69 6e 67 20 74 68 69 73 20 69 73 20 6e   doing this is n
11750 6f 74 20 72 65 6c 65 61 73 65 64 2e 0a 23 0a 64  ot released..#.d
11760 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 30  o_test pager1-30
11770 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .1 {.  db close.
11780 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65    delete_file te
11790 73 74 2e 64 62 0a 20 20 64 65 6c 65 74 65 5f 66  st.db.  delete_f
117a0 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ile test.db-jour
117b0 6e 61 6c 0a 20 20 73 65 74 20 66 64 20 5b 6f 70  nal.  set fd [op
117c0 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  en test.db-journ
117d0 61 6c 20 77 5d 0a 20 20 73 65 65 6b 20 24 66 64  al w].  seek $fd
117e0 20 5b 65 78 70 72 20 35 31 32 2b 31 30 33 32 2a   [expr 512+1032*
117f0 32 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77  2].  puts -nonew
11800 6c 69 6e 65 20 24 66 64 20 78 0a 20 20 63 6c 6f  line $fd x.  clo
11810 73 65 20 24 66 64 0a 0a 20 20 73 71 6c 69 74 65  se $fd..  sqlite
11820 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
11830 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
11840 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
11850 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  =EXCLUSIVE;.    
11860 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
11870 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
11880 65 72 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c  er;.    PRAGMA l
11890 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a  ock_status;.  }.
118a0 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 30 20 6d  } {exclusive 0 m
118b0 61 69 6e 20 72 65 73 65 72 76 65 64 20 74 65 6d  ain reserved tem
118c0 70 20 63 6c 6f 73 65 64 7d 0a 0a 23 2d 2d 2d 2d  p closed}..#----
118d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11910 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
11920 74 20 69 66 20 74 68 65 20 22 70 61 67 65 2d 73  t if the "page-s
11930 69 7a 65 22 20 66 69 65 6c 64 20 69 6e 20 61 20  ize" field in a 
11940 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
11950 73 20 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s 0, the journal
11960 0a 23 20 66 69 6c 65 20 63 61 6e 20 73 74 69 6c  .# file can stil
11970 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
11980 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
11990 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64 20  ed for backward 
119a0 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 0a  compatibility -.
119b0 23 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  # versions of SQ
119c0 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e  Lite prior to 3.
119d0 35 2e 38 20 61 6c 77 61 79 73 20 73 65 74 20 74  5.8 always set t
119e0 68 69 73 20 66 69 65 6c 64 20 74 6f 20 7a 65 72  his field to zer
119f0 6f 2e 0a 23 0a 69 66 20 7b 24 74 63 6c 5f 70 6c  o..#.if {$tcl_pl
11a00 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29  atform(platform)
11a10 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 64 6f 5f 74  =="unix"} {.do_t
11a20 65 73 74 20 70 61 67 65 72 31 2d 33 31 2e 31 20  est pager1-31.1 
11a30 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
11a40 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
11a50 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
11a60 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
11a70 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d   = 10;.    PRAGM
11a80 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
11a90 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  24;.    CREATE T
11aa0 41 42 4c 45 20 74 31 28 78 2c 20 79 2c 20 55 4e  ABLE t1(x, y, UN
11ab0 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
11ac0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11ad0 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
11ae0 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11af0 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20  lob(1500));.    
11b00 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
11b10 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
11b20 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
11b30 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
11b40 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11b50 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
11b60 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
11b70 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
11b80 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
11b90 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
11ba0 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
11bb0 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
11bc0 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
11bd0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11be0 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
11bf0 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
11c00 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
11c10 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
11c20 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
11c30 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
11c40 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
11c50 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
11c60 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
11c70 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
11c80 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
11c90 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
11ca0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11cb0 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
11cc0 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
11cd0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
11ce0 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
11cf0 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
11d00 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
11d10 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
11d20 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
11d30 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
11d40 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
11d50 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
11d60 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
11d70 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11d80 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
11d90 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
11da0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
11db0 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 47 49  ROM t1;.    BEGI
11dc0 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
11dd0 74 31 20 53 45 54 20 79 20 3d 20 72 61 6e 64 6f  t1 SET y = rando
11de0 6d 62 6c 6f 62 28 31 34 39 39 29 3b 0a 20 20 7d  mblob(1499);.  }
11df0 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73  .  copy_file tes
11e00 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20  t.db test.db2.  
11e10 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64  copy_file test.d
11e20 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64  b-journal test.d
11e30 62 32 2d 6a 6f 75 72 6e 61 6c 0a 20 20 0a 20 20  b2-journal.  .  
11e40 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
11e50 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 32 34 20  .db2-journal 24 
11e60 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74  00000000.  sqlit
11e70 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
11e80 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
11e90 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
11ea0 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a  ck } db2.} {ok}.
11eb0 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
11ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
11f00 54 65 73 74 20 74 68 61 74 20 61 20 64 61 74 61  Test that a data
11f10 62 61 73 65 20 66 69 6c 65 20 63 61 6e 20 62 65  base file can be
11f20 20 22 70 72 65 2d 68 69 6e 74 65 64 22 20 74 6f   "pre-hinted" to
11f30 20 61 20 63 65 72 74 61 69 6e 20 73 69 7a 65 20   a certain size 
11f40 61 6e 64 20 74 68 61 74 0a 23 20 73 75 62 73 65  and that.# subse
11f50 71 75 65 6e 74 20 73 70 69 6c 6c 69 6e 67 20 6f  quent spilling o
11f60 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
11f70 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 75 6c  e does not resul
11f80 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
11f90 65 0a 23 20 66 69 6c 65 20 62 65 69 6e 67 20 73  e.# file being s
11fa0 68 72 75 6e 6b 2e 0a 23 0a 63 61 74 63 68 20 7b  hrunk..#.catch {
11fb0 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72 63 65 64  db close}.forced
11fc0 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 0a 64  elete test.db..d
11fd0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 32  o_test pager1-32
11fe0 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .1 {.  sqlite3 d
11ff0 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
12000 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
12010 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b   TABLE t1(x, y);
12020 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
12030 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
12040 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
12050 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
12060 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
12070 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62  ALUES(1, randomb
12080 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 7d  lob(10000));.  }
12090 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  .  file_control_
120a0 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 64  chunksize_test d
120b0 62 20 6d 61 69 6e 20 31 30 32 34 0a 20 20 66 69  b main 1024.  fi
120c0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68  le_control_sizeh
120d0 69 6e 74 5f 74 65 73 74 20 64 62 20 6d 61 69 6e  int_test db main
120e0 20 32 30 39 37 31 35 32 30 3b 20 23 20 32 30 4d   20971520; # 20M
120f0 42 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  B.  execsql {.  
12100 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
12110 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 49 4e  ize = 10;.    IN
12120 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
12130 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(1, randomblo
12140 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20 20 49  b(10000));.    I
12150 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
12160 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(2, randombl
12170 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20 20  ob(10000));.    
12180 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12190 45 4c 45 43 54 20 78 2b 32 2c 20 72 61 6e 64 6f  ELECT x+2, rando
121a0 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f  mblob(10000) fro
121b0 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  m t1;.    INSERT
121c0 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
121d0 78 2b 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  x+4, randomblob(
121e0 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a  10000) from t1;.
121f0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12200 74 31 20 53 45 4c 45 43 54 20 78 2b 38 2c 20 72  t1 SELECT x+8, r
12210 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29  andomblob(10000)
12220 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e   from t1;.    IN
12230 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
12240 45 43 54 20 78 2b 31 36 2c 20 72 61 6e 64 6f 6d  ECT x+16, random
12250 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d  blob(10000) from
12260 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   t1;.    SELECT 
12270 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
12280 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
12290 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66  }.  db close.  f
122a0 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
122b0 0a 7d 20 7b 32 30 39 37 31 35 32 30 7d 0a 0a 23  .} {20971520}..#
122c0 20 43 6c 65 61 6e 75 70 20 32 30 4d 42 20 66 69   Cleanup 20MB fi
122d0 6c 65 20 6c 65 66 74 20 62 79 20 74 68 65 20 70  le left by the p
122e0 72 65 76 69 6f 75 73 20 74 65 73 74 2e 0a 66 6f  revious test..fo
122f0 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
12300 62 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     b..finish_test.