/ Hex Artifact Content
Login

Artifact 1e9ee778bdeaf4f7f09997d029cdaca6a42dfc2092edafe4f5e590acbf1eab13:


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 73 65 74 20 74 65 73 74 70 72  n.tcl.set testpr
0210: 65 66 69 78 20 70 61 67 65 72 31 0a 0a 69 66 20  efix pager1..if 
0220: 7b 5b 61 74 6f 6d 69 63 5f 62 61 74 63 68 5f 77  {[atomic_batch_w
0230: 72 69 74 65 20 74 65 73 74 2e 64 62 5d 7d 20 7b  rite test.db]} {
0240: 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20  .  finish_test. 
0250: 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 44 6f 20   return.}..# Do 
0260: 6e 6f 74 20 75 73 65 20 61 20 63 6f 64 65 63 20  not use a codec 
0270: 66 6f 72 20 74 65 73 74 73 20 69 6e 20 74 68 69  for tests in thi
0280: 73 20 66 69 6c 65 2c 20 61 73 20 74 68 65 20 64  s file, as the d
0290: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
02a0: 23 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 64 69  # manipulated di
02b0: 72 65 63 74 6c 79 20 75 73 69 6e 67 20 74 63 6c  rectly using tcl
02c0: 20 73 63 72 69 70 74 73 20 28 75 73 69 6e 67 20   scripts (using 
02d0: 74 68 65 20 5b 68 65 78 69 6f 5f 77 72 69 74 65  the [hexio_write
02e0: 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f  ] command)..#.do
02f0: 5f 6e 6f 74 5f 75 73 65 5f 63 6f 64 65 63 0a 0a  _not_use_codec..
0300: 23 0a 23 20 70 61 67 65 72 31 2d 31 2e 2a 3a 20  #.# pager1-1.*: 
0310: 54 65 73 74 20 69 6e 74 65 72 2d 70 72 6f 63 65  Test inter-proce
0320: 73 73 20 6c 6f 63 6b 69 6e 67 20 28 63 6c 69 65  ss locking (clie
0330: 6e 74 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  nts in multiple 
0340: 70 72 6f 63 65 73 73 65 73 29 2e 0a 23 0a 23 20  processes)..#.# 
0350: 70 61 67 65 72 31 2d 32 2e 2a 3a 20 54 65 73 74  pager1-2.*: Test
0360: 20 69 6e 74 72 61 2d 70 72 6f 63 65 73 73 20 6c   intra-process l
0370: 6f 63 6b 69 6e 67 20 28 6d 75 6c 74 69 70 6c 65  ocking (multiple
0380: 20 63 6c 69 65 6e 74 73 20 69 6e 20 74 68 69 73   clients in this
0390: 20 70 72 6f 63 65 73 73 29 2e 0a 23 0a 23 20 70   process)..#.# p
03a0: 61 67 65 72 31 2d 33 2e 2a 3a 20 53 61 76 65 70  ager1-3.*: Savep
03b0: 6f 69 6e 74 20 72 65 6c 61 74 65 64 20 74 65 73  oint related tes
03c0: 74 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 34  ts..#.# pager1-4
03d0: 2e 2a 3a 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20  .*: Hot-journal 
03e0: 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a 23  related tests..#
03f0: 0a 23 20 70 61 67 65 72 31 2d 35 2e 2a 3a 20 43  .# pager1-5.*: C
0400: 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f 20  ases related to 
0410: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
0420: 74 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 36  ts..#.# pager1-6
0430: 2e 2a 3a 20 43 61 73 65 73 20 72 65 6c 61 74 65  .*: Cases relate
0440: 64 20 74 6f 20 22 50 52 41 47 4d 41 20 6d 61 78  d to "PRAGMA max
0450: 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a 23 0a 23  _page_count".#.#
0460: 20 70 61 67 65 72 31 2d 37 2e 2a 3a 20 43 61 73   pager1-7.*: Cas
0470: 65 73 20 73 70 65 63 69 66 69 63 20 74 6f 20 22  es specific to "
0480: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
0490: 6f 64 65 3d 54 52 55 4e 43 41 54 45 22 0a 23 0a  ode=TRUNCATE".#.
04a0: 23 20 70 61 67 65 72 31 2d 38 2e 2a 3a 20 43 61  # pager1-8.*: Ca
04b0: 73 65 73 20 75 73 69 6e 67 20 74 65 6d 70 6f 72  ses using tempor
04c0: 61 72 79 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72  ary and in-memor
04d0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 23  y databases..#.#
04e0: 20 70 61 67 65 72 31 2d 39 2e 2a 3a 20 54 65 73   pager1-9.*: Tes
04f0: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68  ts related to th
0500: 65 20 62 61 63 6b 75 70 20 41 50 49 2e 0a 23 0a  e backup API..#.
0510: 23 20 70 61 67 65 72 31 2d 31 30 2e 2a 3a 20 54  # pager1-10.*: T
0520: 65 73 74 20 74 68 61 74 20 74 68 65 20 61 73 73  est that the ass
0530: 75 6d 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  umed file-system
0540: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
0550: 6c 69 6d 69 74 65 64 20 74 6f 0a 23 20 20 20 20  limited to.#    
0560: 20 20 20 20 20 20 20 20 20 20 36 34 4b 42 2e 0a            64KB..
0570: 23 0a 23 20 70 61 67 65 72 31 2d 31 32 2e 2a 3a  #.# pager1-12.*:
0580: 20 54 65 73 74 73 20 69 6e 76 6f 6c 76 69 6e 67   Tests involving
0590: 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69   "PRAGMA page_si
05a0: 7a 65 22 0a 23 0a 23 20 70 61 67 65 72 31 2d 31  ze".#.# pager1-1
05b0: 33 2e 2a 3a 20 43 61 73 65 73 20 73 70 65 63 69  3.*: Cases speci
05c0: 66 69 63 20 74 6f 20 22 50 52 41 47 4d 41 20 6a  fic to "PRAGMA j
05d0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53  ournal_mode=PERS
05e0: 49 53 54 22 0a 23 0a 23 20 70 61 67 65 72 31 2d  IST".#.# pager1-
05f0: 31 34 2e 2a 3a 20 43 61 73 65 73 20 73 70 65 63  14.*: Cases spec
0600: 69 66 69 63 20 74 6f 20 22 50 52 41 47 4d 41 20  ific to "PRAGMA 
0610: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46  journal_mode=OFF
0620: 22 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 35 2e  ".#.# pager1-15.
0630: 2a 3a 20 56 61 72 79 69 6e 67 20 73 71 6c 69 74  *: Varying sqlit
0640: 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69 6c 65 0a  e3_vfs.szOsFile.
0650: 23 0a 23 20 70 61 67 65 72 31 2d 31 36 2e 2a 3a  #.# pager1-16.*:
0660: 20 56 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33   Varying sqlite3
0670: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 0a  _vfs.mxPathname.
0680: 23 0a 23 20 70 61 67 65 72 31 2d 31 37 2e 2a 3a  #.# pager1-17.*:
0690: 20 54 65 73 74 73 20 72 65 6c 61 74 65 64 20 74   Tests related t
06a0: 6f 20 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72  o "PRAGMA omit_r
06b0: 65 61 64 6c 6f 63 6b 22 0a 23 20 20 20 20 20 20  eadlock".#      
06c0: 20 20 20 20 20 20 20 20 28 54 68 65 20 6f 6d 69          (The omi
06d0: 74 5f 72 65 61 64 6c 6f 63 6b 20 70 72 61 67 6d  t_readlock pragm
06e0: 61 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  a has been remov
06f0: 65 64 20 61 6e 64 20 73 6f 20 68 61 76 65 0a 23  ed and so have.#
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
0710: 65 73 65 20 74 65 73 74 73 2e 29 0a 23 0a 23 20  ese tests.).#.# 
0720: 70 61 67 65 72 31 2d 31 38 2e 2a 3a 20 54 65 73  pager1-18.*: Tes
0730: 74 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  t that the pager
0740: 20 6c 61 79 65 72 20 72 65 73 70 6f 6e 64 73 20   layer responds 
0750: 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74 68 65  correctly if the
0760: 20 62 2d 74 72 65 65 0a 23 20 20 20 20 20 20 20   b-tree.#       
0770: 20 20 20 20 20 20 20 72 65 71 75 65 73 74 73 20         requests 
0780: 61 6e 20 69 6e 76 61 6c 69 64 20 70 61 67 65 20  an invalid page 
0790: 6e 75 6d 62 65 72 20 28 64 75 65 20 74 6f 20 64  number (due to d
07a0: 62 20 63 6f 72 72 75 70 74 69 6f 6e 29 2e 0a 23  b corruption)..#
07b0: 0a 0a 70 72 6f 63 20 72 65 63 75 72 73 69 76 65  ..proc recursive
07c0: 5f 73 65 6c 65 63 74 20 7b 69 64 20 74 61 62 6c  _select {id tabl
07d0: 65 20 7b 73 63 72 69 70 74 20 7b 7d 7d 7d 20 7b  e {script {}}} {
07e0: 0a 20 20 73 65 74 20 63 6e 74 20 30 0a 20 20 64  .  set cnt 0.  d
07f0: 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 72  b eval "SELECT r
0800: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 24 74 61  owid, * FROM $ta
0810: 62 6c 65 20 57 48 45 52 45 20 72 6f 77 69 64 20  ble WHERE rowid 
0820: 3d 20 28 24 69 64 2d 31 29 22 20 7b 0a 20 20 20  = ($id-1)" {.   
0830: 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63   recursive_selec
0840: 74 20 24 72 6f 77 69 64 20 24 74 61 62 6c 65 20  t $rowid $table 
0850: 24 73 63 72 69 70 74 0a 20 20 20 20 69 6e 63 72  $script.    incr
0860: 20 63 6e 74 0a 20 20 7d 0a 20 20 69 66 20 7b 24   cnt.  }.  if {$
0870: 63 6e 74 3d 3d 30 7d 20 7b 20 65 76 61 6c 20 24  cnt==0} { eval $
0880: 73 63 72 69 70 74 20 7d 0a 7d 0a 0a 73 65 74 20  script }.}..set 
0890: 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  a_string_counter
08a0: 20 31 0a 70 72 6f 63 20 61 5f 73 74 72 69 6e 67   1.proc a_string
08b0: 20 7b 6e 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20   {n} {.  global 
08c0: 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  a_string_counter
08d0: 0a 20 20 69 6e 63 72 20 61 5f 73 74 72 69 6e 67  .  incr a_string
08e0: 5f 63 6f 75 6e 74 65 72 0a 20 20 73 74 72 69 6e  _counter.  strin
08f0: 67 20 72 61 6e 67 65 20 5b 73 74 72 69 6e 67 20  g range [string 
0900: 72 65 70 65 61 74 20 22 24 7b 61 5f 73 74 72 69  repeat "${a_stri
0910: 6e 67 5f 63 6f 75 6e 74 65 72 7d 2e 22 20 24 6e  ng_counter}." $n
0920: 5d 20 31 20 24 6e 0a 7d 0a 64 62 20 66 75 6e 63  ] 1 $n.}.db func
0930: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
0940: 6e 67 0a 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65  ng..do_multiclie
0950: 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 0a 20 20  nt_test tn {..  
0960: 23 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70  # Create and pop
0970: 75 6c 61 74 65 20 61 20 64 61 74 61 62 61 73 65  ulate a database
0980: 20 74 61 62 6c 65 20 75 73 69 6e 67 20 63 6f 6e   table using con
0990: 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 2e 20 43 68  nection [db]. Ch
09a0: 65 63 6b 20 0a 20 20 23 20 74 68 61 74 20 63 6f  eck .  # that co
09b0: 6e 6e 65 63 74 69 6f 6e 73 20 5b 64 62 32 5d 20  nnections [db2] 
09c0: 61 6e 64 20 5b 64 62 33 5d 20 63 61 6e 20 73 65  and [db3] can se
09d0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 61 6e 64  e the schema and
09e0: 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20   content..  #.  
09f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0a00: 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20  tn.1 {.    sql1 
0a10: 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  {.      CREATE T
0a20: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
0a30: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 20  Y KEY, b);.     
0a40: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
0a50: 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 20   ON t1(b);.     
0a60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0a70: 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29  VALUES(1, 'one')
0a80: 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  ; INSERT INTO t1
0a90: 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27   VALUES(2, 'two'
0aa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  );.    }.  } {}.
0ab0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0ac0: 2d 24 74 6e 2e 32 20 7b 20 73 71 6c 32 20 7b 20  -$tn.2 { sql2 { 
0ad0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0ae0: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
0af0: 6f 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  o}.  do_test pag
0b00: 65 72 31 2d 24 74 6e 2e 33 20 7b 20 73 71 6c 33  er1-$tn.3 { sql3
0b10: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0b20: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
0b30: 20 74 77 6f 7d 0a 0a 20 20 23 20 4f 70 65 6e 20   two}..  # Open 
0b40: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
0b50: 64 20 61 64 64 20 61 20 72 6f 77 20 75 73 69 6e  d add a row usin
0b60: 67 20 5b 64 62 5d 2e 20 54 68 69 73 20 70 75 74  g [db]. This put
0b70: 73 20 5b 64 62 5d 20 69 6e 0a 20 20 23 20 52 45  s [db] in.  # RE
0b80: 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 43 68  SERVED state. Ch
0b90: 65 63 6b 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  eck that connect
0ba0: 69 6f 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20 5b  ions [db2] and [
0bb0: 64 62 33 5d 20 63 61 6e 20 73 74 69 6c 6c 0a 20  db3] can still. 
0bc0: 20 23 20 72 65 61 64 20 74 68 65 20 64 61 74 61   # read the data
0bd0: 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 61 73 20  base content as 
0be0: 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
0bf0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
0c00: 73 0a 20 20 23 20 6f 70 65 6e 65 64 2e 20 5b 64  s.  # opened. [d
0c10: 62 5d 20 73 68 6f 75 6c 64 20 73 65 65 20 74 68  b] should see th
0c20: 65 20 69 6e 73 65 72 74 65 64 20 72 6f 77 2e 0a  e inserted row..
0c30: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61    #.  do_test pa
0c40: 67 65 72 31 2d 24 74 6e 2e 34 20 7b 0a 20 20 20  ger1-$tn.4 {.   
0c50: 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 42 45   sql1 {.      BE
0c60: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  GIN;.        INS
0c70: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0c80: 45 53 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a  ES(3, 'three');.
0c90: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
0ca0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
0cb0: 6e 2e 35 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c  n.5 { sql2 { SEL
0cc0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
0cd0: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a  } {1 one 2 two}.
0ce0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0cf0: 2d 24 74 6e 2e 37 20 7b 20 73 71 6c 31 20 7b 20  -$tn.7 { sql1 { 
0d00: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0d10: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
0d20: 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20  o 3 three}..  # 
0d30: 5b 64 62 5d 20 73 74 69 6c 6c 20 68 61 73 20 61  [db] still has a
0d40: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
0d50: 6e 73 61 63 74 69 6f 6e 2e 20 43 68 65 63 6b 20  nsaction. Check 
0d60: 74 68 61 74 20 74 68 69 73 20 70 72 65 76 65 6e  that this preven
0d70: 74 73 0a 20 20 23 20 6f 74 68 65 72 20 63 6f 6e  ts.  # other con
0d80: 6e 65 63 74 69 6f 6e 73 20 28 73 70 65 63 69 66  nections (specif
0d90: 69 63 61 6c 6c 79 20 5b 64 62 32 5d 29 20 66 72  ically [db2]) fr
0da0: 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  om writing to th
0db0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 23 0a  e database..  #.
0dc0: 20 20 23 20 45 76 65 6e 20 69 66 20 5b 64 62 32    # Even if [db2
0dd0: 5d 20 6f 70 65 6e 73 20 61 20 74 72 61 6e 73 61  ] opens a transa
0de0: 63 74 69 6f 6e 20 66 69 72 73 74 2c 20 69 74 20  ction first, it 
0df0: 6d 61 79 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  may not write to
0e00: 20 74 68 65 0a 20 20 23 20 64 61 74 61 62 61 73   the.  # databas
0e10: 65 2e 20 41 66 74 65 72 20 74 68 65 20 61 74 74  e. After the att
0e20: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 68  empt to write th
0e30: 65 20 64 62 20 77 69 74 68 69 6e 20 61 20 74 72  e db within a tr
0e40: 61 6e 73 61 63 74 69 6f 6e 2c 20 0a 20 20 23 20  ansaction, .  # 
0e50: 5b 64 62 32 5d 20 69 73 20 6c 65 66 74 20 77 69  [db2] is left wi
0e60: 74 68 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73  th an open trans
0e70: 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 6f 74 20  action, but not 
0e80: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 0a 20  a read-lock on. 
0e90: 20 23 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61   # the main data
0ea0: 62 61 73 65 2e 20 53 6f 20 69 74 20 64 6f 65 73  base. So it does
0eb0: 20 6e 6f 74 20 70 72 65 76 65 6e 74 20 5b 64 62   not prevent [db
0ec0: 5d 20 66 72 6f 6d 20 63 6f 6d 6d 69 74 74 69 6e  ] from committin
0ed0: 67 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  g..  #.  do_test
0ee0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 38 20 7b 20   pager1-$tn.8 { 
0ef0: 0a 20 20 20 20 63 73 71 6c 32 20 7b 20 55 50 44  .    csql2 { UPD
0f00: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61  ATE t1 SET a = a
0f10: 20 2b 20 31 30 20 7d 0a 20 20 7d 20 7b 31 20 7b   + 10 }.  } {1 {
0f20: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
0f30: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ed}}.  do_test p
0f40: 61 67 65 72 31 2d 24 74 6e 2e 39 20 7b 20 0a 20  ager1-$tn.9 { . 
0f50: 20 20 20 63 73 71 6c 32 20 7b 20 0a 20 20 20 20     csql2 { .    
0f60: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55    BEGIN;.      U
0f70: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d  PDATE t1 SET a =
0f80: 20 61 20 2b 20 31 30 3b 0a 20 20 20 20 7d 0a 20   a + 10;.    }. 
0f90: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
0fa0: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23  is locked}}..  #
0fb0: 20 48 61 76 65 20 5b 64 62 5d 20 63 6f 6d 6d 69   Have [db] commi
0fc0: 74 20 69 74 73 20 74 72 61 6e 73 61 63 74 69 6f  t its transactio
0fd0: 6e 73 2e 20 43 68 65 63 6b 20 74 68 65 20 6f 74  ns. Check the ot
0fe0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
0ff0: 63 61 6e 0a 20 20 23 20 6e 6f 77 20 73 65 65 20  can.  # now see 
1000: 74 68 65 20 6e 65 77 20 64 61 74 61 62 61 73 65  the new database
1010: 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20   content..  #.  
1020: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1030: 74 6e 2e 31 30 20 7b 20 73 71 6c 31 20 7b 20 43  tn.10 { sql1 { C
1040: 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64  OMMIT } } {}.  d
1050: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1060: 6e 2e 31 31 20 7b 20 73 71 6c 31 20 7b 20 53 45  n.11 { sql1 { SE
1070: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1080: 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20   } {1 one 2 two 
1090: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
10a0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 32  st pager1-$tn.12
10b0: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
10c0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
10d0: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
10e0: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
10f0: 61 67 65 72 31 2d 24 74 6e 2e 31 33 20 7b 20 73  ager1-$tn.13 { s
1100: 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql3 { SELECT * F
1110: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1120: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1130: 0a 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74  ..  # Check that
1140: 2c 20 61 73 20 6e 6f 74 65 64 20 61 62 6f 76 65  , as noted above
1150: 2c 20 5b 64 62 32 5d 20 72 65 61 6c 6c 79 20 64  , [db2] really d
1160: 69 64 20 6b 65 65 70 20 61 6e 20 6f 70 65 6e 20  id keep an open 
1170: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 23 20  transaction.  # 
1180: 61 66 74 65 72 20 74 68 65 20 61 74 74 65 6d 70  after the attemp
1190: 74 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64  t to write the d
11a0: 61 74 61 62 61 73 65 20 66 61 69 6c 65 64 2e 0a  atabase failed..
11b0: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61    #.  do_test pa
11c0: 67 65 72 31 2d 24 74 6e 2e 31 34 20 7b 20 0a 20  ger1-$tn.14 { . 
11d0: 20 20 20 63 73 71 6c 32 20 7b 20 42 45 47 49 4e     csql2 { BEGIN
11e0: 20 7d 20 0a 20 20 7d 20 7b 31 20 7b 63 61 6e 6e   } .  } {1 {cann
11f0: 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  ot start a trans
1200: 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20  action within a 
1210: 74 72 61 6e 73 61 63 74 69 6f 6e 7d 7d 0a 20 20  transaction}}.  
1220: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1230: 74 6e 2e 31 35 20 7b 20 73 71 6c 32 20 7b 20 52  tn.15 { sql2 { R
1240: 4f 4c 4c 42 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a  OLLBACK } } {}..
1250: 20 20 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f    # Have [db2] o
1260: 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  pen a transactio
1270: 6e 20 61 6e 64 20 74 61 6b 65 20 61 20 72 65 61  n and take a rea
1280: 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
1290: 74 61 62 61 73 65 2e 0a 20 20 23 20 43 68 65 63  tabase..  # Chec
12a0: 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 65 76  k that this prev
12b0: 65 6e 74 73 20 5b 64 62 5d 20 66 72 6f 6d 20 77  ents [db] from w
12c0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
12d0: 74 61 62 61 73 65 20 28 6f 75 74 73 69 64 65 0a  tabase (outside.
12e0: 20 20 23 20 6f 66 20 61 6e 79 20 74 72 61 6e 73    # of any trans
12f0: 61 63 74 69 6f 6e 29 2e 20 41 66 74 65 72 20 74  action). After t
1300: 68 69 73 20 66 61 69 6c 73 2c 20 63 68 65 63 6b  his fails, check
1310: 20 74 68 61 74 20 5b 64 62 33 5d 20 63 61 6e 20   that [db3] can 
1320: 72 65 61 64 0a 20 20 23 20 74 68 65 20 64 62 20  read.  # the db 
1330: 28 73 68 6f 77 69 6e 67 20 74 68 61 74 20 5b 64  (showing that [d
1340: 62 5d 20 64 69 64 20 6e 6f 74 20 74 61 6b 65 20  b] did not take 
1350: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 65  a PENDING lock e
1360: 74 63 2e 29 0a 20 20 23 0a 20 20 64 6f 5f 74 65  tc.).  #.  do_te
1370: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 35  st pager1-$tn.15
1380: 20 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 42   { .    sql2 { B
1390: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46  EGIN; SELECT * F
13a0: 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31  ROM t1; }.  } {1
13b0: 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72   one 2 two 3 thr
13c0: 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ee}.  do_test pa
13d0: 67 65 72 31 2d 24 74 6e 2e 31 36 20 7b 20 0a 20  ger1-$tn.16 { . 
13e0: 20 20 20 63 73 71 6c 31 20 7b 20 55 50 44 41 54     csql1 { UPDAT
13f0: 45 20 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b  E t1 SET a = a +
1400: 20 31 30 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61   10 }.  } {1 {da
1410: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
1420: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }}.  do_test pag
1430: 65 72 31 2d 24 74 6e 2e 31 37 20 7b 20 73 71 6c  er1-$tn.17 { sql
1440: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
1450: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20  M t1 } } {1 one 
1460: 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a  2 two 3 three}..
1470: 20 20 23 20 54 68 69 73 20 74 69 6d 65 2c 20 68    # This time, h
1480: 61 76 65 20 5b 64 62 5d 20 6f 70 65 6e 20 61 20  ave [db] open a 
1490: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
14a0: 72 65 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  re writing the d
14b0: 61 74 61 62 61 73 65 2e 0a 20 20 23 20 54 68 69  atabase..  # Thi
14c0: 73 20 77 6f 72 6b 73 20 2d 20 5b 64 62 5d 20 67  s works - [db] g
14d0: 65 74 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  ets a RESERVED l
14e0: 6f 63 6b 20 77 68 69 63 68 20 64 6f 65 73 20 6e  ock which does n
14f0: 6f 74 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68  ot conflict with
1500: 0a 20 20 23 20 74 68 65 20 53 48 41 52 45 44 20  .  # the SHARED 
1510: 6c 6f 63 6b 20 5b 64 62 32 5d 20 69 73 20 68 6f  lock [db2] is ho
1520: 6c 64 69 6e 67 2e 0a 20 20 23 0a 20 20 64 6f 5f  lding..  #.  do_
1530: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1540: 31 38 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b  18 { .    sql1 {
1550: 20 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 20 20   .      BEGIN;  
1560: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31  .      UPDATE t1
1570: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 3b   SET a = a + 10;
1580: 20 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20   .    }.  } {}. 
1590: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
15a0: 24 74 6e 2d 31 39 20 7b 20 0a 20 20 20 20 73 71  $tn-19 { .    sq
15b0: 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b  l1 { PRAGMA lock
15c0: 5f 73 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b  _status } .  } {
15d0: 6d 61 69 6e 20 72 65 73 65 72 76 65 64 20 74 65  main reserved te
15e0: 6d 70 20 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f  mp closed}.  do_
15f0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d  test pager1-$tn-
1600: 32 30 20 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b  20 { .    sql2 {
1610: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
1620: 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e  tus } .  } {main
1630: 20 73 68 61 72 65 64 20 74 65 6d 70 20 63 6c 6f   shared temp clo
1640: 73 65 64 7d 0a 0a 20 20 23 20 43 68 65 63 6b 20  sed}..  # Check 
1650: 74 68 61 74 20 61 6c 6c 20 63 6f 6e 6e 65 63 74  that all connect
1660: 69 6f 6e 73 20 63 61 6e 20 73 74 69 6c 6c 20 72  ions can still r
1670: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1680: 2e 20 4f 6e 6c 79 20 5b 64 62 5d 20 73 65 65 73  . Only [db] sees
1690: 0a 20 20 23 20 74 68 65 20 75 70 64 61 74 65 64  .  # the updated
16a0: 20 63 6f 6e 74 65 6e 74 20 28 61 73 20 74 68 65   content (as the
16b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
16c0: 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 6d 69 74   not been commit
16d0: 74 65 64 20 79 65 74 29 2e 0a 20 20 23 0a 20 20  ted yet)..  #.  
16e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
16f0: 74 6e 2e 32 31 20 7b 20 73 71 6c 31 20 7b 20 53  tn.21 { sql1 { S
1700: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1710: 7d 20 7d 20 7b 31 31 20 6f 6e 65 20 31 32 20 74  } } {11 one 12 t
1720: 77 6f 20 31 33 20 74 68 72 65 65 7d 0a 20 20 64  wo 13 three}.  d
1730: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1740: 6e 2e 32 32 20 7b 20 73 71 6c 32 20 7b 20 53 45  n.22 { sql2 { SE
1750: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1760: 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20   } {1 one 2 two 
1770: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
1780: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 33  st pager1-$tn.23
1790: 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54   { sql3 { SELECT
17a0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
17b0: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
17c0: 72 65 65 7d 0a 0a 20 20 23 20 42 65 63 61 75 73  ree}..  # Becaus
17d0: 65 20 5b 64 62 32 5d 20 73 74 69 6c 6c 20 68 61  e [db2] still ha
17e0: 73 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  s the SHARED loc
17f0: 6b 2c 20 5b 64 62 5d 20 69 73 20 75 6e 61 62 6c  k, [db] is unabl
1800: 65 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  e to commit the.
1810: 20 20 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e    # transaction.
1820: 20 49 66 20 69 74 20 74 72 69 65 73 2c 20 61 6e   If it tries, an
1830: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1840: 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 6e 65  ed and the conne
1850: 63 74 69 6f 6e 20 0a 20 20 23 20 75 70 67 72 61  ction .  # upgra
1860: 64 65 73 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  des to a PENDING
1870: 20 6c 6f 63 6b 2e 0a 20 20 23 0a 20 20 23 20 4f   lock..  #.  # O
1880: 6e 63 65 20 74 68 69 73 20 68 61 70 70 65 6e 73  nce this happens
1890: 2c 20 5b 64 62 5d 20 63 61 6e 20 72 65 61 64 20  , [db] can read 
18a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
18b0: 20 73 65 65 20 74 68 65 20 6e 65 77 20 63 6f 6e   see the new con
18c0: 74 65 6e 74 2c 0a 20 20 23 20 5b 64 62 32 5d 20  tent,.  # [db2] 
18d0: 28 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 53  (still holding S
18e0: 48 41 52 45 44 29 20 63 61 6e 20 73 74 69 6c 6c  HARED) can still
18f0: 20 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f   read the old co
1900: 6e 74 65 6e 74 2c 20 62 75 74 20 5b 64 62 33 5d  ntent, but [db3]
1910: 0a 20 20 23 20 28 6e 6f 74 20 68 6f 6c 64 69 6e  .  # (not holdin
1920: 67 20 61 6e 79 20 6c 6f 63 6b 29 20 69 73 20 70  g any lock) is p
1930: 72 65 76 65 6e 74 65 64 20 62 79 20 5b 64 62 5d  revented by [db]
1940: 27 73 20 50 45 4e 44 49 4e 47 20 66 72 6f 6d 20  's PENDING from 
1950: 72 65 61 64 69 6e 67 0a 20 20 23 20 74 68 65 20  reading.  # the 
1960: 64 61 74 61 62 61 73 65 2e 0a 20 20 23 0a 20 20  database..  #.  
1970: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1980: 74 6e 2e 32 34 20 7b 20 63 73 71 6c 31 20 7b 20  tn.24 { csql1 { 
1990: 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 31 20 7b 64  COMMIT } } {1 {d
19a0: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
19b0: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  d}}.  do_test pa
19c0: 67 65 72 31 2d 24 74 6e 2d 32 35 20 7b 20 0a 20  ger1-$tn-25 { . 
19d0: 20 20 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41     sql1 { PRAGMA
19e0: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20 0a   lock_status } .
19f0: 20 20 7d 20 7b 6d 61 69 6e 20 70 65 6e 64 69 6e    } {main pendin
1a00: 67 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 20  g temp closed}. 
1a10: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1a20: 24 74 6e 2e 32 36 20 7b 20 73 71 6c 31 20 7b 20  $tn.26 { sql1 { 
1a30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1a40: 20 20 7d 20 7d 20 7b 31 31 20 6f 6e 65 20 31 32    } } {11 one 12
1a50: 20 74 77 6f 20 31 33 20 74 68 72 65 65 7d 0a 20   two 13 three}. 
1a60: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1a70: 24 74 6e 2e 32 37 20 7b 20 73 71 6c 32 20 7b 20  $tn.27 { sql2 { 
1a80: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1a90: 20 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74    } } {1 one 2 t
1aa0: 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64 6f  wo 3 three}.  do
1ab0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1ac0: 2e 32 38 20 7b 20 63 73 71 6c 33 20 7b 20 53 45  .28 { csql3 { SE
1ad0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1ae0: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
1af0: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23  is locked}}..  #
1b00: 20 48 61 76 65 20 5b 64 62 32 5d 20 63 6f 6d 6d   Have [db2] comm
1b10: 69 74 20 69 74 73 20 72 65 61 64 20 74 72 61 6e  it its read tran
1b20: 73 61 63 74 69 6f 6e 2c 20 72 65 6c 65 61 73 69  saction, releasi
1b30: 6e 67 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  ng the SHARED lo
1b40: 63 6b 20 69 74 0a 20 20 23 20 69 73 20 68 6f 6c  ck it.  # is hol
1b50: 64 69 6e 67 2e 20 4e 6f 77 2c 20 6e 65 69 74 68  ding. Now, neith
1b60: 65 72 20 5b 64 62 32 5d 20 6e 6f 72 20 5b 64 62  er [db2] nor [db
1b70: 33 5d 20 6d 61 79 20 72 65 61 64 20 74 68 65 20  3] may read the 
1b80: 64 61 74 61 62 61 73 65 20 28 61 73 20 5b 64 62  database (as [db
1b90: 5d 0a 20 20 23 20 69 73 20 73 74 69 6c 6c 20 68  ].  # is still h
1ba0: 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47  olding a PENDING
1bb0: 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  )..  #.  do_test
1bc0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 39 20 7b   pager1-$tn.29 {
1bd0: 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql2 { COMMIT }
1be0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
1bf0: 70 61 67 65 72 31 2d 24 74 6e 2e 33 30 20 7b 20  pager1-$tn.30 { 
1c00: 63 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a  csql2 { SELECT *
1c10: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20   FROM t1 } } {1 
1c20: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
1c30: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
1c40: 70 61 67 65 72 31 2d 24 74 6e 2e 33 31 20 7b 20  pager1-$tn.31 { 
1c50: 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a  csql3 { SELECT *
1c60: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20   FROM t1 } } {1 
1c70: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
1c80: 6b 65 64 7d 7d 0a 0a 20 20 23 20 5b 64 62 5d 20  ked}}..  # [db] 
1c90: 69 73 20 6e 6f 77 20 61 62 6c 65 20 74 6f 20 63  is now able to c
1ca0: 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1cb0: 63 74 69 6f 6e 2e 20 4f 6e 63 65 20 74 68 65 20  ction. Once the 
1cc0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a  transaction is .
1cd0: 20 20 23 20 63 6f 6d 6d 69 74 74 65 64 2c 20 61    # committed, a
1ce0: 6c 6c 20 74 68 72 65 65 20 63 6f 6e 6e 65 63 74  ll three connect
1cf0: 69 6f 6e 73 20 63 61 6e 20 72 65 61 64 20 74 68  ions can read th
1d00: 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2e 0a 20  e new content.. 
1d10: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
1d20: 65 72 31 2d 24 74 6e 2e 32 35 20 7b 20 73 71 6c  er1-$tn.25 { sql
1d30: 31 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  1 { UPDATE t1 SE
1d40: 54 20 61 20 3d 20 61 2b 31 30 20 7d 20 7d 20 7b  T a = a+10 } } {
1d50: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1d60: 72 31 2d 24 74 6e 2e 32 36 20 7b 20 73 71 6c 31  r1-$tn.26 { sql1
1d70: 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d   { COMMIT } } {}
1d80: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1d90: 31 2d 24 74 6e 2e 32 37 20 7b 20 73 71 6c 31 20  1-$tn.27 { sql1 
1da0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1db0: 74 31 20 7d 20 7d 20 7b 32 31 20 6f 6e 65 20 32  t1 } } {21 one 2
1dc0: 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a  2 two 23 three}.
1dd0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1de0: 2d 24 74 6e 2e 32 37 20 7b 20 73 71 6c 32 20 7b  -$tn.27 { sql2 {
1df0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1e00: 31 20 7d 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32  1 } } {21 one 22
1e10: 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a 20   two 23 three}. 
1e20: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1e30: 24 74 6e 2e 32 38 20 7b 20 73 71 6c 33 20 7b 20  $tn.28 { sql3 { 
1e40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1e50: 20 7d 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20   } } {21 one 22 
1e60: 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a 0a 20  two 23 three}.. 
1e70: 20 23 20 49 6e 73 74 61 6c 6c 20 61 20 62 75 73   # Install a bus
1e80: 79 2d 68 61 6e 64 6c 65 72 20 66 6f 72 20 63 6f  y-handler for co
1e90: 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 2e 0a 20  nnection [db].. 
1ea0: 20 23 0a 20 20 73 65 74 20 3a 3a 6e 62 75 73 79   #.  set ::nbusy
1eb0: 20 5b 6c 69 73 74 5d 0a 20 20 70 72 6f 63 20 62   [list].  proc b
1ec0: 75 73 79 20 7b 6e 7d 20 7b 0a 20 20 20 20 6c 61  usy {n} {.    la
1ed0: 70 70 65 6e 64 20 3a 3a 6e 62 75 73 79 20 24 6e  ppend ::nbusy $n
1ee0: 0a 20 20 20 20 69 66 20 7b 24 6e 3e 35 7d 20 7b  .    if {$n>5} {
1ef0: 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 0a 20   sql2 COMMIT }. 
1f00: 20 20 20 72 65 74 75 72 6e 20 30 0a 20 20 7d 0a     return 0.  }.
1f10: 20 20 64 62 20 62 75 73 79 20 62 75 73 79 0a 0a    db busy busy..
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 32 39 20 7b 20 0a 20 20 20 20 73  -$tn.29 { .    s
1f40: 71 6c 31 20 7b 20 42 45 47 49 4e 20 3b 20 49 4e  ql1 { BEGIN ; IN
1f50: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1f60: 55 45 53 28 27 78 27 2c 20 27 79 27 29 20 7d 20  UES('x', 'y') } 
1f70: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
1f80: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 33 30 20  t pager1-$tn.30 
1f90: 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45  { .    sql2 { BE
1fa0: 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46  GIN ; SELECT * F
1fb0: 52 4f 4d 20 74 31 20 7d 20 0a 20 20 7d 20 7b 32  ROM t1 } .  } {2
1fc0: 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20  1 one 22 two 23 
1fd0: 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74  three}.  do_test
1fe0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 33 31 20 7b   pager1-$tn.31 {
1ff0: 20 73 71 6c 31 20 43 4f 4d 4d 49 54 20 7d 20 7b   sql1 COMMIT } {
2000: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
2010: 72 31 2d 24 74 6e 2e 33 32 20 7b 20 73 65 74 20  r1-$tn.32 { set 
2020: 3a 3a 6e 62 75 73 79 20 7d 20 7b 30 20 31 20 32  ::nbusy } {0 1 2
2030: 20 33 20 34 20 35 20 36 7d 0a 7d 0a 0a 23 2d 2d   3 4 5 6}.}..#--
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 61 76 65 70 6f  -------.# Savepo
2090: 69 6e 74 20 72 65 6c 61 74 65 64 20 74 65 73 74  int related test
20a0: 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65   cases..#.# page
20b0: 72 31 2d 33 2e 31 2e 32 2e 2a 3a 20 46 6f 72 63  r1-3.1.2.*: Forc
20c0: 65 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  e a savepoint ro
20d0: 6c 6c 62 61 63 6b 20 74 6f 20 63 61 75 73 65 20  llback to cause 
20e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20f0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
2100: 20 20 20 20 74 6f 20 67 72 6f 77 2e 0a 23 0a 23      to grow..#.#
2110: 20 70 61 67 65 72 31 2d 33 2e 31 2e 33 2e 2a 3a   pager1-3.1.3.*:
2120: 20 55 73 65 20 61 20 6a 6f 75 72 6e 61 6c 20 63   Use a journal c
2130: 72 65 61 74 65 64 20 69 6e 20 73 79 6e 63 68 72  reated in synchr
2140: 6f 6e 6f 75 73 3d 6f 66 66 20 6d 6f 64 65 20 61  onous=off mode a
2150: 73 20 70 61 72 74 0a 23 20 20 20 20 20 20 20 20  s part.#        
2160: 20 20 20 20 20 20 20 20 20 6f 66 20 61 20 73 61           of a sa
2170: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
2180: 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 70 61 67  ..# .do_test pag
2190: 65 72 31 2d 33 2e 31 2e 31 20 7b 0a 20 20 66 61  er1-3.1.1 {.  fa
21a0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
21b0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
21c0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
21d0: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
21e0: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
21f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f 75  CREATE TABLE cou
2200: 6e 74 65 72 28 0a 20 20 20 20 20 20 69 20 43 48  nter(.      i CH
2210: 45 43 4b 20 28 69 3c 35 29 2c 20 0a 20 20 20 20  ECK (i<5), .    
2220: 20 20 75 20 43 48 45 43 4b 20 28 75 3c 31 30 29    u CHECK (u<10)
2230: 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45  .    );.    INSE
2240: 52 54 20 49 4e 54 4f 20 63 6f 75 6e 74 65 72 20  RT INTO counter 
2250: 56 41 4c 55 45 53 28 30 2c 20 30 29 3b 0a 20 20  VALUES(0, 0);.  
2260: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
2270: 20 74 72 31 20 41 46 54 45 52 20 49 4e 53 45 52   tr1 AFTER INSER
2280: 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20  T ON t1 BEGIN.  
2290: 20 20 20 20 55 50 44 41 54 45 20 63 6f 75 6e 74      UPDATE count
22a0: 65 72 20 53 45 54 20 69 20 3d 20 69 2b 31 3b 0a  er SET i = i+1;.
22b0: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45      END;.    CRE
22c0: 41 54 45 20 54 52 49 47 47 45 52 20 74 72 32 20  ATE TRIGGER tr2 
22d0: 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
22e0: 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55  t1 BEGIN.      U
22f0: 50 44 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45  PDATE counter SE
2300: 54 20 75 20 3d 20 75 2b 31 3b 0a 20 20 20 20 45  T u = u+1;.    E
2310: 4e 44 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  ND;.  }.  execsq
2320: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
2330: 4d 20 63 6f 75 6e 74 65 72 20 7d 0a 7d 20 7b 30  M counter }.} {0
2340: 20 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   0}..do_execsql_
2350: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31 2e  test pager1-3.1.
2360: 32 20 7b 0a 20 20 50 52 41 47 4d 41 20 63 61 63  2 {.  PRAGMA cac
2370: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
2380: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
2390: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
23a0: 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (1, randomblob(1
23b0: 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  500));.    INSER
23c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
23d0: 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (2, randomblob(1
23e0: 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  500));.    INSER
23f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2400: 28 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (3, randomblob(1
2410: 35 30 30 29 29 3b 0a 20 20 20 20 53 45 4c 45 43  500));.    SELEC
2420: 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74 65 72  T * FROM counter
2430: 3b 0a 7d 20 7b 33 20 30 7d 0a 64 6f 5f 63 61 74  ;.} {3 0}.do_cat
2440: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
2450: 31 2d 33 2e 31 2e 33 20 7b 0a 20 20 20 20 49 4e  1-3.1.3 {.    IN
2460: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2470: 45 43 54 20 61 2b 33 2c 20 72 61 6e 64 6f 6d 62  ECT a+3, randomb
2480: 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
2490: 31 0a 7d 20 7b 31 20 7b 43 48 45 43 4b 20 63 6f  1.} {1 {CHECK co
24a0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a  nstraint failed:
24b0: 20 63 6f 75 6e 74 65 72 7d 7d 0a 64 6f 5f 65 78   counter}}.do_ex
24c0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
24d0: 31 2d 33 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a  1-3.4 { SELECT *
24e0: 20 46 52 4f 4d 20 63 6f 75 6e 74 65 72 20 7d 20   FROM counter } 
24f0: 7b 33 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  {3 0}.do_execsql
2500: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 35  _test pager1-3.5
2510: 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   { SELECT a FROM
2520: 20 74 31 20 7d 20 7b 31 20 32 20 33 7d 0a 64 6f   t1 } {1 2 3}.do
2530: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
2540: 67 65 72 31 2d 33 2e 36 20 7b 20 43 4f 4d 4d 49  ger1-3.6 { COMMI
2550: 54 20 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20  T } {}..foreach 
2560: 7b 74 6e 20 73 71 6c 20 74 63 6c 7d 20 7b 0a 20  {tn sql tcl} {. 
2570: 20 37 20 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   7  { PRAGMA syn
2580: 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41  chronous = NORMA
2590: 4c 20 3b 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  L ; PRAGMA temp_
25a0: 73 74 6f 72 65 20 3d 20 30 20 7d 20 7b 0a 20 20  store = 0 } {.  
25b0: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65    testvfs tv -de
25c0: 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76 20 64  fault 1.    tv d
25d0: 65 76 63 68 61 72 20 73 61 66 65 5f 61 70 70 65  evchar safe_appe
25e0: 6e 64 0a 20 20 7d 0a 20 20 38 20 20 7b 20 50 52  nd.  }.  8  { PR
25f0: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
2600: 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50 52 41 47   = NORMAL ; PRAG
2610: 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20  MA temp_store = 
2620: 32 20 7d 20 7b 0a 20 20 20 20 74 65 73 74 76 66  2 } {.    testvf
2630: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
2640: 20 20 20 20 74 76 20 64 65 76 63 68 61 72 20 73      tv devchar s
2650: 65 71 75 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20  equential.  }.  
2660: 39 20 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63  9  { PRAGMA sync
2670: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d  hronous = FULL }
2680: 20 7b 20 7d 0a 20 20 31 30 20 7b 20 50 52 41 47   { }.  10 { PRAG
2690: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
26a0: 20 4e 4f 52 4d 41 4c 20 7d 20 7b 20 7d 0a 20 20   NORMAL } { }.  
26b0: 31 31 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63  11 { PRAGMA sync
26c0: 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 20 7d 20  hronous = OFF } 
26d0: 7b 20 7d 0a 20 20 31 32 20 7b 20 50 52 41 47 4d  { }.  12 { PRAGM
26e0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
26f0: 46 55 4c 4c 20 3b 20 50 52 41 47 4d 41 20 66 75  FULL ; PRAGMA fu
2700: 6c 6c 66 73 79 6e 63 20 3d 20 31 20 7d 20 7b 20  llfsync = 1 } { 
2710: 7d 0a 20 20 31 33 20 7b 20 50 52 41 47 4d 41 20  }.  13 { PRAGMA 
2720: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55  synchronous = FU
2730: 4c 4c 20 7d 20 7b 0a 20 20 20 20 74 65 73 74 76  LL } {.    testv
2740: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
2750: 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72 20  .    tv devchar 
2760: 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 7d 0a 20  sequential.  }. 
2770: 20 31 34 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63   14 { PRAGMA loc
2780: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c  king_mode = EXCL
2790: 55 53 49 56 45 20 7d 20 7b 0a 20 20 7d 0a 7d 20  USIVE } {.  }.} 
27a0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  {.  do_test page
27b0: 72 31 2d 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  r1-3.$tn.1 {.   
27c0: 20 65 76 61 6c 20 24 74 63 6c 0a 20 20 20 20 66   eval $tcl.    f
27d0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
27e0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62  nd_reopen.    db
27f0: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
2800: 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63  _string.    exec
2810: 73 71 6c 20 24 73 71 6c 0a 20 20 20 20 65 78 65  sql $sql.    exe
2820: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
2830: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
2840: 3d 20 32 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  = 2;.      PRAGM
2850: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
2860: 30 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  0;.      CREATE 
2870: 54 41 42 4c 45 20 7a 28 78 20 49 4e 54 45 47 45  TABLE z(x INTEGE
2880: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  R PRIMARY KEY, y
2890: 29 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  );.      BEGIN;.
28a0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
28b0: 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c  NTO z VALUES(NUL
28c0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
28d0: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
28e0: 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20  T INTO z SELECT 
28f0: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38  NULL, a_string(8
2900: 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20  00) FROM z;     
2910: 2d 2d 20 20 20 32 0a 20 20 20 20 20 20 20 20 49  --   2.        I
2920: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c  NSERT INTO z SEL
2930: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
2940: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20  ng(800) FROM z; 
2950: 20 20 20 20 2d 2d 20 20 20 34 0a 20 20 20 20 20      --   4.     
2960: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
2970: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
2980: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
2990: 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20 38 0a 20   z;     --   8. 
29a0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
29b0: 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c  TO z SELECT NULL
29c0: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
29d0: 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20  FROM z;     --  
29e0: 31 36 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  16.        INSER
29f0: 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20  T INTO z SELECT 
2a00: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38  NULL, a_string(8
2a10: 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20  00) FROM z;     
2a20: 2d 2d 20 20 33 32 0a 20 20 20 20 20 20 20 20 49  --  32.        I
2a30: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c  NSERT INTO z SEL
2a40: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
2a50: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20  ng(800) FROM z; 
2a60: 20 20 20 20 2d 2d 20 20 36 34 0a 20 20 20 20 20      --  64.     
2a70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
2a80: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
2a90: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
2aa0: 20 7a 3b 20 20 20 20 20 2d 2d 20 31 32 38 0a 20   z;     -- 128. 
2ab0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
2ac0: 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c  TO z SELECT NULL
2ad0: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  , a_string(800) 
2ae0: 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 32  FROM z;     -- 2
2af0: 35 36 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  56.      COMMIT;
2b00: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
2b10: 71 6c 20 7b 20 50 52 41 47 4d 41 20 61 75 74 6f  ql { PRAGMA auto
2b20: 5f 76 61 63 75 75 6d 20 7d 0a 20 20 7d 20 7b 32  _vacuum }.  } {2
2b30: 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }.  do_execsql_t
2b40: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e  est pager1-3.$tn
2b50: 2e 32 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  .2 {.    BEGIN;.
2b60: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2b70: 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c  O z VALUES(NULL,
2b80: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b   a_string(800));
2b90: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2ba0: 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c  TO z VALUES(NULL
2bb0: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29  , a_string(800))
2bc0: 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e  ;.      SAVEPOIN
2bd0: 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 55  T one;.        U
2be0: 50 44 41 54 45 20 7a 20 53 45 54 20 79 20 3d 20  PDATE z SET y = 
2bf0: 4e 55 4c 4c 20 57 48 45 52 45 20 78 3e 32 35 36  NULL WHERE x>256
2c00: 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41  ;.        PRAGMA
2c10: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63   incremental_vac
2c20: 75 75 6d 3b 0a 20 20 20 20 20 20 20 20 53 45 4c  uum;.        SEL
2c30: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2c40: 4d 20 7a 20 57 48 45 52 45 20 78 20 3c 20 31 30  M z WHERE x < 10
2c50: 30 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43  0;.      ROLLBAC
2c60: 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f  K TO one;.    CO
2c70: 4d 4d 49 54 3b 0a 20 20 7d 20 7b 39 39 7d 0a 0a  MMIT;.  } {99}..
2c80: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
2c90: 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 33  t pager1-3.$tn.3
2ca0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
2cb0: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e      SAVEPOINT on
2cc0: 65 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41 54  e;.        UPDAT
2cd0: 45 20 7a 20 53 45 54 20 79 20 3d 20 79 7c 7c 78  E z SET y = y||x
2ce0: 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ;.      ROLLBACK
2cf0: 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d   TO one;.    COM
2d00: 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  MIT;.    SELECT 
2d10: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 3b  count(*) FROM z;
2d20: 0a 20 20 7d 20 7b 32 35 38 7d 0a 0a 20 20 64 6f  .  } {258}..  do
2d30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
2d40: 67 65 72 31 2d 33 2e 24 74 6e 2e 34 20 7b 0a 20  ger1-3.$tn.4 {. 
2d50: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
2d60: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 7a  ;.      UPDATE z
2d70: 20 53 45 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20   SET y = y||x;. 
2d80: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
2d90: 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ne;.  } {}.  do_
2da0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
2db0: 65 72 31 2d 33 2e 24 74 6e 2e 35 20 7b 0a 20 20  er1-3.$tn.5 {.  
2dc0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
2dd0: 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 20 20 52 45  ) FROM z;.    RE
2de0: 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 20 20 50  LEASE one;.    P
2df0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
2e00: 63 68 65 63 6b 3b 0a 20 20 7d 20 7b 32 35 38 20  check;.  } {258 
2e10: 6f 6b 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71  ok}..  do_execsq
2e20: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2e30: 24 74 6e 2e 36 20 7b 0a 20 20 20 20 53 41 56 45  $tn.6 {.    SAVE
2e40: 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 52  POINT one;.    R
2e50: 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 20  ELEASE one;.  } 
2e60: 7b 7d 0a 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  {}..  db close. 
2e70: 20 63 61 74 63 68 20 7b 20 74 76 20 64 65 6c 65   catch { tv dele
2e80: 74 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  te }.}..#-------
2e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 0a 23 20 48 6f 74 20 6a 6f 75 72 6e 61 6c  --.# Hot journal
2ee0: 20 72 6f 6c 6c 62 61 63 6b 20 72 65 6c 61 74 65   rollback relate
2ef0: 64 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a  d test cases..#.
2f00: 23 20 70 61 67 65 72 31 2e 34 2e 31 2e 2a 3a 20  # pager1.4.1.*: 
2f10: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 70 61  Test that the pa
2f20: 67 65 72 20 6d 6f 64 75 6c 65 20 64 65 6c 65 74  ger module delet
2f30: 65 73 20 76 65 72 79 20 73 6d 61 6c 6c 20 69 6e  es very small in
2f40: 76 61 6c 69 64 0a 23 20 20 20 20 20 20 20 20 20  valid.#         
2f50: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69        journal fi
2f60: 6c 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e  les..#.# pager1.
2f70: 34 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  4.2.*: Test that
2f80: 20 69 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   if the master j
2f90: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
2fa0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 0a 23  t the end of a.#
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
2fc0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2fd0: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
2fe0: 72 72 75 70 74 20 28 63 68 65 63 6b 73 75 6d 20  rrupt (checksum 
2ff0: 64 6f 65 73 20 6e 6f 74 0a 23 20 20 20 20 20 20  does not.#      
3000: 20 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65           compute
3010: 29 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  ) the associated
3020: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c   journal is roll
3030: 65 64 20 62 61 63 6b 20 28 61 6e 64 20 6e 6f 0a  ed back (and no.
3040: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3050: 78 41 63 63 65 73 73 28 29 20 63 61 6c 6c 20 74  xAccess() call t
3060: 6f 20 63 68 65 63 6b 20 66 6f 72 20 74 68 65 20  o check for the 
3070: 70 72 65 73 65 6e 63 65 20 6f 66 20 61 6e 79 20  presence of any 
3080: 6d 61 73 74 65 72 20 0a 23 20 20 20 20 20 20 20  master .#       
3090: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
30a0: 66 69 6c 65 20 69 73 20 6d 61 64 65 29 2e 0a 23  file is made)..#
30b0: 0a 23 20 70 61 67 65 72 31 2e 34 2e 33 2e 2a 3a  .# pager1.4.3.*:
30c0: 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 63   Test that the c
30d0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 68 6f 74  ontents of a hot
30e0: 2d 6a 6f 75 72 6e 61 6c 20 61 72 65 20 69 67 6e  -journal are ign
30f0: 6f 72 65 64 20 69 66 20 74 68 65 0a 23 20 20 20  ored if the.#   
3100: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
3110: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
3120: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
3130: 6e 61 6c 20 68 65 61 64 65 72 20 61 70 70 65 61  nal header appea
3140: 72 20 74 6f 0a 23 20 20 20 20 20 20 20 20 20 20  r to.#          
3150: 20 20 20 20 20 62 65 20 69 6e 76 61 6c 69 64 20       be invalid 
3160: 28 74 6f 6f 20 6c 61 72 67 65 2c 20 74 6f 6f 20  (too large, too 
3170: 73 6d 61 6c 6c 20 6f 72 20 6e 6f 74 20 61 20 70  small or not a p
3180: 6f 77 65 72 20 6f 66 20 32 29 2e 0a 23 0a 23 20  ower of 2)..#.# 
3190: 70 61 67 65 72 31 2e 34 2e 34 2e 2a 3a 20 54 65  pager1.4.4.*: Te
31a0: 73 74 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  st hot-journal r
31b0: 6f 6c 6c 62 61 63 6b 20 6f 66 20 6a 6f 75 72 6e  ollback of journ
31c0: 61 6c 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d  al file with a m
31d0: 61 73 74 65 72 0a 23 20 20 20 20 20 20 20 20 20  aster.#         
31e0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 70 6f        journal po
31f0: 69 6e 74 65 72 20 67 65 6e 65 72 61 74 65 64 20  inter generated 
3200: 69 6e 20 76 61 72 69 6f 75 73 20 22 50 52 41 47  in various "PRAG
3210: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 0a  MA synchronous".
3220: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3230: 6d 6f 64 65 73 2e 0a 23 0a 23 20 70 61 67 65 72  modes..#.# pager
3240: 31 2e 34 2e 35 2e 2a 3a 20 54 65 73 74 20 74 68  1.4.5.*: Test th
3250: 61 74 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  at hot-journal r
3260: 6f 6c 6c 62 61 63 6b 20 73 74 6f 70 73 20 69 66  ollback stops if
3270: 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 73 20 61   it encounters a
3280: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
3290: 20 6a 6f 75 72 6e 61 6c 2d 72 65 63 6f 72 64 20   journal-record 
32a0: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 63 68  for which the ch
32b0: 65 63 6b 73 75 6d 20 66 61 69 6c 73 2e 0a 23 0a  ecksum fails..#.
32c0: 23 20 70 61 67 65 72 31 2e 34 2e 36 2e 2a 3a 20  # pager1.4.6.*: 
32d0: 54 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 72  Test that when r
32e0: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
32f0: 74 2d 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  t-journal that c
3300: 6f 6e 74 61 69 6e 73 20 61 0a 23 20 20 20 20 20  ontains a.#     
3310: 20 20 20 20 20 20 20 20 20 20 6d 61 73 74 65 72            master
3320: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
3330: 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
3340: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c  rnal file is del
3350: 65 74 65 64 0a 23 20 20 20 20 20 20 20 20 20 20  eted.#          
3360: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 74       after all t
3370: 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20  he hot-journals 
3380: 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 69 74  that refer to it
3390: 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 23 0a   are deleted..#.
33a0: 23 20 70 61 67 65 72 31 2e 34 2e 37 2e 2a 3a 20  # pager1.4.7.*: 
33b0: 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20 68  Test that if a h
33c0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
33d0: 65 78 69 73 74 73 20 62 75 74 20 61 20 63 6c 69  exists but a cli
33e0: 65 6e 74 20 63 61 6e 0a 23 20 20 20 20 20 20 20  ent can.#       
33f0: 20 20 20 20 20 20 20 20 6f 70 65 6e 20 69 74 20          open it 
3400: 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79  for reading only
3410: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
3420: 61 6e 6e 6f 74 20 62 65 20 61 63 63 65 73 73 65  annot be accesse
3430: 64 20 61 6e 64 0a 23 20 20 20 20 20 20 20 20 20  d and.#         
3440: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 41 4e        SQLITE_CAN
3450: 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
3460: 64 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 70 61  d..# .do_test pa
3470: 67 65 72 31 2e 34 2e 31 2e 31 20 7b 0a 20 20 66  ger1.4.1.1 {.  f
3480: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
3490: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
34a0: 73 71 6c 20 7b 20 0a 20 20 20 20 43 52 45 41 54  sql { .    CREAT
34b0: 45 20 54 41 42 4c 45 20 78 28 79 2c 20 7a 29 3b  E TABLE x(y, z);
34c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
34d0: 20 78 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b   x VALUES(1, 2);
34e0: 0a 20 20 7d 0a 20 20 73 65 74 20 66 64 20 5b 6f  .  }.  set fd [o
34f0: 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  pen test.db-jour
3500: 6e 61 6c 20 77 5d 0a 20 20 70 75 74 73 20 2d 6e  nal w].  puts -n
3510: 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 22 68 65  onewline $fd "he
3520: 6c 6c 6f 77 6f 72 6c 64 22 0a 20 20 63 6c 6f 73  lloworld".  clos
3530: 65 20 24 66 64 0a 20 20 66 69 6c 65 20 65 78 69  e $fd.  file exi
3540: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
3550: 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  nal.} {1}.do_tes
3560: 74 20 70 61 67 65 72 31 2e 34 2e 31 2e 32 20 7b  t pager1.4.1.2 {
3570: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
3580: 54 20 2a 20 46 52 4f 4d 20 78 20 7d 20 7d 20 7b  T * FROM x } } {
3590: 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  1 2}.do_test pag
35a0: 65 72 31 2e 34 2e 31 2e 33 20 7b 20 66 69 6c 65  er1.4.1.3 { file
35b0: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
35c0: 6a 6f 75 72 6e 61 6c 20 7d 20 7b 30 7d 0a 0a 23  journal } {0}..#
35d0: 20 53 65 74 20 75 70 20 61 20 5b 74 65 73 74 76   Set up a [testv
35e0: 66 73 5d 20 74 6f 20 73 6e 61 70 73 68 6f 74 20  fs] to snapshot 
35f0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
3600: 6a 75 73 74 20 62 65 66 6f 72 65 20 53 51 4c 69  just before SQLi
3610: 74 65 0a 23 20 64 65 6c 65 74 65 73 20 74 68 65  te.# deletes the
3620: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
3630: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74  to commit a mult
3640: 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
3650: 6f 6e 2e 0a 23 0a 23 20 49 6e 20 73 75 62 73 65  on..#.# In subse
3660: 71 75 65 6e 74 20 74 65 73 74 20 63 61 73 65 73  quent test cases
3670: 2c 20 69 6e 76 6f 6b 69 6e 67 20 5b 66 61 75 6c  , invoking [faul
3680: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
3690: 5f 72 65 6f 70 65 6e 5d 20 73 65 74 73 0a 23 20  _reopen] sets.# 
36a0: 75 70 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  up the file syst
36b0: 65 6d 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 77  em to contain tw
36c0: 6f 20 64 61 74 61 62 61 73 65 73 2c 20 74 77 6f  o databases, two
36d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
36e0: 65 73 20 61 6e 64 0a 23 20 61 20 6d 61 73 74 65  es and.# a maste
36f0: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 23 0a 64 6f 5f  r-journal..#.do_
3700: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3710: 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 73  1 {.  testvfs ts
3720: 74 76 66 73 20 2d 64 65 66 61 75 6c 74 20 31 0a  tvfs -default 1.
3730: 20 20 74 73 74 76 66 73 20 66 69 6c 74 65 72 20    tstvfs filter 
3740: 78 44 65 6c 65 74 65 0a 20 20 74 73 74 76 66 73  xDelete.  tstvfs
3750: 20 73 63 72 69 70 74 20 78 44 65 6c 65 74 65 43   script xDeleteC
3760: 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f 63 20 78  allback.  proc x
3770: 44 65 6c 65 74 65 43 61 6c 6c 62 61 63 6b 20 7b  DeleteCallback {
3780: 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72 67 73  method file args
3790: 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c 65  } {.    set file
37a0: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
37b0: 65 5d 0a 20 20 20 20 69 66 20 7b 20 5b 73 74 72  e].    if { [str
37c0: 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 24  ing match *mj* $
37d0: 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73  file] } { faults
37e0: 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20  im_save }.  }.  
37f0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
3800: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
3810: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
3820: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
3830: 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74   {.    ATTACH 't
3840: 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b  est.db2' AS aux;
3850: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
3860: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
3870: 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61  E;.    PRAGMA ma
3880: 69 6e 2e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  in.cache_size = 
3890: 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  10;.    PRAGMA a
38a0: 75 78 2e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  ux.cache_size = 
38b0: 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  10;.    CREATE T
38c0: 41 42 4c 45 20 74 31 28 61 20 55 4e 49 51 55 45  ABLE t1(a UNIQUE
38d0: 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  , b UNIQUE);.   
38e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
38f0: 78 2e 74 32 28 61 20 55 4e 49 51 55 45 2c 20 62  x.t2(a UNIQUE, b
3900: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 49 4e   UNIQUE);.    IN
3910: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3920: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 30 30  UES(a_string(200
3930: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
3940: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3950: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
3960: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
3970: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74  ring(300) FROM t
3980: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
3990: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
39a0: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
39b0: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74  ring(300) FROM t
39c0: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
39d0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46  TO t2 SELECT * F
39e0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 47 49  ROM t1;.    BEGI
39f0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      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 31 29 2c 20 61 5f  _string(201), a_
3a20: 73 74 72 69 6e 67 28 33 30 31 29 20 46 52 4f 4d  string(301) FROM
3a30: 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t1;.      INSER
3a40: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
3a50: 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29 2c 20   a_string(202), 
3a60: 61 5f 73 74 72 69 6e 67 28 33 30 32 29 20 46 52  a_string(302) FR
3a70: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53  OM t1;.      INS
3a80: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
3a90: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 33 29  CT a_string(203)
3aa0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 33 29 20  , a_string(303) 
3ab0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49  FROM t1;.      I
3ac0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
3ad0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
3ae0: 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 34  4), a_string(304
3af0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  ) FROM t1;.     
3b00: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 32   REPLACE INTO t2
3b10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3b20: 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  1;.    COMMIT;. 
3b30: 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   }.  db close.  
3b40: 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20  tstvfs delete.} 
3b50: 7b 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70  {}..if {$::tcl_p
3b60: 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d  latform(platform
3b70: 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a  )!="windows"} {.
3b80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
3b90: 2e 32 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.2 {.  faultsi
3ba0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3bb0: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
3bc0: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
3bd0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
3be0: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
3bf0: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
3c00: 7b 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70  {4 ok}.do_test p
3c10: 61 67 65 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20  ager1.4.2.3 {.  
3c20: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
3c30: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f  _and_reopen.  fo
3c40: 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 74 65  reach f [glob te
3c50: 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f 72  st.db-mj*] { for
3c60: 63 65 64 65 6c 65 74 65 20 24 66 20 7d 0a 20 20  cedelete $f }.  
3c70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3c80: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
3c90: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
3ca0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
3cb0: 6b 3b 0a 20 20 7d 0a 7d 20 7b 36 34 20 6f 6b 7d  k;.  }.} {64 ok}
3cc0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
3cd0: 34 2e 32 2e 34 20 7b 0a 20 20 66 61 75 6c 74 73  4.2.4 {.  faults
3ce0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
3cf0: 65 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72  eopen.  hexio_wr
3d00: 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ite test.db-jour
3d10: 6e 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  nal [expr [file 
3d20: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
3d30: 72 6e 61 6c 5d 2d 33 30 5d 20 31 32 33 34 35 36  rnal]-30] 123456
3d40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3d50: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
3d60: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52   FROM t1;.    PR
3d70: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
3d80: 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f  heck;.  }.} {4 o
3d90: 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  k}.do_test pager
3da0: 31 2e 34 2e 32 2e 35 20 7b 0a 20 20 66 61 75 6c  1.4.2.5 {.  faul
3db0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
3dc0: 5f 72 65 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f  _reopen.  hexio_
3dd0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  write test.db-jo
3de0: 75 72 6e 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c  urnal [expr [fil
3df0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a  e size test.db-j
3e00: 6f 75 72 6e 61 6c 5d 2d 33 30 5d 20 31 32 33 34  ournal]-30] 1234
3e10: 35 36 0a 20 20 66 6f 72 65 61 63 68 20 66 20 5b  56.  foreach f [
3e20: 67 6c 6f 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a  glob test.db-mj*
3e30: 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65 20  ] { forcedelete 
3e40: 24 66 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  $f }.  execsql {
3e50: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
3e60: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
3e70: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
3e80: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
3e90: 7b 34 20 6f 6b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73  {4 ok}.}..do_tes
3ea0: 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 31 20 7b  t pager1.4.3.1 {
3eb0: 0a 20 20 74 65 73 74 76 66 73 20 74 73 74 76 66  .  testvfs tstvf
3ec0: 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74  s -default 1.  t
3ed0: 73 74 76 66 73 20 66 69 6c 74 65 72 20 78 53 79  stvfs filter xSy
3ee0: 6e 63 0a 20 20 74 73 74 76 66 73 20 73 63 72 69  nc.  tstvfs scri
3ef0: 70 74 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b  pt xSyncCallback
3f00: 0a 20 20 70 72 6f 63 20 78 53 79 6e 63 43 61 6c  .  proc xSyncCal
3f10: 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64 20 66 69  lback {method fi
3f20: 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73  le args} {.    s
3f30: 65 74 20 66 69 6c 65 20 5b 66 69 6c 65 20 74 61  et file [file ta
3f40: 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20 20 69 66  il $file].    if
3f50: 20 7b 20 30 3d 3d 5b 73 74 72 69 6e 67 20 6d 61   { 0==[string ma
3f60: 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69  tch *journal $fi
3f70: 6c 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d  le] } { faultsim
3f80: 5f 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61  _save }.  }.  fa
3f90: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
3fa0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
3fb0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
3fc0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
3fd0: 45 4c 45 54 45 3b 0a 20 20 20 20 43 52 45 41 54  ELETE;.    CREAT
3fe0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
3ff0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4000: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
4010: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
4020: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
4030: 34 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f  4);.  }.  db clo
4040: 73 65 0a 20 20 74 73 74 76 66 73 20 64 65 6c 65  se.  tstvfs dele
4050: 74 65 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68  te.} {}..foreach
4060: 20 7b 74 6e 20 6f 66 73 74 20 76 61 6c 75 65 20   {tn ofst value 
4070: 72 65 73 75 6c 74 7d 20 7b 0a 20 20 20 20 20 20  result} {.      
4080: 20 20 20 20 32 20 20 20 32 30 20 20 20 20 33 31      2   20    31
4090: 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d         {1 2 3 4}
40a0: 0a 20 20 20 20 20 20 20 20 20 20 33 20 20 20 32  .          3   2
40b0: 30 20 20 20 20 33 32 20 20 20 20 20 20 20 7b 31  0    32       {1
40c0: 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20   2 3 4}.        
40d0: 20 20 34 20 20 20 32 30 20 20 20 20 33 33 20 20    4   20    33  
40e0: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20       {1 2 3 4}. 
40f0: 20 20 20 20 20 20 20 20 20 35 20 20 20 32 30 20           5   20 
4100: 20 20 20 36 35 35 33 36 20 20 20 20 7b 31 20 32     65536    {1 2
4110: 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20   3 4}.          
4120: 36 20 20 20 32 30 20 20 20 20 31 33 31 30 37 32  6   20    131072
4130: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20     {1 2 3 4}..  
4140: 20 20 20 20 20 20 20 20 37 20 20 20 32 34 20 20          7   24  
4150: 20 20 35 31 31 20 20 20 20 20 20 7b 31 20 32 20    511      {1 2 
4160: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 38  3 4}.          8
4170: 20 20 20 32 34 20 20 20 20 35 31 33 20 20 20 20     24    513    
4180: 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20    {1 2 3 4}.    
4190: 20 20 20 20 20 20 39 20 20 20 32 34 20 20 20 20        9   24    
41a0: 31 33 31 30 37 32 20 20 20 7b 31 20 32 20 33 20  131072   {1 2 3 
41b0: 34 7d 0a 0a 20 20 20 20 20 20 20 20 20 31 30 20  4}..         10 
41c0: 20 20 33 32 20 20 20 20 36 35 35 33 36 20 20 20    32    65536   
41d0: 20 7b 31 20 32 7d 0a 7d 20 7b 0a 20 20 64 6f 5f   {1 2}.} {.  do_
41e0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 33 2e  test pager1.4.3.
41f0: 24 74 6e 20 7b 0a 20 20 20 20 66 61 75 6c 74 73  $tn {.    faults
4200: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
4210: 65 6f 70 65 6e 0a 20 20 20 20 68 65 78 69 6f 5f  eopen.    hexio_
4220: 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  write test.db-jo
4230: 75 72 6e 61 6c 20 24 6f 66 73 74 20 5b 66 6f 72  urnal $ofst [for
4240: 6d 61 74 20 25 2e 38 78 20 24 76 61 6c 75 65 5d  mat %.8x $value]
4250: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
4260: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
4270: 7d 0a 20 20 7d 20 24 72 65 73 75 6c 74 0a 7d 0a  }.  } $result.}.
4280: 64 62 20 63 6c 6f 73 65 0a 0a 23 20 53 65 74 20  db close..# Set 
4290: 75 70 20 61 20 56 46 53 20 74 68 61 74 20 73 6e  up a VFS that sn
42a0: 61 70 73 68 6f 74 73 20 74 68 65 20 66 69 6c 65  apshots the file
42b0: 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66  -system just bef
42c0: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
42d0: 72 6e 61 6c 0a 23 20 66 69 6c 65 20 69 73 20 64  rnal.# file is d
42e0: 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74  eleted to commit
42f0: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
4300: 61 6e 73 61 63 74 69 6f 6e 2e 20 53 70 65 63 69  ansaction. Speci
4310: 66 69 63 61 6c 6c 79 2c 20 74 68 65 0a 23 20 66  fically, the.# f
4320: 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 73 61  ile-system is sa
4330: 76 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ved just before 
4340: 74 68 65 20 78 44 65 6c 65 74 65 28 29 20 63 61  the xDelete() ca
4350: 6c 6c 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  ll to remove the
4360: 20 0a 23 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   .# master journ
4370: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65  al file from the
4380: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 23 0a   file-system..#.
4390: 73 65 74 20 70 77 64 20 5b 67 65 74 5f 70 77 64  set pwd [get_pwd
43a0: 5d 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  ].testvfs tv -de
43b0: 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70  fault 1.tv scrip
43c0: 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c  t copy_on_mj_del
43d0: 65 74 65 0a 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c  ete.set ::mj_fil
43e0: 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 30 0a 73  ename_length 0.s
43f0: 65 74 20 3a 3a 6d 6a 5f 64 65 6c 65 74 65 5f 63  et ::mj_delete_c
4400: 6e 74 20 30 0a 70 72 6f 63 20 63 6f 70 79 5f 6f  nt 0.proc copy_o
4410: 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d 65 74  n_mj_delete {met
4420: 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67  hod filename arg
4430: 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69  s} {.  if {[stri
4440: 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 5b 66  ng match *mj* [f
4450: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61  ile tail $filena
4460: 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 23 0a 20  me]]} { .    #. 
4470: 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68     # NOTE: Is th
4480: 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 6c 61  e file name rela
4490: 74 69 76 65 3f 20 20 49 66 20 73 6f 2c 20 61 64  tive?  If so, ad
44a0: 64 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  d the length of 
44b0: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
44c0: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
44d0: 79 2e 0a 20 20 20 20 23 0a 20 20 20 20 69 66 20  y..    #.    if 
44e0: 7b 5b 69 73 5f 72 65 6c 61 74 69 76 65 5f 66 69  {[is_relative_fi
44f0: 6c 65 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 7b  le $filename]} {
4500: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f  .      set ::mj_
4510: 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20  filename_length 
4520: 5c 0a 20 20 20 20 20 20 20 20 5b 65 78 70 72 20  \.        [expr 
4530: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
4540: 24 66 69 6c 65 6e 61 6d 65 5d 20 2b 20 5b 73 74  $filename] + [st
4550: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 70  ring length $::p
4560: 77 64 5d 7d 5d 0a 20 20 20 20 7d 20 65 6c 73 65  wd]}].    } else
4570: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d   {.      set ::m
4580: 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74  j_filename_lengt
4590: 68 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  h [string length
45a0: 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 20 20   $filename].    
45b0: 7d 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73  }.    faultsim_s
45c0: 61 76 65 20 0a 20 20 20 20 69 6e 63 72 20 3a 3a  ave .    incr ::
45d0: 6d 6a 5f 64 65 6c 65 74 65 5f 63 6e 74 0a 20 20  mj_delete_cnt.  
45e0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
45f0: 45 5f 4f 4b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20  E_OK.}..foreach 
4600: 7b 74 6e 31 20 74 63 6c 7d 20 7b 0a 20 20 31 20  {tn1 tcl} {.  1 
4610: 7b 20 73 65 74 20 70 72 65 66 69 78 20 22 74 65  { set prefix "te
4620: 73 74 2e 64 62 22 20 7d 0a 20 20 32 20 7b 20 0a  st.db" }.  2 { .
4630: 20 20 20 20 23 20 54 68 69 73 20 74 65 73 74 20      # This test 
4640: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 75  depends on the u
4650: 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20 62 65  nderlying VFS be
4660: 69 6e 67 20 61 62 6c 65 20 74 6f 20 6f 70 65 6e  ing able to open
4670: 20 70 61 74 68 73 0a 20 20 20 20 23 20 35 31 32   paths.    # 512
4680: 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
4690: 2e 20 54 68 65 20 69 64 65 61 20 69 73 20 74 6f  . The idea is to
46a0: 20 63 72 65 61 74 65 20 61 20 68 6f 74 2d 6a 6f   create a hot-jo
46b0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 0a  urnal file that.
46c0: 20 20 20 20 23 20 63 6f 6e 74 61 69 6e 73 20 61      # contains a
46d0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
46e0: 70 6f 69 6e 74 65 72 20 73 6f 20 6c 61 72 67 65  pointer so large
46f0: 20 74 68 61 74 20 69 74 20 63 6f 75 6c 64 20 63   that it could c
4700: 6f 6e 74 61 69 6e 0a 20 20 20 20 23 20 61 20 76  ontain.    # a v
4710: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
4720: 20 28 69 66 20 74 68 65 20 66 69 6c 65 20 70 61   (if the file pa
4730: 67 65 2d 73 69 7a 65 20 69 73 20 35 31 32 20 62  ge-size is 512 b
4740: 79 74 65 73 29 2e 20 53 6f 20 61 73 20 74 6f 0a  ytes). So as to.
4750: 20 20 20 20 23 20 6d 61 6b 65 20 73 75 72 65 20      # make sure 
4760: 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 67  SQLite doesn't g
4770: 65 74 20 63 6f 6e 66 75 73 65 64 20 62 79 20 74  et confused by t
4780: 68 69 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 73  his..    #.    s
4790: 65 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70  et nPadding [exp
47a0: 72 20 35 31 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69  r 511 - $::mj_fi
47b0: 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20  lename_length]. 
47c0: 20 20 20 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74     if {$tcl_plat
47d0: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d  form(platform)==
47e0: 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 20  "windows"} {.   
47f0: 20 20 20 23 20 54 42 44 20 6e 65 65 64 20 74 6f     # TBD need to
4800: 20 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   figure out how 
4810: 74 6f 20 64 6f 20 74 68 69 73 20 63 6f 72 72 65  to do this corre
4820: 63 74 6c 79 20 66 6f 72 20 57 69 6e 64 6f 77 73  ctly for Windows
4830: 21 21 21 0a 20 20 20 20 20 20 73 65 74 20 6e 50  !!!.      set nP
4840: 61 64 64 69 6e 67 20 5b 65 78 70 72 20 32 35 35  adding [expr 255
4850: 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d   - $::mj_filenam
4860: 65 5f 6c 65 6e 67 74 68 5d 0a 20 20 20 20 7d 0a  e_length].    }.
4870: 0a 20 20 20 20 23 20 57 65 20 63 61 6e 6e 6f 74  .    # We cannot
4880: 20 6a 75 73 74 20 63 72 65 61 74 65 20 61 20 72   just create a r
4890: 65 61 6c 6c 79 20 6c 6f 6e 67 20 64 61 74 61 62  eally long datab
48a0: 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f  ase file name to
48b0: 20 6f 70 65 6e 2c 20 61 73 0a 20 20 20 20 23 20   open, as.    # 
48c0: 4c 69 6e 75 78 20 6c 69 6d 69 74 73 20 61 20 73  Linux limits a s
48d0: 69 6e 67 6c 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  ingle component 
48e0: 6f 66 20 61 20 70 61 74 68 20 74 6f 20 32 35 35  of a path to 255
48f0: 20 62 79 74 65 73 20 62 79 20 64 65 66 61 75 6c   bytes by defaul
4900: 74 0a 20 20 20 20 23 20 28 61 6e 64 20 70 72 65  t.    # (and pre
4910: 73 75 6d 61 62 6c 79 20 6f 74 68 65 72 20 73 79  sumably other sy
4920: 73 74 65 6d 73 20 68 61 76 65 20 6c 69 6d 69 74  stems have limit
4930: 73 20 74 6f 6f 29 2e 20 53 6f 20 63 72 65 61 74  s too). So creat
4940: 65 20 61 20 64 69 72 65 63 74 6f 72 79 0a 20 20  e a directory.  
4950: 20 20 23 20 68 69 65 72 61 72 63 68 79 20 74 6f    # hierarchy to
4960: 20 77 6f 72 6b 20 69 6e 2e 0a 20 20 20 20 23 0a   work in..    #.
4970: 20 20 20 20 73 65 74 20 64 69 72 6e 61 6d 65 20      set dirname 
4980: 22 64 31 32 33 34 35 36 37 38 39 30 31 32 33 34  "d12345678901234
4990: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
49a0: 2f 22 0a 20 20 20 20 73 65 74 20 6e 44 69 72 20  /".    set nDir 
49b0: 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20  [expr $nPadding 
49c0: 2f 20 33 32 5d 0a 20 20 20 20 69 66 20 7b 20 24  / 32].    if { $
49d0: 6e 44 69 72 20 7d 20 7b 0a 20 20 20 20 20 20 73  nDir } {.      s
49e0: 65 74 20 70 20 5b 73 74 72 69 6e 67 20 72 65 70  et p [string rep
49f0: 65 61 74 20 24 64 69 72 6e 61 6d 65 20 24 6e 44  eat $dirname $nD
4a00: 69 72 5d 0a 20 20 20 20 20 20 66 69 6c 65 20 6d  ir].      file m
4a10: 6b 64 69 72 20 24 70 0a 20 20 20 20 20 20 63 64  kdir $p.      cd
4a20: 20 24 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73   $p.    }..    s
4a30: 65 74 20 70 61 64 64 69 6e 67 20 5b 73 74 72 69  et padding [stri
4a40: 6e 67 20 72 65 70 65 61 74 20 78 20 5b 65 78 70  ng repeat x [exp
4a50: 72 20 24 6e 50 61 64 64 69 6e 67 20 25 33 32 5d  r $nPadding %32]
4a60: 5d 0a 20 20 20 20 73 65 74 20 70 72 65 66 69 78  ].    set prefix
4a70: 20 22 74 65 73 74 2e 64 62 24 7b 70 61 64 64 69   "test.db${paddi
4a80: 6e 67 7d 22 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65  ng}".  }.} {.  e
4a90: 76 61 6c 20 24 74 63 6c 0a 20 20 66 6f 72 65 61  val $tcl.  forea
4aa0: 63 68 20 7b 74 6e 32 20 73 71 6c 20 75 73 65 73  ch {tn2 sql uses
4ab0: 4d 4a 7d 20 7b 0a 20 20 20 20 6f 20 7b 20 0a 20  MJ} {.    o { . 
4ac0: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
4ad0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46  .synchronous=OFF
4ae0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
4af0: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  ux.synchronous=O
4b00: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
4b10: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
4b20: 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 20 30 0a  DELETE;.    } 0.
4b30: 20 20 20 20 6f 35 31 32 20 7b 20 0a 20 20 20 20      o512 { .    
4b40: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
4b50: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20  nchronous=OFF;. 
4b60: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
4b70: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b  synchronous=OFF;
4b80: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
4b90: 69 6e 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35  in.page_size = 5
4ba0: 31 32 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  12;.      PRAGMA
4bb0: 20 61 75 78 2e 70 61 67 65 5f 73 69 7a 65 20 3d   aux.page_size =
4bc0: 20 35 31 32 3b 0a 20 20 20 20 20 20 50 52 41 47   512;.      PRAG
4bd0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
4be0: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 20  = DELETE;.    } 
4bf0: 30 0a 20 20 20 20 6e 20 7b 20 0a 20 20 20 20 20  0.    n { .     
4c00: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e   PRAGMA main.syn
4c10: 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b  chronous=NORMAL;
4c20: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
4c30: 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f  x.synchronous=NO
4c40: 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47  RMAL;.      PRAG
4c50: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
4c60: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 20  = DELETE;.    } 
4c70: 31 0a 20 20 20 20 66 20 7b 20 0a 20 20 20 20 20  1.    f { .     
4c80: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e   PRAGMA main.syn
4c90: 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a 20  chronous=FULL;. 
4ca0: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
4cb0: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
4cc0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
4cd0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
4ce0: 4c 45 54 45 3b 0a 20 20 20 20 7d 20 31 0a 20 20  LETE;.    } 1.  
4cf0: 20 20 77 31 20 7b 20 0a 20 20 20 20 20 20 50 52    w1 { .      PR
4d00: 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72  AGMA main.synchr
4d10: 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20  onous=NORMAL;.  
4d20: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
4d30: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
4d40: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
4d50: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
4d60: 41 4c 3b 0a 20 20 20 20 7d 20 30 0a 20 20 20 20  AL;.    } 0.    
4d70: 77 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  w2 { .      PRAG
4d80: 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e  MA main.synchron
4d90: 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  ous=NORMAL;.    
4da0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e    PRAGMA aux.syn
4db0: 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b  chronous=NORMAL;
4dc0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
4dd0: 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  in.journal_mode=
4de0: 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 50 52  DELETE;.      PR
4df0: 41 47 4d 41 20 61 75 78 2e 6a 6f 75 72 6e 61 6c  AGMA aux.journal
4e00: 5f 6d 6f 64 65 3d 57 41 4c 3b 0a 20 20 20 20 7d  _mode=WAL;.    }
4e10: 20 30 0a 20 20 20 20 6f 31 61 20 7b 20 0a 20 20   0.    o1a { .  
4e20: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
4e30: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
4e40: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
4e50: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  ux.synchronous=O
4e60: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
4e70: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45   journal_mode=DE
4e80: 4c 45 54 45 3b 0a 20 20 20 20 7d 20 30 0a 20 20  LETE;.    } 0.  
4e90: 20 20 6f 31 62 20 7b 20 0a 20 20 20 20 20 20 50    o1b { .      P
4ea0: 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68  RAGMA main.synch
4eb0: 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20  ronous=OFF;.    
4ec0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e    PRAGMA aux.syn
4ed0: 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b  chronous=NORMAL;
4ee0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
4ef0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45 4c 45 54  urnal_mode=DELET
4f00: 45 3b 0a 20 20 20 20 7d 20 30 0a 20 20 20 20 6d  E;.    } 0.    m
4f10: 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d  1 { .      PRAGM
4f20: 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f  A main.synchrono
4f30: 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  us=NORMAL;.     
4f40: 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63   PRAGMA aux.sync
4f50: 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a  hronous=NORMAL;.
4f60: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69        PRAGMA mai
4f70: 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44  n.journal_mode=D
4f80: 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 50 52 41  ELETE;.      PRA
4f90: 47 4d 41 20 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f  GMA aux.journal_
4fa0: 6d 6f 64 65 20 3d 20 4d 45 4d 4f 52 59 3b 0a 20  mode = MEMORY;. 
4fb0: 20 20 20 7d 20 30 0a 20 20 20 20 74 31 20 7b 20     } 0.    t1 { 
4fc0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
4fd0: 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  in.synchronous=N
4fe0: 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41  ORMAL;.      PRA
4ff0: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
5000: 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  ous=NORMAL;.    
5010: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f    PRAGMA main.jo
5020: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45 4c 45 54  urnal_mode=DELET
5030: 45 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  E;.      PRAGMA 
5040: 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  aux.journal_mode
5050: 20 3d 20 54 52 55 4e 43 41 54 45 3b 0a 20 20 20   = TRUNCATE;.   
5060: 20 7d 20 31 0a 20 20 20 20 70 31 20 7b 20 0a 20   } 1.    p1 { . 
5070: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
5080: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52  .synchronous=NOR
5090: 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  MAL;.      PRAGM
50a0: 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75  A aux.synchronou
50b0: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
50c0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
50d0: 6e 61 6c 5f 6d 6f 64 65 3d 44 45 4c 45 54 45 3b  nal_mode=DELETE;
50e0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
50f0: 78 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  x.journal_mode =
5100: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 7d 20   PERSIST;.    } 
5110: 31 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 73 65 74  1.  } {..    set
5120: 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24 7b 74 6e   tn "${tn1}.${tn
5130: 32 7d 22 0a 20 20 0a 20 20 20 20 23 20 53 65 74  2}".  .    # Set
5140: 20 75 70 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e   up a connection
5150: 20 74 6f 20 68 61 76 65 20 74 77 6f 20 64 61 74   to have two dat
5160: 61 62 61 73 65 73 2c 20 74 65 73 74 2e 64 62 20  abases, test.db 
5170: 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20 20 20 20  (main) and .    
5180: 23 20 74 65 73 74 2e 64 62 32 20 28 61 75 78 29  # test.db2 (aux)
5190: 2e 20 54 68 65 6e 20 72 75 6e 20 61 20 6d 75 6c  . Then run a mul
51a0: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
51b0: 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20 54 68 65  ion on them. The
51c0: 0a 20 20 20 20 23 20 56 46 53 20 77 69 6c 6c 20  .    # VFS will 
51d0: 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66 69 6c  snapshot the fil
51e0: 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65  e-system just be
51f0: 66 6f 72 65 20 74 68 65 20 6d 61 73 74 65 72 2d  fore the master-
5200: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23 20 66 69  journal.    # fi
5210: 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 74 6f  le is deleted to
5220: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
5230: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 23 0a 20  saction..    #. 
5240: 20 20 20 74 76 20 66 69 6c 74 65 72 20 78 44 65     tv filter xDe
5250: 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74 65 73 74  lete.    do_test
5260: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5270: 31 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a  1 {.      set ::
5280: 6d 6a 5f 64 65 6c 65 74 65 5f 63 6e 74 20 30 0a  mj_delete_cnt 0.
5290: 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64        faultsim_d
52a0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
52b0: 20 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65   $prefix.      e
52c0: 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20  xecsql ".       
52d0: 20 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69   ATTACH '${prefi
52e0: 78 7d 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20  x}2' AS aux;.   
52f0: 20 20 20 20 20 24 73 71 6c 0a 20 20 20 20 20 20       $sql.      
5300: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
5310: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45  (x);.        CRE
5320: 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 62 28  ATE TABLE aux.b(
5330: 78 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  x);.        INSE
5340: 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53  RT INTO a VALUES
5350: 28 27 64 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a  ('double-you');.
5360: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
5370: 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 77 68  NTO a VALUES('wh
5380: 79 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  y');.        INS
5390: 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45  ERT INTO a VALUE
53a0: 53 28 27 7a 65 64 27 29 3b 0a 20 20 20 20 20 20  S('zed');.      
53b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
53c0: 56 41 4c 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20  VALUES('won');. 
53d0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
53e0: 54 4f 20 62 20 56 41 4c 55 45 53 28 27 74 6f 6f  TO b VALUES('too
53f0: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
5400: 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53  RT INTO b VALUES
5410: 28 27 66 72 65 65 27 29 3b 0a 20 20 20 20 20 20  ('free');.      
5420: 22 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  ".      execsql 
5430: 7b 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b  {.        BEGIN;
5440: 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52  .          INSER
5450: 54 20 49 4e 54 4f 20 61 20 53 45 4c 45 43 54 20  T INTO a SELECT 
5460: 2a 20 46 52 4f 4d 20 62 20 57 48 45 52 45 20 72  * FROM b WHERE r
5470: 6f 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20  owid<=3;.       
5480: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62     INSERT INTO b
5490: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
54a0: 20 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b   WHERE rowid<=3;
54b0: 0a 20 20 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  .        COMMIT;
54c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b  .      }.    } {
54d0: 7d 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20  }.    tv filter 
54e0: 7b 7d 0a 0a 20 20 20 20 23 20 56 65 72 69 66 79  {}..    # Verify
54f0: 20 74 68 61 74 20 61 20 6d 61 73 74 65 72 20 6a   that a master j
5500: 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74  ournal was delet
5510: 65 64 20 6f 6e 6c 79 20 66 6f 72 20 74 68 6f 73  ed only for thos
5520: 65 20 63 61 73 65 73 20 77 68 65 72 65 0a 20 20  e cases where.  
5530: 20 20 23 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e    # master journ
5540: 61 6c 73 20 72 65 61 6c 6c 79 20 6f 75 67 68 74  als really ought
5550: 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20   to be used.    
5560: 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  #.    do_test pa
5570: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 31 62 20  ger1-4.4.$tn.1b 
5580: 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 6a  {.      set ::mj
5590: 5f 64 65 6c 65 74 65 5f 63 6e 74 0a 20 20 20 20  _delete_cnt.    
55a0: 7d 20 24 75 73 65 73 4d 4a 0a 20 20 20 20 0a 20  } $usesMJ.    . 
55b0: 20 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20     # Check that 
55c0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
55d0: 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 73 75  was committed su
55e0: 63 63 65 73 73 66 75 6c 6c 79 2e 0a 20 20 20 20  ccessfully..    
55f0: 23 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c  #.    do_execsql
5600: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
5610: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 53  .$tn.2 {.      S
5620: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20  ELECT * FROM a. 
5630: 20 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75     } {double-you
5640: 20 77 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f   why zed won too
5650: 20 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78   free}.    do_ex
5660: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
5670: 31 2d 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20 20  1-4.4.$tn.3 {.  
5680: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
5690: 4d 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74  M b.    } {won t
56a0: 6f 6f 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79  oo free double-y
56b0: 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20  ou why zed}.    
56c0: 0a 20 20 20 20 69 66 20 7b 24 75 73 65 73 4d 4a  .    if {$usesMJ
56d0: 7d 20 7b 0a 20 20 20 20 20 20 23 20 52 65 73 74  } {.      # Rest
56e0: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
56f0: 74 65 6d 20 61 6e 64 20 72 65 6f 70 65 6e 20 74  tem and reopen t
5700: 68 65 20 64 61 74 61 62 61 73 65 73 2e 20 43 68  he databases. Ch
5710: 65 63 6b 20 74 68 61 74 20 69 74 20 6e 6f 77 0a  eck that it now.
5720: 20 20 20 20 20 20 23 20 61 70 70 65 61 72 73 20        # appears 
5730: 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
5740: 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f 6d  tion was not com
5750: 6d 69 74 74 65 64 20 28 62 65 63 61 75 73 65 20  mitted (because 
5760: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a  the file-system.
5770: 20 20 20 20 20 20 23 20 77 61 73 20 72 65 73 74        # was rest
5780: 6f 72 65 64 20 74 6f 20 74 68 65 20 73 74 61 74  ored to the stat
5790: 65 20 77 68 65 72 65 20 69 74 20 68 61 64 20 6e  e where it had n
57a0: 6f 74 20 62 65 65 6e 29 2e 0a 20 20 20 20 20 20  ot been)..      
57b0: 23 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20  #.      do_test 
57c0: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 34  pager1-4.4.$tn.4
57d0: 20 7b 0a 20 20 20 20 20 20 20 20 66 61 75 6c 74   {.        fault
57e0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
57f0: 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20  reopen $prefix. 
5800: 20 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 22         execsql "
5810: 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69 78  ATTACH '${prefix
5820: 7d 32 27 20 41 53 20 61 75 78 22 0a 20 20 20 20  }2' AS aux".    
5830: 20 20 7d 20 7b 7d 0a 20 20 20 20 20 20 64 6f 5f    } {}.      do_
5840: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
5850: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35 20 7b 53  er1-4.4.$tn.5 {S
5860: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 7d 20  ELECT * FROM a} 
5870: 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20  {double-you why 
5880: 7a 65 64 7d 0a 20 20 20 20 20 20 64 6f 5f 65 78  zed}.      do_ex
5890: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
58a0: 31 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45 4c  1-4.4.$tn.6 {SEL
58b0: 45 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b 77  ECT * FROM b} {w
58c0: 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20  on too free}.   
58d0: 20 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52 65   }.    .    # Re
58e0: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73  store the file-s
58f0: 79 73 74 65 6d 20 61 67 61 69 6e 2e 20 54 68 69  ystem again. Thi
5900: 73 20 74 69 6d 65 2c 20 62 65 66 6f 72 65 20 72  s time, before r
5910: 65 6f 70 65 6e 69 6e 67 20 74 68 65 20 64 61 74  eopening the dat
5920: 61 62 61 73 65 73 2c 0a 20 20 20 20 23 20 64 65  abases,.    # de
5930: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 2d  lete the master-
5940: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5950: 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  m the file-syste
5960: 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70 65 61 72  m. It now appear
5970: 73 20 74 68 61 74 0a 20 20 20 20 23 20 74 68 65  s that.    # the
5980: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
5990: 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e 6f 20 6d   committed (no m
59a0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
59b0: 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c 62 61 63  le == no rollbac
59c0: 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f  k)..    #.    do
59d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
59e0: 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 20 20 69  .$tn.7 {.      i
59f0: 66 20 7b 24 3a 3a 6d 6a 5f 64 65 6c 65 74 65 5f  f {$::mj_delete_
5a00: 63 6e 74 3e 30 7d 20 7b 0a 20 20 20 20 20 20 20  cnt>0} {.       
5a10: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
5a20: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72  e_and_reopen $pr
5a30: 65 66 69 78 0a 20 20 20 20 20 20 20 20 66 6f 72  efix.        for
5a40: 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 24 7b 70  each f [glob ${p
5a50: 72 65 66 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 6f  refix}-mj*] { fo
5a60: 72 63 65 64 65 6c 65 74 65 20 24 66 20 7d 0a 20  rcedelete $f }. 
5a70: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
5a80: 20 20 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20        db close. 
5a90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64         sqlite3 d
5aa0: 62 20 24 70 72 65 66 69 78 0a 20 20 20 20 20 20  b $prefix.      
5ab0: 7d 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  }.      execsql 
5ac0: 22 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69  "ATTACH '${prefi
5ad0: 78 7d 32 27 20 41 53 20 61 75 78 22 0a 20 20 20  x}2' AS aux".   
5ae0: 20 20 20 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c     glob -nocompl
5af0: 61 69 6e 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a  ain ${prefix}-mj
5b00: 2a 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64  *.    } {}.    d
5b10: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5b20: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20  ager1-4.4.$tn.8 
5b30: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
5b40: 20 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64   FROM a.    } {d
5b50: 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65  ouble-you why ze
5b60: 64 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a  d won too free}.
5b70: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
5b80: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
5b90: 74 6e 2e 39 20 7b 0a 20 20 20 20 20 20 53 45 4c  tn.9 {.      SEL
5ba0: 45 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20  ECT * FROM b.   
5bb0: 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65   } {won too free
5bc0: 20 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20   double-you why 
5bd0: 7a 65 64 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24  zed}.  }..  cd $
5be0: 70 77 64 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74  pwd.}.db close.t
5bf0: 76 20 64 65 6c 65 74 65 0a 66 6f 72 63 65 64 65  v delete.forcede
5c00: 6c 65 74 65 20 24 64 69 72 6e 61 6d 65 0a 0a 23  lete $dirname..#
5c10: 20 53 65 74 20 75 70 20 61 20 56 46 53 20 74 6f   Set up a VFS to
5c20: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
5c30: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
5c40: 6a 75 73 74 20 62 65 66 6f 72 65 20 64 65 6c 65  just before dele
5c50: 74 69 6e 67 20 61 0a 23 20 6a 6f 75 72 6e 61 6c  ting a.# journal
5c60: 20 66 69 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20   file to commit 
5c70: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  a transaction. T
5c80: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  he transaction m
5c90: 6f 64 69 66 69 65 73 20 65 78 61 63 74 6c 79 0a  odifies exactly.
5ca0: 23 20 74 77 6f 20 64 61 74 61 62 61 73 65 20 70  # two database p
5cb0: 61 67 65 73 20 28 61 6e 64 20 70 61 67 65 20 31  ages (and page 1
5cc0: 20 2d 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f   - the change co
5cd0: 75 6e 74 65 72 29 2e 0a 23 0a 74 65 73 74 76 66  unter)..#.testvf
5ce0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
5cf0: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 35 31  tv sectorsize 51
5d00: 32 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70 79  2.tv script copy
5d10: 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65  _on_journal_dele
5d20: 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78 44 65  te.tv filter xDe
5d30: 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f  lete.proc copy_o
5d40: 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65  n_journal_delete
5d50: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
5d60: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
5d70: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a  [string match *j
5d80: 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e 61 6d 65  ournal $filename
5d90: 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  ]} faultsim_save
5da0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
5db0: 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f  E_OK.}.faultsim_
5dc0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
5dd0: 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  n.do_execsql_tes
5de0: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 31 20 7b  t pager1.4.5.1 {
5df0: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
5e00: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
5e10: 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73  .  PRAGMA page_s
5e20: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 43 52  ize = 1024;.  CR
5e30: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
5e40: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   b);.  CREATE TA
5e50: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
5e60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5e70: 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27 29  ALUES('I', 'II')
5e80: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
5e90: 74 32 20 56 41 4c 55 45 53 28 27 49 49 49 27 2c  t2 VALUES('III',
5ea0: 20 27 49 56 27 29 3b 0a 20 20 42 45 47 49 4e 3b   'IV');.  BEGIN;
5eb0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5ec0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
5ed0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5ee0: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34  O t2 VALUES(3, 4
5ef0: 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b  );.  COMMIT;.} {
5f00: 64 65 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65  delete}.tv filte
5f10: 72 20 7b 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68  r {}..# Check th
5f20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
5f30: 73 20 63 6f 6d 6d 69 74 74 65 64 3a 0a 23 0a 64  s committed:.#.d
5f40: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5f50: 61 67 65 72 31 2e 34 2e 35 2e 32 20 7b 0a 20 20  ager1.4.5.2 {.  
5f60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5f70: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5f80: 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20  M t2;.} {I II 1 
5f90: 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 23  2 III IV 3 4}..#
5fa0: 20 4e 6f 77 20 74 72 79 20 66 6f 75 72 20 74 65   Now try four te
5fb0: 73 74 73 3a 0a 23 0a 23 20 20 70 61 67 65 72 31  sts:.#.#  pager1
5fc0: 2d 34 2e 35 2e 33 3a 20 52 65 73 74 6f 72 65 20  -4.5.3: Restore 
5fd0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
5fe0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
5ff0: 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
6000: 6e 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  n .#            
6010: 20 20 20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61      is rolled ba
6020: 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  ck..#.#  pager1-
6030: 34 2e 35 2e 34 3a 20 52 65 73 74 6f 72 65 20 74  4.5.4: Restore t
6040: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
6050: 43 6f 72 72 75 70 74 20 74 68 65 20 66 69 72 73  Corrupt the firs
6060: 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 0a  t record in the.
6070: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
6080: 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20   journal. Check 
6090: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
60a0: 69 73 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61  is not rolled ba
60b0: 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  ck..#.#  pager1-
60c0: 34 2e 35 2e 35 3a 20 52 65 73 74 6f 72 65 20 74  4.5.5: Restore t
60d0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
60e0: 43 6f 72 72 75 70 74 20 74 68 65 20 73 65 63 6f  Corrupt the seco
60f0: 6e 64 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  nd record in the
6100: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
6110: 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b    journal. Check
6120: 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
6130: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74 72  record in the tr
6140: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20  ansaction is .# 
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6160: 6c 61 79 65 64 20 62 61 63 6b 2c 20 62 75 74 20  layed back, but 
6170: 6e 6f 74 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a  not the second..
6180: 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e  #.#  pager1-4.5.
6190: 36 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20 66  6: Restore the f
61a0: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 72 79 20  ile-system. Try 
61b0: 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
61c0: 62 61 73 65 20 77 69 74 68 20 61 0a 23 20 20 20  base with a.#   
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
61e0: 64 6f 6e 6c 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  donly connection
61f0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61  . This should fa
6200: 69 6c 2c 20 61 73 20 61 20 72 65 61 64 2d 6f 6e  il, as a read-on
6210: 6c 79 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ly.#            
6220: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63      connection c
6230: 61 6e 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  annot roll back 
6240: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6250: 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 72 65  e..#.faultsim_re
6260: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
6270: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6280: 20 70 61 67 65 72 31 2e 34 2e 35 2e 33 20 7b 0a   pager1.4.5.3 {.
6290: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
62a0: 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  t1;.  SELECT * F
62b0: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20  ROM t2;.} {I II 
62c0: 49 49 49 20 49 56 7d 0a 66 61 75 6c 74 73 69 6d  III IV}.faultsim
62d0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
62e0: 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20  pen.hexio_write 
62f0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
6300: 5b 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34  [expr 512+4+1024
6310: 20 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37   - 202] 01234567
6320: 38 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63  89ABCDEF.do_exec
6330: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
6340: 34 2e 35 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  4.5.4 {.  SELECT
6350: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
6360: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
6370: 7d 20 7b 49 20 49 49 20 31 20 32 20 49 49 49 20  } {I II 1 2 III 
6380: 49 56 20 33 20 34 7d 0a 66 61 75 6c 74 73 69 6d  IV 3 4}.faultsim
6390: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
63a0: 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20  pen.hexio_write 
63b0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
63c0: 5b 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34  [expr 512+4+1024
63d0: 2b 34 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d  +4+4+1024 - 202]
63e0: 20 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45   0123456789ABCDE
63f0: 46 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  F.do_execsql_tes
6400: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 35 20 7b  t pager1.4.5.5 {
6410: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
6420: 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20   t1;.  SELECT * 
6430: 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49  FROM t2;.} {I II
6440: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 66 61   III IV 3 4}..fa
6450: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
6460: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f  nd_reopen.db clo
6470: 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  se.sqlite3 db te
6480: 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20  st.db -readonly 
6490: 31 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  1.do_catchsql_te
64a0: 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 36 20  st pager1.4.5.6 
64b0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
64c0: 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a  M t1;.  SELECT *
64d0: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b   FROM t2;.} {1 {
64e0: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
64f0: 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61   a readonly data
6500: 62 61 73 65 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a  base}}.db close.
6510: 0a 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20  .# Snapshot the 
6520: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
6530: 20 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69   before multi-fi
6540: 6c 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20  le commit. Save 
6550: 74 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68  the name.# of th
6560: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6570: 20 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66   file in $::mj_f
6580: 69 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63  ilename..#.tv sc
6590: 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f  ript copy_on_mj_
65a0: 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72  delete.tv filter
65b0: 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f   xDelete.proc co
65c0: 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20  py_on_mj_delete 
65d0: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65  {method filename
65e0: 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b   args} {.  if {[
65f0: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a  string match *mj
6600: 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  * [file tail $fi
6610: 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20  lename]]} { .   
6620: 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61   set ::mj_filena
6630: 6d 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20  me $filename.   
6640: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a   faultsim_save .
6650: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
6660: 49 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74  ITE_OK.}.do_test
6670: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a   pager1.4.6.1 {.
6680: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
6690: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
66a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
66b0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
66c0: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 41   = DELETE;.    A
66d0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
66e0: 20 41 53 20 74 77 6f 3b 0a 20 20 20 20 43 52 45   AS two;.    CRE
66f0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
6700: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
6710: 41 42 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20 62  ABLE two.t2(a, b
6720: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
6730: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
6740: 27 74 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53  't1.1');.    INS
6750: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
6760: 45 53 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20  ES(1, 't2.1');. 
6770: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
6780: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
6790: 3d 20 27 74 31 2e 32 27 3b 0a 20 20 20 20 20 20  = 't1.2';.      
67a0: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20  UPDATE t2 SET b 
67b0: 3d 20 27 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f  = 't2.2';.    CO
67c0: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66  MMIT;.  }.  tv f
67d0: 69 6c 74 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c  ilter {}.  db cl
67e0: 6f 73 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73  ose.} {}..faults
67f0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
6800: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
6810: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36  _test pager1.4.6
6820: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .2 { SELECT * FR
6830: 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20 20  OM t1 }         
6840: 20 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65    {1 t1.1}.do_te
6850: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72  st         pager
6860: 31 2e 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65  1.4.6.3 { file e
6870: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6880: 6e 61 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78  name } {1}.do_ex
6890: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
68a0: 31 2e 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41  1.4.6.4 {.  ATTA
68b0: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
68c0: 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a   two;.  SELECT *
68d0: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74   FROM t2;.} {1 t
68e0: 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  2.1}.do_test pag
68f0: 65 72 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65  er1.4.6.5 { file
6900: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
6910: 6c 65 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61  lename } {0}..fa
6920: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
6930: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f  nd_reopen.db clo
6940: 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  se.do_test pager
6950: 31 2e 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20  1.4.6.8 {.  set 
6960: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24  ::mj_filename1 $
6970: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20  ::mj_filename.  
6980: 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  tv filter xDelet
6990: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
69a0: 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71  est.db2.  execsq
69b0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
69c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
69d0: 4c 45 54 45 3b 0a 20 20 20 20 41 54 54 41 43 48  LETE;.    ATTACH
69e0: 20 27 74 65 73 74 2e 64 62 33 27 20 41 53 20 74   'test.db3' AS t
69f0: 68 72 65 65 3b 0a 20 20 20 20 43 52 45 41 54 45  hree;.    CREATE
6a00: 20 54 41 42 4c 45 20 74 68 72 65 65 2e 74 33 28   TABLE three.t3(
6a10: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
6a20: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
6a30: 28 31 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20 20  (1, 't3.1');.   
6a40: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
6a50: 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20  DATE t2 SET b = 
6a60: 27 74 32 2e 33 27 3b 0a 20 20 20 20 20 20 55 50  't2.3';.      UP
6a70: 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d 20  DATE t3 SET b = 
6a80: 27 74 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d 4d  't3.3';.    COMM
6a90: 49 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b  IT;.  }.  expr {
6aa0: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20  $::mj_filename1 
6ab0: 21 3d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  != $::mj_filenam
6ac0: 65 7d 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73 69  e}.} {1}.faultsi
6ad0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6ae0: 6f 70 65 6e 0a 74 76 20 66 69 6c 74 65 72 20 7b  open.tv filter {
6af0: 7d 0a 0a 23 20 54 68 65 20 66 69 6c 65 2d 73 79  }..# The file-sy
6b00: 73 74 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  stem now contain
6b10: 73 3a 0a 23 0a 23 20 20 20 2a 20 74 68 72 65 65  s:.#.#   * three
6b20: 20 64 61 74 61 62 61 73 65 73 0a 23 20 20 20 2a   databases.#   *
6b30: 20 74 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72 6e   three hot-journ
6b40: 61 6c 20 66 69 6c 65 73 0a 23 20 20 20 2a 20 74  al files.#   * t
6b50: 77 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  wo master-journa
6b60: 6c 20 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68 65  l files..#.# The
6b70: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61 73   hot-journals as
6b80: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 65  sociated with te
6b90: 73 74 2e 64 62 32 20 61 6e 64 20 74 65 73 74 2e  st.db2 and test.
6ba0: 64 62 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20 6d  db3 point to.# m
6bb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a  aster journal $:
6bc0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54 68  :mj_filename. Th
6bd0: 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  e hot-journal fi
6be0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
6bf0: 74 68 0a 23 20 74 65 73 74 2e 64 62 20 70 6f 69  th.# test.db poi
6c00: 6e 74 73 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nts to master jo
6c10: 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65  urnal $::mj_file
6c20: 6e 61 6d 65 31 2e 20 53 6f 20 72 65 61 64 69 6e  name1. So readin
6c30: 67 20 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64 62  g from.# test.db
6c40: 20 73 68 6f 75 6c 64 20 64 65 6c 65 74 65 20 24   should delete $
6c50: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a  ::mj_filename1..
6c60: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
6c70: 2e 34 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72 74  .4.6.9 {.  lsort
6c80: 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d   [glob test.db*]
6c90: 0a 7d 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74 20  .} [lsort [list 
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 65            \.  te
6cd0: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 20 74  st.db test.db2 t
6ce0: 65 73 74 2e 64 62 33 20 20 20 20 20 20 20 20 20  est.db3         
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62       \.  test.db
6d10: 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62  -journal test.db
6d20: 32 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64  2-journal test.d
6d30: 62 33 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20  b3-journal      
6d40: 5c 0a 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  \.  [file tail $
6d50: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b  ::mj_filename] [
6d60: 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f  file tail $::mj_
6d70: 66 69 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23  filename1].]]..#
6d80: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
6d90: 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  nal $::mj_filena
6da0: 6d 65 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  me1 contains poi
6db0: 6e 74 65 72 73 20 74 6f 20 74 65 73 74 2e 64 62  nters to test.db
6dc0: 20 61 6e 64 20 0a 23 20 74 65 73 74 2e 64 62 32   and .# test.db2
6dd0: 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 68 6f  . However the ho
6de0: 74 2d 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69  t-journal associ
6df0: 61 74 65 64 20 77 69 74 68 20 74 65 73 74 2e 64  ated with test.d
6e00: 62 32 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20 61  b2 points to.# a
6e10: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
6e20: 72 2d 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72 65  r-journal. There
6e30: 66 6f 72 65 2c 20 72 65 61 64 69 6e 67 20 66 72  fore, reading fr
6e40: 6f 6d 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79 20  om test.db only 
6e50: 73 68 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f 75  should.# be enou
6e60: 67 68 20 74 6f 20 63 61 75 73 65 20 53 51 4c 69  gh to cause SQLi
6e70: 74 65 20 74 6f 20 64 65 6c 65 74 65 20 24 3a 3a  te to delete $::
6e80: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a  mj_filename1..#.
6e90: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
6ea0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b 20  pager1.4.6.10 { 
6eb0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6ec0: 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31  j_filename  } {1
6ed0: 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  }.do_test       
6ee0: 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 31 20    pager1.4.6.11 
6ef0: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
6f00: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20  :mj_filename1 } 
6f10: 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {1}.do_execsql_t
6f20: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31  est pager1.4.6.1
6f30: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
6f40: 4d 20 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d 0a  M t1 } {1 t1.1}.
6f50: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
6f60: 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20  pager1.4.6.13 { 
6f70: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6f80: 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31  j_filename  } {1
6f90: 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  }.do_test       
6fa0: 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20    pager1.4.6.14 
6fb0: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
6fc0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20  :mj_filename1 } 
6fd0: 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {0}..do_execsql_
6fe0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6ff0: 31 32 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74  12 {.  ATTACH 't
7000: 65 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b  est.db2' AS two;
7010: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
7020: 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a   t2;.} {1 t2.1}.
7030: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
7040: 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20  pager1.4.6.13 { 
7050: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
7060: 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 31  j_filename }  {1
7070: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
7080: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20  t pager1.4.6.14 
7090: 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74  {.  ATTACH 'test
70a0: 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a  .db3' AS three;.
70b0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
70c0: 74 33 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a 64  t3;.} {1 t3.1}.d
70d0: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
70e0: 61 67 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20 66  ager1.4.6.15 { f
70f0: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
7100: 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30 7d  _filename }  {0}
7110: 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  ..db close.tv de
7120: 6c 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76  lete..testvfs tv
7130: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
7140: 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76  ectorsize 512.tv
7150: 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f   script copy_on_
7160: 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74  journal_delete.t
7170: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
7180: 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f  .proc copy_on_jo
7190: 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65  urnal_delete {me
71a0: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
71b0: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
71c0: 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e  ing match *journ
71d0: 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66  al $filename]} f
71e0: 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20  aultsim_save .  
71f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7200: 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .}.faultsim_dele
7210: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  te_and_reopen.do
7220: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
7230: 67 65 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20 50  ger1.4.7.1 {.  P
7240: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
7250: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 43  de = DELETE;.  C
7260: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
7270: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
7280: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
7290: 20 69 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20 20   i1 ON t1(y);.  
72a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
72b0: 41 4c 55 45 53 28 27 49 27 2c 20 20 20 27 6f 6e  ALUES('I',   'on
72c0: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
72d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 49  TO t1 VALUES('II
72e0: 27 2c 20 20 27 66 6f 75 72 27 29 3b 0a 20 20 49  ',  'four');.  I
72f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7300: 4c 55 45 53 28 27 49 49 49 27 2c 20 27 6e 69 6e  LUES('III', 'nin
7310: 65 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  e');.  BEGIN;.  
7320: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7330: 20 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27 73   VALUES('IV', 's
7340: 69 78 74 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e  ixteen');.    IN
7350: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
7360: 55 45 53 28 27 56 27 20 2c 20 27 74 77 65 6e 74  UES('V' , 'twent
7370: 79 66 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d 49  yfive');.  COMMI
7380: 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76  T;.} {delete}.tv
7390: 20 66 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63 6c   filter {}.db cl
73a0: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 20 0a 63  ose.tv delete .c
73b0: 61 74 63 68 20 7b 0a 20 20 74 65 73 74 5f 73 79  atch {.  test_sy
73c0: 73 63 61 6c 6c 20 69 6e 73 74 61 6c 6c 20 66 63  scall install fc
73d0: 68 6d 6f 64 0a 20 20 74 65 73 74 5f 73 79 73 63  hmod.  test_sysc
73e0: 61 6c 6c 20 66 61 75 6c 74 20 31 20 31 0a 7d 0a  all fault 1 1.}.
73f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
7400: 2e 37 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69  .7.2 {.  faultsi
7410: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
7420: 6f 70 65 6e 0a 20 20 63 61 74 63 68 20 7b 66 69  open.  catch {fi
7430: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
7440: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70  st.db-journal -p
7450: 65 72 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d  ermissions r----
7460: 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66  ----}.  catch {f
7470: 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74  ile attributes t
7480: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d  est.db-journal -
7490: 72 65 61 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61  readonly 1}.  ca
74a0: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
74b0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
74c0: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
74d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
74e0: 0a 63 61 74 63 68 20 7b 0a 20 20 74 65 73 74 5f  .catch {.  test_
74f0: 73 79 73 63 61 6c 6c 20 72 65 73 65 74 0a 20 20  syscall reset.  
7500: 74 65 73 74 5f 73 79 73 63 61 6c 6c 20 66 61 75  test_syscall fau
7510: 6c 74 20 30 20 30 0a 7d 0a 64 6f 5f 74 65 73 74  lt 0 0.}.do_test
7520: 20 70 61 67 65 72 31 2e 34 2e 37 2e 33 20 7b 0a   pager1.4.7.3 {.
7530: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74    db close.  cat
7540: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
7550: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
7560: 6e 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73  nal -permissions
7570: 20 72 77 2d 72 77 2d 72 77 2d 7d 0a 20 20 63 61   rw-rw-rw-}.  ca
7580: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
7590: 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  utes test.db-jou
75a0: 72 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 30  rnal -readonly 0
75b0: 7d 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20  }.  delete_file 
75c0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
75d0: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
75e0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
75f0: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {0}.do_test page
7600: 72 31 2e 34 2e 38 2e 31 20 7b 0a 20 20 63 61 74  r1.4.8.1 {.  cat
7610: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
7620: 74 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72  tes test.db -per
7630: 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d  missions r------
7640: 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c  --}.  catch {fil
7650: 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73  e attributes tes
7660: 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20 31  t.db -readonly 1
7670: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  }.  sqlite3 db t
7680: 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c  est.db.  db eval
7690: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
76a0: 20 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f   t1 }.  sqlite3_
76b0: 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 6d  db_readonly db m
76c0: 61 69 6e 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  ain.} {1}.do_tes
76d0: 74 20 70 61 67 65 72 31 2e 34 2e 38 2e 32 20 7b  t pager1.4.8.2 {
76e0: 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  .  sqlite3_db_re
76f0: 61 64 6f 6e 6c 79 20 64 62 20 78 79 7a 0a 7d 20  adonly db xyz.} 
7700: 7b 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  {-1}.do_test pag
7710: 65 72 31 2e 34 2e 38 2e 33 20 7b 0a 20 20 64 62  er1.4.8.3 {.  db
7720: 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68 20 7b   close.  catch {
7730: 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20  file attributes 
7740: 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c  test.db -readonl
7750: 79 20 30 7d 0a 20 20 63 61 74 63 68 20 7b 66 69  y 0}.  catch {fi
7760: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
7770: 73 74 2e 64 62 20 2d 70 65 72 6d 69 73 73 69 6f  st.db -permissio
7780: 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d 20 6d 73  ns rw-rw-rw-} ms
7790: 67 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  g.  sqlite3 db t
77a0: 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c  est.db.  db eval
77b0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
77c0: 20 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f   t1 }.  sqlite3_
77d0: 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 6d  db_readonly db m
77e0: 61 69 6e 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d  ain.} {0}..#----
77f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7830: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
7840: 6f 77 69 6e 67 20 74 65 73 74 73 20 64 65 61 6c  owing tests deal
7850: 20 77 69 74 68 20 6d 75 6c 74 69 2d 66 69 6c 65   with multi-file
7860: 20 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20 70 61   commits..#.# pa
7870: 67 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68 65 20  ger1-5.1.*: The 
7880: 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 75 6c  case where a mul
7890: 74 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  ti-file cannot b
78a0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 63 61  e committed beca
78b0: 75 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  use.#           
78c0: 20 20 20 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e      another conn
78d0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
78e0: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
78f0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a 23 20  on one of the.# 
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
7910: 6c 65 73 2e 20 41 66 74 65 72 20 74 68 65 20 53  les. After the S
7920: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
7930: 6d 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d 4d 49  moved, the COMMI
7940: 54 20 73 75 63 63 65 65 64 73 2e 0a 23 0a 23 20  T succeeds..#.# 
7950: 70 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20 4d 75  pager1-5.2.*: Mu
7960: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
7970: 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
7980: 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70  de=memory..#.# p
7990: 61 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d 75 6c  ager1-5.3.*: Mul
79a0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20  ti-file commits 
79b0: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
79c0: 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61  e=memory..#.# pa
79d0: 67 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68 65 63  ger1-5.4.*: Chec
79e0: 6b 20 74 68 61 74 20 77 69 74 68 20 73 79 6e 63  k that with sync
79f0: 68 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c 2c 20  hronous=normal, 
7a00: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
7a10: 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20  al file.#       
7a20: 20 20 20 20 20 20 20 20 6e 61 6d 65 20 69 73 20          name is 
7a30: 61 64 64 65 64 20 74 6f 20 61 20 6a 6f 75 72 6e  added to a journ
7a40: 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  al file immediat
7a50: 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c 61  ely after the la
7a60: 73 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  st.#            
7a70: 20 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72     journal recor
7a80: 64 2e 20 42 75 74 20 77 69 74 68 20 73 79 6e 63  d. But with sync
7a90: 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20 65 78  hronous=full, ex
7aa0: 74 72 61 20 75 6e 75 73 65 64 20 73 70 61 63 65  tra unused space
7ab0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
7ac0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 65   is allocated be
7ad0: 74 77 65 65 6e 20 74 68 65 20 6c 61 73 74 20 6a  tween the last j
7ae0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 61 6e  ournal record an
7af0: 64 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20  d the .#        
7b00: 20 20 20 20 20 20 20 6d 61 73 74 65 72 2d 6a 6f         master-jo
7b10: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
7b20: 73 6f 20 74 68 61 74 20 74 68 65 20 6d 61 73 74  so that the mast
7b30: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  er-journal file.
7b40: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
7b50: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 6c 69  name does not li
7b60: 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  e on the same se
7b70: 63 74 6f 72 20 61 73 20 74 68 65 20 6c 61 73 74  ctor as the last
7b80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20   journal file.# 
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
7ba0: 63 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65 72 31  cord..#.# pager1
7bb0: 2d 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20 74 68  -5.5.*: Check th
7bc0: 61 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at in journal_mo
7bd0: 64 65 3d 50 45 52 53 49 53 54 20 6d 6f 64 65 2c  de=PERSIST mode,
7be0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
7bf0: 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  is.#            
7c00: 20 20 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20     truncated to 
7c10: 7a 65 72 6f 20 62 79 74 65 73 20 77 68 65 6e 20  zero bytes when 
7c20: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
7c30: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 20  nsaction is .#  
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
7c50: 6d 69 74 74 65 64 20 28 69 6e 73 74 65 61 64 20  mitted (instead 
7c60: 6f 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  of the first cou
7c70: 70 6c 65 20 6f 66 20 62 79 74 65 73 20 62 65 69  ple of bytes bei
7c80: 6e 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a 23 0a  ng zeroed)..#.#.
7c90: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
7ca0: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
7cb0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
7cc0: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
7cd0: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
7ce0: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
7cf0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7d00: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
7d10: 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32  ATE TABLE aux.t2
7d20: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
7d30: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7d40: 53 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29 3b 0a  S(17, 'Lenin');.
7d50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7d60: 74 31 20 56 41 4c 55 45 53 28 32 32 2c 20 27 53  t1 VALUES(22, 'S
7d70: 74 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53  talin');.    INS
7d80: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7d90: 45 53 28 35 33 2c 20 27 4b 68 72 75 73 68 63 68  ES(53, 'Khrushch
7da0: 65 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  ev');.  }.} {}.d
7db0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7dc0: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
7dd0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
7de0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7df0: 31 20 56 41 4c 55 45 53 28 36 34 2c 20 27 42 72  1 VALUES(64, 'Br
7e00: 65 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20 20 20  ezhnev');.      
7e10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
7e20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
7e30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  .  }.  sqlite3 d
7e40: 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78  b2 test.db2.  ex
7e50: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
7e60: 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  N;.      SELECT 
7e70: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 64  * FROM t2;.  } d
7e80: 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  b2.} {}.do_test 
7e90: 70 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b 0a 20  pager1-5.1.3 {. 
7ea0: 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54   catchsql COMMIT
7eb0: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
7ec0: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74  is locked}}.do_t
7ed0: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 34  est pager1-5.1.4
7ee0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   {.  execsql COM
7ef0: 4d 49 54 20 64 62 32 0a 20 20 65 78 65 63 73 71  MIT db2.  execsq
7f00: 6c 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63 73  l COMMIT.  execs
7f10: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
7f20: 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t2 } db2.} {1
7f30: 37 20 4c 65 6e 69 6e 20 32 32 20 53 74 61 6c 69  7 Lenin 22 Stali
7f40: 6e 20 35 33 20 4b 68 72 75 73 68 63 68 65 76 20  n 53 Khrushchev 
7f50: 36 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64 6f 5f  64 Brezhnev}.do_
7f60: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e  test pager1-5.1.
7f70: 35 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  5 {.  db2 close.
7f80: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
7f90: 67 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20 20 65  ger1-5.2.1 {.  e
7fa0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
7fb0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
7fc0: 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20 20 42   = memory;.    B
7fd0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
7fe0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7ff0: 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27  S(84, 'Andropov'
8000: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
8010: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38  INTO t2 VALUES(8
8020: 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a  4, 'Andropov');.
8030: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
8040: 7d 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f 74 65  } {memory}.do_te
8050: 73 74 20 70 61 67 65 72 31 2d 35 2e 33 2e 31 20  st pager1-5.3.1 
8060: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
8070: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
8080: 5f 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20 20 20  _mode = off;.   
8090: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
80a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
80b0: 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68  UES(85, 'Gorbach
80c0: 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ev');.      INSE
80d0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
80e0: 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76  S(85, 'Gorbachev
80f0: 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ');.    COMMIT;.
8100: 20 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64 6f 5f    }.} {off}..do_
8110: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e  test pager1-5.4.
8120: 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  1 {.  db close. 
8130: 20 74 65 73 74 76 66 73 20 74 76 0a 20 20 73 71   testvfs tv.  sq
8140: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
8150: 20 2d 76 66 73 20 74 76 0a 20 20 65 78 65 63 73   -vfs tv.  execs
8160: 71 6c 20 7b 20 41 54 54 41 43 48 20 27 74 65 73  ql { ATTACH 'tes
8170: 74 2e 64 62 32 27 20 41 53 20 61 75 78 20 7d 0a  t.db2' AS aux }.
8180: 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78 44 65  .  tv filter xDe
8190: 6c 65 74 65 0a 20 20 74 76 20 73 63 72 69 70 74  lete.  tv script
81a0: 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a   max_journal_siz
81b0: 65 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  e.  tv sectorsiz
81c0: 65 20 35 31 32 0a 20 20 73 65 74 20 3a 3a 6d 61  e 512.  set ::ma
81d0: 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 70 72  x_journal 0.  pr
81e0: 6f 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73  oc max_journal_s
81f0: 69 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72 67 73  ize {method args
8200: 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 7a 20 30  } {.    set sz 0
8210: 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73 65 74  .    catch { set
8220: 20 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74   sz [file size t
8230: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20  est.db-journal] 
8240: 7d 0a 20 20 20 20 69 66 20 7b 24 73 7a 20 3e 20  }.    if {$sz > 
8250: 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 7d 20  $::max_journal} 
8260: 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 61  {.      set ::ma
8270: 78 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a 20 20  x_journal $sz.  
8280: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
8290: 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 65  QLITE_OK.  }.  e
82a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
82b0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
82c0: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50   = DELETE;.    P
82d0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
82e0: 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  s = NORMAL;.    
82f0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
8300: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8310: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
8320: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
8330: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
8340: 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27  (85, 'Gorbachev'
8350: 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  );.    COMMIT;. 
8360: 20 7d 0a 0a 20 20 23 20 54 68 65 20 73 69 7a 65   }..  # The size
8370: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8380: 66 69 6c 65 20 69 73 20 6e 6f 77 3a 0a 20 20 23  file is now:.  #
8390: 20 0a 20 20 23 20 20 20 31 29 20 35 31 32 20 62   .  #   1) 512 b
83a0: 79 74 65 20 68 65 61 64 65 72 20 2b 0a 20 20 23  yte header +.  #
83b0: 20 20 20 32 29 20 32 20 2a 20 28 31 30 32 34 2b     2) 2 * (1024+
83c0: 38 29 20 62 79 74 65 20 72 65 63 6f 72 64 73 20  8) byte records 
83d0: 2b 0a 20 20 23 20 20 20 33 29 20 32 30 2b 4e 20  +.  #   3) 20+N 
83e0: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 2d  bytes of master-
83f0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
8400: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
8410: 73 69 7a 65 20 6f 66 20 0a 20 20 23 20 20 20 20  size of .  #    
8420: 20 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75    the master-jou
8430: 72 6e 61 6c 20 6e 61 6d 65 20 65 6e 63 6f 64 65  rnal name encode
8440: 64 20 61 73 20 75 74 66 2d 38 20 77 69 74 68 20  d as utf-8 with 
8450: 6e 6f 20 6e 75 6c 20 74 65 72 6d 2e 0a 20 20 23  no nul term..  #
8460: 0a 20 20 73 65 74 20 6d 6a 5f 70 6f 69 6e 74 65  .  set mj_pointe
8470: 72 20 5b 65 78 70 72 20 7b 0a 20 20 20 20 32 30  r [expr {.    20
8480: 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   + [string lengt
8490: 68 20 22 74 65 73 74 2e 64 62 2d 6d 6a 58 58 58  h "test.db-mjXXX
84a0: 58 58 58 39 58 58 22 5d 0a 20 20 7d 5d 0a 20 20  XXX9XX"].  }].  
84b0: 23 0a 20 20 23 20 20 20 4e 4f 54 45 3a 20 46 6f  #.  #   NOTE: Fo
84c0: 72 20 69 74 65 6d 20 33 20 61 62 6f 76 65 2c 20  r item 3 above, 
84d0: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  if the current S
84e0: 51 4c 69 74 65 20 56 46 53 20 6c 61 63 6b 73 20  QLite VFS lacks 
84f0: 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 61  the concept of a
8500: 0a 20 20 23 20 20 20 20 20 20 20 20 20 63 75 72  .  #         cur
8510: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2c 20  rent directory, 
8520: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
8530: 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74  e current direct
8540: 6f 72 79 20 6e 61 6d 65 20 70 6c 75 73 20 31 0a  ory name plus 1.
8550: 20 20 23 20 20 20 20 20 20 20 20 20 63 68 61 72    #         char
8560: 61 63 74 65 72 20 66 6f 72 20 74 68 65 20 64 69  acter for the di
8570: 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f  rectory separato
8580: 72 20 63 68 61 72 61 63 74 65 72 20 61 72 65 20  r character are 
8590: 4e 4f 54 20 63 6f 75 6e 74 65 64 20 61 73 0a 20  NOT counted as. 
85a0: 20 23 20 20 20 20 20 20 20 20 20 70 61 72 74 20   #         part 
85b0: 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 73 69 7a  of the total siz
85c0: 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68  e; otherwise, th
85d0: 65 79 20 61 72 65 2e 0a 20 20 23 0a 20 20 69 66  ey are..  #.  if
85e0: 63 61 70 61 62 6c 65 20 63 75 72 64 69 72 20 7b  capable curdir {
85f0: 0a 20 20 20 20 73 65 74 20 6d 6a 5f 70 6f 69 6e  .    set mj_poin
8600: 74 65 72 20 5b 65 78 70 72 20 7b 24 6d 6a 5f 70  ter [expr {$mj_p
8610: 6f 69 6e 74 65 72 20 2b 20 5b 73 74 72 69 6e 67  ointer + [string
8620: 20 6c 65 6e 67 74 68 20 5b 67 65 74 5f 70 77 64   length [get_pwd
8630: 5d 5d 20 2b 20 31 7d 5d 0a 20 20 7d 0a 20 20 65  ]] + 1}].  }.  e
8640: 78 70 72 20 7b 24 3a 3a 6d 61 78 5f 6a 6f 75 72  xpr {$::max_jour
8650: 6e 61 6c 3d 3d 28 35 31 32 2b 32 2a 28 31 30 32  nal==(512+2*(102
8660: 34 2b 38 29 2b 24 6d 6a 5f 70 6f 69 6e 74 65 72  4+8)+$mj_pointer
8670: 29 7d 0a 7d 20 31 0a 64 6f 5f 74 65 73 74 20 70  )}.} 1.do_test p
8680: 61 67 65 72 31 2d 35 2e 34 2e 32 20 7b 0a 20 20  ager1-5.4.2 {.  
8690: 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61  set ::max_journa
86a0: 6c 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  l 0.  execsql {.
86b0: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
86c0: 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a 20  ronous = full;. 
86d0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
86e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
86f0: 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27  HERE b = 'Lenin'
8700: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
8710: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20 3d  ROM t2 WHERE b =
8720: 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 43 4f   'Lenin';.    CO
8730: 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 23 20 49  MMIT;.  }..  # I
8740: 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75  n synchronous=fu
8750: 6c 6c 20 6d 6f 64 65 2c 20 74 68 65 20 6d 61 73  ll mode, the mas
8760: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
8770: 74 65 72 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ter is not writt
8780: 65 6e 0a 20 20 23 20 64 69 72 65 63 74 6c 79 20  en.  # directly 
8790: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 72  after the last r
87a0: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
87b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 73 74 65  rnal file. Inste
87c0: 61 64 2c 20 69 74 20 69 73 0a 20 20 23 20 77 72  ad, it is.  # wr
87d0: 69 74 74 65 6e 20 73 74 61 72 74 69 6e 67 20 61  itten starting a
87e0: 74 20 74 68 65 20 6e 65 78 74 20 28 69 6e 20 74  t the next (in t
87f0: 68 69 73 20 63 61 73 65 20 35 31 32 20 62 79 74  his case 512 byt
8800: 65 29 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  e) sector bounda
8810: 72 79 2e 0a 20 20 23 0a 20 20 73 65 74 20 6d 6a  ry..  #.  set mj
8820: 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b  _pointer [expr {
8830: 0a 20 20 20 20 32 30 20 2b 20 5b 73 74 72 69 6e  .    20 + [strin
8840: 67 20 6c 65 6e 67 74 68 20 22 74 65 73 74 2e 64  g length "test.d
8850: 62 2d 6d 6a 58 58 58 58 58 58 39 58 58 22 5d 0a  b-mjXXXXXX9XX"].
8860: 20 20 7d 5d 0a 20 20 23 0a 20 20 23 20 20 20 4e    }].  #.  #   N
8870: 4f 54 45 3a 20 49 66 20 74 68 65 20 63 75 72 72  OTE: If the curr
8880: 65 6e 74 20 53 51 4c 69 74 65 20 56 46 53 20 6c  ent SQLite VFS l
8890: 61 63 6b 73 20 74 68 65 20 63 6f 6e 63 65 70 74  acks the concept
88a0: 20 6f 66 20 61 20 63 75 72 72 65 6e 74 20 64 69   of a current di
88b0: 72 65 63 74 6f 72 79 2c 0a 20 20 23 20 20 20 20  rectory,.  #    
88c0: 20 20 20 20 20 74 68 65 20 6c 65 6e 67 74 68 20       the length 
88d0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  of the current d
88e0: 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 70 6c  irectory name pl
88f0: 75 73 20 31 20 63 68 61 72 61 63 74 65 72 20 66  us 1 character f
8900: 6f 72 20 74 68 65 0a 20 20 23 20 20 20 20 20 20  or the.  #      
8910: 20 20 20 64 69 72 65 63 74 6f 72 79 20 73 65 70     directory sep
8920: 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
8930: 20 61 72 65 20 4e 4f 54 20 63 6f 75 6e 74 65 64   are NOT counted
8940: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
8950: 74 6f 74 61 6c 0a 20 20 23 20 20 20 20 20 20 20  total.  #       
8960: 20 20 73 69 7a 65 3b 20 6f 74 68 65 72 77 69 73    size; otherwis
8970: 65 2c 20 74 68 65 79 20 61 72 65 2e 0a 20 20 23  e, they are..  #
8980: 0a 20 20 69 66 63 61 70 61 62 6c 65 20 63 75 72  .  ifcapable cur
8990: 64 69 72 20 7b 0a 20 20 20 20 73 65 74 20 6d 6a  dir {.    set mj
89a0: 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b  _pointer [expr {
89b0: 24 6d 6a 5f 70 6f 69 6e 74 65 72 20 2b 20 5b 73  $mj_pointer + [s
89c0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67 65  tring length [ge
89d0: 74 5f 70 77 64 5d 5d 20 2b 20 31 7d 5d 0a 20 20  t_pwd]] + 1}].  
89e0: 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 61 78  }.  expr {$::max
89f0: 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 28 28 35 31 32  _journal==(((512
8a00: 2b 32 2a 28 31 30 32 34 2b 38 29 2b 35 31 31 29  +2*(1024+8)+511)
8a10: 2f 35 31 32 29 2a 35 31 32 20 2b 20 24 6d 6a 5f  /512)*512 + $mj_
8a20: 70 6f 69 6e 74 65 72 29 7d 0a 7d 20 31 0a 64 62  pointer)}.} 1.db
8a30: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
8a40: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
8a50: 2d 35 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74  -5.5.1 {.  sqlit
8a60: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
8a70: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41  execsql { .    A
8a80: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
8a90: 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41   AS aux;.    PRA
8aa0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8ab0: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
8ac0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
8ad0: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
8ae0: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
8af0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
8b00: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
8b10: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
8b20: 20 55 50 44 41 54 45 20 74 33 20 53 45 54 20 62   UPDATE t3 SET b
8b30: 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35   = randomblob(15
8b40: 30 31 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20  01);.  }.  expr 
8b50: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
8b60: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35  db-journal] > 15
8b70: 30 30 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  000.} {1}.do_tes
8b80: 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b  t pager1-5.5.2 {
8b90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
8ba0: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
8bb0: 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20  ous = full;.    
8bc0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c  BEGIN;.      DEL
8bd0: 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
8be0: 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a  E b = 'Stalin';.
8bf0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
8c00: 4d 20 74 32 20 57 48 45 52 45 20 62 20 3d 20 27  M t2 WHERE b = '
8c10: 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d  Stalin';.    COM
8c20: 4d 49 54 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20  MIT;.  }.  file 
8c30: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
8c40: 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d  rnal.} {0}...#--
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c90: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
8ca0: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f  llowing tests wo
8cb0: 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41 20  rk with "PRAGMA 
8cc0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a  max_page_count".
8cd0: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
8ce0: 2d 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  -6.1 {.  faultsi
8cf0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
8d00: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
8d10: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
8d20: 76 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20  vacuum = none;. 
8d30: 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61     PRAGMA max_pa
8d40: 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20  ge_count = 10;. 
8d50: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
8d60: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t2(a, b);.    CR
8d70: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
8d80: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
8d90: 54 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a  TABLE t4(a, b);.
8da0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8db0: 20 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t5(a, b);.    C
8dc0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
8dd0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
8de0: 20 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b   TABLE t7(a, b);
8df0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8e00: 45 20 74 38 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t8(a, b);.    
8e10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28  CREATE TABLE t9(
8e20: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
8e30: 45 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20 62  E TABLE t10(a, b
8e40: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f  );.  }.} {10}.do
8e50: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
8e60: 61 67 65 72 31 2d 36 2e 32 20 7b 0a 20 20 43 52  ager1-6.2 {.  CR
8e70: 45 41 54 45 20 54 41 42 4c 45 20 74 31 31 28 61  EATE TABLE t11(a
8e80: 2c 20 62 29 0a 7d 20 7b 31 20 7b 64 61 74 61 62  , b).} {1 {datab
8e90: 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66  ase or disk is f
8ea0: 75 6c 6c 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  ull}}.do_execsql
8eb0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 34  _test pager1-6.4
8ec0: 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61   { PRAGMA max_pa
8ed0: 67 65 5f 63 6f 75 6e 74 20 20 20 20 20 20 7d 20  ge_count      } 
8ee0: 7b 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {10}.do_execsql_
8ef0: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 35 20  test pager1-6.5 
8f00: 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67  { PRAGMA max_pag
8f10: 65 5f 63 6f 75 6e 74 20 3d 20 31 35 20 7d 20 7b  e_count = 15 } {
8f20: 31 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  15}.do_execsql_t
8f30: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 36 20 7b  est pager1-6.6 {
8f40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
8f50: 31 28 61 2c 20 62 29 20 20 20 20 20 7d 20 7b 7d  1(a, b)     } {}
8f60: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8f70: 20 70 61 67 65 72 31 2d 36 2e 37 20 7b 0a 20 20   pager1-6.7 {.  
8f80: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
8f90: 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45  T INTO t11 VALUE
8fa0: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 50 52 41  S(1, 2);.    PRA
8fb0: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
8fc0: 6e 74 20 3d 20 31 33 3b 0a 7d 20 7b 31 33 7d 0a  nt = 13;.} {13}.
8fd0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8fe0: 70 61 67 65 72 31 2d 36 2e 38 20 7b 0a 20 20 20  pager1-6.8 {.   
8ff0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31   INSERT INTO t11
9000: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
9010: 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61     PRAGMA max_pa
9020: 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 7d  ge_count = 10;.}
9030: 20 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {11}.do_execsql
9040: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 39  _test pager1-6.9
9050: 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a   { COMMIT } {}..
9060: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9070: 70 61 67 65 72 31 2d 36 2e 31 30 20 7b 20 50 52  pager1-6.10 { PR
9080: 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f  AGMA max_page_co
9090: 75 6e 74 20 3d 20 31 30 20 7d 20 7b 31 31 7d 0a  unt = 10 } {11}.
90a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
90b0: 70 61 67 65 72 31 2d 36 2e 31 31 20 7b 20 53 45  pager1-6.11 { SE
90c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31 20  LECT * FROM t11 
90d0: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20  }          {1 2 
90e0: 33 20 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  3 4}.do_execsql_
90f0: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 32  test pager1-6.12
9100: 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61   { PRAGMA max_pa
9110: 67 65 5f 63 6f 75 6e 74 20 7d 20 20 20 20 20 20  ge_count }      
9120: 7b 31 31 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  {11}...#--------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9170: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
9180: 67 20 74 65 73 74 73 20 77 6f 72 6b 20 77 69 74  g tests work wit
9190: 68 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  h "PRAGMA journa
91a0: 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 22  l_mode=TRUNCATE"
91b0: 20 61 6e 64 0a 23 20 22 50 52 41 47 4d 41 20 6c   and.# "PRAGMA l
91c0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
91d0: 55 53 49 56 45 22 2e 0a 23 0a 23 20 45 61 63 68  USIVE"..#.# Each
91e0: 20 74 65 73 74 20 69 73 20 73 70 65 63 69 66 69   test is specifi
91f0: 65 64 20 77 69 74 68 20 35 20 76 61 72 69 61 62  ed with 5 variab
9200: 6c 65 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  les. As follows:
9210: 0a 23 0a 23 20 20 20 24 74 6e 3a 20 20 54 65 73  .#.#   $tn:  Tes
9220: 74 20 4e 75 6d 62 65 72 2e 20 55 73 65 64 20 61  t Number. Used a
9230: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 5b 64  s part of the [d
9240: 6f 5f 74 65 73 74 5d 20 74 65 73 74 20 6e 61 6d  o_test] test nam
9250: 65 73 2e 0a 23 20 20 20 24 73 71 6c 3a 20 53 51  es..#   $sql: SQ
9260: 4c 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 23 20  L to execute..# 
9270: 20 20 24 72 65 73 3a 20 45 78 70 65 63 74 65 64    $res: Expected
9280: 20 72 65 73 75 6c 74 20 6f 66 20 65 78 65 63 75   result of execu
9290: 74 69 6e 67 20 24 73 71 6c 2e 0a 23 20 20 20 24  ting $sql..#   $
92a0: 6a 73 3a 20 20 54 68 65 20 65 78 70 65 63 74 65  js:  The expecte
92b0: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  d size of the jo
92c0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 6e 20 62  urnal file, in b
92d0: 79 74 65 73 2c 20 61 66 74 65 72 20 65 78 65 63  ytes, after exec
92e0: 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20  uting.#         
92f0: 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 2e 20  the SQL script. 
9300: 4f 72 20 2d 31 20 69 66 20 74 68 65 20 6a 6f 75  Or -1 if the jou
9310: 72 6e 61 6c 20 69 73 20 6e 6f 74 20 65 78 70 65  rnal is not expe
9320: 63 74 65 64 20 74 6f 20 65 78 69 73 74 2e 0a 23  cted to exist..#
9330: 20 20 20 24 77 73 3a 20 20 54 68 65 20 65 78 70     $ws:  The exp
9340: 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68  ected size of th
9350: 65 20 57 41 4c 20 66 69 6c 65 2c 20 69 6e 20 62  e WAL file, in b
9360: 79 74 65 73 2c 20 61 66 74 65 72 20 65 78 65 63  ytes, after exec
9370: 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20  uting.#         
9380: 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 2e 20  the SQL script. 
9390: 4f 72 20 2d 31 20 69 66 20 74 68 65 20 57 41 4c  Or -1 if the WAL
93a0: 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64   is not expected
93b0: 20 74 6f 20 65 78 69 73 74 2e 0a 23 0a 69 66 63   to exist..#.ifc
93c0: 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 66  apable wal {.  f
93d0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
93e0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65  nd_reopen.  fore
93f0: 61 63 68 20 7b 74 6e 20 73 71 6c 20 72 65 73 20  ach {tn sql res 
9400: 6a 73 20 77 73 7d 20 5b 73 75 62 73 74 20 7b 0a  js ws} [subst {.
9410: 20 20 0a 20 20 20 20 31 20 20 7b 0a 20 20 20 20    .    1  {.    
9420: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9430: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 50  1(a, b);.      P
9440: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
9450: 6d 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  m=OFF;.      PRA
9460: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  GMA synchronous=
9470: 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52  NORMAL;.      PR
9480: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 31  AGMA page_size=1
9490: 30 32 34 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  024;.      PRAGM
94a0: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  A locking_mode=E
94b0: 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
94c0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
94d0: 6f 64 65 3d 54 52 55 4e 43 41 54 45 3b 0a 20 20  ode=TRUNCATE;.  
94e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
94f0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
9500: 0a 20 20 20 20 7d 20 7b 65 78 63 6c 75 73 69 76  .    } {exclusiv
9510: 65 20 74 72 75 6e 63 61 74 65 7d 20 30 20 2d 31  e truncate} 0 -1
9520: 0a 20 20 0a 20 20 20 20 32 20 20 7b 0a 20 20 20  .  .    2  {.   
9530: 20 20 20 42 45 47 49 4e 20 49 4d 4d 45 44 49 41     BEGIN IMMEDIA
9540: 54 45 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  TE;.        SELE
9550: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
9560: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
9570: 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a  } {1 2} 0 -1.  .
9580: 20 20 20 20 33 20 20 7b 0a 20 20 20 20 20 20 42      3  {.      B
9590: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 53 45  EGIN;.        SE
95a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
95b0: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
95c0: 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20    } {1 2} 0 -1. 
95d0: 20 0a 20 20 20 20 34 20 20 7b 20 50 52 41 47 4d   .    4  { PRAGM
95e0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
95f0: 20 57 41 4c 20 7d 20 20 20 20 77 61 6c 20 20 20   WAL }    wal   
9600: 20 20 20 20 2d 31 20 2d 31 0a 20 20 20 20 35 20      -1 -1.    5 
9610: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
9620: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d  1 VALUES(3, 4) }
9630: 20 20 7b 7d 20 20 20 20 20 20 20 20 2d 31 20 5b    {}        -1 [
9640: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20  wal_file_size 1 
9650: 31 30 32 34 5d 0a 20 20 20 20 36 20 20 7b 20 50  1024].    6  { P
9660: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
9670: 64 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20 65 78  de = NORMAL } ex
9680: 63 6c 75 73 69 76 65 20 2d 31 20 5b 77 61 6c 5f  clusive -1 [wal_
9690: 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34  file_size 1 1024
96a0: 5d 0a 20 20 20 20 37 20 20 7b 20 49 4e 53 45 52  ].    7  { INSER
96b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
96c0: 28 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20  (5, 6); } {}    
96d0: 20 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65      -1 [wal_file
96e0: 5f 73 69 7a 65 20 32 20 31 30 32 34 5d 0a 20 20  _size 2 1024].  
96f0: 0a 20 20 20 20 38 20 20 7b 20 50 52 41 47 4d 41  .    8  { PRAGMA
9700: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
9710: 54 52 55 4e 43 41 54 45 20 7d 20 74 72 75 6e 63  TRUNCATE } trunc
9720: 61 74 65 20 20 20 20 20 20 20 20 20 20 30 20 2d  ate          0 -
9730: 31 0a 20 20 20 20 39 20 20 7b 20 49 4e 53 45 52  1.    9  { INSER
9740: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
9750: 28 37 2c 20 38 29 20 7d 20 20 20 20 7b 7d 20 20  (7, 8) }    {}  
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
9770: 2d 31 0a 20 20 20 20 31 30 20 7b 20 53 45 4c 45  -1.    10 { SELE
9780: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20  CT * FROM t1 }  
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 20               {1 
97a0: 32 20 33 20 34 20 35 20 36 20 37 20 38 7d 20 30  2 3 4 5 6 7 8} 0
97b0: 20 2d 31 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20 20   -1.  .  }] {.  
97c0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
97d0: 74 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e  t pager1-7.1.$tn
97e0: 2e 31 20 24 73 71 6c 20 24 72 65 73 0a 20 20 20  .1 $sql $res.   
97f0: 20 63 61 74 63 68 20 7b 20 73 65 74 20 4a 20 2d   catch { set J -
9800: 31 20 3b 20 73 65 74 20 4a 20 5b 66 69 6c 65 20  1 ; set J [file 
9810: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
9820: 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63  rnal] }.    catc
9830: 68 20 7b 20 73 65 74 20 57 20 2d 31 20 3b 20 73  h { set W -1 ; s
9840: 65 74 20 57 20 5b 66 69 6c 65 20 73 69 7a 65 20  et W [file size 
9850: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20  test.db-wal] }. 
9860: 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72     do_test pager
9870: 31 2d 37 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69  1-7.1.$tn.2 { li
9880: 73 74 20 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74  st $J $W } [list
9890: 20 24 6a 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a   $js $ws].  }.}.
98a0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
98b0: 37 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  7.2.1 {.  faults
98c0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
98d0: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
98e0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
98f0: 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55  ing_mode = EXCLU
9900: 53 49 56 45 3b 0a 20 20 20 20 43 52 45 41 54 45  SIVE;.    CREATE
9910: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
9920: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
9930: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
9940: 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a  _mode = delete;.
9950: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
9960: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 74 72 75 6e  rnal_mode = trun
9970: 63 61 74 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63  cate;.  }.} {exc
9980: 6c 75 73 69 76 65 20 64 65 6c 65 74 65 20 74 72  lusive delete tr
9990: 75 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20  uncate}.do_test 
99a0: 70 61 67 65 72 31 2d 37 2e 32 2e 32 20 7b 0a 20  pager1-7.2.2 {. 
99b0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
99c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
99d0: 28 31 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73  (1, 2) }.  execs
99e0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
99f0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69  nal_mode = persi
9a00: 73 74 20 7d 0a 7d 20 7b 74 72 75 6e 63 61 74 65  st }.} {truncate
9a10: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
9a20: 2d 37 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73  -7.2.3 {.  execs
9a30: 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  ql { COMMIT }.  
9a40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
9a50: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
9a60: 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20  e = persist;.   
9a70: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
9a80: 73 69 7a 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a  size_limit;.  }.
9a90: 7d 20 7b 70 65 72 73 69 73 74 20 2d 31 7d 0a 0a  } {persist -1}..
9aa0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
9ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
9af0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
9b00: 2c 20 70 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65  , pager1-8.*, te
9b10: 73 74 20 74 68 61 74 20 74 68 65 20 73 70 65 63  st that the spec
9b20: 69 61 6c 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23  ial filenames .#
9b30: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20   ":memory:" and 
9b40: 22 22 20 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72  "" open temporar
9b50: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 66  y databases..#.f
9b60: 6f 72 65 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e  oreach {tn filen
9b70: 61 6d 65 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f  ame} {.  1 :memo
9b80: 72 79 3a 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20  ry:.  2 "".} {. 
9b90: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
9ba0: 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61  8.$tn.1 {.    fa
9bb0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
9bc0: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20  d_reopen.    db 
9bd0: 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65  close.    sqlite
9be0: 33 20 64 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20  3 db $filename. 
9bf0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
9c00: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
9c10: 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20  acuum = 1;.     
9c20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31   CREATE TABLE x1
9c30: 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  (x);.      INSER
9c40: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
9c50: 28 27 43 68 61 72 6c 65 73 27 29 3b 0a 20 20 20  ('Charles');.   
9c60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
9c70: 31 20 56 41 4c 55 45 53 28 27 4a 61 6d 65 73 27  1 VALUES('James'
9c80: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
9c90: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27  INTO x1 VALUES('
9ca0: 4d 61 72 79 27 29 3b 0a 20 20 20 20 20 20 53 45  Mary');.      SE
9cb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a  LECT * FROM x1;.
9cc0: 20 20 20 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c      }.  } {Charl
9cd0: 65 73 20 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a  es James Mary}..
9ce0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
9cf0: 2d 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73  -8.$tn.2 {.    s
9d00: 71 6c 69 74 65 33 20 64 62 32 20 24 66 69 6c 65  qlite3 db2 $file
9d10: 6e 61 6d 65 0a 20 20 20 20 63 61 74 63 68 73 71  name.    catchsq
9d20: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
9d30: 4d 20 78 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b  M x1 } db2.  } {
9d40: 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  1 {no such table
9d50: 3a 20 78 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65  : x1}}..  do_exe
9d60: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
9d70: 2d 38 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42  -8.$tn.3 {.    B
9d80: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
9d90: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
9da0: 53 28 27 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20  S('William');.  
9db0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9dc0: 78 31 20 56 41 4c 55 45 53 28 27 41 6e 6e 65 27  x1 VALUES('Anne'
9dd0: 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b  );.    ROLLBACK;
9de0: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .  } {}.}..#----
9df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e30: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74  -----.# The next
9e40: 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20   block of tests 
9e50: 2d 20 70 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64  - pager1-9.* - d
9e60: 65 61 6c 20 77 69 74 68 20 69 6e 74 65 72 61 63  eal with interac
9e70: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 23 20  tions between.# 
9e80: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  the pager and th
9e90: 65 20 62 61 63 6b 75 70 20 41 50 49 2e 20 54 65  e backup API. Te
9ea0: 73 74 20 63 61 73 65 73 3a 0a 23 0a 23 20 20 20  st cases:.#.#   
9eb0: 70 61 67 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65  pager1-9.1.*: Te
9ec0: 73 74 20 74 68 61 74 20 61 20 62 61 63 6b 75 70  st that a backup
9ed0: 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65   completes succe
9ee0: 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66 20  ssfully even if 
9ef0: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
9f00: 20 20 20 20 20 20 73 6f 75 72 63 65 20 64 62 20        source db 
9f10: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 75  is written to du
9f20: 72 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20  ring the backup 
9f30: 6f 70 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  op..#.#   pager1
9f40: 2d 39 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61  -9.2.*: Test tha
9f50: 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c  t a backup compl
9f60: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
9f70: 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20  y even if the.# 
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 73 6f 75 72 63 65 20 64 62 20 69 73 20 77 72 69  source db is wri
9fa0: 74 74 65 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e  tten to and then
9fb0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 64 75 72   rolled back dur
9fc0: 69 6e 67 20 61 20 0a 23 20 20 20 20 20 20 20 20  ing a .#        
9fd0: 20 20 20 20 20 20 20 20 20 62 61 63 6b 75 70 20           backup 
9fe0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f  operation..#.do_
9ff0: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e  test pager1-9.0.
a000: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
a010: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
a020: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
a030: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65  ing a_string.  e
a040: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
a050: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
a060: 20 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   10;.    BEGIN;.
a070: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
a080: 4c 45 20 61 62 28 61 2c 20 62 2c 20 55 4e 49 51  LE ab(a, b, UNIQ
a090: 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 20  UE(a, b));.     
a0a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
a0b0: 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67  VALUES( a_string
a0c0: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
a0d0: 33 30 30 29 20 29 3b 0a 20 20 20 20 20 20 49 4e  300) );.      IN
a0e0: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c  SERT INTO ab SEL
a0f0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
a100: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
a110: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20   FROM ab;.      
a120: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53  INSERT INTO ab S
a130: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
a140: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
a150: 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20  0) FROM ab;.    
a160: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
a170: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
a180: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
a190: 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20  300) FROM ab;.  
a1a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a1b0: 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  ab SELECT a_stri
a1c0: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
a1d0: 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a  g(300) FROM ab;.
a1e0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
a1f0: 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74  O ab SELECT a_st
a200: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
a210: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62  ing(300) FROM ab
a220: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
a230: 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f  NTO ab SELECT a_
a240: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
a250: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
a260: 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ab;.      INSERT
a270: 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20   INTO ab SELECT 
a280: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
a290: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
a2a0: 4d 20 61 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  M ab;.    COMMIT
a2b0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
a2c0: 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 32 20  st pager1-9.0.2 
a2d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
a2e0: 74 65 73 74 2e 64 62 32 0a 20 20 64 62 32 20 65  test.db2.  db2 e
a2f0: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63  val { PRAGMA cac
a300: 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20  he_size = 10 }. 
a310: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
a320: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
a330: 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65  in.  list [B ste
a340: 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69  p 10000] [B fini
a350: 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f  sh].} {SQLITE_DO
a360: 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  NE SQLITE_OK}.do
a370: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30  _test pager1-9.0
a380: 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45  .3 {. db one {SE
a390: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
a3a0: 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62  ) FROM ab}.} [db
a3b0: 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64  2 one {SELECT md
a3c0: 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20  5sum(a, b) FROM 
a3d0: 61 62 7d 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  ab}]..do_test pa
a3e0: 67 65 72 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65  ger1-9.1.1 {.  e
a3f0: 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20  xecsql { UPDATE 
a400: 61 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72  ab SET a = a_str
a410: 69 6e 67 28 32 30 31 29 20 7d 0a 20 20 73 71 6c  ing(201) }.  sql
a420: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62  ite3_backup B db
a430: 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20  2 main db main. 
a440: 20 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51   B step 30.} {SQ
a450: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
a460: 20 70 61 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a   pager1-9.1.2 {.
a470: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
a480: 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f  TE ab SET b = a_
a490: 73 74 72 69 6e 67 28 33 30 31 29 20 7d 0a 20 20  string(301) }.  
a4a0: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
a4b0: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
a4c0: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
a4d0: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
a4e0: 20 70 61 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a   pager1-9.1.3 {.
a4f0: 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20   db one {SELECT 
a500: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
a510: 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65  M ab}.} [db2 one
a520: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
a530: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a  a, b) FROM ab}].
a540: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
a550: 2e 31 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b  .1.4 { execsql {
a560: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
a570: 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32   FROM ab } } {12
a580: 38 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  8}..do_test page
a590: 72 31 2d 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65  r1-9.2.1 {.  exe
a5a0: 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62  csql { UPDATE ab
a5b0: 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e   SET a = a_strin
a5c0: 67 28 32 30 32 29 20 7d 0a 20 20 73 71 6c 69 74  g(202) }.  sqlit
a5d0: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
a5e0: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42  main db main.  B
a5f0: 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49   step 30.} {SQLI
a600: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70  TE_OK}.do_test p
a610: 61 67 65 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20  ager1-9.2.2 {.  
a620: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42  execsql { .    B
a630: 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41  EGIN;.      UPDA
a640: 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f  TE ab SET b = a_
a650: 73 74 72 69 6e 67 28 33 30 31 29 3b 0a 20 20 20  string(301);.   
a660: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20   ROLLBACK;.  }. 
a670: 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30   list [B step 10
a680: 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a  000] [B finish].
a690: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53  } {SQLITE_DONE S
a6a0: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
a6b0: 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b  t pager1-9.2.3 {
a6c0: 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54  . db one {SELECT
a6d0: 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52   md5sum(a, b) FR
a6e0: 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e  OM ab}.} [db2 on
a6f0: 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  e {SELECT md5sum
a700: 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d  (a, b) FROM ab}]
a710: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
a720: 39 2e 32 2e 34 20 7b 20 65 78 65 63 73 71 6c 20  9.2.4 { execsql 
a730: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
a740: 29 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31  ) FROM ab } } {1
a750: 32 38 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32  28}.db close.db2
a760: 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20   close..do_test 
a770: 70 61 67 65 72 31 2d 39 2e 33 2e 31 20 7b 0a 20  pager1-9.3.1 {. 
a780: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
a790: 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74  ault 1.  tv sect
a7a0: 6f 72 73 69 7a 65 20 34 30 39 36 0a 20 20 66 61  orsize 4096.  fa
a7b0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
a7c0: 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 65 78 65 63  d_reopen..  exec
a7d0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 70 61 67  sql { PRAGMA pag
a7e0: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 20 7d 0a  e_size = 1024 }.
a7f0: 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d    for {set ii 0}
a800: 20 7b 24 69 69 20 3c 20 34 7d 20 7b 69 6e 63 72   {$ii < 4} {incr
a810: 20 69 69 7d 20 7b 20 65 78 65 63 73 71 6c 20 22   ii} { execsql "
a820: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 24 7b  CREATE TABLE t${
a830: 69 69 7d 28 61 2c 20 62 29 22 20 7d 0a 7d 20 7b  ii}(a, b)" }.} {
a840: 7d 0a 69 66 20 7b 5b 6e 6f 6e 7a 65 72 6f 5f 72  }.if {[nonzero_r
a850: 65 73 65 72 76 65 64 5f 62 79 74 65 73 5d 7d 20  eserved_bytes]} 
a860: 7b 0a 20 20 23 20 62 61 63 6b 75 70 20 77 69 74  {.  # backup wit
a870: 68 20 61 20 70 61 67 65 20 73 69 7a 65 20 63 68  h a page size ch
a880: 61 6e 67 65 73 20 69 73 20 6e 6f 74 20 70 6f 73  anges is not pos
a890: 73 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 63  sible with the c
a8a0: 6f 64 65 63 0a 20 20 23 0a 20 20 64 6f 5f 74 65  odec.  #.  do_te
a8b0: 73 74 20 70 61 67 65 72 31 2d 39 2e 33 2e 32 63  st pager1-9.3.2c
a8c0: 6f 64 65 63 20 7b 0a 20 20 20 20 73 71 6c 69 74  odec {.    sqlit
a8d0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
a8e0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
a8f0: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
a900: 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20  size = 4096;.   
a910: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
a920: 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 20 20 20  onous = OFF;.   
a930: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a940: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
a950: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
a960: 61 2c 20 62 29 3b 0a 20 20 20 20 7d 20 64 62 32  a, b);.    } db2
a970: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
a980: 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64  kup B db2 main d
a990: 62 20 6d 61 69 6e 0a 20 20 20 20 42 20 73 74 65  b main.    B ste
a9a0: 70 20 33 30 0a 20 20 20 20 6c 69 73 74 20 5b 42  p 30.    list [B
a9b0: 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20   step 10000] [B 
a9c0: 66 69 6e 69 73 68 5d 0a 20 20 7d 20 7b 53 51 4c  finish].  } {SQL
a9d0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 53 51 4c  ITE_READONLY SQL
a9e0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 7d 0a 20 20  ITE_READONLY}.  
a9f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
aa00: 2e 33 2e 33 63 6f 64 65 63 20 7b 0a 20 20 20 20  .3.3codec {.    
aa10: 64 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 64 62  db2 close.    db
aa20: 20 63 6c 6f 73 65 0a 20 20 20 20 74 76 20 64 65   close.    tv de
aa30: 6c 65 74 65 0a 20 20 20 20 66 69 6c 65 20 73 69  lete.    file si
aa40: 7a 65 20 74 65 73 74 2e 64 62 32 0a 20 20 7d 20  ze test.db2.  } 
aa50: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
aa60: 64 62 32 5d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20  db2].} else {.  
aa70: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
aa80: 2e 33 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74  .3.2 {.    sqlit
aa90: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
aaa0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
aab0: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
aac0: 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20  size = 4096;.   
aad0: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
aae0: 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 20 20 20  onous = OFF;.   
aaf0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
ab00: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
ab10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
ab20: 61 2c 20 62 29 3b 0a 20 20 20 20 7d 20 64 62 32  a, b);.    } db2
ab30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
ab40: 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64  kup B db2 main d
ab50: 62 20 6d 61 69 6e 0a 20 20 20 20 42 20 73 74 65  b main.    B ste
ab60: 70 20 33 30 0a 20 20 20 20 6c 69 73 74 20 5b 42  p 30.    list [B
ab70: 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20   step 10000] [B 
ab80: 66 69 6e 69 73 68 5d 0a 20 20 7d 20 7b 53 51 4c  finish].  } {SQL
ab90: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
aba0: 4f 4b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  OK}.  do_test pa
abb0: 67 65 72 31 2d 39 2e 33 2e 33 20 7b 0a 20 20 20  ger1-9.3.3 {.   
abc0: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 64   db2 close.    d
abd0: 62 20 63 6c 6f 73 65 0a 20 20 20 20 74 76 20 64  b close.    tv d
abe0: 65 6c 65 74 65 0a 20 20 20 20 66 69 6c 65 20 73  elete.    file s
abf0: 69 7a 65 20 74 65 73 74 2e 64 62 32 0a 20 20 7d  ize test.db2.  }
ac00: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
ac10: 2e 64 62 5d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  .db].}..do_test 
ac20: 70 61 67 65 72 31 2d 39 2e 34 2e 31 20 7b 0a 20  pager1-9.4.1 {. 
ac30: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
ac40: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71  _and_reopen.  sq
ac50: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
ac60: 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  b2.  execsql {. 
ac70: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
ac80: 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  ize = 4096;.    
ac90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
aca0: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
acb0: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
acc0: 3b 0a 20 20 7d 20 64 62 32 0a 20 20 73 71 6c 69  ;.  } db2.  sqli
acd0: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
ace0: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
acf0: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
ad00: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
ad10: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
ad20: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
ad30: 20 70 61 67 65 72 31 2d 39 2e 34 2e 32 20 7b 0a   pager1-9.4.2 {.
ad40: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a    list [file siz
ad50: 65 20 74 65 73 74 2e 64 62 32 5d 20 5b 66 69 6c  e test.db2] [fil
ad60: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a  e size test.db].
ad70: 7d 20 7b 31 30 32 34 20 30 7d 0a 64 62 32 20 63  } {1024 0}.db2 c
ad80: 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lose..#---------
ad90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ada0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
add0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 72 65 67  .# Test that reg
ade0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
adf0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
ae00: 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 2c 20   xSectorSize(), 
ae10: 74 68 65 0a 23 20 6d 69 6e 69 6d 75 6d 20 65 66  the.# minimum ef
ae20: 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 2d 73  fective sector-s
ae30: 69 7a 65 20 69 73 20 35 31 32 20 61 6e 64 20 74  ize is 512 and t
ae40: 68 65 20 6d 61 78 69 6d 75 6d 20 36 35 35 33 36  he maximum 65536
ae50: 20 62 79 74 65 73 2e 0a 23 0a 74 65 73 74 76 66   bytes..#.testvf
ae60: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
ae70: 66 6f 72 65 61 63 68 20 73 65 63 74 6f 72 73 69  foreach sectorsi
ae80: 7a 65 20 7b 0a 20 20 20 20 31 36 0a 20 20 20 20  ze {.    16.    
ae90: 33 32 20 20 20 36 34 20 20 20 31 32 38 20 20 20  32   64   128   
aea0: 32 35 36 20 20 20 35 31 32 20 20 20 31 30 32 34  256   512   1024
aeb0: 20 20 20 32 30 34 38 20 0a 20 20 20 20 34 30 39     2048 .    409
aec0: 36 20 38 31 39 32 20 31 36 33 38 34 20 33 32 37  6 8192 16384 327
aed0: 36 38 20 36 35 35 33 36 20 31 33 31 30 37 32 20  68 65536 131072 
aee0: 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74 76 20  262144.} {.  tv 
aef0: 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63 74  sectorsize $sect
af00: 6f 72 73 69 7a 65 0a 20 20 74 76 20 64 65 76 63  orsize.  tv devc
af10: 68 61 72 20 7b 7d 0a 20 20 73 65 74 20 65 66 66  har {}.  set eff
af20: 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 69   $sectorsize.  i
af30: 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3c  f {$sectorsize <
af40: 20 35 31 32 7d 20 20 20 7b 20 73 65 74 20 65 66   512}   { set ef
af50: 66 20 35 31 32 20 7d 0a 20 20 69 66 20 7b 24 73  f 512 }.  if {$s
af60: 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33  ectorsize > 6553
af70: 36 7d 20 7b 20 73 65 74 20 65 66 66 20 36 35 35  6} { set eff 655
af80: 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  36 }..  do_test 
af90: 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74 6f  pager1-10.$secto
afa0: 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 66 61  rsize.1 {.    fa
afb0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
afc0: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20  d_reopen.    db 
afd0: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
afe0: 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73  string.    execs
aff0: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
b000: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
b010: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20   PERSIST;.      
b020: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
b030: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20 42   = 1024;.      B
b040: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52  EGIN;.        CR
b050: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
b060: 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45   b);.        CRE
b070: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
b080: 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  b);.        CREA
b090: 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62  TE TABLE t3(a, b
b0a0: 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  );.      COMMIT;
b0b0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 20  .    }.    file 
b0c0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
b0d0: 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24  rnal.  } [expr $
b0e0: 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35  sectorsize > 655
b0f0: 33 36 20 3f 20 36 35 35 33 36 20 3a 20 28 24 73  36 ? 65536 : ($s
b100: 65 63 74 6f 72 73 69 7a 65 3c 33 32 20 3f 20 35  ectorsize<32 ? 5
b110: 31 32 20 3a 20 24 73 65 63 74 6f 72 73 69 7a 65  12 : $sectorsize
b120: 29 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  )]..  do_test pa
b130: 67 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73  ger1-10.$sectors
b140: 69 7a 65 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  ize.2 {.    exec
b150: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 49 4e 53  sql { .      INS
b160: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
b170: 45 53 28 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ES(a_string(300)
b180: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29  , a_string(300))
b190: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
b1a0: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20  NTO t3 SELECT * 
b1b0: 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20  FROM t3;        
b1c0: 2f 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49  /*  2 */.      I
b1d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
b1e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20  LECT * FROM t3; 
b1f0: 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a         /*  4 */.
b200: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
b210: 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52  O t3 SELECT * FR
b220: 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a  OM t3;        /*
b230: 20 20 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    8 */.      INS
b240: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
b250: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20  CT * FROM t3;   
b260: 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20       /* 16 */.  
b270: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b280: 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t3 SELECT * FROM
b290: 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 33   t3;        /* 3
b2a0: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  2 */.    }.  } {
b2b0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
b2c0: 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69  er1-10.$sectorsi
b2d0: 7a 65 2e 33 20 7b 0a 20 20 20 20 64 62 20 63 6c  ze.3 {.    db cl
b2e0: 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20  ose.    sqlite3 
b2f0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  db test.db.    e
b300: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
b310: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
b320: 65 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 42 45  e = 10;.      BE
b330: 47 49 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  GIN;.    }.    r
b340: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
b350: 33 32 20 74 33 20 7b 64 62 20 65 76 61 6c 20 22  32 t3 {db eval "
b360: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
b370: 41 4c 55 45 53 28 31 2c 20 32 29 22 7d 0a 20 20  ALUES(1, 2)"}.  
b380: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
b390: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20    COMMIT;.      
b3a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
b3b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32  ;.    }.  } {1 2
b3c0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
b3d0: 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69  er1-10.$sectorsi
b3e0: 7a 65 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  ze.4 {.    execs
b3f0: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
b400: 45 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29  E TABLE t6(a, b)
b410: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
b420: 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a 20  ABLE t7(a, b);. 
b430: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
b440: 45 20 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t5(a, b);.    
b450: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 36 3b    DROP TABLE t6;
b460: 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c  .      DROP TABL
b470: 45 20 74 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E t7;.    }.    
b480: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
b490: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43  BEGIN;.        C
b4a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
b4b0: 2c 20 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , b);.    }.    
b4c0: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
b4d0: 20 33 32 20 74 33 20 7b 64 62 20 65 76 61 6c 20   32 t3 {db eval 
b4e0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20  "INSERT INTO t5 
b4f0: 56 41 4c 55 45 53 28 31 2c 20 32 29 22 7d 0a 20  VALUES(1, 2)"}. 
b500: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
b510: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20     COMMIT;.     
b520: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
b530: 35 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  5;.    }.  } {1 
b540: 32 7d 0a 20 20 0a 7d 0a 64 62 20 63 6c 6f 73 65  2}.  .}.db close
b550: 0a 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20  ..tv sectorsize 
b560: 34 30 39 36 0a 64 6f 5f 74 65 73 74 20 70 61 67  4096.do_test pag
b570: 65 72 31 2e 31 30 2e 78 2e 31 20 7b 0a 20 20 66  er1.10.x.1 {.  f
b580: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
b590: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
b5a0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
b5b0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6e   auto_vacuum = n
b5c0: 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  one;.    PRAGMA 
b5d0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
b5e0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
b5f0: 4c 45 20 74 31 28 78 29 3b 0a 20 20 7d 0a 20 20  LE t1(x);.  }.  
b600: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
b610: 69 3c 33 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  i<30} {incr i} {
b620: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
b630: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
b640: 4c 55 45 53 28 7a 65 72 6f 62 6c 6f 62 28 39 30  LUES(zeroblob(90
b650: 30 29 29 20 7d 0a 20 20 7d 0a 20 20 66 69 6c 65  0)) }.  }.  file
b660: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
b670: 7b 33 32 37 36 38 7d 0a 64 6f 5f 74 65 73 74 20  {32768}.do_test 
b680: 70 61 67 65 72 31 2e 31 30 2e 78 2e 32 20 7b 0a  pager1.10.x.2 {.
b690: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
b6a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
b6b0: 78 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  x);.    DROP TAB
b6c0: 4c 45 20 74 32 3b 0a 20 20 7d 0a 20 20 66 69 6c  LE t2;.  }.  fil
b6d0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d  e size test.db.}
b6e0: 20 7b 33 33 37 39 32 7d 0a 64 6f 5f 74 65 73 74   {33792}.do_test
b6f0: 20 70 61 67 65 72 31 2e 31 30 2e 78 2e 33 20 7b   pager1.10.x.3 {
b700: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
b710: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
b720: 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a  TE TABLE t2(x);.
b730: 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f    }.  recursive_
b740: 73 65 6c 65 63 74 20 33 30 20 74 31 0a 20 20 65  select 30 t1.  e
b750: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
b760: 41 54 45 20 54 41 42 4c 45 20 74 33 28 78 29 3b  ATE TABLE t3(x);
b770: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
b780: 0a 7d 20 7b 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a  .} {}..db close.
b790: 74 76 20 64 65 6c 65 74 65 0a 0a 74 65 73 74 76  tv delete..testv
b7a0: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
b7b0: 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65  .faultsim_delete
b7c0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66  _and_reopen.db f
b7d0: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
b7e0: 74 72 69 6e 67 0a 64 6f 5f 65 78 65 63 73 71 6c  tring.do_execsql
b7f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e  _test pager1-11.
b800: 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75  1 {.  PRAGMA jou
b810: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
b820: 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 63 61 63  TE;.  PRAGMA cac
b830: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
b840: 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54  BEGIN;.    CREAT
b850: 45 20 54 41 42 4c 45 20 7a 7a 28 74 6f 70 20 50  E TABLE zz(top P
b860: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
b870: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20   INSERT INTO zz 
b880: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
b890: 32 32 32 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  222));.    INSER
b8a0: 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54  T INTO zz SELECT
b8b0: 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43   a_string((SELEC
b8c0: 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29  T 222+max(rowid)
b8d0: 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20   FROM zz)) FROM 
b8e0: 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  zz;.    INSERT I
b8f0: 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f  NTO zz SELECT a_
b900: 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32  string((SELECT 2
b910: 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52  22+max(rowid) FR
b920: 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b  OM zz)) FROM zz;
b930: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b940: 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72   zz SELECT a_str
b950: 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b  ing((SELECT 222+
b960: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
b970: 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20  zz)) FROM zz;.  
b980: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
b990: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
b9a0: 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78  ((SELECT 222+max
b9b0: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29  (rowid) FROM zz)
b9c0: 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49  ) FROM zz;.    I
b9d0: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
b9e0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
b9f0: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
ba00: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
ba10: 52 4f 4d 20 7a 7a 3b 0a 20 20 43 4f 4d 4d 49 54  ROM zz;.  COMMIT
ba20: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 55  ;.  BEGIN;.    U
ba30: 50 44 41 54 45 20 7a 7a 20 53 45 54 20 74 6f 70  PDATE zz SET top
ba40: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 34 35 29   = a_string(345)
ba50: 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 0a 70 72  ;.} {delete}..pr
ba60: 6f 63 20 6c 6f 63 6b 6f 75 74 20 7b 6d 65 74 68  oc lockout {meth
ba70: 6f 64 20 61 72 67 73 7d 20 7b 20 72 65 74 75 72  od args} { retur
ba80: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7d  n SQLITE_IOERR }
ba90: 0a 74 76 20 73 63 72 69 70 74 20 6c 6f 63 6b 6f  .tv script locko
baa0: 75 74 0a 74 76 20 66 69 6c 74 65 72 20 7b 78 57  ut.tv filter {xW
bab0: 72 69 74 65 20 78 54 72 75 6e 63 61 74 65 20 78  rite xTruncate x
bac0: 53 79 6e 63 7d 0a 64 6f 5f 63 61 74 63 68 73 71  Sync}.do_catchsq
bad0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31  l_test pager1-11
bae0: 2e 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 31  .2 { COMMIT } {1
baf0: 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   {disk I/O error
bb00: 7d 7d 0a 0a 74 76 20 73 63 72 69 70 74 20 7b 7d  }}..tv script {}
bb10: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
bb20: 31 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33  11.3 {.  sqlite3
bb30: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65   db2 test.db.  e
bb40: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
bb50: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
bb60: 20 3d 20 54 52 55 4e 43 41 54 45 3b 0a 20 20 20   = TRUNCATE;.   
bb70: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
bb80: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 64 62 32  y_check;.  } db2
bb90: 0a 7d 20 7b 74 72 75 6e 63 61 74 65 20 6f 6b 7d  .} {truncate ok}
bba0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
bbb0: 31 31 2e 34 20 7b 0a 20 20 64 62 32 20 63 6c 6f  11.4 {.  db2 clo
bbc0: 73 65 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73  se.  file exists
bbd0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
bbe0: 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71  .} {0}.do_execsq
bbf0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31  l_test pager1-11
bc00: 2e 35 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  .5 { SELECT coun
bc10: 74 28 2a 29 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b  t(*) FROM zz } {
bc20: 33 32 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  32}.db close.tv 
bc30: 64 65 6c 65 74 65 0a 20 20 0a 23 2d 2d 2d 2d 2d  delete.  .#-----
bc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc80: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50 52 41  ----.# Test "PRA
bc90: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a 23  GMA page_size".#
bca0: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
bcb0: 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72  ault 1.tv sector
bcc0: 73 69 7a 65 20 31 30 32 34 0a 66 6f 72 65 61 63  size 1024.foreac
bcd0: 68 20 70 61 67 65 73 69 7a 65 20 7b 0a 20 20 20  h pagesize {.   
bce0: 20 35 31 32 20 20 20 31 30 32 34 20 20 20 32 30   512   1024   20
bcf0: 34 38 20 34 30 39 36 20 38 31 39 32 20 31 36 33  48 4096 8192 163
bd00: 38 34 20 33 32 37 36 38 20 0a 7d 20 7b 0a 20 20  84 32768 .} {.  
bd10: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
bd20: 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 23 20  and_reopen..  # 
bd30: 54 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  The sector-size 
bd40: 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68  (according to th
bd50: 65 20 56 46 53 29 20 69 73 20 31 30 32 34 20 62  e VFS) is 1024 b
bd60: 79 74 65 73 2e 20 53 6f 20 69 66 20 74 68 65 0a  ytes. So if the.
bd70: 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72 65    # page-size re
bd80: 71 75 65 73 74 65 64 20 75 73 69 6e 67 20 22 50  quested using "P
bd90: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22  RAGMA page_size"
bda0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
bdb0: 20 74 68 65 0a 20 20 23 20 63 6f 6d 70 69 6c 65   the.  # compile
bdc0: 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53   time value of S
bdd0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
bde0: 49 5a 45 2c 20 74 68 65 6e 20 74 68 65 20 65 66  IZE, then the ef
bdf0: 66 65 63 74 69 76 65 20 0a 20 20 23 20 70 61 67  fective .  # pag
be00: 65 2d 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 31  e-size remains 1
be10: 30 32 34 20 62 79 74 65 73 2e 0a 20 20 23 0a 20  024 bytes..  #. 
be20: 20 73 65 74 20 65 66 66 20 24 70 61 67 65 73 69   set eff $pagesi
be30: 7a 65 0a 20 20 69 66 20 7b 24 65 66 66 20 3e 20  ze.  if {$eff > 
be40: 24 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  $::SQLITE_MAX_PA
be50: 47 45 5f 53 49 5a 45 7d 20 7b 20 73 65 74 20 65  GE_SIZE} { set e
be60: 66 66 20 31 30 32 34 20 7d 0a 0a 20 20 64 6f 5f  ff 1024 }..  do_
be70: 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24  test pager1-12.$
be80: 70 61 67 65 73 69 7a 65 2e 31 20 7b 0a 20 20 20  pagesize.1 {.   
be90: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
bea0: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
beb0: 20 22 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   ".      PRAGMA 
bec0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 24 70 61 67  page_size = $pag
bed0: 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 43 52 45  esize;.      CRE
bee0: 41 54 45 20 56 49 45 57 20 76 20 41 53 20 53 45  ATE VIEW v AS SE
bef0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
bf00: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 22  te_master;.    "
bf10: 20 64 62 32 0a 20 20 20 20 66 69 6c 65 20 73 69   db2.    file si
bf20: 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 24  ze test.db.  } $
bf30: 65 66 66 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  eff.  do_test pa
bf40: 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a  ger1-12.$pagesiz
bf50: 65 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  e.2 {.    sqlite
bf60: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
bf70: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
bf80: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
bf90: 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20  *) FROM v;.     
bfa0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67   PRAGMA main.pag
bfb0: 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 20 64 62  e_size;.    } db
bfc0: 32 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65  2.  } [list 1 $e
bfd0: 66 66 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ff].  do_test pa
bfe0: 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a  ger1-12.$pagesiz
bff0: 65 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  e.3 {.    execsq
c000: 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43  l { .      SELEC
c010: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
c020: 76 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  v;.      PRAGMA 
c030: 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a  main.page_size;.
c040: 20 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20      }.  } [list 
c050: 31 20 24 65 66 66 5d 0a 20 20 64 62 32 20 63 6c  1 $eff].  db2 cl
c060: 6f 73 65 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74  ose.}.db close.t
c070: 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d  v delete..#-----
c080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0c0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63  ----.# Test spec
c0d0: 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  al "PRAGMA journ
c0e0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
c0f0: 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23   test cases..#.#
c100: 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 2a 3a 20   pager1-13.1.*: 
c110: 54 68 69 73 20 74 65 73 74 73 20 61 20 73 70 65  This tests a spe
c120: 63 69 61 6c 20 63 61 73 65 20 65 6e 63 6f 75 6e  cial case encoun
c130: 74 65 72 65 64 20 69 6e 20 70 65 72 73 69 73 74  tered in persist
c140: 65 6e 74 20 0a 23 20 20 20 20 20 20 20 20 20 20  ent .#          
c150: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6d 6f        journal mo
c160: 64 65 3a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  de: If the journ
c170: 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  al associated wi
c180: 74 68 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  th a transaction
c190: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
c1a0: 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
c1b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
c1c0: 6c 65 20 28 62 65 63 61 75 73 65 20 61 20 70 72  le (because a pr
c1d0: 65 76 69 6f 75 73 20 0a 23 20 20 20 20 20 20 20  evious .#       
c1e0: 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 61 63           transac
c1f0: 74 69 6f 6e 20 6c 65 66 74 20 61 20 76 65 72 79  tion left a very
c200: 20 6c 61 72 67 65 20 6e 6f 6e 2d 68 6f 74 20 6a   large non-hot j
c210: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
c220: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
c230: 20 20 20 20 66 69 6c 65 2d 73 79 73 74 65 6d 29      file-system)
c240: 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 68 61  , then SQLite ha
c250: 73 20 74 6f 20 62 65 20 63 61 72 65 66 75 6c 20  s to be careful 
c260: 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 23 20  that there is.# 
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
c280: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  ot a journal-hea
c290: 64 65 72 20 6c 65 66 74 20 6f 76 65 72 20 66 72  der left over fr
c2a0: 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 20 74 72  om a previous tr
c2b0: 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20  ansaction.#     
c2c0: 20 20 20 20 20 20 20 20 20 20 20 69 6d 6d 65 64             immed
c2d0: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
c2e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
c2f0: 74 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65  tent just writte
c300: 6e 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  n..#            
c310: 20 20 20 20 49 66 20 74 68 65 72 65 20 69 73 2c      If there is,
c320: 20 61 6e 64 20 74 68 65 20 70 72 6f 63 65 73 73   and the process
c330: 20 63 72 61 73 68 65 73 20 73 6f 20 74 68 61 74   crashes so that
c340: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 20   the journal.#  
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
c360: 63 6f 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72  comes a hot-jour
c370: 6e 61 6c 20 61 6e 64 20 6d 75 73 74 20 62 65 20  nal and must be 
c380: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 61  rolled back by a
c390: 6e 6f 74 68 65 72 0a 23 20 20 20 20 20 20 20 20  nother.#        
c3a0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 2c          process,
c3b0: 20 74 68 65 72 65 20 69 73 20 61 20 64 61 6e 67   there is a dang
c3c0: 65 72 20 74 68 61 74 20 74 68 65 20 6f 74 68 65  er that the othe
c3d0: 72 20 70 72 6f 63 65 73 73 20 6d 61 79 20 72 6f  r process may ro
c3e0: 6c 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ll.#            
c3f0: 20 20 20 20 62 61 63 6b 20 74 68 65 20 61 62 6f      back the abo
c400: 72 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  rted transaction
c410: 2c 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20  , then continue 
c420: 63 6f 70 79 69 6e 67 20 64 61 74 61 0a 23 20 20  copying data.#  
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72                fr
c440: 6f 6d 20 61 6e 20 6f 6c 64 65 72 20 74 72 61 6e  om an older tran
c450: 73 61 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  saction from the
c460: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
c470: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 23 20 20 20 20  e journal..#    
c480: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 65 20              See 
c490: 74 68 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  the syncJournal(
c4a0: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  ) function for d
c4b0: 65 74 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65  etails..#.# page
c4c0: 72 31 2d 31 33 2e 32 2e 2a 3a 20 53 61 6d 65 20  r1-13.2.*: Same 
c4d0: 74 65 73 74 20 61 73 20 74 68 65 20 70 72 65 76  test as the prev
c4e0: 69 6f 75 73 2e 20 54 68 69 73 20 74 69 6d 65 2c  ious. This time,
c4f0: 20 74 68 72 6f 77 20 61 6e 20 69 6e 64 65 78 20   throw an index 
c500: 69 6e 74 6f 0a 23 20 20 20 20 20 20 20 20 20 20  into.#          
c510: 20 20 20 20 20 20 74 68 65 20 6d 69 78 20 74 6f        the mix to
c520: 20 6d 61 6b 65 20 74 68 65 20 69 6e 74 65 67 72   make the integr
c530: 69 74 79 2d 63 68 65 63 6b 20 6d 6f 72 65 20 6c  ity-check more l
c540: 69 6b 65 6c 79 20 74 6f 20 63 61 74 63 68 0a 23  ikely to catch.#
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 65 72 72 6f 72 73 2e 0a 23 0a 74 65 73 74 76 66  errors..#.testvf
c570: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
c580: 74 76 20 73 63 72 69 70 74 20 78 53 79 6e 63 43  tv script xSyncC
c590: 62 0a 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e  b.tv filter xSyn
c5a0: 63 0a 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b  c.proc xSyncCb {
c5b0: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
c5c0: 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 74 20  args} {.  set t 
c5d0: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
c5e0: 6e 61 6d 65 5d 0a 20 20 69 66 20 7b 24 74 20 3d  name].  if {$t =
c5f0: 3d 20 22 74 65 73 74 2e 64 62 22 7d 20 66 61 75  = "test.db"} fau
c600: 6c 74 73 69 6d 5f 73 61 76 65 0a 20 20 72 65 74  ltsim_save.  ret
c610: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a  urn SQLITE_OK.}.
c620: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
c630: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75  and_reopen.db fu
c640: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
c650: 72 69 6e 67 0a 0a 23 20 54 68 65 20 55 50 44 41  ring..# The UPDA
c660: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 74 20  TE statement at 
c670: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
c680: 74 65 73 74 20 63 61 73 65 20 63 72 65 61 74 65  test case create
c690: 73 20 61 20 72 65 61 6c 6c 79 20 62 69 67 0a 23  s a really big.#
c6a0: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
c6b0: 74 68 65 20 63 61 63 68 65 2d 73 69 7a 65 20 69  the cache-size i
c6c0: 73 20 6f 6e 6c 79 20 31 30 20 70 61 67 65 73 2c  s only 10 pages,
c6d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
c6e0: 74 61 69 6e 73 20 0a 23 20 66 72 65 71 75 65 6e  tains .# frequen
c6f0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
c700: 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  s..#.do_execsql_
c710: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31  test pager1-13.1
c720: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61  .1 {.  PRAGMA pa
c730: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
c740: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
c750: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
c760: 0a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f  .  PRAGMA cache_
c770: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47  size = 10;.  BEG
c780: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
c790: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
c7a0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
c7b0: 20 42 4c 4f 42 29 3b 0a 20 20 20 20 49 4e 53 45   BLOB);.    INSE
c7c0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
c7d0: 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  S(NULL, a_string
c7e0: 28 34 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (400));.    INSE
c7f0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
c800: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
c810: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
c820: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a          /*   2 *
c830: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
c840: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
c850: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
c860: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
c870: 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20    /*   4 */.    
c880: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
c890: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
c8a0: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
c8b0: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
c8c0: 20 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54   8 */.    INSERT
c8d0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
c8e0: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
c8f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
c900: 20 20 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a        /*  16 */.
c910: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
c920: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
c930: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
c940: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
c950: 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e  /*  32 */.    IN
c960: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
c970: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
c980: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
c990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 36 34            /*  64
c9a0: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
c9b0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
c9c0: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
c9d0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
c9e0: 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20      /* 128 */.  
c9f0: 43 4f 4d 4d 49 54 3b 0a 20 20 55 50 44 41 54 45  COMMIT;.  UPDATE
ca00: 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74   t1 SET b = a_st
ca10: 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 70 65  ring(400);.} {pe
ca20: 72 73 69 73 74 7d 0a 0a 69 66 20 7b 24 3a 3a 74  rsist}..if {$::t
ca30: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74  cl_platform(plat
ca40: 66 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22  form)!="windows"
ca50: 7d 20 7b 0a 23 20 52 75 6e 20 74 72 61 6e 73 61  } {.# Run transa
ca60: 63 74 69 6f 6e 73 20 6f 66 20 69 6e 63 72 65 61  ctions of increa
ca70: 73 69 6e 67 20 73 69 7a 65 73 2e 20 45 76 65 6e  sing sizes. Even
ca80: 74 75 61 6c 6c 79 2c 20 6f 6e 65 20 28 6f 72 20  tually, one (or 
ca90: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 29 0a 23  more than one).#
caa0: 20 6f 66 20 74 68 65 73 65 20 77 69 6c 6c 20 77   of these will w
cab0: 72 69 74 65 20 6a 75 73 74 20 65 6e 6f 75 67 68  rite just enough
cac0: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 6f 6e   content that on
cad0: 65 20 6f 66 20 74 68 65 20 6f 6c 64 20 68 65 61  e of the old hea
cae0: 64 65 72 73 20 63 72 65 61 74 65 64 20 0a 23 20  ders created .# 
caf0: 62 79 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  by the transacti
cb00: 6f 6e 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  on in the block 
cb10: 61 62 6f 76 65 20 6c 69 65 73 20 69 6d 6d 65 64  above lies immed
cb20: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
cb30: 20 63 6f 6e 74 65 6e 74 0a 23 20 6a 6f 75 72 6e   content.# journ
cb40: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 63 75 72  alled by the cur
cb50: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
cb60: 2e 0a 23 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70  ..#.for {set nUp
cb70: 20 31 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69   1} {$nUp<64} {i
cb80: 6e 63 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f  ncr nUp} {.  do_
cb90: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
cba0: 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e  er1-13.1.2.$nUp.
cbb0: 31 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20  1 { .    UPDATE 
cbc0: 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  t1 SET b = a_str
cbd0: 69 6e 67 28 33 39 39 29 20 57 48 45 52 45 20 61  ing(399) WHERE a
cbe0: 20 3c 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a   <= $nUp.  } {}.
cbf0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
cc00: 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e  t pager1-13.1.2.
cc10: 24 6e 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20  $nUp.2 { PRAGMA 
cc20: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
cc30: 7d 20 7b 6f 6b 7d 20 0a 0a 20 20 23 20 54 72 79  } {ok} ..  # Try
cc40: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 73   to access the s
cc50: 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 66  napshot of the f
cc60: 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 23 0a  ile-system..  #.
cc70: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 73 76    sqlite3 db2 sv
cc80: 5f 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65  _test.db.  do_te
cc90: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32  st pager1-13.1.2
cca0: 2e 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78  .$nUp.3 {.    ex
ccb0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73  ecsql { SELECT s
ccc0: 75 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52  um(length(b)) FR
ccd0: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20  OM t1 } db2.  } 
cce0: 5b 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d  [expr {128*400 -
ccf0: 20 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f   ($nUp-1)}].  do
cd00: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
cd10: 31 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20  1.2.$nUp.4 {.   
cd20: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
cd30: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
cd40: 6b 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d  k } db2.  } {ok}
cd50: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d  .  db2 close.}.}
cd60: 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61  ..if {$::tcl_pla
cd70: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21  tform(platform)!
cd80: 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20  ="windows"} {.# 
cd90: 53 61 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f  Same test as abo
cda0: 76 65 2e 20 42 75 74 20 74 68 69 73 20 74 69 6d  ve. But this tim
cdb0: 65 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  e with an index 
cdc0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a  on the table..#.
cdd0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
cde0: 70 61 67 65 72 31 2d 31 33 2e 32 2e 31 20 7b 0a  pager1-13.2.1 {.
cdf0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
ce00: 31 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 55 50  1 ON t1(b);.  UP
ce10: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
ce20: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d  a_string(400);.}
ce30: 20 7b 7d 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70   {}.for {set nUp
ce40: 20 31 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69   1} {$nUp<64} {i
ce50: 6e 63 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f  ncr nUp} {.  do_
ce60: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
ce70: 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e  er1-13.2.2.$nUp.
ce80: 31 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20  1 { .    UPDATE 
ce90: 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  t1 SET b = a_str
cea0: 69 6e 67 28 33 39 39 29 20 57 48 45 52 45 20 61  ing(399) WHERE a
ceb0: 20 3c 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a   <= $nUp.  } {}.
cec0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
ced0: 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e  t pager1-13.2.2.
cee0: 24 6e 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20  $nUp.2 { PRAGMA 
cef0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
cf00: 7d 20 7b 6f 6b 7d 20 0a 20 20 73 71 6c 69 74 65  } {ok} .  sqlite
cf10: 33 20 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62  3 db2 sv_test.db
cf20: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
cf30: 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 33 20  1-13.2.2.$nUp.3 
cf40: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
cf50: 53 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74  SELECT sum(lengt
cf60: 68 28 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20  h(b)) FROM t1 } 
cf70: 64 62 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31  db2.  } [expr {1
cf80: 32 38 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31  28*400 - ($nUp-1
cf90: 29 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  )}].  do_test pa
cfa0: 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70  ger1-13.2.2.$nUp
cfb0: 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .4 {.    execsql
cfc0: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
cfd0: 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a  ity_check } db2.
cfe0: 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63    } {ok}.  db2 c
cff0: 6c 6f 73 65 0a 7d 0a 7d 0a 0a 64 62 20 63 6c 6f  lose.}.}..db clo
d000: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d  se.tv delete..#-
d010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d050: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
d060: 73 70 65 63 61 6c 20 22 50 52 41 47 4d 41 20 6a  specal "PRAGMA j
d070: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22  ournal_mode=OFF"
d080: 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 66   test cases..#.f
d090: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
d0a0: 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65  nd_reopen.do_exe
d0b0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
d0c0: 2d 31 34 2e 31 2e 31 20 7b 0a 20 20 50 52 41 47  -14.1.1 {.  PRAG
d0d0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
d0e0: 3d 20 4f 46 46 3b 0a 20 20 43 52 45 41 54 45 20  = OFF;.  CREATE 
d0f0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
d100: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
d110: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
d120: 45 53 28 31 2c 20 32 29 3b 0a 20 20 43 4f 4d 4d  ES(1, 2);.  COMM
d130: 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  IT;.  SELECT * F
d140: 52 4f 4d 20 74 31 3b 0a 7d 20 7b 6f 66 66 20 31  ROM t1;.} {off 1
d150: 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f   2}.do_catchsql_
d160: 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31  test pager1-14.1
d170: 2e 32 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  .2 {.  BEGIN;.  
d180: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d190: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
d1a0: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 7d 20 7b 30 20   ROLLBACK;.} {0 
d1b0: 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}}.do_execsql_t
d1c0: 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e  est pager1-14.1.
d1d0: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  3 {.  SELECT * F
d1e0: 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 7d 0a  ROM t1;.} {1 2}.
d1f0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
d200: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 34 20 7b   pager1-14.1.4 {
d210: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e  .  BEGIN;.    IN
d220: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77  SERT INTO t1(row
d230: 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54  id, a, b) SELECT
d240: 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20   a+3, b, b FROM 
d250: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
d260: 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c  NTO t1(rowid, a,
d270: 20 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20   b) SELECT a+3, 
d280: 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  b, b FROM t1;.} 
d290: 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74  {1 {UNIQUE const
d2a0: 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 31  raint failed: t1
d2b0: 2e 72 6f 77 69 64 7d 7d 0a 64 6f 5f 65 78 65 63  .rowid}}.do_exec
d2c0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
d2d0: 31 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49  14.1.5 {.  COMMI
d2e0: 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  T;.  SELECT * FR
d2f0: 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20 32 20  OM t1;.} {1 2 2 
d300: 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  2}..#-----------
d310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
d350: 20 54 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e   Test opening an
d360: 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61  d closing the pa
d370: 67 65 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77  ger sub-system w
d380: 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 76 61  ith different va
d390: 6c 75 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73  lues.# for the s
d3a0: 71 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46  qlite3_vfs.szOsF
d3b0: 69 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a  ile variable..#.
d3c0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
d3d0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78  and_reopen.do_ex
d3e0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
d3f0: 31 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54  1-15.0 {.  CREAT
d400: 45 20 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29  E TABLE tx(y, z)
d410: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
d420: 74 78 20 56 41 4c 55 45 53 28 27 41 79 75 74 74  tx VALUES('Ayutt
d430: 68 61 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27  haya', 'Beijing'
d440: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
d450: 20 74 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64   tx VALUES('Lond
d460: 6f 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d  on', 'Tokyo');.}
d470: 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72   {}.db close.for
d480: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35   {set i 0} {$i<5
d490: 31 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b  13} {incr i 3} {
d4a0: 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
d4b0: 65 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69  efault 1 -szosfi
d4c0: 6c 65 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20  le $i.  sqlite3 
d4d0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f  db test.db.  do_
d4e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
d4f0: 65 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20  er1-15.$i.1 {.  
d500: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
d510: 74 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61  tx;.  } {Ayuttha
d520: 79 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f  ya Beijing Londo
d530: 6e 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c  n Tokyo}.  db cl
d540: 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a  ose.  tv delete.
d550: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
d560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
d5a0: 43 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73  Check that it is
d5b0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
d5c0: 20 6f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   open a database
d5d0: 20 66 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c   file if the ful
d5e0: 6c 20 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20  l path.# to the 
d5f0: 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e  associated journ
d600: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
d610: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69  longer than sqli
d620: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
d630: 6d 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  me..#.testvfs tv
d640: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
d650: 63 72 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76  cript xOpenCb.tv
d660: 20 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72   filter xOpen.pr
d670: 6f 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68  oc xOpenCb {meth
d680: 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73  od filename args
d690: 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c 65  } {.  set ::file
d6a0: 5f 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e  _len [string len
d6b0: 67 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 7d  gth $filename].}
d6c0: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
d6d0: 2e 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  .db.db close.tv 
d6e0: 64 65 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65 74  delete..for {set
d6f0: 20 69 69 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c   ii [expr $::fil
d700: 65 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20 3c  e_len-5]} {$ii <
d710: 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c   [expr $::file_l
d720: 65 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69 69  en+20]} {incr ii
d730: 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76  } {.  testvfs tv
d740: 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 6d 78 70   -default 1 -mxp
d750: 61 74 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20 23  athname $ii..  #
d760: 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   The length of t
d770: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20  he full path to 
d780: 66 69 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a 6f  file "test.db-jo
d790: 75 72 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66 69  urnal" is ($::fi
d7a0: 6c 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20 49  le_len+8)..  # I
d7b0: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  f the configured
d7c0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
d7d0: 61 74 68 6e 61 6d 65 20 76 61 6c 75 65 20 67 72  athname value gr
d7e0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
d7f0: 75 61 6c 20 74 6f 0a 20 20 23 20 74 68 69 73 2c  ual to.  # this,
d800: 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 63   then the file c
d810: 61 6e 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f 74  an be opened. Ot
d820: 68 65 72 77 69 73 65 2c 20 69 74 20 63 61 6e 6e  herwise, it cann
d830: 6f 74 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 69  ot..  #.  if {$i
d840: 69 20 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66 69  i >= [expr $::fi
d850: 6c 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20 20  le_len+8]} {.   
d860: 20 73 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d 0a   set res {0 {}}.
d870: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73    } else {.    s
d880: 65 74 20 72 65 73 20 7b 31 20 7b 75 6e 61 62 6c  et res {1 {unabl
d890: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
d8a0: 73 65 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a 20  se file}}.  }.. 
d8b0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
d8c0: 31 36 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20 6c  16.1.$ii {.    l
d8d0: 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c  ist [catch { sql
d8e0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20  ite3 db test.db 
d8f0: 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20  } msg] $msg.  } 
d900: 24 72 65 73 0a 0a 20 20 63 61 74 63 68 20 7b 64  $res..  catch {d
d910: 62 20 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64 65  b close}.  tv de
d920: 6c 65 74 65 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  lete.}...#------
d930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d970: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 70  ---.# Test the p
d980: 61 67 65 72 73 20 72 65 73 70 6f 6e 73 65 20 74  agers response t
d990: 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  o the b-tree lay
d9a0: 65 72 20 72 65 71 75 65 73 74 69 6e 67 20 69 6c  er requesting il
d9b0: 6c 65 67 61 6c 20 70 61 67 65 20 0a 23 20 6e 75  legal page .# nu
d9c0: 6d 62 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54  mbers:.#.#   + T
d9d0: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c  he locking page,
d9e0: 0a 23 20 20 20 2b 20 50 61 67 65 20 30 2c 0a 23  .#   + Page 0,.#
d9f0: 20 20 20 2b 20 41 20 70 61 67 65 20 77 69 74 68     + A page with
da00: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67   a page number g
da10: 72 65 61 74 65 72 20 74 68 61 6e 20 28 32 5e 33  reater than (2^3
da20: 31 2d 31 29 2e 0a 23 0a 23 20 54 68 65 73 65 20  1-1)..#.# These 
da30: 74 65 73 74 73 20 77 69 6c 6c 20 6e 6f 74 20 77  tests will not w
da40: 6f 72 6b 20 69 66 20 53 51 4c 49 54 45 5f 44 49  ork if SQLITE_DI
da50: 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
da60: 41 44 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49  AD is defined. I
da70: 6e 0a 23 20 74 68 61 74 20 63 61 73 65 20 49 4f  n.# that case IO
da80: 20 65 72 72 6f 72 73 20 61 72 65 20 73 6f 6d 65   errors are some
da90: 74 69 6d 65 73 20 72 65 70 6f 72 74 65 64 20 69  times reported i
daa0: 6e 73 74 65 61 64 20 6f 66 20 53 51 4c 49 54 45  nstead of SQLITE
dab0: 5f 43 4f 52 52 55 50 54 2e 0a 23 0a 69 66 63 61  _CORRUPT..#.ifca
dac0: 70 61 62 6c 65 20 21 64 69 72 65 63 74 5f 72 65  pable !direct_re
dad0: 61 64 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67  ad {.do_test pag
dae0: 65 72 31 2d 31 38 2e 31 20 7b 0a 20 20 66 61 75  er1-18.1 {.  fau
daf0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
db00: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
db10: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
db20: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ing.  execsql { 
db30: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
db40: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
db50: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
db60: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  1(a, b);.    INS
db70: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
db80: 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ES(a_string(500)
db90: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 29  , a_string(200))
dba0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
dbb0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
dbc0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
dbd0: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
dbe0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
dbf0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
dc00: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
dc10: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
dc20: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
dc30: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
dc40: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
dc50: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
dc60: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
dc70: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
dc80: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
dc90: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
dca0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
dcb0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
dcc0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
dcd0: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
dce0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
dcf0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
dd00: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
dd10: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
dd20: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
dd30: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
dd40: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
dd50: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
dd60: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
dd70: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 32 20 7b  st pager1-18.2 {
dd80: 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20  .  set root [db 
dd90: 6f 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74  one "SELECT root
dda0: 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  page FROM sqlite
ddb0: 5f 6d 61 73 74 65 72 22 5d 0a 20 20 73 65 74 20  _master"].  set 
ddc0: 6c 6f 63 6b 69 6e 67 70 61 67 65 20 5b 65 78 70  lockingpage [exp
ddd0: 72 20 28 30 78 31 30 30 30 30 2f 31 30 32 34 29  r (0x10000/1024)
dde0: 20 2b 20 31 5d 0a 20 20 73 71 6c 69 74 65 33 5f   + 1].  sqlite3_
ddf0: 64 62 5f 63 6f 6e 66 69 67 20 64 62 20 44 45 46  db_config db DEF
de00: 45 4e 53 49 56 45 20 30 0a 20 20 65 78 65 63 73  ENSIVE 0.  execs
de10: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
de20: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
de30: 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20  = 1;.    UPDATE 
de40: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45  sqlite_master SE
de50: 54 20 72 6f 6f 74 70 61 67 65 20 3d 20 24 6c 6f  T rootpage = $lo
de60: 63 6b 69 6e 67 70 61 67 65 3b 0a 20 20 7d 0a 20  ckingpage;.  }. 
de70: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
de80: 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20  t.db.  catchsql 
de90: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
dea0: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
deb0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64  } {1 {database d
dec0: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
ded0: 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f  formed}}.db2 clo
dee0: 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  se.do_test pager
def0: 31 2d 31 38 2e 33 2e 31 20 7b 0a 20 20 65 78 65  1-18.3.1 {.  exe
df00: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
df10: 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20  E TABLE t2(x);. 
df20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
df30: 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  2 VALUES(a_strin
df40: 67 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20  g(5000));.  }.  
df50: 73 65 74 20 70 67 6e 6f 20 5b 65 78 70 72 20 28  set pgno [expr (
df60: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
df70: 64 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20  db] / 1024)-2]. 
df80: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
df90: 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e  t.db [expr ($pgn
dfa0: 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30 30 30 30  o-1)*1024] 00000
dfb0: 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62  000.  sqlite3 db
dfc0: 32 20 74 65 73 74 2e 64 62 0a 20 20 23 20 65 76  2 test.db.  # ev
dfd0: 65 6e 20 74 68 6f 75 67 68 20 78 20 69 73 20 6d  en though x is m
dfe0: 61 6c 66 6f 72 6d 65 64 2c 20 62 65 63 61 75 73  alformed, becaus
dff0: 65 20 74 79 70 65 6f 66 28 29 20 64 6f 65 73 0a  e typeof() does.
e000: 20 20 23 20 6e 6f 74 20 6c 6f 61 64 20 74 68 65    # not load the
e010: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 78 2c 20 74   content of x, t
e020: 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20  he error is not 
e030: 6e 6f 74 69 63 65 64 2e 0a 20 20 63 61 74 63 68  noticed..  catch
e040: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 74 79 70  sql { SELECT typ
e050: 65 6f 66 28 78 29 20 46 52 4f 4d 20 74 32 20 7d  eof(x) FROM t2 }
e060: 20 64 62 32 0a 7d 20 7b 30 20 74 65 78 74 7d 0a   db2.} {0 text}.
e070: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
e080: 38 2e 33 2e 32 20 7b 0a 20 20 23 20 69 6e 20 74  8.3.2 {.  # in t
e090: 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 76 61  his case, the va
e0a0: 6c 75 65 20 6f 66 20 78 20 69 73 20 6c 6f 61 64  lue of x is load
e0b0: 65 64 20 61 6e 64 20 73 6f 20 74 68 65 20 65 72  ed and so the er
e0c0: 72 6f 72 20 69 73 0a 20 20 23 20 64 65 74 65 63  ror is.  # detec
e0d0: 74 65 64 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  ted.  catchsql {
e0e0: 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78   SELECT length(x
e0f0: 7c 7c 27 27 29 20 46 52 4f 4d 20 74 32 20 7d 20  ||'') FROM t2 } 
e100: 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  db2.} {1 {databa
e110: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
e120: 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32   malformed}}.db2
e130: 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70   close.do_test p
e140: 61 67 65 72 31 2d 31 38 2e 33 2e 33 20 7b 0a 20  ager1-18.3.3 {. 
e150: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
e160: 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20  ELETE FROM t2;. 
e170: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e180: 32 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  2 VALUES(randomb
e190: 6c 6f 62 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a  lob(5000));.  }.
e1a0: 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78 70 72    set pgno [expr
e1b0: 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73   ([file size tes
e1c0: 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d  t.db] / 1024)-2]
e1d0: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
e1e0: 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70  est.db [expr ($p
e1f0: 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30 30  gno-1)*1024] 000
e200: 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
e210: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 23 20  db2 test.db.  # 
e220: 65 76 65 6e 20 74 68 6f 75 67 68 20 78 20 69 73  even though x is
e230: 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 62 65 63 61   malformed, beca
e240: 75 73 65 20 6c 65 6e 67 74 68 28 29 20 61 6e 64  use length() and
e250: 20 74 79 70 65 6f 66 28 29 20 64 6f 0a 20 20 23   typeof() do.  #
e260: 20 6e 6f 74 20 6c 6f 61 64 20 74 68 65 20 63 6f   not load the co
e270: 6e 74 65 6e 74 20 6f 66 20 78 2c 20 74 68 65 20  ntent of x, the 
e280: 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 6e 6f 74  error is not not
e290: 69 63 65 64 2e 0a 20 20 63 61 74 63 68 73 71 6c  iced..  catchsql
e2a0: 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68   { SELECT length
e2b0: 28 78 29 2c 20 74 79 70 65 6f 66 28 78 29 20 46  (x), typeof(x) F
e2c0: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
e2d0: 30 20 7b 35 30 30 30 20 62 6c 6f 62 7d 7d 0a 64  0 {5000 blob}}.d
e2e0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38  o_test pager1-18
e2f0: 2e 33 2e 34 20 7b 0a 20 20 23 20 69 6e 20 74 68  .3.4 {.  # in th
e300: 69 73 20 63 61 73 65 2c 20 74 68 65 20 76 61 6c  is case, the val
e310: 75 65 20 6f 66 20 78 20 69 73 20 6c 6f 61 64 65  ue of x is loade
e320: 64 20 61 6e 64 20 73 6f 20 74 68 65 20 65 72 72  d and so the err
e330: 6f 72 20 69 73 0a 20 20 23 20 64 65 74 65 63 74  or is.  # detect
e340: 65 64 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  ed.  catchsql { 
e350: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 7c  SELECT length(x|
e360: 7c 27 27 29 20 46 52 4f 4d 20 74 32 20 7d 20 64  |'') FROM t2 } d
e370: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
e380: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
e390: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20  malformed}}.db2 
e3a0: 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61  close.do_test pa
e3b0: 67 65 72 31 2d 31 38 2e 34 20 7b 0a 20 20 68 65  ger1-18.4 {.  he
e3c0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
e3d0: 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31  b [expr ($pgno-1
e3e0: 29 2a 31 30 32 34 5d 20 39 30 30 30 30 30 30 30  )*1024] 90000000
e3f0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
e400: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
e410: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
e420: 68 28 78 7c 7c 27 27 29 20 46 52 4f 4d 20 74 32  h(x||'') FROM t2
e430: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74   } db2.} {1 {dat
e440: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
e450: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
e460: 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73  db2 close.do_tes
e470: 74 20 70 61 67 65 72 31 2d 31 38 2e 35 20 7b 0a  t pager1-18.5 {.
e480: 20 20 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a    sqlite3 db "".
e490: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
e4a0: 66 69 67 20 64 62 20 44 45 46 45 4e 53 49 56 45  fig db DEFENSIVE
e4b0: 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   0.  execsql {. 
e4c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e4d0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
e4e0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
e4f0: 20 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   b);.    PRAGMA 
e500: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
e510: 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20  = 1;.    UPDATE 
e520: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45  sqlite_master SE
e530: 54 20 72 6f 6f 74 70 61 67 65 3d 35 20 57 48 45  T rootpage=5 WHE
e540: 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74  RE tbl_name = 't
e550: 31 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  1';.    PRAGMA w
e560: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
e570: 20 30 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41   0;.    ALTER TA
e580: 42 4c 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f  BLE t1 RENAME TO
e590: 20 78 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68   x1;.  }.  catch
e5a0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
e5b0: 52 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31 20 7b 64  ROM x1 }.} {1 {d
e5c0: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
e5d0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
e5e0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74  }.db close..do_t
e5f0: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 36 20  est pager1-18.6 
e600: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
e610: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
e620: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
e630: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
e640: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
e650: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
e660: 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  24;.    CREATE T
e670: 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
e680: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
e690: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38  ALUES(a_string(8
e6a0: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
e6b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
e6c0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
e6d0: 20 20 7d 0a 0a 20 20 73 65 74 20 72 6f 6f 74 20    }..  set root 
e6e0: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
e6f0: 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
e700: 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20  lite_master"].  
e710: 64 62 20 63 6c 6f 73 65 0a 0a 20 20 68 65 78 69  db close..  hexi
e720: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
e730: 5b 65 78 70 72 20 28 24 72 6f 6f 74 2d 31 29 2a  [expr ($root-1)*
e740: 31 30 32 34 20 2b 20 38 5d 20 30 30 30 30 30 30  1024 + 8] 000000
e750: 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  00.  sqlite3 db 
e760: 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73  test.db.  catchs
e770: 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67  ql { SELECT leng
e780: 74 68 28 78 29 20 46 52 4f 4d 20 74 31 20 7d 0a  th(x) FROM t1 }.
e790: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64  } {1 {database d
e7a0: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
e7b0: 66 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 74  formed}}.}..do_t
e7c0: 65 73 74 20 70 61 67 65 72 31 2d 31 39 2e 31 20  est pager1-19.1 
e7d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22  {.  sqlite3 db "
e7e0: 22 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  ".  db func a_st
e7f0: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
e800: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
e810: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
e820: 20 35 31 32 3b 0a 20 20 20 20 50 52 41 47 4d 41   512;.    PRAGMA
e830: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31   auto_vacuum = 1
e840: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
e850: 4c 45 20 74 31 28 61 61 2c 20 61 62 2c 20 61 63  LE t1(aa, ab, ac
e860: 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67  , ad, ae, af, ag
e870: 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b  , ah, ai, aj, ak
e880: 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20  , al, am, an,.  
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8a0: 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64    ba, bb, bc, bd
e8b0: 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68  , be, bf, bg, bh
e8c0: 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c  , bi, bj, bk, bl
e8d0: 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20  , bm, bn,.      
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
e8f0: 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65  , cb, cc, cd, ce
e900: 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69  , cf, cg, ch, ci
e910: 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d  , cj, ck, cl, cm
e920: 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , cn,.          
e930: 20 20 20 20 20 20 20 20 20 20 64 61 2c 20 64 62            da, db
e940: 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66  , dc, dd, de, df
e950: 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a  , dg, dh, di, dj
e960: 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e  , dk, dl, dm, dn
e970: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e980: 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63        ea, eb, ec
e990: 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67  , ed, ee, ef, eg
e9a0: 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b  , eh, ei, ej, ek
e9b0: 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20  , el, em, en,.  
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64    fa, fb, fc, fd
e9e0: 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68  , fe, ff, fg, fh
e9f0: 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c  , fi, fj, fk, fl
ea00: 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20  , fm, fn,.      
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 61                ga
ea20: 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65  , gb, gc, gd, ge
ea30: 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69  , gf, gg, gh, gi
ea40: 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d  , gj, gk, gl, gm
ea50: 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , gn,.          
ea60: 20 20 20 20 20 20 20 20 20 20 68 61 2c 20 68 62            ha, hb
ea70: 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66  , hc, hd, he, hf
ea80: 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a  , hg, hh, hi, hj
ea90: 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e  , hk, hl, hm, hn
eaa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
eab0: 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63        ia, ib, ic
eac0: 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67  , id, ie, if, ig
ead0: 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b  , ih, ii, ij, ik
eae0: 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20  , il, im, ix,.  
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb00: 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64    ja, jb, jc, jd
eb10: 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68  , je, jf, jg, jh
eb20: 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c  , ji, jj, jk, jl
eb30: 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20  , jm, jn,.      
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 61                ka
eb50: 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65  , kb, kc, kd, ke
eb60: 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69  , kf, kg, kh, ki
eb70: 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d  , kj, kk, kl, km
eb80: 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , kn,.          
eb90: 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62            la, lb
eba0: 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66  , lc, ld, le, lf
ebb0: 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a  , lg, lh, li, lj
ebc0: 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e  , lk, ll, lm, ln
ebd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ebe0: 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63        ma, mb, mc
ebf0: 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67  , md, me, mf, mg
ec00: 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b  , mh, mi, mj, mk
ec10: 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20  , ml, mm, mn.   
ec20: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
ec30: 41 42 4c 45 20 74 32 28 61 61 2c 20 61 62 2c 20  ABLE t2(aa, ab, 
ec40: 61 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20  ac, ad, ae, af, 
ec50: 61 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20  ag, ah, ai, aj, 
ec60: 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a  ak, al, am, an,.
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20      ba, bb, bc, 
ec90: 62 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20  bd, be, bf, bg, 
eca0: 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20  bh, bi, bj, bk, 
ecb0: 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20  bl, bm, bn,.    
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 63 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20  ca, cb, cc, cd, 
ece0: 63 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20  ce, cf, cg, ch, 
ecf0: 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20  ci, cj, ck, cl, 
ed00: 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20  cm, cn,.        
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 2c 20              da, 
ed20: 64 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20  db, dc, dd, de, 
ed30: 64 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20  df, dg, dh, di, 
ed40: 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20  dj, dk, dl, dm, 
ed50: 64 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dn,.            
ed60: 20 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20          ea, eb, 
ed70: 65 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20  ec, ed, ee, ef, 
ed80: 65 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20  eg, eh, ei, ej, 
ed90: 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a  ek, el, em, en,.
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20      fa, fb, fc, 
edc0: 66 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20  fd, fe, ff, fg, 
edd0: 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20  fh, fi, fj, fk, 
ede0: 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20  fl, fm, fn,.    
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee00: 67 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20  ga, gb, gc, gd, 
ee10: 67 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20  ge, gf, gg, gh, 
ee20: 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20  gi, gj, gk, gl, 
ee30: 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20  gm, gn,.        
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 68 61 2c 20              ha, 
ee50: 68 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20  hb, hc, hd, he, 
ee60: 68 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20  hf, hg, hh, hi, 
ee70: 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20  hj, hk, hl, hm, 
ee80: 68 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  hn,.            
ee90: 20 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20          ia, ib, 
eea0: 69 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20  ic, id, ie, if, 
eeb0: 69 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20  ig, ih, ii, ij, 
eec0: 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a  ik, il, im, ix,.
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20      ja, jb, jc, 
eef0: 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20  jd, je, jf, jg, 
ef00: 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20  jh, ji, jj, jk, 
ef10: 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20  jl, jm, jn,.    
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20  ka, kb, kc, kd, 
ef40: 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20  ke, kf, kg, kh, 
ef50: 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20  ki, kj, kk, kl, 
ef60: 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20  km, kn,.        
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20              la, 
ef80: 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20  lb, lc, ld, le, 
ef90: 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20  lf, lg, lh, li, 
efa0: 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20  lj, lk, ll, lm, 
efb0: 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ln,.            
efc0: 20 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20          ma, mb, 
efd0: 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20  mc, md, me, mf, 
efe0: 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20  mg, mh, mi, mj, 
eff0: 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20  mk, ml, mm, mn. 
f000: 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54     );.    INSERT
f010: 20 49 4e 54 4f 20 74 31 28 61 61 29 20 56 41 4c   INTO t1(aa) VAL
f020: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30  UES( a_string(10
f030: 30 30 30 30 29 20 29 3b 0a 20 20 20 20 49 4e 53  0000) );.    INS
f040: 45 52 54 20 49 4e 54 4f 20 74 32 28 61 61 29 20  ERT INTO t2(aa) 
f050: 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67  VALUES( a_string
f060: 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20  (100000) );.    
f070: 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d  VACUUM;.  }.} {}
f080: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
f090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
f0d0: 65 73 74 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  est a couple of 
f0e0: 73 70 65 63 69 61 6c 20 63 61 73 65 73 20 74 68  special cases th
f0f0: 61 74 20 63 6f 6d 65 20 75 70 20 77 68 69 6c 65  at come up while
f100: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 0a 23 20 74   committing .# t
f110: 72 61 6e 73 61 63 74 69 6f 6e 73 3a 0a 23 0a 23  ransactions:.#.#
f120: 20 20 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 2a     pager1-20.1.*
f130: 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 20  : Committing an 
f140: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
f150: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  se transaction w
f160: 68 65 6e 20 74 68 65 20 0a 23 20 20 20 20 20 20  hen the .#      
f170: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
f180: 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65 65  base has not bee
f190: 6e 20 6d 6f 64 69 66 69 65 64 20 61 74 20 61 6c  n modified at al
f1a0: 6c 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  l..#.#   pager1-
f1b0: 32 30 2e 32 2e 2a 3a 20 41 73 20 61 62 6f 76 65  20.2.*: As above
f1c0: 2c 20 62 75 74 20 77 69 74 68 20 61 20 6e 6f 72  , but with a nor
f1d0: 6d 61 6c 20 64 62 20 69 6e 20 65 78 63 6c 75 73  mal db in exclus
f1e0: 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
f1f0: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
f200: 30 2e 33 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e  0.3.*: Committin
f210: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
f220: 69 6e 20 57 41 4c 20 6d 6f 64 65 20 77 68 65 72  in WAL mode wher
f230: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  e the database h
f240: 61 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  as.#            
f250: 20 20 20 20 20 20 62 65 65 6e 20 6d 6f 64 69 66        been modif
f260: 69 65 64 2c 20 62 75 74 20 61 6c 6c 20 64 69 72  ied, but all dir
f270: 74 79 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ty pages have be
f280: 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 0a 23  en flushed to .#
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2a0: 20 20 64 69 73 6b 20 62 65 66 6f 72 65 20 74 68    disk before th
f2b0: 65 20 63 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74  e commit..#.do_t
f2c0: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e  est pager1-20.1.
f2d0: 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20  1 {.  catch {db 
f2e0: 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65 33  close}.  sqlite3
f2f0: 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65   db :memory:.  e
f300: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
f310: 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77  ATE TABLE one(tw
f320: 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49  o, three);.    I
f330: 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56  NSERT INTO one V
f340: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
f350: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
f360: 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 32 20  t pager1-20.1.2 
f370: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
f380: 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56    BEGIN EXCLUSIV
f390: 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  E;.    COMMIT;. 
f3a0: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
f3b0: 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 31 20 7b   pager1-20.2.1 {
f3c0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
f3d0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
f3e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
f3f0: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
f400: 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20  e = exclusive;. 
f410: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
f420: 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74  l_mode = persist
f430: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
f440: 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65  LE one(two, thre
f450: 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  e);.    INSERT I
f460: 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27  NTO one VALUES('
f470: 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20  a', 'b');.  }.} 
f480: 7b 65 78 63 6c 75 73 69 76 65 20 70 65 72 73 69  {exclusive persi
f490: 73 74 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  st}.do_test page
f4a0: 72 31 2d 32 30 2e 32 2e 32 20 7b 0a 20 20 65 78  r1-20.2.2 {.  ex
f4b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
f4c0: 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  N EXCLUSIVE;.   
f4d0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
f4e0: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c  }..ifcapable wal
f4f0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
f500: 65 72 31 2d 32 30 2e 33 2e 31 20 7b 0a 20 20 20  er1-20.3.1 {.   
f510: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
f520: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
f530: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
f540: 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78   a_string.    ex
f550: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
f560: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
f570: 3d 20 31 30 3b 0a 20 20 20 20 20 20 50 52 41 47  = 10;.      PRAG
f580: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f590: 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 42 45 47  = wal;.      BEG
f5a0: 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  IN;.        CREA
f5b0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
f5c0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
f5d0: 41 42 4c 45 20 74 32 28 79 29 3b 0a 20 20 20 20  ABLE t2(y);.    
f5e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f5f0: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
f600: 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20 20  ng(800));.      
f610: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
f620: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
f630: 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (800) FROM t1;  
f640: 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f         /*   2 */
f650: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
f660: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
f670: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
f680: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  M t1;         /*
f690: 20 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20     4 */.        
f6a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
f6b0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38  ELECT a_string(8
f6c0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
f6d0: 20 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20       /*   8 */. 
f6e0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
f6f0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
f700: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
f710: 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20  t1;         /*  
f720: 31 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e  16 */.        IN
f730: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
f740: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
f750: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
f760: 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20     /*  32 */.   
f770: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
f780: 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f  .  } {wal}.  do_
f790: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33  test pager1-20.3
f7a0: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
f7b0: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
f7c0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
f7d0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 78 78 78  O t2 VALUES('xxx
f7e0: 78 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  x');.    }.    r
f7f0: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
f800: 33 32 20 74 31 0a 20 20 20 20 65 78 65 63 73 71  32 t1.    execsq
f810: 6c 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a  l COMMIT.  } {}.
f820: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
f830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
f870: 54 65 73 74 20 74 68 61 74 20 61 20 57 41 4c 20  Test that a WAL 
f880: 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74  database may not
f890: 20 62 65 20 6f 70 65 6e 65 64 20 69 66 3a 0a 23   be opened if:.#
f8a0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e 31  .#   pager1-21.1
f8b0: 2e 2a 3a 20 54 68 65 20 56 46 53 20 68 61 73 20  .*: The VFS has 
f8c0: 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c 65 73 73  an iVersion less
f8d0: 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23 20 20 20   than 2, or.#   
f8e0: 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a 3a 20 54  pager1-21.2.*: T
f8f0: 68 65 20 56 46 53 20 64 6f 65 73 20 6e 6f 74 20  he VFS does not 
f900: 70 72 6f 76 69 64 65 20 78 53 68 6d 58 58 58 28  provide xShmXXX(
f910: 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a 69 66 63  ) methods..#.ifc
f920: 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64  apable wal {.  d
f930: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 31  o_test pager1-21
f940: 2e 30 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69  .0 {.    faultsi
f950: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
f960: 70 65 6e 0a 20 20 20 20 65 78 65 63 73 71 6c 20  pen.    execsql 
f970: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  {.      PRAGMA j
f980: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
f990: 4c 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  L;.      CREATE 
f9a0: 54 41 42 4c 45 20 6b 6f 28 63 20 44 45 46 41 55  TABLE ko(c DEFAU
f9b0: 4c 54 20 27 61 62 63 27 2c 20 62 20 44 45 46 41  LT 'abc', b DEFA
f9c0: 55 4c 54 20 27 64 65 66 27 29 3b 0a 20 20 20 20  ULT 'def');.    
f9d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f    INSERT INTO ko
f9e0: 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b   DEFAULT VALUES;
f9f0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d  .    }.  } {wal}
fa00: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
fa10: 31 2d 32 31 2e 31 20 7b 0a 20 20 20 20 74 65 73  1-21.1 {.    tes
fa20: 74 76 66 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31  tvfs tv -noshm 1
fa30: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
fa40: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76   test.db -vfs tv
fa50: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
fa60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f  SELECT * FROM ko
fa70: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 75   } db2.  } {1 {u
fa80: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
fa90: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20  tabase file}}.  
faa0: 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20 64  db2 close.  tv d
fab0: 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73 74 20  elete.  do_test 
fac0: 70 61 67 65 72 31 2d 32 31 2e 32 20 7b 0a 20 20  pager1-21.2 {.  
fad0: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 69 76    testvfs tv -iv
fae0: 65 72 73 69 6f 6e 20 31 0a 20 20 20 20 73 71 6c  ersion 1.    sql
faf0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
fb00: 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61 74   -vfs tv.    cat
fb10: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
fb20: 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 20   FROM ko } db2. 
fb30: 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f   } {1 {unable to
fb40: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
fb50: 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f 73  ile}}.  db2 clos
fb60: 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a  e.  tv delete.}.
fb70: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
fb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
fbc0: 73 74 20 74 68 61 74 20 61 20 22 50 52 41 47 4d  st that a "PRAGM
fbd0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
fbe0: 22 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  ":.#.#   pager1-
fbf0: 32 32 2e 31 2e 2a 3a 20 69 73 20 61 20 6e 6f 2d  22.1.*: is a no-
fc00: 6f 70 20 6f 6e 20 61 20 6e 6f 6e 2d 57 41 4c 20  op on a non-WAL 
fc10: 64 62 2c 20 61 6e 64 0a 23 20 20 20 70 61 67 65  db, and.#   page
fc20: 72 31 2d 32 32 2e 32 2e 2a 3a 20 64 6f 65 73 20  r1-22.2.*: does 
fc30: 6e 6f 74 20 63 61 75 73 65 20 78 53 79 6e 63 20  not cause xSync 
fc40: 63 61 6c 6c 73 20 77 69 74 68 20 61 20 73 79 6e  calls with a syn
fc50: 63 68 72 6f 6e 6f 75 73 3d 6f 66 66 20 64 62 2e  chronous=off db.
fc60: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61 6c  .#.ifcapable wal
fc70: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
fc80: 65 72 31 2d 32 32 2e 31 2e 31 20 7b 0a 20 20 20  er1-22.1.1 {.   
fc90: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
fca0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
fcb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
fcc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28  CREATE TABLE ko(
fcd0: 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c  c DEFAULT 'abc',
fce0: 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66 27   b DEFAULT 'def'
fcf0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
fd00: 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20  INTO ko DEFAULT 
fd10: 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a 20 20  VALUES;.    }.  
fd20: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
fd30: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
fd40: 74 20 7d 0a 20 20 7d 20 7b 30 20 2d 31 20 2d 31  t }.  } {0 -1 -1
fd50: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
fd60: 72 31 2d 32 32 2e 32 2e 31 20 7b 0a 20 20 20 20  r1-22.2.1 {.    
fd70: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
fd80: 75 6c 74 20 31 0a 20 20 20 20 74 76 20 66 69 6c  ult 1.    tv fil
fd90: 74 65 72 20 78 53 79 6e 63 0a 20 20 20 20 74 76  ter xSync.    tv
fda0: 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a   script xSyncCb.
fdb0: 20 20 20 20 70 72 6f 63 20 78 53 79 6e 63 43 62      proc xSyncCb
fdc0: 20 7b 61 72 67 73 7d 20 7b 69 6e 63 72 20 3a 3a   {args} {incr ::
fdd0: 73 79 6e 63 63 6f 75 6e 74 7d 0a 20 20 20 20 73  synccount}.    s
fde0: 65 74 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 20 30  et ::synccount 0
fdf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
fe00: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63  test.db.    exec
fe10: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
fe20: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
fe30: 20 6f 66 66 3b 0a 20 20 20 20 20 20 50 52 41 47   off;.      PRAG
fe40: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
fe50: 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 49 4e 53  = WAL;.      INS
fe60: 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41  ERT INTO ko DEFA
fe70: 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20  ULT VALUES;.    
fe80: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
fe90: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
fea0: 70 6f 69 6e 74 20 7d 0a 20 20 20 20 73 65 74 20  point }.    set 
feb0: 73 79 6e 63 63 6f 75 6e 74 0a 20 20 7d 20 7b 30  synccount.  } {0
fec0: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  }.  db close.  t
fed0: 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d  v delete.}..#---
fee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff20: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66  ------.# Tests f
ff30: 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a 6f 75 72  or changing jour
ff40: 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20  nal mode..#.#   
ff50: 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a 3a 20 54  pager1-23.1.*: T
ff60: 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 63 68  est that when ch
ff70: 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50 45 52 53  anging from PERS
ff80: 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 6d 6f  IST to DELETE mo
ff90: 64 65 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20  de,.#           
ffa0: 20 20 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e         the journ
ffb0: 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  al file is delet
ffc0: 65 64 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  ed..#.#   pager1
ffd0: 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65  -23.2.*: Same te
ffe0: 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74  st as above, but
fff0: 20 77 68 69 6c 65 20 61 20 73 68 61 72 65 64 20   while a shared 
10000 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20  lock is held.#  
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
10030 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65  file..#.#   page
10040 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d 65 20  r1-23.3.*: Same 
10050 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62  test as above, b
10060 75 74 20 77 68 69 6c 65 20 61 20 72 65 73 65 72  ut while a reser
10070 76 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ved lock is held
10080 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
10090 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
100a0 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20  ase file..#.#   
100b0 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a 3a 20 41  pager1-23.4.*: A
100c0 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20 77 68 69  nd, for fun, whi
100d0 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  le holding an ex
100e0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 23 0a  clusive lock..#.
100f0 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  #   pager1-23.5.
10100 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 76 61  *: Try to set va
10110 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20  rious different 
10120 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 77 69  journal modes wi
10130 74 68 20 61 6e 0a 23 20 20 20 20 20 20 20 20 20  th an.#         
10140 20 20 20 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f           in-memo
10150 72 79 20 64 61 74 61 62 61 73 65 20 28 6f 6e 6c  ry database (onl
10160 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20 4f 46 46  y MEMORY and OFF
10170 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a 23   should work)..#
10180 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 36  .#   pager1-23.6
10190 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 6c  .*: Try to set l
101a0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
101b0 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  al on an in-memo
101c0 72 79 20 64 61 74 61 62 61 73 65 0a 23 20 20 20  ry database.#   
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
101e0 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 2d 20 69  doesn't work - i
101f0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
10200 65 73 20 61 6c 77 61 79 73 20 75 73 65 0a 23 20  es always use.# 
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
10230 63 6c 75 73 69 76 65 29 2e 0a 23 0a 64 6f 5f 74  clusive)..#.do_t
10240 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  est pager1-23.1.
10250 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
10260 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
10270 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10280 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
10290 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
102a0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
102b0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20   t1(a, b);.  }. 
102c0 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
102d0 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
102e0 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
102f0 31 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65  1-23.1.2 {.  exe
10300 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
10310 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
10320 45 54 45 20 7d 0a 20 20 66 69 6c 65 20 65 78 69  ETE }.  file exi
10330 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
10340 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65  nal.} {0}..do_te
10350 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 31  st pager1-23.2.1
10360 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
10370 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
10380 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
10390 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
103a0 4f 20 74 31 20 56 41 4c 55 45 53 28 27 43 61 6e  O t1 VALUES('Can
103b0 62 65 72 72 61 27 2c 20 27 41 43 54 27 29 3b 0a  berra', 'ACT');.
103c0 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
103d0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
103e0 20 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c   } {.    db eval
103f0 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
10400 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
10410 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  }.  }.  execsql 
10420 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
10430 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
10440 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
10450 31 2d 32 33 2e 32 2e 32 20 7b 0a 20 20 66 69 6c  1-23.2.2 {.  fil
10460 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
10470 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a  -journal.} {0}..
10480 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10490 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.3.1 {.  execsq
104a0 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
104b0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
104c0 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52  RSIST;.    INSER
104d0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
104e0 28 27 44 61 72 77 69 6e 27 2c 20 27 4e 54 27 29  ('Darwin', 'NT')
104f0 3b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45  ;.    BEGIN IMME
10500 44 49 41 54 45 3b 0a 20 20 7d 0a 20 20 64 62 20  DIATE;.  }.  db 
10510 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
10520 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
10530 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
10540 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
10550 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
10560 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
10570 31 2d 32 33 2e 33 2e 32 20 7b 0a 20 20 66 69 6c  1-23.3.2 {.  fil
10580 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
10590 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
105a0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
105b0 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.3 {.  execsql
105c0 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
105d0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
105e0 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
105f0 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
10600 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
10610 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  IST;.    INSERT 
10620 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
10630 41 64 65 6c 61 69 64 65 27 2c 20 27 53 41 27 29  Adelaide', 'SA')
10640 3b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c  ;.    BEGIN EXCL
10650 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 64 62 20  USIVE;.  }.  db 
10660 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
10670 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
10680 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
10690 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
106a0 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
106b0 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
106c0 31 2d 32 33 2e 34 2e 32 20 7b 0a 20 20 66 69 6c  1-23.4.2 {.  fil
106d0 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
106e0 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
106f0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
10700 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.3 {.  execsql
10710 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
10720 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
10730 35 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  5.1 {.  faultsim
10740 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
10750 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  en.  sqlite3 db 
10760 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66 6f  :memory:.} {}.fo
10770 72 65 61 63 68 20 7b 74 6e 20 6d 6f 64 65 20 70  reach {tn mode p
10780 6f 73 73 69 62 6c 65 7d 20 7b 0a 20 20 32 20 20  ossible} {.  2  
10790 6f 66 66 20 20 20 20 20 20 31 0a 20 20 33 20 20  off      1.  3  
107a0 6d 65 6d 6f 72 79 20 20 20 31 0a 20 20 34 20 20  memory   1.  4  
107b0 70 65 72 73 69 73 74 20 20 30 0a 20 20 35 20 20  persist  0.  5  
107c0 64 65 6c 65 74 65 20 20 20 30 0a 20 20 36 20 20  delete   0.  6  
107d0 77 61 6c 20 20 20 20 20 20 30 0a 20 20 37 20 20  wal      0.  7  
107e0 74 72 75 6e 63 61 74 65 20 30 0a 7d 20 7b 0a 20  truncate 0.} {. 
107f0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10800 32 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  23.5.$tn.1 {.   
10810 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
10820 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
10830 6f 66 66 22 0a 20 20 20 20 65 78 65 63 73 71 6c  off".    execsql
10840 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
10850 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20  _mode = $mode". 
10860 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65   } [if $possible
10870 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c   {list $mode} {l
10880 69 73 74 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f 74  ist off}].  do_t
10890 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  est pager1-23.5.
108a0 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  $tn.2 {.    exec
108b0 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  sql "PRAGMA jour
108c0 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72  nal_mode = memor
108d0 79 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  y".    execsql "
108e0 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
108f0 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d  ode = $mode".  }
10900 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b   [if $possible {
10910 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73  list $mode} {lis
10920 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f  t memory}].}.do_
10930 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
10940 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
10950 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
10960 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d 20  ode = normal}.} 
10970 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74  {exclusive}.do_t
10980 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  est pager1-23.6.
10990 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  2 {.  execsql {P
109a0 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
109b0 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 7d 0a  de = exclusive}.
109c0 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f  } {exclusive}.do
109d0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
109e0 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.3 {.  execsql 
109f0 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  {PRAGMA locking_
10a00 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  mode}.} {exclusi
10a10 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ve}.do_test page
10a20 72 31 2d 32 33 2e 36 2e 34 20 7b 0a 20 20 65 78  r1-23.6.4 {.  ex
10a30 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6d 61  ecsql {PRAGMA ma
10a40 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d  in.locking_mode}
10a50 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 0a  .} {exclusive}..
10a60 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
10a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
10ab0 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
10ac0 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
10ad0 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
10ae0 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
10af0 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
10b00 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
10b10 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
10b20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41  = 10;.    PRAGMA
10b30 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46   auto_vacuum = F
10b40 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ULL;.    CREATE 
10b50 54 41 42 4c 45 20 78 31 28 78 2c 20 79 2c 20 7a  TABLE x1(x, y, z
10b60 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c  , PRIMARY KEY(y,
10b70 20 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   z));.    CREATE
10b80 20 54 41 42 4c 45 20 78 32 28 78 2c 20 79 2c 20   TABLE x2(x, y, 
10b90 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79  z, PRIMARY KEY(y
10ba0 2c 20 7a 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  , z));.    INSER
10bb0 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53  T INTO x2 VALUES
10bc0 28 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20  (a_string(400), 
10bd0 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
10be0 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20  _string(600));. 
10bf0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
10c00 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
10c10 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(600), a_string
10c20 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
10c30 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  500) FROM x2;.  
10c40 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
10c50 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10c60 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
10c70 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34  600), a_string(4
10c80 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
10c90 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
10ca0 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10cb0 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35  400), a_string(5
10cc0 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
10cd0 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
10ce0 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
10cf0 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36  ELECT a_string(6
10d00 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  00), a_string(40
10d10 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
10d20 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
10d30 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
10d40 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
10d50 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
10d60 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ), a_string(400)
10d70 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
10d80 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
10d90 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30  ECT a_string(400
10da0 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ), a_string(500)
10db0 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10dc0 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
10dd0 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
10de0 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
10df0 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
10e00 61 67 65 72 31 2d 32 34 2e 31 2e 32 20 7b 0a 20  ager1-24.1.2 {. 
10e10 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
10e20 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
10e30 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45  TE FROM x1 WHERE
10e40 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 7d 0a 20   rowid<32;.  }. 
10e50 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63   recursive_selec
10e60 74 20 36 34 20 78 32 0a 7d 20 7b 7d 0a 64 6f 5f  t 64 x2.} {}.do_
10e70 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
10e80 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
10e90 20 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78   .      UPDATE x
10ea0 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69  1 SET z = a_stri
10eb0 6e 67 28 33 30 30 29 20 57 48 45 52 45 20 72 6f  ng(300) WHERE ro
10ec0 77 69 64 3e 34 30 3b 0a 20 20 20 20 43 4f 4d 4d  wid>40;.    COMM
10ed0 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  IT;.    PRAGMA i
10ee0 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
10ef0 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
10f00 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d  (*) FROM x1;.  }
10f10 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74  .} {ok 33}..do_t
10f20 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e  est pager1-24.1.
10f30 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
10f40 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
10f50 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x1;.    INSERT I
10f60 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20  NTO x1 SELECT * 
10f70 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 42 45 47  FROM x2;.    BEG
10f80 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
10f90 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72   FROM x1 WHERE r
10fa0 6f 77 69 64 3c 33 32 3b 0a 20 20 20 20 20 20 55  owid<32;.      U
10fb0 50 44 41 54 45 20 78 31 20 53 45 54 20 7a 20 3d  PDATE x1 SET z =
10fc0 20 61 5f 73 74 72 69 6e 67 28 32 39 39 29 20 57   a_string(299) W
10fd0 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20  HERE rowid>40;. 
10fe0 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73   }.  recursive_s
10ff0 65 6c 65 63 74 20 36 34 20 78 32 20 7b 64 62 20  elect 64 x2 {db 
11000 65 76 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20 20 65  eval COMMIT}.  e
11010 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
11020 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
11030 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  eck;.    SELECT 
11040 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31  count(*) FROM x1
11050 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a  ;.  }.} {ok 33}.
11060 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
11070 32 34 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  24.1.5 {.  execs
11080 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
11090 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53  FROM x1;.    INS
110a0 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
110b0 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
110c0 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65  }.  recursive_se
110d0 6c 65 63 74 20 36 34 20 78 32 20 7b 20 64 62 20  lect 64 x2 { db 
110e0 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42  eval {CREATE TAB
110f0 4c 45 20 78 33 28 78 2c 20 79 2c 20 7a 29 7d 20  LE x3(x, y, z)} 
11100 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
11110 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 33 20 7d  LECT * FROM x3 }
11120 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
11130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11170 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  -.#.do_test page
11180 72 31 2d 32 35 2d 31 20 7b 0a 20 20 66 61 75 6c  r1-25-1 {.  faul
11190 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
111a0 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
111b0 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
111c0 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62      SAVEPOINT ab
111d0 63 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  c;.        CREAT
111e0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
111f0 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ;.      ROLLBACK
11200 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f 4d   TO abc;.    COM
11210 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c  MIT;.  }.  db cl
11220 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  ose.} {}.do_test
11230 20 70 61 67 65 72 31 2d 32 35 2d 32 20 7b 0a 20   pager1-25-2 {. 
11240 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
11250 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
11260 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45  ecsql {.    SAVE
11270 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20  POINT abc;.     
11280 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
11290 28 61 2c 20 62 29 3b 0a 20 20 20 20 52 4f 4c 4c  (a, b);.    ROLL
112a0 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20  BACK TO abc;.   
112b0 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64   COMMIT;.  }.  d
112c0 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d  b close.} {}..#-
112d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11310 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 65 63 74 6f  --------.# Secto
11320 72 2d 73 69 7a 65 20 74 65 73 74 73 2e 0a 23 0a  r-size tests..#.
11330 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11340 36 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20  6.1 {.  testvfs 
11350 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
11360 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30  tv sectorsize 40
11370 39 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65  96.  faultsim_de
11380 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
11390 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
113a0 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
113b0 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
113c0 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35  MA page_size = 5
113d0 31 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  12;.    CREATE T
113e0 41 42 4c 45 20 74 62 6c 28 61 20 50 52 49 4d 41  ABLE tbl(a PRIMA
113f0 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45  RY KEY, b UNIQUE
11400 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
11410 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11420 74 62 6c 20 56 41 4c 55 45 53 28 61 5f 73 74 72  tbl VALUES(a_str
11430 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
11440 67 28 36 30 30 29 29 3b 0a 20 20 20 20 20 20 49  g(600));.      I
11450 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
11460 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
11470 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
11480 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
11490 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
114a0 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
114b0 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
114c0 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
114d0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
114e0 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
114f0 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
11500 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
11510 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
11520 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61  NTO tbl SELECT a
11530 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
11540 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
11550 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  tbl;.      INSER
11560 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
11570 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
11580 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
11590 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
115a0 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
115b0 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
115c0 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
115d0 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
115e0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
115f0 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
11600 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
11610 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
11620 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
11630 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  {}.do_execsql_te
11640 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b  st pager1-26.1 {
11650 0a 20 20 55 50 44 41 54 45 20 74 62 6c 20 53 45  .  UPDATE tbl SE
11660 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 35  T b = a_string(5
11670 35 30 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f  50);.} {}.db clo
11680 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d  se.tv delete..#-
11690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116d0 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65  --------.#.do_te
116e0 73 74 20 70 61 67 65 72 31 2e 32 37 2e 31 20 7b  st pager1.27.1 {
116f0 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
11700 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
11710 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
11720 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65  fcounts db.  exe
11730 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
11740 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
11750 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
11760 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67   }.  sqlite3_pag
11770 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a  er_refcounts db.
11780 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
11790 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
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 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 74  -.# Test that at
117f0 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e  tempting to open
11800 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
11810 74 69 6f 6e 20 77 69 74 68 20 0a 23 20 6c 6f 63  tion with .# loc
11820 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
11830 69 76 65 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20  ive in WAL mode 
11840 66 61 69 6c 73 20 69 66 20 74 68 65 72 65 20 61  fails if there a
11850 72 65 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 73  re other clients
11860 20 6f 6e 20 0a 23 20 74 68 65 20 73 61 6d 65 20   on .# the same 
11870 64 61 74 61 62 61 73 65 2e 0a 23 0a 63 61 74 63  database..#.catc
11880 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 69  h { db close }.i
11890 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20  fcapable wal {. 
118a0 20 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f   do_multiclient_
118b0 74 65 73 74 20 74 6e 20 7b 0a 20 20 20 20 64 6f  test tn {.    do
118c0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
118d0 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 73 71  $tn.1 {.      sq
118e0 6c 31 20 7b 20 0a 20 20 20 20 20 20 20 20 50 52  l1 { .        PR
118f0 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
11900 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 20  e = WAL;.       
11910 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
11920 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20  (a, b);.        
11930 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
11940 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
11950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b  .      }.    } {
11960 77 61 6c 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  wal}.    do_test
11970 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32   pager1-28.$tn.2
11980 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
11990 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
119a0 61 20 62 7d 0a 0a 20 20 20 20 64 6f 5f 74 65 73  a b}..    do_tes
119b0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
119c0 33 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d  3 { sql1 { PRAGM
119d0 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  A locking_mode=e
119e0 78 63 6c 75 73 69 76 65 20 7d 20 7d 20 7b 65 78  xclusive } } {ex
119f0 63 6c 75 73 69 76 65 7d 0a 20 20 20 20 64 6f 5f  clusive}.    do_
11a00 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11a10 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 63 73  tn.4 { .      cs
11a20 71 6c 31 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53  ql1 { BEGIN; INS
11a30 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
11a40 45 53 28 27 63 27 2c 20 27 64 27 29 3b 20 7d 0a  ES('c', 'd'); }.
11a50 20 20 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61      } {1 {databa
11a60 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
11a70 20 20 20 63 6f 64 65 32 20 7b 20 64 62 32 20 63     code2 { db2 c
11a80 6c 6f 73 65 20 3b 20 73 71 6c 69 74 65 33 20 64  lose ; sqlite3 d
11a90 62 32 20 74 65 73 74 2e 64 62 20 7d 0a 20 20 20  b2 test.db }.   
11aa0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11ab0 32 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20  28.$tn.4 { .    
11ac0 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20    sql1 { INSERT 
11ad0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
11ae0 63 27 2c 20 27 64 27 29 3b 20 43 4f 4d 4d 49 54  c', 'd'); COMMIT
11af0 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 7d 0a   }.    } {}.  }.
11b00 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
11b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
11b50 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65 6e 20 63  Normally, when c
11b60 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 6a 6f 75  hanging from jou
11b70 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
11b80 54 20 74 6f 20 44 45 4c 45 54 45 20 74 68 65 20  T to DELETE the 
11b90 70 61 67 65 72 0a 23 20 61 74 74 65 6d 70 74 73  pager.# attempts
11ba0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
11bb0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 48 6f 77  ournal file. How
11bc0 65 76 65 72 2c 20 69 66 20 69 74 20 63 61 6e 6e  ever, if it cann
11bd0 6f 74 20 6f 62 74 61 69 6e 20 61 0a 23 20 52 45  ot obtain a.# RE
11be0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
11bf0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11c00 2c 20 74 68 69 73 20 73 74 65 70 20 69 73 20 73  , this step is s
11c10 6b 69 70 70 65 64 2e 0a 23 0a 64 6f 5f 6d 75 6c  kipped..#.do_mul
11c20 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e  ticlient_test tn
11c30 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
11c40 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a 20  er1-28.$tn.1 {. 
11c50 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20     sql1 { .     
11c60 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
11c70 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
11c80 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
11c90 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
11ca0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11cb0 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  1 VALUES('a', 'b
11cc0 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70  ');.    }.  } {p
11cd0 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73  ersist}.  do_tes
11ce0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11cf0 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  2 { file exists 
11d00 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
11d10 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } 1.  do_test pa
11d20 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20  ger1-28.$tn.3 { 
11d30 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f  sql1 { PRAGMA jo
11d40 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
11d50 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20  ETE } } delete. 
11d60 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11d70 32 38 2e 24 74 6e 2e 34 20 7b 20 66 69 6c 65 20  28.$tn.4 { file 
11d80 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
11d90 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f  ournal } 0..  do
11da0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11db0 24 74 6e 2e 35 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.5 {.    sql1
11dc0 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
11dd0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
11de0 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 49  PERSIST;.      I
11df0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11e00 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a  LUES('c', 'd');.
11e10 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69      }.  } {persi
11e20 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  st}.  do_test pa
11e30 67 65 72 31 2d 32 38 2e 24 74 6e 2e 36 20 7b 20  ger1-28.$tn.6 { 
11e40 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
11e50 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a  .db-journal } 1.
11e60 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11e70 2d 32 38 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20  -28.$tn.7 {.    
11e80 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e  sql2 { BEGIN; IN
11e90 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11ea0 55 45 53 28 27 65 27 2c 20 27 66 27 29 3b 20 7d  UES('e', 'f'); }
11eb0 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
11ec0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11ed0 38 20 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  8  { file exists
11ee0 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
11ef0 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70   } 1.  do_test p
11f00 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 39 20 20  ager1-28.$tn.9  
11f10 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20  { sql1 { PRAGMA 
11f20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
11f30 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65  ELETE } } delete
11f40 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11f50 31 2d 32 38 2e 24 74 6e 2e 31 30 20 7b 20 66 69  1-28.$tn.10 { fi
11f60 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
11f70 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20  b-journal } 1.. 
11f80 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11f90 32 38 2e 24 74 6e 2e 31 31 20 7b 20 73 71 6c 32  28.$tn.11 { sql2
11fa0 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64   COMMIT } {}.  d
11fb0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11fc0 2e 24 74 6e 2e 31 32 20 7b 20 66 69 6c 65 20 65  .$tn.12 { file e
11fd0 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
11fe0 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f  urnal } 0..  do_
11ff0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24  test pager1-28-$
12000 74 6e 2e 31 33 20 7b 0a 20 20 20 20 63 6f 64 65  tn.13 {.    code
12010 31 20 7b 20 73 65 74 20 63 68 61 6e 6e 65 6c 20  1 { set channel 
12020 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65  [db incrblob -re
12030 61 64 6f 6e 6c 79 20 74 31 20 61 20 32 5d 20 7d  adonly t1 a 2] }
12040 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20  .    sql1 {.    
12050 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
12060 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
12070 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
12080 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 67 27  TO t1 VALUES('g'
12090 2c 20 27 68 27 29 3b 0a 20 20 20 20 7d 0a 20 20  , 'h');.    }.  
120a0 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f  } {persist}.  do
120b0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
120c0 24 74 6e 2e 31 34 20 7b 20 66 69 6c 65 20 65 78  $tn.14 { file ex
120d0 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
120e0 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65  rnal } 1.  do_te
120f0 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
12100 2e 31 35 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b  .15 {.    sql2 {
12110 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49   BEGIN; INSERT I
12120 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65  NTO t1 VALUES('e
12130 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b  ', 'f'); }.  } {
12140 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
12150 72 31 2d 32 38 2e 24 74 6e 2e 31 36 20 7b 20 73  r1-28.$tn.16 { s
12160 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  ql1 { PRAGMA jou
12170 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
12180 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20  TE } } delete.  
12190 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
121a0 38 2e 24 74 6e 2e 31 37 20 7b 20 66 69 6c 65 20  8.$tn.17 { file 
121b0 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
121c0 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f  ournal } 1..  do
121d0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
121e0 24 74 6e 2e 31 37 20 7b 20 63 73 71 6c 32 20 7b  $tn.17 { csql2 {
121f0 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 31 20 7b   COMMIT } } {1 {
12200 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
12210 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ed}}.  do_test p
12220 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 38 20  ager1-28-$tn.18 
12230 7b 20 63 6f 64 65 31 20 7b 20 72 65 61 64 20 24  { code1 { read $
12240 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 63 0a 20 20  channel } } c.  
12250 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
12260 38 2d 24 74 6e 2e 31 39 20 7b 20 63 6f 64 65 31  8-$tn.19 { code1
12270 20 7b 20 63 6c 6f 73 65 20 24 63 68 61 6e 6e 65   { close $channe
12280 6c 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  l } } {}.  do_te
12290 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
122a0 2e 32 30 20 7b 20 73 71 6c 32 20 7b 20 43 4f 4d  .20 { sql2 { COM
122b0 4d 49 54 20 7d 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f  MIT } } {}.}..do
122c0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 39 2e  _test pager1-29.
122d0 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
122e0 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
122f0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
12300 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
12310 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52  e = 1024;.    PR
12320 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
12330 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 50 52 41   = full;.    PRA
12340 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
12350 3d 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20  =exclusive;.    
12360 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
12370 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
12380 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
12390 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 66 69  (1, 2);.  }.  fi
123a0 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
123b0 7d 20 5b 65 78 70 72 20 31 30 32 34 2a 33 5d 0a  } [expr 1024*3].
123c0 69 66 20 7b 5b 6e 6f 6e 7a 65 72 6f 5f 72 65 73  if {[nonzero_res
123d0 65 72 76 65 64 5f 62 79 74 65 73 5d 7d 20 7b 0a  erved_bytes]} {.
123e0 20 20 23 20 56 41 43 55 55 4d 20 77 69 74 68 20    # VACUUM with 
123f0 73 69 7a 65 20 63 68 61 6e 67 65 73 20 69 73 20  size changes is 
12400 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 77 69 74  not possible wit
12410 68 20 74 68 65 20 63 6f 64 65 63 2e 0a 20 20 64  h the codec..  d
12420 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 39  o_test pager1-29
12430 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .2 {.    catchsq
12440 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
12450 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39   page_size = 409
12460 36 3b 0a 20 20 20 20 20 20 56 41 43 55 55 4d 3b  6;.      VACUUM;
12470 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 61  .    }.  } {1 {a
12480 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
12490 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62  a readonly datab
124a0 61 73 65 7d 7d 0a 7d 20 65 6c 73 65 20 7b 0a 20  ase}}.} else {. 
124b0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
124c0 32 39 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  29.2 {.    execs
124d0 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
124e0 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30  A page_size = 40
124f0 39 36 3b 0a 20 20 20 20 20 20 56 41 43 55 55 4d  96;.      VACUUM
12500 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65  ;.    }.    file
12510 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20   size test.db.  
12520 7d 20 5b 65 78 70 72 20 34 30 39 36 2a 33 5d 0a  } [expr 4096*3].
12530 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
12540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
12580 54 65 73 74 20 74 68 61 74 20 69 66 20 61 6e 20  Test that if an 
12590 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 66  empty database f
125a0 69 6c 65 20 28 73 69 7a 65 20 30 20 62 79 74 65  ile (size 0 byte
125b0 73 29 20 69 73 20 6f 70 65 6e 65 64 20 69 6e 20  s) is opened in 
125c0 0a 23 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63  .# exclusive-loc
125d0 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 6e 79 20 6a  king mode, any j
125e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
125f0 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
12600 66 69 6c 65 2d 73 79 73 74 65 6d 0a 23 20 77 69  file-system.# wi
12610 74 68 6f 75 74 20 62 65 69 6e 67 20 72 6f 6c 6c  thout being roll
12620 65 64 20 62 61 63 6b 2e 20 41 6e 64 20 74 68 61  ed back. And tha
12630 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
12640 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20 77 68 69  ock obtained whi
12650 6c 65 0a 23 20 64 6f 69 6e 67 20 74 68 69 73 20  le.# doing this 
12660 69 73 20 6e 6f 74 20 72 65 6c 65 61 73 65 64 2e  is not released.
12670 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
12680 31 2d 33 30 2e 31 20 7b 0a 20 20 64 62 20 63 6c  1-30.1 {.  db cl
12690 6f 73 65 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c  ose.  delete_fil
126a0 65 20 74 65 73 74 2e 64 62 0a 20 20 64 65 6c 65  e test.db.  dele
126b0 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d  te_file test.db-
126c0 6a 6f 75 72 6e 61 6c 0a 20 20 73 65 74 20 66 64  journal.  set fd
126d0 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a   [open test.db-j
126e0 6f 75 72 6e 61 6c 20 77 5d 0a 20 20 73 65 65 6b  ournal w].  seek
126f0 20 24 66 64 20 5b 65 78 70 72 20 35 31 32 2b 31   $fd [expr 512+1
12700 30 33 32 2a 32 5d 0a 20 20 70 75 74 73 20 2d 6e  032*2].  puts -n
12710 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 78 0a 20  onewline $fd x. 
12720 20 63 6c 6f 73 65 20 24 66 64 0a 0a 20 20 73 71   close $fd..  sq
12730 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
12740 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
12750 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
12760 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b 0a  mode=EXCLUSIVE;.
12770 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
12780 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  (*) FROM sqlite_
12790 6d 61 73 74 65 72 3b 0a 20 20 20 20 50 52 41 47  master;.    PRAG
127a0 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a  MA lock_status;.
127b0 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65    }.} {exclusive
127c0 20 30 20 6d 61 69 6e 20 72 65 73 65 72 76 65 64   0 main reserved
127d0 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 23   temp closed}..#
127e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12820 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
12830 20 74 68 61 74 20 69 66 20 74 68 65 20 22 70 61   that if the "pa
12840 67 65 2d 73 69 7a 65 22 20 66 69 65 6c 64 20 69  ge-size" field i
12850 6e 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  n a journal-head
12860 65 72 20 69 73 20 30 2c 20 74 68 65 20 6a 6f 75  er is 0, the jou
12870 72 6e 61 6c 0a 23 20 66 69 6c 65 20 63 61 6e 20  rnal.# file can 
12880 73 74 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20  still be rolled 
12890 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 72 65  back. This is re
128a0 71 75 69 72 65 64 20 66 6f 72 20 62 61 63 6b 77  quired for backw
128b0 61 72 64 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  ard compatibilit
128c0 79 20 2d 0a 23 20 76 65 72 73 69 6f 6e 73 20 6f  y -.# versions o
128d0 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
128e0 6f 20 33 2e 35 2e 38 20 61 6c 77 61 79 73 20 73  o 3.5.8 always s
128f0 65 74 20 74 68 69 73 20 66 69 65 6c 64 20 74 6f  et this field to
12900 20 7a 65 72 6f 2e 0a 23 0a 69 66 20 7b 24 74 63   zero..#.if {$tc
12910 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
12920 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a  orm)=="unix"} {.
12930 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  do_test pager1-3
12940 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
12950 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
12960 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
12970 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
12980 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50  size = 10;.    P
12990 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
129a0 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41  = 1024;.    CREA
129b0 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
129c0 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
129d0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
129e0 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t1 VALUES(rando
129f0 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
12a00 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
12a10 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12a20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
12a30 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
12a40 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
12a50 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
12a60 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
12a70 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12a80 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
12a90 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
12aa0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12ab0 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
12ac0 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
12ad0 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
12ae0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12af0 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
12b00 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
12b10 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
12b20 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
12b30 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
12b40 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
12b50 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
12b60 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
12b70 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12b80 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
12b90 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
12ba0 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
12bb0 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
12bc0 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
12bd0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
12be0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12bf0 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
12c00 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
12c10 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
12c20 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
12c30 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
12c40 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12c50 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
12c60 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
12c70 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
12c80 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
12c90 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
12ca0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12cb0 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
12cc0 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
12cd0 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
12ce0 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 72  ATE t1 SET y = r
12cf0 61 6e 64 6f 6d 62 6c 6f 62 28 31 34 39 39 29 3b  andomblob(1499);
12d00 0a 20 20 7d 0a 20 20 63 6f 70 79 5f 66 69 6c 65  .  }.  copy_file
12d10 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
12d20 32 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65  2.  copy_file te
12d30 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65  st.db-journal te
12d40 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 0a 20  st.db2-journal. 
12d50 20 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20   .  hexio_write 
12d60 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c  test.db2-journal
12d70 20 32 34 20 30 30 30 30 30 30 30 30 0a 20 20 73   24 00000000.  s
12d80 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
12d90 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  db2.  execsql { 
12da0 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
12db0 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b  _check } db2.} {
12dc0 6f 6b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ok}.}..#--------
12dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e10 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20  -.# Test that a 
12e20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 61  database file ca
12e30 6e 20 62 65 20 22 70 72 65 2d 68 69 6e 74 65 64  n be "pre-hinted
12e40 22 20 74 6f 20 61 20 63 65 72 74 61 69 6e 20 73  " to a certain s
12e50 69 7a 65 20 61 6e 64 20 74 68 61 74 0a 23 20 73  ize and that.# s
12e60 75 62 73 65 71 75 65 6e 74 20 73 70 69 6c 6c 69  ubsequent spilli
12e70 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ng of the pager 
12e80 63 61 63 68 65 20 64 6f 65 73 20 6e 6f 74 20 72  cache does not r
12e90 65 73 75 6c 74 20 69 6e 20 74 68 65 20 64 61 74  esult in the dat
12ea0 61 62 61 73 65 0a 23 20 66 69 6c 65 20 62 65 69  abase.# file bei
12eb0 6e 67 20 73 68 72 75 6e 6b 2e 0a 23 0a 63 61 74  ng shrunk..#.cat
12ec0 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f  ch {db close}.fo
12ed0 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
12ee0 62 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  b..do_test pager
12ef0 31 2d 33 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74  1-32.1 {.  sqlit
12f00 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
12f10 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
12f20 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c  EATE TABLE t1(x,
12f30 20 79 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c   y);.  }.  db cl
12f40 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62  ose.  sqlite3 db
12f50 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
12f60 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
12f70 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12f80 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e  t1 VALUES(1, ran
12f90 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b  domblob(10000));
12fa0 0a 20 20 7d 0a 20 20 66 69 6c 65 5f 63 6f 6e 74  .  }.  file_cont
12fb0 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65  rol_chunksize_te
12fc0 73 74 20 64 62 20 6d 61 69 6e 20 31 30 32 34 0a  st db main 1024.
12fd0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73    file_control_s
12fe0 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 64 62 20  izehint_test db 
12ff0 6d 61 69 6e 20 32 30 39 37 31 35 32 30 3b 20 23  main 20971520; #
13000 20 32 30 4d 42 0a 20 20 65 78 65 63 73 71 6c 20   20MB.  execsql 
13010 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  {.    PRAGMA cac
13020 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
13030 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
13040 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f   VALUES(1, rando
13050 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20  mblob(10000));. 
13060 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13070 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64  1 VALUES(2, rand
13080 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a  omblob(10000));.
13090 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
130a0 74 31 20 53 45 4c 45 43 54 20 78 2b 32 2c 20 72  t1 SELECT x+2, r
130b0 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29  andomblob(10000)
130c0 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e   from t1;.    IN
130d0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
130e0 45 43 54 20 78 2b 34 2c 20 72 61 6e 64 6f 6d 62  ECT x+4, randomb
130f0 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20  lob(10000) from 
13100 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
13110 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b  NTO t1 SELECT x+
13120 38 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  8, randomblob(10
13130 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20  000) from t1;.  
13140 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
13150 20 53 45 4c 45 43 54 20 78 2b 31 36 2c 20 72 61   SELECT x+16, ra
13160 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20  ndomblob(10000) 
13170 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 53 45 4c  from t1;.    SEL
13180 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
13190 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  M t1;.    COMMIT
131a0 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
131b0 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
131c0 74 2e 64 62 0a 7d 20 7b 32 30 39 37 31 35 32 30  t.db.} {20971520
131d0 7d 0a 0a 23 20 43 6c 65 61 6e 75 70 20 32 30 4d  }..# Cleanup 20M
131e0 42 20 66 69 6c 65 20 6c 65 66 74 20 62 79 20 74  B file left by t
131f0 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 73 74  he previous test
13200 2e 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65  ..forcedelete te
13210 73 74 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  st.db..#--------
13220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13260 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 66  -.# Test that if
13270 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
13280 73 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 6a  s committed in j
13290 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45 4c 45  ournal_mode=DELE
132a0 54 45 20 6d 6f 64 65 2c 0a 23 20 61 6e 64 20 74  TE mode,.# and t
132b0 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 69 6e  he call to unlin
132c0 6b 28 29 20 72 65 74 75 72 6e 73 20 61 6e 20 45  k() returns an E
132d0 4e 4f 45 4e 54 20 65 72 72 6f 72 2c 20 74 68 65  NOENT error, the
132e0 20 43 4f 4d 4d 49 54 20 64 6f 65 73 20 6e 6f 74   COMMIT does not
132f0 0a 23 20 73 75 63 63 65 65 64 2e 0a 23 0a 69 66  .# succeed..#.if
13300 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72   {$::tcl_platfor
13310 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e  m(platform)=="un
13320 69 78 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  ix"} {.  do_test
13330 20 70 61 67 65 72 31 2d 33 33 2e 31 20 7b 0a 20   pager1-33.1 {. 
13340 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
13350 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
13360 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
13370 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
13380 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13390 74 31 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 29  t1 VALUES('one')
133a0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
133b0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74  NTO t1 VALUES('t
133c0 77 6f 27 29 3b 0a 20 20 20 20 20 20 42 45 47 49  wo');.      BEGI
133d0 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  N;.        INSER
133e0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
133f0 28 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20 20  ('three');.     
13400 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13410 31 20 56 41 4c 55 45 53 28 27 66 6f 75 72 27 29  1 VALUES('four')
13420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 63  ;.    }.    forc
13430 65 64 65 6c 65 74 65 20 62 61 6b 2d 6a 6f 75 72  edelete bak-jour
13440 6e 61 6c 0a 20 20 20 20 66 69 6c 65 20 72 65 6e  nal.    file ren
13450 61 6d 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ame test.db-jour
13460 6e 61 6c 20 62 61 6b 2d 6a 6f 75 72 6e 61 6c 0a  nal bak-journal.
13470 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 43 4f  .    catchsql CO
13480 4d 4d 49 54 0a 20 20 7d 20 7b 31 20 7b 64 69 73  MMIT.  } {1 {dis
13490 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a 20  k I/O error}}.. 
134a0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
134b0 33 33 2e 32 20 7b 0a 20 20 20 20 66 69 6c 65 20  33.2 {.    file 
134c0 72 65 6e 61 6d 65 20 62 61 6b 2d 6a 6f 75 72 6e  rename bak-journ
134d0 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  al test.db-journ
134e0 61 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  al.    execsql {
134f0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
13500 31 20 7d 0a 20 20 7d 20 7b 6f 6e 65 20 74 77 6f  1 }.  } {one two
13510 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
13520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13560 23 20 54 65 73 74 20 74 68 61 74 20 61 70 70 65  # Test that appe
13570 6e 64 69 6e 67 20 70 61 67 65 73 20 74 6f 20 74  nding pages to t
13580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13590 20 74 68 65 6e 20 6d 6f 76 69 6e 67 20 74 68 6f   then moving tho
135a0 73 65 20 70 61 67 65 73 0a 23 20 74 6f 20 74 68  se pages.# to th
135b0 65 20 66 72 65 65 2d 6c 69 73 74 20 62 65 66 6f  e free-list befo
135c0 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
135d0 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
135e0 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 0a 23  does not cause.#
135f0 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 66 6f 72   an error..#.for
13600 65 61 63 68 20 7b 74 6e 20 70 72 61 67 6d 61 20  each {tn pragma 
13610 73 74 72 73 69 7a 65 7d 20 7b 0a 20 20 31 20 7b  strsize} {.  1 {
13620 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a   PRAGMA mmap_siz
13630 65 20 3d 20 30 20 7d 20 32 34 30 30 0a 20 20 32  e = 0 } 2400.  2
13640 20 7b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20   { }            
13650 20 20 20 20 20 20 20 20 20 20 20 32 34 30 30 0a             2400.
13660 20 20 33 20 7b 20 50 52 41 47 4d 41 20 6d 6d 61    3 { PRAGMA mma
13670 70 5f 73 69 7a 65 20 3d 20 30 20 7d 20 34 34 30  p_size = 0 } 440
13680 30 0a 20 20 34 20 7b 20 7d 20 20 20 20 20 20 20  0.  4 { }       
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136a0 34 34 30 30 0a 7d 20 7b 0a 20 20 72 65 73 65 74  4400.} {.  reset
136b0 5f 64 62 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  _db.  db func a_
136c0 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
136d0 20 20 64 62 20 65 76 61 6c 20 24 70 72 61 67 6d    db eval $pragm
136e0 61 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  a.  do_execsql_t
136f0 65 73 74 20 33 34 2e 24 74 6e 2e 31 20 7b 0a 20  est 34.$tn.1 {. 
13700 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
13710 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
13720 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
13730 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
13740 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
13750 20 33 34 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20   34.$tn.2 {.    
13760 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
13770 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
13780 28 32 2c 20 61 5f 73 74 72 69 6e 67 28 24 73 74  (2, a_string($st
13790 72 73 69 7a 65 29 29 3b 0a 20 20 20 20 44 45 4c  rsize));.    DEL
137a0 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
137b0 45 20 6f 69 64 3d 32 3b 0a 20 20 20 20 43 4f 4d  E oid=2;.    COM
137c0 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  MIT;.    PRAGMA 
137d0 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
137e0 0a 20 20 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 23 2d 2d  .  } {ok}.}..#--
137f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13830 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f  -------.#.reset_
13840 64 62 0a 64 6f 5f 74 65 73 74 20 33 35 20 7b 0a  db.do_test 35 {.
13850 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
13860 74 2e 64 62 0a 0a 20 20 65 78 65 63 73 71 6c 20  t.db..  execsql 
13870 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
13880 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 20  LE t1(x, y);.   
13890 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
138a0 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
138b0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
138c0 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d  ALUES(1, 2);.  }
138d0 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
138e0 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43    BEGIN;.      C
138f0 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
13900 2c 20 62 29 3b 0a 20 20 7d 0a 0a 20 20 68 65 78  , b);.  }..  hex
13910 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
13920 2d 73 68 6d 20 5b 65 78 70 72 20 31 36 2a 31 30  -shm [expr 16*10
13930 32 34 5d 20 5b 73 74 72 69 6e 67 20 72 65 70 65  24] [string repe
13940 61 74 20 30 30 35 35 20 38 31 39 32 5d 0a 20 20  at 0055 8192].  
13950 63 61 74 63 68 73 71 6c 20 52 4f 4c 4c 42 41 43  catchsql ROLLBAC
13960 4b 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 6d  K.} {0 {}}..do_m
13970 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20  ulticlient_test 
13980 74 6e 20 7b 0a 20 20 73 71 6c 31 20 7b 0a 20 20  tn {.  sql1 {.  
13990 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
139a0 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 43 52  cuum = 0;.    CR
139b0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c  EATE TABLE t1(x,
139c0 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   y);.    INSERT 
139d0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
139e0 2c 20 32 29 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f  , 2);.  }..  do_
139f0 74 65 73 74 20 33 36 2e 24 74 6e 2e 31 20 7b 20  test 36.$tn.1 { 
13a00 0a 20 20 20 20 73 71 6c 32 20 7b 20 50 52 41 47  .    sql2 { PRAG
13a10 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
13a20 74 20 3d 20 32 20 7d 0a 20 20 20 20 6c 69 73 74  t = 2 }.    list
13a30 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 32 20 7b   [catch { sql2 {
13a40 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
13a50 28 78 29 20 7d 20 7d 20 6d 73 67 5d 20 24 6d 73  (x) } } msg] $ms
13a60 67 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  g.  } {1 {databa
13a70 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
13a80 6c 6c 7d 7d 0a 0a 20 20 73 71 6c 31 20 7b 20 50  ll}}..  sql1 { P
13a90 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74  RAGMA checkpoint
13aa0 5f 66 75 6c 6c 66 73 79 6e 63 20 3d 20 31 20 7d  _fullfsync = 1 }
13ab0 0a 20 20 73 71 6c 31 20 7b 20 43 52 45 41 54 45  .  sql1 { CREATE
13ac0 20 54 41 42 4c 45 20 74 32 28 78 29 20 7d 0a 0a   TABLE t2(x) }..
13ad0 20 20 64 6f 5f 74 65 73 74 20 33 36 2e 24 74 6e    do_test 36.$tn
13ae0 2e 32 20 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b  .2 { .    sql2 {
13af0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
13b00 56 41 4c 55 45 53 28 27 78 79 7a 27 29 20 7d 0a  VALUES('xyz') }.
13b10 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20      list [catch 
13b20 7b 20 73 71 6c 32 20 7b 20 43 52 45 41 54 45 20  { sql2 { CREATE 
13b30 54 41 42 4c 45 20 74 33 28 78 29 20 7d 20 7d 20  TABLE t3(x) } } 
13b40 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 7b 31  msg] $msg.  } {1
13b50 20 7b 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   {database or di
13b60 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 7d 0a 0a  sk is full}}.}..
13b70 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
13b80 31 20 74 65 73 74 32 0a 66 6f 72 65 61 63 68 20  1 test2.foreach 
13b90 7b 74 6e 20 75 72 69 7d 20 7b 0a 20 20 31 20 20  {tn uri} {.  1  
13ba0 20 7b 66 69 6c 65 3a 3f 6d 6f 64 65 3d 6d 65 6d   {file:?mode=mem
13bb0 6f 72 79 26 63 61 63 68 65 3d 73 68 61 72 65 64  ory&cache=shared
13bc0 7d 0a 20 20 32 20 20 20 7b 66 69 6c 65 3a 6f 6e  }.  2   {file:on
13bd0 65 3f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 26 63 61  e?mode=memory&ca
13be0 63 68 65 3d 73 68 61 72 65 64 7d 0a 20 20 33 20  che=shared}.  3 
13bf0 20 20 7b 66 69 6c 65 3a 74 65 73 74 31 3f 63 61    {file:test1?ca
13c00 63 68 65 3d 73 68 61 72 65 64 7d 0a 20 20 34 20  che=shared}.  4 
13c10 20 20 7b 66 69 6c 65 3a 74 65 73 74 32 3f 61 6e    {file:test2?an
13c20 6f 74 68 65 72 3d 70 61 72 61 6d 65 74 65 72 26  other=parameter&
13c30 79 65 74 3d 61 6e 6f 74 68 65 72 6f 6e 65 7d 0a  yet=anotherone}.
13c40 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 33 37  } {.  do_test 37
13c50 2e 24 74 6e 20 7b 0a 20 20 20 20 63 61 74 63 68  .$tn {.    catch
13c60 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20   { db close }.  
13c70 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f    sqlite3_shutdo
13c80 77 6e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  wn.    sqlite3_c
13c90 6f 6e 66 69 67 5f 75 72 69 20 31 0a 20 20 20 20  onfig_uri 1.    
13ca0 73 71 6c 69 74 65 33 20 64 62 20 24 75 72 69 0a  sqlite3 db $uri.
13cb0 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20  .    db eval {. 
13cc0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
13cd0 45 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 49  E t1(x);.      I
13ce0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
13cf0 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 20 20 53  LUES(1);.      S
13d00 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
13d10 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a  .    }.  } {1}..
13d20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
13d30 74 20 33 37 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  t 37.$tn.2 {.   
13d40 20 56 41 43 55 55 4d 3b 0a 20 20 20 20 53 45 4c   VACUUM;.    SEL
13d50 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
13d60 20 7d 20 7b 31 7d 0a 0a 20 20 64 62 20 63 6c 6f   } {1}..  db clo
13d70 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75  se.  sqlite3_shu
13d80 74 64 6f 77 6e 0a 20 20 73 71 6c 69 74 65 33 5f  tdown.  sqlite3_
13d90 63 6f 6e 66 69 67 5f 75 72 69 20 30 0a 7d 0a 0a  config_uri 0.}..
13da0 64 6f 5f 74 65 73 74 20 33 38 2e 31 20 7b 0a 20  do_test 38.1 {. 
13db0 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73   catch { db clos
13dc0 65 20 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74  e }.  forcedelet
13dd0 65 20 74 65 73 74 2e 64 62 0a 20 20 73 65 74 20  e test.db.  set 
13de0 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62  fd [open test.db
13df0 20 77 5d 0a 20 20 70 75 74 73 20 24 66 64 20 22   w].  puts $fd "
13e00 68 65 6c 6c 6f 20 77 6f 72 6c 64 22 0a 20 20 63  hello world".  c
13e10 6c 6f 73 65 20 24 66 64 0a 20 20 73 71 6c 69 74  lose $fd.  sqlit
13e20 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
13e30 63 61 74 63 68 73 71 6c 20 7b 20 43 52 45 41 54  catchsql { CREAT
13e40 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 7d 0a  E TABLE t1(x) }.
13e50 7d 20 7b 31 20 7b 66 69 6c 65 20 69 73 20 6e 6f  } {1 {file is no
13e60 74 20 61 20 64 61 74 61 62 61 73 65 7d 7d 0a 64  t a database}}.d
13e70 6f 5f 74 65 73 74 20 33 38 2e 32 20 7b 0a 20 20  o_test 38.2 {.  
13e80 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
13e90 20 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65   }.  forcedelete
13ea0 20 74 65 73 74 2e 64 62 0a 7d 20 7b 7d 0a 0a 64   test.db.} {}..d
13eb0 6f 5f 74 65 73 74 20 33 39 2e 31 20 7b 0a 20 20  o_test 39.1 {.  
13ec0 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
13ed0 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
13ee0 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
13ef0 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43  acuum = 1;.    C
13f00 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
13f10 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
13f20 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 78  TO t1 VALUES('xx
13f30 78 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  x');.    INSERT 
13f40 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
13f50 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  two');.    INSER
13f60 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
13f70 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29  (randomblob(400)
13f80 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
13f90 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
13fa0 64 6f 6d 62 6c 6f 62 28 34 30 30 29 29 3b 0a 20  domblob(400));. 
13fb0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13fc0 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
13fd0 6c 6f 62 28 34 30 30 29 29 3b 0a 20 20 20 20 49  lob(400));.    I
13fe0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
13ff0 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
14000 34 30 30 29 29 3b 0a 20 20 20 20 42 45 47 49 4e  400));.    BEGIN
14010 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  ;.    UPDATE t1 
14020 53 45 54 20 78 20 3d 20 27 6f 6e 65 27 20 57 48  SET x = 'one' WH
14030 45 52 45 20 72 6f 77 69 64 3d 31 3b 0a 20 20 7d  ERE rowid=1;.  }
14040 0a 20 20 73 65 74 20 3a 3a 73 74 6d 74 20 5b 73  .  set ::stmt [s
14050 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 64  qlite3_prepare d
14060 62 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  b "SELECT * FROM
14070 20 74 31 20 4f 52 44 45 52 20 42 59 20 72 6f 77   t1 ORDER BY row
14080 69 64 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20  id" -1 dummy].  
14090 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a  sqlite3_step $::
140a0 73 74 6d 74 0a 20 20 73 71 6c 69 74 65 33 5f 63  stmt.  sqlite3_c
140b0 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 3a 3a 73 74  olumn_text $::st
140c0 6d 74 20 30 0a 7d 20 7b 6f 6e 65 7d 0a 64 6f 5f  mt 0.} {one}.do_
140d0 74 65 73 74 20 33 39 2e 32 20 7b 0a 20 20 65 78  test 39.2 {.  ex
140e0 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  ecsql { CREATE T
140f0 41 42 4c 45 20 74 32 28 78 29 20 7d 0a 20 20 73  ABLE t2(x) }.  s
14100 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 73  qlite3_step $::s
14110 74 6d 74 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  tmt.  sqlite3_co
14120 6c 75 6d 6e 5f 74 65 78 74 20 24 3a 3a 73 74 6d  lumn_text $::stm
14130 74 20 30 0a 7d 20 7b 74 77 6f 7d 0a 64 6f 5f 74  t 0.} {two}.do_t
14140 65 73 74 20 33 39 2e 33 20 7b 0a 20 20 73 71 6c  est 39.3 {.  sql
14150 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a  ite3_finalize $:
14160 3a 73 74 6d 74 0a 20 20 65 78 65 63 73 71 6c 20  :stmt.  execsql 
14170 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f  COMMIT.} {}..do_
14180 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 39 2e  execsql_test 39.
14190 34 20 7b 0a 20 20 50 52 41 47 4d 41 20 61 75 74  4 {.  PRAGMA aut
141a0 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20 20  o_vacuum = 2;.  
141b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
141c0 78 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  x);.  CREATE TAB
141d0 4c 45 20 74 34 28 78 29 3b 0a 0a 20 20 44 52 4f  LE t4(x);..  DRO
141e0 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 44 52  P TABLE t2;.  DR
141f0 4f 50 20 54 41 42 4c 45 20 74 33 3b 0a 20 20 44  OP TABLE t3;.  D
14200 52 4f 50 20 54 41 42 4c 45 20 74 34 3b 0a 7d 0a  ROP TABLE t4;.}.
14210 64 6f 5f 74 65 73 74 20 33 39 2e 35 20 7b 0a 20  do_test 39.5 {. 
14220 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
14230 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
14240 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
14250 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
14260 20 3d 20 31 3b 0a 20 20 20 20 50 52 41 47 4d 41   = 1;.    PRAGMA
14270 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63   incremental_vac
14280 75 75 6d 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  uum;.    PRAGMA 
14290 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
142a0 0a 20 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f  .  }.} {ok}..do_
142b0 74 65 73 74 20 34 30 2e 31 20 7b 0a 20 20 72 65  test 40.1 {.  re
142c0 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c  set_db.  execsql
142d0 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75   {.    PRAGMA au
142e0 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20  to_vacuum = 1;. 
142f0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14300 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(x PRIMARY KEY
14310 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
14320 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
14330 64 6f 6d 62 6c 6f 62 28 31 32 30 30 29 29 3b 0a  domblob(1200));.
14340 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
14350 63 6f 75 6e 74 3b 0a 20 20 7d 0a 7d 20 7b 36 7d  count;.  }.} {6}
14360 0a 64 6f 5f 74 65 73 74 20 34 30 2e 32 20 7b 0a  .do_test 40.2 {.
14370 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
14380 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
14390 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
143a0 28 31 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  (1200));.    INS
143b0 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
143c0 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 32  ES(randomblob(12
143d0 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
143e0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
143f0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 32 30 30 29  randomblob(1200)
14400 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
14410 65 73 74 20 34 30 2e 33 20 7b 0a 20 20 64 62 20  est 40.3 {.  db 
14420 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20  close.  sqlite3 
14430 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
14440 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
14450 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
14460 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
14470 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 50 52  LE t2(x);.    PR
14480 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
14490 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 7d  heck;.  }.} {ok}
144a0 0a 0a 64 6f 5f 74 65 73 74 20 34 31 2e 31 20 7b  ..do_test 41.1 {
144b0 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 65 78  .  reset_db.  ex
144c0 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
144d0 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52  TE TABLE t1(x PR
144e0 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
144f0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
14500 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
14510 28 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (200));.    INSE
14520 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
14530 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  T randomblob(200
14540 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
14550 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
14560 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
14570 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
14580 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
14590 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
145a0 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(200) FROM t1;
145b0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
145c0 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
145d0 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20  mblob(200) FROM 
145e0 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
145f0 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
14600 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
14610 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
14620 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
14630 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14640 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
14650 7b 7d 0a 64 6f 5f 74 65 73 74 20 34 31 2e 32 20  {}.do_test 41.2 
14660 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d  {.  testvfs tv -
14670 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 73  default 1.  tv s
14680 65 63 74 6f 72 73 69 7a 65 20 31 36 33 38 34 3b  ectorsize 16384;
14690 0a 20 20 74 76 20 64 65 76 63 68 61 72 20 5b 6c  .  tv devchar [l
146a0 69 73 74 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  ist].  db close.
146b0 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
146c0 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
146d0 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
146e0 65 5f 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20  e_size = 1;.    
146f0 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
14700 48 45 52 45 20 72 6f 77 69 64 25 34 3b 0a 20 20  HERE rowid%4;.  
14710 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
14720 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
14730 7b 6f 6b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  {ok}.db close.tv
14740 20 64 65 6c 65 74 65 0a 0a 73 65 74 20 70 65 6e   delete..set pen
14750 64 69 6e 67 5f 70 72 65 76 20 5b 73 71 6c 69 74  ding_prev [sqlit
14760 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f  e3_test_control_
14770 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 30 78 31  pending_byte 0x1
14780 30 30 30 30 30 30 5d 0a 64 6f 5f 74 65 73 74 20  000000].do_test 
14790 34 32 2e 31 20 7b 0a 20 20 72 65 73 65 74 5f 64  42.1 {.  reset_d
147a0 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
147b0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
147c0 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53  1(x, y);.    INS
147d0 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
147e0 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  ES(randomblob(20
147f0 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  0), randomblob(2
14800 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
14810 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
14820 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c  randomblob(200),
14830 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14840 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
14850 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
14860 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  ECT randomblob(2
14870 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
14880 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
14890 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
148a0 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
148b0 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62  ob(200), randomb
148c0 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31  lob(200) FROM t1
148d0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
148e0 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
148f0 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e  omblob(200), ran
14900 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f  domblob(200) FRO
14910 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
14920 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
14930 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c  randomblob(200),
14940 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14950 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
14960 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
14970 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  ECT randomblob(2
14980 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
14990 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
149a0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
149b0 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
149c0 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62  ob(200), randomb
149d0 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31  lob(200) FROM t1
149e0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
149f0 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
14a00 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e  omblob(200), ran
14a10 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f  domblob(200) FRO
14a20 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
14a30 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
14a40 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c  randomblob(200),
14a50 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14a60 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20   FROM t1;.  }.  
14a70 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  db close.  sqlit
14a80 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f  e3_test_control_
14a90 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 30 78 30  pending_byte 0x0
14aa0 30 31 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  010000.  sqlite3
14ab0 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62   db test.db.  db
14ac0 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6d   eval { PRAGMA m
14ad0 6d 61 70 5f 73 69 7a 65 20 3d 20 30 20 7d 0a 20  map_size = 0 }. 
14ae0 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
14af0 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 79 29  CT sum(length(y)
14b00 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  ) FROM t1 }.} {1
14b10 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
14b20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
14b30 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 34 32 2e  ed}}.do_test 42.
14b40 32 20 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 20  2 {.  reset_db. 
14b50 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
14b60 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
14b70 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , y);.    INSERT
14b80 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
14b90 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c  randomblob(200),
14ba0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14bb0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
14bc0 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
14bd0 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61  domblob(200), ra
14be0 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
14bf0 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
14c00 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
14c10 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14c20 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
14c30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
14c40 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
14c50 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
14c60 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  200), randomblob
14c70 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (200) FROM t1;. 
14c80 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
14c90 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
14ca0 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(200), random
14cb0 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74  blob(200) FROM t
14cc0 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
14cd0 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
14ce0 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61  domblob(200), ra
14cf0 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
14d00 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
14d10 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
14d20 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14d30 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
14d40 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
14d50 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
14d60 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
14d70 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  200), randomblob
14d80 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (200) FROM t1;. 
14d90 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
14da0 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
14db0 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(200), random
14dc0 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74  blob(200) FROM t
14dd0 31 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73  1;.  }.  db clos
14de0 65 0a 0a 20 20 74 65 73 74 76 66 73 20 74 76 20  e..  testvfs tv 
14df0 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20  -default 1.  tv 
14e00 73 65 63 74 6f 72 73 69 7a 65 20 31 36 33 38 34  sectorsize 16384
14e10 3b 0a 20 20 74 76 20 64 65 76 63 68 61 72 20 5b  ;.  tv devchar [
14e20 6c 69 73 74 5d 0a 20 20 73 71 6c 69 74 65 33 20  list].  sqlite3 
14e30 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20  db test.db -vfs 
14e40 74 76 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55  tv.  execsql { U
14e50 50 44 41 54 45 20 74 31 20 53 45 54 20 78 20 3d  PDATE t1 SET x =
14e60 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14e70 20 7d 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65   }.} {}.db close
14e80 0a 74 76 20 64 65 6c 65 74 65 0a 73 71 6c 69 74  .tv delete.sqlit
14e90 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f  e3_test_control_
14ea0 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 24 70 65  pending_byte $pe
14eb0 6e 64 69 6e 67 5f 70 72 65 76 0a 0a 64 6f 5f 74  nding_prev..do_t
14ec0 65 73 74 20 34 33 2e 31 20 7b 0a 20 20 72 65 73  est 43.1 {.  res
14ed0 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20  et_db.  execsql 
14ee0 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
14ef0 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 20  LE t1(x, y);.   
14f00 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
14f10 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
14f20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
14f30 32 28 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53  2(x, y);.    INS
14f40 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
14f50 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 43 52  ES(1, 2);.    CR
14f60 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 78 2c  EATE TABLE t3(x,
14f70 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   y);.    INSERT 
14f80 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31  INTO t3 VALUES(1
14f90 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63  , 2);.  }.  db c
14fa0 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64  lose.  sqlite3 d
14fb0 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 64 62 20  b test.db..  db 
14fc0 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6d 6d  eval { PRAGMA mm
14fd0 61 70 5f 73 69 7a 65 20 3d 20 30 20 7d 0a 20 20  ap_size = 0 }.  
14fe0 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54  db eval { SELECT
14ff0 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73   * FROM t1 }.  s
15000 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
15010 20 64 62 20 43 41 43 48 45 5f 4d 49 53 53 20 30   db CACHE_MISS 0
15020 0a 7d 20 7b 30 20 32 20 30 7d 0a 0a 64 6f 5f 74  .} {0 2 0}..do_t
15030 65 73 74 20 34 33 2e 32 20 7b 0a 20 20 64 62 20  est 43.2 {.  db 
15040 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  eval { SELECT * 
15050 46 52 4f 4d 20 74 32 20 7d 0a 20 20 73 71 6c 69  FROM t2 }.  sqli
15060 74 65 33 5f 64 62 5f 73 74 61 74 75 73 20 64 62  te3_db_status db
15070 20 43 41 43 48 45 5f 4d 49 53 53 20 31 0a 7d 20   CACHE_MISS 1.} 
15080 7b 30 20 33 20 30 7d 0a 0a 64 6f 5f 74 65 73 74  {0 3 0}..do_test
15090 20 34 33 2e 33 20 7b 0a 20 20 64 62 20 65 76 61   43.3 {.  db eva
150a0 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
150b0 4d 20 74 33 20 7d 0a 20 20 73 71 6c 69 74 65 33  M t3 }.  sqlite3
150c0 5f 64 62 5f 73 74 61 74 75 73 20 64 62 20 43 41  _db_status db CA
150d0 43 48 45 5f 4d 49 53 53 20 30 0a 7d 20 7b 30 20  CHE_MISS 0.} {0 
150e0 31 20 30 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73  1 0}..finish_tes
150f0 74 0a                                            t.