/ Hex Artifact Content
Login

Artifact 30058ab9a507bee4ea95a6279e3fa1fac6758679:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e 6f 74 20  n.tcl..# Do not 
0210: 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 20  use a codec for 
0220: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0230: 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 62  le, as the datab
0240: 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d 61  ase file is.# ma
0250: 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 74  nipulated direct
0260: 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 72  ly using tcl scr
0270: 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 20  ipts (using the 
0280: 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 6f  [hexio_write] co
0290: 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f 74  mmand)..#.do_not
02a0: 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 20  _use_codec..#.# 
02b0: 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 74  pager1-1.*: Test
02c0: 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 6c   inter-process l
02d0: 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 20  ocking (clients 
02e0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
02f0: 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 65  esses)..#.# page
0300: 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e 74  r1-2.*: Test int
0310: 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b 69  ra-process locki
0320: 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c 69  ng (multiple cli
0330: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ents in this pro
0340: 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 72  cess)..#.# pager
0350: 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e 74  1-3.*: Savepoint
0360: 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a   related tests..
0370: 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a 20  #.# pager1-4.*: 
0380: 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c 61  Hot-journal rela
0390: 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 70  ted tests..#.# p
03a0: 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 73  ager1-5.*: Cases
03b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c 74   related to mult
03c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
03d0: 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a 20  #.# pager1-6.*: 
03e0: 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f  Cases related to
03f0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
0400: 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 67  e_count".#.# pag
0410: 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 73  er1-7.*: Cases s
0420: 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47  pecific to "PRAG
0430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0440: 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 61  TRUNCATE".#.# pa
0450: 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 20  ger1-8.*: Cases 
0460: 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  using temporary 
0470: 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
0480: 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  tabases..#.# pag
0490: 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 72  er1-9.*: Tests r
04a0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  elated to the ba
04b0: 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 61  ckup API..#.# pa
04c0: 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 20  ger1-10.*: Test 
04d0: 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 64  that the assumed
04e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
04f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d 69  tor-size is limi
0500: 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ted to.#        
0510: 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 20        64KB..#.# 
0520: 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 73  pager1-12.*: Tes
0530: 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 52  ts involving "PR
0540: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
0550: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a 3a  #.# pager1-13.*:
0560: 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 20   Cases specific 
0570: 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  to "PRAGMA journ
0580: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
0590: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e 2a  .#.# pager1-14.*
05a0: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
05b0: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
05c0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 0a  nal_mode=OFF".#.
05d0: 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 56  # pager1-15.*: V
05e0: 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76  arying sqlite3_v
05f0: 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 20  fs.szOsFile.#.# 
0600: 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 72  pager1-16.*: Var
0610: 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ying sqlite3_vfs
0620: 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 20  .mxPathname.#.# 
0630: 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 73  pager1-17.*: Tes
0640: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 50  ts related to "P
0650: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
0660: 6f 63 6b 22 0a 23 0a 23 20 70 61 67 65 72 31 2d  ock".#.# pager1-
0670: 31 38 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  18.*: Test that 
0680: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
0690: 72 65 73 70 6f 6e 64 73 20 63 6f 72 72 65 63 74  responds correct
06a0: 6c 79 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ly if the b-tree
06b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
06c0: 72 65 71 75 65 73 74 73 20 61 6e 20 69 6e 76 61  requests an inva
06d0: 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
06e0: 28 64 75 65 20 74 6f 20 64 62 20 63 6f 72 72 75  (due to db corru
06f0: 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72 6f 63 20  ption)..#..proc 
0700: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
0710: 20 7b 69 64 20 74 61 62 6c 65 20 7b 73 63 72 69   {id table {scri
0720: 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73 65 74 20  pt {}}} {.  set 
0730: 63 6e 74 20 30 0a 20 20 64 62 20 65 76 61 6c 20  cnt 0.  db eval 
0740: 22 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  "SELECT rowid, *
0750: 20 46 52 4f 4d 20 24 74 61 62 6c 65 20 57 48 45   FROM $table WHE
0760: 52 45 20 72 6f 77 69 64 20 3d 20 28 24 69 64 2d  RE rowid = ($id-
0770: 31 29 22 20 7b 0a 20 20 20 20 72 65 63 75 72 73  1)" {.    recurs
0780: 69 76 65 5f 73 65 6c 65 63 74 20 24 72 6f 77 69  ive_select $rowi
0790: 64 20 24 74 61 62 6c 65 20 24 73 63 72 69 70 74  d $table $script
07a0: 0a 20 20 20 20 69 6e 63 72 20 63 6e 74 0a 20 20  .    incr cnt.  
07b0: 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d 3d 30 7d  }.  if {$cnt==0}
07c0: 20 7b 20 65 76 61 6c 20 24 73 63 72 69 70 74 20   { eval $script 
07d0: 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74 72 69 6e  }.}..set a_strin
07e0: 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70 72 6f 63  g_counter 1.proc
07f0: 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d 20 7b 0a   a_string {n} {.
0800: 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74 72 69 6e    global a_strin
0810: 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69 6e 63 72  g_counter.  incr
0820: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
0830: 72 0a 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65  r.  string range
0840: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
0850: 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  "${a_string_coun
0860: 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20 24 6e 0a  ter}." $n] 1 $n.
0870: 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  }.db func a_stri
0880: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 64 6f 5f  ng a_string..do_
0890: 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
08a0: 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72 65 61 74   tn {..  # Creat
08b0: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
08c0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
08d0: 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  using connection
08e0: 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 0a 20 20   [db]. Check .  
08f0: 23 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  # that connectio
0900: 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62  ns [db2] and [db
0910: 33 5d 20 63 61 6e 20 73 65 65 20 74 68 65 20 73  3] can see the s
0920: 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65 6e  chema and conten
0930: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0940: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 20 7b 0a   pager1-$tn.1 {.
0950: 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20      sql1 {.     
0960: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0970: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
0980: 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  b);.      CREATE
0990: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
09a0: 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
09b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
09c0: 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e 53 45 52  1, 'one'); INSER
09d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
09e0: 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20  (2, 'two');.    
09f0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0a00: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 20  st pager1-$tn.2 
0a10: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0a20: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0a30: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0a40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a50: 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  .3 { sql3 { SELE
0a60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a70: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 0a   {1 one 2 two}..
0a80: 20 20 23 20 4f 70 65 6e 20 61 20 74 72 61 6e 73    # Open a trans
0a90: 61 63 74 69 6f 6e 20 61 6e 64 20 61 64 64 20 61  action and add a
0aa0: 20 72 6f 77 20 75 73 69 6e 67 20 5b 64 62 5d 2e   row using [db].
0ab0: 20 54 68 69 73 20 70 75 74 73 20 5b 64 62 5d 20   This puts [db] 
0ac0: 69 6e 0a 20 20 23 20 52 45 53 45 52 56 45 44 20  in.  # RESERVED 
0ad0: 73 74 61 74 65 2e 20 43 68 65 63 6b 20 74 68 61  state. Check tha
0ae0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64  t connections [d
0af0: 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 20 63 61  b2] and [db3] ca
0b00: 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72 65 61 64  n still.  # read
0b10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
0b20: 6e 74 65 6e 74 20 61 73 20 69 74 20 77 61 73 20  ntent as it was 
0b30: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
0b40: 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 23 20 6f  action was.  # o
0b50: 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73 68 6f 75  pened. [db] shou
0b60: 6c 64 20 73 65 65 20 74 68 65 20 69 6e 73 65 72  ld see the inser
0b70: 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a 20 20 64  ted row..  #.  d
0b80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
0b90: 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b  n.4 {.    sql1 {
0ba0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
0bb0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0bc0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27  O t1 VALUES(3, '
0bd0: 74 68 72 65 65 27 29 3b 0a 20 20 20 20 7d 0a 20  three');.    }. 
0be0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0bf0: 70 61 67 65 72 31 2d 24 74 6e 2e 35 20 7b 20 73  pager1-$tn.5 { s
0c00: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
0c10: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
0c20: 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f 5f 74 65  e 2 two}.  do_te
0c30: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 37 20  st pager1-$tn.7 
0c40: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
0c50: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c60: 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72   one 2 two 3 thr
0c70: 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 73 74  ee}..  # [db] st
0c80: 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ill has an open 
0c90: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
0ca0: 6e 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  n. Check that th
0cb0: 69 73 20 70 72 65 76 65 6e 74 73 0a 20 20 23 20  is prevents.  # 
0cc0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
0cd0: 73 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 20  s (specifically 
0ce0: 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77 72 69 74  [db2]) from writ
0cf0: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
0d00: 61 73 65 2e 0a 20 20 23 0a 20 20 23 20 45 76 65  ase..  #.  # Eve
0d10: 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70 65 6e 73  n if [db2] opens
0d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
0d30: 69 72 73 74 2c 20 69 74 20 6d 61 79 20 6e 6f 74  irst, it may not
0d40: 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20   write to the.  
0d50: 23 20 64 61 74 61 62 61 73 65 2e 20 41 66 74 65  # database. Afte
0d60: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
0d70: 20 77 72 69 74 65 20 74 68 65 20 64 62 20 77 69   write the db wi
0d80: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
0d90: 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32 5d 20 69  on, .  # [db2] i
0da0: 73 20 6c 65 66 74 20 77 69 74 68 20 61 6e 20 6f  s left with an o
0db0: 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
0dc0: 20 62 75 74 20 6e 6f 74 20 61 20 72 65 61 64 2d   but not a read-
0dd0: 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74 68 65 20  lock on.  # the 
0de0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 53  main database. S
0df0: 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 70 72  o it does not pr
0e00: 65 76 65 6e 74 20 5b 64 62 5d 20 66 72 6f 6d 20  event [db] from 
0e10: 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20 20 23 0a  committing..  #.
0e20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0e30: 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20 20 63 73  -$tn.8 { .    cs
0e40: 71 6c 32 20 7b 20 55 50 44 41 54 45 20 74 31 20  ql2 { UPDATE t1 
0e50: 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d  SET a = a + 10 }
0e60: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
0e70: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
0e80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0e90: 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63 73 71 6c  tn.9 { .    csql
0ea0: 32 20 7b 20 0a 20 20 20 20 20 20 42 45 47 49 4e  2 { .      BEGIN
0eb0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
0ec0: 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30  1 SET a = a + 10
0ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  ;.    }.  } {1 {
0ee0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
0ef0: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
0f00: 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20 74  db] commit its t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 43 68 65  ransactions. Che
0f20: 63 6b 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6e  ck the other con
0f30: 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a 20 20 23  nections can.  #
0f40: 20 6e 6f 77 20 73 65 65 20 74 68 65 20 6e 65 77   now see the new
0f50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
0f60: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
0f70: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 30 20 7b   pager1-$tn.10 {
0f80: 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql1 { COMMIT }
0f90: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
0fa0: 70 61 67 65 72 31 2d 24 74 6e 2e 31 31 20 7b 20  pager1-$tn.11 { 
0fb0: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql1 { SELECT * 
0fc0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
0fd0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
0fe0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
0ff0: 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73 71 6c 32  r1-$tn.12 { sql2
1000: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1010: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1020: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20   two 3 three}.  
1030: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1040: 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20 7b 20 53  tn.13 { sql3 { S
1050: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1060: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
1070: 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 43   3 three}..  # C
1080: 68 65 63 6b 20 74 68 61 74 2c 20 61 73 20 6e 6f  heck that, as no
1090: 74 65 64 20 61 62 6f 76 65 2c 20 5b 64 62 32 5d  ted above, [db2]
10a0: 20 72 65 61 6c 6c 79 20 64 69 64 20 6b 65 65 70   really did keep
10b0: 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   an open transac
10c0: 74 69 6f 6e 0a 20 20 23 20 61 66 74 65 72 20 74  tion.  # after t
10d0: 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
10e0: 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
10f0: 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a 20 20 64   failed..  #.  d
1100: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1110: 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.14 { .    csql
1120: 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a 20 20 7d  2 { BEGIN } .  }
1130: 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61 72   {1 {cannot star
1140: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1150: 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1160: 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  tion}}.  do_test
1170: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b   pager1-$tn.15 {
1180: 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42 41 43 4b   sql2 { ROLLBACK
1190: 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61 76   } } {}..  # Hav
11a0: 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 74  e [db2] open a t
11b0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74  ransaction and t
11c0: 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ake a read-lock 
11d0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
11e0: 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20  .  # Check that 
11f0: 74 68 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64  this prevents [d
1200: 62 5d 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  b] from writing 
1210: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1220: 28 6f 75 74 73 69 64 65 0a 20 20 23 20 6f 66 20  (outside.  # of 
1230: 61 6e 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  any transaction)
1240: 2e 20 41 66 74 65 72 20 74 68 69 73 20 66 61 69  . After this fai
1250: 6c 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 5b  ls, check that [
1260: 64 62 33 5d 20 63 61 6e 20 72 65 61 64 0a 20 20  db3] can read.  
1270: 23 20 74 68 65 20 64 62 20 28 73 68 6f 77 69 6e  # the db (showin
1280: 67 20 74 68 61 74 20 5b 64 62 5d 20 64 69 64 20  g that [db] did 
1290: 6e 6f 74 20 74 61 6b 65 20 61 20 50 45 4e 44 49  not take a PENDI
12a0: 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29 0a 20 20  NG lock etc.).  
12b0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  #.  do_test page
12c0: 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a 20 20 20  r1-$tn.15 { .   
12d0: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53   sql2 { BEGIN; S
12e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
12f0: 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32 20   }.  } {1 one 2 
1300: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64  two 3 three}.  d
1310: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1320: 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63 73 71 6c  n.16 { .    csql
1330: 31 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  1 { UPDATE t1 SE
1340: 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d 0a 20  T a = a + 10 }. 
1350: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
1360: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
1370: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1380: 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c  .17 { sql3 { SEL
1390: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
13a0: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
13b0: 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 54 68 69   three}..  # Thi
13c0: 73 20 74 69 6d 65 2c 20 68 61 76 65 20 5b 64 62  s time, have [db
13d0: 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63  ] open a transac
13e0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 77 72 69 74  tion before writ
13f0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1400: 2e 0a 20 20 23 20 54 68 69 73 20 77 6f 72 6b 73  ..  # This works
1410: 20 2d 20 5b 64 62 5d 20 67 65 74 73 20 61 20 52   - [db] gets a R
1420: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 69  ESERVED lock whi
1430: 63 68 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 66  ch does not conf
1440: 6c 69 63 74 20 77 69 74 68 0a 20 20 23 20 74 68  lict with.  # th
1450: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 5b 64  e SHARED lock [d
1460: 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e 67 2e 0a  b2] is holding..
1470: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61    #.  do_test pa
1480: 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b 20 0a 20  ger1-$tn.18 { . 
1490: 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20     sql1 { .     
14a0: 20 42 45 47 49 4e 3b 20 20 0a 20 20 20 20 20 20   BEGIN;  .      
14b0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
14c0: 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20 20 20 7d  = a + 10; .    }
14d0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
14e0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2d 31 39 20  t pager1-$tn-19 
14f0: 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 50 52  { .    sql1 { PR
1500: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
1510: 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 72 65   } .  } {main re
1520: 73 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73  served temp clos
1530: 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ed}.  do_test pa
1540: 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b 20 0a 20  ger1-$tn-20 { . 
1550: 20 20 20 73 71 6c 32 20 7b 20 50 52 41 47 4d 41     sql2 { PRAGMA
1560: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20 0a   lock_status } .
1570: 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61 72 65 64    } {main shared
1580: 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 20   temp closed}.. 
1590: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c   # Check that al
15a0: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  l connections ca
15b0: 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74 68 65  n still read the
15c0: 20 64 61 74 61 62 61 73 65 2e 20 4f 6e 6c 79 20   database. Only 
15d0: 5b 64 62 5d 20 73 65 65 73 0a 20 20 23 20 74 68  [db] sees.  # th
15e0: 65 20 75 70 64 61 74 65 64 20 63 6f 6e 74 65 6e  e updated conten
15f0: 74 20 28 61 73 20 74 68 65 20 74 72 61 6e 73 61  t (as the transa
1600: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  ction has not be
1610: 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 79 65 74  en committed yet
1620: 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  )..  #.  do_test
1630: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 31 20 7b   pager1-$tn.21 {
1640: 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a   sql1 { SELECT *
1650: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 31   FROM t1 } } {11
1660: 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33 20 74   one 12 two 13 t
1670: 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  hree}.  do_test 
1680: 70 61 67 65 72 31 2d 24 74 6e 2e 32 32 20 7b 20  pager1-$tn.22 { 
1690: 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
16a0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
16b0: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
16c0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
16d0: 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73 71 6c 33  r1-$tn.23 { sql3
16e0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
16f0: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
1700: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20   two 3 three}.. 
1710: 20 23 20 42 65 63 61 75 73 65 20 5b 64 62 32 5d   # Because [db2]
1720: 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 53   still has the S
1730: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b 64 62 5d  HARED lock, [db]
1740: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   is unable to co
1750: 6d 6d 69 74 20 74 68 65 0a 20 20 23 20 74 72 61  mmit the.  # tra
1760: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
1770: 74 72 69 65 73 2c 20 61 6e 20 65 72 72 6f 72 20  tries, an error 
1780: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1790: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  the connection .
17a0: 20 20 23 20 75 70 67 72 61 64 65 73 20 74 6f 20    # upgrades to 
17b0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
17c0: 20 20 23 0a 20 20 23 20 4f 6e 63 65 20 74 68 69    #.  # Once thi
17d0: 73 20 68 61 70 70 65 6e 73 2c 20 5b 64 62 5d 20  s happens, [db] 
17e0: 63 61 6e 20 72 65 61 64 20 74 68 65 20 64 61 74  can read the dat
17f0: 61 62 61 73 65 20 61 6e 64 20 73 65 65 20 74 68  abase and see th
1800: 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2c 0a 20  e new content,. 
1810: 20 23 20 5b 64 62 32 5d 20 28 73 74 69 6c 6c 20   # [db2] (still 
1820: 68 6f 6c 64 69 6e 67 20 53 48 41 52 45 44 29 20  holding SHARED) 
1830: 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74  can still read t
1840: 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 2c 20  he old content, 
1850: 62 75 74 20 5b 64 62 33 5d 0a 20 20 23 20 28 6e  but [db3].  # (n
1860: 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c  ot holding any l
1870: 6f 63 6b 29 20 69 73 20 70 72 65 76 65 6e 74 65  ock) is prevente
1880: 64 20 62 79 20 5b 64 62 5d 27 73 20 50 45 4e 44  d by [db]'s PEND
1890: 49 4e 47 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ING from reading
18a0: 0a 20 20 23 20 74 68 65 20 64 61 74 61 62 61 73  .  # the databas
18b0: 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  e..  #.  do_test
18c0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 34 20 7b   pager1-$tn.24 {
18d0: 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20   csql1 { COMMIT 
18e0: 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  } } {1 {database
18f0: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
1900: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1910: 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73 71 6c 31  n-25 { .    sql1
1920: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73   { PRAGMA lock_s
1930: 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61  tatus } .  } {ma
1940: 69 6e 20 70 65 6e 64 69 6e 67 20 74 65 6d 70 20  in pending temp 
1950: 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73  closed}.  do_tes
1960: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 36 20  t pager1-$tn.26 
1970: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
1980: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
1990: 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33  11 one 12 two 13
19a0: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
19b0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37 20  t pager1-$tn.27 
19c0: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
19d0: 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b  * FROM t1  } } {
19e0: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
19f0: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1a00: 61 67 65 72 31 2d 24 74 6e 2e 32 38 20 7b 20 63  ager1-$tn.28 { c
1a10: 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql3 { SELECT * 
1a20: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b  FROM t1 } } {1 {
1a30: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
1a40: 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  ed}}..  # Have [
1a50: 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20  db2] commit its 
1a60: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1a70: 2c 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  , releasing the 
1a80: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 74 0a 20  SHARED lock it. 
1a90: 20 23 20 69 73 20 68 6f 6c 64 69 6e 67 2e 20 4e   # is holding. N
1aa0: 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b 64 62 32  ow, neither [db2
1ab0: 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d 61 79 20  ] nor [db3] may 
1ac0: 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1ad0: 65 20 28 61 73 20 5b 64 62 5d 0a 20 20 23 20 69  e (as [db].  # i
1ae0: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
1af0: 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20 20 23 0a  a PENDING)..  #.
1b00: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1b10: 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c 32 20 7b  -$tn.29 { sql2 {
1b20: 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20   COMMIT } } {}. 
1b30: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b40: 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c 32 20 7b  $tn.30 { csql2 {
1b50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1b60: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1b70: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
1b80: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1b90: 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c 33 20 7b  $tn.31 { csql3 {
1ba0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1bb0: 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 } } {1 {databa
1bc0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a  se is locked}}..
1bd0: 20 20 23 20 5b 64 62 5d 20 69 73 20 6e 6f 77 20    # [db] is now 
1be0: 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20 74  able to commit t
1bf0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
1c00: 4f 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61 63  Once the transac
1c10: 74 69 6f 6e 20 69 73 20 0a 20 20 23 20 63 6f 6d  tion is .  # com
1c20: 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74 68 72 65  mitted, all thre
1c30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  e connections ca
1c40: 6e 20 72 65 61 64 20 74 68 65 20 6e 65 77 20 63  n read the new c
1c50: 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f  ontent..  #.  do
1c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1c70: 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20 55 50 44  .25 { sql1 { UPD
1c80: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61  ATE t1 SET a = a
1c90: 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f  +10 } } {}.  do_
1ca0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1cb0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d  26 { sql1 { COMM
1cc0: 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  IT } } {}.  do_t
1cd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1ce0: 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  7 { sql1 { SELEC
1cf0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
1d00: 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32  {21 one 22 two 2
1d10: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
1d20: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37  st pager1-$tn.27
1d30: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1d40: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1d50: 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33  21 one 22 two 23
1d60: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1d70: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1d80: 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20  { sql3 { SELECT 
1d90: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 32  * FROM t1 } } {2
1da0: 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20  1 one 22 two 23 
1db0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 49 6e 73 74  three}..  # Inst
1dc0: 61 6c 6c 20 61 20 62 75 73 79 2d 68 61 6e 64 6c  all a busy-handl
1dd0: 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  er for connectio
1de0: 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20 20 73 65  n [db]..  #.  se
1df0: 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69 73 74 5d  t ::nbusy [list]
1e00: 0a 20 20 70 72 6f 63 20 62 75 73 79 20 7b 6e 7d  .  proc busy {n}
1e10: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a   {.    lappend :
1e20: 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20 20 69 66  :nbusy $n.    if
1e30: 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c 32 20 43   {$n>5} { sql2 C
1e40: 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72 65 74 75  OMMIT }.    retu
1e50: 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62 20 62 75  rn 0.  }.  db bu
1e60: 73 79 20 62 75 73 79 0a 0a 20 20 64 6f 5f 74 65  sy busy..  do_te
1e70: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 39  st pager1-$tn.29
1e80: 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 42   { .    sql1 { B
1e90: 45 47 49 4e 20 3b 20 49 4e 53 45 52 54 20 49 4e  EGIN ; INSERT IN
1ea0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 27  TO t1 VALUES('x'
1eb0: 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d 20 7b 7d  , 'y') } .  } {}
1ec0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1ed0: 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20 20 20 20  1-$tn.30 { .    
1ee0: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20 53  sql2 { BEGIN ; S
1ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1f00: 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e 65 20 32  } .  } {21 one 2
1f10: 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a  2 two 23 three}.
1f20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1f30: 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c 31 20 43  -$tn.31 { sql1 C
1f40: 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f  OMMIT } {}.  do_
1f50: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1f60: 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62 75 73 79  32 { set ::nbusy
1f70: 20 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35 20   } {0 1 2 3 4 5 
1f80: 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  6}.}..#---------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 0a 23 20 53 61 76 65 70 6f 69 6e 74 20 72 65 6c  .# Savepoint rel
1fe0: 61 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e  ated test cases.
1ff0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 33 2e 31 2e  .#.# pager1-3.1.
2000: 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20 73 61 76  2.*: Force a sav
2010: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
2020: 74 6f 20 63 61 75 73 65 20 74 68 65 20 64 61 74  to cause the dat
2030: 61 62 61 73 65 20 66 69 6c 65 0a 23 20 20 20 20  abase file.#    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20               to 
2050: 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67 65 72 31  grow..#.# pager1
2060: 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65 20 61 20  -3.1.3.*: Use a 
2070: 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
2080: 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f  in synchronous=o
2090: 66 66 20 6d 6f 64 65 20 61 73 20 70 61 72 74 0a  ff mode as part.
20a0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
20b0: 20 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74    of a savepoint
20c0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 0a 64 6f   rollback..# .do
20d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31  _test pager1-3.1
20e0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
20f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
2100: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
2110: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2120: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
2130: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
2140: 54 41 42 4c 45 20 63 6f 75 6e 74 65 72 28 0a 20  TABLE counter(. 
2150: 20 20 20 20 20 69 20 43 48 45 43 4b 20 28 69 3c       i CHECK (i<
2160: 35 29 2c 20 0a 20 20 20 20 20 20 75 20 43 48 45  5), .      u CHE
2170: 43 4b 20 28 75 3c 31 30 29 0a 20 20 20 20 29 3b  CK (u<10).    );
2180: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2190: 20 63 6f 75 6e 74 65 72 20 56 41 4c 55 45 53 28   counter VALUES(
21a0: 30 2c 20 30 29 3b 0a 20 20 20 20 43 52 45 41 54  0, 0);.    CREAT
21b0: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 41 46  E TRIGGER tr1 AF
21c0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
21d0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
21e0: 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20  ATE counter SET 
21f0: 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20 45 4e 44  i = i+1;.    END
2200: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
2210: 47 47 45 52 20 74 72 32 20 41 46 54 45 52 20 55  GGER tr2 AFTER U
2220: 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47 49  PDATE ON t1 BEGI
2230: 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 63  N.      UPDATE c
2240: 6f 75 6e 74 65 72 20 53 45 54 20 75 20 3d 20 75  ounter SET u = u
2250: 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  +1;.    END;.  }
2260: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
2270: 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74  ECT * FROM count
2280: 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a 0a 64 6f  er }.} {0 0}..do
2290: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
22a0: 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a 20 20 50  ger1-3.1.2 {.  P
22b0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
22c0: 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a   = 10;.  BEGIN;.
22d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
22e0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
22f0: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2300: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2310: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e  t1 VALUES(2, ran
2320: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2340: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61 6e  t1 VALUES(3, ran
2350: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
2360: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2370: 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20 7b 33 20  M counter;.} {3 
2380: 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  0}.do_catchsql_t
2390: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31 2e 33  est pager1-3.1.3
23a0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
23b0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 33  TO t1 SELECT a+3
23c0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
23d0: 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 31 20  0) FROM t1.} {1 
23e0: 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  {constraint fail
23f0: 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ed}}.do_execsql_
2400: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 34 20  test pager1-3.4 
2410: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
2420: 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20 30 7d 0a  counter } {3 0}.
2430: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2440: 70 61 67 65 72 31 2d 33 2e 35 20 7b 20 53 45 4c  pager1-3.5 { SEL
2450: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 7d 20  ECT a FROM t1 } 
2460: 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78 65 63 73  {1 2 3}.do_execs
2470: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2480: 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d  .6 { COMMIT } {}
2490: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71  ..foreach {tn sq
24a0: 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20 20 7b 20  l tcl} {.  7  { 
24b0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
24c0: 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50 52  us = NORMAL ; PR
24d0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20  AGMA temp_store 
24e0: 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74 65 73 74  = 0 } {.    test
24f0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
2500: 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72  1.    tv devchar
2510: 20 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20 7d   safe_append.  }
2520: 0a 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 73  .  8  { PRAGMA s
2530: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52  ynchronous = NOR
2540: 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20 74 65 6d  MAL ; PRAGMA tem
2550: 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d 20 7b 0a  p_store = 2 } {.
2560: 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d      testvfs tv -
2570: 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76  default 1.    tv
2580: 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e 74   devchar sequent
2590: 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20 7b 20 50  ial.  }.  9  { P
25a0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
25b0: 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20 7d 0a 20  s = FULL } { }. 
25c0: 20 31 30 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   10 { PRAGMA syn
25d0: 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41  chronous = NORMA
25e0: 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20 7b 20 50  L } { }.  11 { P
25f0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
2600: 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d 0a 20 20  s = OFF } { }.  
2610: 31 32 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63  12 { PRAGMA sync
2620: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 3b  hronous = FULL ;
2630: 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e   PRAGMA fullfsyn
2640: 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20 20 31 33  c = 1 } { }.  13
2650: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2660: 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b  onous = FULL } {
2670: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
2680: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74  -default 1.    t
2690: 76 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e  v devchar sequen
26a0: 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34 20 7b 20  tial.  }.  14 { 
26b0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
26c0: 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 20  ode = EXCLUSIVE 
26d0: 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20 20 64 6f  } {.  }.} {.  do
26e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24  _test pager1-3.$
26f0: 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76 61 6c 20  tn.1 {.    eval 
2700: 24 74 63 6c 0a 20 20 20 20 66 61 75 6c 74 73 69  $tcl.    faultsi
2710: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
2720: 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20  pen.    db func 
2730: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
2740: 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 73  g.    execsql $s
2750: 71 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  ql.    execsql {
2760: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
2770: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20  to_vacuum = 2;. 
2780: 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
2790: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
27a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
27b0: 7a 28 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d  z(x INTEGER PRIM
27c0: 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
27d0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
27e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
27f0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73  VALUES(NULL, a_s
2800: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
2810: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2820: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2830: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2840: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20 32  OM z;     --   2
2850: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2860: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2870: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2880: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
2890: 20 20 20 34 0a 20 20 20 20 20 20 20 20 49 4e 53     4.        INS
28a0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
28b0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
28c0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
28d0: 20 20 2d 2d 20 20 20 38 0a 20 20 20 20 20 20 20    --   8.       
28e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
28f0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2900: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2910: 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a 20 20 20  ;     --  16.   
2920: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2930: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
2940: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
2950: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 33 32  OM z;     --  32
2960: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2970: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2980: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2990: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
29a0: 20 20 36 34 0a 20 20 20 20 20 20 20 20 49 4e 53    64.        INS
29b0: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
29c0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
29d0: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
29e0: 20 20 2d 2d 20 31 32 38 0a 20 20 20 20 20 20 20    -- 128.       
29f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
2a00: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2a10: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2a20: 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a 20 20 20  ;     -- 256.   
2a30: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
2a40: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
2a50: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2a60: 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20 20 64 6f  m }.  } {2}.  do
2a70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
2a80: 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20 7b 0a 20  ger1-3.$tn.2 {. 
2a90: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
2aa0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56 41  INSERT INTO z VA
2ab0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72  LUES(NULL, a_str
2ac0: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20  ing(800));.     
2ad0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56   INSERT INTO z V
2ae0: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74  ALUES(NULL, a_st
2af0: 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20  ring(800));.    
2b00: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
2b10: 0a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  .        UPDATE 
2b20: 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c 4c 20 57  z SET y = NULL W
2b30: 48 45 52 45 20 78 3e 32 35 36 3b 0a 20 20 20 20  HERE x>256;.    
2b40: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65      PRAGMA incre
2b50: 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20  mental_vacuum;. 
2b60: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f         SELECT co
2b70: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 20 57 48  unt(*) FROM z WH
2b80: 45 52 45 20 78 20 3c 20 31 30 30 3b 0a 20 20 20  ERE x < 100;.   
2b90: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
2ba0: 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ne;.    COMMIT;.
2bb0: 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64 6f 5f 65    } {99}..  do_e
2bc0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
2bd0: 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  r1-3.$tn.3 {.   
2be0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41   BEGIN;.      SA
2bf0: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
2c00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2c10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2c20: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
2c30: 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  e;.    COMMIT;. 
2c40: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2c50: 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 7d 20 7b  *) FROM z;.  } {
2c60: 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73  258}..  do_execs
2c70: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2c80: 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 53 41 56  .$tn.4 {.    SAV
2c90: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
2ca0: 20 20 55 50 44 41 54 45 20 7a 20 53 45 54 20 79    UPDATE z SET y
2cb0: 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20 52 4f 4c   = y||x;.    ROL
2cc0: 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
2cd0: 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71  } {}.  do_execsq
2ce0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2cf0: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53 45 4c 45  $tn.5 {.    SELE
2d00: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2d10: 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20   z;.    RELEASE 
2d20: 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  one;.    PRAGMA 
2d30: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
2d40: 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d 0a 0a 20  .  } {258 ok}.. 
2d50: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2d60: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 36 20   pager1-3.$tn.6 
2d70: 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  {.    SAVEPOINT 
2d80: 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45 41 53 45  one;.    RELEASE
2d90: 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 0a 20 20   one;.  } {}..  
2da0: 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68  db close.  catch
2db0: 20 7b 20 74 76 20 64 65 6c 65 74 65 20 7d 0a 7d   { tv delete }.}
2dc0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 48  ------------.# H
2e10: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
2e20: 61 63 6b 20 72 65 6c 61 74 65 64 20 74 65 73 74  ack related test
2e30: 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65   cases..#.# page
2e40: 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73 74 20 74  r1.4.1.*: Test t
2e50: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f  hat the pager mo
2e60: 64 75 6c 65 20 64 65 6c 65 74 65 73 20 76 65 72  dule deletes ver
2e70: 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c 69 64 0a  y small invalid.
2e80: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
2e90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23  journal files..#
2ea0: 0a 23 20 70 61 67 65 72 31 2e 34 2e 32 2e 2a 3a  .# pager1.4.2.*:
2eb0: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
2ec0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2ed0: 20 70 6f 69 6e 74 65 72 20 61 74 20 74 68 65 20   pointer at the 
2ee0: 65 6e 64 20 6f 66 20 61 0a 23 20 20 20 20 20 20  end of a.#      
2ef0: 20 20 20 20 20 20 20 20 20 68 6f 74 2d 6a 6f 75           hot-jou
2f00: 72 6e 61 6c 20 66 69 6c 65 20 61 70 70 65 61 72  rnal file appear
2f10: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 20  s to be corrupt 
2f20: 28 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e  (checksum does n
2f30: 6f 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ot.#            
2f40: 20 20 20 63 6f 6d 70 75 74 65 29 20 74 68 65 20     compute) the 
2f50: 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e  associated journ
2f60: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
2f70: 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20 20 20 20  k (and no.#     
2f80: 20 20 20 20 20 20 20 20 20 20 78 41 63 63 65 73            xAcces
2f90: 73 28 29 20 63 61 6c 6c 20 74 6f 20 63 68 65 63  s() call to chec
2fa0: 6b 20 66 6f 72 20 74 68 65 20 70 72 65 73 65 6e  k for the presen
2fb0: 63 65 20 6f 66 20 61 6e 79 20 6d 61 73 74 65 72  ce of any master
2fc0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
2fd0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
2fe0: 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20 70 61 67  s made)..#.# pag
2ff0: 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65 73 74 20  er1.4.3.*: Test 
3000: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
3010: 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  s of a hot-journ
3020: 61 6c 20 61 72 65 20 69 67 6e 6f 72 65 64 20 69  al are ignored i
3030: 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  f the.#         
3040: 20 20 20 20 20 20 70 61 67 65 2d 73 69 7a 65 20        page-size 
3050: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
3060: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
3070: 61 64 65 72 20 61 70 70 65 61 72 20 74 6f 0a 23  ader appear to.#
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3090: 65 20 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20 6c  e invalid (too l
30a0: 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61 6c 6c 20  arge, too small 
30b0: 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65 72 20 6f  or not a power o
30c0: 66 20 32 29 2e 0a 23 0a 23 20 70 61 67 65 72 31  f 2)..#.# pager1
30d0: 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20 68 6f 74  .4.4.*: Test hot
30e0: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
30f0: 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  k of journal fil
3100: 65 20 77 69 74 68 20 61 20 6d 61 73 74 65 72 0a  e with a master.
3110: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3120: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
3130: 67 65 6e 65 72 61 74 65 64 20 69 6e 20 76 61 72  generated in var
3140: 69 6f 75 73 20 22 50 52 41 47 4d 41 20 73 79 6e  ious "PRAGMA syn
3150: 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20 20 20 20  chronous".#     
3160: 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 73 2e            modes.
3170: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 35 2e  .#.# pager1.4.5.
3180: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 68 6f 74  *: Test that hot
3190: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
31a0: 6b 20 73 74 6f 70 73 20 69 66 20 69 74 20 65 6e  k stops if it en
31b0: 63 6f 75 6e 74 65 72 73 20 61 0a 23 20 20 20 20  counters a.#    
31c0: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
31d0: 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72 20 77 68  al-record for wh
31e0: 69 63 68 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ich the checksum
31f0: 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65   fails..#.# page
3200: 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73 74 20 74  r1.4.6.*: Test t
3210: 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67  hat when rolling
3220: 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
3230: 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nal that contain
3240: 73 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  s a.#           
3250: 20 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e      master journ
3260: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20  al pointer, the 
3270: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
3280: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 0a 23  ile is deleted.#
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
32a0: 66 74 65 72 20 61 6c 6c 20 74 68 65 20 68 6f 74  fter all the hot
32b0: 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61 74 20 72  -journals that r
32c0: 65 66 65 72 20 74 6f 20 69 74 20 61 72 65 20 64  efer to it are d
32d0: 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70 61 67 65  eleted..#.# page
32e0: 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73 74 20 74  r1.4.7.*: Test t
32f0: 68 61 74 20 69 66 20 61 20 68 6f 74 2d 6a 6f 75  hat if a hot-jou
3300: 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
3310: 20 62 75 74 20 61 20 63 6c 69 65 6e 74 20 63 61   but a client ca
3320: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
3330: 20 20 6f 70 65 6e 20 69 74 20 66 6f 72 20 72 65    open it for re
3340: 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74 68 65 20  ading only, the 
3350: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
3360: 62 65 20 61 63 63 65 73 73 65 64 20 61 6e 64 0a  be accessed and.
3370: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3380: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
3390: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 20 0a  is returned..# .
33a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
33b0: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
33c0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
33d0: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  pen.  execsql { 
33e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
33f0: 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20 20 20 49  E x(y, z);.    I
3400: 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41 4c  NSERT INTO x VAL
3410: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
3420: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65   set fd [open te
3430: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d  st.db-journal w]
3440: 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69  .  puts -nonewli
3450: 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f 77 6f 72  ne $fd "hellowor
3460: 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  ld".  close $fd.
3470: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
3480: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
3490: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {1}.do_test page
34a0: 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78 65 63 73  r1.4.1.2 { execs
34b0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
34c0: 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32 7d 0a 64  OM x } } {1 2}.d
34d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
34e0: 31 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  1.3 { file exist
34f0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
3500: 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65 74 20 75  l } {0}..# Set u
3510: 70 20 61 20 5b 74 65 73 74 76 66 73 5d 20 74 6f  p a [testvfs] to
3520: 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69   snapshot the fi
3530: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
3540: 65 66 6f 72 65 20 53 51 4c 69 74 65 0a 23 20 64  efore SQLite.# d
3550: 65 6c 65 74 65 73 20 74 68 65 20 6d 61 73 74 65  eletes the maste
3560: 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 63 6f 6d  r-journal to com
3570: 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  mit a multi-file
3580: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
3590: 23 20 49 6e 20 73 75 62 73 65 71 75 65 6e 74 20  # In subsequent 
35a0: 74 65 73 74 20 63 61 73 65 73 2c 20 69 6e 76 6f  test cases, invo
35b0: 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69 6d 5f 72  king [faultsim_r
35c0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
35d0: 6e 5d 20 73 65 74 73 0a 23 20 75 70 20 74 68 65  n] sets.# up the
35e0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
35f0: 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64 61 74 61  contain two data
3600: 62 61 73 65 73 2c 20 74 77 6f 20 68 6f 74 2d 6a  bases, two hot-j
3610: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 6e 64  ournal files and
3620: 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72  .# a master-jour
3630: 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  nal..#.do_test p
3640: 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b 0a 20 20  ager1.4.2.1 {.  
3650: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3660: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3670: 66 73 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  fs filter xDelet
3680: 65 0a 20 20 74 73 74 76 66 73 20 73 63 72 69 70  e.  tstvfs scrip
3690: 74 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63  t xDeleteCallbac
36a0: 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c 65 74 65  k.  proc xDelete
36b0: 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64  Callback {method
36c0: 20 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20   file args} {.  
36d0: 20 20 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65    set file [file
36e0: 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20   tail $file].   
36f0: 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 6d 61   if { [string ma
3700: 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c 65 5d 20  tch *mj* $file] 
3710: 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  } { faultsim_sav
3720: 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  e }.  }.  faults
3730: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
3740: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
3750: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
3760: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3770: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
3780: 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50  2' AS aux;.    P
3790: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
37a0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
37b0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 63 61 63   PRAGMA main.cac
37c0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37d0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 63 61 63    PRAGMA aux.cac
37e0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
37f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3800: 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  1(a UNIQUE, b UN
3810: 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54  IQUE);.    CREAT
3820: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61  E TABLE aux.t2(a
3830: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
3840: 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  E);.    INSERT I
3850: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
3860: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
3870: 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20  tring(300));.   
3880: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3890: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38a0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38b0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
38c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
38d0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38e0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
38f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
3900: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3910: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3920: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
3930: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3940: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
3950: 67 28 32 30 31 29 2c 20 61 5f 73 74 72 69 6e 67  g(201), a_string
3960: 28 33 30 31 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (301) FROM t1;. 
3970: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3980: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
3990: 69 6e 67 28 32 30 32 29 2c 20 61 5f 73 74 72 69  ing(202), a_stri
39a0: 6e 67 28 33 30 32 29 20 46 52 4f 4d 20 74 31 3b  ng(302) FROM t1;
39b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
39c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
39d0: 74 72 69 6e 67 28 32 30 33 29 2c 20 61 5f 73 74  tring(203), a_st
39e0: 72 69 6e 67 28 33 30 33 29 20 46 52 4f 4d 20 74  ring(303) FROM t
39f0: 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  1;.      INSERT 
3a00: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
3a10: 5f 73 74 72 69 6e 67 28 32 30 34 29 2c 20 61 5f  _string(204), a_
3a20: 73 74 72 69 6e 67 28 33 30 34 29 20 46 52 4f 4d  string(304) FROM
3a30: 20 74 31 3b 0a 20 20 20 20 20 20 52 45 50 4c 41   t1;.      REPLA
3a40: 43 45 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  CE INTO t2 SELEC
3a50: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
3a60: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64   COMMIT;.  }.  d
3a70: 62 20 63 6c 6f 73 65 0a 20 20 74 73 74 76 66 73  b close.  tstvfs
3a80: 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 0a 69 66   delete.} {}..if
3a90: 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
3aa0: 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69  m(platform)!="wi
3ab0: 6e 64 6f 77 73 22 7d 20 7b 0a 64 6f 5f 74 65 73  ndows"} {.do_tes
3ac0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 32 20 7b  t pager1.4.2.2 {
3ad0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
3ae0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
3af0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3b00: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3b10: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3b20: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3b30: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d  ck;.  }.} {4 ok}
3b40: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
3b50: 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75 6c 74 73  4.2.3 {.  faults
3b60: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
3b70: 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61 63 68 20  eopen.  foreach 
3b80: 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2d  f [glob test.db-
3b90: 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65  mj*] { forcedele
3ba0: 74 65 20 24 66 20 7d 0a 20 20 65 78 65 63 73 71  te $f }.  execsq
3bb0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  l {.    SELECT c
3bc0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
3bd0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
3be0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
3bf0: 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f 5f 74 65  .} {64 ok}.do_te
3c00: 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 34 20  st pager1.4.2.4 
3c10: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
3c20: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
3c30: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
3c40: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
3c50: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
3c60: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d  est.db-journal]-
3c70: 32 30 5d 20 31 32 33 34 35 36 0a 20 20 65 78 65  20] 123456.  exe
3c80: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3c90: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3ca0: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3cb0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3cc0: 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f    }.} {4 ok}.do_
3cd0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3ce0: 35 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  5 {.  faultsim_r
3cf0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3d00: 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  n.  hexio_write 
3d10: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
3d20: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
3d30: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3d40: 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20 66  ]-20] 123456.  f
3d50: 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 74  oreach f [glob t
3d60: 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f  est.db-mj*] { fo
3d70: 72 63 65 64 65 6c 65 74 65 20 24 66 20 7d 0a 20  rcedelete $f }. 
3d80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3d90: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3da0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3db0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3dc0: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d  ck;.  }.} {4 ok}
3dd0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  .}..do_test page
3de0: 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20 74 65 73  r1.4.3.1 {.  tes
3df0: 74 76 66 73 20 74 73 74 76 66 73 20 2d 64 65 66  tvfs tstvfs -def
3e00: 61 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73 20  ault 1.  tstvfs 
3e10: 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74  filter xSync.  t
3e20: 73 74 76 66 73 20 73 63 72 69 70 74 20 78 53 79  stvfs script xSy
3e30: 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f  ncCallback.  pro
3e40: 63 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 20  c xSyncCallback 
3e50: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72 67  {method file arg
3e60: 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c  s} {.    set fil
3e70: 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  e [file tail $fi
3e80: 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 30 3d 3d  le].    if { 0==
3e90: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a  [string match *j
3ea0: 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d 20 7d 20  ournal $file] } 
3eb0: 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20  { faultsim_save 
3ec0: 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  }.  }.  faultsim
3ed0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
3ee0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
3ef0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
3f00: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
3f10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3f20: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
3f30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3f40: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
3f50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3f60: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
3f70: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  }.  db close.  t
3f80: 73 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b  stvfs delete.} {
3f90: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6f  }..foreach {tn o
3fa0: 66 73 74 20 76 61 6c 75 65 20 72 65 73 75 6c 74  fst value result
3fb0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 32 20  } {.          2 
3fc0: 20 20 32 30 20 20 20 20 33 31 20 20 20 20 20 20    20    31      
3fd0: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20   {1 2 3 4}.     
3fe0: 20 20 20 20 20 33 20 20 20 32 30 20 20 20 20 33       3   20    3
3ff0: 32 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  2       {1 2 3 4
4000: 7d 0a 20 20 20 20 20 20 20 20 20 20 34 20 20 20  }.          4   
4010: 32 30 20 20 20 20 33 33 20 20 20 20 20 20 20 7b  20    33       {
4020: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4030: 20 20 20 35 20 20 20 32 30 20 20 20 20 36 35 35     5   20    655
4040: 33 36 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  36    {1 2 3 4}.
4050: 20 20 20 20 20 20 20 20 20 20 36 20 20 20 32 30            6   20
4060: 20 20 20 20 31 33 31 30 37 32 20 20 20 7b 31 20      131072   {1 
4070: 32 20 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20  2 3 4}..        
4080: 20 20 37 20 20 20 32 34 20 20 20 20 35 31 31 20    7   24    511 
4090: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20       {1 2 3 4}. 
40a0: 20 20 20 20 20 20 20 20 20 38 20 20 20 32 34 20           8   24 
40b0: 20 20 20 35 31 33 20 20 20 20 20 20 7b 31 20 32     513      {1 2
40c0: 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20   3 4}.          
40d0: 39 20 20 20 32 34 20 20 20 20 31 33 31 30 37 32  9   24    131072
40e0: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20     {1 2 3 4}..  
40f0: 20 20 20 20 20 20 20 31 30 20 20 20 33 32 20 20         10   32  
4100: 20 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 7d    65536    {1 2}
4110: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  .} {.  do_test p
4120: 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e 20 7b 0a  ager1.4.3.$tn {.
4130: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
4140: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
4150: 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20      hexio_write 
4160: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
4170: 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74 20 25 2e  $ofst [format %.
4180: 38 78 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 65  8x $value].    e
4190: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
41a0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
41b0: 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20 63 6c 6f  $result.}.db clo
41c0: 73 65 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56  se..# Set up a V
41d0: 46 53 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  FS that snapshot
41e0: 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
41f0: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 61 20  m just before a 
4200: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 23  master journal.#
4210: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
4220: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75 6c   to commit a mul
4230: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
4240: 69 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c 6c  ion. Specificall
4250: 79 2c 20 74 68 65 0a 23 20 66 69 6c 65 2d 73 79  y, the.# file-sy
4260: 73 74 65 6d 20 69 73 20 73 61 76 65 64 20 6a 75  stem is saved ju
4270: 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 78 44  st before the xD
4280: 65 6c 65 74 65 28 29 20 63 61 6c 6c 20 74 6f 20  elete() call to 
4290: 72 65 6d 6f 76 65 20 74 68 65 20 0a 23 20 6d 61  remove the .# ma
42a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
42b0: 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d  e from the file-
42c0: 73 79 73 74 65 6d 2e 0a 23 0a 74 65 73 74 76 66  system..#.testvf
42d0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
42e0: 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f  tv script copy_o
42f0: 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73 65 74 20  n_mj_delete.set 
4300: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65  ::mj_filename_le
4310: 6e 67 74 68 20 30 0a 70 72 6f 63 20 63 6f 70 79  ngth 0.proc copy
4320: 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d  _on_mj_delete {m
4330: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
4340: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
4350: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20  ring match *mj* 
4360: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
4370: 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73  name]]} { .    s
4380: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
4390: 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67 20  _length [string 
43a0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65  length $filename
43b0: 5d 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73  ].    faultsim_s
43c0: 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave .  }.  retur
43d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 73  n SQLITE_OK.}..s
43e0: 65 74 20 70 77 64 20 5b 70 77 64 5d 0a 69 66 20  et pwd [pwd].if 
43f0: 7b 21 5b 66 6f 72 63 65 64 5f 70 72 6f 78 79 5f  {![forced_proxy_
4400: 6c 6f 63 6b 69 6e 67 5d 7d 20 7b 0a 20 20 23 20  locking]} {.  # 
4410: 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 75 73  proxy locking us
4420: 65 73 20 63 61 6e 27 74 20 64 65 61 6c 20 77 69  es can't deal wi
4430: 74 68 20 61 75 74 6f 20 70 72 6f 78 79 20 66 69  th auto proxy fi
4440: 6c 65 20 70 61 74 68 73 20 6c 6f 6e 67 65 72 20  le paths longer 
4450: 74 68 61 6e 20 4d 41 58 50 41 54 48 4c 45 4e 0a  than MAXPATHLEN.
4460: 66 6f 72 65 61 63 68 20 7b 74 6e 31 20 74 63 6c  foreach {tn1 tcl
4470: 7d 20 7b 0a 20 20 31 20 7b 20 73 65 74 20 70 72  } {.  1 { set pr
4480: 65 66 69 78 20 22 74 65 73 74 2e 64 62 22 20 7d  efix "test.db" }
4490: 0a 20 20 32 20 7b 20 0a 20 20 20 20 23 20 54 68  .  2 { .    # Th
44a0: 69 73 20 74 65 73 74 20 64 65 70 65 6e 64 73 20  is test depends 
44b0: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  on the underlyin
44c0: 67 20 56 46 53 20 62 65 69 6e 67 20 61 62 6c 65  g VFS being able
44d0: 20 74 6f 20 6f 70 65 6e 20 70 61 74 68 73 0a 20   to open paths. 
44e0: 20 20 20 23 20 35 31 32 20 62 79 74 65 73 20 69     # 512 bytes i
44f0: 6e 20 6c 65 6e 67 74 68 2e 20 54 68 65 20 69 64  n length. The id
4500: 65 61 20 69 73 20 74 6f 20 63 72 65 61 74 65 20  ea is to create 
4510: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
4520: 6c 65 20 74 68 61 74 0a 20 20 20 20 23 20 63 6f  le that.    # co
4530: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
4540: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
4550: 73 6f 20 6c 61 72 67 65 20 74 68 61 74 20 69 74  so large that it
4560: 20 63 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 20   could contain. 
4570: 20 20 20 23 20 61 20 76 61 6c 69 64 20 70 61 67     # a valid pag
4580: 65 20 72 65 63 6f 72 64 20 28 69 66 20 74 68 65  e record (if the
4590: 20 66 69 6c 65 20 70 61 67 65 2d 73 69 7a 65 20   file page-size 
45a0: 69 73 20 35 31 32 20 62 79 74 65 73 29 2e 20 53  is 512 bytes). S
45b0: 6f 20 61 73 20 74 6f 0a 20 20 20 20 23 20 6d 61  o as to.    # ma
45c0: 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65 20 64  ke sure SQLite d
45d0: 6f 65 73 6e 27 74 20 67 65 74 20 63 6f 6e 66 75  oesn't get confu
45e0: 73 65 64 20 62 79 20 74 68 69 73 2e 0a 20 20 20  sed by this..   
45f0: 20 23 0a 20 20 20 20 73 65 74 20 6e 50 61 64 64   #.    set nPadd
4600: 69 6e 67 20 5b 65 78 70 72 20 35 31 31 20 2d 20  ing [expr 511 - 
4610: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c  $::mj_filename_l
4620: 65 6e 67 74 68 5d 0a 20 20 20 20 69 66 20 7b 24  ength].    if {$
4630: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
4640: 74 66 6f 72 6d 29 3d 3d 22 77 69 6e 64 6f 77 73  tform)=="windows
4650: 22 7d 20 7b 0a 20 20 20 20 20 20 23 20 54 42 44  "} {.      # TBD
4660: 20 6e 65 65 64 20 74 6f 20 66 69 67 75 72 65 20   need to figure 
4670: 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 74 68  out how to do th
4680: 69 73 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72  is correctly for
4690: 20 57 69 6e 64 6f 77 73 21 21 21 0a 20 20 20 20   Windows!!!.    
46a0: 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67 20 5b    set nPadding [
46b0: 65 78 70 72 20 32 35 35 20 2d 20 24 3a 3a 6d 6a  expr 255 - $::mj
46c0: 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68  _filename_length
46d0: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 57  ].    }..    # W
46e0: 65 20 63 61 6e 6e 6f 74 20 6a 75 73 74 20 63 72  e cannot just cr
46f0: 65 61 74 65 20 61 20 72 65 61 6c 6c 79 20 6c 6f  eate a really lo
4700: 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
4710: 20 6e 61 6d 65 20 74 6f 20 6f 70 65 6e 2c 20 61   name to open, a
4720: 73 0a 20 20 20 20 23 20 4c 69 6e 75 78 20 6c 69  s.    # Linux li
4730: 6d 69 74 73 20 61 20 73 69 6e 67 6c 65 20 63 6f  mits a single co
4740: 6d 70 6f 6e 65 6e 74 20 6f 66 20 61 20 70 61 74  mponent of a pat
4750: 68 20 74 6f 20 32 35 35 20 62 79 74 65 73 20 62  h to 255 bytes b
4760: 79 20 64 65 66 61 75 6c 74 0a 20 20 20 20 23 20  y default.    # 
4770: 28 61 6e 64 20 70 72 65 73 75 6d 61 62 6c 79 20  (and presumably 
4780: 6f 74 68 65 72 20 73 79 73 74 65 6d 73 20 68 61  other systems ha
4790: 76 65 20 6c 69 6d 69 74 73 20 74 6f 6f 29 2e 20  ve limits too). 
47a0: 53 6f 20 63 72 65 61 74 65 20 61 20 64 69 72 65  So create a dire
47b0: 63 74 6f 72 79 0a 20 20 20 20 23 20 68 69 65 72  ctory.    # hier
47c0: 61 72 63 68 79 20 74 6f 20 77 6f 72 6b 20 69 6e  archy to work in
47d0: 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20  ..    #.    set 
47e0: 64 69 72 6e 61 6d 65 20 22 64 31 32 33 34 35 36  dirname "d123456
47f0: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
4800: 33 34 35 36 37 38 39 30 2f 22 0a 20 20 20 20 73  34567890/".    s
4810: 65 74 20 6e 44 69 72 20 5b 65 78 70 72 20 24 6e  et nDir [expr $n
4820: 50 61 64 64 69 6e 67 20 2f 20 33 32 5d 0a 20 20  Padding / 32].  
4830: 20 20 69 66 20 7b 20 24 6e 44 69 72 20 7d 20 7b    if { $nDir } {
4840: 0a 20 20 20 20 20 20 73 65 74 20 70 20 5b 73 74  .      set p [st
4850: 72 69 6e 67 20 72 65 70 65 61 74 20 24 64 69 72  ring repeat $dir
4860: 6e 61 6d 65 20 24 6e 44 69 72 5d 0a 20 20 20 20  name $nDir].    
4870: 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 70 0a    file mkdir $p.
4880: 20 20 20 20 20 20 63 64 20 24 70 0a 20 20 20 20        cd $p.    
4890: 7d 0a 0a 20 20 20 20 73 65 74 20 70 61 64 64 69  }..    set paddi
48a0: 6e 67 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61  ng [string repea
48b0: 74 20 78 20 5b 65 78 70 72 20 24 6e 50 61 64 64  t x [expr $nPadd
48c0: 69 6e 67 20 25 33 32 5d 5d 0a 20 20 20 20 73 65  ing %32]].    se
48d0: 74 20 70 72 65 66 69 78 20 22 74 65 73 74 2e 64  t prefix "test.d
48e0: 62 24 7b 70 61 64 64 69 6e 67 7d 22 0a 20 20 7d  b${padding}".  }
48f0: 0a 7d 20 7b 0a 20 20 65 76 61 6c 20 24 74 63 6c  .} {.  eval $tcl
4900: 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 32 20  .  foreach {tn2 
4910: 73 71 6c 7d 20 7b 0a 20 20 20 20 6f 20 7b 20 0a  sql} {.    o { .
4920: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69        PRAGMA mai
4930: 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46  n.synchronous=OF
4940: 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  F;.      PRAGMA 
4950: 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  aux.synchronous=
4960: 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  OFF;.      PRAGM
4970: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
4980: 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20   DELETE;.    }. 
4990: 20 20 20 6f 35 31 32 20 7b 20 0a 20 20 20 20 20     o512 { .     
49a0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e   PRAGMA main.syn
49b0: 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20  chronous=OFF;.  
49c0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
49d0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a  ynchronous=OFF;.
49e0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69        PRAGMA mai
49f0: 6e 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31  n.page_size = 51
4a00: 32 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  2;.      PRAGMA 
4a10: 61 75 78 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20  aux.page_size = 
4a20: 35 31 32 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  512;.      PRAGM
4a30: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
4a40: 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20   DELETE;.    }. 
4a50: 20 20 20 6e 20 7b 20 0a 20 20 20 20 20 20 50 52     n { .      PR
4a60: 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72  AGMA main.synchr
4a70: 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20  onous=NORMAL;.  
4a80: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
4a90: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
4aa0: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
4ab0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
4ac0: 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20  ELETE;.    }.   
4ad0: 20 66 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47   f { .      PRAG
4ae0: 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e  MA main.synchron
4af0: 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ous=FULL;.      
4b00: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
4b10: 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20 20  ronous=FULL;.   
4b20: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
4b30: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
4b40: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20  .    }.  } {..  
4b50: 20 20 73 65 74 20 74 6e 20 22 24 7b 74 6e 31 7d    set tn "${tn1}
4b60: 2e 24 7b 74 6e 32 7d 22 0a 20 20 0a 20 20 20 20  .${tn2}".  .    
4b70: 23 20 53 65 74 20 75 70 20 61 20 63 6f 6e 6e 65  # Set up a conne
4b80: 63 74 69 6f 6e 20 74 6f 20 68 61 76 65 20 74 77  ction to have tw
4b90: 6f 20 64 61 74 61 62 61 73 65 73 2c 20 74 65 73  o databases, tes
4ba0: 74 2e 64 62 20 28 6d 61 69 6e 29 20 61 6e 64 20  t.db (main) and 
4bb0: 0a 20 20 20 20 23 20 74 65 73 74 2e 64 62 32 20  .    # test.db2 
4bc0: 28 61 75 78 29 2e 20 54 68 65 6e 20 72 75 6e 20  (aux). Then run 
4bd0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
4be0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 6d  nsaction on them
4bf0: 2e 20 54 68 65 0a 20 20 20 20 23 20 56 46 53 20  . The.    # VFS 
4c00: 77 69 6c 6c 20 73 6e 61 70 73 68 6f 74 20 74 68  will snapshot th
4c10: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75  e file-system ju
4c20: 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 6d 61  st before the ma
4c30: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  ster-journal.   
4c40: 20 23 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74   # file is delet
4c50: 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ed to commit the
4c60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
4c70: 20 20 23 0a 20 20 20 20 74 76 20 66 69 6c 74 65    #.    tv filte
4c80: 72 20 78 44 65 6c 65 74 65 0a 20 20 20 20 64 6f  r xDelete.    do
4c90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
4ca0: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 66  .$tn.1 {.      f
4cb0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
4cc0: 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 65 66 69  nd_reopen $prefi
4cd0: 78 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  x.      execsql 
4ce0: 22 0a 20 20 20 20 20 20 20 20 41 54 54 41 43 48  ".        ATTACH
4cf0: 20 27 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53   '${prefix}2' AS
4d00: 20 61 75 78 3b 0a 20 20 20 20 20 20 20 20 24 73   aux;.        $s
4d10: 71 6c 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  ql.        CREAT
4d20: 45 20 54 41 42 4c 45 20 61 28 78 29 3b 0a 20 20  E TABLE a(x);.  
4d30: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
4d40: 4c 45 20 61 75 78 2e 62 28 78 29 3b 0a 20 20 20  LE aux.b(x);.   
4d50: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4d60: 20 61 20 56 41 4c 55 45 53 28 27 64 6f 75 62 6c   a VALUES('doubl
4d70: 65 2d 79 6f 75 27 29 3b 0a 20 20 20 20 20 20 20  e-you');.       
4d80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56   INSERT INTO a V
4d90: 41 4c 55 45 53 28 27 77 68 79 27 29 3b 0a 20 20  ALUES('why');.  
4da0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4db0: 4f 20 61 20 56 41 4c 55 45 53 28 27 7a 65 64 27  O a VALUES('zed'
4dc0: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
4dd0: 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28  T INTO b VALUES(
4de0: 27 77 6f 6e 27 29 3b 0a 20 20 20 20 20 20 20 20  'won');.        
4df0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41  INSERT INTO b VA
4e00: 4c 55 45 53 28 27 74 6f 6f 27 29 3b 0a 20 20 20  LUES('too');.   
4e10: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4e20: 20 62 20 56 41 4c 55 45 53 28 27 66 72 65 65 27   b VALUES('free'
4e30: 29 3b 0a 20 20 20 20 20 20 22 0a 20 20 20 20 20  );.      ".     
4e40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
4e50: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
4e60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4e70: 61 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  a SELECT * FROM 
4e80: 62 20 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33  b WHERE rowid<=3
4e90: 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45  ;.          INSE
4ea0: 52 54 20 49 4e 54 4f 20 62 20 53 45 4c 45 43 54  RT INTO b SELECT
4eb0: 20 2a 20 46 52 4f 4d 20 61 20 57 48 45 52 45 20   * FROM a WHERE 
4ec0: 72 6f 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20  rowid<=3;.      
4ed0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20    COMMIT;.      
4ee0: 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 74  }.    } {}.    t
4ef0: 76 20 66 69 6c 74 65 72 20 7b 7d 0a 20 20 20 20  v filter {}.    
4f00: 0a 20 20 20 20 23 20 43 68 65 63 6b 20 74 68 61  .    # Check tha
4f10: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
4f20: 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 20  n was committed 
4f30: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 20 20  successfully..  
4f40: 20 20 23 0a 20 20 20 20 64 6f 5f 65 78 65 63 73    #.    do_execs
4f50: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  ql_test pager1-4
4f60: 2e 34 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20  .4.$tn.2 {.     
4f70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
4f80: 0a 20 20 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79  .    } {double-y
4f90: 6f 75 20 77 68 79 20 7a 65 64 20 77 6f 6e 20 74  ou why zed won t
4fa0: 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f  oo free}.    do_
4fb0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
4fc0: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a  er1-4.4.$tn.3 {.
4fd0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
4fe0: 52 4f 4d 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e  ROM b.    } {won
4ff0: 20 74 6f 6f 20 66 72 65 65 20 64 6f 75 62 6c 65   too free double
5000: 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20  -you why zed}.  
5010: 20 20 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65    .    # Restore
5020: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5030: 20 61 6e 64 20 72 65 6f 70 65 6e 20 74 68 65 20   and reopen the 
5040: 64 61 74 61 62 61 73 65 73 2e 20 43 68 65 63 6b  databases. Check
5050: 20 74 68 61 74 20 69 74 20 6e 6f 77 0a 20 20 20   that it now.   
5060: 20 23 20 61 70 70 65 61 72 73 20 74 68 61 74 20   # appears that 
5070: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5080: 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  was not committe
5090: 64 20 28 62 65 63 61 75 73 65 20 74 68 65 20 66  d (because the f
50a0: 69 6c 65 2d 73 79 73 74 65 6d 0a 20 20 20 20 23  ile-system.    #
50b0: 20 77 61 73 20 72 65 73 74 6f 72 65 64 20 74 6f   was restored to
50c0: 20 74 68 65 20 73 74 61 74 65 20 77 68 65 72 65   the state where
50d0: 20 69 74 20 68 61 64 20 6e 6f 74 20 62 65 65 6e   it had not been
50e0: 29 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f  )..    #.    do_
50f0: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
5100: 24 74 6e 2e 34 20 7b 0a 20 20 20 20 20 20 66 61  $tn.4 {.      fa
5110: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5120: 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 65 66 69  nd_reopen $prefi
5130: 78 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  x.      execsql 
5140: 22 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69  "ATTACH '${prefi
5150: 78 7d 32 27 20 41 53 20 61 75 78 22 0a 20 20 20  x}2' AS aux".   
5160: 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f 65 78 65   } {}.    do_exe
5170: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
5180: 2d 34 2e 34 2e 24 74 6e 2e 35 20 7b 53 45 4c 45  -4.4.$tn.5 {SELE
5190: 43 54 20 2a 20 46 52 4f 4d 20 61 7d 20 7b 64 6f  CT * FROM a} {do
51a0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
51b0: 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c  }.    do_execsql
51c0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
51d0: 2e 24 74 6e 2e 36 20 7b 53 45 4c 45 43 54 20 2a  .$tn.6 {SELECT *
51e0: 20 46 52 4f 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f   FROM b} {won to
51f0: 6f 20 66 72 65 65 7d 0a 20 20 20 20 0a 20 20 20  o free}.    .   
5200: 20 23 20 52 65 73 74 6f 72 65 20 74 68 65 20 66   # Restore the f
5210: 69 6c 65 2d 73 79 73 74 65 6d 20 61 67 61 69 6e  ile-system again
5220: 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 62 65 66  . This time, bef
5230: 6f 72 65 20 72 65 6f 70 65 6e 69 6e 67 20 74 68  ore reopening th
5240: 65 20 64 61 74 61 62 61 73 65 73 2c 0a 20 20 20  e databases,.   
5250: 20 23 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61   # delete the ma
5260: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
5270: 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d  e from the file-
5280: 73 79 73 74 65 6d 2e 20 49 74 20 6e 6f 77 20 61  system. It now a
5290: 70 70 65 61 72 73 20 74 68 61 74 0a 20 20 20 20  ppears that.    
52a0: 23 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  # the transactio
52b0: 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 20  n was committed 
52c0: 28 6e 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  (no master-journ
52d0: 61 6c 20 66 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f  al file == no ro
52e0: 6c 6c 62 61 63 6b 29 2e 0a 20 20 20 20 23 0a 20  llback)..    #. 
52f0: 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72     do_test pager
5300: 31 2d 34 2e 34 2e 24 74 6e 2e 37 20 7b 0a 20 20  1-4.4.$tn.7 {.  
5310: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
5320: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20  tore_and_reopen 
5330: 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 66 6f  $prefix.      fo
5340: 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 24 7b  reach f [glob ${
5350: 70 72 65 66 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66  prefix}-mj*] { f
5360: 6f 72 63 65 64 65 6c 65 74 65 20 24 66 20 7d 0a  orcedelete $f }.
5370: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 41        execsql "A
5380: 54 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d  TTACH '${prefix}
5390: 32 27 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d  2' AS aux".    }
53a0: 20 7b 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73   {}.    do_execs
53b0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  ql_test pager1-4
53c0: 2e 34 2e 24 74 6e 2e 38 20 7b 0a 20 20 20 20 20  .4.$tn.8 {.     
53d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
53e0: 0a 20 20 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79  .    } {double-y
53f0: 6f 75 20 77 68 79 20 7a 65 64 20 77 6f 6e 20 74  ou why zed won t
5400: 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f  oo free}.    do_
5410: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
5420: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 39 20 7b 0a  er1-4.4.$tn.9 {.
5430: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
5440: 52 4f 4d 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e  ROM b.    } {won
5450: 20 74 6f 6f 20 66 72 65 65 20 64 6f 75 62 6c 65   too free double
5460: 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20  -you why zed}.  
5470: 7d 0a 0a 20 20 63 64 20 24 70 77 64 0a 7d 0a 64  }..  cd $pwd.}.d
5480: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
5490: 65 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 24 64  e.forcedelete $d
54a0: 69 72 6e 61 6d 65 0a 7d 0a 0a 0a 23 20 53 65 74  irname.}...# Set
54b0: 20 75 70 20 61 20 56 46 53 20 74 6f 20 6d 61 6b   up a VFS to mak
54c0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
54d0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
54e0: 20 62 65 66 6f 72 65 20 64 65 6c 65 74 69 6e 67   before deleting
54f0: 20 61 0a 23 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   a.# journal fil
5500: 65 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72  e to commit a tr
5510: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 74  ansaction. The t
5520: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 6f 64 69 66  ransaction modif
5530: 69 65 73 20 65 78 61 63 74 6c 79 0a 23 20 74 77  ies exactly.# tw
5540: 6f 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  o database pages
5550: 20 28 61 6e 64 20 70 61 67 65 20 31 20 2d 20 74   (and page 1 - t
5560: 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
5570: 72 29 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  r)..#.testvfs tv
5580: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
5590: 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76  ectorsize 512.tv
55a0: 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f   script copy_on_
55b0: 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74  journal_delete.t
55c0: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
55d0: 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f  .proc copy_on_jo
55e0: 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65  urnal_delete {me
55f0: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
5600: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
5610: 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e  ing match *journ
5620: 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66  al $filename]} f
5630: 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20  aultsim_save .  
5640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5650: 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .}.faultsim_dele
5660: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  te_and_reopen.do
5670: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5680: 67 65 72 31 2e 34 2e 35 2e 31 20 7b 0a 20 20 50  ger1.4.5.1 {.  P
5690: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
56a0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 50  de = DELETE;.  P
56b0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
56c0: 3d 20 31 30 32 34 3b 0a 20 20 43 52 45 41 54 45  = 1024;.  CREATE
56d0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
56e0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
56f0: 74 32 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45  t2(a, b);.  INSE
5700: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5710: 53 28 27 49 27 2c 20 27 49 49 27 29 3b 0a 20 20  S('I', 'II');.  
5720: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
5730: 41 4c 55 45 53 28 27 49 49 49 27 2c 20 27 49 56  ALUES('III', 'IV
5740: 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  ');.  BEGIN;.   
5750: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5760: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
5770: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
5780: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
5790: 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65 6c 65   COMMIT;.} {dele
57a0: 74 65 7d 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d  te}.tv filter {}
57b0: 0a 0a 23 20 43 68 65 63 6b 20 74 68 65 20 74 72  ..# Check the tr
57c0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
57d0: 6d 6d 69 74 74 65 64 3a 0a 23 0a 64 6f 5f 65 78  mmitted:.#.do_ex
57e0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
57f0: 31 2e 34 2e 35 2e 32 20 7b 0a 20 20 53 45 4c 45  1.4.5.2 {.  SELE
5800: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
5810: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
5820: 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 20 49 49  ;.} {I II 1 2 II
5830: 49 20 49 56 20 33 20 34 7d 0a 0a 23 20 4e 6f 77  I IV 3 4}..# Now
5840: 20 74 72 79 20 66 6f 75 72 20 74 65 73 74 73 3a   try four tests:
5850: 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35  .#.#  pager1-4.5
5860: 2e 33 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .3: Restore the 
5870: 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 68 65  file-system. Che
5880: 63 6b 20 74 68 61 74 20 74 68 65 20 77 68 6f 6c  ck that the whol
5890: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 23  e transaction .#
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
58c0: 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e  #.#  pager1-4.5.
58d0: 34 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20 66  4: Restore the f
58e0: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f 72 72  ile-system. Corr
58f0: 75 70 74 20 74 68 65 20 66 69 72 73 74 20 72 65  upt the first re
5900: 63 6f 72 64 20 69 6e 20 74 68 65 0a 23 20 20 20  cord in the.#   
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
5920: 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74 68 65 20  rnal. Check the 
5930: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
5940: 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  ot rolled back..
5950: 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e  #.#  pager1-4.5.
5960: 35 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20 66  5: Restore the f
5970: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f 72 72  ile-system. Corr
5980: 75 70 74 20 74 68 65 20 73 65 63 6f 6e 64 20 72  upt the second r
5990: 65 63 6f 72 64 20 69 6e 20 74 68 65 0a 23 20 20  ecord in the.#  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
59b0: 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74 68 61  urnal. Check tha
59c0: 74 20 74 68 65 20 66 69 72 73 74 20 72 65 63 6f  t the first reco
59d0: 72 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  rd in the transa
59e0: 63 74 69 6f 6e 20 69 73 20 0a 23 20 20 20 20 20  ction is .#     
59f0: 20 20 20 20 20 20 20 20 20 20 20 70 6c 61 79 65             playe
5a00: 64 20 62 61 63 6b 2c 20 62 75 74 20 6e 6f 74 20  d back, but not 
5a10: 74 68 65 20 73 65 63 6f 6e 64 2e 0a 23 0a 23 20  the second..#.# 
5a20: 20 70 61 67 65 72 31 2d 34 2e 35 2e 36 3a 20 52   pager1-4.5.6: R
5a30: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5a40: 73 79 73 74 65 6d 2e 20 54 72 79 20 74 6f 20 6f  system. Try to o
5a50: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
5a60: 20 77 69 74 68 20 61 0a 23 20 20 20 20 20 20 20   with a.#       
5a70: 20 20 20 20 20 20 20 20 20 72 65 61 64 6f 6e 6c           readonl
5a80: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68  y connection. Th
5a90: 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2c 20  is should fail, 
5aa0: 61 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 0a 23  as a read-only.#
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ac0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 6e 6f  connection canno
5ad0: 74 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  t roll back the 
5ae0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23  database file..#
5af0: 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72  .faultsim_restor
5b00: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f  e_and_reopen.do_
5b10: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
5b20: 65 72 31 2e 34 2e 35 2e 33 20 7b 0a 20 20 53 45  er1.4.5.3 {.  SE
5b30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
5b40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5b50: 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49 49 49 20  t2;.} {I II III 
5b60: 49 56 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  IV}.faultsim_res
5b70: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
5b80: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
5b90: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70  .db-journal [exp
5ba0: 72 20 35 31 32 2b 34 2b 31 30 32 34 20 2d 20 32  r 512+4+1024 - 2
5bb0: 30 32 5d 20 30 31 32 33 34 35 36 37 38 39 41 42  02] 0123456789AB
5bc0: 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  CDEF.do_execsql_
5bd0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
5be0: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  4 {.  SELECT * F
5bf0: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
5c00: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49   * FROM t2;.} {I
5c10: 20 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33   II 1 2 III IV 3
5c20: 20 34 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73   4}.faultsim_res
5c30: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
5c40: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
5c50: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70  .db-journal [exp
5c60: 72 20 35 31 32 2b 34 2b 31 30 32 34 2b 34 2b 34  r 512+4+1024+4+4
5c70: 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32  +1024 - 202] 012
5c80: 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f  3456789ABCDEF.do
5c90: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5ca0: 67 65 72 31 2e 34 2e 35 2e 35 20 7b 0a 20 20 53  ger1.4.5.5 {.  S
5cb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
5cc0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5cd0: 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49 49 49   t2;.} {I II III
5ce0: 20 49 56 20 33 20 34 7d 0a 0a 66 61 75 6c 74 73   IV 3 4}..faults
5cf0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5d00: 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65 0a 73  eopen.db close.s
5d10: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
5d20: 62 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a 64 6f  b -readonly 1.do
5d30: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
5d40: 61 67 65 72 31 2e 34 2e 35 2e 36 20 7b 0a 20 20  ager1.4.5.6 {.  
5d50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5d60: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5d70: 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b 64 69 73 6b  M t2;.} {1 {disk
5d80: 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 64 62 20   I/O error}}.db 
5d90: 63 6c 6f 73 65 0a 0a 23 20 53 6e 61 70 73 68 6f  close..# Snapsho
5da0: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
5db0: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 6d 75  m just before mu
5dc0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 2e  lti-file commit.
5dd0: 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65 0a 23   Save the name.#
5de0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
5df0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 24  ournal file in $
5e00: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 0a 23  ::mj_filename..#
5e10: 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f  .tv script copy_
5e20: 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 74 76 20  on_mj_delete.tv 
5e30: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70  filter xDelete.p
5e40: 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64  roc copy_on_mj_d
5e50: 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69  elete {method fi
5e60: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
5e70: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
5e80: 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61  ch *mj* [file ta
5e90: 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20  il $filename]]} 
5ea0: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f  { .    set ::mj_
5eb0: 66 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65 6e 61  filename $filena
5ec0: 6d 65 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f  me.    faultsim_
5ed0: 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75  save .  }.  retu
5ee0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 64  rn SQLITE_OK.}.d
5ef0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
5f00: 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  6.1 {.  faultsim
5f10: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
5f20: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
5f30: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
5f40: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
5f50: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
5f60: 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20  t.db2' AS two;. 
5f70: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5f80: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
5f90: 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f 2e 74  EATE TABLE two.t
5fa0: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  2(a, b);.    INS
5fb0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5fc0: 45 53 28 31 2c 20 27 74 31 2e 31 27 29 3b 0a 20  ES(1, 't1.1');. 
5fd0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5fe0: 32 20 56 41 4c 55 45 53 28 31 2c 20 27 74 32 2e  2 VALUES(1, 't2.
5ff0: 31 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  1');.    BEGIN;.
6000: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
6010: 53 45 54 20 62 20 3d 20 27 74 31 2e 32 27 3b 0a  SET b = 't1.2';.
6020: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 32 20        UPDATE t2 
6030: 53 45 54 20 62 20 3d 20 27 74 32 2e 32 27 3b 0a  SET b = 't2.2';.
6040: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
6050: 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 20    tv filter {}. 
6060: 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a   db close.} {}..
6070: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
6080: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65  _and_reopen.do_e
6090: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
60a0: 72 31 2e 34 2e 36 2e 32 20 7b 20 53 45 4c 45 43  r1.4.6.2 { SELEC
60b0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20  T * FROM t1 }   
60c0: 20 20 20 20 20 20 20 20 7b 31 20 74 31 2e 31 7d          {1 t1.1}
60d0: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
60e0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 33 20 7b 20   pager1.4.6.3 { 
60f0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6100: 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b 31 7d  j_filename } {1}
6110: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6120: 20 70 61 67 65 72 31 2e 34 2e 36 2e 34 20 7b 0a   pager1.4.6.4 {.
6130: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
6140: 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 53 45  b2' AS two;.  SE
6150: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
6160: 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65  } {1 t2.1}.do_te
6170: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 35 20  st pager1.4.6.5 
6180: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
6190: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b  :mj_filename } {
61a0: 30 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  0}..faultsim_res
61b0: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
61c0: 64 62 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  db close.do_test
61d0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 38 20 7b 0a   pager1.4.6.8 {.
61e0: 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e    set ::mj_filen
61f0: 61 6d 65 31 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  ame1 $::mj_filen
6200: 61 6d 65 0a 20 20 74 76 20 66 69 6c 74 65 72 20  ame.  tv filter 
6210: 78 44 65 6c 65 74 65 0a 20 20 73 71 6c 69 74 65  xDelete.  sqlite
6220: 33 20 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20  3 db test.db2.  
6230: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
6240: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
6250: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20  e = DELETE;.    
6260: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 33  ATTACH 'test.db3
6270: 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20 20 20  ' AS three;.    
6280: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 68 72  CREATE TABLE thr
6290: 65 65 2e 74 33 28 61 2c 20 62 29 3b 0a 20 20 20  ee.t3(a, b);.   
62a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
62b0: 56 41 4c 55 45 53 28 31 2c 20 27 74 33 2e 31 27  VALUES(1, 't3.1'
62c0: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
62d0: 20 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45      UPDATE t2 SE
62e0: 54 20 62 20 3d 20 27 74 32 2e 33 27 3b 0a 20 20  T b = 't2.3';.  
62f0: 20 20 20 20 55 50 44 41 54 45 20 74 33 20 53 45      UPDATE t3 SE
6300: 54 20 62 20 3d 20 27 74 33 2e 33 27 3b 0a 20 20  T b = 't3.3';.  
6310: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
6320: 65 78 70 72 20 7b 24 3a 3a 6d 6a 5f 66 69 6c 65  expr {$::mj_file
6330: 6e 61 6d 65 31 20 21 3d 20 24 3a 3a 6d 6a 5f 66  name1 != $::mj_f
6340: 69 6c 65 6e 61 6d 65 7d 0a 7d 20 7b 31 7d 0a 66  ilename}.} {1}.f
6350: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
6360: 61 6e 64 5f 72 65 6f 70 65 6e 0a 74 76 20 66 69  and_reopen.tv fi
6370: 6c 74 65 72 20 7b 7d 0a 0a 23 20 54 68 65 20 66  lter {}..# The f
6380: 69 6c 65 2d 73 79 73 74 65 6d 20 6e 6f 77 20 63  ile-system now c
6390: 6f 6e 74 61 69 6e 73 3a 0a 23 0a 23 20 20 20 2a  ontains:.#.#   *
63a0: 20 74 68 72 65 65 20 64 61 74 61 62 61 73 65 73   three databases
63b0: 0a 23 20 20 20 2a 20 74 68 72 65 65 20 68 6f 74  .#   * three hot
63c0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 23  -journal files.#
63d0: 20 20 20 2a 20 74 77 6f 20 6d 61 73 74 65 72 2d     * two master-
63e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23  journal files..#
63f0: 0a 23 20 54 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  .# The hot-journ
6400: 61 6c 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  als associated w
6410: 69 74 68 20 74 65 73 74 2e 64 62 32 20 61 6e 64  ith test.db2 and
6420: 20 74 65 73 74 2e 64 62 33 20 70 6f 69 6e 74 20   test.db3 point 
6430: 74 6f 0a 23 20 6d 61 73 74 65 72 20 6a 6f 75 72  to.# master jour
6440: 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  nal $::mj_filena
6450: 6d 65 2e 20 54 68 65 20 68 6f 74 2d 6a 6f 75 72  me. The hot-jour
6460: 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  nal file associa
6470: 74 65 64 20 77 69 74 68 0a 23 20 74 65 73 74 2e  ted with.# test.
6480: 64 62 20 70 6f 69 6e 74 73 20 74 6f 20 6d 61 73  db points to mas
6490: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d  ter journal $::m
64a0: 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 20 53 6f 20  j_filename1. So 
64b0: 72 65 61 64 69 6e 67 20 66 72 6f 6d 0a 23 20 74  reading from.# t
64c0: 65 73 74 2e 64 62 20 73 68 6f 75 6c 64 20 64 65  est.db should de
64d0: 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  lete $::mj_filen
64e0: 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ame1..#.do_test 
64f0: 70 61 67 65 72 31 2e 34 2e 36 2e 39 20 7b 0a 20  pager1.4.6.9 {. 
6500: 20 6c 73 6f 72 74 20 5b 67 6c 6f 62 20 74 65 73   lsort [glob tes
6510: 74 2e 64 62 2a 5d 0a 7d 20 5b 6c 73 6f 72 74 20  t.db*].} [lsort 
6520: 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  [list           
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 5c 0a 20 20 74 65 73 74 2e 64 62 20 74 65 73 74  \.  test.db test
6560: 2e 64 62 32 20 74 65 73 74 2e 64 62 33 20 20 20  .db2 test.db3   
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74             \.  t
6590: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74  est.db-journal t
65a0: 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20  est.db2-journal 
65b0: 74 65 73 74 2e 64 62 33 2d 6a 6f 75 72 6e 61 6c  test.db3-journal
65c0: 20 20 20 20 20 20 5c 0a 20 20 5b 66 69 6c 65 20        \.  [file 
65d0: 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  tail $::mj_filen
65e0: 61 6d 65 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20  ame] [file tail 
65f0: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 5d  $::mj_filename1]
6600: 0a 5d 5d 0a 0a 23 20 54 68 65 20 6d 61 73 74 65  .]]..# The maste
6610: 72 2d 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f  r-journal $::mj_
6620: 66 69 6c 65 6e 61 6d 65 31 20 63 6f 6e 74 61 69  filename1 contai
6630: 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  ns pointers to t
6640: 65 73 74 2e 64 62 20 61 6e 64 20 0a 23 20 74 65  est.db and .# te
6650: 73 74 2e 64 62 32 2e 20 48 6f 77 65 76 65 72 20  st.db2. However 
6660: 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
6670: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6680: 74 65 73 74 2e 64 62 32 20 70 6f 69 6e 74 73 20  test.db2 points 
6690: 74 6f 0a 23 20 61 20 64 69 66 66 65 72 65 6e 74  to.# a different
66a0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
66b0: 20 54 68 65 72 65 66 6f 72 65 2c 20 72 65 61 64   Therefore, read
66c0: 69 6e 67 20 66 72 6f 6d 20 74 65 73 74 2e 64 62  ing from test.db
66d0: 20 6f 6e 6c 79 20 73 68 6f 75 6c 64 0a 23 20 62   only should.# b
66e0: 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 61 75 73  e enough to caus
66f0: 65 20 53 51 4c 69 74 65 20 74 6f 20 64 65 6c 65  e SQLite to dele
6700: 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  te $::mj_filenam
6710: 65 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 20 20  e1..#.do_test   
6720: 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36        pager1.4.6
6730: 2e 31 30 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .10 { file exist
6740: 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  s $::mj_filename
6750: 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20    } {1}.do_test 
6760: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
6770: 2e 36 2e 31 31 20 7b 20 66 69 6c 65 20 65 78 69  .6.11 { file exi
6780: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6790: 6d 65 31 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65  me1 } {1}.do_exe
67a0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
67b0: 2e 34 2e 36 2e 31 32 20 7b 20 53 45 4c 45 43 54  .4.6.12 { SELECT
67c0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20   * FROM t1 } {1 
67d0: 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20  t1.1}.do_test   
67e0: 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36        pager1.4.6
67f0: 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .13 { file exist
6800: 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  s $::mj_filename
6810: 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20    } {1}.do_test 
6820: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
6830: 2e 36 2e 31 34 20 7b 20 66 69 6c 65 20 65 78 69  .6.14 { file exi
6840: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6850: 6d 65 31 20 7d 20 7b 30 7d 0a 0a 64 6f 5f 65 78  me1 } {0}..do_ex
6860: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
6870: 31 2e 34 2e 36 2e 31 32 20 7b 0a 20 20 41 54 54  1.4.6.12 {.  ATT
6880: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
6890: 53 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20  S two;.  SELECT 
68a0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20  * FROM t2;.} {1 
68b0: 74 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20  t2.1}.do_test   
68c0: 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36        pager1.4.6
68d0: 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .13 { file exist
68e0: 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  s $::mj_filename
68f0: 20 7d 20 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73   }  {1}.do_execs
6900: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
6910: 2e 36 2e 31 34 20 7b 0a 20 20 41 54 54 41 43 48  .6.14 {.  ATTACH
6920: 20 27 74 65 73 74 2e 64 62 33 27 20 41 53 20 74   'test.db3' AS t
6930: 68 72 65 65 3b 0a 20 20 53 45 4c 45 43 54 20 2a  hree;.  SELECT *
6940: 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 31 20 74   FROM t3;.} {1 t
6950: 33 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20  3.1}.do_test    
6960: 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e       pager1.4.6.
6970: 31 35 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  15 { file exists
6980: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20   $::mj_filename 
6990: 7d 20 20 7b 30 7d 0a 0a 64 62 20 63 6c 6f 73 65  }  {0}..db close
69a0: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74 65 73 74  .tv delete..test
69b0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
69c0: 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20  1.tv sectorsize 
69d0: 35 31 32 0a 74 76 20 73 63 72 69 70 74 20 63 6f  512.tv script co
69e0: 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65  py_on_journal_de
69f0: 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78  lete.tv filter x
6a00: 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79  Delete.proc copy
6a10: 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65  _on_journal_dele
6a20: 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  te {method filen
6a30: 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66  ame args} {.  if
6a40: 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
6a50: 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e 61  *journal $filena
6a60: 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61  me]} faultsim_sa
6a70: 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ve .  return SQL
6a80: 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69  ITE_OK.}.faultsi
6a90: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
6aa0: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
6ab0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e 31  est pager1.4.7.1
6ac0: 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72   {.  PRAGMA jour
6ad0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
6ae0: 45 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  E;.  CREATE TABL
6af0: 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b  E t1(x PRIMARY K
6b00: 45 59 2c 20 79 29 3b 0a 20 20 43 52 45 41 54 45  EY, y);.  CREATE
6b10: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
6b20: 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  y);.  INSERT INT
6b30: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c  O t1 VALUES('I',
6b40: 20 20 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53     'one');.  INS
6b50: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6b60: 45 53 28 27 49 49 27 2c 20 20 27 66 6f 75 72 27  ES('II',  'four'
6b70: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
6b80: 20 74 31 20 56 41 4c 55 45 53 28 27 49 49 49 27   t1 VALUES('III'
6b90: 2c 20 27 6e 69 6e 65 27 29 3b 0a 20 20 42 45 47  , 'nine');.  BEG
6ba0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
6bb0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49  NTO t1 VALUES('I
6bc0: 56 27 2c 20 27 73 69 78 74 65 65 6e 27 29 3b 0a  V', 'sixteen');.
6bd0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6be0: 74 31 20 56 41 4c 55 45 53 28 27 56 27 20 2c 20  t1 VALUES('V' , 
6bf0: 27 74 77 65 6e 74 79 66 69 76 65 27 29 3b 0a 20  'twentyfive');. 
6c00: 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65 6c 65   COMMIT;.} {dele
6c10: 74 65 7d 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d  te}.tv filter {}
6c20: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
6c30: 65 74 65 20 0a 64 6f 5f 74 65 73 74 20 70 61 67  ete .do_test pag
6c40: 65 72 31 2e 34 2e 37 2e 32 20 7b 0a 20 20 66 61  er1.4.7.2 {.  fa
6c50: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
6c60: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 63 61 74 63  nd_reopen.  catc
6c70: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
6c80: 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  es test.db-journ
6c90: 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20  al -permissions 
6ca0: 72 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74  r--------}.  cat
6cb0: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6cc0: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
6cd0: 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 31 7d  nal -readonly 1}
6ce0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
6cf0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
6d00: 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f  .} {1 {unable to
6d10: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
6d20: 69 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 70 61  ile}}.do_test pa
6d30: 67 65 72 31 2e 34 2e 37 2e 33 20 7b 0a 20 20 64  ger1.4.7.3 {.  d
6d40: 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68 20  b close.  catch 
6d50: 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73  {file attributes
6d60: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
6d70: 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72 77   -permissions rw
6d80: 2d 72 77 2d 72 77 2d 7d 0a 20 20 63 61 74 63 68  -rw-rw-}.  catch
6d90: 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65   {file attribute
6da0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
6db0: 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 30 7d 0a 20  l -readonly 0}. 
6dc0: 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73   delete_file tes
6dd0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 66  t.db-journal.  f
6de0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
6df0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
6e00: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
6e50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
6e60: 74 73 20 64 65 61 6c 20 77 69 74 68 20 6d 75 6c  ts deal with mul
6e70: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e  ti-file commits.
6e80: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 31 2e  .#.# pager1-5.1.
6e90: 2a 3a 20 54 68 65 20 63 61 73 65 20 77 68 65 72  *: The case wher
6ea0: 65 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  e a multi-file c
6eb0: 61 6e 6e 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74  annot be committ
6ec0: 65 64 20 62 65 63 61 75 73 65 0a 23 20 20 20 20  ed because.#    
6ed0: 20 20 20 20 20 20 20 20 20 20 20 61 6e 6f 74 68             anoth
6ee0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
6ef0: 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45   holding a SHARE
6f00: 44 20 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  D lock on one of
6f10: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
6f20: 20 20 20 20 20 66 69 6c 65 73 2e 20 41 66 74 65       files. Afte
6f30: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
6f40: 6b 20 69 73 20 72 65 6d 6f 76 65 64 2c 20 74 68  k is removed, th
6f50: 65 20 43 4f 4d 4d 49 54 20 73 75 63 63 65 65 64  e COMMIT succeed
6f60: 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e  s..#.# pager1-5.
6f70: 32 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20  2.*: Multi-file 
6f80: 63 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75  commits with jou
6f90: 72 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79  rnal_mode=memory
6fa0: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 33  ..#.# pager1-5.3
6fb0: 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63  .*: Multi-file c
6fc0: 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72  ommits with jour
6fd0: 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e  nal_mode=memory.
6fe0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 34 2e  .#.# pager1-5.4.
6ff0: 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20 77 69  *: Check that wi
7000: 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e  th synchronous=n
7010: 6f 72 6d 61 6c 2c 20 74 68 65 20 6d 61 73 74 65  ormal, the maste
7020: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23  r-journal file.#
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
7040: 61 6d 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  ame is added to 
7050: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
7060: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
7070: 20 74 68 65 20 6c 61 73 74 0a 23 20 20 20 20 20   the last.#     
7080: 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
7090: 6c 20 72 65 63 6f 72 64 2e 20 42 75 74 20 77 69  l record. But wi
70a0: 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66  th synchronous=f
70b0: 75 6c 6c 2c 20 65 78 74 72 61 20 75 6e 75 73 65  ull, extra unuse
70c0: 64 20 73 70 61 63 65 0a 23 20 20 20 20 20 20 20  d space.#       
70d0: 20 20 20 20 20 20 20 20 69 73 20 61 6c 6c 6f 63          is alloc
70e0: 61 74 65 64 20 62 65 74 77 65 65 6e 20 74 68 65  ated between the
70f0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
7100: 63 6f 72 64 20 61 6e 64 20 74 68 65 20 0a 23 20  cord and the .# 
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
7120: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
7130: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 74  e name so that t
7140: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
7150: 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20  l file.#        
7160: 20 20 20 20 20 20 20 6e 61 6d 65 20 64 6f 65 73         name does
7170: 20 6e 6f 74 20 6c 69 65 20 6f 6e 20 74 68 65 20   not lie on the 
7180: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 73 20 74  same sector as t
7190: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20  he last journal 
71a0: 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20  file.#          
71b0: 20 20 20 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23       record..#.#
71c0: 20 70 61 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43   pager1-5.5.*: C
71d0: 68 65 63 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75  heck that in jou
71e0: 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
71f0: 54 20 6d 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61  T mode, a journa
7200: 6c 20 66 69 6c 65 20 69 73 0a 23 20 20 20 20 20  l file is.#     
7210: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
7220: 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
7230: 73 20 77 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66  s when a multi-f
7240: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ile transaction 
7250: 69 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  is .#           
7260: 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 28 69      committed (i
7270: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 66 69  nstead of the fi
7280: 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
7290: 74 65 73 20 62 65 69 6e 67 20 7a 65 72 6f 65 64  tes being zeroed
72a0: 29 2e 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70  )..#.#.do_test p
72b0: 61 67 65 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20  ager1-5.1.1 {.  
72c0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
72d0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
72e0: 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43  csql {.    ATTAC
72f0: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
7300: 61 75 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20  aux;.    CREATE 
7310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
7320: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7330: 20 61 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20   aux.t2(a, b);. 
7340: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7350: 31 20 56 41 4c 55 45 53 28 31 37 2c 20 27 4c 65  1 VALUES(17, 'Le
7360: 6e 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  nin');.    INSER
7370: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
7380: 28 32 32 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a  (22, 'Stalin');.
7390: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
73a0: 74 31 20 56 41 4c 55 45 53 28 35 33 2c 20 27 4b  t1 VALUES(53, 'K
73b0: 68 72 75 73 68 63 68 65 76 27 29 3b 0a 20 20 7d  hrushchev');.  }
73c0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
73d0: 67 65 72 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65  ger1-5.1.2 {.  e
73e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
73f0: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
7400: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
7410: 36 34 2c 20 27 42 72 65 7a 68 6e 65 76 27 29 3b  64, 'Brezhnev');
7420: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
7430: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46  TO t2 SELECT * F
7440: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71  ROM t1;.  }.  sq
7450: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
7460: 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  b2.  execsql {. 
7470: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
7480: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
7490: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64  ;.  } db2.} {}.d
74a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
74b0: 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.3 {.  catchsql
74c0: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61   COMMIT.} {1 {da
74d0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
74e0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }}.do_test pager
74f0: 31 2d 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63  1-5.1.4 {.  exec
7500: 73 71 6c 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20  sql COMMIT db2. 
7510: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
7520: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
7530: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64  CT * FROM t2 } d
7540: 62 32 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32  b2.} {17 Lenin 2
7550: 32 20 53 74 61 6c 69 6e 20 35 33 20 4b 68 72 75  2 Stalin 53 Khru
7560: 73 68 63 68 65 76 20 36 34 20 42 72 65 7a 68 6e  shchev 64 Brezhn
7570: 65 76 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ev}.do_test page
7580: 72 31 2d 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32  r1-5.1.5 {.  db2
7590: 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f   close.} {}..do_
75a0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 32 2e  test pager1-5.2.
75b0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
75c0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
75d0: 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79  al_mode = memory
75e0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
75f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7600: 31 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e  1 VALUES(84, 'An
7610: 64 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 20 20  dropov');.      
7620: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
7630: 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f  ALUES(84, 'Andro
7640: 70 6f 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  pov');.    COMMI
7650: 54 3b 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79  T;.  }.} {memory
7660: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
7670: 2d 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  -5.3.1 {.  execs
7680: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
7690: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f  journal_mode = o
76a0: 66 66 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ff;.    BEGIN;. 
76b0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
76c0: 20 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27   t1 VALUES(85, '
76d0: 47 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20  Gorbachev');.   
76e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
76f0: 32 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f  2 VALUES(85, 'Go
7700: 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43  rbachev');.    C
7710: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66  OMMIT;.  }.} {of
7720: 66 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  f}..do_test page
7730: 72 31 2d 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20  r1-5.4.1 {.  db 
7740: 63 6c 6f 73 65 0a 20 20 74 65 73 74 76 66 73 20  close.  testvfs 
7750: 74 76 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  tv.  sqlite3 db 
7760: 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a  test.db -vfs tv.
7770: 20 20 65 78 65 63 73 71 6c 20 7b 20 41 54 54 41    execsql { ATTA
7780: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
7790: 20 61 75 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c   aux }..  tv fil
77a0: 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 76  ter xDelete.  tv
77b0: 20 73 63 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72   script max_jour
77c0: 6e 61 6c 5f 73 69 7a 65 0a 20 20 74 76 20 73 65  nal_size.  tv se
77d0: 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 20 20 73  ctorsize 512.  s
77e0: 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  et ::max_journal
77f0: 20 30 0a 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f   0.  proc max_jo
7800: 75 72 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68  urnal_size {meth
7810: 6f 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73  od args} {.    s
7820: 65 74 20 73 7a 20 30 0a 20 20 20 20 63 61 74 63  et sz 0.    catc
7830: 68 20 7b 20 73 65 74 20 73 7a 20 5b 66 69 6c 65  h { set sz [file
7840: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
7850: 75 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20  urnal] }.    if 
7860: 7b 24 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f  {$sz > $::max_jo
7870: 75 72 6e 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73  urnal} {.      s
7880: 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  et ::max_journal
7890: 20 24 73 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72   $sz.    }.    r
78a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
78b0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
78c0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
78d0: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
78e0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e  ;.    PRAGMA syn
78f0: 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41  chronous = NORMA
7900: 4c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  L;.    BEGIN;.  
7910: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7920: 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47  t1 VALUES(85, 'G
7930: 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20  orbachev');.    
7940: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
7950: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
7960: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f  bachev');.    CO
7970: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 73 65 74 20  MMIT;.  }.  set 
7980: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 0a 7d 20  ::max_journal.} 
7990: 5b 65 78 70 72 20 32 36 31 35 2b 5b 73 74 72 69  [expr 2615+[stri
79a0: 6e 67 20 6c 65 6e 67 74 68 20 5b 70 77 64 5d 5d  ng length [pwd]]
79b0: 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ].do_test pager1
79c0: 2d 35 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20 3a  -5.4.2 {.  set :
79d0: 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20  :max_journal 0. 
79e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
79f0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
7a00: 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45  s = full;.    BE
7a10: 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  GIN;.      DELET
7a20: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
7a30: 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20  b = 'Lenin';.   
7a40: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
7a50: 32 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e  2 WHERE b = 'Len
7a60: 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  in';.    COMMIT;
7a70: 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78  .  }.  set ::max
7a80: 5f 6a 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72  _journal.} [expr
7a90: 20 33 31 31 31 2b 5b 73 74 72 69 6e 67 20 6c 65   3111+[string le
7aa0: 6e 67 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 62 20  ngth [pwd]]].db 
7ab0: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
7ac0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7ad0: 35 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  5.5.1 {.  sqlite
7ae0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
7af0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54  xecsql { .    AT
7b00: 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20  TACH 'test.db2' 
7b10: 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47  AS aux;.    PRAG
7b20: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7b30: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43  = PERSIST;.    C
7b40: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
7b50: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
7b60: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
7b70: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
7b80: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
7b90: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
7ba0: 55 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20  UPDATE t3 SET b 
7bb0: 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  = randomblob(150
7bc0: 30 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 5b  0);.  }.  expr [
7bd0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
7be0: 62 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35 30  b-journal] > 150
7bf0: 30 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  00.} {1}.do_test
7c00: 20 70 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b 0a   pager1-5.5.2 {.
7c10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
7c20: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
7c30: 75 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42  us = full;.    B
7c40: 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
7c50: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
7c60: 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20   b = 'Stalin';. 
7c70: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
7c80: 20 74 32 20 57 48 45 52 45 20 62 20 3d 20 27 53   t2 WHERE b = 'S
7c90: 74 61 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d  talin';.    COMM
7ca0: 49 54 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  IT;.  }.  file s
7cb0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
7cc0: 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d  nal.} {0}...#---
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
7d20: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72  lowing tests wor
7d30: 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41 20 6d  k with "PRAGMA m
7d40: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a 23  ax_page_count".#
7d50: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7d60: 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  6.1 {.  faultsim
7d70: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
7d80: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
7d90: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
7da0: 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20 20  acuum = none;.  
7db0: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67    PRAGMA max_pag
7dc0: 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20 20  e_count = 10;.  
7dd0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7de0: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  2(a, b);.    CRE
7df0: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
7e00: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
7e10: 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20  ABLE t4(a, b);. 
7e20: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7e30: 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t5(a, b);.    CR
7e40: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c  EATE TABLE t6(a,
7e50: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
7e60: 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a  TABLE t7(a, b);.
7e70: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7e80: 20 74 38 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t8(a, b);.    C
7e90: 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 61  REATE TABLE t9(a
7ea0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
7eb0: 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20 62 29   TABLE t10(a, b)
7ec0: 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f 5f  ;.  }.} {10}.do_
7ed0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61  catchsql_test pa
7ee0: 67 65 72 31 2d 36 2e 32 20 7b 0a 20 20 43 52 45  ger1-6.2 {.  CRE
7ef0: 41 54 45 20 54 41 42 4c 45 20 74 31 31 28 61 2c  ATE TABLE t11(a,
7f00: 20 62 29 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61   b).} {1 {databa
7f10: 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
7f20: 6c 6c 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ll}}.do_execsql_
7f30: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 34 20  test pager1-6.4 
7f40: 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67  { PRAGMA max_pag
7f50: 65 5f 63 6f 75 6e 74 20 20 20 20 20 20 7d 20 7b  e_count      } {
7f60: 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  10}.do_execsql_t
7f70: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 35 20 7b  est pager1-6.5 {
7f80: 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65   PRAGMA max_page
7f90: 5f 63 6f 75 6e 74 20 3d 20 31 35 20 7d 20 7b 31  _count = 15 } {1
7fa0: 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  5}.do_execsql_te
7fb0: 73 74 20 70 61 67 65 72 31 2d 36 2e 36 20 7b 20  st pager1-6.6 { 
7fc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 31  CREATE TABLE t11
7fd0: 28 61 2c 20 62 29 20 20 20 20 20 7d 20 7b 7d 0a  (a, b)     } {}.
7fe0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7ff0: 70 61 67 65 72 31 2d 36 2e 37 20 7b 0a 20 20 42  pager1-6.7 {.  B
8000: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
8010: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53   INTO t11 VALUES
8020: 28 31 2c 20 32 29 3b 0a 20 20 20 20 50 52 41 47  (1, 2);.    PRAG
8030: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
8040: 74 20 3d 20 31 33 3b 0a 7d 20 7b 31 33 7d 0a 64  t = 13;.} {13}.d
8050: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
8060: 61 67 65 72 31 2d 36 2e 38 20 7b 0a 20 20 20 20  ager1-6.8 {.    
8070: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
8080: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
8090: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67    PRAGMA max_pag
80a0: 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 7d 20  e_count = 10;.} 
80b0: 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {11}.do_execsql_
80c0: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 39 20  test pager1-6.9 
80d0: 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a 64  { COMMIT } {}..d
80e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
80f0: 61 67 65 72 31 2d 36 2e 31 30 20 7b 20 50 52 41  ager1-6.10 { PRA
8100: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
8110: 6e 74 20 3d 20 31 30 20 7d 20 7b 31 31 7d 0a 64  nt = 10 } {11}.d
8120: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
8130: 61 67 65 72 31 2d 36 2e 31 31 20 7b 20 53 45 4c  ager1-6.11 { SEL
8140: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31 20 7d  ECT * FROM t11 }
8150: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33            {1 2 3
8160: 20 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   4}.do_execsql_t
8170: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 32 20  est pager1-6.12 
8180: 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67  { PRAGMA max_pag
8190: 65 5f 63 6f 75 6e 74 20 7d 20 20 20 20 20 20 7b  e_count }      {
81a0: 31 31 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  11}...#---------
81b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81f0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
8200: 20 74 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68   tests work with
8210: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
8220: 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 22 20  _mode=TRUNCATE" 
8230: 61 6e 64 0a 23 20 22 50 52 41 47 4d 41 20 6c 6f  and.# "PRAGMA lo
8240: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
8250: 53 49 56 45 22 2e 0a 23 0a 23 20 45 61 63 68 20  SIVE"..#.# Each 
8260: 74 65 73 74 20 69 73 20 73 70 65 63 69 66 69 65  test is specifie
8270: 64 20 77 69 74 68 20 35 20 76 61 72 69 61 62 6c  d with 5 variabl
8280: 65 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a  es. As follows:.
8290: 23 0a 23 20 20 20 24 74 6e 3a 20 20 54 65 73 74  #.#   $tn:  Test
82a0: 20 4e 75 6d 62 65 72 2e 20 55 73 65 64 20 61 73   Number. Used as
82b0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 5b 64 6f   part of the [do
82c0: 5f 74 65 73 74 5d 20 74 65 73 74 20 6e 61 6d 65  _test] test name
82d0: 73 2e 0a 23 20 20 20 24 73 71 6c 3a 20 53 51 4c  s..#   $sql: SQL
82e0: 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 23 20 20   to execute..#  
82f0: 20 24 72 65 73 3a 20 45 78 70 65 63 74 65 64 20   $res: Expected 
8300: 72 65 73 75 6c 74 20 6f 66 20 65 78 65 63 75 74  result of execut
8310: 69 6e 67 20 24 73 71 6c 2e 0a 23 20 20 20 24 6a  ing $sql..#   $j
8320: 73 3a 20 20 54 68 65 20 65 78 70 65 63 74 65 64  s:  The expected
8330: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
8340: 72 6e 61 6c 20 66 69 6c 65 2c 20 69 6e 20 62 79  rnal file, in by
8350: 74 65 73 2c 20 61 66 74 65 72 20 65 78 65 63 75  tes, after execu
8360: 74 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20 74  ting.#         t
8370: 68 65 20 53 51 4c 20 73 63 72 69 70 74 2e 20 4f  he SQL script. O
8380: 72 20 2d 31 20 69 66 20 74 68 65 20 6a 6f 75 72  r -1 if the jour
8390: 6e 61 6c 20 69 73 20 6e 6f 74 20 65 78 70 65 63  nal is not expec
83a0: 74 65 64 20 74 6f 20 65 78 69 73 74 2e 0a 23 20  ted to exist..# 
83b0: 20 20 24 77 73 3a 20 20 54 68 65 20 65 78 70 65    $ws:  The expe
83c0: 63 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  cted size of the
83d0: 20 57 41 4c 20 66 69 6c 65 2c 20 69 6e 20 62 79   WAL file, in by
83e0: 74 65 73 2c 20 61 66 74 65 72 20 65 78 65 63 75  tes, after execu
83f0: 74 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20 74  ting.#         t
8400: 68 65 20 53 51 4c 20 73 63 72 69 70 74 2e 20 4f  he SQL script. O
8410: 72 20 2d 31 20 69 66 20 74 68 65 20 57 41 4c 20  r -1 if the WAL 
8420: 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20  is not expected 
8430: 74 6f 20 65 78 69 73 74 2e 0a 23 0a 69 66 63 61  to exist..#.ifca
8440: 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 66 61  pable wal {.  fa
8450: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
8460: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
8470: 63 68 20 7b 74 6e 20 73 71 6c 20 72 65 73 20 6a  ch {tn sql res j
8480: 73 20 77 73 7d 20 5b 73 75 62 73 74 20 7b 0a 20  s ws} [subst {. 
8490: 20 0a 20 20 20 20 31 20 20 7b 0a 20 20 20 20 20   .    1  {.     
84a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
84b0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 50 52  (a, b);.      PR
84c0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
84d0: 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47  =OFF;.      PRAG
84e0: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  MA synchronous=N
84f0: 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41  ORMAL;.      PRA
8500: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 31 30  GMA page_size=10
8510: 32 34 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  24;.      PRAGMA
8520: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
8530: 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 50  CLUSIVE;.      P
8540: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8550: 64 65 3d 54 52 55 4e 43 41 54 45 3b 0a 20 20 20  de=TRUNCATE;.   
8560: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8570: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
8580: 20 20 20 20 7d 20 7b 65 78 63 6c 75 73 69 76 65      } {exclusive
8590: 20 74 72 75 6e 63 61 74 65 7d 20 30 20 2d 31 0a   truncate} 0 -1.
85a0: 20 20 0a 20 20 20 20 32 20 20 7b 0a 20 20 20 20    .    2  {.    
85b0: 20 20 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54    BEGIN IMMEDIAT
85c0: 45 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  E;.        SELEC
85d0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
85e0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
85f0: 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20   {1 2} 0 -1.  . 
8600: 20 20 20 33 20 20 7b 0a 20 20 20 20 20 20 42 45     3  {.      BE
8610: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c  GIN;.        SEL
8620: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
8630: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20       COMMIT;.   
8640: 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20   } {1 2} 0 -1.  
8650: 0a 20 20 20 20 34 20 20 7b 20 50 52 41 47 4d 41  .    4  { PRAGMA
8660: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
8670: 57 41 4c 20 7d 20 20 20 20 77 61 6c 20 20 20 20  WAL }    wal    
8680: 20 20 20 2d 31 20 2d 31 0a 20 20 20 20 35 20 20     -1 -1.    5  
8690: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
86a0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 20   VALUES(3, 4) } 
86b0: 20 7b 7d 20 20 20 20 20 20 20 20 2d 31 20 5b 77   {}        -1 [w
86c0: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31  al_file_size 1 1
86d0: 30 32 34 5d 0a 20 20 20 20 36 20 20 7b 20 50 52  024].    6  { PR
86e0: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
86f0: 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20 65 78 63  e = NORMAL } exc
8700: 6c 75 73 69 76 65 20 2d 31 20 5b 77 61 6c 5f 66  lusive -1 [wal_f
8710: 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d  ile_size 1 1024]
8720: 0a 20 20 20 20 37 20 20 7b 20 49 4e 53 45 52 54  .    7  { INSERT
8730: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8740: 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20 20  5, 6); } {}     
8750: 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f     -1 [wal_file_
8760: 73 69 7a 65 20 32 20 31 30 32 34 5d 0a 20 20 0a  size 2 1024].  .
8770: 20 20 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20      8  { PRAGMA 
8780: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54  journal_mode = T
8790: 52 55 4e 43 41 54 45 20 7d 20 74 72 75 6e 63 61  RUNCATE } trunca
87a0: 74 65 20 20 20 20 20 20 20 20 20 20 30 20 2d 31  te          0 -1
87b0: 0a 20 20 20 20 39 20 20 7b 20 49 4e 53 45 52 54  .    9  { INSERT
87c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
87d0: 37 2c 20 38 29 20 7d 20 20 20 20 7b 7d 20 20 20  7, 8) }    {}   
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 2d               0 -
87f0: 31 0a 20 20 20 20 31 30 20 7b 20 53 45 4c 45 43  1.    10 { SELEC
8800: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20  T * FROM t1 }   
8810: 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 20 32              {1 2
8820: 20 33 20 34 20 35 20 36 20 37 20 38 7d 20 30 20   3 4 5 6 7 8} 0 
8830: 2d 31 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20 20 20  -1.  .  }] {.   
8840: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
8850: 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e   pager1-7.1.$tn.
8860: 31 20 24 73 71 6c 20 24 72 65 73 0a 20 20 20 20  1 $sql $res.    
8870: 63 61 74 63 68 20 7b 20 73 65 74 20 4a 20 2d 31  catch { set J -1
8880: 20 3b 20 73 65 74 20 4a 20 5b 66 69 6c 65 20 73   ; set J [file s
8890: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
88a0: 6e 61 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63 68  nal] }.    catch
88b0: 20 7b 20 73 65 74 20 57 20 2d 31 20 3b 20 73 65   { set W -1 ; se
88c0: 74 20 57 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  t W [file size t
88d0: 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20 20  est.db-wal] }.  
88e0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
88f0: 2d 37 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69 73  -7.1.$tn.2 { lis
8900: 74 20 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74 20  t $J $W } [list 
8910: 24 6a 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a  $js $ws].  }.}..
8920: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37  do_test pager1-7
8930: 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.1 {.  faultsi
8940: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
8950: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
8960: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
8970: 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53  ng_mode = EXCLUS
8980: 49 56 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20  IVE;.    CREATE 
8990: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
89a0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
89b0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
89c0: 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20  mode = delete;. 
89d0: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
89e0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 74 72 75 6e 63  nal_mode = trunc
89f0: 61 74 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c  ate;.  }.} {excl
8a00: 75 73 69 76 65 20 64 65 6c 65 74 65 20 74 72 75  usive delete tru
8a10: 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70  ncate}.do_test p
8a20: 61 67 65 72 31 2d 37 2e 32 2e 32 20 7b 0a 20 20  ager1-7.2.2 {.  
8a30: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
8a40: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8a50: 31 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71  1, 2) }.  execsq
8a60: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
8a70: 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73  al_mode = persis
8a80: 74 20 7d 0a 7d 20 7b 74 72 75 6e 63 61 74 65 7d  t }.} {truncate}
8a90: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
8aa0: 37 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  7.2.3 {.  execsq
8ab0: 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65  l { COMMIT }.  e
8ac0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
8ad0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8ae0: 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20   = persist;.    
8af0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73  PRAGMA journal_s
8b00: 69 7a 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d  ize_limit;.  }.}
8b10: 20 7b 70 65 72 73 69 73 74 20 2d 31 7d 0a 0a 23   {persist -1}..#
8b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
8b70: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c  following tests,
8b80: 20 70 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65 73   pager1-8.*, tes
8b90: 74 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69  t that the speci
8ba0: 61 6c 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23 20  al filenames .# 
8bb0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20 22  ":memory:" and "
8bc0: 22 20 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72 79  " open temporary
8bd0: 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f   databases..#.fo
8be0: 72 65 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61  reach {tn filena
8bf0: 6d 65 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72  me} {.  1 :memor
8c00: 79 3a 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20  y:.  2 "".} {.  
8c10: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38  do_test pager1-8
8c20: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75  .$tn.1 {.    fau
8c30: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
8c40: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 63  _reopen.    db c
8c50: 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  lose.    sqlite3
8c60: 20 64 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20   db $filename.  
8c70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
8c80: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
8c90: 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  cuum = 1;.      
8ca0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31 28  CREATE TABLE x1(
8cb0: 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  x);.      INSERT
8cc0: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
8cd0: 27 43 68 61 72 6c 65 73 27 29 3b 0a 20 20 20 20  'Charles');.    
8ce0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
8cf0: 20 56 41 4c 55 45 53 28 27 4a 61 6d 65 73 27 29   VALUES('James')
8d00: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
8d10: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 4d  NTO x1 VALUES('M
8d20: 61 72 79 27 29 3b 0a 20 20 20 20 20 20 53 45 4c  ary');.      SEL
8d30: 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a 20  ECT * FROM x1;. 
8d40: 20 20 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c 65     }.  } {Charle
8d50: 73 20 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a 20  s James Mary}.. 
8d60: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
8d70: 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71  8.$tn.2 {.    sq
8d80: 6c 69 74 65 33 20 64 62 32 20 24 66 69 6c 65 6e  lite3 db2 $filen
8d90: 61 6d 65 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ame.    catchsql
8da0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
8db0: 20 78 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31   x1 } db2.  } {1
8dc0: 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   {no such table:
8dd0: 20 78 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65 63   x1}}..  do_exec
8de0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
8df0: 38 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42 45  8.$tn.3 {.    BE
8e00: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
8e10: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
8e20: 28 27 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20 20  ('William');.   
8e30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
8e40: 31 20 56 41 4c 55 45 53 28 27 41 6e 6e 65 27 29  1 VALUES('Anne')
8e50: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
8e60: 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d    } {}.}..#-----
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8eb0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20  ----.# The next 
8ec0: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d  block of tests -
8ed0: 20 70 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64 65   pager1-9.* - de
8ee0: 61 6c 20 77 69 74 68 20 69 6e 74 65 72 61 63 74  al with interact
8ef0: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 23 20 74  ions between.# t
8f00: 68 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  he pager and the
8f10: 20 62 61 63 6b 75 70 20 41 50 49 2e 20 54 65 73   backup API. Tes
8f20: 74 20 63 61 73 65 73 3a 0a 23 0a 23 20 20 20 70  t cases:.#.#   p
8f30: 61 67 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65 73  ager1-9.1.*: Tes
8f40: 74 20 74 68 61 74 20 61 20 62 61 63 6b 75 70 20  t that a backup 
8f50: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
8f60: 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66 20 74  sfully even if t
8f70: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
8f80: 20 20 20 20 20 73 6f 75 72 63 65 20 64 62 20 69       source db i
8f90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 75 72  s written to dur
8fa0: 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 6f  ing the backup o
8fb0: 70 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  p..#.#   pager1-
8fc0: 39 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  9.2.*: Test that
8fd0: 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65   a backup comple
8fe0: 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  tes successfully
8ff0: 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20   even if the.#  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9010: 6f 75 72 63 65 20 64 62 20 69 73 20 77 72 69 74  ource db is writ
9020: 74 65 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e 20  ten to and then 
9030: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 64 75 72 69  rolled back duri
9040: 6e 67 20 61 20 0a 23 20 20 20 20 20 20 20 20 20  ng a .#         
9050: 20 20 20 20 20 20 20 20 62 61 63 6b 75 70 20 6f          backup o
9060: 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  peration..#.do_t
9070: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 31  est pager1-9.0.1
9080: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
9090: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
90a0: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
90b0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
90c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
90d0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
90e0: 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  10;.    BEGIN;. 
90f0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
9100: 45 20 61 62 28 61 2c 20 62 2c 20 55 4e 49 51 55  E ab(a, b, UNIQU
9110: 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 20 20  E(a, b));.      
9120: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56  INSERT INTO ab V
9130: 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28  ALUES( a_string(
9140: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9150: 30 30 29 20 29 3b 0a 20 20 20 20 20 20 49 4e 53  00) );.      INS
9160: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
9170: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
9180: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
9190: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
91a0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
91b0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
91c0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
91d0: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
91e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
91f0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
9200: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9210: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
9220: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
9230: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
9240: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
9250: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
9260: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9270: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
9280: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
9290: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
92a0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
92b0: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
92c0: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
92d0: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
92e0: 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  b;.      INSERT 
92f0: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
9300: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
9310: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
9320: 20 61 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b   ab;.    COMMIT;
9330: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
9340: 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 32 20 7b  t pager1-9.0.2 {
9350: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
9360: 65 73 74 2e 64 62 32 0a 20 20 64 62 32 20 65 76  est.db2.  db2 ev
9370: 61 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68  al { PRAGMA cach
9380: 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20  e_size = 10 }.  
9390: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42  sqlite3_backup B
93a0: 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69   db2 main db mai
93b0: 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70  n.  list [B step
93c0: 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73   10000] [B finis
93d0: 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e  h].} {SQLITE_DON
93e0: 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f  E SQLITE_OK}.do_
93f0: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e  test pager1-9.0.
9400: 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c  3 {. db one {SEL
9410: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
9420: 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32   FROM ab}.} [db2
9430: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35   one {SELECT md5
9440: 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61  sum(a, b) FROM a
9450: 62 7d 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  b}]..do_test pag
9460: 65 72 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78  er1-9.1.1 {.  ex
9470: 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61  ecsql { UPDATE a
9480: 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69  b SET a = a_stri
9490: 6e 67 28 32 30 31 29 20 7d 0a 20 20 73 71 6c 69  ng(201) }.  sqli
94a0: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
94b0: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
94c0: 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c  B step 30.} {SQL
94d0: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
94e0: 70 61 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a 20  pager1-9.1.2 {. 
94f0: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
9500: 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73  E ab SET b = a_s
9510: 74 72 69 6e 67 28 33 30 31 29 20 7d 0a 20 20 6c  tring(301) }.  l
9520: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
9530: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
9540: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
9550: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
9560: 70 61 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a 20  pager1-9.1.3 {. 
9570: 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  db one {SELECT m
9580: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
9590: 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20   ab}.} [db2 one 
95a0: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
95b0: 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64  , b) FROM ab}].d
95c0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
95d0: 31 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20  1.4 { execsql { 
95e0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
95f0: 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38  FROM ab } } {128
9600: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
9610: 31 2d 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63  1-9.2.1 {.  exec
9620: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20  sql { UPDATE ab 
9630: 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67  SET a = a_string
9640: 28 32 30 32 29 20 7d 0a 20 20 73 71 6c 69 74 65  (202) }.  sqlite
9650: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d  3_backup B db2 m
9660: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20  ain db main.  B 
9670: 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54  step 30.} {SQLIT
9680: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
9690: 67 65 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20 65  ger1-9.2.2 {.  e
96a0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45  xecsql { .    BE
96b0: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
96c0: 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73  E ab SET b = a_s
96d0: 74 72 69 6e 67 28 33 30 31 29 3b 0a 20 20 20 20  tring(301);.    
96e0: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20  ROLLBACK;.  }.  
96f0: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
9700: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
9710: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
9720: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9730: 20 70 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b 0a   pager1-9.2.3 {.
9740: 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20   db one {SELECT 
9750: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9760: 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65  M ab}.} [db2 one
9770: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
9780: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a  a, b) FROM ab}].
9790: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
97a0: 2e 32 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b  .2.4 { execsql {
97b0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
97c0: 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32   FROM ab } } {12
97d0: 38 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20  8}.db close.db2 
97e0: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70  close..do_test p
97f0: 61 67 65 72 31 2d 39 2e 33 2e 31 20 7b 0a 20 20  ager1-9.3.1 {.  
9800: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
9810: 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74 6f  ult 1.  tv secto
9820: 72 73 69 7a 65 20 34 30 39 36 0a 20 20 66 61 75  rsize 4096.  fau
9830: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
9840: 5f 72 65 6f 70 65 6e 0a 0a 20 20 65 78 65 63 73  _reopen..  execs
9850: 71 6c 20 7b 20 50 52 41 47 4d 41 20 70 61 67 65  ql { PRAGMA page
9860: 5f 73 69 7a 65 20 3d 20 31 30 32 34 20 7d 0a 20  _size = 1024 }. 
9870: 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20   for {set ii 0} 
9880: 7b 24 69 69 20 3c 20 34 7d 20 7b 69 6e 63 72 20  {$ii < 4} {incr 
9890: 69 69 7d 20 7b 20 65 78 65 63 73 71 6c 20 22 43  ii} { execsql "C
98a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 24 7b 69  REATE TABLE t${i
98b0: 69 7d 28 61 2c 20 62 29 22 20 7d 0a 7d 20 7b 7d  i}(a, b)" }.} {}
98c0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
98d0: 39 2e 33 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  9.3.2 {.  sqlite
98e0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 0a  3 db2 test.db2..
98f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
9900: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
9910: 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 50 52 41   = 4096;.    PRA
9920: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
9930: 3d 20 4f 46 46 3b 0a 20 20 20 20 43 52 45 41 54  = OFF;.    CREAT
9940: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
9950: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
9960: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 7d  LE t2(a, b);.  }
9970: 20 64 62 32 0a 0a 20 20 73 71 6c 69 74 65 33 5f   db2..  sqlite3_
9980: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
9990: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74  n db main.  B st
99a0: 65 70 20 33 30 0a 20 20 6c 69 73 74 20 5b 42 20  ep 30.  list [B 
99b0: 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66  step 10000] [B f
99c0: 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45  inish].} {SQLITE
99d0: 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d  _DONE SQLITE_OK}
99e0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
99f0: 39 2e 33 2e 33 20 7b 0a 20 20 64 62 32 20 63 6c  9.3.3 {.  db2 cl
9a00: 6f 73 65 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  ose.  db close. 
9a10: 20 74 76 20 64 65 6c 65 74 65 0a 20 20 66 69 6c   tv delete.  fil
9a20: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 32 0a  e size test.db2.
9a30: 7d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  } [file size tes
9a40: 74 2e 64 62 5d 0a 0a 64 6f 5f 74 65 73 74 20 70  t.db]..do_test p
9a50: 61 67 65 72 31 2d 39 2e 34 2e 31 20 7b 0a 20 20  ager1-9.4.1 {.  
9a60: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
9a70: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c  and_reopen.  sql
9a80: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
9a90: 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  2.  execsql {.  
9aa0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
9ab0: 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 43  ze = 4096;.    C
9ac0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
9ad0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
9ae0: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
9af0: 0a 20 20 7d 20 64 62 32 0a 20 20 73 71 6c 69 74  .  } db2.  sqlit
9b00: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
9b10: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c  main db main.  l
9b20: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
9b30: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
9b40: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
9b50: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
9b60: 70 61 67 65 72 31 2d 39 2e 34 2e 32 20 7b 0a 20  pager1-9.4.2 {. 
9b70: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65   list [file size
9b80: 20 74 65 73 74 2e 64 62 32 5d 20 5b 66 69 6c 65   test.db2] [file
9b90: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 7d   size test.db].}
9ba0: 20 7b 30 20 30 7d 0a 64 62 32 20 63 6c 6f 73 65   {0 0}.db2 close
9bb0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
9bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
9c00: 65 73 74 20 74 68 61 74 20 72 65 67 61 72 64 6c  est that regardl
9c10: 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
9c20: 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 53 65   returned by xSe
9c30: 63 74 6f 72 53 69 7a 65 28 29 2c 20 74 68 65 0a  ctorSize(), the.
9c40: 23 20 6d 69 6e 69 6d 75 6d 20 65 66 66 65 63 74  # minimum effect
9c50: 69 76 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  ive sector-size 
9c60: 69 73 20 35 31 32 20 61 6e 64 20 74 68 65 20 6d  is 512 and the m
9c70: 61 78 69 6d 75 6d 20 36 35 35 33 36 20 62 79 74  aximum 65536 byt
9c80: 65 73 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  es..#.testvfs tv
9c90: 20 2d 64 65 66 61 75 6c 74 20 31 0a 66 6f 72 65   -default 1.fore
9ca0: 61 63 68 20 73 65 63 74 6f 72 73 69 7a 65 20 7b  ach sectorsize {
9cb0: 0a 20 20 20 20 33 32 20 20 20 36 34 20 20 20 31  .    32   64   1
9cc0: 32 38 20 20 20 32 35 36 20 20 20 35 31 32 20 20  28   256   512  
9cd0: 20 31 30 32 34 20 20 20 32 30 34 38 20 0a 20 20   1024   2048 .  
9ce0: 20 20 34 30 39 36 20 38 31 39 32 20 31 36 33 38    4096 8192 1638
9cf0: 34 20 33 32 37 36 38 20 36 35 35 33 36 20 31 33  4 32768 65536 13
9d00: 31 30 37 32 20 32 36 32 31 34 34 0a 7d 20 7b 0a  1072 262144.} {.
9d10: 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20    tv sectorsize 
9d20: 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 73 65  $sectorsize.  se
9d30: 74 20 65 66 66 20 24 73 65 63 74 6f 72 73 69 7a  t eff $sectorsiz
9d40: 65 0a 20 20 69 66 20 7b 24 73 65 63 74 6f 72 73  e.  if {$sectors
9d50: 69 7a 65 20 3c 20 35 31 32 7d 20 20 20 7b 20 73  ize < 512}   { s
9d60: 65 74 20 65 66 66 20 35 31 32 20 7d 0a 20 20 69  et eff 512 }.  i
9d70: 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3e  f {$sectorsize >
9d80: 20 36 35 35 33 36 7d 20 7b 20 73 65 74 20 65 66   65536} { set ef
9d90: 66 20 36 35 35 33 36 20 7d 0a 0a 20 20 64 6f 5f  f 65536 }..  do_
9da0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24  test pager1-10.$
9db0: 73 65 63 74 6f 72 73 69 7a 65 2e 31 20 7b 0a 20  sectorsize.1 {. 
9dc0: 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65     faultsim_dele
9dd0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
9de0: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
9df0: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20  ng a_string.    
9e00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
9e10: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
9e20: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
9e30: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
9e40: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
9e50: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
9e60: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9e70: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
9e80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9e90: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20  2(a, b);.       
9ea0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
9eb0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 4f  (a, b);.      CO
9ec0: 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  MMIT;.    }.    
9ed0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
9ee0: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d 20 5b 65  b-journal.  } [e
9ef0: 78 70 72 20 24 73 65 63 74 6f 72 73 69 7a 65 20  xpr $sectorsize 
9f00: 3e 20 36 35 35 33 36 20 3f 20 36 35 35 33 36 20  > 65536 ? 65536 
9f10: 3a 20 24 73 65 63 74 6f 72 73 69 7a 65 5d 0a 0a  : $sectorsize]..
9f20: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
9f30: 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e  -10.$sectorsize.
9f40: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
9f50: 7b 20 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  { .      INSERT 
9f60: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 61  INTO t3 VALUES(a
9f70: 5f 73 74 72 69 6e 67 28 33 30 30 29 2c 20 61 5f  _string(300), a_
9f80: 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20  string(300));.  
9f90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9fa0: 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t3 SELECT * FROM
9fb0: 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20   t3;        /*  
9fc0: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
9fd0: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
9fe0: 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20   * FROM t3;     
9ff0: 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20     /*  4 */.    
a000: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
a010: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
a020: 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 38 20  3;        /*  8 
a030: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
a040: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a  INTO t3 SELECT *
a050: 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20   FROM t3;       
a060: 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20   /* 16 */.      
a070: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
a080: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
a090: 20 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f          /* 32 */
a0a0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20  .    }.  } {}.. 
a0b0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
a0c0: 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 33  10.$sectorsize.3
a0d0: 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a   {.    db close.
a0e0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
a0f0: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
a100: 71 6c 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  ql { .      PRAG
a110: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
a120: 31 30 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  10;.      BEGIN;
a130: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72  .    }.    recur
a140: 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74  sive_select 32 t
a150: 33 20 7b 64 62 20 65 76 61 6c 20 22 49 4e 53 45  3 {db eval "INSE
a160: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
a170: 53 28 31 2c 20 32 29 22 7d 0a 20 20 20 20 65 78  S(1, 2)"}.    ex
a180: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f  ecsql {.      CO
a190: 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53 45 4c 45  MMIT;.      SELE
a1a0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
a1b0: 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 0a 20    }.  } {1 2}.. 
a1c0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
a1d0: 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 34  10.$sectorsize.4
a1e0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
a1f0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
a200: 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20  BLE t6(a, b);.  
a210: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a220: 20 74 37 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t7(a, b);.     
a230: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
a240: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 44 52  (a, b);.      DR
a250: 4f 50 20 54 41 42 4c 45 20 74 36 3b 0a 20 20 20  OP TABLE t6;.   
a260: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 37     DROP TABLE t7
a270: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63  ;.    }.    exec
a280: 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49  sql {.      BEGI
a290: 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  N;.        CREAT
a2a0: 45 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29  E TABLE t6(a, b)
a2b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75  ;.    }.    recu
a2c0: 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20  rsive_select 32 
a2d0: 74 33 20 7b 64 62 20 65 76 61 6c 20 22 49 4e 53  t3 {db eval "INS
a2e0: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
a2f0: 45 53 28 31 2c 20 32 29 22 7d 0a 20 20 20 20 65  ES(1, 2)"}.    e
a300: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
a310: 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53 45 4c  OMMIT;.      SEL
a320: 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 3b 0a 20  ECT * FROM t5;. 
a330: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20     }.  } {1 2}. 
a340: 20 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 74 76   .}.db close..tv
a350: 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39 36   sectorsize 4096
a360: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
a370: 31 30 2e 78 2e 31 20 7b 0a 20 20 66 61 75 6c 74  10.x.1 {.  fault
a380: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
a390: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
a3a0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
a3b0: 6f 5f 76 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b  o_vacuum = none;
a3c0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
a3d0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
a3e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a3f0: 31 28 78 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20  1(x);.  }.  for 
a400: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 33 30  {set i 0} {$i<30
a410: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
a420: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
a430: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
a440: 28 7a 65 72 6f 62 6c 6f 62 28 39 30 30 29 29 20  (zeroblob(900)) 
a450: 7d 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a  }.  }.  file siz
a460: 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 33 32 37  e test.db.} {327
a470: 36 38 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  68}.do_test page
a480: 72 31 2e 31 30 2e 78 2e 32 20 7b 0a 20 20 65 78  r1.10.x.2 {.  ex
a490: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
a4a0: 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a  TE TABLE t2(x);.
a4b0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
a4c0: 32 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  2;.  }.  file si
a4d0: 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 33 33  ze test.db.} {33
a4e0: 37 39 32 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  792}.do_test pag
a4f0: 65 72 31 2e 31 30 2e 78 2e 33 20 7b 0a 20 20 65  er1.10.x.3 {.  e
a500: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
a510: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
a520: 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 7d 0a  ABLE t2(x);.  }.
a530: 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65    recursive_sele
a540: 63 74 20 33 30 20 74 31 0a 20 20 65 78 65 63 73  ct 30 t1.  execs
a550: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
a560: 54 41 42 4c 45 20 74 33 28 78 29 3b 0a 20 20 20  TABLE t3(x);.   
a570: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
a580: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  }..db close.tv d
a590: 65 6c 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74  elete..testvfs t
a5a0: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 66 61 75  v -default 1.fau
a5b0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
a5c0: 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63 20  _reopen.db func 
a5d0: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
a5e0: 67 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  g.do_execsql_tes
a5f0: 74 20 70 61 67 65 72 31 2d 31 31 2e 31 20 7b 0a  t pager1-11.1 {.
a600: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
a610: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
a620: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
a630: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49  ize = 10;.  BEGI
a640: 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  N;.    CREATE TA
a650: 42 4c 45 20 7a 7a 28 74 6f 70 20 50 52 49 4d 41  BLE zz(top PRIMA
a660: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53  RY KEY);.    INS
a670: 45 52 54 20 49 4e 54 4f 20 7a 7a 20 56 41 4c 55  ERT INTO zz VALU
a680: 45 53 28 61 5f 73 74 72 69 6e 67 28 32 32 32 29  ES(a_string(222)
a690: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
a6a0: 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73  TO zz SELECT a_s
a6b0: 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32  tring((SELECT 22
a6c0: 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f  2+max(rowid) FRO
a6d0: 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a  M zz)) FROM zz;.
a6e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a6f0: 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  zz SELECT a_stri
a700: 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d  ng((SELECT 222+m
a710: 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a  ax(rowid) FROM z
a720: 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20  z)) FROM zz;.   
a730: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20   INSERT INTO zz 
a740: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
a750: 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28  (SELECT 222+max(
a760: 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29  rowid) FROM zz))
a770: 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e   FROM zz;.    IN
a780: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c  SERT INTO zz SEL
a790: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45  ECT a_string((SE
a7a0: 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77  LECT 222+max(row
a7b0: 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52  id) FROM zz)) FR
a7c0: 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52  OM zz;.    INSER
a7d0: 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54  T INTO zz SELECT
a7e0: 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43   a_string((SELEC
a7f0: 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29  T 222+max(rowid)
a800: 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20   FROM zz)) FROM 
a810: 7a 7a 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  zz;.  COMMIT;.  
a820: 42 45 47 49 4e 3b 0a 20 20 20 20 55 50 44 41 54  BEGIN;.    UPDAT
a830: 45 20 7a 7a 20 53 45 54 20 74 6f 70 20 3d 20 61  E zz SET top = a
a840: 5f 73 74 72 69 6e 67 28 33 34 35 29 3b 0a 7d 20  _string(345);.} 
a850: 7b 64 65 6c 65 74 65 7d 0a 0a 70 72 6f 63 20 6c  {delete}..proc l
a860: 6f 63 6b 6f 75 74 20 7b 6d 65 74 68 6f 64 20 61  ockout {method a
a870: 72 67 73 7d 20 7b 20 72 65 74 75 72 6e 20 53 51  rgs} { return SQ
a880: 4c 49 54 45 5f 49 4f 45 52 52 20 7d 0a 74 76 20  LITE_IOERR }.tv 
a890: 73 63 72 69 70 74 20 6c 6f 63 6b 6f 75 74 0a 74  script lockout.t
a8a0: 76 20 66 69 6c 74 65 72 20 7b 78 57 72 69 74 65  v filter {xWrite
a8b0: 20 78 54 72 75 6e 63 61 74 65 20 78 53 79 6e 63   xTruncate xSync
a8c0: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
a8d0: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 32 20 7b  st pager1-11.2 {
a8e0: 20 43 4f 4d 4d 49 54 20 7d 20 7b 31 20 7b 64 69   COMMIT } {1 {di
a8f0: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a  sk I/O error}}..
a900: 74 76 20 73 63 72 69 70 74 20 7b 7d 0a 64 6f 5f  tv script {}.do_
a910: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 33  test pager1-11.3
a920: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
a930: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
a940: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
a950: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54  journal_mode = T
a960: 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 50 52 41  RUNCATE;.    PRA
a970: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
a980: 65 63 6b 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b  eck;.  } db2.} {
a990: 74 72 75 6e 63 61 74 65 20 6f 6b 7d 0a 64 6f 5f  truncate ok}.do_
a9a0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 34  test pager1-11.4
a9b0: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20   {.  db2 close. 
a9c0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
a9d0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
a9e0: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
a9f0: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 35 20 7b  st pager1-11.5 {
aa00: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
aa10: 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a   FROM zz } {32}.
aa20: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
aa30: 74 65 0a 20 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  te.  .#---------
aa40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa80: 0a 23 20 54 65 73 74 20 22 50 52 41 47 4d 41 20  .# Test "PRAGMA 
aa90: 70 61 67 65 5f 73 69 7a 65 22 0a 23 0a 74 65 73  page_size".#.tes
aaa0: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
aab0: 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65   1.tv sectorsize
aac0: 20 31 30 32 34 0a 66 6f 72 65 61 63 68 20 70 61   1024.foreach pa
aad0: 67 65 73 69 7a 65 20 7b 0a 20 20 20 20 35 31 32  gesize {.    512
aae0: 20 20 20 31 30 32 34 20 20 20 32 30 34 38 20 34     1024   2048 4
aaf0: 30 39 36 20 38 31 39 32 20 31 36 33 38 34 20 33  096 8192 16384 3
ab00: 32 37 36 38 20 0a 7d 20 7b 0a 20 20 66 61 75 6c  2768 .} {.  faul
ab10: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
ab20: 72 65 6f 70 65 6e 0a 0a 20 20 23 20 54 68 65 20  reopen..  # The 
ab30: 73 65 63 74 6f 72 2d 73 69 7a 65 20 28 61 63 63  sector-size (acc
ab40: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 56 46  ording to the VF
ab50: 53 29 20 69 73 20 31 30 32 34 20 62 79 74 65 73  S) is 1024 bytes
ab60: 2e 20 53 6f 20 69 66 20 74 68 65 0a 20 20 23 20  . So if the.  # 
ab70: 70 61 67 65 2d 73 69 7a 65 20 72 65 71 75 65 73  page-size reques
ab80: 74 65 64 20 75 73 69 6e 67 20 22 50 52 41 47 4d  ted using "PRAGM
ab90: 41 20 70 61 67 65 5f 73 69 7a 65 22 20 69 73 20  A page_size" is 
aba0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
abb0: 0a 20 20 23 20 63 6f 6d 70 69 6c 65 20 74 69 6d  .  # compile tim
abc0: 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54  e value of SQLIT
abd0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
abe0: 20 74 68 65 6e 20 74 68 65 20 65 66 66 65 63 74   then the effect
abf0: 69 76 65 20 0a 20 20 23 20 70 61 67 65 2d 73 69  ive .  # page-si
ac00: 7a 65 20 72 65 6d 61 69 6e 73 20 31 30 32 34 20  ze remains 1024 
ac10: 62 79 74 65 73 2e 0a 20 20 23 0a 20 20 73 65 74  bytes..  #.  set
ac20: 20 65 66 66 20 24 70 61 67 65 73 69 7a 65 0a 20   eff $pagesize. 
ac30: 20 69 66 20 7b 24 65 66 66 20 3e 20 24 3a 3a 53   if {$eff > $::S
ac40: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
ac50: 49 5a 45 7d 20 7b 20 73 65 74 20 65 66 66 20 31  IZE} { set eff 1
ac60: 30 32 34 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  024 }..  do_test
ac70: 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67 65   pager1-12.$page
ac80: 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 73 71 6c  size.1 {.    sql
ac90: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
aca0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20  .    execsql ". 
acb0: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
acc0: 5f 73 69 7a 65 20 3d 20 24 70 61 67 65 73 69 7a  _size = $pagesiz
acd0: 65 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  e;.      CREATE 
ace0: 56 49 45 57 20 76 20 41 53 20 53 45 4c 45 43 54  VIEW v AS SELECT
acf0: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
ad00: 61 73 74 65 72 3b 0a 20 20 20 20 22 20 64 62 32  aster;.    " db2
ad10: 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74  .    file size t
ad20: 65 73 74 2e 64 62 0a 20 20 7d 20 24 65 66 66 0a  est.db.  } $eff.
ad30: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ad40: 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 32 20  -12.$pagesize.2 
ad50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  {.    sqlite3 db
ad60: 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  2 test.db.    ex
ad70: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53  ecsql { .      S
ad80: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
ad90: 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50 52 41  ROM v;.      PRA
ada0: 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69  GMA main.page_si
adb0: 7a 65 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20  ze;.    } db2.  
adc0: 7d 20 5b 6c 69 73 74 20 31 20 24 65 66 66 5d 0a  } [list 1 $eff].
add0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ade0: 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 33 20  -12.$pagesize.3 
adf0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
ae00: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
ae10: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20  unt(*) FROM v;. 
ae20: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
ae30: 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20  .page_size;.    
ae40: 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65  }.  } [list 1 $e
ae50: 66 66 5d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  ff].  db2 close.
ae60: 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  }.db close.tv de
ae70: 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lete..#---------
ae80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aec0: 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c 20 22  .# Test specal "
aed0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
aee0: 6f 64 65 3d 50 45 52 53 49 53 54 22 20 74 65 73  ode=PERSIST" tes
aef0: 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  t cases..#.# pag
af00: 65 72 31 2d 31 33 2e 31 2e 2a 3a 20 54 68 69 73  er1-13.1.*: This
af10: 20 74 65 73 74 73 20 61 20 73 70 65 63 69 61 6c   tests a special
af20: 20 63 61 73 65 20 65 6e 63 6f 75 6e 74 65 72 65   case encountere
af30: 64 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 20  d in persistent 
af40: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
af50: 20 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20    journal mode: 
af60: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  If the journal a
af70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
af80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20   transaction.#  
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
afa0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
afb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
afc0: 62 65 63 61 75 73 65 20 61 20 70 72 65 76 69 6f  because a previo
afd0: 75 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  us .#           
afe0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
aff0: 20 6c 65 66 74 20 61 20 76 65 72 79 20 6c 61 72   left a very lar
b000: 67 65 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e  ge non-hot journ
b010: 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 23  al file in the.#
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b030: 66 69 6c 65 2d 73 79 73 74 65 6d 29 2c 20 74 68  file-system), th
b040: 65 6e 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f  en SQLite has to
b050: 20 62 65 20 63 61 72 65 66 75 6c 20 74 68 61 74   be careful that
b060: 20 74 68 65 72 65 20 69 73 0a 23 20 20 20 20 20   there is.#     
b070: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 61             not a
b080: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
b090: 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
b0a0: 20 70 72 65 76 69 6f 75 73 20 74 72 61 6e 73 61   previous transa
b0b0: 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 20 20  ction.#         
b0c0: 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65         immediate
b0d0: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
b0e0: 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 65 6e 74   journal content
b0f0: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2e 0a 23   just written..#
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
b120: 20 74 68 65 20 70 72 6f 63 65 73 73 20 63 72 61   the process cra
b130: 73 68 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  shes so that the
b140: 20 6a 6f 75 72 6e 61 6c 0a 23 20 20 20 20 20 20   journal.#      
b150: 20 20 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65            become
b160: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
b170: 61 6e 64 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c  and must be roll
b180: 65 64 20 62 61 63 6b 20 62 79 20 61 6e 6f 74 68  ed back by anoth
b190: 65 72 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  er.#            
b1a0: 20 20 20 20 70 72 6f 63 65 73 73 2c 20 74 68 65      process, the
b1b0: 72 65 20 69 73 20 61 20 64 61 6e 67 65 72 20 74  re is a danger t
b1c0: 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
b1d0: 6f 63 65 73 73 20 6d 61 79 20 72 6f 6c 6c 0a 23  ocess may roll.#
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 62 61 63 6b 20 74 68 65 20 61 62 6f 72 74 65 64  back the aborted
b200: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
b210: 65 6e 20 63 6f 6e 74 69 6e 75 65 20 63 6f 70 79  en continue copy
b220: 69 6e 67 20 64 61 74 61 0a 23 20 20 20 20 20 20  ing data.#      
b230: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 61            from a
b240: 6e 20 6f 6c 64 65 72 20 74 72 61 6e 73 61 63 74  n older transact
b250: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 6d  ion from the rem
b260: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
b270: 75 72 6e 61 6c 2e 0a 23 20 20 20 20 20 20 20 20  urnal..#        
b280: 20 20 20 20 20 20 20 20 53 65 65 20 74 68 65 20          See the 
b290: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 20 66 75  syncJournal() fu
b2a0: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  nction for detai
b2b0: 6c 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31  ls..#.# pager1-1
b2c0: 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74  3.2.*: Same test
b2d0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
b2e0: 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 74 68 72  . This time, thr
b2f0: 6f 77 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f  ow an index into
b300: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b310: 20 20 74 68 65 20 6d 69 78 20 74 6f 20 6d 61 6b    the mix to mak
b320: 65 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  e the integrity-
b330: 63 68 65 63 6b 20 6d 6f 72 65 20 6c 69 6b 65 6c  check more likel
b340: 79 20 74 6f 20 63 61 74 63 68 0a 23 20 20 20 20  y to catch.#    
b350: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
b360: 72 73 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  rs..#.testvfs tv
b370: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
b380: 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 74 76  cript xSyncCb.tv
b390: 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 70 72   filter xSync.pr
b3a0: 6f 63 20 78 53 79 6e 63 43 62 20 7b 6d 65 74 68  oc xSyncCb {meth
b3b0: 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73  od filename args
b3c0: 7d 20 7b 0a 20 20 73 65 74 20 74 20 5b 66 69 6c  } {.  set t [fil
b3d0: 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65  e tail $filename
b3e0: 5d 0a 20 20 69 66 20 7b 24 74 20 3d 3d 20 22 74  ].  if {$t == "t
b3f0: 65 73 74 2e 64 62 22 7d 20 66 61 75 6c 74 73 69  est.db"} faultsi
b400: 6d 5f 73 61 76 65 0a 20 20 72 65 74 75 72 6e 20  m_save.  return 
b410: 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c  SQLITE_OK.}.faul
b420: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
b430: 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63 20 61  reopen.db func a
b440: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
b450: 0a 0a 23 20 54 68 65 20 55 50 44 41 54 45 20 73  ..# The UPDATE s
b460: 74 61 74 65 6d 65 6e 74 20 61 74 20 74 68 65 20  tatement at the 
b470: 65 6e 64 20 6f 66 20 74 68 69 73 20 74 65 73 74  end of this test
b480: 20 63 61 73 65 20 63 72 65 61 74 65 73 20 61 20   case creates a 
b490: 72 65 61 6c 6c 79 20 62 69 67 0a 23 20 6a 6f 75  really big.# jou
b4a0: 72 6e 61 6c 2e 20 53 69 6e 63 65 20 74 68 65 20  rnal. Since the 
b4b0: 63 61 63 68 65 2d 73 69 7a 65 20 69 73 20 6f 6e  cache-size is on
b4c0: 6c 79 20 31 30 20 70 61 67 65 73 2c 20 74 68 65  ly 10 pages, the
b4d0: 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
b4e0: 73 20 0a 23 20 66 72 65 71 75 65 6e 74 20 6a 6f  s .# frequent jo
b4f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 0a 23  urnal headers..#
b500: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
b510: 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 31 20 7b   pager1-13.1.1 {
b520: 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73  .  PRAGMA page_s
b530: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 50 52  ize = 1024;.  PR
b540: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
b550: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 50  e = PERSIST;.  P
b560: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
b570: 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a   = 10;.  BEGIN;.
b580: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
b590: 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52   t1(a INTEGER PR
b5a0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 42 4c 4f  IMARY KEY, b BLO
b5b0: 42 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  B);.    INSERT I
b5c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55  NTO t1 VALUES(NU
b5d0: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
b5e0: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
b5f0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
b600: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
b610: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
b620: 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a 20 20      /*   2 */.  
b630: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
b640: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
b650: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
b660: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
b670: 20 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45     4 */.    INSE
b680: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
b690: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
b6a0: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
b6b0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38 20 2a          /*   8 *
b6c0: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
b6d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
b6e0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
b6f0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
b700: 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20 20 20    /*  16 */.    
b710: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
b720: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
b730: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
b740: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
b750: 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  32 */.    INSERT
b760: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
b770: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
b780: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
b790: 20 20 20 20 20 20 2f 2a 20 20 36 34 20 2a 2f 0a        /*  64 */.
b7a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b7b0: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
b7c0: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
b7d0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
b7e0: 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 43 4f 4d 4d  /* 128 */.  COMM
b7f0: 49 54 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20  IT;.  UPDATE t1 
b800: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
b810: 28 34 30 30 29 3b 0a 7d 20 7b 70 65 72 73 69 73  (400);.} {persis
b820: 74 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70  t}..if {$::tcl_p
b830: 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d  latform(platform
b840: 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a  )!="windows"} {.
b850: 23 20 52 75 6e 20 74 72 61 6e 73 61 63 74 69 6f  # Run transactio
b860: 6e 73 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67  ns of increasing
b870: 20 73 69 7a 65 73 2e 20 45 76 65 6e 74 75 61 6c   sizes. Eventual
b880: 6c 79 2c 20 6f 6e 65 20 28 6f 72 20 6d 6f 72 65  ly, one (or more
b890: 20 74 68 61 6e 20 6f 6e 65 29 0a 23 20 6f 66 20   than one).# of 
b8a0: 74 68 65 73 65 20 77 69 6c 6c 20 77 72 69 74 65  these will write
b8b0: 20 6a 75 73 74 20 65 6e 6f 75 67 68 20 63 6f 6e   just enough con
b8c0: 74 65 6e 74 20 74 68 61 74 20 6f 6e 65 20 6f 66  tent that one of
b8d0: 20 74 68 65 20 6f 6c 64 20 68 65 61 64 65 72 73   the old headers
b8e0: 20 63 72 65 61 74 65 64 20 0a 23 20 62 79 20 74   created .# by t
b8f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
b900: 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
b910: 65 20 6c 69 65 73 20 69 6d 6d 65 64 69 61 74 65  e lies immediate
b920: 6c 79 20 61 66 74 65 72 20 74 68 65 20 63 6f 6e  ly after the con
b930: 74 65 6e 74 0a 23 20 6a 6f 75 72 6e 61 6c 6c 65  tent.# journalle
b940: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
b950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a   transaction..#.
b960: 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20  for {set nUp 1} 
b970: 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20  {$nUp<64} {incr 
b980: 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63  nUp} {.  do_exec
b990: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b9a0: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 31 20 7b 20  13.1.2.$nUp.1 { 
b9b0: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
b9c0: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
b9d0: 33 39 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20  399) WHERE a <= 
b9e0: 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  $nUp.  } {}.  do
b9f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
ba00: 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70  ger1-13.1.2.$nUp
ba10: 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  .2 { PRAGMA inte
ba20: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f  grity_check } {o
ba30: 6b 7d 20 0a 0a 20 20 23 20 54 72 79 20 74 6f 20  k} ..  # Try to 
ba40: 61 63 63 65 73 73 20 74 68 65 20 73 6e 61 70 73  access the snaps
ba50: 68 6f 74 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  hot of the file-
ba60: 73 79 73 74 65 6d 2e 0a 20 20 23 0a 20 20 73 71  system..  #.  sq
ba70: 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74 65 73  lite3 db2 sv_tes
ba80: 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 70  t.db.  do_test p
ba90: 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55  ager1-13.1.2.$nU
baa0: 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  p.3 {.    execsq
bab0: 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 6c  l { SELECT sum(l
bac0: 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d 20 74  ength(b)) FROM t
bad0: 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78 70  1 } db2.  } [exp
bae0: 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28 24 6e  r {128*400 - ($n
baf0: 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65 73  Up-1)}].  do_tes
bb00: 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e  t pager1-13.1.2.
bb10: 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65 78 65  $nUp.4 {.    exe
bb20: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  csql { PRAGMA in
bb30: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
bb40: 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64  db2.  } {ok}.  d
bb50: 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a 69 66  b2 close.}.}..if
bb60: 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
bb70: 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69  m(platform)!="wi
bb80: 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 53 61 6d 65  ndows"} {.# Same
bb90: 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2e 20   test as above. 
bba0: 42 75 74 20 74 68 69 73 20 74 69 6d 65 20 77 69  But this time wi
bbb0: 74 68 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74  th an index on t
bbc0: 68 65 20 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65  he table..#.do_e
bbd0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
bbe0: 72 31 2d 31 33 2e 32 2e 31 20 7b 0a 20 20 43 52  r1-13.2.1 {.  CR
bbf0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
bc00: 20 74 31 28 62 29 3b 0a 20 20 55 50 44 41 54 45   t1(b);.  UPDATE
bc10: 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74   t1 SET b = a_st
bc20: 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 7d 0a  ring(400);.} {}.
bc30: 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20  for {set nUp 1} 
bc40: 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20  {$nUp<64} {incr 
bc50: 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63  nUp} {.  do_exec
bc60: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
bc70: 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 31 20 7b 20  13.2.2.$nUp.1 { 
bc80: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
bc90: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
bca0: 33 39 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20  399) WHERE a <= 
bcb0: 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  $nUp.  } {}.  do
bcc0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
bcd0: 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70  ger1-13.2.2.$nUp
bce0: 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  .2 { PRAGMA inte
bcf0: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f  grity_check } {o
bd00: 6b 7d 20 0a 20 20 73 71 6c 69 74 65 33 20 64 62  k} .  sqlite3 db
bd10: 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20 20 64  2 sv_test.db.  d
bd20: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  o_test pager1-13
bd30: 2e 32 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20  .2.2.$nUp.3 {.  
bd40: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
bd50: 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 62 29  CT sum(length(b)
bd60: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
bd70: 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a 34    } [expr {128*4
bd80: 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a  00 - ($nUp-1)}].
bd90: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
bda0: 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 34 20 7b  -13.2.2.$nUp.4 {
bdb0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
bdc0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
bdd0: 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20  check } db2.  } 
bde0: 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65  {ok}.  db2 close
bdf0: 0a 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74  .}.}..db close.t
be00: 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d  v delete..#-----
be10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be50: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63  ----.# Test spec
be60: 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  al "PRAGMA journ
be70: 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 20 74 65 73  al_mode=OFF" tes
be80: 74 20 63 61 73 65 73 2e 0a 23 0a 66 61 75 6c 74  t cases..#.fault
be90: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
bea0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
beb0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e  _test pager1-14.
bec0: 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a  1.1 {.  PRAGMA j
bed0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 4f 46  ournal_mode = OF
bee0: 46 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  F;.  CREATE TABL
bef0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 42 45  E t1(a, b);.  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 31  INTO t1 VALUES(1
bf20: 2c 20 32 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a  , 2);.  COMMIT;.
bf30: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
bf40: 74 31 3b 0a 7d 20 7b 6f 66 66 20 31 20 32 7d 0a  t1;.} {off 1 2}.
bf50: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
bf60: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 32 20 7b   pager1-14.1.2 {
bf70: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e  .  BEGIN;.    IN
bf80: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
bf90: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 52 4f 4c  UES(3, 4);.  ROL
bfa0: 4c 42 41 43 4b 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a  LBACK;.} {0 {}}.
bfb0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
bfc0: 70 61 67 65 72 31 2d 31 34 2e 31 2e 33 20 7b 0a  pager1-14.1.3 {.
bfd0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
bfe0: 74 31 3b 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 63  t1;.} {1 2}.do_c
bff0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67  atchsql_test pag
c000: 65 72 31 2d 31 34 2e 31 2e 34 20 7b 0a 20 20 42  er1-14.1.4 {.  B
c010: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
c020: 20 49 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20   INTO t1(rowid, 
c030: 61 2c 20 62 29 20 53 45 4c 45 43 54 20 61 2b 33  a, b) SELECT a+3
c040: 2c 20 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a  , b, b FROM t1;.
c050: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
c060: 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20  t1(rowid, a, b) 
c070: 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62  SELECT a+3, b, b
c080: 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b   FROM t1;.} {1 {
c090: 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74  PRIMARY KEY must
c0a0: 20 62 65 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f   be unique}}.do_
c0b0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c0c0: 65 72 31 2d 31 34 2e 31 2e 35 20 7b 0a 20 20 43  er1-14.1.5 {.  C
c0d0: 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20  OMMIT;.  SELECT 
c0e0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20  * FROM t1;.} {1 
c0f0: 32 20 32 20 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  2 2 2}..#-------
c100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c140: 2d 2d 0a 23 20 54 65 73 74 20 6f 70 65 6e 69 6e  --.# Test openin
c150: 67 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  g and closing th
c160: 65 20 70 61 67 65 72 20 73 75 62 2d 73 79 73 74  e pager sub-syst
c170: 65 6d 20 77 69 74 68 20 64 69 66 66 65 72 65 6e  em with differen
c180: 74 20 76 61 6c 75 65 73 0a 23 20 66 6f 72 20 74  t values.# for t
c190: 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 73  he sqlite3_vfs.s
c1a0: 7a 4f 73 46 69 6c 65 20 76 61 72 69 61 62 6c 65  zOsFile variable
c1b0: 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c  ..#.faultsim_del
c1c0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ete_and_reopen.d
c1d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
c1e0: 61 67 65 72 31 2d 31 35 2e 30 20 7b 0a 20 20 43  ager1-15.0 {.  C
c1f0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 78 28 79  REATE TABLE tx(y
c200: 2c 20 7a 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , z);.  INSERT I
c210: 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28 27 41  NTO tx VALUES('A
c220: 79 75 74 74 68 61 79 61 27 2c 20 27 42 65 69 6a  yutthaya', 'Beij
c230: 69 6e 67 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ing');.  INSERT 
c240: 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28 27  INTO tx VALUES('
c250: 4c 6f 6e 64 6f 6e 27 2c 20 27 54 6f 6b 79 6f 27  London', 'Tokyo'
c260: 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65  );.} {}.db close
c270: 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b  .for {set i 0} {
c280: 24 69 3c 35 31 33 7d 20 7b 69 6e 63 72 20 69 20  $i<513} {incr i 
c290: 33 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74  3} {.  testvfs t
c2a0: 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 73 7a  v -default 1 -sz
c2b0: 6f 73 66 69 6c 65 20 24 69 0a 20 20 73 71 6c 69  osfile $i.  sqli
c2c0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
c2d0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
c2e0: 20 70 61 67 65 72 31 2d 31 35 2e 24 69 2e 31 20   pager1-15.$i.1 
c2f0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
c300: 52 4f 4d 20 74 78 3b 0a 20 20 7d 20 7b 41 79 75  ROM tx;.  } {Ayu
c310: 74 74 68 61 79 61 20 42 65 69 6a 69 6e 67 20 4c  tthaya Beijing L
c320: 6f 6e 64 6f 6e 20 54 6f 6b 79 6f 7d 0a 20 20 64  ondon Tokyo}.  d
c330: 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c  b close.  tv del
c340: 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ete.}..#--------
c350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c390: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 69  -.# Check that i
c3a0: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
c3b0: 65 20 74 6f 20 6f 70 65 6e 20 61 20 64 61 74 61  e to open a data
c3c0: 62 61 73 65 20 66 69 6c 65 20 69 66 20 74 68 65  base file if the
c3d0: 20 66 75 6c 6c 20 70 61 74 68 0a 23 20 74 6f 20   full path.# to 
c3e0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a  the associated j
c3f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
c400: 20 62 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20   be longer than 
c410: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
c420: 74 68 6e 61 6d 65 2e 0a 23 0a 74 65 73 74 76 66  thname..#.testvf
c430: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
c440: 74 76 20 73 63 72 69 70 74 20 78 4f 70 65 6e 43  tv script xOpenC
c450: 62 0a 74 76 20 66 69 6c 74 65 72 20 78 4f 70 65  b.tv filter xOpe
c460: 6e 0a 70 72 6f 63 20 78 4f 70 65 6e 43 62 20 7b  n.proc xOpenCb {
c470: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
c480: 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 3a 3a  args} {.  set ::
c490: 66 69 6c 65 5f 6c 65 6e 20 5b 73 74 72 69 6e 67  file_len [string
c4a0: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d   length $filenam
c4b0: 65 5d 0a 7d 0a 73 71 6c 69 74 65 33 20 64 62 20  e].}.sqlite3 db 
c4c0: 74 65 73 74 2e 64 62 0a 64 62 20 63 6c 6f 73 65  test.db.db close
c4d0: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 66 6f 72 20  .tv delete..for 
c4e0: 7b 73 65 74 20 69 69 20 5b 65 78 70 72 20 24 3a  {set ii [expr $:
c4f0: 3a 66 69 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b 24  :file_len-5]} {$
c500: 69 69 20 3c 20 5b 65 78 70 72 20 24 3a 3a 66 69  ii < [expr $::fi
c510: 6c 65 5f 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e 63  le_len+20]} {inc
c520: 72 20 69 69 7d 20 7b 0a 20 20 74 65 73 74 76 66  r ii} {.  testvf
c530: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20  s tv -default 1 
c540: 2d 6d 78 70 61 74 68 6e 61 6d 65 20 24 69 69 0a  -mxpathname $ii.
c550: 0a 20 20 23 20 54 68 65 20 6c 65 6e 67 74 68 20  .  # The length 
c560: 6f 66 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  of the full path
c570: 20 74 6f 20 66 69 6c 65 20 22 74 65 73 74 2e 64   to file "test.d
c580: 62 2d 6a 6f 75 72 6e 61 6c 22 20 69 73 20 28 24  b-journal" is ($
c590: 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a 20  ::file_len+8).. 
c5a0: 20 23 20 49 66 20 74 68 65 20 63 6f 6e 66 69 67   # If the config
c5b0: 75 72 65 64 20 73 71 6c 69 74 65 33 5f 76 66 73  ured sqlite3_vfs
c5c0: 2e 6d 78 50 61 74 68 6e 61 6d 65 20 76 61 6c 75  .mxPathname valu
c5d0: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
c5e0: 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 23 20 74  r equal to.  # t
c5f0: 68 69 73 2c 20 74 68 65 6e 20 74 68 65 20 66 69  his, then the fi
c600: 6c 65 20 63 61 6e 20 62 65 20 6f 70 65 6e 65 64  le can be opened
c610: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
c620: 63 61 6e 6e 6f 74 2e 0a 20 20 23 0a 20 20 69 66  cannot..  #.  if
c630: 20 7b 24 69 69 20 3e 3d 20 5b 65 78 70 72 20 24   {$ii >= [expr $
c640: 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20 7b  ::file_len+8]} {
c650: 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 30 20  .    set res {0 
c660: 7b 7d 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  {}}.  } else {. 
c670: 20 20 20 73 65 74 20 72 65 73 20 7b 31 20 7b 75     set res {1 {u
c680: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
c690: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20  tabase file}}.  
c6a0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
c6b0: 65 72 31 2d 31 36 2e 31 2e 24 69 69 20 7b 0a 20  er1-16.1.$ii {. 
c6c0: 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b     list [catch {
c6d0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
c6e0: 2e 64 62 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a  .db } msg] $msg.
c6f0: 20 20 7d 20 24 72 65 73 0a 0a 20 20 63 61 74 63    } $res..  catc
c700: 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 74  h {db close}.  t
c710: 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d  v delete.}..#---
c720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c760: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50  ------.# Test "P
c770: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
c780: 6f 63 6b 22 2e 20 0a 23 0a 23 20 20 20 70 61 67  ock". .#.#   pag
c790: 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 2a 3a 20  er1-17.$tn.1.*: 
c7a0: 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20 73  Test that if a s
c7b0: 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  econd connection
c7c0: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 0a 23 20   has an open .# 
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61       read-transa
c7f0: 63 74 69 6f 6e 2c 20 69 74 20 69 73 20 6e 6f 74  ction, it is not
c800: 20 75 73 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c   usually possibl
c810: 65 20 74 6f 20 77 72 69 74 65 20 0a 23 20 20 20  e to write .#   
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e     the database.
c840: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 31 37  .#.#   pager1-17
c850: 2e 24 74 6e 2e 32 2e 2a 3a 20 54 65 73 74 20 74  .$tn.2.*: Test t
c860: 68 61 74 20 69 66 20 74 68 65 20 73 65 63 6f 6e  hat if the secon
c870: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  d connection was
c880: 20 6f 70 65 6e 65 64 20 77 69 74 68 0a 23 20 20   opened with.#  
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 4f      the SQLITE_O
c8b0: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61  PEN_READONLY fla
c8c0: 67 2c 20 61 6e 64 20 0a 23 20 20 20 20 20 20 20  g, and .#       
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
c8e0: 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64  PRAGMA omit_read
c8f0: 6c 6f 63 6b 20 3d 20 31 22 20 69 73 20 65 78 65  lock = 1" is exe
c900: 63 75 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  cuted before att
c910: 61 63 68 69 6e 67 0a 23 20 20 20 20 20 20 20 20  aching.#        
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
c930: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6f  e database and o
c940: 70 65 6e 69 6e 67 20 61 20 72 65 61 64 2d 74 72  pening a read-tr
c950: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 69 74 2c  ansaction on it,
c960: 20 69 74 20 69 73 0a 23 20 20 20 20 20 20 20 20   it is.#        
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
c980: 73 73 69 62 6c 65 20 74 6f 20 77 72 69 74 65 20  ssible to write 
c990: 74 68 65 20 64 62 2e 0a 23 0a 23 20 20 20 70 61  the db..#.#   pa
c9a0: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 2a 3a  ger1-17.$tn.3.*:
c9b0: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
c9c0: 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74  e second connect
c9d0: 69 6f 6e 20 77 61 73 20 2a 6e 6f 74 2a 20 6f 70  ion was *not* op
c9e0: 65 6e 65 64 20 77 69 74 68 0a 23 20 20 20 20 20  ened with.#     
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   the SQLITE_OPEN
ca10: 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20  _READONLY flag, 
ca20: 65 78 65 63 75 74 69 6e 67 20 0a 23 20 20 20 20  executing .#    
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72    "PRAGMA omit_r
ca50: 65 61 64 6c 6f 63 6b 20 3d 20 31 22 20 68 61 73  eadlock = 1" has
ca60: 20 6e 6f 20 65 66 66 65 63 74 2e 0a 23 0a 64 6f   no effect..#.do
ca70: 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73  _multiclient_tes
ca80: 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74  t tn {.  do_test
ca90: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31   pager1-17.$tn.1
caa0: 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20  .1 {.    sql1 { 
cab0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
cac0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
cad0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cae0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
caf0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20  .    }.    sql2 
cb00: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
cb10: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
cb20: 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t1;.    }.  }
cb30: 20 7b 31 20 32 7d 0a 20 20 64 6f 5f 74 65 73 74   {1 2}.  do_test
cb40: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31   pager1-17.$tn.1
cb50: 2e 32 20 7b 0a 20 20 20 20 63 73 71 6c 31 20 7b  .2 {.    csql1 {
cb60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
cb70: 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20  VALUES(3, 4) }. 
cb80: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
cb90: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
cba0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
cbb0: 24 74 6e 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71  $tn.1.3 {.    sq
cbc0: 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  l2 { COMMIT }.  
cbd0: 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20    sql1 { INSERT 
cbe0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
cbf0: 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20  , 4) }.  } {}.. 
cc00: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
cc10: 31 37 2e 24 74 6e 2e 32 2e 31 20 7b 0a 20 20 20  17.$tn.2.1 {.   
cc20: 20 63 6f 64 65 32 20 7b 0a 20 20 20 20 20 20 64   code2 {.      d
cc30: 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 73  b2 close.      s
cc40: 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f  qlite3 db2 :memo
cc50: 72 79 3a 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a  ry: -readonly 1.
cc60: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b      }.    sql2 {
cc70: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6f   .      PRAGMA o
cc80: 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31  mit_readlock = 1
cc90: 3b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27  ;.      ATTACH '
cca0: 74 65 73 74 2e 64 62 27 20 41 53 20 74 77 6f 3b  test.db' AS two;
ccb0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
ccc0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
ccd0: 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
cce0: 7b 31 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74  {1 2 3 4}.  do_t
ccf0: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
cd00: 6e 2e 32 2e 32 20 7b 20 73 71 6c 31 20 22 49 4e  n.2.2 { sql1 "IN
cd10: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
cd20: 55 45 53 28 35 2c 20 36 29 22 20 7d 20 7b 7d 0a  UES(5, 6)" } {}.
cd30: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
cd40: 2d 31 37 2e 24 74 6e 2e 32 2e 33 20 7b 20 73 71  -17.$tn.2.3 { sq
cd50: 6c 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  l2 "SELECT * FRO
cd60: 4d 20 74 31 22 20 7d 20 20 20 20 20 20 20 20 20  M t1" }         
cd70: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64     {1 2 3 4}.  d
cd80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37  o_test pager1-17
cd90: 2e 24 74 6e 2e 32 2e 34 20 7b 20 73 71 6c 32 20  .$tn.2.4 { sql2 
cda0: 22 43 4f 4d 4d 49 54 20 3b 20 53 45 4c 45 43 54  "COMMIT ; SELECT
cdb0: 20 2a 20 46 52 4f 4d 20 74 31 22 20 7d 20 20 20   * FROM t1" }   
cdc0: 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 20  {1 2 3 4 5 6}.. 
cdd0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
cde0: 31 37 2e 24 74 6e 2e 33 2e 31 20 7b 0a 20 20 20  17.$tn.3.1 {.   
cdf0: 20 63 6f 64 65 32 20 7b 0a 20 20 20 20 20 20 64   code2 {.      d
ce00: 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 73  b2 close.      s
ce10: 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f  qlite3 db2 :memo
ce20: 72 79 3a 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ry:.    }.    sq
ce30: 6c 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  l2 { .      PRAG
ce40: 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b  MA omit_readlock
ce50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 41 54 54 41   = 1;.      ATTA
ce60: 43 48 20 27 74 65 73 74 2e 64 62 27 20 41 53 20  CH 'test.db' AS 
ce70: 74 77 6f 3b 0a 20 20 20 20 20 20 42 45 47 49 4e  two;.      BEGIN
ce80: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
ce90: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a   FROM t1;.    }.
cea0: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
ceb0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
cec0: 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 32 20 7b 0a  r1-17.$tn.3.2 {.
ced0: 20 20 63 73 71 6c 31 20 7b 20 49 4e 53 45 52 54    csql1 { INSERT
cee0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
cef0: 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b  3, 4) }.  } {1 {
cf00: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
cf10: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ed}}.  do_test p
cf20: 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 33  ager1-17.$tn.3.3
cf30: 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d   { sql2 COMMIT }
cf40: 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   {}.}..#--------
cf50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf90: 2d 0a 23 20 54 65 73 74 20 74 68 65 20 70 61 67  -.# Test the pag
cfa0: 65 72 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 20  ers response to 
cfb0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
cfc0: 20 72 65 71 75 65 73 74 69 6e 67 20 69 6c 6c 65   requesting ille
cfd0: 67 61 6c 20 70 61 67 65 20 0a 23 20 6e 75 6d 62  gal page .# numb
cfe0: 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54 68 65  ers:.#.#   + The
cff0: 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c 0a 23   locking page,.#
d000: 20 20 20 2b 20 50 61 67 65 20 30 2c 0a 23 20 20     + Page 0,.#  
d010: 20 2b 20 41 20 70 61 67 65 20 77 69 74 68 20 61   + A page with a
d020: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
d030: 61 74 65 72 20 74 68 61 6e 20 28 32 5e 33 31 2d  ater than (2^31-
d040: 31 29 2e 0a 23 0a 23 20 54 68 65 73 65 20 74 65  1)..#.# These te
d050: 73 74 73 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  sts will not wor
d060: 6b 20 69 66 20 53 51 4c 49 54 45 5f 44 49 52 45  k if SQLITE_DIRE
d070: 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
d080: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49 6e 0a   is defined. In.
d090: 23 20 74 68 61 74 20 63 61 73 65 20 49 4f 20 65  # that case IO e
d0a0: 72 72 6f 72 73 20 61 72 65 20 73 6f 6d 65 74 69  rrors are someti
d0b0: 6d 65 73 20 72 65 70 6f 72 74 65 64 20 69 6e 73  mes reported ins
d0c0: 74 65 61 64 20 6f 66 20 53 51 4c 49 54 45 5f 43  tead of SQLITE_C
d0d0: 4f 52 52 55 50 54 2e 0a 23 0a 69 66 63 61 70 61  ORRUPT..#.ifcapa
d0e0: 62 6c 65 20 21 64 69 72 65 63 74 5f 72 65 61 64  ble !direct_read
d0f0: 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72   {.do_test pager
d100: 31 2d 31 38 2e 31 20 7b 0a 20 20 66 61 75 6c 74  1-18.1 {.  fault
d110: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
d120: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
d130: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
d140: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  g.  execsql { . 
d150: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
d160: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
d170: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
d180: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
d190: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
d1a0: 28 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20  (a_string(500), 
d1b0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 29 3b 0a  a_string(200));.
d1c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d1d0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d1e0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d1f0: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d200: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d210: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d220: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d230: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d240: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d250: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d260: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d270: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d280: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d290: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d2a0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d2b0: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d2c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d2d0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d2e0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d2f0: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d300: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d310: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d320: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d330: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d340: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d350: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
d360: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
d370: 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(200) FROM t1;.
d380: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
d390: 20 70 61 67 65 72 31 2d 31 38 2e 32 20 7b 0a 20   pager1-18.2 {. 
d3a0: 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e   set root [db on
d3b0: 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61  e "SELECT rootpa
d3c0: 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ge FROM sqlite_m
d3d0: 61 73 74 65 72 22 5d 0a 20 20 73 65 74 20 6c 6f  aster"].  set lo
d3e0: 63 6b 69 6e 67 70 61 67 65 20 5b 65 78 70 72 20  ckingpage [expr 
d3f0: 28 30 78 31 30 30 30 30 2f 31 30 32 34 29 20 2b  (0x10000/1024) +
d400: 20 31 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   1].  execsql {.
d410: 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61      PRAGMA writa
d420: 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a  ble_schema = 1;.
d430: 20 20 20 20 55 50 44 41 54 45 20 73 71 6c 69 74      UPDATE sqlit
d440: 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f  e_master SET roo
d450: 74 70 61 67 65 20 3d 20 24 6c 6f 63 6b 69 6e 67  tpage = $locking
d460: 70 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  page;.  }.  sqli
d470: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
d480: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
d490: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
d4a0: 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20  M t1 } db2.} {1 
d4b0: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
d4c0: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
d4d0: 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f  d}}.db2 close.do
d4e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e  _test pager1-18.
d4f0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
d500: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
d510: 20 74 32 28 78 29 3b 0a 20 20 20 20 49 4e 53 45   t2(x);.    INSE
d520: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
d530: 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30 30 29  S(a_string(5000)
d540: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 70 67 6e  );.  }.  set pgn
d550: 6f 20 5b 65 78 70 72 20 28 5b 66 69 6c 65 20 73  o [expr ([file s
d560: 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 2f 20 31  ize test.db] / 1
d570: 30 32 34 29 2d 32 5d 0a 20 20 68 65 78 69 6f 5f  024)-2].  hexio_
d580: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65  write test.db [e
d590: 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30  xpr ($pgno-1)*10
d5a0: 32 34 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73  24] 00000000.  s
d5b0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
d5c0: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  db.  catchsql { 
d5d0: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29  SELECT length(x)
d5e0: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
d5f0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
d600: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
d610: 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73  ormed}}.db2 clos
d620: 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  e.do_test pager1
d630: 2d 31 38 2e 34 20 7b 0a 20 20 68 65 78 69 6f 5f  -18.4 {.  hexio_
d640: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65  write test.db [e
d650: 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30  xpr ($pgno-1)*10
d660: 32 34 5d 20 39 30 30 30 30 30 30 30 0a 20 20 73  24] 90000000.  s
d670: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
d680: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  db.  catchsql { 
d690: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29  SELECT length(x)
d6a0: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
d6b0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
d6c0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
d6d0: 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73  ormed}}.db2 clos
d6e0: 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  e.do_test pager1
d6f0: 2d 31 38 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65  -18.5 {.  sqlite
d700: 33 20 64 62 20 22 22 0a 20 20 65 78 65 63 73 71  3 db "".  execsq
d710: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
d720: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
d730: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d740: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52  t2(a, b);.    PR
d750: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
d760: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50  hema = 1;.    UP
d770: 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  DATE sqlite_mast
d780: 65 72 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d  er SET rootpage=
d790: 35 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  5 WHERE tbl_name
d7a0: 20 3d 20 27 74 31 27 3b 0a 20 20 20 20 50 52 41   = 't1';.    PRA
d7b0: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
d7c0: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 41 4c 54  ema = 0;.    ALT
d7d0: 45 52 20 54 41 42 4c 45 20 74 31 20 52 45 4e 41  ER TABLE t1 RENA
d7e0: 4d 45 20 54 4f 20 78 31 3b 0a 20 20 7d 0a 20 20  ME TO x1;.  }.  
d7f0: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
d800: 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 0a 7d 20  T * FROM x1 }.} 
d810: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
d820: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
d830: 72 6d 65 64 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a  rmed}}.db close.
d840: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
d850: 31 38 2e 36 20 7b 0a 20 20 66 61 75 6c 74 73 69  18.6 {.  faultsi
d860: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
d870: 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
d880: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
d890: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
d8a0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
d8b0: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
d8c0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
d8d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d8e0: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
d8f0: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 49  ing(800));.    I
d900: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
d910: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30  LUES(a_string(80
d920: 30 29 29 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20  0));.  }..  set 
d930: 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45  root [db one "SE
d940: 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52  LECT rootpage FR
d950: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
d960: 22 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 0a 20  "].  db close.. 
d970: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
d980: 74 2e 64 62 20 5b 65 78 70 72 20 28 24 72 6f 6f  t.db [expr ($roo
d990: 74 2d 31 29 2a 31 30 32 34 20 2b 20 38 5d 20 30  t-1)*1024 + 8] 0
d9a0: 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65  0000000.  sqlite
d9b0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63  3 db test.db.  c
d9c0: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
d9d0: 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20   length(x) FROM 
d9e0: 74 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62  t1 }.} {1 {datab
d9f0: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
da00: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 7d 0a  s malformed}}.}.
da10: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
da20: 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  19.1 {.  sqlite3
da30: 20 64 62 20 22 22 0a 20 20 64 62 20 66 75 6e 63   db "".  db func
da40: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
da50: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
da60: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
da70: 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 50  ize = 512;.    P
da80: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
da90: 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52 45 41 54  m = 1;.    CREAT
daa0: 45 20 54 41 42 4c 45 20 74 31 28 61 61 2c 20 61  E TABLE t1(aa, a
dab0: 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c 20 61  b, ac, ad, ae, a
dac0: 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c 20 61  f, ag, ah, ai, a
dad0: 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61  j, ak, al, am, a
dae0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
daf0: 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c 20 62         ba, bb, b
db00: 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c 20 62  c, bd, be, bf, b
db10: 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62  g, bh, bi, bj, b
db20: 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20  k, bl, bm, bn,. 
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c 20 63     ca, cb, cc, c
db50: 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c 20 63  d, ce, cf, cg, c
db60: 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63  h, ci, cj, ck, c
db70: 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20  l, cm, cn,.     
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
db90: 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c 20 64  a, db, dc, dd, d
dba0: 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c 20 64  e, df, dg, dh, d
dbb0: 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64  i, dj, dk, dl, d
dbc0: 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, dn,.         
dbd0: 20 20 20 20 20 20 20 20 20 20 20 65 61 2c 20 65             ea, e
dbe0: 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c 20 65  b, ec, ed, ee, e
dbf0: 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c 20 65  f, eg, eh, ei, e
dc00: 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65  j, ek, el, em, e
dc10: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
dc20: 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c 20 66         fa, fb, f
dc30: 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c 20 66  c, fd, fe, ff, f
dc40: 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66  g, fh, fi, fj, f
dc50: 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20  k, fl, fm, fn,. 
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c 20 67     ga, gb, gc, g
dc80: 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c 20 67  d, ge, gf, gg, g
dc90: 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67  h, gi, gj, gk, g
dca0: 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20  l, gm, gn,.     
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
dcc0: 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c 20 68  a, hb, hc, hd, h
dcd0: 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c 20 68  e, hf, hg, hh, h
dce0: 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68  i, hj, hk, hl, h
dcf0: 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, hn,.         
dd00: 20 20 20 20 20 20 20 20 20 20 20 69 61 2c 20 69             ia, i
dd10: 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c 20 69  b, ic, id, ie, i
dd20: 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c 20 69  f, ig, ih, ii, i
dd30: 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69  j, ik, il, im, i
dd40: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
dd50: 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a         ja, jb, j
dd60: 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a  c, jd, je, jf, j
dd70: 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a  g, jh, ji, jj, j
dd80: 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20  k, jl, jm, jn,. 
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b     ka, kb, kc, k
ddb0: 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b  d, ke, kf, kg, k
ddc0: 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b  h, ki, kj, kk, k
ddd0: 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20  l, km, kn,.     
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
ddf0: 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c  a, lb, lc, ld, l
de00: 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c  e, lf, lg, lh, l
de10: 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c  i, lj, lk, ll, l
de20: 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, ln,.         
de30: 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c 20 6d             ma, m
de40: 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d  b, mc, md, me, m
de50: 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d  f, mg, mh, mi, m
de60: 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d  j, mk, ml, mm, m
de70: 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  n.    );.    CRE
de80: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 61 2c  ATE TABLE t2(aa,
de90: 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c   ab, ac, ad, ae,
dea0: 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c   af, ag, ah, ai,
deb0: 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c   aj, ak, al, am,
dec0: 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   an,.           
ded0: 20 20 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c           ba, bb,
dee0: 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c   bc, bd, be, bf,
def0: 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c   bg, bh, bi, bj,
df00: 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c   bk, bl, bm, bn,
df10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df20: 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c       ca, cb, cc,
df30: 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c   cd, ce, cf, cg,
df40: 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c   ch, ci, cj, ck,
df50: 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20   cl, cm, cn,.   
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c   da, db, dc, dd,
df80: 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c   de, df, dg, dh,
df90: 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c   di, dj, dk, dl,
dfa0: 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20   dm, dn,.       
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 61 2c               ea,
dfc0: 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c   eb, ec, ed, ee,
dfd0: 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c   ef, eg, eh, ei,
dfe0: 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c   ej, ek, el, em,
dff0: 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   en,.           
e000: 20 20 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c           fa, fb,
e010: 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c   fc, fd, fe, ff,
e020: 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c   fg, fh, fi, fj,
e030: 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c   fk, fl, fm, fn,
e040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e050: 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c       ga, gb, gc,
e060: 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c   gd, ge, gf, gg,
e070: 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c   gh, gi, gj, gk,
e080: 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20   gl, gm, gn,.   
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c   ha, hb, hc, hd,
e0b0: 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c   he, hf, hg, hh,
e0c0: 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c   hi, hj, hk, hl,
e0d0: 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20   hm, hn,.       
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 61 2c               ia,
e0f0: 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c   ib, ic, id, ie,
e100: 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c   if, ig, ih, ii,
e110: 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c   ij, ik, il, im,
e120: 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20   ix,.           
e130: 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c           ja, jb,
e140: 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c   jc, jd, je, jf,
e150: 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c   jg, jh, ji, jj,
e160: 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c   jk, jl, jm, jn,
e170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e180: 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c       ka, kb, kc,
e190: 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c   kd, ke, kf, kg,
e1a0: 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c   kh, ki, kj, kk,
e1b0: 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20   kl, km, kn,.   
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c   la, lb, lc, ld,
e1e0: 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c   le, lf, lg, lh,
e1f0: 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c   li, lj, lk, ll,
e200: 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20   lm, ln,.       
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c               ma,
e220: 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c   mb, mc, md, me,
e230: 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c   mf, mg, mh, mi,
e240: 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c   mj, mk, ml, mm,
e250: 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 49   mn.    );.    I
e260: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 61  NSERT INTO t1(aa
e270: 29 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69  ) VALUES( a_stri
e280: 6e 67 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20  ng(100000) );.  
e290: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
e2a0: 28 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f 73  (aa) VALUES( a_s
e2b0: 74 72 69 6e 67 28 31 30 30 30 30 30 29 20 29 3b  tring(100000) );
e2c0: 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d  .    VACUUM;.  }
e2d0: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
e2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e320: 2d 0a 23 20 54 65 73 74 20 61 20 63 6f 75 70 6c  -.# Test a coupl
e330: 65 20 6f 66 20 73 70 65 63 69 61 6c 20 63 61 73  e of special cas
e340: 65 73 20 74 68 61 74 20 63 6f 6d 65 20 75 70 20  es that come up 
e350: 77 68 69 6c 65 20 63 6f 6d 6d 69 74 74 69 6e 67  while committing
e360: 20 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   .# transactions
e370: 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  :.#.#   pager1-2
e380: 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e  0.1.*: Committin
e390: 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  g an in-memory d
e3a0: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
e3b0: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 0a 23 20  ion when the .# 
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f   database has no
e3e0: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
e3f0: 61 74 20 61 6c 6c 2e 0a 23 0a 23 20 20 20 70 61  at all..#.#   pa
e400: 67 65 72 31 2d 32 30 2e 32 2e 2a 3a 20 41 73 20  ger1-20.2.*: As 
e410: 61 62 6f 76 65 2c 20 62 75 74 20 77 69 74 68 20  above, but with 
e420: 61 20 6e 6f 72 6d 61 6c 20 64 62 20 69 6e 20 65  a normal db in e
e430: 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
e440: 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61 67   mode..#.#   pag
e450: 65 72 31 2d 32 30 2e 33 2e 2a 3a 20 43 6f 6d 6d  er1-20.3.*: Comm
e460: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
e470: 74 69 6f 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  tion in WAL mode
e480: 20 77 68 65 72 65 20 74 68 65 20 64 61 74 61 62   where the datab
e490: 61 73 65 20 68 61 73 0a 23 20 20 20 20 20 20 20  ase has.#       
e4a0: 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20             been 
e4b0: 6d 6f 64 69 66 69 65 64 2c 20 62 75 74 20 61 6c  modified, but al
e4c0: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
e4d0: 76 65 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20  ve been flushed 
e4e0: 74 6f 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  to .#           
e4f0: 20 20 20 20 20 20 20 64 69 73 6b 20 62 65 66 6f         disk befo
e500: 72 65 20 74 68 65 20 63 6f 6d 6d 69 74 2e 0a 23  re the commit..#
e510: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
e520: 32 30 2e 31 2e 31 20 7b 0a 20 20 63 61 74 63 68  20.1.1 {.  catch
e530: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 73 71   {db close}.  sq
e540: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
e550: 3a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  :.  execsql {.  
e560: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f    CREATE TABLE o
e570: 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a  ne(two, three);.
e580: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e590: 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27 2c 20  one VALUES('a', 
e5a0: 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  'b');.  }.} {}.d
e5b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30  o_test pager1-20
e5c0: 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
e5d0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43   {.    BEGIN EXC
e5e0: 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d  LUSIVE;.    COMM
e5f0: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  IT;.  }.} {}..do
e600: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e  _test pager1-20.
e610: 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  2.1 {.  faultsim
e620: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
e630: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
e640: 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e     PRAGMA lockin
e650: 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69  g_mode = exclusi
e660: 76 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  ve;.    PRAGMA j
e670: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65  ournal_mode = pe
e680: 72 73 69 73 74 3b 0a 20 20 20 20 43 52 45 41 54  rsist;.    CREAT
e690: 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c  E TABLE one(two,
e6a0: 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53   three);.    INS
e6b0: 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c  ERT INTO one VAL
e6c0: 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
e6d0: 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20   }.} {exclusive 
e6e0: 70 65 72 73 69 73 74 7d 0a 64 6f 5f 74 65 73 74  persist}.do_test
e6f0: 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 32 20 7b   pager1-20.2.2 {
e700: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
e710: 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45   BEGIN EXCLUSIVE
e720: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
e730: 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c  }.} {}..ifcapabl
e740: 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73  e wal {.  do_tes
e750: 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 31 20  t pager1-20.3.1 
e760: 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64  {.    faultsim_d
e770: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
e780: 0a 20 20 20 20 64 62 20 66 75 6e 63 20 61 5f 73  .    db func a_s
e790: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20  tring a_string. 
e7a0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
e7b0: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
e7c0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 20  size = 10;.     
e7d0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
e7e0: 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20  mode = wal;.    
e7f0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
e800: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
e810: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45  (x);.        CRE
e820: 41 54 45 20 54 41 42 4c 45 20 74 32 28 79 29 3b  ATE TABLE t2(y);
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 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
e850: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
e860: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
e870: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
e880: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
e890: 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20  t1;         /*  
e8a0: 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e   2 */.        IN
e8b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
e8c0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
e8d0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
e8e0: 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20     /*   4 */.   
e8f0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
e900: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
e910: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
e920: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38  ;         /*   8
e930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45   */.        INSE
e940: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
e950: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  T a_string(800) 
e960: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
e970: 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20 20 20 20   /*  16 */.     
e980: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e990: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
e9a0: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
e9b0: 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a          /*  32 *
e9c0: 2f 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  /.      COMMIT;.
e9d0: 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a      }.  } {wal}.
e9e0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
e9f0: 2d 32 30 2e 33 2e 32 20 7b 0a 20 20 20 20 65 78  -20.3.2 {.    ex
ea00: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45  ecsql {.      BE
ea10: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
ea20: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
ea30: 28 27 78 78 78 78 27 29 3b 0a 20 20 20 20 7d 0a  ('xxxx');.    }.
ea40: 20 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65      recursive_se
ea50: 6c 65 63 74 20 33 32 20 74 31 0a 20 20 20 20 65  lect 32 t1.    e
ea60: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20  xecsql COMMIT.  
ea70: 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  } {}.}..#-------
ea80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eac0: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61  --.# Test that a
ead0: 20 57 41 4c 20 64 61 74 61 62 61 73 65 20 6d 61   WAL database ma
eae0: 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 20  y not be opened 
eaf0: 69 66 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31  if:.#.#   pager1
eb00: 2d 32 31 2e 31 2e 2a 3a 20 54 68 65 20 56 46 53  -21.1.*: The VFS
eb10: 20 68 61 73 20 61 6e 20 69 56 65 72 73 69 6f 6e   has an iVersion
eb20: 20 6c 65 73 73 20 74 68 61 6e 20 32 2c 20 6f 72   less than 2, or
eb30: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e 32  .#   pager1-21.2
eb40: 2e 2a 3a 20 54 68 65 20 56 46 53 20 64 6f 65 73  .*: The VFS does
eb50: 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 78 53 68   not provide xSh
eb60: 6d 58 58 58 28 29 20 6d 65 74 68 6f 64 73 2e 0a  mXXX() methods..
eb70: 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20  #.ifcapable wal 
eb80: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  {.  do_test page
eb90: 72 31 2d 32 31 2e 30 20 7b 0a 20 20 20 20 66 61  r1-21.0 {.    fa
eba0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
ebb0: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 65 78 65  d_reopen.    exe
ebc0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
ebd0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
ebe0: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52   = WAL;.      CR
ebf0: 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20  EATE TABLE ko(c 
ec00: 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62  DEFAULT 'abc', b
ec10: 20 44 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b   DEFAULT 'def');
ec20: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
ec30: 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41  TO ko DEFAULT VA
ec40: 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  LUES;.    }.  } 
ec50: 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20  {wal}.  do_test 
ec60: 70 61 67 65 72 31 2d 32 31 2e 31 20 7b 0a 20 20  pager1-21.1 {.  
ec70: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 6e 6f    testvfs tv -no
ec80: 73 68 6d 20 31 0a 20 20 20 20 73 71 6c 69 74 65  shm 1.    sqlite
ec90: 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76  3 db2 test.db -v
eca0: 66 73 20 74 76 0a 20 20 20 20 63 61 74 63 68 73  fs tv.    catchs
ecb0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
ecc0: 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20 20 7d 20  OM ko } db2.  } 
ecd0: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70  {1 {unable to op
ece0: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
ecf0: 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20  }}.  db2 close. 
ed00: 20 74 76 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f   tv delete.  do_
ed10: 74 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e 32  test pager1-21.2
ed20: 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74   {.    testvfs t
ed30: 76 20 2d 69 76 65 72 73 69 6f 6e 20 31 0a 20 20  v -iversion 1.  
ed40: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
ed50: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20  st.db -vfs tv.  
ed60: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
ed70: 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20  ECT * FROM ko } 
ed80: 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75 6e 61 62  db2.  } {1 {unab
ed90: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
eda0: 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 64 62 32  ase file}}.  db2
edb0: 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65   close.  tv dele
edc0: 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  te.}..#---------
edd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ede0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee10: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20 22  .# Test that a "
ee20: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
ee30: 70 6f 69 6e 74 22 3a 0a 23 0a 23 20 20 20 70 61  point":.#.#   pa
ee40: 67 65 72 31 2d 32 32 2e 31 2e 2a 3a 20 69 73 20  ger1-22.1.*: is 
ee50: 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61 20 6e 6f 6e  a no-op on a non
ee60: 2d 57 41 4c 20 64 62 2c 20 61 6e 64 0a 23 20 20  -WAL db, and.#  
ee70: 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 2a 3a 20   pager1-22.2.*: 
ee80: 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 78  does not cause x
ee90: 53 79 6e 63 20 63 61 6c 6c 73 20 77 69 74 68 20  Sync calls with 
eea0: 61 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f 66  a synchronous=of
eeb0: 66 20 64 62 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  f db..#.do_test 
eec0: 70 61 67 65 72 31 2d 32 32 2e 31 2e 31 20 7b 0a  pager1-22.1.1 {.
eed0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
eee0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
eef0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
ef00: 41 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20 44  ATE TABLE ko(c D
ef10: 45 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62 20  EFAULT 'abc', b 
ef20: 44 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b 0a  DEFAULT 'def');.
ef30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ef40: 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45  ko DEFAULT VALUE
ef50: 53 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  S;.  }.  execsql
ef60: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
ef70: 65 63 6b 70 6f 69 6e 74 20 7d 0a 7d 20 7b 30 20  eckpoint }.} {0 
ef80: 2d 31 20 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 70  -1 -1}.do_test p
ef90: 61 67 65 72 31 2d 32 32 2e 32 2e 31 20 7b 0a 20  ager1-22.2.1 {. 
efa0: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
efb0: 61 75 6c 74 20 31 0a 20 20 74 76 20 66 69 6c 74  ault 1.  tv filt
efc0: 65 72 20 78 53 79 6e 63 0a 20 20 74 76 20 73 63  er xSync.  tv sc
efd0: 72 69 70 74 20 78 53 79 6e 63 43 62 0a 20 20 70  ript xSyncCb.  p
efe0: 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 61 72 67  roc xSyncCb {arg
eff0: 73 7d 20 7b 69 6e 63 72 20 3a 3a 73 79 6e 63 63  s} {incr ::syncc
f000: 6f 75 6e 74 7d 0a 20 20 73 71 6c 69 74 65 33 20  ount}.  sqlite3 
f010: 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20  db test.db..  # 
f020: 53 77 69 74 63 68 20 74 68 65 20 64 62 20 74 6f  Switch the db to
f030: 20 57 41 4c 20 6d 6f 64 65 2e 20 41 6e 64 20 74   WAL mode. And t
f040: 68 65 6e 20 65 78 65 63 75 74 65 20 61 20 53 45  hen execute a SE
f050: 4c 45 43 54 20 74 6f 20 6d 61 6b 65 20 73 75 72  LECT to make sur
f060: 65 0a 20 20 23 20 74 68 61 74 20 74 68 65 20 57  e.  # that the W
f070: 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  AL file is open.
f080: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
f090: 6d 61 79 20 63 68 61 6e 67 65 20 74 68 65 20 73  may change the s
f0a0: 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 23 20 73  ynchronous.  # s
f0b0: 65 74 74 69 6e 67 20 69 66 20 44 45 46 41 55 4c  etting if DEFAUL
f0c0: 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45  T_WAL_SAFETYLEVE
f0d0: 4c 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20  L is defined..  
f0e0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
f0f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f100: 57 41 4c 20 3b 20 53 45 4c 45 43 54 20 2a 20 46  WAL ; SELECT * F
f110: 52 4f 4d 20 6b 6f 20 7d 0a 0a 20 20 23 20 53 65  ROM ko }..  # Se
f120: 74 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46  t synchronous=OF
f130: 46 2e 20 49 6e 73 65 72 74 20 73 6f 6d 65 20 64  F. Insert some d
f140: 61 74 61 20 61 6e 64 20 72 75 6e 20 61 20 63 68  ata and run a ch
f150: 65 63 6b 70 6f 69 6e 74 2e 20 53 69 6e 63 65 0a  eckpoint. Since.
f160: 20 20 23 20 73 79 6e 63 3d 6f 66 66 2c 20 74 68    # sync=off, th
f170: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61  is should not ca
f180: 75 73 65 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f  use any calls to
f190: 20 74 68 65 20 78 53 79 6e 63 28 29 20 6d 65 74   the xSync() met
f1a0: 68 6f 64 2e 0a 20 20 73 65 74 20 3a 3a 73 79 6e  hod..  set ::syn
f1b0: 63 63 6f 75 6e 74 20 30 0a 20 20 65 78 65 63 73  ccount 0.  execs
f1c0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
f1d0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6f 66  synchronous = of
f1e0: 66 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  f;.    INSERT IN
f1f0: 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41  TO ko DEFAULT VA
f200: 4c 55 45 53 3b 0a 20 20 20 20 50 52 41 47 4d 41  LUES;.    PRAGMA
f210: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b   wal_checkpoint;
f220: 0a 20 20 7d 0a 20 20 73 65 74 20 73 79 6e 63 63  .  }.  set syncc
f230: 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d  ount.} {0}..#---
f240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f280: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66  ------.# Tests f
f290: 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a 6f 75 72  or changing jour
f2a0: 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20  nal mode..#.#   
f2b0: 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a 3a 20 54  pager1-23.1.*: T
f2c0: 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 63 68  est that when ch
f2d0: 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50 45 52 53  anging from PERS
f2e0: 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 6d 6f  IST to DELETE mo
f2f0: 64 65 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20  de,.#           
f300: 20 20 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e         the journ
f310: 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  al file is delet
f320: 65 64 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  ed..#.#   pager1
f330: 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65  -23.2.*: Same te
f340: 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74  st as above, but
f350: 20 77 68 69 6c 65 20 61 20 73 68 61 72 65 64 20   while a shared 
f360: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20  lock is held.#  
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f390: 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65  file..#.#   page
f3a0: 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d 65 20  r1-23.3.*: Same 
f3b0: 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62  test as above, b
f3c0: 75 74 20 77 68 69 6c 65 20 61 20 72 65 73 65 72  ut while a reser
f3d0: 76 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ved lock is held
f3e0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
f3f0: 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
f400: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20  ase file..#.#   
f410: 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a 3a 20 41  pager1-23.4.*: A
f420: 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20 77 68 69  nd, for fun, whi
f430: 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  le holding an ex
f440: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 23 0a  clusive lock..#.
f450: 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  #   pager1-23.5.
f460: 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 76 61  *: Try to set va
f470: 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20  rious different 
f480: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 77 69  journal modes wi
f490: 74 68 20 61 6e 0a 23 20 20 20 20 20 20 20 20 20  th an.#         
f4a0: 20 20 20 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f           in-memo
f4b0: 72 79 20 64 61 74 61 62 61 73 65 20 28 6f 6e 6c  ry database (onl
f4c0: 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20 4f 46 46  y MEMORY and OFF
f4d0: 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a 23   should work)..#
f4e0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 36  .#   pager1-23.6
f4f0: 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 6c  .*: Try to set l
f500: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
f510: 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  al on an in-memo
f520: 72 79 20 64 61 74 61 62 61 73 65 0a 23 20 20 20  ry database.#   
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f540: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 2d 20 69  doesn't work - i
f550: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
f560: 65 73 20 61 6c 77 61 79 73 20 75 73 65 0a 23 20  es always use.# 
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
f590: 63 6c 75 73 69 76 65 29 2e 0a 23 0a 64 6f 5f 74  clusive)..#.do_t
f5a0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  est pager1-23.1.
f5b0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
f5c0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
f5d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f5e0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f5f0: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
f600: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
f610: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20   t1(a, b);.  }. 
f620: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
f630: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
f640: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
f650: 31 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65  1-23.1.2 {.  exe
f660: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
f670: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
f680: 45 54 45 20 7d 0a 20 20 66 69 6c 65 20 65 78 69  ETE }.  file exi
f690: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
f6a0: 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65  nal.} {0}..do_te
f6b0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 31  st pager1-23.2.1
f6c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
f6d0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
f6e0: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
f6f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
f700: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 43 61 6e  O t1 VALUES('Can
f710: 62 65 72 72 61 27 2c 20 27 41 43 54 27 29 3b 0a  berra', 'ACT');.
f720: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
f730: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
f740: 20 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c   } {.    db eval
f750: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
f760: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
f770: 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  }.  }.  execsql 
f780: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
f790: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
f7a0: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
f7b0: 31 2d 32 33 2e 32 2e 32 20 7b 0a 20 20 66 69 6c  1-23.2.2 {.  fil
f7c0: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
f7d0: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a  -journal.} {0}..
f7e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f7f0: 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.3.1 {.  execsq
f800: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
f810: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
f820: 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52  RSIST;.    INSER
f830: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
f840: 28 27 44 61 72 77 69 6e 27 2c 20 27 4e 54 27 29  ('Darwin', 'NT')
f850: 3b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45  ;.    BEGIN IMME
f860: 44 49 41 54 45 3b 0a 20 20 7d 0a 20 20 64 62 20  DIATE;.  }.  db 
f870: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
f880: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
f890: 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
f8a0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
f8b0: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
f8c0: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
f8d0: 31 2d 32 33 2e 33 2e 32 20 7b 0a 20 20 66 69 6c  1-23.3.2 {.  fil
f8e0: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
f8f0: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
f900: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f910: 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.3 {.  execsql
f920: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
f930: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f940: 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
f950: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
f960: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
f970: 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  IST;.    INSERT 
f980: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
f990: 41 64 65 6c 61 69 64 65 27 2c 20 27 53 41 27 29  Adelaide', 'SA')
f9a0: 3b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c  ;.    BEGIN EXCL
f9b0: 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 64 62 20  USIVE;.  }.  db 
f9c0: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
f9d0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
f9e0: 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
f9f0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
fa00: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
fa10: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
fa20: 31 2d 32 33 2e 34 2e 32 20 7b 0a 20 20 66 69 6c  1-23.4.2 {.  fil
fa30: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
fa40: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
fa50: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
fa60: 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.3 {.  execsql
fa70: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
fa80: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fa90: 35 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  5.1 {.  faultsim
faa0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
fab0: 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  en.  sqlite3 db 
fac0: 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66 6f  :memory:.} {}.fo
fad0: 72 65 61 63 68 20 7b 74 6e 20 6d 6f 64 65 20 70  reach {tn mode p
fae0: 6f 73 73 69 62 6c 65 7d 20 7b 0a 20 20 32 20 20  ossible} {.  2  
faf0: 6f 66 66 20 20 20 20 20 20 31 0a 20 20 33 20 20  off      1.  3  
fb00: 6d 65 6d 6f 72 79 20 20 20 31 0a 20 20 34 20 20  memory   1.  4  
fb10: 70 65 72 73 69 73 74 20 20 30 0a 20 20 35 20 20  persist  0.  5  
fb20: 64 65 6c 65 74 65 20 20 20 30 0a 20 20 36 20 20  delete   0.  6  
fb30: 77 61 6c 20 20 20 20 20 20 30 0a 20 20 37 20 20  wal      0.  7  
fb40: 74 72 75 6e 63 61 74 65 20 30 0a 7d 20 7b 0a 20  truncate 0.} {. 
fb50: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
fb60: 32 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  23.5.$tn.1 {.   
fb70: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
fb80: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
fb90: 6f 66 66 22 0a 20 20 20 20 65 78 65 63 73 71 6c  off".    execsql
fba0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
fbb0: 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20  _mode = $mode". 
fbc0: 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65   } [if $possible
fbd0: 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c   {list $mode} {l
fbe0: 69 73 74 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f 74  ist off}].  do_t
fbf0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  est pager1-23.5.
fc00: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  $tn.2 {.    exec
fc10: 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  sql "PRAGMA jour
fc20: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72  nal_mode = memor
fc30: 79 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  y".    execsql "
fc40: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
fc50: 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d  ode = $mode".  }
fc60: 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b   [if $possible {
fc70: 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73  list $mode} {lis
fc80: 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f  t memory}].}.do_
fc90: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
fca0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
fcb0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
fcc0: 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d 20  ode = normal}.} 
fcd0: 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74  {exclusive}.do_t
fce0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  est pager1-23.6.
fcf0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  2 {.  execsql {P
fd00: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
fd10: 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 7d 0a  de = exclusive}.
fd20: 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f  } {exclusive}.do
fd30: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
fd40: 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.3 {.  execsql 
fd50: 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  {PRAGMA locking_
fd60: 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  mode}.} {exclusi
fd70: 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ve}.do_test page
fd80: 72 31 2d 32 33 2e 36 2e 34 20 7b 0a 20 20 65 78  r1-23.6.4 {.  ex
fd90: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6d 61  ecsql {PRAGMA ma
fda0: 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d  in.locking_mode}
fdb0: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 0a  .} {exclusive}..
fdc0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
fdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
fe10: 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
fe20: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
fe30: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
fe40: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
fe50: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
fe60: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
fe70: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
fe80: 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41  = 10;.    PRAGMA
fe90: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46   auto_vacuum = F
fea0: 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ULL;.    CREATE 
feb0: 54 41 42 4c 45 20 78 31 28 78 2c 20 79 2c 20 7a  TABLE x1(x, y, z
fec0: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c  , PRIMARY KEY(y,
fed0: 20 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   z));.    CREATE
fee0: 20 54 41 42 4c 45 20 78 32 28 78 2c 20 79 2c 20   TABLE x2(x, y, 
fef0: 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79  z, PRIMARY KEY(y
ff00: 2c 20 7a 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  , z));.    INSER
ff10: 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53  T INTO x2 VALUES
ff20: 28 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20  (a_string(400), 
ff30: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
ff40: 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20  _string(600));. 
ff50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
ff60: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
ff70: 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(600), a_string
ff80: 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
ff90: 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  500) FROM x2;.  
ffa0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
ffb0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
ffc0: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
ffd0: 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34  600), a_string(4
ffe0: 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
fff0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
10000 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10010 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35  400), a_string(5
10020 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
10030 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
10040 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
10050 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36  ELECT a_string(6
10060 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  00), a_string(40
10070 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
10080 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
10090 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
100a0 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
100b0 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
100c0 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ), a_string(400)
100d0 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
100e0 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
100f0 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30  ECT a_string(400
10100 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ), a_string(500)
10110 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10120 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
10130 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
10140 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
10150 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
10160 61 67 65 72 31 2d 32 34 2e 31 2e 32 20 7b 0a 20  ager1-24.1.2 {. 
10170 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
10180 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
10190 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45  TE FROM x1 WHERE
101a0 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 7d 0a 20   rowid<32;.  }. 
101b0 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63   recursive_selec
101c0 74 20 36 34 20 78 32 0a 7d 20 7b 7d 0a 64 6f 5f  t 64 x2.} {}.do_
101d0 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
101e0 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
101f0 20 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78   .      UPDATE x
10200 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69  1 SET z = a_stri
10210 6e 67 28 33 30 30 29 20 57 48 45 52 45 20 72 6f  ng(300) WHERE ro
10220 77 69 64 3e 34 30 3b 0a 20 20 20 20 43 4f 4d 4d  wid>40;.    COMM
10230 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  IT;.    PRAGMA i
10240 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
10250 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
10260 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d  (*) FROM x1;.  }
10270 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74  .} {ok 33}..do_t
10280 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e  est pager1-24.1.
10290 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
102a0 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
102b0 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x1;.    INSERT I
102c0 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20  NTO x1 SELECT * 
102d0 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 42 45 47  FROM x2;.    BEG
102e0 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
102f0 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72   FROM x1 WHERE r
10300 6f 77 69 64 3c 33 32 3b 0a 20 20 20 20 20 20 55  owid<32;.      U
10310 50 44 41 54 45 20 78 31 20 53 45 54 20 7a 20 3d  PDATE x1 SET z =
10320 20 61 5f 73 74 72 69 6e 67 28 32 39 39 29 20 57   a_string(299) W
10330 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20  HERE rowid>40;. 
10340 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73   }.  recursive_s
10350 65 6c 65 63 74 20 36 34 20 78 32 20 7b 64 62 20  elect 64 x2 {db 
10360 65 76 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20 20 65  eval COMMIT}.  e
10370 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
10380 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
10390 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  eck;.    SELECT 
103a0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31  count(*) FROM x1
103b0 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a  ;.  }.} {ok 33}.
103c0 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
103d0 32 34 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  24.1.5 {.  execs
103e0 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
103f0 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53  FROM x1;.    INS
10400 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
10410 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
10420 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65  }.  recursive_se
10430 6c 65 63 74 20 36 34 20 78 32 20 7b 20 64 62 20  lect 64 x2 { db 
10440 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42  eval {CREATE TAB
10450 4c 45 20 78 33 28 78 2c 20 79 2c 20 7a 29 7d 20  LE x3(x, y, z)} 
10460 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
10470 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 33 20 7d  LECT * FROM x3 }
10480 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
10490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104d0 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  -.#.do_test page
104e0 72 31 2d 32 35 2d 31 20 7b 0a 20 20 66 61 75 6c  r1-25-1 {.  faul
104f0 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
10500 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
10510 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
10520 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62      SAVEPOINT ab
10530 63 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  c;.        CREAT
10540 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
10550 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ;.      ROLLBACK
10560 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d   TO abc;.    COM
10570 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c  MIT;.  }.  db cl
10580 6f 73 65 0a 7d 20 7b 7d 0a 62 72 65 61 6b 70 6f  ose.} {}.breakpo
10590 69 6e 74 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  int.do_test page
105a0 72 31 2d 32 35 2d 32 20 7b 0a 20 20 66 61 75 6c  r1-25-2 {.  faul
105b0 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
105c0 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
105d0 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54   {.    SAVEPOINT
105e0 20 61 62 63 3b 0a 20 20 20 20 20 20 43 52 45 41   abc;.      CREA
105f0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
10600 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  );.    ROLLBACK 
10610 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d 4d  TO abc;.    COMM
10620 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f  IT;.  }.  db clo
10630 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  se.} {}..#------
10640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10680 2d 2d 2d 0a 23 20 53 65 63 74 6f 72 2d 73 69 7a  ---.# Sector-siz
10690 65 20 74 65 73 74 73 2e 0a 23 0a 64 6f 5f 74 65  e tests..#.do_te
106a0 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b  st pager1-26.1 {
106b0 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
106c0 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65  efault 1.  tv se
106d0 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 20 20  ctorsize 4096.  
106e0 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
106f0 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
10700 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
10710 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
10720 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
10730 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
10740 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10750 74 62 6c 28 61 20 50 52 49 4d 41 52 59 20 4b 45  tbl(a PRIMARY KE
10760 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20  Y, b UNIQUE);.  
10770 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
10780 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56  NSERT INTO tbl V
10790 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32  ALUES(a_string(2
107a0 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
107b0 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
107c0 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
107d0 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
107e0 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
107f0 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
10800 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
10810 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
10820 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10830 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
10840 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
10850 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10860 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
10870 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  0) FROM tbl;.   
10880 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10890 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
108a0 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
108b0 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
108c0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
108d0 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
108e0 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
108f0 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
10900 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
10910 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
10920 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
10930 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10940 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45   tbl;.      INSE
10950 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
10960 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
10970 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
10980 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 43 4f 4d  ROM tbl;.    COM
10990 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  MIT;.  }.} {}.do
109a0 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
109b0 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20 55 50  ger1-26.1 {.  UP
109c0 44 41 54 45 20 74 62 6c 20 53 45 54 20 62 20 3d  DATE tbl SET b =
109d0 20 61 5f 73 74 72 69 6e 67 28 35 35 30 29 3b 0a   a_string(550);.
109e0 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  } {}.db close.tv
109f0 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d   delete..#------
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a40 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ---.#.do_test pa
10a50 67 65 72 31 2e 32 37 2e 31 20 7b 0a 20 20 66 61  ger1.27.1 {.  fa
10a60 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
10a70 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74  d_reopen.  sqlit
10a80 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
10a90 74 73 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20  ts db.  execsql 
10aa0 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
10ab0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10ac0 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20  t1(a, b);.  }.  
10ad0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
10ae0 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65  fcounts db.  exe
10af0 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d  csql COMMIT.} {}
10b00 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
10b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
10b50 65 73 74 20 74 68 61 74 20 61 74 74 65 6d 70 74  est that attempt
10b60 69 6e 67 20 74 6f 20 6f 70 65 6e 20 61 20 77 72  ing to open a wr
10b70 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
10b80 77 69 74 68 20 0a 23 20 6c 6f 63 6b 69 6e 67 5f  with .# locking_
10b90 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 69  mode=exclusive i
10ba0 6e 20 57 41 4c 20 6d 6f 64 65 20 66 61 69 6c 73  n WAL mode fails
10bb0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   if there are ot
10bc0 68 65 72 20 63 6c 69 65 6e 74 73 20 6f 6e 20 0a  her clients on .
10bd0 23 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  # the same datab
10be0 61 73 65 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64  ase..#.catch { d
10bf0 62 20 63 6c 6f 73 65 20 7d 0a 69 66 63 61 70 61  b close }.ifcapa
10c00 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 6d  ble wal {.  do_m
10c10 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20  ulticlient_test 
10c20 74 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74  tn {.    do_test
10c30 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
10c40 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 20   {.      sql1 { 
10c50 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  .        PRAGMA 
10c60 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
10c70 41 4c 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  AL;.        CREA
10c80 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
10c90 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
10ca0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
10cb0 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
10cc0 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d 0a    }.    } {wal}.
10cd0 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
10ce0 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 73 71  r1-28.$tn.2 { sq
10cf0 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l2 { SELECT * FR
10d00 4f 4d 20 74 31 20 7d 20 7d 20 7b 61 20 62 7d 0a  OM t1 } } {a b}.
10d10 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
10d20 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73  er1-28.$tn.3 { s
10d30 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63  ql1 { PRAGMA loc
10d40 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
10d50 69 76 65 20 7d 20 7d 20 7b 65 78 63 6c 75 73 69  ive } } {exclusi
10d60 76 65 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  ve}.    do_test 
10d70 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 34 20  pager1-28.$tn.4 
10d80 7b 20 0a 20 20 20 20 20 20 63 73 71 6c 31 20 7b  { .      csql1 {
10d90 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49   BEGIN; INSERT I
10da0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63  NTO t1 VALUES('c
10db0 27 2c 20 27 64 27 29 3b 20 7d 0a 20 20 20 20 7d  ', 'd'); }.    }
10dc0 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
10dd0 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 20 20 63 6f   locked}}.    co
10de0 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73 65 20  de2 { db2 close 
10df0 3b 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65  ; sqlite3 db2 te
10e00 73 74 2e 64 62 20 7d 0a 20 20 20 20 64 6f 5f 74  st.db }.    do_t
10e10 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
10e20 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 73 71 6c  n.4 { .      sql
10e30 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  1 { INSERT INTO 
10e40 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27  t1 VALUES('c', '
10e50 64 27 29 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  d'); COMMIT }.  
10e60 20 20 7d 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d    } {}.  }.}..#-
10e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10eb0 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e 6f 72 6d 61  --------.# Norma
10ec0 6c 6c 79 2c 20 77 68 65 6e 20 63 68 61 6e 67 69  lly, when changi
10ed0 6e 67 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f  ng from journal_
10ee0 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 74 6f 20  mode=PERSIST to 
10ef0 44 45 4c 45 54 45 20 74 68 65 20 70 61 67 65 72  DELETE the pager
10f00 0a 23 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  .# attempts to d
10f10 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
10f20 6c 20 66 69 6c 65 2e 20 48 6f 77 65 76 65 72 2c  l file. However,
10f30 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 20 6f 62   if it cannot ob
10f40 74 61 69 6e 20 61 0a 23 20 52 45 53 45 52 56 45  tain a.# RESERVE
10f50 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
10f60 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
10f70 73 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  s step is skippe
10f80 64 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69  d..#.do_multicli
10f90 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20  ent_test tn {.  
10fa0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10fb0 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71  8.$tn.1 {.    sq
10fc0 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  l1 { .      PRAG
10fd0 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
10fe0 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20  = PERSIST;.     
10ff0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
11000 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e  (a, b);.      IN
11010 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11020 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
11030 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73     }.  } {persis
11040 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  t}.  do_test pag
11050 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20 66  er1-28.$tn.2 { f
11060 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
11070 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20  db-journal } 1. 
11080 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11090 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c 31 20  28.$tn.3 { sql1 
110a0 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
110b0 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d  _mode = DELETE }
110c0 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74   } delete.  do_t
110d0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
110e0 6e 2e 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74  n.4 { file exist
110f0 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
11100 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 0..  do_test
11110 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 35   pager1-28.$tn.5
11120 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20   {.    sql1 { . 
11130 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
11140 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
11150 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ST;.      INSERT
11160 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
11170 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20 7d  'c', 'd');.    }
11180 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20  .  } {persist}. 
11190 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
111a0 32 38 2e 24 74 6e 2e 36 20 7b 20 66 69 6c 65 20  28.$tn.6 { file 
111b0 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
111c0 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f  ournal } 1.  do_
111d0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
111e0 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32 20  tn.7 {.    sql2 
111f0 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20  { BEGIN; INSERT 
11200 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
11210 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20  e', 'f'); }.  } 
11220 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  {}.  do_test pag
11230 65 72 31 2d 32 38 2e 24 74 6e 2e 38 20 20 7b 20  er1-28.$tn.8  { 
11240 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
11250 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a  .db-journal } 1.
11260 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11270 2d 32 38 2e 24 74 6e 2e 39 20 20 7b 20 73 71 6c  -28.$tn.9  { sql
11280 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  1 { PRAGMA journ
11290 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
112a0 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f   } } delete.  do
112b0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
112c0 24 74 6e 2e 31 30 20 7b 20 66 69 6c 65 20 65 78  $tn.10 { file ex
112d0 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
112e0 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74  rnal } 1..  do_t
112f0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
11300 6e 2e 31 31 20 7b 20 73 71 6c 32 20 43 4f 4d 4d  n.11 { sql2 COMM
11310 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  IT } {}.  do_tes
11320 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11330 31 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  12 { file exists
11340 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
11350 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20   } 0..  do_test 
11360 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 33  pager1-28-$tn.13
11370 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b 20 73   {.    code1 { s
11380 65 74 20 63 68 61 6e 6e 65 6c 20 5b 64 62 20 69  et channel [db i
11390 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c  ncrblob -readonl
113a0 79 20 74 31 20 61 20 32 5d 20 7d 0a 20 20 20 20  y t1 a 2] }.    
113b0 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50 52 41  sql1 {.      PRA
113c0 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
113d0 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
113e0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
113f0 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68 27   VALUES('g', 'h'
11400 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65  );.    }.  } {pe
11410 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74  rsist}.  do_test
11420 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
11430 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  4 { file exists 
11440 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
11450 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } 1.  do_test pa
11460 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 35 20 7b  ger1-28.$tn.15 {
11470 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49  .    sql2 { BEGI
11480 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  N; INSERT INTO t
11490 31 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66  1 VALUES('e', 'f
114a0 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64  '); }.  } {}.  d
114b0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
114c0 2e 24 74 6e 2e 31 36 20 7b 20 73 71 6c 31 20 7b  .$tn.16 { sql1 {
114d0 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
114e0 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 20  mode = DELETE } 
114f0 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65  } delete.  do_te
11500 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11510 2e 31 37 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .17 { file exist
11520 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
11530 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74  l } 1..  do_test
11540 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
11550 37 20 7b 20 63 73 71 6c 32 20 7b 20 43 4f 4d 4d  7 { csql2 { COMM
11560 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  IT } } {1 {datab
11570 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
11580 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11590 2d 32 38 2d 24 74 6e 2e 31 38 20 7b 20 63 6f 64  -28-$tn.18 { cod
115a0 65 31 20 7b 20 72 65 61 64 20 24 63 68 61 6e 6e  e1 { read $chann
115b0 65 6c 20 7d 20 7d 20 63 0a 20 20 64 6f 5f 74 65  el } } c.  do_te
115c0 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e  st pager1-28-$tn
115d0 2e 31 39 20 7b 20 63 6f 64 65 31 20 7b 20 63 6c  .19 { code1 { cl
115e0 6f 73 65 20 24 63 68 61 6e 6e 65 6c 20 7d 20 7d  ose $channel } }
115f0 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
11600 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 30 20 7b  ger1-28.$tn.20 {
11610 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql2 { COMMIT }
11620 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74   } {}.}..do_test
11630 20 70 61 67 65 72 31 2d 32 39 2e 31 20 7b 0a 20   pager1-29.1 {. 
11640 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
11650 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
11660 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
11670 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
11680 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  024;.    PRAGMA 
11690 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 66 75  auto_vacuum = fu
116a0 6c 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c  ll;.    PRAGMA l
116b0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
116c0 75 73 69 76 65 3b 0a 20 20 20 20 43 52 45 41 54  usive;.    CREAT
116d0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
116e0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
116f0 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
11700 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  );.  }.  file si
11710 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78  ze test.db.} [ex
11720 70 72 20 31 30 32 34 2a 33 5d 0a 64 6f 5f 74 65  pr 1024*3].do_te
11730 73 74 20 70 61 67 65 72 31 2d 32 39 2e 32 20 7b  st pager1-29.2 {
11740 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11750 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
11760 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 56 41  e = 4096;.    VA
11770 43 55 55 4d 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  CUUM;.  }.  file
11780 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
11790 5b 65 78 70 72 20 34 30 39 36 2a 33 5d 0a 0a 23  [expr 4096*3]..#
117a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
117f0 20 74 68 61 74 20 69 66 20 61 6e 20 65 6d 70 74   that if an empt
11800 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
11810 28 73 69 7a 65 20 30 20 62 79 74 65 73 29 20 69  (size 0 bytes) i
11820 73 20 6f 70 65 6e 65 64 20 69 6e 20 0a 23 20 65  s opened in .# e
11830 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
11840 20 6d 6f 64 65 2c 20 61 6e 79 20 6a 6f 75 72 6e   mode, any journ
11850 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  al file is delet
11860 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
11870 2d 73 79 73 74 65 6d 0a 23 20 77 69 74 68 6f 75  -system.# withou
11880 74 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  t being rolled b
11890 61 63 6b 2e 20 41 6e 64 20 74 68 61 74 20 74 68  ack. And that th
118a0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
118b0 6f 62 74 61 69 6e 65 64 20 77 68 69 6c 65 0a 23  obtained while.#
118c0 20 64 6f 69 6e 67 20 74 68 69 73 20 69 73 20 6e   doing this is n
118d0 6f 74 20 72 65 6c 65 61 73 65 64 2e 0a 23 0a 64  ot released..#.d
118e0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 30  o_test pager1-30
118f0 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .1 {.  db close.
11900 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65    delete_file te
11910 73 74 2e 64 62 0a 20 20 64 65 6c 65 74 65 5f 66  st.db.  delete_f
11920 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ile test.db-jour
11930 6e 61 6c 0a 20 20 73 65 74 20 66 64 20 5b 6f 70  nal.  set fd [op
11940 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  en test.db-journ
11950 61 6c 20 77 5d 0a 20 20 73 65 65 6b 20 24 66 64  al w].  seek $fd
11960 20 5b 65 78 70 72 20 35 31 32 2b 31 30 33 32 2a   [expr 512+1032*
11970 32 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77  2].  puts -nonew
11980 6c 69 6e 65 20 24 66 64 20 78 0a 20 20 63 6c 6f  line $fd x.  clo
11990 73 65 20 24 66 64 0a 0a 20 20 73 71 6c 69 74 65  se $fd..  sqlite
119a0 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
119b0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
119c0 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
119d0 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  =EXCLUSIVE;.    
119e0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
119f0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
11a00 65 72 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c  er;.    PRAGMA l
11a10 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a  ock_status;.  }.
11a20 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 30 20 6d  } {exclusive 0 m
11a30 61 69 6e 20 72 65 73 65 72 76 65 64 20 74 65 6d  ain reserved tem
11a40 70 20 63 6c 6f 73 65 64 7d 0a 0a 23 2d 2d 2d 2d  p closed}..#----
11a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a90 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
11aa0 74 20 69 66 20 74 68 65 20 22 70 61 67 65 2d 73  t if the "page-s
11ab0 69 7a 65 22 20 66 69 65 6c 64 20 69 6e 20 61 20  ize" field in a 
11ac0 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
11ad0 73 20 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s 0, the journal
11ae0 0a 23 20 66 69 6c 65 20 63 61 6e 20 73 74 69 6c  .# file can stil
11af0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
11b00 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
11b10 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64 20  ed for backward 
11b20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 0a  compatibility -.
11b30 23 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  # versions of SQ
11b40 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e  Lite prior to 3.
11b50 35 2e 38 20 61 6c 77 61 79 73 20 73 65 74 20 74  5.8 always set t
11b60 68 69 73 20 66 69 65 6c 64 20 74 6f 20 7a 65 72  his field to zer
11b70 6f 2e 0a 23 0a 69 66 20 7b 24 74 63 6c 5f 70 6c  o..#.if {$tcl_pl
11b80 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29  atform(platform)
11b90 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 64 6f 5f 74  =="unix"} {.do_t
11ba0 65 73 74 20 70 61 67 65 72 31 2d 33 31 2e 31 20  est pager1-31.1 
11bb0 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
11bc0 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
11bd0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
11be0 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
11bf0 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d   = 10;.    PRAGM
11c00 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
11c10 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  24;.    CREATE T
11c20 41 42 4c 45 20 74 31 28 78 2c 20 79 2c 20 55 4e  ABLE t1(x, y, UN
11c30 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
11c40 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11c50 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
11c60 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
11c70 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20  lob(1500));.    
11c80 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
11c90 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
11ca0 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
11cb0 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
11cc0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11cd0 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
11ce0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
11cf0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
11d00 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
11d10 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
11d20 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
11d30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
11d40 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
11d50 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11d60 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
11d70 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
11d80 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
11d90 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
11da0 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
11db0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
11dc0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
11dd0 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
11de0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
11df0 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
11e00 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
11e10 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
11e20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11e30 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
11e40 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
11e50 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
11e60 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
11e70 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
11e80 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
11e90 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
11ea0 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
11eb0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
11ec0 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
11ed0 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
11ee0 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
11ef0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11f00 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
11f10 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
11f20 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
11f30 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 47 49  ROM t1;.    BEGI
11f40 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
11f50 74 31 20 53 45 54 20 79 20 3d 20 72 61 6e 64 6f  t1 SET y = rando
11f60 6d 62 6c 6f 62 28 31 34 39 39 29 3b 0a 20 20 7d  mblob(1499);.  }
11f70 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73  .  copy_file tes
11f80 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20  t.db test.db2.  
11f90 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64  copy_file test.d
11fa0 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64  b-journal test.d
11fb0 62 32 2d 6a 6f 75 72 6e 61 6c 0a 20 20 0a 20 20  b2-journal.  .  
11fc0 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
11fd0 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 32 34 20  .db2-journal 24 
11fe0 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74  00000000.  sqlit
11ff0 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
12000 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
12010 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
12020 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a  ck } db2.} {ok}.
12030 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
12040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
12080 54 65 73 74 20 74 68 61 74 20 61 20 64 61 74 61  Test that a data
12090 62 61 73 65 20 66 69 6c 65 20 63 61 6e 20 62 65  base file can be
120a0 20 22 70 72 65 2d 68 69 6e 74 65 64 22 20 74 6f   "pre-hinted" to
120b0 20 61 20 63 65 72 74 61 69 6e 20 73 69 7a 65 20   a certain size 
120c0 61 6e 64 20 74 68 61 74 0a 23 20 73 75 62 73 65  and that.# subse
120d0 71 75 65 6e 74 20 73 70 69 6c 6c 69 6e 67 20 6f  quent spilling o
120e0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
120f0 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 75 6c  e does not resul
12100 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
12110 65 0a 23 20 66 69 6c 65 20 62 65 69 6e 67 20 73  e.# file being s
12120 68 72 75 6e 6b 2e 0a 23 0a 63 61 74 63 68 20 7b  hrunk..#.catch {
12130 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72 63 65 64  db close}.forced
12140 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 0a 64  elete test.db..d
12150 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 32  o_test pager1-32
12160 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .1 {.  sqlite3 d
12170 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
12180 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
12190 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b   TABLE t1(x, y);
121a0 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
121b0 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
121c0 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
121d0 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
121e0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
121f0 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62  ALUES(1, randomb
12200 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 7d  lob(10000));.  }
12210 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  .  file_control_
12220 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 64  chunksize_test d
12230 62 20 6d 61 69 6e 20 31 30 32 34 0a 20 20 66 69  b main 1024.  fi
12240 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68  le_control_sizeh
12250 69 6e 74 5f 74 65 73 74 20 64 62 20 6d 61 69 6e  int_test db main
12260 20 32 30 39 37 31 35 32 30 3b 20 23 20 32 30 4d   20971520; # 20M
12270 42 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  B.  execsql {.  
12280 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
12290 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 49 4e  ize = 10;.    IN
122a0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
122b0 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(1, randomblo
122c0 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20 20 49  b(10000));.    I
122d0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
122e0 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(2, randombl
122f0 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20 20  ob(10000));.    
12300 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12310 45 4c 45 43 54 20 78 2b 32 2c 20 72 61 6e 64 6f  ELECT x+2, rando
12320 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f  mblob(10000) fro
12330 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  m t1;.    INSERT
12340 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
12350 78 2b 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  x+4, randomblob(
12360 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a  10000) from t1;.
12370 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12380 74 31 20 53 45 4c 45 43 54 20 78 2b 38 2c 20 72  t1 SELECT x+8, r
12390 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29  andomblob(10000)
123a0 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e   from t1;.    IN
123b0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
123c0 45 43 54 20 78 2b 31 36 2c 20 72 61 6e 64 6f 6d  ECT x+16, random
123d0 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d  blob(10000) from
123e0 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   t1;.    SELECT 
123f0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
12400 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
12410 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66  }.  db close.  f
12420 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
12430 0a 7d 20 7b 32 30 39 37 31 35 32 30 7d 0a 0a 23  .} {20971520}..#
12440 20 43 6c 65 61 6e 75 70 20 32 30 4d 42 20 66 69   Cleanup 20MB fi
12450 6c 65 20 6c 65 66 74 20 62 79 20 74 68 65 20 70  le left by the p
12460 72 65 76 69 6f 75 73 20 74 65 73 74 2e 0a 66 6f  revious test..fo
12470 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
12480 62 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     b..finish_test.