/ Hex Artifact Content
Login

Artifact a309660a312ca241053c2b1253d432f868cfe64f25aac17f8e7572099b279e5c:


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 69 66 20 7b 21 5b 66 6f  E_OK.}..if {![fo
4600: 72 63 65 64 5f 70 72 6f 78 79 5f 6c 6f 63 6b 69  rced_proxy_locki
4610: 6e 67 5d 7d 20 7b 0a 20 20 23 20 70 72 6f 78 79  ng]} {.  # proxy
4620: 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 63 61   locking uses ca
4630: 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 61 75  n't deal with au
4640: 74 6f 20 70 72 6f 78 79 20 66 69 6c 65 20 70 61  to proxy file pa
4650: 74 68 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  ths longer than 
4660: 4d 41 58 50 41 54 48 4c 45 4e 0a 66 6f 72 65 61  MAXPATHLEN.forea
4670: 63 68 20 7b 74 6e 31 20 74 63 6c 7d 20 7b 0a 20  ch {tn1 tcl} {. 
4680: 20 31 20 7b 20 73 65 74 20 70 72 65 66 69 78 20   1 { set prefix 
4690: 22 74 65 73 74 2e 64 62 22 20 7d 0a 20 20 32 20  "test.db" }.  2 
46a0: 7b 20 0a 20 20 20 20 23 20 54 68 69 73 20 74 65  { .    # This te
46b0: 73 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  st depends on th
46c0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53  e underlying VFS
46d0: 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 6f   being able to o
46e0: 70 65 6e 20 70 61 74 68 73 0a 20 20 20 20 23 20  pen paths.    # 
46f0: 35 31 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e  512 bytes in len
4700: 67 74 68 2e 20 54 68 65 20 69 64 65 61 20 69 73  gth. The idea is
4710: 20 74 6f 20 63 72 65 61 74 65 20 61 20 68 6f 74   to create a hot
4720: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68  -journal file th
4730: 61 74 0a 20 20 20 20 23 20 63 6f 6e 74 61 69 6e  at.    # contain
4740: 73 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  s a master-journ
4750: 61 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20 6c 61  al pointer so la
4760: 72 67 65 20 74 68 61 74 20 69 74 20 63 6f 75 6c  rge that it coul
4770: 64 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 23 20  d contain.    # 
4780: 61 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  a valid page rec
4790: 6f 72 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  ord (if the file
47a0: 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 35 31   page-size is 51
47b0: 32 20 62 79 74 65 73 29 2e 20 53 6f 20 61 73 20  2 bytes). So as 
47c0: 74 6f 0a 20 20 20 20 23 20 6d 61 6b 65 20 73 75  to.    # make su
47d0: 72 65 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27  re SQLite doesn'
47e0: 74 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 62  t get confused b
47f0: 79 20 74 68 69 73 2e 0a 20 20 20 20 23 0a 20 20  y this..    #.  
4800: 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67 20 5b    set nPadding [
4810: 65 78 70 72 20 35 31 31 20 2d 20 24 3a 3a 6d 6a  expr 511 - $::mj
4820: 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68  _filename_length
4830: 5d 0a 20 20 20 20 69 66 20 7b 24 74 63 6c 5f 70  ].    if {$tcl_p
4840: 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d  latform(platform
4850: 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a  )=="windows"} {.
4860: 20 20 20 20 20 20 23 20 54 42 44 20 6e 65 65 64        # TBD need
4870: 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 68   to figure out h
4880: 6f 77 20 74 6f 20 64 6f 20 74 68 69 73 20 63 6f  ow to do this co
4890: 72 72 65 63 74 6c 79 20 66 6f 72 20 57 69 6e 64  rrectly for Wind
48a0: 6f 77 73 21 21 21 0a 20 20 20 20 20 20 73 65 74  ows!!!.      set
48b0: 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20   nPadding [expr 
48c0: 32 35 35 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65  255 - $::mj_file
48d0: 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20 20  name_length].   
48e0: 20 7d 0a 0a 20 20 20 20 23 20 57 65 20 63 61 6e   }..    # We can
48f0: 6e 6f 74 20 6a 75 73 74 20 63 72 65 61 74 65 20  not just create 
4900: 61 20 72 65 61 6c 6c 79 20 6c 6f 6e 67 20 64 61  a really long da
4910: 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
4920: 20 74 6f 20 6f 70 65 6e 2c 20 61 73 0a 20 20 20   to open, as.   
4930: 20 23 20 4c 69 6e 75 78 20 6c 69 6d 69 74 73 20   # Linux limits 
4940: 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70 6f 6e 65  a single compone
4950: 6e 74 20 6f 66 20 61 20 70 61 74 68 20 74 6f 20  nt of a path to 
4960: 32 35 35 20 62 79 74 65 73 20 62 79 20 64 65 66  255 bytes by def
4970: 61 75 6c 74 0a 20 20 20 20 23 20 28 61 6e 64 20  ault.    # (and 
4980: 70 72 65 73 75 6d 61 62 6c 79 20 6f 74 68 65 72  presumably other
4990: 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 6c 69   systems have li
49a0: 6d 69 74 73 20 74 6f 6f 29 2e 20 53 6f 20 63 72  mits too). So cr
49b0: 65 61 74 65 20 61 20 64 69 72 65 63 74 6f 72 79  eate a directory
49c0: 0a 20 20 20 20 23 20 68 69 65 72 61 72 63 68 79  .    # hierarchy
49d0: 20 74 6f 20 77 6f 72 6b 20 69 6e 2e 0a 20 20 20   to work in..   
49e0: 20 23 0a 20 20 20 20 73 65 74 20 64 69 72 6e 61   #.    set dirna
49f0: 6d 65 20 22 64 31 32 33 34 35 36 37 38 39 30 31  me "d12345678901
4a00: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
4a10: 38 39 30 2f 22 0a 20 20 20 20 73 65 74 20 6e 44  890/".    set nD
4a20: 69 72 20 5b 65 78 70 72 20 24 6e 50 61 64 64 69  ir [expr $nPaddi
4a30: 6e 67 20 2f 20 33 32 5d 0a 20 20 20 20 69 66 20  ng / 32].    if 
4a40: 7b 20 24 6e 44 69 72 20 7d 20 7b 0a 20 20 20 20  { $nDir } {.    
4a50: 20 20 73 65 74 20 70 20 5b 73 74 72 69 6e 67 20    set p [string 
4a60: 72 65 70 65 61 74 20 24 64 69 72 6e 61 6d 65 20  repeat $dirname 
4a70: 24 6e 44 69 72 5d 0a 20 20 20 20 20 20 66 69 6c  $nDir].      fil
4a80: 65 20 6d 6b 64 69 72 20 24 70 0a 20 20 20 20 20  e mkdir $p.     
4a90: 20 63 64 20 24 70 0a 20 20 20 20 7d 0a 0a 20 20   cd $p.    }..  
4aa0: 20 20 73 65 74 20 70 61 64 64 69 6e 67 20 5b 73    set padding [s
4ab0: 74 72 69 6e 67 20 72 65 70 65 61 74 20 78 20 5b  tring repeat x [
4ac0: 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20 25  expr $nPadding %
4ad0: 33 32 5d 5d 0a 20 20 20 20 73 65 74 20 70 72 65  32]].    set pre
4ae0: 66 69 78 20 22 74 65 73 74 2e 64 62 24 7b 70 61  fix "test.db${pa
4af0: 64 64 69 6e 67 7d 22 0a 20 20 7d 0a 7d 20 7b 0a  dding}".  }.} {.
4b00: 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20 66 6f    eval $tcl.  fo
4b10: 72 65 61 63 68 20 7b 74 6e 32 20 73 71 6c 20 75  reach {tn2 sql u
4b20: 73 65 73 4d 4a 7d 20 7b 0a 20 20 20 20 6f 20 7b  sesMJ} {.    o {
4b30: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d   .      PRAGMA m
4b40: 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ain.synchronous=
4b50: 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  OFF;.      PRAGM
4b60: 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75  A aux.synchronou
4b70: 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  s=OFF;.      PRA
4b80: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
4b90: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d   = DELETE;.    }
4ba0: 20 30 0a 20 20 20 20 6f 35 31 32 20 7b 20 0a 20   0.    o512 { . 
4bb0: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
4bc0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46  .synchronous=OFF
4bd0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
4be0: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  ux.synchronous=O
4bf0: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
4c00: 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 20   main.page_size 
4c10: 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50 52 41  = 512;.      PRA
4c20: 47 4d 41 20 61 75 78 2e 70 61 67 65 5f 73 69 7a  GMA aux.page_siz
4c30: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50  e = 512;.      P
4c40: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4c50: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4c60: 20 7d 20 30 0a 20 20 20 20 6e 20 7b 20 0a 20 20   } 0.    n { .  
4c70: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
4c80: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
4c90: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
4ca0: 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73   aux.synchronous
4cb0: 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50  =NORMAL;.      P
4cc0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4cd0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4ce0: 20 7d 20 31 0a 20 20 20 20 66 20 7b 20 0a 20 20   } 1.    f { .  
4cf0: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
4d00: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
4d10: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
4d20: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  ux.synchronous=F
4d30: 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  ULL;.      PRAGM
4d40: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
4d50: 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 20 31   DELETE;.    } 1
4d60: 0a 20 20 20 20 77 31 20 7b 20 0a 20 20 20 20 20  .    w1 { .     
4d70: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e   PRAGMA main.syn
4d80: 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b  chronous=NORMAL;
4d90: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
4da0: 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f  x.synchronous=NO
4db0: 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47  RMAL;.      PRAG
4dc0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
4dd0: 3d 20 57 41 4c 3b 0a 20 20 20 20 7d 20 30 0a 20  = WAL;.    } 0. 
4de0: 20 20 20 77 32 20 7b 20 0a 20 20 20 20 20 20 50     w2 { .      P
4df0: 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68  RAGMA main.synch
4e00: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
4e10: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
4e20: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
4e30: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
4e40: 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f   main.journal_mo
4e50: 64 65 3d 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  de=DELETE;.     
4e60: 20 50 52 41 47 4d 41 20 61 75 78 2e 6a 6f 75 72   PRAGMA aux.jour
4e70: 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c 3b 0a 20 20  nal_mode=WAL;.  
4e80: 20 20 7d 20 30 0a 20 20 20 20 6f 31 61 20 7b 20    } 0.    o1a { 
4e90: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
4ea0: 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  in.synchronous=F
4eb0: 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  ULL;.      PRAGM
4ec0: 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75  A aux.synchronou
4ed0: 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  s=OFF;.      PRA
4ee0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
4ef0: 3d 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 20 30  =DELETE;.    } 0
4f00: 0a 20 20 20 20 6f 31 62 20 7b 20 0a 20 20 20 20  .    o1b { .    
4f10: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
4f20: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20  nchronous=OFF;. 
4f30: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
4f40: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
4f50: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
4f60: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45   journal_mode=DE
4f70: 4c 45 54 45 3b 0a 20 20 20 20 7d 20 30 0a 20 20  LETE;.    } 0.  
4f80: 20 20 6d 31 20 7b 20 0a 20 20 20 20 20 20 50 52    m1 { .      PR
4f90: 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72  AGMA main.synchr
4fa0: 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20  onous=NORMAL;.  
4fb0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
4fc0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
4fd0: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
4fe0: 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  main.journal_mod
4ff0: 65 3d 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  e=DELETE;.      
5000: 50 52 41 47 4d 41 20 61 75 78 2e 6a 6f 75 72 6e  PRAGMA aux.journ
5010: 61 6c 5f 6d 6f 64 65 20 3d 20 4d 45 4d 4f 52 59  al_mode = MEMORY
5020: 3b 0a 20 20 20 20 7d 20 30 0a 20 20 20 20 74 31  ;.    } 0.    t1
5030: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
5040: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
5050: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
5060: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
5070: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
5080: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
5090: 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45  .journal_mode=DE
50a0: 4c 45 54 45 3b 0a 20 20 20 20 20 20 50 52 41 47  LETE;.      PRAG
50b0: 4d 41 20 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 6d  MA aux.journal_m
50c0: 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45 3b 0a  ode = TRUNCATE;.
50d0: 20 20 20 20 7d 20 31 0a 20 20 20 20 70 31 20 7b      } 1.    p1 {
50e0: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d   .      PRAGMA m
50f0: 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ain.synchronous=
5100: 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52  NORMAL;.      PR
5110: 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f  AGMA aux.synchro
5120: 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20  nous=NORMAL;.   
5130: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a     PRAGMA main.j
5140: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45 4c 45  ournal_mode=DELE
5150: 54 45 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  TE;.      PRAGMA
5160: 20 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   aux.journal_mod
5170: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
5180: 20 7d 20 31 0a 20 20 7d 20 7b 0a 0a 20 20 20 20   } 1.  } {..    
5190: 73 65 74 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24  set tn "${tn1}.$
51a0: 7b 74 6e 32 7d 22 0a 20 20 0a 20 20 20 20 23 20  {tn2}".  .    # 
51b0: 53 65 74 20 75 70 20 61 20 63 6f 6e 6e 65 63 74  Set up a connect
51c0: 69 6f 6e 20 74 6f 20 68 61 76 65 20 74 77 6f 20  ion to have two 
51d0: 64 61 74 61 62 61 73 65 73 2c 20 74 65 73 74 2e  databases, test.
51e0: 64 62 20 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20  db (main) and . 
51f0: 20 20 20 23 20 74 65 73 74 2e 64 62 32 20 28 61     # test.db2 (a
5200: 75 78 29 2e 20 54 68 65 6e 20 72 75 6e 20 61 20  ux). Then run a 
5210: 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
5220: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20  action on them. 
5230: 54 68 65 0a 20 20 20 20 23 20 56 46 53 20 77 69  The.    # VFS wi
5240: 6c 6c 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20  ll snapshot the 
5250: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
5260: 20 62 65 66 6f 72 65 20 74 68 65 20 6d 61 73 74   before the mast
5270: 65 72 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23  er-journal.    #
5280: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
5290: 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
52a0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
52b0: 23 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20  #.    tv filter 
52c0: 78 44 65 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74  xDelete.    do_t
52d0: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
52e0: 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 73 65 74  tn.1 {.      set
52f0: 20 3a 3a 6d 6a 5f 64 65 6c 65 74 65 5f 63 6e 74   ::mj_delete_cnt
5300: 20 30 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69   0.      faultsi
5310: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
5320: 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20  pen $prefix.    
5330: 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20    execsql ".    
5340: 20 20 20 20 41 54 54 41 43 48 20 27 24 7b 70 72      ATTACH '${pr
5350: 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 3b 0a  efix}2' AS aux;.
5360: 20 20 20 20 20 20 20 20 24 73 71 6c 0a 20 20 20          $sql.   
5370: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
5380: 45 20 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20  E a(x);.        
5390: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78  CREATE TABLE aux
53a0: 2e 62 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49  .b(x);.        I
53b0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c  NSERT INTO a VAL
53c0: 55 45 53 28 27 64 6f 75 62 6c 65 2d 79 6f 75 27  UES('double-you'
53d0: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
53e0: 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28  T INTO a VALUES(
53f0: 27 77 68 79 27 29 3b 0a 20 20 20 20 20 20 20 20  'why');.        
5400: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41  INSERT INTO a VA
5410: 4c 55 45 53 28 27 7a 65 64 27 29 3b 0a 20 20 20  LUES('zed');.   
5420: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5430: 20 62 20 56 41 4c 55 45 53 28 27 77 6f 6e 27 29   b VALUES('won')
5440: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
5450: 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27   INTO b VALUES('
5460: 74 6f 6f 27 29 3b 0a 20 20 20 20 20 20 20 20 49  too');.        I
5470: 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c  NSERT INTO b VAL
5480: 55 45 53 28 27 66 72 65 65 27 29 3b 0a 20 20 20  UES('free');.   
5490: 20 20 20 22 0a 20 20 20 20 20 20 65 78 65 63 73     ".      execs
54a0: 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 42 45 47  ql {.        BEG
54b0: 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e  IN;.          IN
54c0: 53 45 52 54 20 49 4e 54 4f 20 61 20 53 45 4c 45  SERT INTO a SELE
54d0: 43 54 20 2a 20 46 52 4f 4d 20 62 20 57 48 45 52  CT * FROM b WHER
54e0: 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20 20 20  E rowid<=3;.    
54f0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
5500: 4f 20 62 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  O b SELECT * FRO
5510: 4d 20 61 20 57 48 45 52 45 20 72 6f 77 69 64 3c  M a WHERE rowid<
5520: 3d 33 3b 0a 20 20 20 20 20 20 20 20 43 4f 4d 4d  =3;.        COMM
5530: 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  IT;.      }.    
5540: 7d 20 7b 7d 0a 20 20 20 20 74 76 20 66 69 6c 74  } {}.    tv filt
5550: 65 72 20 7b 7d 0a 0a 20 20 20 20 23 20 56 65 72  er {}..    # Ver
5560: 69 66 79 20 74 68 61 74 20 61 20 6d 61 73 74 65  ify that a maste
5570: 72 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65  r journal was de
5580: 6c 65 74 65 64 20 6f 6e 6c 79 20 66 6f 72 20 74  leted only for t
5590: 68 6f 73 65 20 63 61 73 65 73 20 77 68 65 72 65  hose cases where
55a0: 0a 20 20 20 20 23 20 6d 61 73 74 65 72 20 6a 6f  .    # master jo
55b0: 75 72 6e 61 6c 73 20 72 65 61 6c 6c 79 20 6f 75  urnals really ou
55c0: 67 68 74 20 74 6f 20 62 65 20 75 73 65 64 0a 20  ght to be used. 
55d0: 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74     #.    do_test
55e0: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
55f0: 31 62 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a  1b {.      set :
5600: 3a 6d 6a 5f 64 65 6c 65 74 65 5f 63 6e 74 0a 20  :mj_delete_cnt. 
5610: 20 20 20 7d 20 24 75 73 65 73 4d 4a 0a 20 20 20     } $usesMJ.   
5620: 20 0a 20 20 20 20 23 20 43 68 65 63 6b 20 74 68   .    # Check th
5630: 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
5640: 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
5650: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 20   successfully.. 
5660: 20 20 20 23 0a 20 20 20 20 64 6f 5f 65 78 65 63     #.    do_exec
5670: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
5680: 34 2e 34 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  4.4.$tn.2 {.    
5690: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
56a0: 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62 6c 65 2d  a.    } {double-
56b0: 79 6f 75 20 77 68 79 20 7a 65 64 20 77 6f 6e 20  you why zed won 
56c0: 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20 64 6f  too free}.    do
56d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
56e0: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 33 20 7b  ger1-4.4.$tn.3 {
56f0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
5700: 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20 7b 77 6f  FROM b.    } {wo
5710: 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f 75 62 6c  n too free doubl
5720: 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20  e-you why zed}. 
5730: 20 20 20 0a 20 20 20 20 69 66 20 7b 24 75 73 65     .    if {$use
5740: 73 4d 4a 7d 20 7b 0a 20 20 20 20 20 20 23 20 52  sMJ} {.      # R
5750: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5760: 73 79 73 74 65 6d 20 61 6e 64 20 72 65 6f 70 65  system and reope
5770: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e  n the databases.
5780: 20 43 68 65 63 6b 20 74 68 61 74 20 69 74 20 6e   Check that it n
5790: 6f 77 0a 20 20 20 20 20 20 23 20 61 70 70 65 61  ow.      # appea
57a0: 72 73 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  rs that the tran
57b0: 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
57c0: 63 6f 6d 6d 69 74 74 65 64 20 28 62 65 63 61 75  committed (becau
57d0: 73 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  se the file-syst
57e0: 65 6d 0a 20 20 20 20 20 20 23 20 77 61 73 20 72  em.      # was r
57f0: 65 73 74 6f 72 65 64 20 74 6f 20 74 68 65 20 73  estored to the s
5800: 74 61 74 65 20 77 68 65 72 65 20 69 74 20 68 61  tate where it ha
5810: 64 20 6e 6f 74 20 62 65 65 6e 29 2e 0a 20 20 20  d not been)..   
5820: 20 20 20 23 0a 20 20 20 20 20 20 64 6f 5f 74 65     #.      do_te
5830: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5840: 6e 2e 34 20 7b 0a 20 20 20 20 20 20 20 20 66 61  n.4 {.        fa
5850: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5860: 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 65 66 69  nd_reopen $prefi
5870: 78 0a 20 20 20 20 20 20 20 20 65 78 65 63 73 71  x.        execsq
5880: 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70 72 65  l "ATTACH '${pre
5890: 66 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a 20  fix}2' AS aux". 
58a0: 20 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 20 20       } {}.      
58b0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
58c0: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35  pager1-4.4.$tn.5
58d0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
58e0: 61 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77  a} {double-you w
58f0: 68 79 20 7a 65 64 7d 0a 20 20 20 20 20 20 64 6f  hy zed}.      do
5900: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5910: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b  ger1-4.4.$tn.6 {
5920: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 7d  SELECT * FROM b}
5930: 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a   {won too free}.
5940: 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 23      }.    .    #
5950: 20 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c   Restore the fil
5960: 65 2d 73 79 73 74 65 6d 20 61 67 61 69 6e 2e 20  e-system again. 
5970: 54 68 69 73 20 74 69 6d 65 2c 20 62 65 66 6f 72  This time, befor
5980: 65 20 72 65 6f 70 65 6e 69 6e 67 20 74 68 65 20  e reopening the 
5990: 64 61 74 61 62 61 73 65 73 2c 0a 20 20 20 20 23  databases,.    #
59a0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
59b0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
59c0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79  from the file-sy
59d0: 73 74 65 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70  stem. It now app
59e0: 65 61 72 73 20 74 68 61 74 0a 20 20 20 20 23 20  ears that.    # 
59f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5a00: 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e  was committed (n
5a10: 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  o master-journal
5a20: 20 66 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c   file == no roll
5a30: 62 61 63 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20  back)..    #.   
5a40: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
5a50: 34 2e 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20  4.4.$tn.7 {.    
5a60: 20 20 69 66 20 7b 24 3a 3a 6d 6a 5f 64 65 6c 65    if {$::mj_dele
5a70: 74 65 5f 63 6e 74 3e 30 7d 20 7b 0a 20 20 20 20  te_cnt>0} {.    
5a80: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
5a90: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20  tore_and_reopen 
5aa0: 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 20 20  $prefix.        
5ab0: 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20  foreach f [glob 
5ac0: 24 7b 70 72 65 66 69 78 7d 2d 6d 6a 2a 5d 20 7b  ${prefix}-mj*] {
5ad0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 66 20   forcedelete $f 
5ae0: 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
5af0: 0a 20 20 20 20 20 20 20 20 64 62 20 63 6c 6f 73  .        db clos
5b00: 65 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  e.        sqlite
5b10: 33 20 64 62 20 24 70 72 65 66 69 78 0a 20 20 20  3 db $prefix.   
5b20: 20 20 20 7d 0a 20 20 20 20 20 20 65 78 65 63 73     }.      execs
5b30: 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70 72  ql "ATTACH '${pr
5b40: 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a  efix}2' AS aux".
5b50: 20 20 20 20 20 20 67 6c 6f 62 20 2d 6e 6f 63 6f        glob -noco
5b60: 6d 70 6c 61 69 6e 20 24 7b 70 72 65 66 69 78 7d  mplain ${prefix}
5b70: 2d 6d 6a 2a 0a 20 20 20 20 7d 20 7b 7d 0a 20 20  -mj*.    } {}.  
5b80: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
5b90: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
5ba0: 2e 38 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  .8 {.      SELEC
5bb0: 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20 20 7d  T * FROM a.    }
5bc0: 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79   {double-you why
5bd0: 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66 72 65   zed won too fre
5be0: 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71  e}.    do_execsq
5bf0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  l_test pager1-4.
5c00: 34 2e 24 74 6e 2e 39 20 7b 0a 20 20 20 20 20 20  4.$tn.9 {.      
5c10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 0a  SELECT * FROM b.
5c20: 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66      } {won too f
5c30: 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75 20 77  ree double-you w
5c40: 68 79 20 7a 65 64 7d 0a 20 20 7d 0a 0a 20 20 63  hy zed}.  }..  c
5c50: 64 20 24 70 77 64 0a 7d 0a 64 62 20 63 6c 6f 73  d $pwd.}.db clos
5c60: 65 0a 74 76 20 64 65 6c 65 74 65 0a 66 6f 72 63  e.tv delete.forc
5c70: 65 64 65 6c 65 74 65 20 24 64 69 72 6e 61 6d 65  edelete $dirname
5c80: 0a 7d 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56  .}..# Set up a V
5c90: 46 53 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  FS to make a cop
5ca0: 79 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  y of the file-sy
5cb0: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
5cc0: 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20 6a 6f   deleting a.# jo
5cd0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 63 6f  urnal file to co
5ce0: 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
5cf0: 6f 6e 2e 20 54 68 65 20 74 72 61 6e 73 61 63 74  on. The transact
5d00: 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65 78 61  ion modifies exa
5d10: 63 74 6c 79 0a 23 20 74 77 6f 20 64 61 74 61 62  ctly.# two datab
5d20: 61 73 65 20 70 61 67 65 73 20 28 61 6e 64 20 70  ase pages (and p
5d30: 61 67 65 20 31 20 2d 20 74 68 65 20 63 68 61 6e  age 1 - the chan
5d40: 67 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23 0a 74  ge counter)..#.t
5d50: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
5d60: 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69  lt 1.tv sectorsi
5d70: 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69 70 74  ze 512.tv script
5d80: 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c   copy_on_journal
5d90: 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65  _delete.tv filte
5da0: 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63  r xDelete.proc c
5db0: 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64  opy_on_journal_d
5dc0: 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69  elete {method fi
5dd0: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
5de0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
5df0: 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c  ch *journal $fil
5e00: 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d  ename]} faultsim
5e10: 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20  _save .  return 
5e20: 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c  SQLITE_OK.}.faul
5e30: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
5e40: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
5e50: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5e60: 35 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a  5.1 {.  PRAGMA j
5e70: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
5e80: 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 70  LETE;.  PRAGMA p
5e90: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
5ea0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
5eb0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41  t1(a, b);.  CREA
5ec0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
5ed0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
5ee0: 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c 20   t1 VALUES('I', 
5ef0: 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  'II');.  INSERT 
5f00: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
5f10: 49 49 49 27 2c 20 27 49 56 27 29 3b 0a 20 20 42  III', 'IV');.  B
5f20: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
5f30: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
5f40: 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 2);.    INSER
5f50: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5f60: 28 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d 49 54  (3, 4);.  COMMIT
5f70: 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20  ;.} {delete}.tv 
5f80: 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65  filter {}..# Che
5f90: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
5fa0: 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
5fb0: 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  :.#.do_execsql_t
5fc0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32  est pager1.4.5.2
5fd0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
5fe0: 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20  OM t1;.  SELECT 
5ff0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20  * FROM t2;.} {I 
6000: 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33 20  II 1 2 III IV 3 
6010: 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f  4}..# Now try fo
6020: 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70  ur tests:.#.#  p
6030: 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73  ager1-4.5.3: Res
6040: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
6050: 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74  stem. Check that
6060: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
6070: 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20  action .#       
6080: 20 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c           is roll
6090: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
60a0: 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74  ger1-4.5.4: Rest
60b0: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
60c0: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
60d0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
60e0: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
60f0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43        journal. C
6100: 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  heck the transac
6110: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c  tion is not roll
6120: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
6130: 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74  ger1-4.5.5: Rest
6140: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
6150: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
6160: 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69   second record i
6170: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  n the.#         
6180: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20         journal. 
6190: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66  Check that the f
61a0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74  irst record in t
61b0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
61c0: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s .#            
61d0: 20 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c      played back,
61e0: 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63   but not the sec
61f0: 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31  ond..#.#  pager1
6200: 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20  -4.5.6: Restore 
6210: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
6220: 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65   Try to open the
6230: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61   database with a
6240: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
6250: 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65    readonly conne
6260: 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75  ction. This shou
6270: 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65  ld fail, as a re
6280: 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20  ad-only.#       
6290: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
62a0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20  ion cannot roll 
62b0: 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
62c0: 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73  e file..#.faults
62d0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
62e0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
62f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
6300: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .3 {.  SELECT * 
6310: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
6320: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
6330: 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75  I II III IV}.fau
6340: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
6350: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
6360: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
6370: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
6380: 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32  +1024 - 202] 012
6390: 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f  3456789ABCDEF.do
63a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
63b0: 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53  ger1.4.5.4 {.  S
63c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
63d0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
63e0: 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32   t2;.} {I II 1 2
63f0: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75   III IV 3 4}.fau
6400: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
6410: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
6420: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
6430: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
6440: 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d  +1024+4+4+1024 -
6450: 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39   202] 0123456789
6460: 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71  ABCDEF.do_execsq
6470: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
6480: 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.5 {.  SELECT *
6490: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
64a0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
64b0: 7b 49 20 49 49 20 49 49 49 20 49 56 20 33 20 34  {I II III IV 3 4
64c0: 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  }..faultsim_rest
64d0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ore_and_reopen.d
64e0: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20  b close.sqlite3 
64f0: 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64  db test.db -read
6500: 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73  only 1.do_catchs
6510: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
6520: 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.6 {.  SELECT 
6530: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
6540: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
6550: 20 7b 31 20 7b 61 74 74 65 6d 70 74 20 74 6f 20   {1 {attempt to 
6560: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
6570: 20 64 61 74 61 62 61 73 65 7d 7d 0a 64 62 20 63   database}}.db c
6580: 6c 6f 73 65 0a 0a 23 20 53 6e 61 70 73 68 6f 74  lose..# Snapshot
6590: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
65a0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 6d 75 6c   just before mul
65b0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 2e 20  ti-file commit. 
65c0: 53 61 76 65 20 74 68 65 20 6e 61 6d 65 0a 23 20  Save the name.# 
65d0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
65e0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 24 3a  urnal file in $:
65f0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 0a 23 0a  :mj_filename..#.
6600: 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f  tv script copy_o
6610: 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 74 76 20 66  n_mj_delete.tv f
6620: 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70 72  ilter xDelete.pr
6630: 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65  oc copy_on_mj_de
6640: 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c  lete {method fil
6650: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
6660: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
6670: 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61 69  h *mj* [file tai
6680: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b  l $filename]]} {
6690: 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f 66   .    set ::mj_f
66a0: 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d  ilename $filenam
66b0: 65 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73  e.    faultsim_s
66c0: 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave .  }.  retur
66d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 64 6f  n SQLITE_OK.}.do
66e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36  _test pager1.4.6
66f0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
6700: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
6710: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
6720: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
6730: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
6740: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
6750: 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20  .db2' AS two;.  
6760: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
6770: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
6780: 41 54 45 20 54 41 42 4c 45 20 74 77 6f 2e 74 32  ATE TABLE two.t2
6790: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
67a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
67b0: 53 28 31 2c 20 27 74 31 2e 31 27 29 3b 0a 20 20  S(1, 't1.1');.  
67c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
67d0: 20 56 41 4c 55 45 53 28 31 2c 20 27 74 32 2e 31   VALUES(1, 't2.1
67e0: 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ');.    BEGIN;. 
67f0: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
6800: 45 54 20 62 20 3d 20 27 74 31 2e 32 27 3b 0a 20  ET b = 't1.2';. 
6810: 20 20 20 20 20 55 50 44 41 54 45 20 74 32 20 53       UPDATE t2 S
6820: 45 54 20 62 20 3d 20 27 74 32 2e 32 27 3b 0a 20  ET b = 't2.2';. 
6830: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
6840: 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 20 20   tv filter {}.  
6850: 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 66  db close.} {}..f
6860: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
6870: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78  and_reopen.do_ex
6880: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
6890: 31 2e 34 2e 36 2e 32 20 7b 20 53 45 4c 45 43 54  1.4.6.2 { SELECT
68a0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20   * FROM t1 }    
68b0: 20 20 20 20 20 20 20 7b 31 20 74 31 2e 31 7d 0a         {1 t1.1}.
68c0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
68d0: 70 61 67 65 72 31 2e 34 2e 36 2e 33 20 7b 20 66  pager1.4.6.3 { f
68e0: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
68f0: 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b 31 7d 0a  _filename } {1}.
6900: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6910: 70 61 67 65 72 31 2e 34 2e 36 2e 34 20 7b 0a 20  pager1.4.6.4 {. 
6920: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
6930: 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 53 45 4c  2' AS two;.  SEL
6940: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
6950: 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65 73   {1 t2.1}.do_tes
6960: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 35 20 7b  t pager1.4.6.5 {
6970: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
6980: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b 30  mj_filename } {0
6990: 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  }..faultsim_rest
69a0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ore_and_reopen.d
69b0: 62 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  b close.do_test 
69c0: 70 61 67 65 72 31 2e 34 2e 36 2e 38 20 7b 0a 20  pager1.4.6.8 {. 
69d0: 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61   set ::mj_filena
69e0: 6d 65 31 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  me1 $::mj_filena
69f0: 6d 65 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78  me.  tv filter x
6a00: 44 65 6c 65 74 65 0a 20 20 73 71 6c 69 74 65 33  Delete.  sqlite3
6a10: 20 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20 65   db test.db2.  e
6a20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
6a30: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
6a40: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 41   = DELETE;.    A
6a50: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 33 27  TTACH 'test.db3'
6a60: 20 41 53 20 74 68 72 65 65 3b 0a 20 20 20 20 43   AS three;.    C
6a70: 52 45 41 54 45 20 54 41 42 4c 45 20 74 68 72 65  REATE TABLE thre
6a80: 65 2e 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20  e.t3(a, b);.    
6a90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
6aa0: 41 4c 55 45 53 28 31 2c 20 27 74 33 2e 31 27 29  ALUES(1, 't3.1')
6ab0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
6ac0: 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45 54     UPDATE t2 SET
6ad0: 20 62 20 3d 20 27 74 32 2e 33 27 3b 0a 20 20 20   b = 't2.3';.   
6ae0: 20 20 20 55 50 44 41 54 45 20 74 33 20 53 45 54     UPDATE t3 SET
6af0: 20 62 20 3d 20 27 74 33 2e 33 27 3b 0a 20 20 20   b = 't3.3';.   
6b00: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65   COMMIT;.  }.  e
6b10: 78 70 72 20 7b 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  xpr {$::mj_filen
6b20: 61 6d 65 31 20 21 3d 20 24 3a 3a 6d 6a 5f 66 69  ame1 != $::mj_fi
6b30: 6c 65 6e 61 6d 65 7d 0a 7d 20 7b 31 7d 0a 66 61  lename}.} {1}.fa
6b40: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
6b50: 6e 64 5f 72 65 6f 70 65 6e 0a 74 76 20 66 69 6c  nd_reopen.tv fil
6b60: 74 65 72 20 7b 7d 0a 0a 23 20 54 68 65 20 66 69  ter {}..# The fi
6b70: 6c 65 2d 73 79 73 74 65 6d 20 6e 6f 77 20 63 6f  le-system now co
6b80: 6e 74 61 69 6e 73 3a 0a 23 0a 23 20 20 20 2a 20  ntains:.#.#   * 
6b90: 74 68 72 65 65 20 64 61 74 61 62 61 73 65 73 0a  three databases.
6ba0: 23 20 20 20 2a 20 74 68 72 65 65 20 68 6f 74 2d  #   * three hot-
6bb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 23 20  journal files.# 
6bc0: 20 20 2a 20 74 77 6f 20 6d 61 73 74 65 72 2d 6a    * two master-j
6bd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23 0a  ournal files..#.
6be0: 23 20 54 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  # The hot-journa
6bf0: 6c 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ls associated wi
6c00: 74 68 20 74 65 73 74 2e 64 62 32 20 61 6e 64 20  th test.db2 and 
6c10: 74 65 73 74 2e 64 62 33 20 70 6f 69 6e 74 20 74  test.db3 point t
6c20: 6f 0a 23 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  o.# master journ
6c30: 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  al $::mj_filenam
6c40: 65 2e 20 54 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  e. The hot-journ
6c50: 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  al file associat
6c60: 65 64 20 77 69 74 68 0a 23 20 74 65 73 74 2e 64  ed with.# test.d
6c70: 62 20 70 6f 69 6e 74 73 20 74 6f 20 6d 61 73 74  b points to mast
6c80: 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a  er journal $::mj
6c90: 5f 66 69 6c 65 6e 61 6d 65 31 2e 20 53 6f 20 72  _filename1. So r
6ca0: 65 61 64 69 6e 67 20 66 72 6f 6d 0a 23 20 74 65  eading from.# te
6cb0: 73 74 2e 64 62 20 73 68 6f 75 6c 64 20 64 65 6c  st.db should del
6cc0: 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  ete $::mj_filena
6cd0: 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  me1..#.do_test p
6ce0: 61 67 65 72 31 2e 34 2e 36 2e 39 20 7b 0a 20 20  ager1.4.6.9 {.  
6cf0: 6c 73 6f 72 74 20 5b 67 6c 6f 62 20 74 65 73 74  lsort [glob test
6d00: 2e 64 62 2a 5d 0a 7d 20 5b 6c 73 6f 72 74 20 5b  .db*].} [lsort [
6d10: 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
6d40: 0a 20 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  .  test.db test.
6d50: 64 62 32 20 74 65 73 74 2e 64 62 33 20 20 20 20  db2 test.db3    
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 65            \.  te
6d80: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65  st.db-journal te
6d90: 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 74  st.db2-journal t
6da0: 65 73 74 2e 64 62 33 2d 6a 6f 75 72 6e 61 6c 20  est.db3-journal 
6db0: 20 20 20 20 20 5c 0a 20 20 5b 66 69 6c 65 20 74       \.  [file t
6dc0: 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  ail $::mj_filena
6dd0: 6d 65 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  me] [file tail $
6de0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 5d 0a  ::mj_filename1].
6df0: 5d 5d 0a 0a 23 20 54 68 65 20 6d 61 73 74 65 72  ]]..# The master
6e00: 2d 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66  -journal $::mj_f
6e10: 69 6c 65 6e 61 6d 65 31 20 63 6f 6e 74 61 69 6e  ilename1 contain
6e20: 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 65  s pointers to te
6e30: 73 74 2e 64 62 20 61 6e 64 20 0a 23 20 74 65 73  st.db and .# tes
6e40: 74 2e 64 62 32 2e 20 48 6f 77 65 76 65 72 20 74  t.db2. However t
6e50: 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61  he hot-journal a
6e60: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
6e70: 65 73 74 2e 64 62 32 20 70 6f 69 6e 74 73 20 74  est.db2 points t
6e80: 6f 0a 23 20 61 20 64 69 66 66 65 72 65 6e 74 20  o.# a different 
6e90: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 20  master-journal. 
6ea0: 54 68 65 72 65 66 6f 72 65 2c 20 72 65 61 64 69  Therefore, readi
6eb0: 6e 67 20 66 72 6f 6d 20 74 65 73 74 2e 64 62 20  ng from test.db 
6ec0: 6f 6e 6c 79 20 73 68 6f 75 6c 64 0a 23 20 62 65  only should.# be
6ed0: 20 65 6e 6f 75 67 68 20 74 6f 20 63 61 75 73 65   enough to cause
6ee0: 20 53 51 4c 69 74 65 20 74 6f 20 64 65 6c 65 74   SQLite to delet
6ef0: 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  e $::mj_filename
6f00: 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 20 20 20  1..#.do_test    
6f10: 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e       pager1.4.6.
6f20: 31 30 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  10 { file exists
6f30: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20   $::mj_filename 
6f40: 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 20   } {1}.do_test  
6f50: 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e         pager1.4.
6f60: 36 2e 31 31 20 7b 20 66 69 6c 65 20 65 78 69 73  6.11 { file exis
6f70: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  ts $::mj_filenam
6f80: 65 31 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63  e1 } {1}.do_exec
6f90: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
6fa0: 34 2e 36 2e 31 32 20 7b 20 53 45 4c 45 43 54 20  4.6.12 { SELECT 
6fb0: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20 74  * FROM t1 } {1 t
6fc0: 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20  1.1}.do_test    
6fd0: 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e       pager1.4.6.
6fe0: 31 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  13 { file exists
6ff0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20   $::mj_filename 
7000: 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 20   } {1}.do_test  
7010: 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e         pager1.4.
7020: 36 2e 31 34 20 7b 20 66 69 6c 65 20 65 78 69 73  6.14 { file exis
7030: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  ts $::mj_filenam
7040: 65 31 20 7d 20 7b 30 7d 0a 0a 64 6f 5f 65 78 65  e1 } {0}..do_exe
7050: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
7060: 2e 34 2e 36 2e 31 32 20 7b 0a 20 20 41 54 54 41  .4.6.12 {.  ATTA
7070: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
7080: 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a   two;.  SELECT *
7090: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74   FROM t2;.} {1 t
70a0: 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20  2.1}.do_test    
70b0: 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e       pager1.4.6.
70c0: 31 33 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  13 { file exists
70d0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20   $::mj_filename 
70e0: 7d 20 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71  }  {1}.do_execsq
70f0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
7100: 36 2e 31 34 20 7b 0a 20 20 41 54 54 41 43 48 20  6.14 {.  ATTACH 
7110: 27 74 65 73 74 2e 64 62 33 27 20 41 53 20 74 68  'test.db3' AS th
7120: 72 65 65 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  ree;.  SELECT * 
7130: 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 31 20 74 33  FROM t3;.} {1 t3
7140: 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20  .1}.do_test     
7150: 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31      pager1.4.6.1
7160: 35 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  5 { file exists 
7170: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d  $::mj_filename }
7180: 20 20 7b 30 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a    {0}..db close.
7190: 74 76 20 64 65 6c 65 74 65 0a 0a 74 65 73 74 76  tv delete..testv
71a0: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
71b0: 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 35  .tv sectorsize 5
71c0: 31 32 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70  12.tv script cop
71d0: 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c  y_on_journal_del
71e0: 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78 44  ete.tv filter xD
71f0: 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f  elete.proc copy_
7200: 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74  on_journal_delet
7210: 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61  e {method filena
7220: 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20  me args} {.  if 
7230: 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a  {[string match *
7240: 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e 61 6d  journal $filenam
7250: 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  e]} faultsim_sav
7260: 65 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e .  return SQLI
7270: 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d  TE_OK.}.faultsim
7280: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
7290: 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  en.do_execsql_te
72a0: 73 74 20 70 61 67 65 72 31 2e 34 2e 37 2e 31 20  st pager1.4.7.1 
72b0: 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  {.  PRAGMA journ
72c0: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
72d0: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
72e0: 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45   t1(x PRIMARY KE
72f0: 59 2c 20 79 29 3b 0a 20 20 43 52 45 41 54 45 20  Y, y);.  CREATE 
7300: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 79  INDEX i1 ON t1(y
7310: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
7320: 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c 20   t1 VALUES('I', 
7330: 20 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53 45    'one');.  INSE
7340: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7350: 53 28 27 49 49 27 2c 20 20 27 66 6f 75 72 27 29  S('II',  'four')
7360: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
7370: 74 31 20 56 41 4c 55 45 53 28 27 49 49 49 27 2c  t1 VALUES('III',
7380: 20 27 6e 69 6e 65 27 29 3b 0a 20 20 42 45 47 49   'nine');.  BEGI
7390: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
73a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 56  TO t1 VALUES('IV
73b0: 27 2c 20 27 73 69 78 74 65 65 6e 27 29 3b 0a 20  ', 'sixteen');. 
73c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
73d0: 31 20 56 41 4c 55 45 53 28 27 56 27 20 2c 20 27  1 VALUES('V' , '
73e0: 74 77 65 6e 74 79 66 69 76 65 27 29 3b 0a 20 20  twentyfive');.  
73f0: 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65 6c 65 74  COMMIT;.} {delet
7400: 65 7d 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a  e}.tv filter {}.
7410: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
7420: 74 65 20 0a 63 61 74 63 68 20 7b 0a 20 20 74 65  te .catch {.  te
7430: 73 74 5f 73 79 73 63 61 6c 6c 20 69 6e 73 74 61  st_syscall insta
7440: 6c 6c 20 66 63 68 6d 6f 64 0a 20 20 74 65 73 74  ll fchmod.  test
7450: 5f 73 79 73 63 61 6c 6c 20 66 61 75 6c 74 20 31  _syscall fault 1
7460: 20 31 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   1.}.do_test pag
7470: 65 72 31 2e 34 2e 37 2e 32 20 7b 0a 20 20 66 61  er1.4.7.2 {.  fa
7480: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
7490: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 63 61 74 63  nd_reopen.  catc
74a0: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
74b0: 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  es test.db-journ
74c0: 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20  al -permissions 
74d0: 72 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74  r--------}.  cat
74e0: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
74f0: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
7500: 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 31 7d  nal -readonly 1}
7510: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
7520: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
7530: 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f  .} {1 {unable to
7540: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
7550: 69 6c 65 7d 7d 0a 63 61 74 63 68 20 7b 0a 20 20  ile}}.catch {.  
7560: 74 65 73 74 5f 73 79 73 63 61 6c 6c 20 72 65 73  test_syscall res
7570: 65 74 0a 20 20 74 65 73 74 5f 73 79 73 63 61 6c  et.  test_syscal
7580: 6c 20 66 61 75 6c 74 20 30 20 30 0a 7d 0a 64 6f  l fault 0 0.}.do
7590: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37  _test pager1.4.7
75a0: 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .3 {.  db close.
75b0: 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74    catch {file at
75c0: 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62  tributes test.db
75d0: 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69 73  -journal -permis
75e0: 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d  sions rw-rw-rw-}
75f0: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
7600: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
7610: 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64 6f  b-journal -reado
7620: 6e 6c 79 20 30 7d 0a 20 20 64 65 6c 65 74 65 5f  nly 0}.  delete_
7630: 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  file test.db-jou
7640: 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65 78 69 73  rnal.  file exis
7650: 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
7660: 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74  al.} {0}.do_test
7670: 20 70 61 67 65 72 31 2e 34 2e 38 2e 31 20 7b 0a   pager1.4.8.1 {.
7680: 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61 74    catch {file at
7690: 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64 62  tributes test.db
76a0: 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72 2d   -permissions r-
76b0: 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63 68  -------}.  catch
76c0: 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65   {file attribute
76d0: 73 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f  s test.db -reado
76e0: 6e 6c 79 20 31 7d 0a 20 20 73 71 6c 69 74 65 33  nly 1}.  sqlite3
76f0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62   db test.db.  db
7700: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a   eval { SELECT *
7710: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71 6c   FROM t1 }.  sql
7720: 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
7730: 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 31 7d 0a 64   db main.} {1}.d
7740: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
7750: 38 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  8.2 {.  sqlite3_
7760: 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 78  db_readonly db x
7770: 79 7a 0a 7d 20 7b 2d 31 7d 0a 64 6f 5f 74 65 73  yz.} {-1}.do_tes
7780: 74 20 70 61 67 65 72 31 2e 34 2e 38 2e 33 20 7b  t pager1.4.8.3 {
7790: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61  .  db close.  ca
77a0: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
77b0: 75 74 65 73 20 74 65 73 74 2e 64 62 20 2d 72 65  utes test.db -re
77c0: 61 64 6f 6e 6c 79 20 30 7d 0a 20 20 63 61 74 63  adonly 0}.  catc
77d0: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
77e0: 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72 6d  es test.db -perm
77f0: 69 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77  issions rw-rw-rw
7800: 2d 7d 20 6d 73 67 0a 20 20 73 71 6c 69 74 65 33  -} msg.  sqlite3
7810: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62   db test.db.  db
7820: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a   eval { SELECT *
7830: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71 6c   FROM t1 }.  sql
7840: 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
7850: 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 30 7d 0a 0a   db main.} {0}..
7860: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
7870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
78b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
78c0: 20 64 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69   deal with multi
78d0: 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a 23  -file commits..#
78e0: 0a 23 20 70 61 67 65 72 31 2d 35 2e 31 2e 2a 3a  .# pager1-5.1.*:
78f0: 20 54 68 65 20 63 61 73 65 20 77 68 65 72 65 20   The case where 
7900: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 61 6e  a multi-file can
7910: 6e 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  not be committed
7920: 20 62 65 63 61 75 73 65 0a 23 20 20 20 20 20 20   because.#      
7930: 20 20 20 20 20 20 20 20 20 61 6e 6f 74 68 65 72           another
7940: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
7950: 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44 20  olding a SHARED 
7960: 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  lock on one of t
7970: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
7980: 20 20 20 66 69 6c 65 73 2e 20 41 66 74 65 72 20     files. After 
7990: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  the SHARED lock 
79a0: 69 73 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 20  is removed, the 
79b0: 43 4f 4d 4d 49 54 20 73 75 63 63 65 65 64 73 2e  COMMIT succeeds.
79c0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 32 2e  .#.# pager1-5.2.
79d0: 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  *: Multi-file co
79e0: 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e  mmits with journ
79f0: 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a  al_mode=memory..
7a00: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 33 2e 2a  #.# pager1-5.3.*
7a10: 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  : Multi-file com
7a20: 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e 61  mits with journa
7a30: 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23  l_mode=memory..#
7a40: 0a 23 20 70 61 67 65 72 31 2d 35 2e 34 2e 2a 3a  .# pager1-5.4.*:
7a50: 20 43 68 65 63 6b 20 74 68 61 74 20 77 69 74 68   Check that with
7a60: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f 72   synchronous=nor
7a70: 6d 61 6c 2c 20 74 68 65 20 6d 61 73 74 65 72 2d  mal, the master-
7a80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20  journal file.#  
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
7aa0: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 61 20  e is added to a 
7ab0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
7ac0: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74  ediately after t
7ad0: 68 65 20 6c 61 73 74 0a 23 20 20 20 20 20 20 20  he last.#       
7ae0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
7af0: 72 65 63 6f 72 64 2e 20 42 75 74 20 77 69 74 68  record. But with
7b00: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75 6c   synchronous=ful
7b10: 6c 2c 20 65 78 74 72 61 20 75 6e 75 73 65 64 20  l, extra unused 
7b20: 73 70 61 63 65 0a 23 20 20 20 20 20 20 20 20 20  space.#         
7b30: 20 20 20 20 20 20 69 73 20 61 6c 6c 6f 63 61 74        is allocat
7b40: 65 64 20 62 65 74 77 65 65 6e 20 74 68 65 20 6c  ed between the l
7b50: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
7b60: 72 64 20 61 6e 64 20 74 68 65 20 0a 23 20 20 20  rd and the .#   
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 74              mast
7b80: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
7b90: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 74 68 65  name so that the
7ba0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7bb0: 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20  file.#          
7bc0: 20 20 20 20 20 6e 61 6d 65 20 64 6f 65 73 20 6e       name does n
7bd0: 6f 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 73 61  ot lie on the sa
7be0: 6d 65 20 73 65 63 74 6f 72 20 61 73 20 74 68 65  me sector as the
7bf0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 66 69   last journal fi
7c00: 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  le.#            
7c10: 20 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23 20 70     record..#.# p
7c20: 61 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43 68 65  ager1-5.5.*: Che
7c30: 63 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75 72 6e  ck that in journ
7c40: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 20  al_mode=PERSIST 
7c50: 6d 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61 6c 20  mode, a journal 
7c60: 66 69 6c 65 20 69 73 0a 23 20 20 20 20 20 20 20  file is.#       
7c70: 20 20 20 20 20 20 20 20 74 72 75 6e 63 61 74 65          truncate
7c80: 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
7c90: 77 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c  when a multi-fil
7ca0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
7cb0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
7cc0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e 73    committed (ins
7cd0: 74 65 61 64 20 6f 66 20 74 68 65 20 66 69 72 73  tead of the firs
7ce0: 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
7cf0: 73 20 62 65 69 6e 67 20 7a 65 72 6f 65 64 29 2e  s being zeroed).
7d00: 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  .#.#.do_test pag
7d10: 65 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20 66 61  er1-5.1.1 {.  fa
7d20: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
7d30: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
7d40: 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20  ql {.    ATTACH 
7d50: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75  'test.db2' AS au
7d60: 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  x;.    CREATE TA
7d70: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
7d80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
7d90: 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  ux.t2(a, b);.   
7da0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
7db0: 56 41 4c 55 45 53 28 31 37 2c 20 27 4c 65 6e 69  VALUES(17, 'Leni
7dc0: 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  n');.    INSERT 
7dd0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
7de0: 32 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a 20 20  2, 'Stalin');.  
7df0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7e00: 20 56 41 4c 55 45 53 28 35 33 2c 20 27 4b 68 72   VALUES(53, 'Khr
7e10: 75 73 68 63 68 65 76 27 29 3b 0a 20 20 7d 0a 7d  ushchev');.  }.}
7e20: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65   {}.do_test page
7e30: 72 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65 78 65  r1-5.1.2 {.  exe
7e40: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
7e50: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
7e60: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 34  NTO t1 VALUES(64
7e70: 2c 20 27 42 72 65 7a 68 6e 65 76 27 29 3b 0a 20  , 'Brezhnev');. 
7e80: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
7e90: 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t2 SELECT * FRO
7ea0: 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  M t1;.  }.  sqli
7eb0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32  te3 db2 test.db2
7ec0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7ed0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 45   BEGIN;.      SE
7ee0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
7ef0: 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f    } db2.} {}.do_
7f00: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e  test pager1-5.1.
7f10: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43  3 {.  catchsql C
7f20: 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61 74 61  OMMIT.} {1 {data
7f30: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
7f40: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7f50: 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  5.1.4 {.  execsq
7f60: 6c 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20 20 65  l COMMIT db2.  e
7f70: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20  xecsql COMMIT.  
7f80: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
7f90: 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32   * FROM t2 } db2
7fa0: 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32 32 20  .} {17 Lenin 22 
7fb0: 53 74 61 6c 69 6e 20 35 33 20 4b 68 72 75 73 68  Stalin 53 Khrush
7fc0: 63 68 65 76 20 36 34 20 42 72 65 7a 68 6e 65 76  chev 64 Brezhnev
7fd0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
7fe0: 2d 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32 20 63  -5.1.5 {.  db2 c
7ff0: 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  lose.} {}..do_te
8000: 73 74 20 70 61 67 65 72 31 2d 35 2e 32 2e 31 20  st pager1-5.2.1 
8010: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
8020: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
8030: 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 3b 0a  _mode = memory;.
8040: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
8050: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8060: 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72  VALUES(84, 'Andr
8070: 6f 70 6f 76 27 29 3b 0a 20 20 20 20 20 20 49 4e  opov');.      IN
8080: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
8090: 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f  UES(84, 'Andropo
80a0: 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  v');.    COMMIT;
80b0: 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d 0a  .  }.} {memory}.
80c0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
80d0: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
80e0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
80f0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66  urnal_mode = off
8100: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
8110: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8120: 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f  1 VALUES(85, 'Go
8130: 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20  rbachev');.     
8140: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
8150: 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62  VALUES(85, 'Gorb
8160: 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d  achev');.    COM
8170: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66 7d  MIT;.  }.} {off}
8180: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
8190: 2d 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20 63 6c  -5.4.1 {.  db cl
81a0: 6f 73 65 0a 20 20 74 65 73 74 76 66 73 20 74 76  ose.  testvfs tv
81b0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
81c0: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20  st.db -vfs tv.  
81d0: 65 78 65 63 73 71 6c 20 7b 20 41 54 54 41 43 48  execsql { ATTACH
81e0: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
81f0: 75 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c 74 65  ux }..  tv filte
8200: 72 20 78 44 65 6c 65 74 65 0a 20 20 74 76 20 73  r xDelete.  tv s
8210: 63 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72 6e 61  cript max_journa
8220: 6c 5f 73 69 7a 65 0a 20 20 74 76 20 73 65 63 74  l_size.  tv sect
8230: 6f 72 73 69 7a 65 20 35 31 32 0a 20 20 73 65 74  orsize 512.  set
8240: 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30   ::max_journal 0
8250: 0a 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f 75 72  .  proc max_jour
8260: 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68 6f 64  nal_size {method
8270: 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74   args} {.    set
8280: 20 73 7a 20 30 0a 20 20 20 20 63 61 74 63 68 20   sz 0.    catch 
8290: 7b 20 73 65 74 20 73 7a 20 5b 66 69 6c 65 20 73  { set sz [file s
82a0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
82b0: 6e 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20 7b 24  nal] }.    if {$
82c0: 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75 72  sz > $::max_jour
82d0: 6e 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  nal} {.      set
82e0: 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 24   ::max_journal $
82f0: 73 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  sz.    }.    ret
8300: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  urn SQLITE_OK.  
8310: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
8320: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
8330: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
8340: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
8350: 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b  ronous = NORMAL;
8360: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
8370: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
8380: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
8390: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20 20  bachev');.      
83a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
83b0: 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61  ALUES(85, 'Gorba
83c0: 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d  chev');.    COMM
83d0: 49 54 3b 0a 20 20 7d 0a 0a 20 20 23 20 54 68 65  IT;.  }..  # The
83e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
83f0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 77  rnal file is now
8400: 3a 0a 20 20 23 20 0a 20 20 23 20 20 20 31 29 20  :.  # .  #   1) 
8410: 35 31 32 20 62 79 74 65 20 68 65 61 64 65 72 20  512 byte header 
8420: 2b 0a 20 20 23 20 20 20 32 29 20 32 20 2a 20 28  +.  #   2) 2 * (
8430: 31 30 32 34 2b 38 29 20 62 79 74 65 20 72 65 63  1024+8) byte rec
8440: 6f 72 64 73 20 2b 0a 20 20 23 20 20 20 33 29 20  ords +.  #   3) 
8450: 32 30 2b 4e 20 62 79 74 65 73 20 6f 66 20 6d 61  20+N bytes of ma
8460: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
8470: 6e 74 65 72 2c 20 77 68 65 72 65 20 4e 20 69 73  nter, where N is
8480: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 0a 20 20   the size of .  
8490: 23 20 20 20 20 20 20 74 68 65 20 6d 61 73 74 65  #      the maste
84a0: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 65  r-journal name e
84b0: 6e 63 6f 64 65 64 20 61 73 20 75 74 66 2d 38 20  ncoded as utf-8 
84c0: 77 69 74 68 20 6e 6f 20 6e 75 6c 20 74 65 72 6d  with no nul term
84d0: 2e 0a 20 20 23 0a 20 20 73 65 74 20 6d 6a 5f 70  ..  #.  set mj_p
84e0: 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b 0a 20  ointer [expr {. 
84f0: 20 20 20 32 30 20 2b 20 5b 73 74 72 69 6e 67 20     20 + [string 
8500: 6c 65 6e 67 74 68 20 22 74 65 73 74 2e 64 62 2d  length "test.db-
8510: 6d 6a 58 58 58 58 58 58 39 58 58 22 5d 0a 20 20  mjXXXXXX9XX"].  
8520: 7d 5d 0a 20 20 23 0a 20 20 23 20 20 20 4e 4f 54  }].  #.  #   NOT
8530: 45 3a 20 46 6f 72 20 69 74 65 6d 20 33 20 61 62  E: For item 3 ab
8540: 6f 76 65 2c 20 69 66 20 74 68 65 20 63 75 72 72  ove, if the curr
8550: 65 6e 74 20 53 51 4c 69 74 65 20 56 46 53 20 6c  ent SQLite VFS l
8560: 61 63 6b 73 20 74 68 65 20 63 6f 6e 63 65 70 74  acks the concept
8570: 20 6f 66 20 61 0a 20 20 23 20 20 20 20 20 20 20   of a.  #       
8580: 20 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74    current direct
8590: 6f 72 79 2c 20 74 68 65 20 6c 65 6e 67 74 68 20  ory, the length 
85a0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  of the current d
85b0: 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 70 6c  irectory name pl
85c0: 75 73 20 31 0a 20 20 23 20 20 20 20 20 20 20 20  us 1.  #        
85d0: 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 74   character for t
85e0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 65 70  he directory sep
85f0: 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
8600: 20 61 72 65 20 4e 4f 54 20 63 6f 75 6e 74 65 64   are NOT counted
8610: 20 61 73 0a 20 20 23 20 20 20 20 20 20 20 20 20   as.  #         
8620: 70 61 72 74 20 6f 66 20 74 68 65 20 74 6f 74 61  part of the tota
8630: 6c 20 73 69 7a 65 3b 20 6f 74 68 65 72 77 69 73  l size; otherwis
8640: 65 2c 20 74 68 65 79 20 61 72 65 2e 0a 20 20 23  e, they are..  #
8650: 0a 20 20 69 66 63 61 70 61 62 6c 65 20 63 75 72  .  ifcapable cur
8660: 64 69 72 20 7b 0a 20 20 20 20 73 65 74 20 6d 6a  dir {.    set mj
8670: 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b  _pointer [expr {
8680: 24 6d 6a 5f 70 6f 69 6e 74 65 72 20 2b 20 5b 73  $mj_pointer + [s
8690: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67 65  tring length [ge
86a0: 74 5f 70 77 64 5d 5d 20 2b 20 31 7d 5d 0a 20 20  t_pwd]] + 1}].  
86b0: 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 61 78  }.  expr {$::max
86c0: 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 35 31 32 2b 32  _journal==(512+2
86d0: 2a 28 31 30 32 34 2b 38 29 2b 24 6d 6a 5f 70 6f  *(1024+8)+$mj_po
86e0: 69 6e 74 65 72 29 7d 0a 7d 20 31 0a 64 6f 5f 74  inter)}.} 1.do_t
86f0: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 32  est pager1-5.4.2
8700: 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a   {.  set ::max_j
8710: 6f 75 72 6e 61 6c 20 30 0a 20 20 65 78 65 63 73  ournal 0.  execs
8720: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
8730: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75  synchronous = fu
8740: 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ll;.    BEGIN;. 
8750: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
8760: 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27 4c   t1 WHERE b = 'L
8770: 65 6e 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c  enin';.      DEL
8780: 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52  ETE FROM t2 WHER
8790: 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20  E b = 'Lenin';. 
87a0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a     COMMIT;.  }..
87b0: 20 20 23 20 49 6e 20 73 79 6e 63 68 72 6f 6e 6f    # In synchrono
87c0: 75 73 3d 66 75 6c 6c 20 6d 6f 64 65 2c 20 74 68  us=full mode, th
87d0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
87e0: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
87f0: 77 72 69 74 74 65 6e 0a 20 20 23 20 64 69 72 65  written.  # dire
8800: 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c  ctly after the l
8810: 61 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68  ast record in th
8820: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
8830: 49 6e 73 74 65 61 64 2c 20 69 74 20 69 73 0a 20  Instead, it is. 
8840: 20 23 20 77 72 69 74 74 65 6e 20 73 74 61 72 74   # written start
8850: 69 6e 67 20 61 74 20 74 68 65 20 6e 65 78 74 20  ing at the next 
8860: 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 35 31  (in this case 51
8870: 32 20 62 79 74 65 29 20 73 65 63 74 6f 72 20 62  2 byte) sector b
8880: 6f 75 6e 64 61 72 79 2e 0a 20 20 23 0a 20 20 73  oundary..  #.  s
8890: 65 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b 65  et mj_pointer [e
88a0: 78 70 72 20 7b 0a 20 20 20 20 32 30 20 2b 20 5b  xpr {.    20 + [
88b0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 22 74  string length "t
88c0: 65 73 74 2e 64 62 2d 6d 6a 58 58 58 58 58 58 39  est.db-mjXXXXXX9
88d0: 58 58 22 5d 0a 20 20 7d 5d 0a 20 20 23 0a 20 20  XX"].  }].  #.  
88e0: 23 20 20 20 4e 4f 54 45 3a 20 49 66 20 74 68 65  #   NOTE: If the
88f0: 20 63 75 72 72 65 6e 74 20 53 51 4c 69 74 65 20   current SQLite 
8900: 56 46 53 20 6c 61 63 6b 73 20 74 68 65 20 63 6f  VFS lacks the co
8910: 6e 63 65 70 74 20 6f 66 20 61 20 63 75 72 72 65  ncept of a curre
8920: 6e 74 20 64 69 72 65 63 74 6f 72 79 2c 0a 20 20  nt directory,.  
8930: 23 20 20 20 20 20 20 20 20 20 74 68 65 20 6c 65  #         the le
8940: 6e 67 74 68 20 6f 66 20 74 68 65 20 63 75 72 72  ngth of the curr
8950: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ent directory na
8960: 6d 65 20 70 6c 75 73 20 31 20 63 68 61 72 61 63  me plus 1 charac
8970: 74 65 72 20 66 6f 72 20 74 68 65 0a 20 20 23 20  ter for the.  # 
8980: 20 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72          director
8990: 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
89a0: 61 63 74 65 72 20 61 72 65 20 4e 4f 54 20 63 6f  acter are NOT co
89b0: 75 6e 74 65 64 20 61 73 20 70 61 72 74 20 6f 66  unted as part of
89c0: 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 23 20 20   the total.  #  
89d0: 20 20 20 20 20 20 20 73 69 7a 65 3b 20 6f 74 68         size; oth
89e0: 65 72 77 69 73 65 2c 20 74 68 65 79 20 61 72 65  erwise, they are
89f0: 2e 0a 20 20 23 0a 20 20 69 66 63 61 70 61 62 6c  ..  #.  ifcapabl
8a00: 65 20 63 75 72 64 69 72 20 7b 0a 20 20 20 20 73  e curdir {.    s
8a10: 65 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b 65  et mj_pointer [e
8a20: 78 70 72 20 7b 24 6d 6a 5f 70 6f 69 6e 74 65 72  xpr {$mj_pointer
8a30: 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   + [string lengt
8a40: 68 20 5b 67 65 74 5f 70 77 64 5d 5d 20 2b 20 31  h [get_pwd]] + 1
8a50: 7d 5d 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 24  }].  }.  expr {$
8a60: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 3d 3d 28  ::max_journal==(
8a70: 28 28 35 31 32 2b 32 2a 28 31 30 32 34 2b 38 29  ((512+2*(1024+8)
8a80: 2b 35 31 31 29 2f 35 31 32 29 2a 35 31 32 20 2b  +511)/512)*512 +
8a90: 20 24 6d 6a 5f 70 6f 69 6e 74 65 72 29 7d 0a 7d   $mj_pointer)}.}
8aa0: 20 31 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64   1.db close.tv d
8ab0: 65 6c 65 74 65 0a 0a 64 6f 5f 74 65 73 74 20 70  elete..do_test p
8ac0: 61 67 65 72 31 2d 35 2e 35 2e 31 20 7b 0a 20 20  ager1-5.5.1 {.  
8ad0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
8ae0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  db.  execsql { .
8af0: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
8b00: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
8b10: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
8b20: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
8b30: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8b40: 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t3(a, b);.    
8b50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
8b60: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
8b70: 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
8b80: 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
8b90: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 33 20  ;.    UPDATE t3 
8ba0: 53 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d 62 6c  SET b = randombl
8bb0: 6f 62 28 31 35 30 31 29 3b 0a 20 20 7d 0a 20 20  ob(1501);.  }.  
8bc0: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
8bd0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d  test.db-journal]
8be0: 20 3e 20 31 35 30 30 30 0a 7d 20 7b 31 7d 0a 64   > 15000.} {1}.d
8bf0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
8c00: 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.2 {.  execsql 
8c10: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e  {.    PRAGMA syn
8c20: 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b  chronous = full;
8c30: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
8c40: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
8c50: 20 57 48 45 52 45 20 62 20 3d 20 27 53 74 61 6c   WHERE b = 'Stal
8c60: 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  in';.      DELET
8c70: 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  E FROM t2 WHERE 
8c80: 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20  b = 'Stalin';.  
8c90: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
8ca0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
8cb0: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
8cc0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
8cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
8d10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
8d20: 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52  ts work with "PR
8d30: 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f  AGMA max_page_co
8d40: 75 6e 74 22 0a 23 0a 64 6f 5f 74 65 73 74 20 70  unt".#.do_test p
8d50: 61 67 65 72 31 2d 36 2e 31 20 7b 0a 20 20 66 61  ager1-6.1 {.  fa
8d60: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
8d70: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
8d80: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
8d90: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6e 6f  auto_vacuum = no
8da0: 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d  ne;.    PRAGMA m
8db0: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20  ax_page_count = 
8dc0: 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  10;.    CREATE T
8dd0: 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20  ABLE t2(a, b);. 
8de0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
8df0: 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t3(a, b);.    CR
8e00: 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c  EATE TABLE t4(a,
8e10: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
8e20: 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29 3b 0a  TABLE t5(a, b);.
8e30: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8e40: 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t6(a, b);.    C
8e50: 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61  REATE TABLE t7(a
8e60: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
8e70: 20 54 41 42 4c 45 20 74 38 28 61 2c 20 62 29 3b   TABLE t8(a, b);
8e80: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8e90: 45 20 74 39 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t9(a, b);.    
8ea0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 30  CREATE TABLE t10
8eb0: 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20 7b 31  (a, b);.  }.} {1
8ec0: 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  0}.do_catchsql_t
8ed0: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 32 20 7b  est pager1-6.2 {
8ee0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
8ef0: 74 31 31 28 61 2c 20 62 29 0a 7d 20 7b 31 20 7b  t11(a, b).} {1 {
8f00: 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b  database or disk
8f10: 20 69 73 20 66 75 6c 6c 7d 7d 0a 64 6f 5f 65 78   is full}}.do_ex
8f20: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
8f30: 31 2d 36 2e 34 20 7b 20 50 52 41 47 4d 41 20 6d  1-6.4 { PRAGMA m
8f40: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 20 20  ax_page_count   
8f50: 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65 78 65     } {10}.do_exe
8f60: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
8f70: 2d 36 2e 35 20 7b 20 50 52 41 47 4d 41 20 6d 61  -6.5 { PRAGMA ma
8f80: 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31  x_page_count = 1
8f90: 35 20 7d 20 7b 31 35 7d 0a 64 6f 5f 65 78 65 63  5 } {15}.do_exec
8fa0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
8fb0: 36 2e 36 20 7b 20 43 52 45 41 54 45 20 54 41 42  6.6 { CREATE TAB
8fc0: 4c 45 20 74 31 31 28 61 2c 20 62 29 20 20 20 20  LE t11(a, b)    
8fd0: 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   } {}.do_execsql
8fe0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 37  _test pager1-6.7
8ff0: 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20   {.  BEGIN;.    
9000: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
9010: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
9020: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67    PRAGMA max_pag
9030: 65 5f 63 6f 75 6e 74 20 3d 20 31 33 3b 0a 7d 20  e_count = 13;.} 
9040: 7b 31 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {13}.do_execsql_
9050: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 38 20  test pager1-6.8 
9060: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
9070: 4f 20 74 31 31 20 56 41 4c 55 45 53 28 33 2c 20  O t11 VALUES(3, 
9080: 34 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d  4);.    PRAGMA m
9090: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20  ax_page_count = 
90a0: 31 30 3b 0a 7d 20 7b 31 31 7d 0a 64 6f 5f 65 78  10;.} {11}.do_ex
90b0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
90c0: 31 2d 36 2e 39 20 7b 20 43 4f 4d 4d 49 54 20 7d  1-6.9 { COMMIT }
90d0: 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {}..do_execsql_
90e0: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 30  test pager1-6.10
90f0: 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61   { PRAGMA max_pa
9100: 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 20 7d 20  ge_count = 10 } 
9110: 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {11}.do_execsql_
9120: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 31  test pager1-6.11
9130: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
9140: 20 74 31 31 20 7d 20 20 20 20 20 20 20 20 20 20   t11 }          
9150: 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 65 78 65  {1 2 3 4}.do_exe
9160: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
9170: 2d 36 2e 31 32 20 7b 20 50 52 41 47 4d 41 20 6d  -6.12 { PRAGMA m
9180: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 7d 20  ax_page_count } 
9190: 20 20 20 20 20 7b 31 31 7d 0a 0a 0a 23 2d 2d 2d       {11}...#---
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91e0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
91f0: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72  lowing tests wor
9200: 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41 20 6a  k with "PRAGMA j
9210: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e  ournal_mode=TRUN
9220: 43 41 54 45 22 20 61 6e 64 0a 23 20 22 50 52 41  CATE" and.# "PRA
9230: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
9240: 3d 45 58 43 4c 55 53 49 56 45 22 2e 0a 23 0a 23  =EXCLUSIVE"..#.#
9250: 20 45 61 63 68 20 74 65 73 74 20 69 73 20 73 70   Each test is sp
9260: 65 63 69 66 69 65 64 20 77 69 74 68 20 35 20 76  ecified with 5 v
9270: 61 72 69 61 62 6c 65 73 2e 20 41 73 20 66 6f 6c  ariables. As fol
9280: 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 24 74 6e 3a  lows:.#.#   $tn:
9290: 20 20 54 65 73 74 20 4e 75 6d 62 65 72 2e 20 55    Test Number. U
92a0: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
92b0: 68 65 20 5b 64 6f 5f 74 65 73 74 5d 20 74 65 73  he [do_test] tes
92c0: 74 20 6e 61 6d 65 73 2e 0a 23 20 20 20 24 73 71  t names..#   $sq
92d0: 6c 3a 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74  l: SQL to execut
92e0: 65 2e 0a 23 20 20 20 24 72 65 73 3a 20 45 78 70  e..#   $res: Exp
92f0: 65 63 74 65 64 20 72 65 73 75 6c 74 20 6f 66 20  ected result of 
9300: 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 2e 0a  executing $sql..
9310: 23 20 20 20 24 6a 73 3a 20 20 54 68 65 20 65 78  #   $js:  The ex
9320: 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20 74  pected size of t
9330: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
9340: 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74 65 72   in bytes, after
9350: 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20 20 20   executing.#    
9360: 20 20 20 20 20 74 68 65 20 53 51 4c 20 73 63 72       the SQL scr
9370: 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20 74 68  ipt. Or -1 if th
9380: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
9390: 20 65 78 70 65 63 74 65 64 20 74 6f 20 65 78 69   expected to exi
93a0: 73 74 2e 0a 23 20 20 20 24 77 73 3a 20 20 54 68  st..#   $ws:  Th
93b0: 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65 20  e expected size 
93c0: 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2c  of the WAL file,
93d0: 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74 65 72   in bytes, after
93e0: 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20 20 20   executing.#    
93f0: 20 20 20 20 20 74 68 65 20 53 51 4c 20 73 63 72       the SQL scr
9400: 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20 74 68  ipt. Or -1 if th
9410: 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 65 78 70  e WAL is not exp
9420: 65 63 74 65 64 20 74 6f 20 65 78 69 73 74 2e 0a  ected to exist..
9430: 23 0a 69 66 20 7b 24 3a 3a 73 71 6c 69 74 65 5f  #.if {$::sqlite_
9440: 6f 70 74 69 6f 6e 73 28 77 61 6c 29 20 26 26 20  options(wal) && 
9450: 5b 77 61 6c 5f 69 73 5f 6f 6b 5d 7d 20 7b 0a 20  [wal_is_ok]} {. 
9460: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
9470: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f  _and_reopen.  fo
9480: 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72 65  reach {tn sql re
9490: 73 20 6a 73 20 77 73 7d 20 5b 73 75 62 73 74 20  s js ws} [subst 
94a0: 7b 0a 20 20 0a 20 20 20 20 31 20 20 7b 0a 20 20  {.  .    1  {.  
94b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
94c0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
94d0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
94e0: 75 75 6d 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  uum=OFF;.      P
94f0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
9500: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
9510: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
9520: 3d 31 30 32 34 3b 0a 20 20 20 20 20 20 50 52 41  =1024;.      PRA
9530: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
9540: 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  =EXCLUSIVE;.    
9550: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
9560: 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 3b 0a  _mode=TRUNCATE;.
9570: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9580: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
9590: 29 3b 0a 20 20 20 20 7d 20 7b 65 78 63 6c 75 73  );.    } {exclus
95a0: 69 76 65 20 74 72 75 6e 63 61 74 65 7d 20 30 20  ive truncate} 0 
95b0: 2d 31 0a 20 20 0a 20 20 20 20 32 20 20 7b 0a 20  -1.  .    2  {. 
95c0: 20 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45 44       BEGIN IMMED
95d0: 49 41 54 45 3b 0a 20 20 20 20 20 20 20 20 53 45  IATE;.        SE
95e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
95f0: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
9600: 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20    } {1 2} 0 -1. 
9610: 20 0a 20 20 20 20 33 20 20 7b 0a 20 20 20 20 20   .    3  {.     
9620: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20   BEGIN;.        
9630: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
9640: 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ;.      COMMIT;.
9650: 20 20 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31      } {1 2} 0 -1
9660: 0a 20 20 0a 20 20 20 20 34 20 20 7b 20 50 52 41  .  .    4  { PRA
9670: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
9680: 20 3d 20 57 41 4c 20 7d 20 20 20 20 77 61 6c 20   = WAL }    wal 
9690: 20 20 20 20 20 20 2d 31 20 2d 31 0a 20 20 20 20        -1 -1.    
96a0: 35 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  5  { INSERT INTO
96b0: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
96c0: 20 7d 20 20 7b 7d 20 20 20 20 20 20 20 20 2d 31   }  {}        -1
96d0: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
96e0: 31 20 31 30 32 34 5d 0a 20 20 20 20 36 20 20 7b  1 1024].    6  {
96f0: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
9700: 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20  mode = NORMAL } 
9710: 65 78 63 6c 75 73 69 76 65 20 2d 31 20 5b 77 61  exclusive -1 [wa
9720: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30  l_file_size 1 10
9730: 32 34 5d 0a 20 20 20 20 37 20 20 7b 20 49 4e 53  24].    7  { INS
9740: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
9750: 45 53 28 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20  ES(5, 6); } {}  
9760: 20 20 20 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69        -1 [wal_fi
9770: 6c 65 5f 73 69 7a 65 20 32 20 31 30 32 34 5d 0a  le_size 2 1024].
9780: 20 20 0a 20 20 20 20 38 20 20 7b 20 50 52 41 47    .    8  { PRAG
9790: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
97a0: 3d 20 54 52 55 4e 43 41 54 45 20 7d 20 74 72 75  = TRUNCATE } tru
97b0: 6e 63 61 74 65 20 20 20 20 20 20 20 20 20 20 30  ncate          0
97c0: 20 2d 31 0a 20 20 20 20 39 20 20 7b 20 49 4e 53   -1.    9  { INS
97d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
97e0: 45 53 28 37 2c 20 38 29 20 7d 20 20 20 20 7b 7d  ES(7, 8) }    {}
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 30 20 2d 31 0a 20 20 20 20 31 30 20 7b 20 53 45  0 -1.    10 { SE
9810: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
9830: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 7d  1 2 3 4 5 6 7 8}
9840: 20 30 20 2d 31 0a 20 20 0a 20 20 7d 5d 20 7b 0a   0 -1.  .  }] {.
9850: 20 20 20 20 69 66 63 61 70 61 62 6c 65 20 65 6e      ifcapable en
9860: 61 62 6c 65 5f 70 65 72 73 69 73 74 5f 77 61 6c  able_persist_wal
9870: 20 7b 0a 20 20 20 20 20 20 66 69 6c 65 5f 63 6f   {.      file_co
9880: 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61  ntrol_persist_wa
9890: 6c 20 64 62 20 30 0a 20 20 20 20 7d 0a 20 20 20  l db 0.    }.   
98a0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
98b0: 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e   pager1-7.1.$tn.
98c0: 31 20 24 73 71 6c 20 24 72 65 73 0a 20 20 20 20  1 $sql $res.    
98d0: 63 61 74 63 68 20 7b 20 73 65 74 20 4a 20 2d 31  catch { set J -1
98e0: 20 3b 20 73 65 74 20 4a 20 5b 66 69 6c 65 20 73   ; set J [file s
98f0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
9900: 6e 61 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63 68  nal] }.    catch
9910: 20 7b 20 73 65 74 20 57 20 2d 31 20 3b 20 73 65   { set W -1 ; se
9920: 74 20 57 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  t W [file size t
9930: 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20 20  est.db-wal] }.  
9940: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
9950: 2d 37 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69 73  -7.1.$tn.2 { lis
9960: 74 20 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74 20  t $J $W } [list 
9970: 24 6a 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a  $js $ws].  }.}..
9980: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37  do_test pager1-7
9990: 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.1 {.  faultsi
99a0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
99b0: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
99c0: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
99d0: 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53  ng_mode = EXCLUS
99e0: 49 56 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20  IVE;.    CREATE 
99f0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
9a00: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
9a10: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
9a20: 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20  mode = delete;. 
9a30: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
9a40: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 74 72 75 6e 63  nal_mode = trunc
9a50: 61 74 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c  ate;.  }.} {excl
9a60: 75 73 69 76 65 20 64 65 6c 65 74 65 20 74 72 75  usive delete tru
9a70: 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70  ncate}.do_test p
9a80: 61 67 65 72 31 2d 37 2e 32 2e 32 20 7b 0a 20 20  ager1-7.2.2 {.  
9a90: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
9aa0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
9ab0: 31 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71  1, 2) }.  execsq
9ac0: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
9ad0: 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73  al_mode = persis
9ae0: 74 20 7d 0a 7d 20 7b 74 72 75 6e 63 61 74 65 7d  t }.} {truncate}
9af0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9b00: 37 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  7.2.3 {.  execsq
9b10: 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65  l { COMMIT }.  e
9b20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
9b30: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
9b40: 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20   = persist;.    
9b50: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73  PRAGMA journal_s
9b60: 69 7a 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d  ize_limit;.  }.}
9b70: 20 7b 70 65 72 73 69 73 74 20 2d 31 7d 0a 0a 23   {persist -1}..#
9b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
9bd0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c  following tests,
9be0: 20 70 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65 73   pager1-8.*, tes
9bf0: 74 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69  t that the speci
9c00: 61 6c 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23 20  al filenames .# 
9c10: 22 3a 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20 22  ":memory:" and "
9c20: 22 20 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72 79  " open temporary
9c30: 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f   databases..#.fo
9c40: 72 65 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61  reach {tn filena
9c50: 6d 65 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72  me} {.  1 :memor
9c60: 79 3a 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20  y:.  2 "".} {.  
9c70: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38  do_test pager1-8
9c80: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75  .$tn.1 {.    fau
9c90: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
9ca0: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 63  _reopen.    db c
9cb0: 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  lose.    sqlite3
9cc0: 20 64 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20   db $filename.  
9cd0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
9ce0: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
9cf0: 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  cuum = 1;.      
9d00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31 28  CREATE TABLE x1(
9d10: 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  x);.      INSERT
9d20: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
9d30: 27 43 68 61 72 6c 65 73 27 29 3b 0a 20 20 20 20  'Charles');.    
9d40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
9d50: 20 56 41 4c 55 45 53 28 27 4a 61 6d 65 73 27 29   VALUES('James')
9d60: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9d70: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 4d  NTO x1 VALUES('M
9d80: 61 72 79 27 29 3b 0a 20 20 20 20 20 20 53 45 4c  ary');.      SEL
9d90: 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a 20  ECT * FROM x1;. 
9da0: 20 20 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c 65     }.  } {Charle
9db0: 73 20 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a 20  s James Mary}.. 
9dc0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
9dd0: 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71  8.$tn.2 {.    sq
9de0: 6c 69 74 65 33 20 64 62 32 20 24 66 69 6c 65 6e  lite3 db2 $filen
9df0: 61 6d 65 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ame.    catchsql
9e00: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
9e10: 20 78 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31   x1 } db2.  } {1
9e20: 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   {no such table:
9e30: 20 78 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65 63   x1}}..  do_exec
9e40: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
9e50: 38 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42 45  8.$tn.3 {.    BE
9e60: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
9e70: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
9e80: 28 27 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20 20  ('William');.   
9e90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
9ea0: 31 20 56 41 4c 55 45 53 28 27 41 6e 6e 65 27 29  1 VALUES('Anne')
9eb0: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
9ec0: 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d    } {}.}..#-----
9ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f10: 2d 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20  ----.# The next 
9f20: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d  block of tests -
9f30: 20 70 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64 65   pager1-9.* - de
9f40: 61 6c 20 77 69 74 68 20 69 6e 74 65 72 61 63 74  al with interact
9f50: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 23 20 74  ions between.# t
9f60: 68 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  he pager and the
9f70: 20 62 61 63 6b 75 70 20 41 50 49 2e 20 54 65 73   backup API. Tes
9f80: 74 20 63 61 73 65 73 3a 0a 23 0a 23 20 20 20 70  t cases:.#.#   p
9f90: 61 67 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65 73  ager1-9.1.*: Tes
9fa0: 74 20 74 68 61 74 20 61 20 62 61 63 6b 75 70 20  t that a backup 
9fb0: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
9fc0: 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66 20 74  sfully even if t
9fd0: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
9fe0: 20 20 20 20 20 73 6f 75 72 63 65 20 64 62 20 69       source db i
9ff0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 75 72  s written to dur
a000: 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 6f  ing the backup o
a010: 70 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  p..#.#   pager1-
a020: 39 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  9.2.*: Test that
a030: 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65   a backup comple
a040: 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  tes successfully
a050: 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20   even if the.#  
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
a070: 6f 75 72 63 65 20 64 62 20 69 73 20 77 72 69 74  ource db is writ
a080: 74 65 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e 20  ten to and then 
a090: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 64 75 72 69  rolled back duri
a0a0: 6e 67 20 61 20 0a 23 20 20 20 20 20 20 20 20 20  ng a .#         
a0b0: 20 20 20 20 20 20 20 20 62 61 63 6b 75 70 20 6f          backup o
a0c0: 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  peration..#.do_t
a0d0: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 31  est pager1-9.0.1
a0e0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
a0f0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
a100: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
a110: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
a120: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
a130: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
a140: 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  10;.    BEGIN;. 
a150: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a160: 45 20 61 62 28 61 2c 20 62 2c 20 55 4e 49 51 55  E ab(a, b, UNIQU
a170: 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 20 20  E(a, b));.      
a180: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56  INSERT INTO ab V
a190: 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28  ALUES( a_string(
a1a0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
a1b0: 30 30 29 20 29 3b 0a 20 20 20 20 20 20 49 4e 53  00) );.      INS
a1c0: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
a1d0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
a1e0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
a1f0: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
a200: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
a210: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
a220: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
a230: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
a240: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
a250: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
a260: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
a270: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
a280: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
a290: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
a2a0: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
a2b0: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
a2c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
a2d0: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
a2e0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
a2f0: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
a300: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
a310: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
a320: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
a330: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
a340: 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  b;.      INSERT 
a350: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
a360: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
a370: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
a380: 20 61 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b   ab;.    COMMIT;
a390: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
a3a0: 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 32 20 7b  t pager1-9.0.2 {
a3b0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
a3c0: 65 73 74 2e 64 62 32 0a 20 20 64 62 32 20 65 76  est.db2.  db2 ev
a3d0: 61 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68  al { PRAGMA cach
a3e0: 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20  e_size = 10 }.  
a3f0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42  sqlite3_backup B
a400: 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69   db2 main db mai
a410: 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70  n.  list [B step
a420: 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73   10000] [B finis
a430: 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e  h].} {SQLITE_DON
a440: 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f  E SQLITE_OK}.do_
a450: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e  test pager1-9.0.
a460: 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c  3 {. db one {SEL
a470: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
a480: 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32   FROM ab}.} [db2
a490: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35   one {SELECT md5
a4a0: 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61  sum(a, b) FROM a
a4b0: 62 7d 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  b}]..do_test pag
a4c0: 65 72 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78  er1-9.1.1 {.  ex
a4d0: 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61  ecsql { UPDATE a
a4e0: 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69  b SET a = a_stri
a4f0: 6e 67 28 32 30 31 29 20 7d 0a 20 20 73 71 6c 69  ng(201) }.  sqli
a500: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
a510: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
a520: 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c  B step 30.} {SQL
a530: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
a540: 70 61 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a 20  pager1-9.1.2 {. 
a550: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
a560: 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73  E ab SET b = a_s
a570: 74 72 69 6e 67 28 33 30 31 29 20 7d 0a 20 20 6c  tring(301) }.  l
a580: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
a590: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
a5a0: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
a5b0: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
a5c0: 70 61 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a 20  pager1-9.1.3 {. 
a5d0: 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  db one {SELECT m
a5e0: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
a5f0: 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20   ab}.} [db2 one 
a600: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
a610: 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64  , b) FROM ab}].d
a620: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
a630: 31 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20  1.4 { execsql { 
a640: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
a650: 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38  FROM ab } } {128
a660: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
a670: 31 2d 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63  1-9.2.1 {.  exec
a680: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20  sql { UPDATE ab 
a690: 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67  SET a = a_string
a6a0: 28 32 30 32 29 20 7d 0a 20 20 73 71 6c 69 74 65  (202) }.  sqlite
a6b0: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d  3_backup B db2 m
a6c0: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20  ain db main.  B 
a6d0: 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54  step 30.} {SQLIT
a6e0: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
a6f0: 67 65 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20 65  ger1-9.2.2 {.  e
a700: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45  xecsql { .    BE
a710: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
a720: 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73  E ab SET b = a_s
a730: 74 72 69 6e 67 28 33 30 31 29 3b 0a 20 20 20 20  tring(301);.    
a740: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20  ROLLBACK;.  }.  
a750: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
a760: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
a770: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
a780: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
a790: 20 70 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b 0a   pager1-9.2.3 {.
a7a0: 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20   db one {SELECT 
a7b0: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
a7c0: 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65  M ab}.} [db2 one
a7d0: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
a7e0: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a  a, b) FROM ab}].
a7f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
a800: 2e 32 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b  .2.4 { execsql {
a810: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
a820: 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32   FROM ab } } {12
a830: 38 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20  8}.db close.db2 
a840: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70  close..do_test p
a850: 61 67 65 72 31 2d 39 2e 33 2e 31 20 7b 0a 20 20  ager1-9.3.1 {.  
a860: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
a870: 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74 6f  ult 1.  tv secto
a880: 72 73 69 7a 65 20 34 30 39 36 0a 20 20 66 61 75  rsize 4096.  fau
a890: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
a8a0: 5f 72 65 6f 70 65 6e 0a 0a 20 20 65 78 65 63 73  _reopen..  execs
a8b0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 70 61 67 65  ql { PRAGMA page
a8c0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 20 7d 0a 20  _size = 1024 }. 
a8d0: 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20   for {set ii 0} 
a8e0: 7b 24 69 69 20 3c 20 34 7d 20 7b 69 6e 63 72 20  {$ii < 4} {incr 
a8f0: 69 69 7d 20 7b 20 65 78 65 63 73 71 6c 20 22 43  ii} { execsql "C
a900: 52 45 41 54 45 20 54 41 42 4c 45 20 74 24 7b 69  REATE TABLE t${i
a910: 69 7d 28 61 2c 20 62 29 22 20 7d 0a 7d 20 7b 7d  i}(a, b)" }.} {}
a920: 0a 69 66 20 7b 5b 6e 6f 6e 7a 65 72 6f 5f 72 65  .if {[nonzero_re
a930: 73 65 72 76 65 64 5f 62 79 74 65 73 5d 7d 20 7b  served_bytes]} {
a940: 0a 20 20 23 20 62 61 63 6b 75 70 20 77 69 74 68  .  # backup with
a950: 20 61 20 70 61 67 65 20 73 69 7a 65 20 63 68 61   a page size cha
a960: 6e 67 65 73 20 69 73 20 6e 6f 74 20 70 6f 73 73  nges is not poss
a970: 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 63 6f  ible with the co
a980: 64 65 63 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  dec.  #.  do_tes
a990: 74 20 70 61 67 65 72 31 2d 39 2e 33 2e 32 63 6f  t pager1-9.3.2co
a9a0: 64 65 63 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  dec {.    sqlite
a9b0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20  3 db2 test.db2. 
a9c0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
a9d0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
a9e0: 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  ize = 4096;.    
a9f0: 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
aa00: 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20  nous = OFF;.    
aa10: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
aa20: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43  1(a, b);.      C
aa30: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
aa40: 2c 20 62 29 3b 0a 20 20 20 20 7d 20 64 62 32 0a  , b);.    } db2.
aa50: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
aa60: 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62  up B db2 main db
aa70: 20 6d 61 69 6e 0a 20 20 20 20 42 20 73 74 65 70   main.    B step
aa80: 20 33 30 0a 20 20 20 20 6c 69 73 74 20 5b 42 20   30.    list [B 
aa90: 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66  step 10000] [B f
aaa0: 69 6e 69 73 68 5d 0a 20 20 7d 20 7b 53 51 4c 49  inish].  } {SQLI
aab0: 54 45 5f 52 45 41 44 4f 4e 4c 59 20 53 51 4c 49  TE_READONLY SQLI
aac0: 54 45 5f 52 45 41 44 4f 4e 4c 59 7d 0a 20 20 64  TE_READONLY}.  d
aad0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
aae0: 33 2e 33 63 6f 64 65 63 20 7b 0a 20 20 20 20 64  3.3codec {.    d
aaf0: 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 64 62 20  b2 close.    db 
ab00: 63 6c 6f 73 65 0a 20 20 20 20 74 76 20 64 65 6c  close.    tv del
ab10: 65 74 65 0a 20 20 20 20 66 69 6c 65 20 73 69 7a  ete.    file siz
ab20: 65 20 74 65 73 74 2e 64 62 32 0a 20 20 7d 20 5b  e test.db2.  } [
ab30: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
ab40: 62 32 5d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 64  b2].} else {.  d
ab50: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
ab60: 33 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  3.2 {.    sqlite
ab70: 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20  3 db2 test.db2. 
ab80: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
ab90: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
aba0: 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  ize = 4096;.    
abb0: 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
abc0: 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20  nous = OFF;.    
abd0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
abe0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43  1(a, b);.      C
abf0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
ac00: 2c 20 62 29 3b 0a 20 20 20 20 7d 20 64 62 32 0a  , b);.    } db2.
ac10: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
ac20: 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62  up B db2 main db
ac30: 20 6d 61 69 6e 0a 20 20 20 20 42 20 73 74 65 70   main.    B step
ac40: 20 33 30 0a 20 20 20 20 6c 69 73 74 20 5b 42 20   30.    list [B 
ac50: 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66  step 10000] [B f
ac60: 69 6e 69 73 68 5d 0a 20 20 7d 20 7b 53 51 4c 49  inish].  } {SQLI
ac70: 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f  TE_DONE SQLITE_O
ac80: 4b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  K}.  do_test pag
ac90: 65 72 31 2d 39 2e 33 2e 33 20 7b 0a 20 20 20 20  er1-9.3.3 {.    
aca0: 64 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 64 62  db2 close.    db
acb0: 20 63 6c 6f 73 65 0a 20 20 20 20 74 76 20 64 65   close.    tv de
acc0: 6c 65 74 65 0a 20 20 20 20 66 69 6c 65 20 73 69  lete.    file si
acd0: 7a 65 20 74 65 73 74 2e 64 62 32 0a 20 20 7d 20  ze test.db2.  } 
ace0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
acf0: 64 62 5d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  db].}..do_test p
ad00: 61 67 65 72 31 2d 39 2e 34 2e 31 20 7b 0a 20 20  ager1-9.4.1 {.  
ad10: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
ad20: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c  and_reopen.  sql
ad30: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
ad40: 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  2.  execsql {.  
ad50: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
ad60: 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 43  ze = 4096;.    C
ad70: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
ad80: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
ad90: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
ada0: 0a 20 20 7d 20 64 62 32 0a 20 20 73 71 6c 69 74  .  } db2.  sqlit
adb0: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
adc0: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c  main db main.  l
add0: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
ade0: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
adf0: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
ae00: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
ae10: 70 61 67 65 72 31 2d 39 2e 34 2e 32 20 7b 0a 20  pager1-9.4.2 {. 
ae20: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65   list [file size
ae30: 20 74 65 73 74 2e 64 62 32 5d 20 5b 66 69 6c 65   test.db2] [file
ae40: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 7d   size test.db].}
ae50: 20 7b 31 30 32 34 20 30 7d 0a 64 62 32 20 63 6c   {1024 0}.db2 cl
ae60: 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ose..#----------
ae70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
aeb0: 23 20 54 65 73 74 20 74 68 61 74 20 72 65 67 61  # Test that rega
aec0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
aed0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
aee0: 78 53 65 63 74 6f 72 53 69 7a 65 28 29 2c 20 74  xSectorSize(), t
aef0: 68 65 0a 23 20 6d 69 6e 69 6d 75 6d 20 65 66 66  he.# minimum eff
af00: 65 63 74 69 76 65 20 73 65 63 74 6f 72 2d 73 69  ective sector-si
af10: 7a 65 20 69 73 20 35 31 32 20 61 6e 64 20 74 68  ze is 512 and th
af20: 65 20 6d 61 78 69 6d 75 6d 20 36 35 35 33 36 20  e maximum 65536 
af30: 62 79 74 65 73 2e 0a 23 0a 74 65 73 74 76 66 73  bytes..#.testvfs
af40: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 66   tv -default 1.f
af50: 6f 72 65 61 63 68 20 73 65 63 74 6f 72 73 69 7a  oreach sectorsiz
af60: 65 20 7b 0a 20 20 20 20 31 36 0a 20 20 20 20 33  e {.    16.    3
af70: 32 20 20 20 36 34 20 20 20 31 32 38 20 20 20 32  2   64   128   2
af80: 35 36 20 20 20 35 31 32 20 20 20 31 30 32 34 20  56   512   1024 
af90: 20 20 32 30 34 38 20 0a 20 20 20 20 34 30 39 36    2048 .    4096
afa0: 20 38 31 39 32 20 31 36 33 38 34 20 33 32 37 36   8192 16384 3276
afb0: 38 20 36 35 35 33 36 20 31 33 31 30 37 32 20 32  8 65536 131072 2
afc0: 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74 76 20 73  62144.} {.  tv s
afd0: 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63 74 6f  ectorsize $secto
afe0: 72 73 69 7a 65 0a 20 20 74 76 20 64 65 76 63 68  rsize.  tv devch
aff0: 61 72 20 7b 7d 0a 20 20 73 65 74 20 65 66 66 20  ar {}.  set eff 
b000: 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 69 66  $sectorsize.  if
b010: 20 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3c 20   {$sectorsize < 
b020: 35 31 32 7d 20 20 20 7b 20 73 65 74 20 65 66 66  512}   { set eff
b030: 20 35 31 32 20 7d 0a 20 20 69 66 20 7b 24 73 65   512 }.  if {$se
b040: 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33 36  ctorsize > 65536
b050: 7d 20 7b 20 73 65 74 20 65 66 66 20 36 35 35 33  } { set eff 6553
b060: 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70  6 }..  do_test p
b070: 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72  ager1-10.$sector
b080: 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20 66 61 75  size.1 {.    fau
b090: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
b0a0: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66  _reopen.    db f
b0b0: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
b0c0: 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71  tring.    execsq
b0d0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
b0e0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
b0f0: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20 50  PERSIST;.      P
b100: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
b110: 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20 42 45  = 1024;.      BE
b120: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45  GIN;.        CRE
b130: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
b140: 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  b);.        CREA
b150: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
b160: 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  );.        CREAT
b170: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29  E TABLE t3(a, b)
b180: 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ;.      COMMIT;.
b190: 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73      }.    file s
b1a0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
b1b0: 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24 73  nal.  } [expr $s
b1c0: 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33  ectorsize > 6553
b1d0: 36 20 3f 20 36 35 35 33 36 20 3a 20 28 24 73 65  6 ? 65536 : ($se
b1e0: 63 74 6f 72 73 69 7a 65 3c 33 32 20 3f 20 35 31  ctorsize<32 ? 51
b1f0: 32 20 3a 20 24 73 65 63 74 6f 72 73 69 7a 65 29  2 : $sectorsize)
b200: 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  ]..  do_test pag
b210: 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69  er1-10.$sectorsi
b220: 7a 65 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  ze.2 {.    execs
b230: 71 6c 20 7b 20 0a 20 20 20 20 20 20 49 4e 53 45  ql { .      INSE
b240: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
b250: 53 28 61 5f 73 74 72 69 6e 67 28 33 30 30 29 2c  S(a_string(300),
b260: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b   a_string(300));
b270: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
b280: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46  TO t3 SELECT * F
b290: 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f  ROM t3;        /
b2a0: 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  2 */.      IN
b2b0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
b2c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20  ECT * FROM t3;  
b2d0: 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20        /*  4 */. 
b2e0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
b2f0: 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t3 SELECT * FRO
b300: 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20  M t3;        /* 
b310: 20 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   8 */.      INSE
b320: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
b330: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20  T * FROM t3;    
b340: 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20      /* 16 */.   
b350: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
b360: 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  3 SELECT * FROM 
b370: 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 33 32  t3;        /* 32
b380: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d   */.    }.  } {}
b390: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
b3a0: 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a  r1-10.$sectorsiz
b3b0: 65 2e 33 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f  e.3 {.    db clo
b3c0: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  se.    sqlite3 d
b3d0: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  b test.db.    ex
b3e0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 50  ecsql { .      P
b3f0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
b400: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 42 45 47   = 10;.      BEG
b410: 49 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  IN;.    }.    re
b420: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 33  cursive_select 3
b430: 32 20 74 33 20 7b 64 62 20 65 76 61 6c 20 22 49  2 t3 {db eval "I
b440: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
b450: 4c 55 45 53 28 31 2c 20 32 29 22 7d 0a 20 20 20  LUES(1, 2)"}.   
b460: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
b470: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53   COMMIT;.      S
b480: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
b490: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d  .    }.  } {1 2}
b4a0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
b4b0: 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a  r1-10.$sectorsiz
b4c0: 65 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71  e.4 {.    execsq
b4d0: 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
b4e0: 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b   TABLE t6(a, b);
b4f0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
b500: 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a 20 20  BLE t7(a, b);.  
b510: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
b520: 20 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t5(a, b);.     
b530: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 36 3b 0a   DROP TABLE t6;.
b540: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
b550: 20 74 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   t7;.    }.    e
b560: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42  xecsql {.      B
b570: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52  EGIN;.        CR
b580: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c  EATE TABLE t6(a,
b590: 20 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   b);.    }.    r
b5a0: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
b5b0: 33 32 20 74 33 20 7b 64 62 20 65 76 61 6c 20 22  32 t3 {db eval "
b5c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
b5d0: 41 4c 55 45 53 28 31 2c 20 32 29 22 7d 0a 20 20  ALUES(1, 2)"}.  
b5e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
b5f0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20    COMMIT;.      
b600: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35  SELECT * FROM t5
b610: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32  ;.    }.  } {1 2
b620: 7d 0a 20 20 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a  }.  .}.db close.
b630: 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34  .tv sectorsize 4
b640: 30 39 36 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  096.do_test page
b650: 72 31 2e 31 30 2e 78 2e 31 20 7b 0a 20 20 66 61  r1.10.x.1 {.  fa
b660: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
b670: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
b680: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
b690: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6e 6f  auto_vacuum = no
b6a0: 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  ne;.    PRAGMA p
b6b0: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
b6c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
b6d0: 45 20 74 31 28 78 29 3b 0a 20 20 7d 0a 20 20 66  E t1(x);.  }.  f
b6e0: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
b6f0: 3c 33 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  <30} {incr i} {.
b700: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
b710: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
b720: 55 45 53 28 7a 65 72 6f 62 6c 6f 62 28 39 30 30  UES(zeroblob(900
b730: 29 29 20 7d 0a 20 20 7d 0a 20 20 66 69 6c 65 20  )) }.  }.  file 
b740: 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b  size test.db.} {
b750: 33 32 37 36 38 7d 0a 64 6f 5f 74 65 73 74 20 70  32768}.do_test p
b760: 61 67 65 72 31 2e 31 30 2e 78 2e 32 20 7b 0a 20  ager1.10.x.2 {. 
b770: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
b780: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
b790: 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c  );.    DROP TABL
b7a0: 45 20 74 32 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  E t2;.  }.  file
b7b0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
b7c0: 7b 33 33 37 39 32 7d 0a 64 6f 5f 74 65 73 74 20  {33792}.do_test 
b7d0: 70 61 67 65 72 31 2e 31 30 2e 78 2e 33 20 7b 0a  pager1.10.x.3 {.
b7e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
b7f0: 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54  BEGIN;.    CREAT
b800: 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20  E TABLE t2(x);. 
b810: 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73   }.  recursive_s
b820: 65 6c 65 63 74 20 33 30 20 74 31 0a 20 20 65 78  elect 30 t1.  ex
b830: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
b840: 54 45 20 54 41 42 4c 45 20 74 33 28 78 29 3b 0a  TE TABLE t3(x);.
b850: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
b860: 7d 20 7b 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74  } {}..db close.t
b870: 76 20 64 65 6c 65 74 65 0a 0a 74 65 73 74 76 66  v delete..testvf
b880: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
b890: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
b8a0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75  and_reopen.db fu
b8b0: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
b8c0: 72 69 6e 67 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ring.do_execsql_
b8d0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 31  test pager1-11.1
b8e0: 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72   {.  PRAGMA jour
b8f0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
b900: 45 3b 0a 20 20 50 52 41 47 4d 41 20 63 61 63 68  E;.  PRAGMA cach
b910: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42  e_size = 10;.  B
b920: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
b930: 20 54 41 42 4c 45 20 7a 7a 28 74 6f 70 20 50 52   TABLE zz(top PR
b940: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
b950: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 56  INSERT INTO zz V
b960: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32  ALUES(a_string(2
b970: 32 32 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  22));.    INSERT
b980: 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20   INTO zz SELECT 
b990: 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54  a_string((SELECT
b9a0: 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20   222+max(rowid) 
b9b0: 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a  FROM zz)) FROM z
b9c0: 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  z;.    INSERT IN
b9d0: 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73  TO zz SELECT a_s
b9e0: 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32  tring((SELECT 22
b9f0: 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f  2+max(rowid) FRO
ba00: 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a  M zz)) FROM zz;.
ba10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ba20: 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  zz SELECT a_stri
ba30: 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d  ng((SELECT 222+m
ba40: 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a  ax(rowid) FROM z
ba50: 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20  z)) FROM zz;.   
ba60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20   INSERT INTO zz 
ba70: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
ba80: 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28  (SELECT 222+max(
ba90: 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29  rowid) FROM zz))
baa0: 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e   FROM zz;.    IN
bab0: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c  SERT INTO zz SEL
bac0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45  ECT a_string((SE
bad0: 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77  LECT 222+max(row
bae0: 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52  id) FROM zz)) FR
baf0: 4f 4d 20 7a 7a 3b 0a 20 20 43 4f 4d 4d 49 54 3b  OM zz;.  COMMIT;
bb00: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 55 50  .  BEGIN;.    UP
bb10: 44 41 54 45 20 7a 7a 20 53 45 54 20 74 6f 70 20  DATE zz SET top 
bb20: 3d 20 61 5f 73 74 72 69 6e 67 28 33 34 35 29 3b  = a_string(345);
bb30: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 0a 70 72 6f  .} {delete}..pro
bb40: 63 20 6c 6f 63 6b 6f 75 74 20 7b 6d 65 74 68 6f  c lockout {metho
bb50: 64 20 61 72 67 73 7d 20 7b 20 72 65 74 75 72 6e  d args} { return
bb60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7d 0a   SQLITE_IOERR }.
bb70: 74 76 20 73 63 72 69 70 74 20 6c 6f 63 6b 6f 75  tv script lockou
bb80: 74 0a 74 76 20 66 69 6c 74 65 72 20 7b 78 57 72  t.tv filter {xWr
bb90: 69 74 65 20 78 54 72 75 6e 63 61 74 65 20 78 53  ite xTruncate xS
bba0: 79 6e 63 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  ync}.do_catchsql
bbb0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e  _test pager1-11.
bbc0: 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 31 20  2 { COMMIT } {1 
bbd0: 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d  {disk I/O error}
bbe0: 7d 0a 0a 74 76 20 73 63 72 69 70 74 20 7b 7d 0a  }..tv script {}.
bbf0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
bc00: 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  1.3 {.  sqlite3 
bc10: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78  db2 test.db.  ex
bc20: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
bc30: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
bc40: 3d 20 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20  = TRUNCATE;.    
bc50: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
bc60: 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 64 62 32 0a  _check;.  } db2.
bc70: 7d 20 7b 74 72 75 6e 63 61 74 65 20 6f 6b 7d 0a  } {truncate ok}.
bc80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
bc90: 31 2e 34 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73  1.4 {.  db2 clos
bca0: 65 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20  e.  file exists 
bcb0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
bcc0: 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {0}.do_execsql
bcd0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e  _test pager1-11.
bce0: 35 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  5 { SELECT count
bcf0: 28 2a 29 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b 33  (*) FROM zz } {3
bd00: 32 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  2}.db close.tv d
bd10: 65 6c 65 74 65 0a 20 20 0a 23 2d 2d 2d 2d 2d 2d  elete.  .#------
bd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd60: 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50 52 41 47  ---.# Test "PRAG
bd70: 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a 23 0a  MA page_size".#.
bd80: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
bd90: 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73  ult 1.tv sectors
bda0: 69 7a 65 20 31 30 32 34 0a 66 6f 72 65 61 63 68  ize 1024.foreach
bdb0: 20 70 61 67 65 73 69 7a 65 20 7b 0a 20 20 20 20   pagesize {.    
bdc0: 35 31 32 20 20 20 31 30 32 34 20 20 20 32 30 34  512   1024   204
bdd0: 38 20 34 30 39 36 20 38 31 39 32 20 31 36 33 38  8 4096 8192 1638
bde0: 34 20 33 32 37 36 38 20 0a 7d 20 7b 0a 20 20 66  4 32768 .} {.  f
bdf0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
be00: 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 23 20 54  nd_reopen..  # T
be10: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 28  he sector-size (
be20: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
be30: 20 56 46 53 29 20 69 73 20 31 30 32 34 20 62 79   VFS) is 1024 by
be40: 74 65 73 2e 20 53 6f 20 69 66 20 74 68 65 0a 20  tes. So if the. 
be50: 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72 65 71   # page-size req
be60: 75 65 73 74 65 64 20 75 73 69 6e 67 20 22 50 52  uested using "PR
be70: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 20  AGMA page_size" 
be80: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
be90: 74 68 65 0a 20 20 23 20 63 6f 6d 70 69 6c 65 20  the.  # compile 
bea0: 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51  time value of SQ
beb0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
bec0: 5a 45 2c 20 74 68 65 6e 20 74 68 65 20 65 66 66  ZE, then the eff
bed0: 65 63 74 69 76 65 20 0a 20 20 23 20 70 61 67 65  ective .  # page
bee0: 2d 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 31 30  -size remains 10
bef0: 32 34 20 62 79 74 65 73 2e 0a 20 20 23 0a 20 20  24 bytes..  #.  
bf00: 73 65 74 20 65 66 66 20 24 70 61 67 65 73 69 7a  set eff $pagesiz
bf10: 65 0a 20 20 69 66 20 7b 24 65 66 66 20 3e 20 24  e.  if {$eff > $
bf20: 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  ::SQLITE_MAX_PAG
bf30: 45 5f 53 49 5a 45 7d 20 7b 20 73 65 74 20 65 66  E_SIZE} { set ef
bf40: 66 20 31 30 32 34 20 7d 0a 0a 20 20 64 6f 5f 74  f 1024 }..  do_t
bf50: 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70  est pager1-12.$p
bf60: 61 67 65 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20  agesize.1 {.    
bf70: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
bf80: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
bf90: 22 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70  ".      PRAGMA p
bfa0: 61 67 65 5f 73 69 7a 65 20 3d 20 24 70 61 67 65  age_size = $page
bfb0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 43 52 45 41  size;.      CREA
bfc0: 54 45 20 56 49 45 57 20 76 20 41 53 20 53 45 4c  TE VIEW v AS SEL
bfd0: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
bfe0: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 22 20  e_master;.    " 
bff0: 64 62 32 0a 20 20 20 20 66 69 6c 65 20 73 69 7a  db2.    file siz
c000: 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 24 65  e test.db.  } $e
c010: 66 66 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  ff.  do_test pag
c020: 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65  er1-12.$pagesize
c030: 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .2 {.    sqlite3
c040: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20   db2 test.db.   
c050: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
c060: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
c070: 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20  ) FROM v;.      
c080: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65  PRAGMA main.page
c090: 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 20 64 62 32  _size;.    } db2
c0a0: 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 66  .  } [list 1 $ef
c0b0: 66 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  f].  do_test pag
c0c0: 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65  er1-12.$pagesize
c0d0: 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .3 {.    execsql
c0e0: 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54   { .      SELECT
c0f0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76   count(*) FROM v
c100: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d  ;.      PRAGMA m
c110: 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20  ain.page_size;. 
c120: 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 31     }.  } [list 1
c130: 20 24 65 66 66 5d 0a 20 20 64 62 32 20 63 6c 6f   $eff].  db2 clo
c140: 73 65 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  se.}.db close.tv
c150: 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d   delete..#------
c160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1a0: 2d 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63 61  ---.# Test speca
c1b0: 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  l "PRAGMA journa
c1c0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
c1d0: 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20  test cases..#.# 
c1e0: 70 61 67 65 72 31 2d 31 33 2e 31 2e 2a 3a 20 54  pager1-13.1.*: T
c1f0: 68 69 73 20 74 65 73 74 73 20 61 20 73 70 65 63  his tests a spec
c200: 69 61 6c 20 63 61 73 65 20 65 6e 63 6f 75 6e 74  ial case encount
c210: 65 72 65 64 20 69 6e 20 70 65 72 73 69 73 74 65  ered in persiste
c220: 6e 74 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  nt .#           
c230: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64       journal mod
c240: 65 3a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  e: If the journa
c250: 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  l associated wit
c260: 68 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  h a transaction.
c270: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
c280: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
c290: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c2a0: 65 20 28 62 65 63 61 75 73 65 20 61 20 70 72 65  e (because a pre
c2b0: 76 69 6f 75 73 20 0a 23 20 20 20 20 20 20 20 20  vious .#        
c2c0: 20 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74          transact
c2d0: 69 6f 6e 20 6c 65 66 74 20 61 20 76 65 72 79 20  ion left a very 
c2e0: 6c 61 72 67 65 20 6e 6f 6e 2d 68 6f 74 20 6a 6f  large non-hot jo
c2f0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68  urnal file in th
c300: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
c310: 20 20 20 66 69 6c 65 2d 73 79 73 74 65 6d 29 2c     file-system),
c320: 20 74 68 65 6e 20 53 51 4c 69 74 65 20 68 61 73   then SQLite has
c330: 20 74 6f 20 62 65 20 63 61 72 65 66 75 6c 20 74   to be careful t
c340: 68 61 74 20 74 68 65 72 65 20 69 73 0a 23 20 20  hat there is.#  
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f                no
c360: 74 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  t a journal-head
c370: 65 72 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  er left over fro
c380: 6d 20 61 20 70 72 65 76 69 6f 75 73 20 74 72 61  m a previous tra
c390: 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20  nsaction.#      
c3a0: 20 20 20 20 20 20 20 20 20 20 69 6d 6d 65 64 69            immedi
c3b0: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
c3c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  the journal cont
c3d0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
c3e0: 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  ..#             
c3f0: 20 20 20 49 66 20 74 68 65 72 65 20 69 73 2c 20     If there is, 
c400: 61 6e 64 20 74 68 65 20 70 72 6f 63 65 73 73 20  and the process 
c410: 63 72 61 73 68 65 73 20 73 6f 20 74 68 61 74 20  crashes so that 
c420: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 20 20  the journal.#   
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63               bec
c440: 6f 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  omes a hot-journ
c450: 61 6c 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72  al and must be r
c460: 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 61 6e  olled back by an
c470: 6f 74 68 65 72 0a 23 20 20 20 20 20 20 20 20 20  other.#         
c480: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 2c 20         process, 
c490: 74 68 65 72 65 20 69 73 20 61 20 64 61 6e 67 65  there is a dange
c4a0: 72 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  r that the other
c4b0: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 72 6f 6c   process may rol
c4c0: 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  l.#             
c4d0: 20 20 20 62 61 63 6b 20 74 68 65 20 61 62 6f 72     back the abor
c4e0: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ted transaction,
c4f0: 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 63   then continue c
c500: 6f 70 79 69 6e 67 20 64 61 74 61 0a 23 20 20 20  opying data.#   
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
c520: 6d 20 61 6e 20 6f 6c 64 65 72 20 74 72 61 6e 73  m an older trans
c530: 61 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  action from the 
c540: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
c550: 20 6a 6f 75 72 6e 61 6c 2e 0a 23 20 20 20 20 20   journal..#     
c560: 20 20 20 20 20 20 20 20 20 20 20 53 65 65 20 74             See t
c570: 68 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  he syncJournal()
c580: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65   function for de
c590: 74 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65 72  tails..#.# pager
c5a0: 31 2d 31 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74  1-13.2.*: Same t
c5b0: 65 73 74 20 61 73 20 74 68 65 20 70 72 65 76 69  est as the previ
c5c0: 6f 75 73 2e 20 54 68 69 73 20 74 69 6d 65 2c 20  ous. This time, 
c5d0: 74 68 72 6f 77 20 61 6e 20 69 6e 64 65 78 20 69  throw an index i
c5e0: 6e 74 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20  nto.#           
c5f0: 20 20 20 20 20 74 68 65 20 6d 69 78 20 74 6f 20       the mix to 
c600: 6d 61 6b 65 20 74 68 65 20 69 6e 74 65 67 72 69  make the integri
c610: 74 79 2d 63 68 65 63 6b 20 6d 6f 72 65 20 6c 69  ty-check more li
c620: 6b 65 6c 79 20 74 6f 20 63 61 74 63 68 0a 23 20  kely to catch.# 
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
c640: 72 72 6f 72 73 2e 0a 23 0a 74 65 73 74 76 66 73  rrors..#.testvfs
c650: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74   tv -default 1.t
c660: 76 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62  v script xSyncCb
c670: 0a 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e 63  .tv filter xSync
c680: 0a 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 6d  .proc xSyncCb {m
c690: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
c6a0: 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 74 20 5b  rgs} {.  set t [
c6b0: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e  file tail $filen
c6c0: 61 6d 65 5d 0a 20 20 69 66 20 7b 24 74 20 3d 3d  ame].  if {$t ==
c6d0: 20 22 74 65 73 74 2e 64 62 22 7d 20 66 61 75 6c   "test.db"} faul
c6e0: 74 73 69 6d 5f 73 61 76 65 0a 20 20 72 65 74 75  tsim_save.  retu
c6f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66  rn SQLITE_OK.}.f
c700: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
c710: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e  nd_reopen.db fun
c720: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
c730: 69 6e 67 0a 0a 23 20 54 68 65 20 55 50 44 41 54  ing..# The UPDAT
c740: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 74 20 74  E statement at t
c750: 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 74  he end of this t
c760: 65 73 74 20 63 61 73 65 20 63 72 65 61 74 65 73  est case creates
c770: 20 61 20 72 65 61 6c 6c 79 20 62 69 67 0a 23 20   a really big.# 
c780: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 74  journal. Since t
c790: 68 65 20 63 61 63 68 65 2d 73 69 7a 65 20 69 73  he cache-size is
c7a0: 20 6f 6e 6c 79 20 31 30 20 70 61 67 65 73 2c 20   only 10 pages, 
c7b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  the journal cont
c7c0: 61 69 6e 73 20 0a 23 20 66 72 65 71 75 65 6e 74  ains .# frequent
c7d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
c7e0: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
c7f0: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e  est pager1-13.1.
c800: 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61 67  1 {.  PRAGMA pag
c810: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
c820: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
c830: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
c840: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
c850: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49  ize = 10;.  BEGI
c860: 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  N;.    CREATE TA
c870: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
c880: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
c890: 42 4c 4f 42 29 3b 0a 20 20 20 20 49 4e 53 45 52  BLOB);.    INSER
c8a0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
c8b0: 28 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28  (NULL, a_string(
c8c0: 34 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  400));.    INSER
c8d0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
c8e0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
c8f0: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  400) FROM t1;   
c900: 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f         /*   2 */
c910: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
c920: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
c930: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
c940: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
c950: 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 49   /*   4 */.    I
c960: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
c970: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
c980: 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31  ing(400) FROM t1
c990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20  ;          /*   
c9a0: 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  8 */.    INSERT 
c9b0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e  INTO t1 SELECT N
c9c0: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  ULL, a_string(40
c9d0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
c9e0: 20 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20       /*  16 */. 
c9f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
ca00: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  1 SELECT NULL, a
ca10: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
ca20: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f  M t1;          /
ca30: 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53  *  32 */.    INS
ca40: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
ca50: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
ca60: 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(400) FROM t1; 
ca70: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 36 34 20           /*  64 
ca80: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
ca90: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
caa0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  L, a_string(400)
cab0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
cac0: 20 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 43     /* 128 */.  C
cad0: 4f 4d 4d 49 54 3b 0a 20 20 55 50 44 41 54 45 20  OMMIT;.  UPDATE 
cae0: 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  t1 SET b = a_str
caf0: 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 70 65 72  ing(400);.} {per
cb00: 73 69 73 74 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63  sist}..if {$::tc
cb10: 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
cb20: 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d  orm)!="windows"}
cb30: 20 7b 0a 23 20 52 75 6e 20 74 72 61 6e 73 61 63   {.# Run transac
cb40: 74 69 6f 6e 73 20 6f 66 20 69 6e 63 72 65 61 73  tions of increas
cb50: 69 6e 67 20 73 69 7a 65 73 2e 20 45 76 65 6e 74  ing sizes. Event
cb60: 75 61 6c 6c 79 2c 20 6f 6e 65 20 28 6f 72 20 6d  ually, one (or m
cb70: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 29 0a 23 20  ore than one).# 
cb80: 6f 66 20 74 68 65 73 65 20 77 69 6c 6c 20 77 72  of these will wr
cb90: 69 74 65 20 6a 75 73 74 20 65 6e 6f 75 67 68 20  ite just enough 
cba0: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 6f 6e 65  content that one
cbb0: 20 6f 66 20 74 68 65 20 6f 6c 64 20 68 65 61 64   of the old head
cbc0: 65 72 73 20 63 72 65 61 74 65 64 20 0a 23 20 62  ers created .# b
cbd0: 79 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  y the transactio
cbe0: 6e 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  n in the block a
cbf0: 62 6f 76 65 20 6c 69 65 73 20 69 6d 6d 65 64 69  bove lies immedi
cc00: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
cc10: 63 6f 6e 74 65 6e 74 0a 23 20 6a 6f 75 72 6e 61  content.# journa
cc20: 6c 6c 65 64 20 62 79 20 74 68 65 20 63 75 72 72  lled by the curr
cc30: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
cc40: 0a 23 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70 20  .#.for {set nUp 
cc50: 31 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e  1} {$nUp<64} {in
cc60: 63 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65  cr nUp} {.  do_e
cc70: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
cc80: 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 31  r1-13.1.2.$nUp.1
cc90: 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 74   { .    UPDATE t
cca0: 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  1 SET b = a_stri
ccb0: 6e 67 28 33 39 39 29 20 57 48 45 52 45 20 61 20  ng(399) WHERE a 
ccc0: 3c 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20  <= $nUp.  } {}. 
ccd0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
cce0: 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24   pager1-13.1.2.$
ccf0: 6e 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20 69  nUp.2 { PRAGMA i
cd00: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
cd10: 20 7b 6f 6b 7d 20 0a 0a 20 20 23 20 54 72 79 20   {ok} ..  # Try 
cd20: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 73 6e  to access the sn
cd30: 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 66 69  apshot of the fi
cd40: 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 23 0a 20  le-system..  #. 
cd50: 20 73 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f   sqlite3 db2 sv_
cd60: 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73  test.db.  do_tes
cd70: 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e  t pager1-13.1.2.
cd80: 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65  $nUp.3 {.    exe
cd90: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75  csql { SELECT su
cda0: 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f  m(length(b)) FRO
cdb0: 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b  M t1 } db2.  } [
cdc0: 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20  expr {128*400 - 
cdd0: 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f  ($nUp-1)}].  do_
cde0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31  test pager1-13.1
cdf0: 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20  .2.$nUp.4 {.    
ce00: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
ce10: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
ce20: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a   } db2.  } {ok}.
ce30: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a    db2 close.}.}.
ce40: 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74  .if {$::tcl_plat
ce50: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d  form(platform)!=
ce60: 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20 53  "windows"} {.# S
ce70: 61 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76  ame test as abov
ce80: 65 2e 20 42 75 74 20 74 68 69 73 20 74 69 6d 65  e. But this time
ce90: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 6f   with an index o
cea0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a 64  n the table..#.d
ceb0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
cec0: 61 67 65 72 31 2d 31 33 2e 32 2e 31 20 7b 0a 20  ager1-13.2.1 {. 
ced0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
cee0: 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 55 50 44   ON t1(b);.  UPD
cef0: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61  ATE t1 SET b = a
cf00: 5f 73 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20  _string(400);.} 
cf10: 7b 7d 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70 20  {}.for {set nUp 
cf20: 31 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e  1} {$nUp<64} {in
cf30: 63 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65  cr nUp} {.  do_e
cf40: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
cf50: 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 31  r1-13.2.2.$nUp.1
cf60: 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 74   { .    UPDATE t
cf70: 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  1 SET b = a_stri
cf80: 6e 67 28 33 39 39 29 20 57 48 45 52 45 20 61 20  ng(399) WHERE a 
cf90: 3c 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20  <= $nUp.  } {}. 
cfa0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
cfb0: 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24   pager1-13.2.2.$
cfc0: 6e 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20 69  nUp.2 { PRAGMA i
cfd0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
cfe0: 20 7b 6f 6b 7d 20 0a 20 20 73 71 6c 69 74 65 33   {ok} .  sqlite3
cff0: 20 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a   db2 sv_test.db.
d000: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
d010: 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 33 20 7b  -13.2.2.$nUp.3 {
d020: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
d030: 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68  ELECT sum(length
d040: 28 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64  (b)) FROM t1 } d
d050: 62 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32  b2.  } [expr {12
d060: 38 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29  8*400 - ($nUp-1)
d070: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }].  do_test pag
d080: 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e  er1-13.2.2.$nUp.
d090: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
d0a0: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
d0b0: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20  ty_check } db2. 
d0c0: 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c   } {ok}.  db2 cl
d0d0: 6f 73 65 0a 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73  ose.}.}..db clos
d0e0: 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d  e.tv delete..#--
d0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d130: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73  -------.# Test s
d140: 70 65 63 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f  pecal "PRAGMA jo
d150: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 20  urnal_mode=OFF" 
d160: 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 66 61  test cases..#.fa
d170: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
d180: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63  d_reopen.do_exec
d190: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
d1a0: 31 34 2e 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d  14.1.1 {.  PRAGM
d1b0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
d1c0: 20 4f 46 46 3b 0a 20 20 43 52 45 41 54 45 20 54   OFF;.  CREATE T
d1d0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
d1e0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
d1f0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
d200: 53 28 31 2c 20 32 29 3b 0a 20 20 43 4f 4d 4d 49  S(1, 2);.  COMMI
d210: 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  T;.  SELECT * FR
d220: 4f 4d 20 74 31 3b 0a 7d 20 7b 6f 66 66 20 31 20  OM t1;.} {off 1 
d230: 32 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  2}.do_catchsql_t
d240: 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e  est pager1-14.1.
d250: 32 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  2 {.  BEGIN;.   
d260: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
d270: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
d280: 52 4f 4c 4c 42 41 43 4b 3b 0a 7d 20 7b 30 20 7b  ROLLBACK;.} {0 {
d290: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
d2a0: 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 33  st pager1-14.1.3
d2b0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
d2c0: 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 7d 0a 64  OM t1;.} {1 2}.d
d2d0: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
d2e0: 70 61 67 65 72 31 2d 31 34 2e 31 2e 34 20 7b 0a  pager1-14.1.4 {.
d2f0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
d300: 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77 69  ERT INTO t1(rowi
d310: 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54 20  d, a, b) SELECT 
d320: 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20 74  a+3, b, b FROM t
d330: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
d340: 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20  TO t1(rowid, a, 
d350: 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62  b) SELECT a+3, b
d360: 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b  , b FROM t1;.} {
d370: 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  1 {UNIQUE constr
d380: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 31 2e  aint failed: t1.
d390: 72 6f 77 69 64 7d 7d 0a 64 6f 5f 65 78 65 63 73  rowid}}.do_execs
d3a0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
d3b0: 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49 54  4.1.5 {.  COMMIT
d3c0: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
d3d0: 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20 32 20 32  M t1;.} {1 2 2 2
d3e0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
d3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
d430: 54 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e 64  Test opening and
d440: 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67   closing the pag
d450: 65 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77 69  er sub-system wi
d460: 74 68 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c  th different val
d470: 75 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73 71  ues.# for the sq
d480: 6c 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69  lite3_vfs.szOsFi
d490: 6c 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a 66  le variable..#.f
d4a0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
d4b0: 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65  nd_reopen.do_exe
d4c0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
d4d0: 2d 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  -15.0 {.  CREATE
d4e0: 20 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29 3b   TABLE tx(y, z);
d4f0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
d500: 78 20 56 41 4c 55 45 53 28 27 41 79 75 74 74 68  x VALUES('Ayutth
d510: 61 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27 29  aya', 'Beijing')
d520: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
d530: 74 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64 6f  tx VALUES('Londo
d540: 6e 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d 20  n', 'Tokyo');.} 
d550: 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 20  {}.db close.for 
d560: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35 31  {set i 0} {$i<51
d570: 33 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b 0a  3} {incr i 3} {.
d580: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65    testvfs tv -de
d590: 66 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69 6c  fault 1 -szosfil
d5a0: 65 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20 64  e $i.  sqlite3 d
d5b0: 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 65  b test.db.  do_e
d5c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
d5d0: 72 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20 20  r1-15.$i.1 {.   
d5e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
d5f0: 78 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61 79  x;.  } {Ayutthay
d600: 61 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f 6e  a Beijing London
d610: 20 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c 6f   Tokyo}.  db clo
d620: 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d  se.  tv delete.}
d630: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
d640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43  ------------.# C
d680: 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20  heck that it is 
d690: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
d6a0: 6f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  open a database 
d6b0: 66 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c 6c  file if the full
d6c0: 20 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20 61   path.# to the a
d6d0: 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e 61  ssociated journa
d6e0: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6c  l file will be l
d6f0: 6f 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69 74  onger than sqlit
d700: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
d710: 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20  e..#.testvfs tv 
d720: 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63  -default 1.tv sc
d730: 72 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76 20  ript xOpenCb.tv 
d740: 66 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72 6f  filter xOpen.pro
d750: 63 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68 6f  c xOpenCb {metho
d760: 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d  d filename args}
d770: 20 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c 65 5f   {.  set ::file_
d780: 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  len [string leng
d790: 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 7d 0a  th $filename].}.
d7a0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
d7b0: 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  db.db close.tv d
d7c0: 65 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65 74 20  elete..for {set 
d7d0: 69 69 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65  ii [expr $::file
d7e0: 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20 3c 20  _len-5]} {$ii < 
d7f0: 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65  [expr $::file_le
d800: 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69 69 7d  n+20]} {incr ii}
d810: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
d820: 2d 64 65 66 61 75 6c 74 20 31 20 2d 6d 78 70 61  -default 1 -mxpa
d830: 74 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20 23 20  thname $ii..  # 
d840: 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  The length of th
d850: 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 66  e full path to f
d860: 69 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a 6f 75  ile "test.db-jou
d870: 72 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66 69 6c  rnal" is ($::fil
d880: 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20 49 66  e_len+8)..  # If
d890: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20   the configured 
d8a0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
d8b0: 74 68 6e 61 6d 65 20 76 61 6c 75 65 20 67 72 65  thname value gre
d8c0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
d8d0: 61 6c 20 74 6f 0a 20 20 23 20 74 68 69 73 2c 20  al to.  # this, 
d8e0: 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 63 61  then the file ca
d8f0: 6e 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f 74 68  n be opened. Oth
d900: 65 72 77 69 73 65 2c 20 69 74 20 63 61 6e 6e 6f  erwise, it canno
d910: 74 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 69 69  t..  #.  if {$ii
d920: 20 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c   >= [expr $::fil
d930: 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20 20 20  e_len+8]} {.    
d940: 73 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d 0a 20  set res {0 {}}. 
d950: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65   } else {.    se
d960: 74 20 72 65 73 20 7b 31 20 7b 75 6e 61 62 6c 65  t res {1 {unable
d970: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
d980: 65 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a 20 20  e file}}.  }..  
d990: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d9a0: 36 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20 6c 69  6.1.$ii {.    li
d9b0: 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69  st [catch { sqli
d9c0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d  te3 db test.db }
d9d0: 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 24   msg] $msg.  } $
d9e0: 72 65 73 0a 0a 20 20 63 61 74 63 68 20 7b 64 62  res..  catch {db
d9f0: 20 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64 65 6c   close}.  tv del
da00: 65 74 65 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  ete.}...#-------
da10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da50: 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 70 61  --.# Test the pa
da60: 67 65 72 73 20 72 65 73 70 6f 6e 73 65 20 74 6f  gers response to
da70: 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
da80: 72 20 72 65 71 75 65 73 74 69 6e 67 20 69 6c 6c  r requesting ill
da90: 65 67 61 6c 20 70 61 67 65 20 0a 23 20 6e 75 6d  egal page .# num
daa0: 62 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54 68  bers:.#.#   + Th
dab0: 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c 0a  e locking page,.
dac0: 23 20 20 20 2b 20 50 61 67 65 20 30 2c 0a 23 20  #   + Page 0,.# 
dad0: 20 20 2b 20 41 20 70 61 67 65 20 77 69 74 68 20    + A page with 
dae0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  a page number gr
daf0: 65 61 74 65 72 20 74 68 61 6e 20 28 32 5e 33 31  eater than (2^31
db00: 2d 31 29 2e 0a 23 0a 23 20 54 68 65 73 65 20 74  -1)..#.# These t
db10: 65 73 74 73 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  ests will not wo
db20: 72 6b 20 69 66 20 53 51 4c 49 54 45 5f 44 49 52  rk if SQLITE_DIR
db30: 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
db40: 44 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49 6e  D is defined. In
db50: 0a 23 20 74 68 61 74 20 63 61 73 65 20 49 4f 20  .# that case IO 
db60: 65 72 72 6f 72 73 20 61 72 65 20 73 6f 6d 65 74  errors are somet
db70: 69 6d 65 73 20 72 65 70 6f 72 74 65 64 20 69 6e  imes reported in
db80: 73 74 65 61 64 20 6f 66 20 53 51 4c 49 54 45 5f  stead of SQLITE_
db90: 43 4f 52 52 55 50 54 2e 0a 23 0a 69 66 63 61 70  CORRUPT..#.ifcap
dba0: 61 62 6c 65 20 21 64 69 72 65 63 74 5f 72 65 61  able !direct_rea
dbb0: 64 20 7b 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  d {.do_test page
dbc0: 72 31 2d 31 38 2e 31 20 7b 0a 20 20 66 61 75 6c  r1-18.1 {.  faul
dbd0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
dbe0: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
dbf0: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
dc00: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  ng.  execsql { .
dc10: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
dc20: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
dc30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
dc40: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
dc50: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
dc60: 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  S(a_string(500),
dc70: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 29 3b   a_string(200));
dc80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
dc90: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
dca0: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
dcb0: 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(200) FROM t1;
dcc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
dcd0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
dce0: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
dcf0: 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(200) FROM t1;
dd00: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
dd10: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
dd20: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
dd30: 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(200) FROM t1;
dd40: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
dd50: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
dd60: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
dd70: 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(200) FROM t1;
dd80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
dd90: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
dda0: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
ddb0: 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(200) FROM t1;
ddc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ddd0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
dde0: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
ddf0: 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(200) FROM t1;
de00: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
de10: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
de20: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
de30: 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(200) FROM t1;
de40: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
de50: 74 20 70 61 67 65 72 31 2d 31 38 2e 32 20 7b 0a  t pager1-18.2 {.
de60: 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f    set root [db o
de70: 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 70  ne "SELECT rootp
de80: 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  age FROM sqlite_
de90: 6d 61 73 74 65 72 22 5d 0a 20 20 73 65 74 20 6c  master"].  set l
dea0: 6f 63 6b 69 6e 67 70 61 67 65 20 5b 65 78 70 72  ockingpage [expr
deb0: 20 28 30 78 31 30 30 30 30 2f 31 30 32 34 29 20   (0x10000/1024) 
dec0: 2b 20 31 5d 0a 20 20 73 71 6c 69 74 65 33 5f 64  + 1].  sqlite3_d
ded0: 62 5f 63 6f 6e 66 69 67 20 64 62 20 44 45 46 45  b_config db DEFE
dee0: 4e 53 49 56 45 20 30 0a 20 20 65 78 65 63 73 71  NSIVE 0.  execsq
def0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  l {.    PRAGMA w
df00: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
df10: 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73   1;.    UPDATE s
df20: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54  qlite_master SET
df30: 20 72 6f 6f 74 70 61 67 65 20 3d 20 24 6c 6f 63   rootpage = $loc
df40: 6b 69 6e 67 70 61 67 65 3b 0a 20 20 7d 0a 20 20  kingpage;.  }.  
df50: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
df60: 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  .db.  catchsql {
df70: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
df80: 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d   FROM t1 } db2.}
df90: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
dfa0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
dfb0: 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73  ormed}}.db2 clos
dfc0: 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  e.do_test pager1
dfd0: 2d 31 38 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63  -18.3.1 {.  exec
dfe0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
dff0: 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20   TABLE t2(x);.  
e000: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
e010: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
e020: 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73  (5000));.  }.  s
e030: 65 74 20 70 67 6e 6f 20 5b 65 78 70 72 20 28 5b  et pgno [expr ([
e040: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
e050: 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20 20  b] / 1024)-2].  
e060: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
e070: 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f  .db [expr ($pgno
e080: 2d 31 29 2a 31 30 32 34 5d 20 30 30 30 30 30 30  -1)*1024] 000000
e090: 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  00.  sqlite3 db2
e0a0: 20 74 65 73 74 2e 64 62 0a 20 20 23 20 65 76 65   test.db.  # eve
e0b0: 6e 20 74 68 6f 75 67 68 20 78 20 69 73 20 6d 61  n though x is ma
e0c0: 6c 66 6f 72 6d 65 64 2c 20 62 65 63 61 75 73 65  lformed, because
e0d0: 20 74 79 70 65 6f 66 28 29 20 64 6f 65 73 0a 20   typeof() does. 
e0e0: 20 23 20 6e 6f 74 20 6c 6f 61 64 20 74 68 65 20   # not load the 
e0f0: 63 6f 6e 74 65 6e 74 20 6f 66 20 78 2c 20 74 68  content of x, th
e100: 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 6e  e error is not n
e110: 6f 74 69 63 65 64 2e 0a 20 20 63 61 74 63 68 73  oticed..  catchs
e120: 71 6c 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65  ql { SELECT type
e130: 6f 66 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20  of(x) FROM t2 } 
e140: 64 62 32 0a 7d 20 7b 30 20 74 65 78 74 7d 0a 64  db2.} {0 text}.d
e150: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38  o_test pager1-18
e160: 2e 33 2e 32 20 7b 0a 20 20 23 20 69 6e 20 74 68  .3.2 {.  # in th
e170: 69 73 20 63 61 73 65 2c 20 74 68 65 20 76 61 6c  is case, the val
e180: 75 65 20 6f 66 20 78 20 69 73 20 6c 6f 61 64 65  ue of x is loade
e190: 64 20 61 6e 64 20 73 6f 20 74 68 65 20 65 72 72  d and so the err
e1a0: 6f 72 20 69 73 0a 20 20 23 20 64 65 74 65 63 74  or is.  # detect
e1b0: 65 64 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  ed.  catchsql { 
e1c0: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 7c  SELECT length(x|
e1d0: 7c 27 27 29 20 46 52 4f 4d 20 74 32 20 7d 20 64  |'') FROM t2 } d
e1e0: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
e1f0: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
e200: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20  malformed}}.db2 
e210: 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61  close.do_test pa
e220: 67 65 72 31 2d 31 38 2e 33 2e 33 20 7b 0a 20 20  ger1-18.3.3 {.  
e230: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
e240: 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20  LETE FROM t2;.  
e250: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
e260: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
e270: 6f 62 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a 20  ob(5000));.  }. 
e280: 20 73 65 74 20 70 67 6e 6f 20 5b 65 78 70 72 20   set pgno [expr 
e290: 28 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74  ([file size test
e2a0: 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d 0a  .db] / 1024)-2].
e2b0: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
e2c0: 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67  st.db [expr ($pg
e2d0: 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30 30 30  no-1)*1024] 0000
e2e0: 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64  0000.  sqlite3 d
e2f0: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 23 20 65  b2 test.db.  # e
e300: 76 65 6e 20 74 68 6f 75 67 68 20 78 20 69 73 20  ven though x is 
e310: 6d 61 6c 66 6f 72 6d 65 64 2c 20 62 65 63 61 75  malformed, becau
e320: 73 65 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20  se length() and 
e330: 74 79 70 65 6f 66 28 29 20 64 6f 0a 20 20 23 20  typeof() do.  # 
e340: 6e 6f 74 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e  not load the con
e350: 74 65 6e 74 20 6f 66 20 78 2c 20 74 68 65 20 65  tent of x, the e
e360: 72 72 6f 72 20 69 73 20 6e 6f 74 20 6e 6f 74 69  rror is not noti
e370: 63 65 64 2e 0a 20 20 63 61 74 63 68 73 71 6c 20  ced..  catchsql 
e380: 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28  { SELECT length(
e390: 78 29 2c 20 74 79 70 65 6f 66 28 78 29 20 46 52  x), typeof(x) FR
e3a0: 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 30  OM t2 } db2.} {0
e3b0: 20 7b 35 30 30 30 20 62 6c 6f 62 7d 7d 0a 64 6f   {5000 blob}}.do
e3c0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e  _test pager1-18.
e3d0: 33 2e 34 20 7b 0a 20 20 23 20 69 6e 20 74 68 69  3.4 {.  # in thi
e3e0: 73 20 63 61 73 65 2c 20 74 68 65 20 76 61 6c 75  s case, the valu
e3f0: 65 20 6f 66 20 78 20 69 73 20 6c 6f 61 64 65 64  e of x is loaded
e400: 20 61 6e 64 20 73 6f 20 74 68 65 20 65 72 72 6f   and so the erro
e410: 72 20 69 73 0a 20 20 23 20 64 65 74 65 63 74 65  r is.  # detecte
e420: 64 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  d.  catchsql { S
e430: 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 7c 7c  ELECT length(x||
e440: 27 27 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  '') FROM t2 } db
e450: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
e460: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
e470: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63  alformed}}.db2 c
e480: 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67  lose.do_test pag
e490: 65 72 31 2d 31 38 2e 34 20 7b 0a 20 20 68 65 78  er1-18.4 {.  hex
e4a0: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
e4b0: 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29   [expr ($pgno-1)
e4c0: 2a 31 30 32 34 5d 20 39 30 30 30 30 30 30 30 0a  *1024] 90000000.
e4d0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
e4e0: 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c  st.db.  catchsql
e4f0: 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68   { SELECT length
e500: 28 78 7c 7c 27 27 29 20 46 52 4f 4d 20 74 32 20  (x||'') FROM t2 
e510: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
e520: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
e530: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64  is malformed}}.d
e540: 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  b2 close.do_test
e550: 20 70 61 67 65 72 31 2d 31 38 2e 35 20 7b 0a 20   pager1-18.5 {. 
e560: 20 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20   sqlite3 db "". 
e570: 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
e580: 69 67 20 64 62 20 44 45 46 45 4e 53 49 56 45 20  ig db DEFENSIVE 
e590: 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  0.  execsql {.  
e5a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
e5b0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
e5c0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
e5d0: 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  b);.    PRAGMA w
e5e0: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
e5f0: 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73   1;.    UPDATE s
e600: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54  qlite_master SET
e610: 20 72 6f 6f 74 70 61 67 65 3d 35 20 57 48 45 52   rootpage=5 WHER
e620: 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74 31  E tbl_name = 't1
e630: 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72  ';.    PRAGMA wr
e640: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
e650: 30 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42  0;.    ALTER TAB
e660: 4c 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20  LE t1 RENAME TO 
e670: 78 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73  x1;.  }.  catchs
e680: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
e690: 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31 20 7b 64 61  OM x1 }.} {1 {da
e6a0: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
e6b0: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
e6c0: 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65  .db close..do_te
e6d0: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 36 20 7b  st pager1-18.6 {
e6e0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
e6f0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
e700: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
e710: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
e720: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
e730: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
e740: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
e750: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49  BLE t1(x);.    I
e760: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
e770: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30  LUES(a_string(80
e780: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
e790: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
e7a0: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
e7b0: 20 7d 0a 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b   }..  set root [
e7c0: 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72  db one "SELECT r
e7d0: 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c  ootpage FROM sql
e7e0: 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 64  ite_master"].  d
e7f0: 62 20 63 6c 6f 73 65 0a 0a 20 20 68 65 78 69 6f  b close..  hexio
e800: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b  _write test.db [
e810: 65 78 70 72 20 28 24 72 6f 6f 74 2d 31 29 2a 31  expr ($root-1)*1
e820: 30 32 34 20 2b 20 38 5d 20 30 30 30 30 30 30 30  024 + 8] 0000000
e830: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  0.  sqlite3 db t
e840: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
e850: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
e860: 68 28 78 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  h(x) FROM t1 }.}
e870: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
e880: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
e890: 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65  ormed}}.}..do_te
e8a0: 73 74 20 70 61 67 65 72 31 2d 31 39 2e 31 20 7b  st pager1-19.1 {
e8b0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22 22  .  sqlite3 db ""
e8c0: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
e8d0: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65  ing a_string.  e
e8e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
e8f0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
e900: 35 31 32 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  512;.    PRAGMA 
e910: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b  auto_vacuum = 1;
e920: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
e930: 45 20 74 31 28 61 61 2c 20 61 62 2c 20 61 63 2c  E t1(aa, ab, ac,
e940: 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c   ad, ae, af, ag,
e950: 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c   ah, ai, aj, ak,
e960: 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20   al, am, an,.   
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e980: 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c   ba, bb, bc, bd,
e990: 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c   be, bf, bg, bh,
e9a0: 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c   bi, bj, bk, bl,
e9b0: 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20   bm, bn,.       
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 2c               ca,
e9d0: 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c   cb, cc, cd, ce,
e9e0: 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c   cf, cg, ch, ci,
e9f0: 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c   cj, ck, cl, cm,
ea00: 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   cn,.           
ea10: 20 20 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c           da, db,
ea20: 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c   dc, dd, de, df,
ea30: 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c   dg, dh, di, dj,
ea40: 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c   dk, dl, dm, dn,
ea50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ea60: 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c       ea, eb, ec,
ea70: 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c   ed, ee, ef, eg,
ea80: 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c   eh, ei, ej, ek,
ea90: 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20   el, em, en,.   
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eab0: 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c   fa, fb, fc, fd,
eac0: 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c   fe, ff, fg, fh,
ead0: 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c   fi, fj, fk, fl,
eae0: 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20   fm, fn,.       
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 61 2c               ga,
eb00: 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c   gb, gc, gd, ge,
eb10: 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c   gf, gg, gh, gi,
eb20: 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c   gj, gk, gl, gm,
eb30: 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   gn,.           
eb40: 20 20 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c           ha, hb,
eb50: 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c   hc, hd, he, hf,
eb60: 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c   hg, hh, hi, hj,
eb70: 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c   hk, hl, hm, hn,
eb80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eb90: 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c       ia, ib, ic,
eba0: 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c   id, ie, if, ig,
ebb0: 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c   ih, ii, ij, ik,
ebc0: 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20   il, im, ix,.   
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c   ja, jb, jc, jd,
ebf0: 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c   je, jf, jg, jh,
ec00: 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c   ji, jj, jk, jl,
ec10: 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20   jm, jn,.       
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c               ka,
ec30: 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c   kb, kc, kd, ke,
ec40: 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c   kf, kg, kh, ki,
ec50: 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c   kj, kk, kl, km,
ec60: 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   kn,.           
ec70: 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c           la, lb,
ec80: 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c   lc, ld, le, lf,
ec90: 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c   lg, lh, li, lj,
eca0: 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c   lk, ll, lm, ln,
ecb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ecc0: 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c       ma, mb, mc,
ecd0: 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c   md, me, mf, mg,
ece0: 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c   mh, mi, mj, mk,
ecf0: 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20   ml, mm, mn.    
ed00: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
ed10: 42 4c 45 20 74 32 28 61 61 2c 20 61 62 2c 20 61  BLE t2(aa, ab, a
ed20: 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61  c, ad, ae, af, a
ed30: 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61  g, ah, ai, aj, a
ed40: 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20  k, al, am, an,. 
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed60: 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62     ba, bb, bc, b
ed70: 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62  d, be, bf, bg, b
ed80: 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62  h, bi, bj, bk, b
ed90: 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20  l, bm, bn,.     
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
edb0: 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63  a, cb, cc, cd, c
edc0: 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63  e, cf, cg, ch, c
edd0: 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63  i, cj, ck, cl, c
ede0: 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, cn,.         
edf0: 20 20 20 20 20 20 20 20 20 20 20 64 61 2c 20 64             da, d
ee00: 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64  b, dc, dd, de, d
ee10: 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64  f, dg, dh, di, d
ee20: 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64  j, dk, dl, dm, d
ee30: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
ee40: 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65         ea, eb, e
ee50: 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65  c, ed, ee, ef, e
ee60: 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65  g, eh, ei, ej, e
ee70: 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20  k, el, em, en,. 
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee90: 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66     fa, fb, fc, f
eea0: 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66  d, fe, ff, fg, f
eeb0: 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66  h, fi, fj, fk, f
eec0: 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20  l, fm, fn,.     
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
eee0: 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67  a, gb, gc, gd, g
eef0: 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67  e, gf, gg, gh, g
ef00: 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67  i, gj, gk, gl, g
ef10: 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, gn,.         
ef20: 20 20 20 20 20 20 20 20 20 20 20 68 61 2c 20 68             ha, h
ef30: 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68  b, hc, hd, he, h
ef40: 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68  f, hg, hh, hi, h
ef50: 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68  j, hk, hl, hm, h
ef60: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
ef70: 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69         ia, ib, i
ef80: 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69  c, id, ie, if, i
ef90: 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69  g, ih, ii, ij, i
efa0: 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20  k, il, im, ix,. 
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a     ja, jb, jc, j
efd0: 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a  d, je, jf, jg, j
efe0: 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a  h, ji, jj, jk, j
eff0: 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20  l, jm, jn,.     
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
f010: 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b  a, kb, kc, kd, k
f020: 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b  e, kf, kg, kh, k
f030: 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b  i, kj, kk, kl, k
f040: 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, kn,.         
f050: 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c             la, l
f060: 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c  b, lc, ld, le, l
f070: 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c  f, lg, lh, li, l
f080: 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c  j, lk, ll, lm, l
f090: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
f0a0: 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d         ma, mb, m
f0b0: 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d  c, md, me, mf, m
f0c0: 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d  g, mh, mi, mj, m
f0d0: 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20  k, ml, mm, mn.  
f0e0: 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20    );.    INSERT 
f0f0: 49 4e 54 4f 20 74 31 28 61 61 29 20 56 41 4c 55  INTO t1(aa) VALU
f100: 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30 30  ES( a_string(100
f110: 30 30 30 29 20 29 3b 0a 20 20 20 20 49 4e 53 45  000) );.    INSE
f120: 52 54 20 49 4e 54 4f 20 74 32 28 61 61 29 20 56  RT INTO t2(aa) V
f130: 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28  ALUES( a_string(
f140: 31 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20 56  100000) );.    V
f150: 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  ACUUM;.  }.} {}.
f160: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
f170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
f1b0: 73 74 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 73  st a couple of s
f1c0: 70 65 63 69 61 6c 20 63 61 73 65 73 20 74 68 61  pecial cases tha
f1d0: 74 20 63 6f 6d 65 20 75 70 20 77 68 69 6c 65 20  t come up while 
f1e0: 63 6f 6d 6d 69 74 74 69 6e 67 20 0a 23 20 74 72  committing .# tr
f1f0: 61 6e 73 61 63 74 69 6f 6e 73 3a 0a 23 0a 23 20  ansactions:.#.# 
f200: 20 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 2a 3a    pager1-20.1.*:
f210: 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 20 69   Committing an i
f220: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
f230: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68  e transaction wh
f240: 65 6e 20 74 68 65 20 0a 23 20 20 20 20 20 20 20  en the .#       
f250: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
f260: 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ase has not been
f270: 20 6d 6f 64 69 66 69 65 64 20 61 74 20 61 6c 6c   modified at all
f280: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
f290: 30 2e 32 2e 2a 3a 20 41 73 20 61 62 6f 76 65 2c  0.2.*: As above,
f2a0: 20 62 75 74 20 77 69 74 68 20 61 20 6e 6f 72 6d   but with a norm
f2b0: 61 6c 20 64 62 20 69 6e 20 65 78 63 6c 75 73 69  al db in exclusi
f2c0: 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e  ve-locking mode.
f2d0: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30  .#.#   pager1-20
f2e0: 2e 33 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67  .3.*: Committing
f2f0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
f300: 6e 20 57 41 4c 20 6d 6f 64 65 20 77 68 65 72 65  n WAL mode where
f310: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
f320: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
f330: 20 20 20 20 20 62 65 65 6e 20 6d 6f 64 69 66 69       been modifi
f340: 65 64 2c 20 62 75 74 20 61 6c 6c 20 64 69 72 74  ed, but all dirt
f350: 79 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  y pages have bee
f360: 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 0a 23 20  n flushed to .# 
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 64 69 73 6b 20 62 65 66 6f 72 65 20 74 68 65   disk before the
f390: 20 63 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74 65   commit..#.do_te
f3a0: 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 31  st pager1-20.1.1
f3b0: 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63   {.  catch {db c
f3c0: 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65 33 20  lose}.  sqlite3 
f3d0: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78  db :memory:.  ex
f3e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
f3f0: 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f  TE TABLE one(two
f400: 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e  , three);.    IN
f410: 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41  SERT INTO one VA
f420: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
f430: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
f440: 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 32 20 7b   pager1-20.1.2 {
f450: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f460: 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45   BEGIN EXCLUSIVE
f470: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
f480: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
f490: 70 61 67 65 72 31 2d 32 30 2e 32 2e 31 20 7b 0a  pager1-20.2.1 {.
f4a0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
f4b0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
f4c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
f4d0: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
f4e0: 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20   = exclusive;.  
f4f0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
f500: 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b  _mode = persist;
f510: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
f520: 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65  E one(two, three
f530: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
f540: 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61  TO one VALUES('a
f550: 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b  ', 'b');.  }.} {
f560: 65 78 63 6c 75 73 69 76 65 20 70 65 72 73 69 73  exclusive persis
f570: 74 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  t}.do_test pager
f580: 31 2d 32 30 2e 32 2e 32 20 7b 0a 20 20 65 78 65  1-20.2.2 {.  exe
f590: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
f5a0: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20   EXCLUSIVE;.    
f5b0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
f5c0: 0a 0a 69 66 20 7b 24 3a 3a 73 71 6c 69 74 65 5f  ..if {$::sqlite_
f5d0: 6f 70 74 69 6f 6e 73 28 77 61 6c 29 20 26 26 20  options(wal) && 
f5e0: 5b 77 61 6c 5f 69 73 5f 6f 6b 5d 7d 20 7b 0a 20  [wal_is_ok]} {. 
f5f0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
f600: 32 30 2e 33 2e 31 20 7b 0a 20 20 20 20 66 61 75  20.3.1 {.    fau
f610: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
f620: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66  _reopen.    db f
f630: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
f640: 74 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71  tring.    execsq
f650: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
f660: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
f670: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
f680: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61  ournal_mode = wa
f690: 6c 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  l;.      BEGIN;.
f6a0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
f6b0: 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
f6c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
f6d0: 20 74 32 28 79 29 3b 0a 20 20 20 20 20 20 20 20   t2(y);.        
f6e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
f6f0: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38  ALUES(a_string(8
f700: 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  00));.        IN
f710: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
f720: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
f730: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
f740: 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a 20 20 20     /*   2 */.   
f750: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
f760: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
f770: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
f780: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34  ;         /*   4
f790: 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45   */.        INSE
f7a0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
f7b0: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  T a_string(800) 
f7c0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
f7d0: 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20 20   /*   8 */.     
f7e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
f7f0: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
f800: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
f810: 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36 20 2a          /*  16 *
f820: 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  /.        INSERT
f830: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
f840: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
f850: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
f860: 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 20 20 43  *  32 */.      C
f870: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  OMMIT;.    }.  }
f880: 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74   {wal}.  do_test
f890: 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 32 20 7b   pager1-20.3.2 {
f8a0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
f8b0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
f8c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
f8d0: 20 56 41 4c 55 45 53 28 27 78 78 78 78 27 29 3b   VALUES('xxxx');
f8e0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72  .    }.    recur
f8f0: 73 69 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74  sive_select 32 t
f900: 31 0a 20 20 20 20 65 78 65 63 73 71 6c 20 43 4f  1.    execsql CO
f910: 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23  MMIT.  } {}.}..#
f920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
f970: 20 74 68 61 74 20 61 20 57 41 4c 20 64 61 74 61   that a WAL data
f980: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
f990: 6f 70 65 6e 65 64 20 69 66 3a 0a 23 0a 23 20 20  opened if:.#.#  
f9a0: 20 70 61 67 65 72 31 2d 32 31 2e 31 2e 2a 3a 20   pager1-21.1.*: 
f9b0: 54 68 65 20 56 46 53 20 68 61 73 20 61 6e 20 69  The VFS has an i
f9c0: 56 65 72 73 69 6f 6e 20 6c 65 73 73 20 74 68 61  Version less tha
f9d0: 6e 20 32 2c 20 6f 72 0a 23 20 20 20 70 61 67 65  n 2, or.#   page
f9e0: 72 31 2d 32 31 2e 32 2e 2a 3a 20 54 68 65 20 56  r1-21.2.*: The V
f9f0: 46 53 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76  FS does not prov
fa00: 69 64 65 20 78 53 68 6d 58 58 58 28 29 20 6d 65  ide xShmXXX() me
fa10: 74 68 6f 64 73 2e 0a 23 0a 69 66 20 7b 24 3a 3a  thods..#.if {$::
fa20: 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 28 77  sqlite_options(w
fa30: 61 6c 29 20 26 26 20 5b 77 61 6c 5f 69 73 5f 6f  al) && [wal_is_o
fa40: 6b 5d 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  k]} {.  do_test 
fa50: 70 61 67 65 72 31 2d 32 31 2e 30 20 7b 0a 20 20  pager1-21.0 {.  
fa60: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
fa70: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20  e_and_reopen.   
fa80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
fa90: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
faa0: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
fab0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b    CREATE TABLE k
fac0: 6f 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63  o(c DEFAULT 'abc
fad0: 27 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65  ', b DEFAULT 'de
fae0: 66 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  f');.      INSER
faf0: 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c  T INTO ko DEFAUL
fb00: 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a  T VALUES;.    }.
fb10: 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74    } {wal}.  do_t
fb20: 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e 31 20  est pager1-21.1 
fb30: 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76  {.    testvfs tv
fb40: 20 2d 6e 6f 73 68 6d 20 31 0a 20 20 20 20 73 71   -noshm 1.    sq
fb50: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
fb60: 62 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63 61  b -vfs tv.    ca
fb70: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
fb80: 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a  * FROM ko } db2.
fb90: 20 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74    } {1 {unable t
fba0: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
fbb0: 66 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c 6f  file}}.  db2 clo
fbc0: 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 20  se.  tv delete. 
fbd0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
fbe0: 32 31 2e 32 20 7b 0a 20 20 20 20 74 65 73 74 76  21.2 {.    testv
fbf0: 66 73 20 74 76 20 2d 69 76 65 72 73 69 6f 6e 20  fs tv -iversion 
fc00: 31 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  1.    sqlite3 db
fc10: 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74  2 test.db -vfs t
fc20: 76 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  v.    catchsql {
fc30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b   SELECT * FROM k
fc40: 6f 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b  o } db2.  } {1 {
fc50: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
fc60: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20  atabase file}}. 
fc70: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76 20   db2 close.  tv 
fc80: 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  delete.}..#-----
fc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcd0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
fce0: 20 61 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63   a "PRAGMA wal_c
fcf0: 68 65 63 6b 70 6f 69 6e 74 22 3a 0a 23 0a 23 20  heckpoint":.#.# 
fd00: 20 20 70 61 67 65 72 31 2d 32 32 2e 31 2e 2a 3a    pager1-22.1.*:
fd10: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61   is a no-op on a
fd20: 20 6e 6f 6e 2d 57 41 4c 20 64 62 2c 20 61 6e 64   non-WAL db, and
fd30: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32 2e 32  .#   pager1-22.2
fd40: 2e 2a 3a 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  .*: does not cau
fd50: 73 65 20 78 53 79 6e 63 20 63 61 6c 6c 73 20 77  se xSync calls w
fd60: 69 74 68 20 61 20 73 79 6e 63 68 72 6f 6e 6f 75  ith a synchronou
fd70: 73 3d 6f 66 66 20 64 62 2e 0a 23 0a 64 6f 5f 74  s=off db..#.do_t
fd80: 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e 31 2e  est pager1-22.1.
fd90: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
fda0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
fdb0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
fdc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f   CREATE TABLE ko
fdd0: 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27  (c DEFAULT 'abc'
fde0: 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66  , b DEFAULT 'def
fdf0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
fe00: 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56  NTO ko DEFAULT V
fe10: 41 4c 55 45 53 3b 0a 20 20 7d 0a 20 20 65 78 65  ALUES;.  }.  exe
fe20: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
fe30: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 7d  l_checkpoint }.}
fe40: 20 7b 30 20 2d 31 20 2d 31 7d 0a 64 6f 5f 74 65   {0 -1 -1}.do_te
fe50: 73 74 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 31  st pager1-22.2.1
fe60: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
fe70: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20  -default 1.  tv 
fe80: 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74  filter xSync.  t
fe90: 76 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62  v script xSyncCb
fea0: 0a 20 20 70 72 6f 63 20 78 53 79 6e 63 43 62 20  .  proc xSyncCb 
feb0: 7b 61 72 67 73 7d 20 7b 69 6e 63 72 20 3a 3a 73  {args} {incr ::s
fec0: 79 6e 63 63 6f 75 6e 74 7d 0a 20 20 73 71 6c 69  ynccount}.  sqli
fed0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a  te3 db test.db..
fee0: 20 20 23 20 53 77 69 74 63 68 20 74 68 65 20 64    # Switch the d
fef0: 62 20 74 6f 20 57 41 4c 20 6d 6f 64 65 2e 20 41  b to WAL mode. A
ff00: 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 20  nd then execute 
ff10: 61 20 53 45 4c 45 43 54 20 74 6f 20 6d 61 6b 65  a SELECT to make
ff20: 20 73 75 72 65 0a 20 20 23 20 74 68 61 74 20 74   sure.  # that t
ff30: 68 65 20 57 41 4c 20 66 69 6c 65 20 69 73 20 6f  he WAL file is o
ff40: 70 65 6e 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  pen. Note that t
ff50: 68 69 73 20 6d 61 79 20 63 68 61 6e 67 65 20 74  his may change t
ff60: 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  he synchronous. 
ff70: 20 23 20 73 65 74 74 69 6e 67 20 69 66 20 44 45   # setting if DE
ff80: 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59  FAULT_WAL_SAFETY
ff90: 4c 45 56 45 4c 20 69 73 20 64 65 66 69 6e 65 64  LEVEL is defined
ffa0: 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  ..  execsql { PR
ffb0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
ffc0: 65 20 3d 20 57 41 4c 20 3b 20 53 45 4c 45 43 54  e = WAL ; SELECT
ffd0: 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 0a 0a 20 20   * FROM ko }..  
ffe0: 23 20 53 65 74 20 73 79 6e 63 68 72 6f 6e 6f 75  # Set synchronou
fff0: 73 3d 4f 46 46 2e 20 49 6e 73 65 72 74 20 73 6f  s=OFF. Insert so
10000 6d 65 20 64 61 74 61 20 61 6e 64 20 72 75 6e 20  me data and run 
10010 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 53 69  a checkpoint. Si
10020 6e 63 65 0a 20 20 23 20 73 79 6e 63 3d 6f 66 66  nce.  # sync=off
10030 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
10040 74 20 63 61 75 73 65 20 61 6e 79 20 63 61 6c 6c  t cause any call
10050 73 20 74 6f 20 74 68 65 20 78 53 79 6e 63 28 29  s to the xSync()
10060 20 6d 65 74 68 6f 64 2e 0a 20 20 73 65 74 20 3a   method..  set :
10070 3a 73 79 6e 63 63 6f 75 6e 74 20 30 0a 20 20 65  :synccount 0.  e
10080 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
10090 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
100a0 3d 20 6f 66 66 3b 0a 20 20 20 20 49 4e 53 45 52  = off;.    INSER
100b0 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c  T INTO ko DEFAUL
100c0 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 50 52  T VALUES;.    PR
100d0 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
100e0 69 6e 74 3b 0a 20 20 7d 0a 20 20 73 65 74 20 73  int;.  }.  set s
100f0 79 6e 63 63 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 0a  ynccount.} {0}..
10100 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
10110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
10150 74 73 20 66 6f 72 20 63 68 61 6e 67 69 6e 67 20  ts for changing 
10160 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a  journal mode..#.
10170 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  #   pager1-23.1.
10180 2a 3a 20 54 65 73 74 20 74 68 61 74 20 77 68 65  *: Test that whe
10190 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20  n changing from 
101a0 50 45 52 53 49 53 54 20 74 6f 20 44 45 4c 45 54  PERSIST to DELET
101b0 45 20 6d 6f 64 65 2c 0a 23 20 20 20 20 20 20 20  E mode,.#       
101c0 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 6a             the j
101d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
101e0 65 6c 65 74 65 64 2e 0a 23 0a 23 20 20 20 70 61  eleted..#.#   pa
101f0 67 65 72 31 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d  ger1-23.2.*: Sam
10200 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c  e test as above,
10210 20 62 75 74 20 77 68 69 6c 65 20 61 20 73 68 61   but while a sha
10220 72 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  red lock is held
10230 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
10240 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
10250 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20  ase file..#.#   
10260 70 61 67 65 72 31 2d 32 33 2e 33 2e 2a 3a 20 53  pager1-23.3.*: S
10270 61 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76  ame test as abov
10280 65 2c 20 62 75 74 20 77 68 69 6c 65 20 61 20 72  e, but while a r
10290 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 69 73 20  eserved lock is 
102a0 68 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20 20  held.#          
102b0 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64          on the d
102c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a  atabase file..#.
102d0 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 34 2e  #   pager1-23.4.
102e0 2a 3a 20 41 6e 64 2c 20 66 6f 72 20 66 75 6e 2c  *: And, for fun,
102f0 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
10300 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
10310 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
10320 33 2e 35 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65  3.5.*: Try to se
10330 74 20 76 61 72 69 6f 75 73 20 64 69 66 66 65 72  t various differ
10340 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent journal mode
10350 73 20 77 69 74 68 20 61 6e 0a 23 20 20 20 20 20  s with an.#     
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 2d               in-
10370 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
10380 28 6f 6e 6c 79 20 4d 45 4d 4f 52 59 20 61 6e 64  (only MEMORY and
10390 20 4f 46 46 20 73 68 6f 75 6c 64 20 77 6f 72 6b   OFF should work
103a0 29 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  )..#.#   pager1-
103b0 32 33 2e 36 2e 2a 3a 20 54 72 79 20 74 6f 20 73  23.6.*: Try to s
103c0 65 74 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  et locking_mode=
103d0 6e 6f 72 6d 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d  normal on an in-
103e0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a  memory database.
103f0 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
10400 20 20 20 28 64 6f 65 73 6e 27 74 20 77 6f 72 6b     (doesn't work
10410 20 2d 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74   - in-memory dat
10420 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 75 73  abases always us
10430 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
10440 20 20 20 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64       locking_mod
10450 65 3d 65 78 63 6c 75 73 69 76 65 29 2e 0a 23 0a  e=exclusive)..#.
10460 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10470 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  3.1.1 {.  faults
10480 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
10490 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
104a0 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
104b0 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
104c0 53 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ST;.    CREATE T
104d0 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
104e0 20 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   }.  file exists
104f0 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
10500 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {1}.do_test p
10510 61 67 65 72 31 2d 32 33 2e 31 2e 32 20 7b 0a 20  ager1-23.1.2 {. 
10520 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
10530 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
10540 20 44 45 4c 45 54 45 20 7d 0a 20 20 66 69 6c 65   DELETE }.  file
10550 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
10560 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64  journal.} {0}..d
10570 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
10580 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.1 {.  execsql
10590 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
105a0 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
105b0 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54  SIST;.    INSERT
105c0 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
105d0 27 43 61 6e 62 65 72 72 61 27 2c 20 27 41 43 54  'Canberra', 'ACT
105e0 27 29 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61  ');.  }.  db eva
105f0 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
10600 4d 20 74 31 20 7d 20 7b 0a 20 20 20 20 64 62 20  M t1 } {.    db 
10610 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
10620 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
10630 45 54 45 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63  ETE }.  }.  exec
10640 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
10650 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64  rnal_mode }.} {d
10660 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70  elete}.do_test p
10670 61 67 65 72 31 2d 32 33 2e 32 2e 32 20 7b 0a 20  ager1-23.2.2 {. 
10680 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
10690 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
106a0 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  0}..do_test page
106b0 72 31 2d 32 33 2e 33 2e 31 20 7b 0a 20 20 65 78  r1-23.3.1 {.  ex
106c0 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
106d0 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
106e0 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49  = PERSIST;.    I
106f0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
10700 4c 55 45 53 28 27 44 61 72 77 69 6e 27 2c 20 27  LUES('Darwin', '
10710 4e 54 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 20  NT');.    BEGIN 
10720 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20 7d 0a 20  IMMEDIATE;.  }. 
10730 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d   db eval { PRAGM
10740 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
10750 20 44 45 4c 45 54 45 20 7d 0a 20 20 65 78 65 63   DELETE }.  exec
10760 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
10770 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64  rnal_mode }.} {d
10780 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70  elete}.do_test p
10790 61 67 65 72 31 2d 32 33 2e 33 2e 32 20 7b 0a 20  ager1-23.3.2 {. 
107a0 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
107b0 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
107c0 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  0}.do_test pager
107d0 31 2d 32 33 2e 33 2e 33 20 7b 0a 20 20 65 78 65  1-23.3.3 {.  exe
107e0 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d  csql COMMIT.} {}
107f0 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
10800 2d 32 33 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63  -23.4.1 {.  exec
10810 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
10820 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
10830 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53  PERSIST;.    INS
10840 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
10850 45 53 28 27 41 64 65 6c 61 69 64 65 27 2c 20 27  ES('Adelaide', '
10860 53 41 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 20  SA');.    BEGIN 
10870 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
10880 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d   db eval { PRAGM
10890 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
108a0 20 44 45 4c 45 54 45 20 7d 0a 20 20 65 78 65 63   DELETE }.  exec
108b0 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  sql { PRAGMA jou
108c0 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64  rnal_mode }.} {d
108d0 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70  elete}.do_test p
108e0 61 67 65 72 31 2d 32 33 2e 34 2e 32 20 7b 0a 20  ager1-23.4.2 {. 
108f0 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
10900 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
10910 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  0}.do_test pager
10920 31 2d 32 33 2e 34 2e 33 20 7b 0a 20 20 65 78 65  1-23.4.3 {.  exe
10930 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d  csql COMMIT.} {}
10940 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
10950 2d 32 33 2e 35 2e 31 20 7b 0a 20 20 66 61 75 6c  -23.5.1 {.  faul
10960 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
10970 72 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33  reopen.  sqlite3
10980 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b   db :memory:.} {
10990 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6d 6f  }.foreach {tn mo
109a0 64 65 20 70 6f 73 73 69 62 6c 65 7d 20 7b 0a 20  de possible} {. 
109b0 20 32 20 20 6f 66 66 20 20 20 20 20 20 31 0a 20   2  off      1. 
109c0 20 33 20 20 6d 65 6d 6f 72 79 20 20 20 31 0a 20   3  memory   1. 
109d0 20 34 20 20 70 65 72 73 69 73 74 20 20 30 0a 20   4  persist  0. 
109e0 20 35 20 20 64 65 6c 65 74 65 20 20 20 30 0a 20   5  delete   0. 
109f0 20 36 20 20 77 61 6c 20 20 20 20 20 20 30 0a 20   6  wal      0. 
10a00 20 37 20 20 74 72 75 6e 63 61 74 65 20 30 0a 7d   7  truncate 0.}
10a10 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
10a20 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 31 20 7b  er1-23.5.$tn.1 {
10a30 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52  .    execsql "PR
10a40 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
10a50 65 20 3d 20 6f 66 66 22 0a 20 20 20 20 65 78 65  e = off".    exe
10a60 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75  csql "PRAGMA jou
10a70 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64  rnal_mode = $mod
10a80 65 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73 73  e".  } [if $poss
10a90 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65  ible {list $mode
10aa0 7d 20 7b 6c 69 73 74 20 6f 66 66 7d 5d 0a 20 20  } {list off}].  
10ab0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10ac0 33 2e 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  3.5.$tn.2 {.    
10ad0 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20  execsql "PRAGMA 
10ae0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d  journal_mode = m
10af0 65 6d 6f 72 79 22 0a 20 20 20 20 65 78 65 63 73  emory".    execs
10b00 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  ql "PRAGMA journ
10b10 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22  al_mode = $mode"
10b20 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62  .  } [if $possib
10b30 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20  le {list $mode} 
10b40 7b 6c 69 73 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d  {list memory}].}
10b50 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
10b60 32 33 2e 36 2e 31 20 7b 0a 20 20 65 78 65 63 73  23.6.1 {.  execs
10b70 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69  ql {PRAGMA locki
10b80 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c  ng_mode = normal
10b90 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a  }.} {exclusive}.
10ba0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10bb0 33 2e 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  3.6.2 {.  execsq
10bc0 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e  l {PRAGMA lockin
10bd0 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69  g_mode = exclusi
10be0 76 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65  ve}.} {exclusive
10bf0 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
10c00 2d 32 33 2e 36 2e 33 20 7b 0a 20 20 65 78 65 63  -23.6.3 {.  exec
10c10 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b  sql {PRAGMA lock
10c20 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63  ing_mode}.} {exc
10c30 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20  lusive}.do_test 
10c40 70 61 67 65 72 31 2d 32 33 2e 36 2e 34 20 7b 0a  pager1-23.6.4 {.
10c50 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d    execsql {PRAGM
10c60 41 20 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d  A main.locking_m
10c70 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  ode}.} {exclusiv
10c80 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e}..#-----------
10c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
10cd0 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
10ce0 32 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  24.1.1 {.  fault
10cf0 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
10d00 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
10d10 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
10d20 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
10d30 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
10d40 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52  ize = 10;.    PR
10d50 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
10d60 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 43 52 45   = FULL;.    CRE
10d70 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 2c 20  ATE TABLE x1(x, 
10d80 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45  y, z, PRIMARY KE
10d90 59 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20 43 52  Y(y, z));.    CR
10da0 45 41 54 45 20 54 41 42 4c 45 20 78 32 28 78 2c  EATE TABLE x2(x,
10db0 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b   y, z, PRIMARY K
10dc0 45 59 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20 49  EY(y, z));.    I
10dd0 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41  NSERT INTO x2 VA
10de0 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 34 30  LUES(a_string(40
10df0 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
10e00 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10e10 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10e20 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73  TO x2 SELECT a_s
10e30 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74  tring(600), a_st
10e40 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72  ring(400), a_str
10e50 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20 78 32  ing(500) FROM x2
10e60 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10e70 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74  O x2 SELECT a_st
10e80 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
10e90 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69  ing(600), a_stri
10ea0 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 78 32 3b  ng(400) FROM x2;
10eb0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10ec0 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   x2 SELECT a_str
10ed0 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69  ing(400), a_stri
10ee0 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
10ef0 67 28 36 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a  g(600) FROM x2;.
10f00 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10f10 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  x2 SELECT a_stri
10f20 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(600), a_strin
10f30 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(400), a_string
10f40 28 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20  (500) FROM x2;. 
10f50 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
10f60 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
10f70 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(500), a_string
10f80 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (600), a_string(
10f90 34 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  400) FROM x2;.  
10fa0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
10fb0 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
10fc0 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
10fd0 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  500), a_string(6
10fe0 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
10ff0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
11000 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32  SELECT * FROM x2
11010 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
11020 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 32  st pager1-24.1.2
11030 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
11040 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
11050 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 20 57  DELETE FROM x1 W
11060 48 45 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20  HERE rowid<32;. 
11070 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73   }.  recursive_s
11080 65 6c 65 63 74 20 36 34 20 78 32 0a 7d 20 7b 7d  elect 64 x2.} {}
11090 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
110a0 32 34 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  24.1.3 {.  execs
110b0 71 6c 20 7b 20 0a 20 20 20 20 20 20 55 50 44 41  ql { .      UPDA
110c0 54 45 20 78 31 20 53 45 54 20 7a 20 3d 20 61 5f  TE x1 SET z = a_
110d0 73 74 72 69 6e 67 28 33 30 30 29 20 57 48 45 52  string(300) WHER
110e0 45 20 72 6f 77 69 64 3e 34 30 3b 0a 20 20 20 20  E rowid>40;.    
110f0 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47  COMMIT;.    PRAG
11100 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
11110 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  ck;.    SELECT c
11120 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b  ount(*) FROM x1;
11130 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a  .  }.} {ok 33}..
11140 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11150 34 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  4.1.4 {.  execsq
11160 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
11170 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53 45  ROM x1;.    INSE
11180 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43  RT INTO x1 SELEC
11190 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  T * FROM x2;.   
111a0 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45   BEGIN;.      DE
111b0 4c 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45  LETE FROM x1 WHE
111c0 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 20  RE rowid<32;.   
111d0 20 20 20 55 50 44 41 54 45 20 78 31 20 53 45 54     UPDATE x1 SET
111e0 20 7a 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 39   z = a_string(29
111f0 39 29 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34  9) WHERE rowid>4
11200 30 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69  0;.  }.  recursi
11210 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32 20  ve_select 64 x2 
11220 7b 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54 7d  {db eval COMMIT}
11230 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11240 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
11250 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c  y_check;.    SEL
11260 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
11270 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20  M x1;.  }.} {ok 
11280 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  33}..do_test pag
11290 65 72 31 2d 32 34 2e 31 2e 35 20 7b 0a 20 20 65  er1-24.1.5 {.  e
112a0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
112b0 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20  ETE FROM x1;.   
112c0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
112d0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32  SELECT * FROM x2
112e0 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76  ;.  }.  recursiv
112f0 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32 20 7b  e_select 64 x2 {
11300 20 64 62 20 65 76 61 6c 20 7b 43 52 45 41 54 45   db eval {CREATE
11310 20 54 41 42 4c 45 20 78 33 28 78 2c 20 79 2c 20   TABLE x3(x, y, 
11320 7a 29 7d 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  z)} }.  execsql 
11330 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
11340 78 33 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  x3 }.} {}..#----
11350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11390 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20  -----.#.do_test 
113a0 70 61 67 65 72 31 2d 32 35 2d 31 20 7b 0a 20 20  pager1-25-1 {.  
113b0 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
113c0 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
113d0 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
113e0 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e  ;.      SAVEPOIN
113f0 54 20 61 62 63 3b 0a 20 20 20 20 20 20 20 20 43  T abc;.        C
11400 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
11410 2c 20 62 29 3b 0a 20 20 20 20 20 20 52 4f 4c 4c  , b);.      ROLL
11420 42 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20  BACK TO abc;.   
11430 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64   COMMIT;.  }.  d
11440 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f  b close.} {}.do_
11450 74 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 32  test pager1-25-2
11460 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
11470 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
11480 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
11490 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20  SAVEPOINT abc;. 
114a0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
114b0 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
114c0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b  ROLLBACK TO abc;
114d0 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
114e0 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d  .  db close.} {}
114f0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
11500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53  ------------.# S
11540 65 63 74 6f 72 2d 73 69 7a 65 20 74 65 73 74 73  ector-size tests
11550 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
11560 72 31 2d 32 36 2e 31 20 7b 0a 20 20 74 65 73 74  r1-26.1 {.  test
11570 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
11580 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  1.  tv sectorsiz
11590 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69  e 4096.  faultsi
115a0 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
115b0 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
115c0 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
115d0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
115e0 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
115f0 20 3d 20 35 31 32 3b 0a 20 20 20 20 43 52 45 41   = 512;.    CREA
11600 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 20 50  TE TABLE tbl(a P
11610 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e  RIMARY KEY, b UN
11620 49 51 55 45 29 3b 0a 20 20 20 20 42 45 47 49 4e  IQUE);.    BEGIN
11630 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
11640 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 61  NTO tbl VALUES(a
11650 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
11660 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20  tring(600));.   
11670 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11680 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
11690 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
116a0 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
116b0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
116c0 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
116d0 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
116e0 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
116f0 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
11700 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
11710 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
11720 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
11730 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45   tbl;.      INSE
11740 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
11750 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
11760 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
11770 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49  ROM tbl;.      I
11780 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
11790 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
117a0 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
117b0 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
117c0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
117d0 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
117e0 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
117f0 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
11800 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
11810 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
11820 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
11830 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
11840 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
11850 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71  }.} {}.do_execsq
11860 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 36  l_test pager1-26
11870 2e 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74 62  .1 {.  UPDATE tb
11880 6c 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  l SET b = a_stri
11890 6e 67 28 35 35 30 29 3b 0a 7d 20 7b 7d 0a 64 62  ng(550);.} {}.db
118a0 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
118b0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
118c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64  ------------.#.d
11900 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 32 37  o_test pager1.27
11910 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
11920 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
11930 6e 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  n.  sqlite3_page
11940 72 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20  r_refcounts db. 
11950 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
11960 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
11970 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
11980 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11990 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
119a0 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20 43 4f   db.  execsql CO
119b0 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  MMIT.} {}..#----
119c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a00 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
11a10 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  t attempting to 
11a20 6f 70 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61  open a write-tra
11a30 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 20 0a 23  nsaction with .#
11a40 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
11a50 63 6c 75 73 69 76 65 20 69 6e 20 57 41 4c 20 6d  clusive in WAL m
11a60 6f 64 65 20 66 61 69 6c 73 20 69 66 20 74 68 65  ode fails if the
11a70 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6c 69  re are other cli
11a80 65 6e 74 73 20 6f 6e 20 0a 23 20 74 68 65 20 73  ents on .# the s
11a90 61 6d 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a  ame database..#.
11aa0 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
11ab0 20 7d 0a 69 66 20 7b 24 3a 3a 73 71 6c 69 74 65   }.if {$::sqlite
11ac0 5f 6f 70 74 69 6f 6e 73 28 77 61 6c 29 20 26 26  _options(wal) &&
11ad0 20 5b 77 61 6c 5f 69 73 5f 6f 6b 5d 7d 20 7b 0a   [wal_is_ok]} {.
11ae0 20 20 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74    do_multiclient
11af0 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 20 20 64  _test tn {.    d
11b00 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11b10 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 73  .$tn.1 {.      s
11b20 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 20 20 50  ql1 { .        P
11b30 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
11b40 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20  de = WAL;.      
11b50 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
11b60 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20  1(a, b);.       
11b70 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11b80 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
11b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
11ba0 7b 77 61 6c 7d 0a 20 20 20 20 64 6f 5f 74 65 73  {wal}.    do_tes
11bb0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11bc0 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43  2 { sql2 { SELEC
11bd0 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
11be0 7b 61 20 62 7d 0a 0a 20 20 20 20 64 6f 5f 74 65  {a b}..    do_te
11bf0 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11c00 2e 33 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47  .3 { sql1 { PRAG
11c10 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  MA locking_mode=
11c20 65 78 63 6c 75 73 69 76 65 20 7d 20 7d 20 7b 65  exclusive } } {e
11c30 78 63 6c 75 73 69 76 65 7d 0a 20 20 20 20 64 6f  xclusive}.    do
11c40 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11c50 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 63  $tn.4 { .      c
11c60 73 71 6c 31 20 7b 20 42 45 47 49 4e 3b 20 49 4e  sql1 { BEGIN; IN
11c70 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11c80 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 20 7d  UES('c', 'd'); }
11c90 0a 20 20 20 20 7d 20 7b 31 20 7b 64 61 74 61 62  .    } {1 {datab
11ca0 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
11cb0 20 20 20 20 63 6f 64 65 32 20 7b 20 64 62 32 20      code2 { db2 
11cc0 63 6c 6f 73 65 20 3b 20 73 71 6c 69 74 65 33 20  close ; sqlite3 
11cd0 64 62 32 20 74 65 73 74 2e 64 62 20 7d 0a 20 20  db2 test.db }.  
11ce0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11cf0 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20  -28.$tn.4 { .   
11d00 20 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52 54     sql1 { INSERT
11d10 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
11d20 27 63 27 2c 20 27 64 27 29 3b 20 43 4f 4d 4d 49  'c', 'd'); COMMI
11d30 54 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 7d  T }.    } {}.  }
11d40 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
11d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
11d90 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65 6e 20   Normally, when 
11da0 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 6a 6f  changing from jo
11db0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49  urnal_mode=PERSI
11dc0 53 54 20 74 6f 20 44 45 4c 45 54 45 20 74 68 65  ST to DELETE the
11dd0 20 70 61 67 65 72 0a 23 20 61 74 74 65 6d 70 74   pager.# attempt
11de0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
11df0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 48 6f  journal file. Ho
11e00 77 65 76 65 72 2c 20 69 66 20 69 74 20 63 61 6e  wever, if it can
11e10 6e 6f 74 20 6f 62 74 61 69 6e 20 61 0a 23 20 52  not obtain a.# R
11e20 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
11e30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11e40 65 2c 20 74 68 69 73 20 73 74 65 70 20 69 73 20  e, this step is 
11e50 73 6b 69 70 70 65 64 2e 0a 23 0a 64 6f 5f 6d 75  skipped..#.do_mu
11e60 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74  lticlient_test t
11e70 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  n {.  do_test pa
11e80 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a  ger1-28.$tn.1 {.
11e90 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20      sql1 { .    
11ea0 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
11eb0 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
11ec0 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
11ed0 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
11ee0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11ef0 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t1 VALUES('a', '
11f00 62 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  b');.    }.  } {
11f10 70 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65  persist}.  do_te
11f20 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
11f30 2e 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  .2 { file exists
11f40 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
11f50 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70   } 1.  do_test p
11f60 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b  ager1-28.$tn.3 {
11f70 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a   sql1 { PRAGMA j
11f80 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
11f90 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a  LETE } } delete.
11fa0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11fb0 2d 32 38 2e 24 74 6e 2e 34 20 7b 20 66 69 6c 65  -28.$tn.4 { file
11fc0 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
11fd0 6a 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64  journal } 0..  d
11fe0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11ff0 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 73 71 6c  .$tn.5 {.    sql
12000 31 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d  1 { .      PRAGM
12010 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
12020 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 20 20   PERSIST;.      
12030 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
12040 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b  ALUES('c', 'd');
12050 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73  .    }.  } {pers
12060 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ist}.  do_test p
12070 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 36 20 7b  ager1-28.$tn.6 {
12080 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
12090 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
120a0 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
120b0 31 2d 32 38 2e 24 74 6e 2e 37 20 7b 0a 20 20 20  1-28.$tn.7 {.   
120c0 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49   sql2 { BEGIN; I
120d0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
120e0 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29 3b 20  LUES('e', 'f'); 
120f0 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
12100 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
12110 2e 38 20 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .8  { file exist
12120 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
12130 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20  l } 1.  do_test 
12140 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 39 20  pager1-28.$tn.9 
12150 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41   { sql1 { PRAGMA
12160 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
12170 44 45 4c 45 54 45 20 7d 20 7d 20 64 65 6c 65 74  DELETE } } delet
12180 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  e.  do_test page
12190 72 31 2d 32 38 2e 24 74 6e 2e 31 30 20 7b 20 66  r1-28.$tn.10 { f
121a0 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
121b0 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a  db-journal } 1..
121c0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
121d0 2d 32 38 2e 24 74 6e 2e 31 31 20 7b 20 73 71 6c  -28.$tn.11 { sql
121e0 32 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20  2 COMMIT } {}.  
121f0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
12200 38 2e 24 74 6e 2e 31 32 20 7b 20 66 69 6c 65 20  8.$tn.12 { file 
12210 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
12220 6f 75 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f  ournal } 0..  do
12230 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d  _test pager1-28-
12240 24 74 6e 2e 31 33 20 7b 0a 20 20 20 20 63 6f 64  $tn.13 {.    cod
12250 65 31 20 7b 20 73 65 74 20 63 68 61 6e 6e 65 6c  e1 { set channel
12260 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72   [db incrblob -r
12270 65 61 64 6f 6e 6c 79 20 74 31 20 61 20 32 5d 20  eadonly t1 a 2] 
12280 7d 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20  }.    sql1 {.   
12290 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
122a0 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
122b0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
122c0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 67  NTO t1 VALUES('g
122d0 27 2c 20 27 68 27 29 3b 0a 20 20 20 20 7d 0a 20  ', 'h');.    }. 
122e0 20 7d 20 7b 70 65 72 73 69 73 74 7d 0a 20 20 64   } {persist}.  d
122f0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
12300 2e 24 74 6e 2e 31 34 20 7b 20 66 69 6c 65 20 65  .$tn.14 { file e
12310 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
12320 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74  urnal } 1.  do_t
12330 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
12340 6e 2e 31 35 20 7b 0a 20 20 20 20 73 71 6c 32 20  n.15 {.    sql2 
12350 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20  { BEGIN; INSERT 
12360 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
12370 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20  e', 'f'); }.  } 
12380 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  {}.  do_test pag
12390 65 72 31 2d 32 38 2e 24 74 6e 2e 31 36 20 7b 20  er1-28.$tn.16 { 
123a0 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f  sql1 { PRAGMA jo
123b0 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
123c0 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20  ETE } } delete. 
123d0 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
123e0 32 38 2e 24 74 6e 2e 31 37 20 7b 20 66 69 6c 65  28.$tn.17 { file
123f0 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
12400 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64  journal } 1..  d
12410 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
12420 2e 24 74 6e 2e 31 37 20 7b 20 63 73 71 6c 32 20  .$tn.17 { csql2 
12430 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 31 20  { COMMIT } } {1 
12440 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
12450 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
12460 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e 31 38  pager1-28-$tn.18
12470 20 7b 20 63 6f 64 65 31 20 7b 20 72 65 61 64 20   { code1 { read 
12480 24 63 68 61 6e 6e 65 6c 20 7d 20 7d 20 63 0a 20  $channel } } c. 
12490 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
124a0 32 38 2d 24 74 6e 2e 31 39 20 7b 20 63 6f 64 65  28-$tn.19 { code
124b0 31 20 7b 20 63 6c 6f 73 65 20 24 63 68 61 6e 6e  1 { close $chann
124c0 65 6c 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  el } } {}.  do_t
124d0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
124e0 6e 2e 32 30 20 7b 20 73 71 6c 32 20 7b 20 43 4f  n.20 { sql2 { CO
124f0 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 7d 0a 0a 64  MMIT } } {}.}..d
12500 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 39  o_test pager1-29
12510 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
12520 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
12530 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
12540 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
12550 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50  ze = 1024;.    P
12560 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
12570 6d 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 50 52  m = full;.    PR
12580 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
12590 65 3d 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20  e=exclusive;.   
125a0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
125b0 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
125c0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
125d0 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 66  S(1, 2);.  }.  f
125e0 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
125f0 0a 7d 20 5b 65 78 70 72 20 31 30 32 34 2a 33 5d  .} [expr 1024*3]
12600 0a 69 66 20 7b 5b 6e 6f 6e 7a 65 72 6f 5f 72 65  .if {[nonzero_re
12610 73 65 72 76 65 64 5f 62 79 74 65 73 5d 7d 20 7b  served_bytes]} {
12620 0a 20 20 23 20 56 41 43 55 55 4d 20 77 69 74 68  .  # VACUUM with
12630 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 69 73   size changes is
12640 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 77 69   not possible wi
12650 74 68 20 74 68 65 20 63 6f 64 65 63 2e 0a 20 20  th the codec..  
12660 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
12670 39 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73  9.2 {.    catchs
12680 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
12690 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30  A page_size = 40
126a0 39 36 3b 0a 20 20 20 20 20 20 56 41 43 55 55 4d  96;.      VACUUM
126b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  ;.    }.  } {1 {
126c0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
126d0 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61   a readonly data
126e0 62 61 73 65 7d 7d 0a 7d 20 65 6c 73 65 20 7b 0a  base}}.} else {.
126f0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
12700 2d 32 39 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  -29.2 {.    exec
12710 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
12720 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34  MA page_size = 4
12730 30 39 36 3b 0a 20 20 20 20 20 20 56 41 43 55 55  096;.      VACUU
12740 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c  M;.    }.    fil
12750 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20  e size test.db. 
12760 20 7d 20 5b 65 78 70 72 20 34 30 39 36 2a 33 5d   } [expr 4096*3]
12770 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
12780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
127c0 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61 6e   Test that if an
127d0 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
127e0 66 69 6c 65 20 28 73 69 7a 65 20 30 20 62 79 74  file (size 0 byt
127f0 65 73 29 20 69 73 20 6f 70 65 6e 65 64 20 69 6e  es) is opened in
12800 20 0a 23 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f   .# exclusive-lo
12810 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 6e 79 20  cking mode, any 
12820 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12830 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
12840 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 23 20 77   file-system.# w
12850 69 74 68 6f 75 74 20 62 65 69 6e 67 20 72 6f 6c  ithout being rol
12860 6c 65 64 20 62 61 63 6b 2e 20 41 6e 64 20 74 68  led back. And th
12870 61 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  at the RESERVED 
12880 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20 77 68  lock obtained wh
12890 69 6c 65 0a 23 20 64 6f 69 6e 67 20 74 68 69 73  ile.# doing this
128a0 20 69 73 20 6e 6f 74 20 72 65 6c 65 61 73 65 64   is not released
128b0 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
128c0 72 31 2d 33 30 2e 31 20 7b 0a 20 20 64 62 20 63  r1-30.1 {.  db c
128d0 6c 6f 73 65 0a 20 20 64 65 6c 65 74 65 5f 66 69  lose.  delete_fi
128e0 6c 65 20 74 65 73 74 2e 64 62 0a 20 20 64 65 6c  le test.db.  del
128f0 65 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62  ete_file test.db
12900 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 65 74 20 66  -journal.  set f
12910 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d  d [open test.db-
12920 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20 20 73 65 65  journal w].  see
12930 6b 20 24 66 64 20 5b 65 78 70 72 20 35 31 32 2b  k $fd [expr 512+
12940 31 30 33 32 2a 32 5d 0a 20 20 70 75 74 73 20 2d  1032*2].  puts -
12950 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 78 0a  nonewline $fd x.
12960 20 20 63 6c 6f 73 65 20 24 66 64 0a 0a 20 20 73    close $fd..  s
12970 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
12980 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
12990 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
129a0 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b  _mode=EXCLUSIVE;
129b0 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
129c0 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  t(*) FROM sqlite
129d0 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 50 52 41  _master;.    PRA
129e0 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b  GMA lock_status;
129f0 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  .  }.} {exclusiv
12a00 65 20 30 20 6d 61 69 6e 20 72 65 73 65 72 76 65  e 0 main reserve
12a10 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a  d temp closed}..
12a20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
12a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
12a70 74 20 74 68 61 74 20 69 66 20 74 68 65 20 22 70  t that if the "p
12a80 61 67 65 2d 73 69 7a 65 22 20 66 69 65 6c 64 20  age-size" field 
12a90 69 6e 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  in a journal-hea
12aa0 64 65 72 20 69 73 20 30 2c 20 74 68 65 20 6a 6f  der is 0, the jo
12ab0 75 72 6e 61 6c 0a 23 20 66 69 6c 65 20 63 61 6e  urnal.# file can
12ac0 20 73 74 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64   still be rolled
12ad0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 72   back. This is r
12ae0 65 71 75 69 72 65 64 20 66 6f 72 20 62 61 63 6b  equired for back
12af0 77 61 72 64 20 63 6f 6d 70 61 74 69 62 69 6c 69  ward compatibili
12b00 74 79 20 2d 0a 23 20 76 65 72 73 69 6f 6e 73 20  ty -.# versions 
12b10 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
12b20 74 6f 20 33 2e 35 2e 38 20 61 6c 77 61 79 73 20  to 3.5.8 always 
12b30 73 65 74 20 74 68 69 73 20 66 69 65 6c 64 20 74  set this field t
12b40 6f 20 7a 65 72 6f 2e 0a 23 0a 69 66 20 7b 24 74  o zero..#.if {$t
12b50 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74  cl_platform(plat
12b60 66 6f 72 6d 29 3d 3d 22 75 6e 69 78 22 7d 20 7b  form)=="unix"} {
12b70 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
12b80 33 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  31.1 {.  faultsi
12b90 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
12ba0 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
12bb0 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
12bc0 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
12bd0 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
12be0 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
12bf0 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20  ATE TABLE t1(x, 
12c00 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
12c10 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12c20 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
12c30 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
12c40 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b  ndomblob(1500));
12c50 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12c60 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
12c70 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
12c80 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
12c90 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
12ca0 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
12cb0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
12cc0 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
12cd0 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
12ce0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
12cf0 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
12d00 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
12d10 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
12d20 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
12d30 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
12d40 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
12d50 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
12d60 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
12d70 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
12d80 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
12d90 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
12da0 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
12db0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
12dc0 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
12dd0 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
12de0 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
12df0 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
12e00 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
12e10 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
12e20 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
12e30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
12e40 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
12e50 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
12e60 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
12e70 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
12e80 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12e90 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
12ea0 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
12eb0 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
12ec0 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
12ed0 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
12ee0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
12ef0 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
12f00 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
12f10 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
12f20 44 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20  DATE t1 SET y = 
12f30 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 34 39 39 29  randomblob(1499)
12f40 3b 0a 20 20 7d 0a 20 20 63 6f 70 79 5f 66 69 6c  ;.  }.  copy_fil
12f50 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
12f60 62 32 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74  b2.  copy_file t
12f70 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74  est.db-journal t
12f80 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 0a  est.db2-journal.
12f90 20 20 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65    .  hexio_write
12fa0 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61   test.db2-journa
12fb0 6c 20 32 34 20 30 30 30 30 30 30 30 30 0a 20 20  l 24 00000000.  
12fc0 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
12fd0 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b  .db2.  execsql {
12fe0 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
12ff0 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20  y_check } db2.} 
13000 7b 6f 6b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  {ok}.}..#-------
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13050 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61  --.# Test that a
13060 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
13070 61 6e 20 62 65 20 22 70 72 65 2d 68 69 6e 74 65  an be "pre-hinte
13080 64 22 20 74 6f 20 61 20 63 65 72 74 61 69 6e 20  d" to a certain 
13090 73 69 7a 65 20 61 6e 64 20 74 68 61 74 0a 23 20  size and that.# 
130a0 73 75 62 73 65 71 75 65 6e 74 20 73 70 69 6c 6c  subsequent spill
130b0 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 72  ing of the pager
130c0 20 63 61 63 68 65 20 64 6f 65 73 20 6e 6f 74 20   cache does not 
130d0 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 64 61  result in the da
130e0 74 61 62 61 73 65 0a 23 20 66 69 6c 65 20 62 65  tabase.# file be
130f0 69 6e 67 20 73 68 72 75 6e 6b 2e 0a 23 0a 63 61  ing shrunk..#.ca
13100 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 66  tch {db close}.f
13110 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
13120 64 62 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  db..do_test page
13130 72 31 2d 33 32 2e 31 20 7b 0a 20 20 73 71 6c 69  r1-32.1 {.  sqli
13140 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
13150 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
13160 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
13170 2c 20 79 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63  , y);.  }.  db c
13180 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64  lose.  sqlite3 d
13190 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
131a0 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
131b0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
131c0 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61   t1 VALUES(1, ra
131d0 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29  ndomblob(10000))
131e0 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 5f 63 6f 6e  ;.  }.  file_con
131f0 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74  trol_chunksize_t
13200 65 73 74 20 64 62 20 6d 61 69 6e 20 31 30 32 34  est db main 1024
13210 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  .  file_control_
13220 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 64 62  sizehint_test db
13230 20 6d 61 69 6e 20 32 30 39 37 31 35 32 30 3b 20   main 20971520; 
13240 23 20 32 30 4d 42 0a 20 20 65 78 65 63 73 71 6c  # 20MB.  execsql
13250 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
13260 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
13270 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13280 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64  1 VALUES(1, rand
13290 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a  omblob(10000));.
132a0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
132b0 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e  t1 VALUES(2, ran
132c0 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b  domblob(10000));
132d0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
132e0 20 74 31 20 53 45 4c 45 43 54 20 78 2b 32 2c 20   t1 SELECT x+2, 
132f0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30  randomblob(10000
13300 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49  ) from t1;.    I
13310 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
13320 4c 45 43 54 20 78 2b 34 2c 20 72 61 6e 64 6f 6d  LECT x+4, random
13330 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d  blob(10000) from
13340 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
13350 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78  INTO t1 SELECT x
13360 2b 38 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  +8, randomblob(1
13370 30 30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20  0000) from t1;. 
13380 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13390 31 20 53 45 4c 45 43 54 20 78 2b 31 36 2c 20 72  1 SELECT x+16, r
133a0 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29  andomblob(10000)
133b0 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 53 45   from t1;.    SE
133c0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
133d0 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49  OM t1;.    COMMI
133e0 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73  T;.  }.  db clos
133f0 65 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  e.  file size te
13400 73 74 2e 64 62 0a 7d 20 7b 32 30 39 37 31 35 32  st.db.} {2097152
13410 30 7d 0a 0a 23 20 43 6c 65 61 6e 75 70 20 32 30  0}..# Cleanup 20
13420 4d 42 20 66 69 6c 65 20 6c 65 66 74 20 62 79 20  MB file left by 
13430 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 73  the previous tes
13440 74 2e 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  t..forcedelete t
13450 65 73 74 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  est.db..#-------
13460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134a0 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  --.# Test that i
134b0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
134c0 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20  is committed in 
134d0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45 4c  journal_mode=DEL
134e0 45 54 45 20 6d 6f 64 65 2c 0a 23 20 61 6e 64 20  ETE mode,.# and 
134f0 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 69  the call to unli
13500 6e 6b 28 29 20 72 65 74 75 72 6e 73 20 61 6e 20  nk() returns an 
13510 45 4e 4f 45 4e 54 20 65 72 72 6f 72 2c 20 74 68  ENOENT error, th
13520 65 20 43 4f 4d 4d 49 54 20 64 6f 65 73 20 6e 6f  e COMMIT does no
13530 74 0a 23 20 73 75 63 63 65 65 64 2e 0a 23 0a 69  t.# succeed..#.i
13540 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  f {$::tcl_platfo
13550 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75  rm(platform)=="u
13560 6e 69 78 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  nix"} {.  do_tes
13570 74 20 70 61 67 65 72 31 2d 33 33 2e 31 20 7b 0a  t pager1-33.1 {.
13580 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
13590 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
135a0 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
135b0 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
135c0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
135d0 20 74 31 20 56 41 4c 55 45 53 28 27 6f 6e 65 27   t1 VALUES('one'
135e0 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
135f0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
13600 74 77 6f 27 29 3b 0a 20 20 20 20 20 20 42 45 47  two');.      BEG
13610 49 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  IN;.        INSE
13620 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
13630 53 28 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20  S('three');.    
13640 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13650 74 31 20 56 41 4c 55 45 53 28 27 66 6f 75 72 27  t1 VALUES('four'
13660 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
13670 63 65 64 65 6c 65 74 65 20 62 61 6b 2d 6a 6f 75  cedelete bak-jou
13680 72 6e 61 6c 0a 20 20 20 20 66 69 6c 65 20 72 65  rnal.    file re
13690 6e 61 6d 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  name test.db-jou
136a0 72 6e 61 6c 20 62 61 6b 2d 6a 6f 75 72 6e 61 6c  rnal bak-journal
136b0 0a 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 43  ..    catchsql C
136c0 4f 4d 4d 49 54 0a 20 20 7d 20 7b 31 20 7b 64 69  OMMIT.  } {1 {di
136d0 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a  sk I/O error}}..
136e0 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
136f0 2d 33 33 2e 32 20 7b 0a 20 20 20 20 66 69 6c 65  -33.2 {.    file
13700 20 72 65 6e 61 6d 65 20 62 61 6b 2d 6a 6f 75 72   rename bak-jour
13710 6e 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  nal test.db-jour
13720 6e 61 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20  nal.    execsql 
13730 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
13740 74 31 20 7d 0a 20 20 7d 20 7b 6f 6e 65 20 74 77  t1 }.  } {one tw
13750 6f 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  o}.}..#---------
13760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137a0 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 70 70  .# Test that app
137b0 65 6e 64 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ending pages to 
137c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
137d0 65 20 74 68 65 6e 20 6d 6f 76 69 6e 67 20 74 68  e then moving th
137e0 6f 73 65 20 70 61 67 65 73 0a 23 20 74 6f 20 74  ose pages.# to t
137f0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 62 65 66  he free-list bef
13800 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
13810 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
13820 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 0a   does not cause.
13830 23 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 66 6f  # an error..#.fo
13840 72 65 61 63 68 20 7b 74 6e 20 70 72 61 67 6d 61  reach {tn pragma
13850 20 73 74 72 73 69 7a 65 7d 20 7b 0a 20 20 31 20   strsize} {.  1 
13860 7b 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69  { PRAGMA mmap_si
13870 7a 65 20 3d 20 30 20 7d 20 32 34 30 30 0a 20 20  ze = 0 } 2400.  
13880 32 20 7b 20 7d 20 20 20 20 20 20 20 20 20 20 20  2 { }           
13890 20 20 20 20 20 20 20 20 20 20 20 20 32 34 30 30              2400
138a0 0a 20 20 33 20 7b 20 50 52 41 47 4d 41 20 6d 6d  .  3 { PRAGMA mm
138b0 61 70 5f 73 69 7a 65 20 3d 20 30 20 7d 20 34 34  ap_size = 0 } 44
138c0 30 30 0a 20 20 34 20 7b 20 7d 20 20 20 20 20 20  00.  4 { }      
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 34 34 30 30 0a 7d 20 7b 0a 20 20 72 65 73 65   4400.} {.  rese
138f0 74 5f 64 62 0a 20 20 64 62 20 66 75 6e 63 20 61  t_db.  db func a
13900 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
13910 0a 20 20 64 62 20 65 76 61 6c 20 24 70 72 61 67  .  db eval $prag
13920 6d 61 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  ma.  do_execsql_
13930 74 65 73 74 20 33 34 2e 24 74 6e 2e 31 20 7b 0a  test 34.$tn.1 {.
13940 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
13950 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
13960 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
13970 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a  LUES(1, 2);.  }.
13980 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
13990 74 20 33 34 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  t 34.$tn.2 {.   
139a0 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
139b0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
139c0 53 28 32 2c 20 61 5f 73 74 72 69 6e 67 28 24 73  S(2, a_string($s
139d0 74 72 73 69 7a 65 29 29 3b 0a 20 20 20 20 44 45  trsize));.    DE
139e0 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
139f0 52 45 20 6f 69 64 3d 32 3b 0a 20 20 20 20 43 4f  RE oid=2;.    CO
13a00 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41  MMIT;.    PRAGMA
13a10 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
13a20 3b 0a 20 20 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 23 2d  ;.  } {ok}.}..#-
13a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a70 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74  --------.#.reset
13a80 5f 64 62 0a 64 6f 5f 74 65 73 74 20 33 35 20 7b  _db.do_test 35 {
13a90 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
13aa0 73 74 2e 64 62 0a 0a 20 20 65 78 65 63 73 71 6c  st.db..  execsql
13ab0 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
13ac0 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20  BLE t1(x, y);.  
13ad0 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
13ae0 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
13af0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
13b00 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
13b10 7d 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  }..  execsql {. 
13b20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
13b30 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
13b40 61 2c 20 62 29 3b 0a 20 20 7d 0a 0a 20 20 68 65  a, b);.  }..  he
13b50 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
13b60 62 2d 73 68 6d 20 5b 65 78 70 72 20 31 36 2a 31  b-shm [expr 16*1
13b70 30 32 34 5d 20 5b 73 74 72 69 6e 67 20 72 65 70  024] [string rep
13b80 65 61 74 20 30 30 35 35 20 38 31 39 32 5d 0a 20  eat 0055 8192]. 
13b90 20 63 61 74 63 68 73 71 6c 20 52 4f 4c 4c 42 41   catchsql ROLLBA
13ba0 43 4b 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f  CK.} {0 {}}..do_
13bb0 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
13bc0 20 74 6e 20 7b 0a 20 20 73 71 6c 31 20 7b 0a 20   tn {.  sql1 {. 
13bd0 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
13be0 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 43  acuum = 0;.    C
13bf0 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
13c00 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , y);.    INSERT
13c10 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
13c20 31 2c 20 32 29 3b 0a 20 20 7d 0a 0a 20 20 64 6f  1, 2);.  }..  do
13c30 5f 74 65 73 74 20 33 36 2e 24 74 6e 2e 31 20 7b  _test 36.$tn.1 {
13c40 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 50 52 41   .    sql2 { PRA
13c50 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
13c60 6e 74 20 3d 20 32 20 7d 0a 20 20 20 20 6c 69 73  nt = 2 }.    lis
13c70 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 32 20  t [catch { sql2 
13c80 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  { CREATE TABLE t
13c90 32 28 78 29 20 7d 20 7d 20 6d 73 67 5d 20 24 6d  2(x) } } msg] $m
13ca0 73 67 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62  sg.  } {1 {datab
13cb0 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66  ase or disk is f
13cc0 75 6c 6c 7d 7d 0a 0a 20 20 73 71 6c 31 20 7b 20  ull}}..  sql1 { 
13cd0 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e  PRAGMA checkpoin
13ce0 74 5f 66 75 6c 6c 66 73 79 6e 63 20 3d 20 31 20  t_fullfsync = 1 
13cf0 7d 0a 20 20 73 71 6c 31 20 7b 20 43 52 45 41 54  }.  sql1 { CREAT
13d00 45 20 54 41 42 4c 45 20 74 32 28 78 29 20 7d 0a  E TABLE t2(x) }.
13d10 0a 20 20 64 6f 5f 74 65 73 74 20 33 36 2e 24 74  .  do_test 36.$t
13d20 6e 2e 32 20 7b 20 0a 20 20 20 20 73 71 6c 32 20  n.2 { .    sql2 
13d30 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32  { INSERT INTO t2
13d40 20 56 41 4c 55 45 53 28 27 78 79 7a 27 29 20 7d   VALUES('xyz') }
13d50 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68  .    list [catch
13d60 20 7b 20 73 71 6c 32 20 7b 20 43 52 45 41 54 45   { sql2 { CREATE
13d70 20 54 41 42 4c 45 20 74 33 28 78 29 20 7d 20 7d   TABLE t3(x) } }
13d80 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 7b   msg] $msg.  } {
13d90 31 20 7b 64 61 74 61 62 61 73 65 20 6f 72 20 64  1 {database or d
13da0 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 7d 0a  isk is full}}.}.
13db0 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
13dc0 74 31 20 74 65 73 74 32 0a 66 6f 72 65 61 63 68  t1 test2.foreach
13dd0 20 7b 74 6e 20 75 72 69 7d 20 7b 0a 20 20 31 20   {tn uri} {.  1 
13de0 20 20 7b 66 69 6c 65 3a 3f 6d 6f 64 65 3d 6d 65    {file:?mode=me
13df0 6d 6f 72 79 26 63 61 63 68 65 3d 73 68 61 72 65  mory&cache=share
13e00 64 7d 0a 20 20 32 20 20 20 7b 66 69 6c 65 3a 6f  d}.  2   {file:o
13e10 6e 65 3f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 26 63  ne?mode=memory&c
13e20 61 63 68 65 3d 73 68 61 72 65 64 7d 0a 20 20 33  ache=shared}.  3
13e30 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 31 3f 63     {file:test1?c
13e40 61 63 68 65 3d 73 68 61 72 65 64 7d 0a 20 20 34  ache=shared}.  4
13e50 20 20 20 7b 66 69 6c 65 3a 74 65 73 74 32 3f 61     {file:test2?a
13e60 6e 6f 74 68 65 72 3d 70 61 72 61 6d 65 74 65 72  nother=parameter
13e70 26 79 65 74 3d 61 6e 6f 74 68 65 72 6f 6e 65 7d  &yet=anotherone}
13e80 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 33  .} {.  do_test 3
13e90 37 2e 24 74 6e 20 7b 0a 20 20 20 20 63 61 74 63  7.$tn {.    catc
13ea0 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20  h { db close }. 
13eb0 20 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64     sqlite3_shutd
13ec0 6f 77 6e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  own.    sqlite3_
13ed0 63 6f 6e 66 69 67 5f 75 72 69 20 31 0a 20 20 20  config_uri 1.   
13ee0 20 73 71 6c 69 74 65 33 20 64 62 20 24 75 72 69   sqlite3 db $uri
13ef0 0a 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a  ..    db eval {.
13f00 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
13f10 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20  LE t1(x);.      
13f20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
13f30 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 20 20  ALUES(1);.      
13f40 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
13f50 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a  ;.    }.  } {1}.
13f60 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
13f70 73 74 20 33 37 2e 24 74 6e 2e 32 20 7b 0a 20 20  st 37.$tn.2 {.  
13f80 20 20 56 41 43 55 55 4d 3b 0a 20 20 20 20 53 45    VACUUM;.    SE
13f90 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
13fa0 20 20 7d 20 7b 31 7d 0a 0a 20 20 64 62 20 63 6c    } {1}..  db cl
13fb0 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 73 68  ose.  sqlite3_sh
13fc0 75 74 64 6f 77 6e 0a 20 20 73 71 6c 69 74 65 33  utdown.  sqlite3
13fd0 5f 63 6f 6e 66 69 67 5f 75 72 69 20 30 0a 7d 0a  _config_uri 0.}.
13fe0 0a 64 6f 5f 74 65 73 74 20 33 38 2e 31 20 7b 0a  .do_test 38.1 {.
13ff0 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f    catch { db clo
14000 73 65 20 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65  se }.  forcedele
14010 74 65 20 74 65 73 74 2e 64 62 0a 20 20 73 65 74  te test.db.  set
14020 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64   fd [open test.d
14030 62 20 77 5d 0a 20 20 70 75 74 73 20 24 66 64 20  b w].  puts $fd 
14040 22 68 65 6c 6c 6f 20 77 6f 72 6c 64 22 0a 20 20  "hello world".  
14050 63 6c 6f 73 65 20 24 66 64 0a 20 20 73 71 6c 69  close $fd.  sqli
14060 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
14070 20 63 61 74 63 68 73 71 6c 20 7b 20 43 52 45 41   catchsql { CREA
14080 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 7d  TE TABLE t1(x) }
14090 0a 7d 20 7b 31 20 7b 66 69 6c 65 20 69 73 20 6e  .} {1 {file is n
140a0 6f 74 20 61 20 64 61 74 61 62 61 73 65 7d 7d 0a  ot a database}}.
140b0 64 6f 5f 74 65 73 74 20 33 38 2e 32 20 7b 0a 20  do_test 38.2 {. 
140c0 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73   catch { db clos
140d0 65 20 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74  e }.  forcedelet
140e0 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b 7d 0a 0a  e test.db.} {}..
140f0 64 6f 5f 74 65 73 74 20 33 39 2e 31 20 7b 0a 20  do_test 39.1 {. 
14100 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
14110 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
14120 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
14130 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20  vacuum = 1;.    
14140 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
14150 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
14160 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78  NTO t1 VALUES('x
14170 78 78 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  xx');.    INSERT
14180 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
14190 27 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45  'two');.    INSE
141a0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
141b0 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30  S(randomblob(400
141c0 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
141d0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
141e0 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 29 3b 0a  ndomblob(400));.
141f0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14200 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
14210 62 6c 6f 62 28 34 30 30 29 29 3b 0a 20 20 20 20  blob(400));.    
14220 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
14230 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
14240 28 34 30 30 29 29 3b 0a 20 20 20 20 42 45 47 49  (400));.    BEGI
14250 4e 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31  N;.    UPDATE t1
14260 20 53 45 54 20 78 20 3d 20 27 6f 6e 65 27 20 57   SET x = 'one' W
14270 48 45 52 45 20 72 6f 77 69 64 3d 31 3b 0a 20 20  HERE rowid=1;.  
14280 7d 0a 20 20 73 65 74 20 3a 3a 73 74 6d 74 20 5b  }.  set ::stmt [
14290 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
142a0 64 62 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  db "SELECT * FRO
142b0 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 72 6f  M t1 ORDER BY ro
142c0 77 69 64 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20  wid" -1 dummy]. 
142d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a   sqlite3_step $:
142e0 3a 73 74 6d 74 0a 20 20 73 71 6c 69 74 65 33 5f  :stmt.  sqlite3_
142f0 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 3a 3a 73  column_text $::s
14300 74 6d 74 20 30 0a 7d 20 7b 6f 6e 65 7d 0a 64 6f  tmt 0.} {one}.do
14310 5f 74 65 73 74 20 33 39 2e 32 20 7b 0a 20 20 65  _test 39.2 {.  e
14320 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
14330 54 41 42 4c 45 20 74 32 28 78 29 20 7d 0a 20 20  TABLE t2(x) }.  
14340 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a  sqlite3_step $::
14350 73 74 6d 74 0a 20 20 73 71 6c 69 74 65 33 5f 63  stmt.  sqlite3_c
14360 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 3a 3a 73 74  olumn_text $::st
14370 6d 74 20 30 0a 7d 20 7b 74 77 6f 7d 0a 64 6f 5f  mt 0.} {two}.do_
14380 74 65 73 74 20 33 39 2e 33 20 7b 0a 20 20 73 71  test 39.3 {.  sq
14390 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
143a0 3a 3a 73 74 6d 74 0a 20 20 65 78 65 63 73 71 6c  ::stmt.  execsql
143b0 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
143c0 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 39  _execsql_test 39
143d0 2e 34 20 7b 0a 20 20 50 52 41 47 4d 41 20 61 75  .4 {.  PRAGMA au
143e0 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20  to_vacuum = 2;. 
143f0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
14400 28 78 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41  (x);.  CREATE TA
14410 42 4c 45 20 74 34 28 78 29 3b 0a 0a 20 20 44 52  BLE t4(x);..  DR
14420 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 44  OP TABLE t2;.  D
14430 52 4f 50 20 54 41 42 4c 45 20 74 33 3b 0a 20 20  ROP TABLE t3;.  
14440 44 52 4f 50 20 54 41 42 4c 45 20 74 34 3b 0a 7d  DROP TABLE t4;.}
14450 0a 64 6f 5f 74 65 73 74 20 33 39 2e 35 20 7b 0a  .do_test 39.5 {.
14460 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c    db close.  sql
14470 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
14480 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
14490 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
144a0 65 20 3d 20 31 3b 0a 20 20 20 20 50 52 41 47 4d  e = 1;.    PRAGM
144b0 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61  A incremental_va
144c0 63 75 75 6d 3b 0a 20 20 20 20 50 52 41 47 4d 41  cuum;.    PRAGMA
144d0 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
144e0 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 64 6f  ;.  }.} {ok}..do
144f0 5f 74 65 73 74 20 34 30 2e 31 20 7b 0a 20 20 72  _test 40.1 {.  r
14500 65 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71  eset_db.  execsq
14510 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  l {.    PRAGMA a
14520 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a  uto_vacuum = 1;.
14530 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
14540 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45   t1(x PRIMARY KE
14550 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  Y);.    INSERT I
14560 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
14570 6e 64 6f 6d 62 6c 6f 62 28 31 32 30 30 29 29 3b  ndomblob(1200));
14580 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
14590 5f 63 6f 75 6e 74 3b 0a 20 20 7d 0a 7d 20 7b 36  _count;.  }.} {6
145a0 7d 0a 64 6f 5f 74 65 73 74 20 34 30 2e 32 20 7b  }.do_test 40.2 {
145b0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
145c0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
145d0 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
145e0 62 28 31 32 30 30 29 29 3b 0a 20 20 20 20 49 4e  b(1200));.    IN
145f0 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
14600 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  UES(randomblob(1
14610 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  200));.    INSER
14620 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
14630 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 32 30 30  (randomblob(1200
14640 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ));.  }.} {}.do_
14650 74 65 73 74 20 34 30 2e 33 20 7b 0a 20 20 64 62  test 40.3 {.  db
14660 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
14670 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
14680 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
14690 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
146a0 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  1;.    CREATE TA
146b0 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 50  BLE t2(x);.    P
146c0 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
146d0 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b  check;.  }.} {ok
146e0 7d 0a 0a 64 6f 5f 74 65 73 74 20 34 31 2e 31 20  }..do_test 41.1 
146f0 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 65  {.  reset_db.  e
14700 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
14710 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50  ATE TABLE t1(x P
14720 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
14730 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
14740 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
14750 62 28 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  b(200));.    INS
14760 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
14770 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  CT randomblob(20
14780 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
14790 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
147a0 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
147b0 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (200) FROM t1;. 
147c0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
147d0 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
147e0 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31  lob(200) FROM t1
147f0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
14800 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
14810 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d  omblob(200) FROM
14820 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
14830 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
14840 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46  andomblob(200) F
14850 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
14860 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
14870 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  T randomblob(200
14880 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  ) FROM t1;.  }.}
14890 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 34 31 2e 32   {}.do_test 41.2
148a0 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
148b0 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20  -default 1.  tv 
148c0 73 65 63 74 6f 72 73 69 7a 65 20 31 36 33 38 34  sectorsize 16384
148d0 3b 0a 20 20 74 76 20 64 65 76 63 68 61 72 20 5b  ;.  tv devchar [
148e0 6c 69 73 74 5d 0a 20 20 64 62 20 63 6c 6f 73 65  list].  db close
148f0 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
14900 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
14910 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  {.    PRAGMA cac
14920 68 65 5f 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20  he_size = 1;.   
14930 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
14940 57 48 45 52 45 20 72 6f 77 69 64 25 34 3b 0a 20  WHERE rowid%4;. 
14950 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
14960 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d  ity_check;.  }.}
14970 20 7b 6f 6b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74   {ok}.db close.t
14980 76 20 64 65 6c 65 74 65 0a 0a 73 65 74 20 70 65  v delete..set pe
14990 6e 64 69 6e 67 5f 70 72 65 76 20 5b 73 71 6c 69  nding_prev [sqli
149a0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
149b0 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 30 78  _pending_byte 0x
149c0 31 30 30 30 30 30 30 5d 0a 64 6f 5f 74 65 73 74  1000000].do_test
149d0 20 34 32 2e 31 20 7b 0a 20 20 72 65 73 65 74 5f   42.1 {.  reset_
149e0 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
149f0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14a00 74 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e  t1(x, y);.    IN
14a10 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
14a20 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  UES(randomblob(2
14a30 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
14a40 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  200));.    INSER
14a50 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
14a60 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14a70 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
14a80 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
14a90 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
14aa0 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
14ab0 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  200), randomblob
14ac0 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (200) FROM t1;. 
14ad0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
14ae0 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
14af0 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(200), random
14b00 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74  blob(200) FROM t
14b10 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
14b20 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
14b30 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61  domblob(200), ra
14b40 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
14b50 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
14b60 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
14b70 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14b80 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
14b90 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
14ba0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
14bb0 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
14bc0 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  200), randomblob
14bd0 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (200) FROM t1;. 
14be0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
14bf0 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
14c00 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(200), random
14c10 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20 74  blob(200) FROM t
14c20 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
14c30 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
14c40 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72 61  domblob(200), ra
14c50 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46 52  ndomblob(200) FR
14c60 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
14c70 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
14c80 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29   randomblob(200)
14c90 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
14ca0 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20  ) FROM t1;.  }. 
14cb0 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
14cc0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
14cd0 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 30 78  _pending_byte 0x
14ce0 30 30 31 30 30 30 30 0a 20 20 73 71 6c 69 74 65  0010000.  sqlite
14cf0 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
14d00 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  b eval { PRAGMA 
14d10 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 30 20 7d 0a  mmap_size = 0 }.
14d20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
14d30 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 79  ECT sum(length(y
14d40 29 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b  )) FROM t1 }.} {
14d50 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
14d60 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
14d70 6d 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 34 32  med}}.do_test 42
14d80 2e 32 20 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a  .2 {.  reset_db.
14d90 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
14da0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
14db0 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  x, y);.    INSER
14dc0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
14dd0 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29  (randomblob(200)
14de0 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  , randomblob(200
14df0 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
14e00 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
14e10 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72  ndomblob(200), r
14e20 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46  andomblob(200) F
14e30 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
14e40 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
14e50 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  T randomblob(200
14e60 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  ), randomblob(20
14e70 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
14e80 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
14e90 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
14ea0 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  (200), randomblo
14eb0 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(200) FROM t1;.
14ec0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14ed0 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
14ee0 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f  blob(200), rando
14ef0 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20  mblob(200) FROM 
14f00 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
14f10 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
14f20 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 2c 20 72  ndomblob(200), r
14f30 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 29 20 46  andomblob(200) F
14f40 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
14f50 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
14f60 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  T randomblob(200
14f70 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  ), randomblob(20
14f80 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
14f90 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
14fa0 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
14fb0 28 32 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  (200), randomblo
14fc0 62 28 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(200) FROM t1;.
14fd0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14fe0 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
14ff0 62 6c 6f 62 28 32 30 30 29 2c 20 72 61 6e 64 6f  blob(200), rando
15000 6d 62 6c 6f 62 28 32 30 30 29 20 46 52 4f 4d 20  mblob(200) FROM 
15010 74 31 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f  t1;.  }.  db clo
15020 73 65 0a 0a 20 20 74 65 73 74 76 66 73 20 74 76  se..  testvfs tv
15030 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76   -default 1.  tv
15040 20 73 65 63 74 6f 72 73 69 7a 65 20 31 36 33 38   sectorsize 1638
15050 34 3b 0a 20 20 74 76 20 64 65 76 63 68 61 72 20  4;.  tv devchar 
15060 5b 6c 69 73 74 5d 0a 20 20 73 71 6c 69 74 65 33  [list].  sqlite3
15070 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73   db test.db -vfs
15080 20 74 76 0a 20 20 65 78 65 63 73 71 6c 20 7b 20   tv.  execsql { 
15090 55 50 44 41 54 45 20 74 31 20 53 45 54 20 78 20  UPDATE t1 SET x 
150a0 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  = randomblob(200
150b0 29 20 7d 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73  ) }.} {}.db clos
150c0 65 0a 74 76 20 64 65 6c 65 74 65 0a 73 71 6c 69  e.tv delete.sqli
150d0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
150e0 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 24 70  _pending_byte $p
150f0 65 6e 64 69 6e 67 5f 70 72 65 76 0a 0a 64 6f 5f  ending_prev..do_
15100 74 65 73 74 20 34 33 2e 31 20 7b 0a 20 20 72 65  test 43.1 {.  re
15110 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c  set_db.  execsql
15120 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
15130 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20  BLE t1(x, y);.  
15140 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
15150 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
15160 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
15170 74 32 28 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e  t2(x, y);.    IN
15180 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
15190 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 43  UES(1, 2);.    C
151a0 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 78  REATE TABLE t3(x
151b0 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , y);.    INSERT
151c0 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
151d0 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 64 62 20  1, 2);.  }.  db 
151e0 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20  close.  sqlite3 
151f0 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 64 62  db test.db..  db
15200 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6d   eval { PRAGMA m
15210 6d 61 70 5f 73 69 7a 65 20 3d 20 30 20 7d 0a 20  map_size = 0 }. 
15220 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43   db eval { SELEC
15230 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
15240 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
15250 73 20 64 62 20 43 41 43 48 45 5f 4d 49 53 53 20  s db CACHE_MISS 
15260 30 0a 7d 20 7b 30 20 32 20 30 7d 0a 0a 64 6f 5f  0.} {0 2 0}..do_
15270 74 65 73 74 20 34 33 2e 32 20 7b 0a 20 20 64 62  test 43.2 {.  db
15280 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a   eval { SELECT *
15290 20 46 52 4f 4d 20 74 32 20 7d 0a 20 20 73 71 6c   FROM t2 }.  sql
152a0 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 20 64  ite3_db_status d
152b0 62 20 43 41 43 48 45 5f 4d 49 53 53 20 31 0a 7d  b CACHE_MISS 1.}
152c0 20 7b 30 20 33 20 30 7d 0a 0a 64 6f 5f 74 65 73   {0 3 0}..do_tes
152d0 74 20 34 33 2e 33 20 7b 0a 20 20 64 62 20 65 76  t 43.3 {.  db ev
152e0 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  al { SELECT * FR
152f0 4f 4d 20 74 33 20 7d 0a 20 20 73 71 6c 69 74 65  OM t3 }.  sqlite
15300 33 5f 64 62 5f 73 74 61 74 75 73 20 64 62 20 43  3_db_status db C
15310 41 43 48 45 5f 4d 49 53 53 20 30 0a 7d 20 7b 30  ACHE_MISS 0.} {0
15320 20 31 20 30 7d 0a 0a 66 69 6e 69 73 68 5f 74 65   1 0}..finish_te
15330 73 74 0a                                         st.