/ Hex Artifact Content
Login

Artifact a8f30a878c6c44dbdd37c9e5bb001245e78b27a8e97f15baf9842bb76f4a155a:


0000: 23 20 32 30 31 30 20 4d 61 79 20 35 0a 23 0a 23  # 2010 May 5.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 20 54 68 69 73 20 66 69 6c 65 20 69  **.# This file i
0170: 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65 73  mplements regres
0180: 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20 53  sion tests for S
0190: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 20  QLite library.  
01a0: 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66 20 74  The.# focus of t
01b0: 68 69 73 20 66 69 6c 65 20 69 73 20 74 65 73 74  his file is test
01c0: 69 6e 67 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ing the operatio
01d0: 6e 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79  n of the library
01e0: 20 69 6e 0a 23 20 22 50 52 41 47 4d 41 20 6a 6f   in.# "PRAGMA jo
01f0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c 22 20  urnal_mode=WAL" 
0200: 6d 6f 64 65 2e 0a 23 0a 0a 73 65 74 20 74 65 73  mode..#..set tes
0210: 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  tdir [file dirna
0220: 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63  me $argv0].sourc
0230: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
0240: 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65  r.tcl.source $te
0250: 73 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f  stdir/lock_commo
0260: 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65  n.tcl.source $te
0270: 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d  stdir/malloc_com
0280: 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24  mon.tcl.source $
0290: 74 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d  testdir/wal_comm
02a0: 6f 6e 2e 74 63 6c 0a 0a 73 65 74 20 74 65 73 74  on.tcl..set test
02b0: 70 72 65 66 69 78 20 77 61 6c 32 0a 0a 69 66 63  prefix wal2..ifc
02c0: 61 70 61 62 6c 65 20 21 77 61 6c 20 7b 66 69 6e  apable !wal {fin
02d0: 69 73 68 5f 74 65 73 74 20 3b 20 72 65 74 75 72  ish_test ; retur
02e0: 6e 20 7d 0a 69 66 20 21 5b 77 61 6c 5f 69 73 5f  n }.if ![wal_is_
02f0: 6f 6b 5d 20 7b 66 69 6e 69 73 68 5f 74 65 73 74  ok] {finish_test
0300: 20 3b 20 72 65 74 75 72 6e 20 7d 0a 0a 73 65 74   ; return }..set
0310: 20 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75   sqlite_sync_cou
0320: 6e 74 20 30 0a 70 72 6f 63 20 63 6f 6e 64 5f 69  nt 0.proc cond_i
0330: 6e 63 72 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 7b  ncr_sync_count {
0340: 61 64 6a 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20  adj} {.  global 
0350: 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e  sqlite_sync_coun
0360: 74 0a 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 70  t.  if {$::tcl_p
0370: 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d  latform(platform
0380: 29 20 3d 3d 20 22 77 69 6e 64 6f 77 73 22 7d 20  ) == "windows"} 
0390: 7b 0a 20 20 20 20 69 6e 63 72 20 73 71 6c 69 74  {.    incr sqlit
03a0: 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 24 61 64  e_sync_count $ad
03b0: 6a 0a 20 20 7d 20 7b 0a 20 20 20 20 69 66 63 61  j.  } {.    ifca
03c0: 70 61 62 6c 65 20 21 64 69 72 73 79 6e 63 20 7b  pable !dirsync {
03d0: 0a 20 20 20 20 20 20 69 6e 63 72 20 73 71 6c 69  .      incr sqli
03e0: 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 24 61  te_sync_count $a
03f0: 64 6a 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  dj.    }.  }.}..
0400: 70 72 6f 63 20 73 65 74 5f 74 76 66 73 5f 68 64  proc set_tvfs_hd
0410: 72 20 7b 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a  r {file args} {.
0420: 0a 20 20 23 20 53 65 74 20 24 6e 48 64 72 20 74  .  # Set $nHdr t
0430: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
0440: 62 79 74 65 73 20 69 6e 20 74 68 65 20 77 61 6c  bytes in the wal
0450: 2d 69 6e 64 65 78 20 68 65 61 64 65 72 3a 0a 20  -index header:. 
0460: 20 73 65 74 20 6e 48 64 72 20 34 38 0a 20 20 73   set nHdr 48.  s
0470: 65 74 20 6e 49 6e 74 20 5b 65 78 70 72 20 7b 24  et nInt [expr {$
0480: 6e 48 64 72 2f 34 7d 5d 0a 0a 20 20 69 66 20 7b  nHdr/4}]..  if {
0490: 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 3e  [llength $args]>
04a0: 32 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72 20 7b  2} {.    error {
04b0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
04c0: 6f 75 6c 64 20 62 65 20 22 73 65 74 5f 74 76 66  ould be "set_tvf
04d0: 73 5f 68 64 72 20 66 69 6c 65 4e 61 6d 65 20 3f  s_hdr fileName ?
04e0: 76 61 6c 31 3f 20 3f 76 61 6c 32 3f 22 7d 0a 20  val1? ?val2?"}. 
04f0: 20 7d 0a 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b   }..  set blob [
0500: 74 76 66 73 20 73 68 6d 20 24 66 69 6c 65 5d 0a  tvfs shm $file].
0510: 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61    if {$::tcl_pla
0520: 74 66 6f 72 6d 28 62 79 74 65 4f 72 64 65 72 29  tform(byteOrder)
0530: 3d 3d 22 62 69 67 45 6e 64 69 61 6e 22 7d 20 7b  =="bigEndian"} {
0540: 73 65 74 20 66 6d 74 20 49 7d 20 7b 73 65 74 20  set fmt I} {set 
0550: 66 6d 74 20 69 7d 0a 0a 20 20 69 66 20 7b 5b 6c  fmt i}..  if {[l
0560: 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 7d 20 7b  length $args]} {
0570: 0a 20 20 20 20 73 65 74 20 69 61 20 5b 6c 69 6e  .    set ia [lin
0580: 64 65 78 20 24 61 72 67 73 20 30 5d 0a 20 20 20  dex $args 0].   
0590: 20 73 65 74 20 69 62 20 24 69 61 0a 20 20 20 20   set ib $ia.    
05a0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72  if {[llength $ar
05b0: 67 73 5d 3d 3d 32 7d 20 7b 0a 20 20 20 20 20 20  gs]==2} {.      
05c0: 73 65 74 20 69 62 20 5b 6c 69 6e 64 65 78 20 24  set ib [lindex $
05d0: 61 72 67 73 20 31 5d 0a 20 20 20 20 7d 0a 20 20  args 1].    }.  
05e0: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 62    binary scan $b
05f0: 6c 6f 62 20 61 5b 65 78 70 72 20 24 6e 48 64 72  lob a[expr $nHdr
0600: 2a 32 5d 61 2a 20 64 75 6d 6d 79 20 74 61 69 6c  *2]a* dummy tail
0610: 0a 20 20 20 20 73 65 74 20 62 6c 6f 62 20 5b 62  .    set blob [b
0620: 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 24 7b 66  inary format ${f
0630: 6d 74 7d 24 7b 6e 49 6e 74 7d 24 7b 66 6d 74 7d  mt}${nInt}${fmt}
0640: 24 7b 6e 49 6e 74 7d 61 2a 20 24 69 61 20 24 69  ${nInt}a* $ia $i
0650: 62 20 24 74 61 69 6c 5d 0a 20 20 20 20 74 76 66  b $tail].    tvf
0660: 73 20 73 68 6d 20 24 66 69 6c 65 20 24 62 6c 6f  s shm $file $blo
0670: 62 0a 20 20 7d 0a 0a 20 20 62 69 6e 61 72 79 20  b.  }..  binary 
0680: 73 63 61 6e 20 24 62 6c 6f 62 20 24 7b 66 6d 74  scan $blob ${fmt
0690: 7d 24 7b 6e 49 6e 74 7d 20 69 6e 74 73 0a 20 20  }${nInt} ints.  
06a0: 72 65 74 75 72 6e 20 24 69 6e 74 73 0a 7d 0a 0a  return $ints.}..
06b0: 70 72 6f 63 20 69 6e 63 72 5f 74 76 66 73 5f 68  proc incr_tvfs_h
06c0: 64 72 20 7b 66 69 6c 65 20 69 64 78 20 69 6e 63  dr {file idx inc
06d0: 72 76 61 6c 7d 20 7b 0a 20 20 73 65 74 20 69 6e  rval} {.  set in
06e0: 74 73 20 5b 73 65 74 5f 74 76 66 73 5f 68 64 72  ts [set_tvfs_hdr
06f0: 20 24 66 69 6c 65 5d 0a 20 20 73 65 74 20 76 20   $file].  set v 
0700: 5b 6c 69 6e 64 65 78 20 24 69 6e 74 73 20 24 69  [lindex $ints $i
0710: 64 78 5d 0a 20 20 69 6e 63 72 20 76 20 24 69 6e  dx].  incr v $in
0720: 63 72 76 61 6c 0a 20 20 6c 73 65 74 20 69 6e 74  crval.  lset int
0730: 73 20 24 69 64 78 20 24 76 0a 20 20 73 65 74 5f  s $idx $v.  set_
0740: 74 76 66 73 5f 68 64 72 20 24 66 69 6c 65 20 24  tvfs_hdr $file $
0750: 69 6e 74 73 0a 7d 0a 0a 73 65 74 20 73 68 6d 70  ints.}..set shmp
0760: 61 74 68 20 74 65 73 74 2e 64 62 2d 73 68 6d 0a  ath test.db-shm.
0770: 69 66 20 7b 5b 66 6f 72 63 65 64 5f 70 72 6f 78  if {[forced_prox
0780: 79 5f 6c 6f 63 6b 69 6e 67 5d 7d 20 7b 0a 20 20  y_locking]} {.  
0790: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
07a0: 64 62 0a 20 20 73 65 74 20 73 68 6d 70 61 74 68  db.  set shmpath
07b0: 20 5b 65 78 65 63 73 71 6c 20 7b 20 70 72 61 67   [execsql { prag
07c0: 6d 61 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  ma lock_proxy_fi
07d0: 6c 65 20 7d 5d 2d 73 68 6d 0a 20 20 64 62 20 63  le }]-shm.  db c
07e0: 6c 6f 73 65 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  lose.}...#------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 20  ---.# Test case 
0840: 77 61 6c 32 2d 31 2e 2a 3a 0a 23 0a 23 20 53 65  wal2-1.*:.#.# Se
0850: 74 20 75 70 20 61 20 73 6d 61 6c 6c 20 64 61 74  t up a small dat
0860: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
0870: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e   a single table.
0880: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 73   The database is
0890: 20 6e 6f 74 0a 23 20 63 68 65 63 6b 70 6f 69 6e   not.# checkpoin
08a0: 74 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 74  ted during the t
08b0: 65 73 74 20 2d 20 61 6c 6c 20 63 6f 6e 74 65 6e  est - all conten
08c0: 74 20 72 65 73 69 64 65 73 20 69 6e 20 74 68 65  t resides in the
08d0: 20 6c 6f 67 20 66 69 6c 65 2e 0a 23 0a 23 20 54   log file..#.# T
08e0: 77 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  wo connections a
08f0: 72 65 20 65 73 74 61 62 6c 69 73 68 65 64 20 74  re established t
0900: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
0910: 69 6c 65 20 2d 20 61 20 77 72 69 74 65 72 20 28  ile - a writer (
0920: 5b 64 62 5d 29 0a 23 20 61 6e 64 20 61 20 72 65  [db]).# and a re
0930: 61 64 65 72 20 28 5b 64 62 32 5d 29 2e 20 46 6f  ader ([db2]). Fo
0940: 72 20 65 61 63 68 20 6f 66 20 74 68 65 20 38 20  r each of the 8 
0950: 69 6e 74 65 67 65 72 20 66 69 65 6c 64 73 20 69  integer fields i
0960: 6e 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a  n the wal-index.
0970: 23 20 68 65 61 64 65 72 20 28 36 20 66 69 65 6c  # header (6 fiel
0980: 64 73 20 61 6e 64 20 32 20 63 68 65 63 6b 73 75  ds and 2 checksu
0990: 6d 20 76 61 6c 75 65 73 29 2c 20 64 6f 20 74 68  m values), do th
09a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 23 0a 23  e following:.#.#
09b0: 20 20 20 31 2e 20 4d 6f 64 69 66 79 20 74 68 65     1. Modify the
09c0: 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
09d0: 74 68 65 20 77 72 69 74 65 72 2e 0a 23 0a 23 20  the writer..#.# 
09e0: 20 20 32 2e 20 41 74 74 65 6d 70 74 20 74 6f 20    2. Attempt to 
09f0: 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
0a00: 65 20 75 73 69 6e 67 20 74 68 65 20 72 65 61 64  e using the read
0a10: 65 72 2e 20 42 65 66 6f 72 65 20 74 68 65 20 72  er. Before the r
0a20: 65 61 64 65 72 0a 23 20 20 20 20 20 20 68 61 73  eader.#      has
0a30: 20 61 20 63 68 61 6e 63 65 20 74 6f 20 73 6e 61   a chance to sna
0a40: 70 73 68 6f 74 20 74 68 65 20 77 61 6c 2d 69 6e  pshot the wal-in
0a50: 64 65 78 20 68 65 61 64 65 72 2c 20 69 6e 63 72  dex header, incr
0a60: 65 6d 65 6e 74 20 6f 6e 65 0a 23 20 20 20 20 20  ement one.#     
0a70: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
0a80: 66 69 65 6c 64 73 20 28 73 6f 20 74 68 61 74 20  fields (so that 
0a90: 74 68 65 20 72 65 61 64 65 72 20 65 6e 64 73 20  the reader ends 
0aa0: 75 70 20 77 69 74 68 20 61 20 63 6f 72 72 75 70  up with a corrup
0ab0: 74 65 64 0a 23 20 20 20 20 20 20 68 65 61 64 65  ted.#      heade
0ac0: 72 29 2e 0a 23 0a 23 20 20 20 33 2e 20 43 68 65  r)..#.#   3. Che
0ad0: 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 61 64  ck that the read
0ae0: 65 72 20 72 65 63 6f 76 65 72 73 20 74 68 65 20  er recovers the 
0af0: 77 61 6c 2d 69 6e 64 65 78 20 61 6e 64 20 72 65  wal-index and re
0b00: 61 64 73 20 74 68 65 20 63 6f 72 72 65 63 74 0a  ads the correct.
0b10: 23 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20  #      database 
0b20: 63 6f 6e 74 65 6e 74 2e 0a 23 0a 64 6f 5f 74 65  content..#.do_te
0b30: 73 74 20 77 61 6c 32 2d 31 2e 30 20 7b 0a 20 20  st wal2-1.0 {.  
0b40: 70 72 6f 63 20 74 76 66 73 5f 63 62 20 7b 6d 65  proc tvfs_cb {me
0b50: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
0b60: 67 73 7d 20 7b 20 0a 20 20 20 20 73 65 74 20 3a  gs} { .    set :
0b70: 3a 66 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65 6e  :filename $filen
0b80: 61 6d 65 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ame.    return S
0b90: 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 7d 0a 0a 20  QLITE_OK .  }.. 
0ba0: 20 74 65 73 74 76 66 73 20 74 76 66 73 0a 20 20   testvfs tvfs.  
0bb0: 74 76 66 73 20 73 63 72 69 70 74 20 74 76 66 73  tvfs script tvfs
0bc0: 5f 63 62 0a 20 20 74 76 66 73 20 66 69 6c 74 65  _cb.  tvfs filte
0bd0: 72 20 78 53 68 6d 4f 70 65 6e 0a 0a 20 20 73 71  r xShmOpen..  sq
0be0: 6c 69 74 65 33 20 64 62 20 20 74 65 73 74 2e 64  lite3 db  test.d
0bf0: 62 20 2d 76 66 73 20 74 76 66 73 0a 20 20 73 71  b -vfs tvfs.  sq
0c00: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
0c10: 62 20 2d 76 66 73 20 74 76 66 73 0a 0a 20 20 65  b -vfs tvfs..  e
0c20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
0c30: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
0c40: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41   = WAL;.    CREA
0c50: 54 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a  TE TABLE t1(a);.
0c60: 20 20 7d 20 64 62 32 0a 20 20 65 78 65 63 73 71    } db2.  execsq
0c70: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
0c80: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 29  NTO t1 VALUES(1)
0c90: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0ca0: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 29 3b 0a  O t1 VALUES(2);.
0cb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0cc0: 74 31 20 56 41 4c 55 45 53 28 33 29 3b 0a 20 20  t1 VALUES(3);.  
0cd0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0ce0: 20 56 41 4c 55 45 53 28 34 29 3b 0a 20 20 20 20   VALUES(4);.    
0cf0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 61 29 2c  SELECT count(a),
0d00: 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 31 3b   sum(a) FROM t1;
0d10: 0a 20 20 7d 0a 7d 20 7b 34 20 31 30 7d 0a 64 6f  .  }.} {4 10}.do
0d20: 5f 74 65 73 74 20 77 61 6c 32 2d 31 2e 31 20 7b  _test wal2-1.1 {
0d30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0d40: 45 43 54 20 63 6f 75 6e 74 28 61 29 2c 20 73 75  ECT count(a), su
0d50: 6d 28 61 29 20 46 52 4f 4d 20 74 31 20 7d 20 64  m(a) FROM t1 } d
0d60: 62 32 0a 7d 20 7b 34 20 31 30 7d 0a 0a 73 65 74  b2.} {4 10}..set
0d70: 20 52 45 43 4f 56 45 52 20 5b 6c 69 73 74 20 20   RECOVER [list  
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 20 5c 0a 20 20 7b 30 20 31 20 6c 6f 63      \.  {0 1 loc
0db0: 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 20 20 7b  k exclusive}   {
0dc0: 31 20 32 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69  1 2 lock exclusi
0dd0: 76 65 7d 20 7b 34 20 34 20 6c 6f 63 6b 20 65 78  ve} {4 4 lock ex
0de0: 63 6c 75 73 69 76 65 7d 20 5c 0a 20 20 7b 31 20  clusive} \.  {1 
0df0: 32 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69  2 unlock exclusi
0e00: 76 65 7d 20 7b 34 20 34 20 75 6e 6c 6f 63 6b 20  ve} {4 4 unlock 
0e10: 65 78 63 6c 75 73 69 76 65 7d 20 7b 30 20 31 20  exclusive} {0 1 
0e20: 75 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65  unlock exclusive
0e30: 7d 20 20 5c 0a 5d 0a 73 65 74 20 52 45 41 44 20  }  \.].set READ 
0e40: 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  [list           
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0e70: 20 20 7b 34 20 31 20 6c 6f 63 6b 20 73 68 61 72    {4 1 lock shar
0e80: 65 64 7d 20 20 20 20 7b 34 20 31 20 75 6e 6c 6f  ed}    {4 1 unlo
0e90: 63 6b 20 73 68 61 72 65 64 7d 20 20 20 20 20 20  ck shared}      
0ea0: 20 20 20 20 20 20 20 5c 0a 5d 0a 73 65 74 20 49         \.].set I
0eb0: 4e 49 54 53 4c 4f 54 20 5b 6c 69 73 74 20 20 20  NITSLOT [list   
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 5c 0a 20 20 7b 34 20 31 20 6c 6f 63 6b 20    \.  {4 1 lock 
0ef0: 65 78 63 6c 75 73 69 76 65 7d 20 7b 34 20 31 20  exclusive} {4 1 
0f00: 75 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65  unlock exclusive
0f10: 7d 20 20 20 20 20 20 20 20 20 20 5c 0a 5d 0a 0a  }          \.]..
0f20: 66 6f 72 65 61 63 68 20 7b 74 6e 20 69 49 6e 73  foreach {tn iIns
0f30: 65 72 74 20 72 65 73 20 77 61 6c 5f 69 6e 64 65  ert res wal_inde
0f40: 78 5f 68 64 72 5f 6d 6f 64 20 77 61 6c 5f 6c 6f  x_hdr_mod wal_lo
0f50: 63 6b 73 7d 20 22 0a 20 20 20 20 20 20 20 20 20  cks} ".         
0f60: 32 20 20 20 20 35 20 20 20 7b 35 20 31 35 7d 20  2    5   {5 15} 
0f70: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
0f80: 20 7b 24 52 45 43 4f 56 45 52 20 24 52 45 41 44   {$RECOVER $READ
0f90: 7d 0a 20 20 20 20 20 20 20 20 20 33 20 20 20 20  }.         3    
0fa0: 36 20 20 20 7b 36 20 32 31 7d 20 20 20 20 31 20  6   {6 21}    1 
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 52 45              {$RE
0fc0: 43 4f 56 45 52 20 24 52 45 41 44 7d 0a 20 20 20  COVER $READ}.   
0fd0: 20 20 20 20 20 20 34 20 20 20 20 37 20 20 20 7b        4    7   {
0fe0: 37 20 32 38 7d 20 20 20 20 32 20 20 20 20 20 20  7 28}    2      
0ff0: 20 20 20 20 20 20 20 7b 24 52 45 43 4f 56 45 52         {$RECOVER
1000: 20 24 52 45 41 44 7d 0a 20 20 20 20 20 20 20 20   $READ}.        
1010: 20 35 20 20 20 20 38 20 20 20 7b 38 20 33 36 7d   5    8   {8 36}
1020: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
1030: 20 20 7b 24 52 45 43 4f 56 45 52 20 24 52 45 41    {$RECOVER $REA
1040: 44 7d 0a 20 20 20 20 20 20 20 20 20 36 20 20 20  D}.         6   
1050: 20 39 20 20 20 7b 39 20 34 35 7d 20 20 20 20 34   9   {9 45}    4
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 52               {$R
1070: 45 43 4f 56 45 52 20 24 52 45 41 44 7d 0a 20 20  ECOVER $READ}.  
1080: 20 20 20 20 20 20 20 37 20 20 20 31 30 20 20 20         7   10   
1090: 7b 31 30 20 35 35 7d 20 20 20 35 20 20 20 20 20  {10 55}   5     
10a0: 20 20 20 20 20 20 20 20 7b 24 52 45 43 4f 56 45          {$RECOVE
10b0: 52 20 24 52 45 41 44 7d 0a 20 20 20 20 20 20 20  R $READ}.       
10c0: 20 20 38 20 20 20 31 31 20 20 20 7b 31 31 20 36    8   11   {11 6
10d0: 36 7d 20 20 20 36 20 20 20 20 20 20 20 20 20 20  6}   6          
10e0: 20 20 20 7b 24 52 45 43 4f 56 45 52 20 24 52 45     {$RECOVER $RE
10f0: 41 44 7d 0a 20 20 20 20 20 20 20 20 20 39 20 20  AD}.         9  
1100: 20 31 32 20 20 20 7b 31 32 20 37 38 7d 20 20 20   12   {12 78}   
1110: 37 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24  7             {$
1120: 52 45 43 4f 56 45 52 20 24 52 45 41 44 7d 0a 20  RECOVER $READ}. 
1130: 20 20 20 20 20 20 20 31 30 20 20 20 31 33 20 20         10   13  
1140: 20 7b 31 33 20 39 31 7d 20 20 20 38 20 20 20 20   {13 91}   8    
1150: 20 20 20 20 20 20 20 20 20 7b 24 52 45 43 4f 56           {$RECOV
1160: 45 52 20 24 52 45 41 44 7d 0a 20 20 20 20 20 20  ER $READ}.      
1170: 20 20 31 31 20 20 20 31 34 20 20 20 7b 31 34 20    11   14   {14 
1180: 31 30 35 7d 20 20 39 20 20 20 20 20 20 20 20 20  105}  9         
1190: 20 20 20 20 7b 24 52 45 43 4f 56 45 52 20 24 52      {$RECOVER $R
11a0: 45 41 44 7d 0a 20 20 20 20 20 20 20 20 31 32 20  EAD}.        12 
11b0: 20 20 31 35 20 20 20 7b 31 35 20 31 32 30 7d 20    15   {15 120} 
11c0: 20 2d 31 20 20 20 20 20 20 20 20 20 20 20 20 7b   -1            {
11d0: 24 49 4e 49 54 53 4c 4f 54 20 24 52 45 41 44 7d  $INITSLOT $READ}
11e0: 0a 22 20 7b 0a 0a 20 20 64 6f 5f 74 65 73 74 20  ." {..  do_test 
11f0: 77 61 6c 32 2d 31 2e 24 74 6e 2e 31 20 7b 0a 20  wal2-1.$tn.1 {. 
1200: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
1210: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1220: 45 53 28 24 69 49 6e 73 65 72 74 29 20 7d 0a 20  ES($iInsert) }. 
1230: 20 20 20 73 65 74 20 3a 3a 6c 6f 63 6b 73 20 5b     set ::locks [
1240: 6c 69 73 74 5d 0a 20 20 20 20 70 72 6f 63 20 74  list].    proc t
1250: 76 66 73 5f 63 62 20 7b 6d 65 74 68 6f 64 20 61  vfs_cb {method a
1260: 72 67 73 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70  rgs} {.      lap
1270: 70 65 6e 64 20 3a 3a 6c 6f 63 6b 73 20 5b 6c 69  pend ::locks [li
1280: 6e 64 65 78 20 24 61 72 67 73 20 32 5d 0a 20 20  ndex $args 2].  
1290: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12a0: 45 5f 4f 4b 0a 20 20 20 20 7d 0a 20 20 20 20 74  E_OK.    }.    t
12b0: 76 66 73 20 66 69 6c 74 65 72 20 78 53 68 6d 4c  vfs filter xShmL
12c0: 6f 63 6b 0a 20 20 20 20 69 66 20 7b 24 3a 3a 77  ock.    if {$::w
12d0: 61 6c 5f 69 6e 64 65 78 5f 68 64 72 5f 6d 6f 64  al_index_hdr_mod
12e0: 20 3e 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20 69   >= 0} {.      i
12f0: 6e 63 72 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a  ncr_tvfs_hdr $::
1300: 66 69 6c 65 6e 61 6d 65 20 24 3a 3a 77 61 6c 5f  filename $::wal_
1310: 69 6e 64 65 78 5f 68 64 72 5f 6d 6f 64 20 31 0a  index_hdr_mod 1.
1320: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
1330: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
1340: 28 61 29 2c 20 73 75 6d 28 61 29 20 46 52 4f 4d  (a), sum(a) FROM
1350: 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 24 72   t1 } db2.  } $r
1360: 65 73 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  es..  do_test wa
1370: 6c 32 2d 31 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  l2-1.$tn.2 {.   
1380: 20 73 65 74 20 3a 3a 6c 6f 63 6b 73 0a 20 20 7d   set ::locks.  }
1390: 20 24 77 61 6c 5f 6c 6f 63 6b 73 0a 7d 0a 64 62   $wal_locks.}.db
13a0: 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65   close.db2 close
13b0: 0a 74 76 66 73 20 64 65 6c 65 74 65 0a 66 6f 72  .tvfs delete.for
13c0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
13d0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
13e0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 0a 23 2d  t.db-journal..#-
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20  --------.# This 
1440: 74 65 73 74 20 63 61 73 65 20 69 73 20 76 65 72  test case is ver
1450: 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  y similar to the
1460: 20 70 72 65 76 69 6f 75 73 20 6f 6e 65 2c 20 65   previous one, e
1470: 78 63 65 70 74 2c 20 61 66 74 65 72 0a 23 20 74  xcept, after.# t
1480: 68 65 20 72 65 61 64 65 72 20 72 65 61 64 73 20  he reader reads 
1490: 74 68 65 20 63 6f 72 72 75 70 74 20 77 61 6c 2d  the corrupt wal-
14a0: 69 6e 64 65 78 20 68 65 61 64 65 72 2c 20 62 75  index header, bu
14b0: 74 20 62 65 66 6f 72 65 20 69 74 20 68 61 73 0a  t before it has.
14c0: 23 20 61 20 63 68 61 6e 63 65 20 74 6f 20 72 65  # a chance to re
14d0: 2d 72 65 61 64 20 69 74 20 75 6e 64 65 72 20 74  -read it under t
14e0: 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
14f0: 52 45 43 4f 56 45 52 20 6c 6f 63 6b 2c 20 74 68  RECOVER lock, th
1500: 65 0a 23 20 77 61 6c 2d 69 6e 64 65 78 20 68 65  e.# wal-index he
1510: 61 64 65 72 20 69 73 20 72 65 70 6c 61 63 65 64  ader is replaced
1520: 20 77 69 74 68 20 61 20 76 61 6c 69 64 2c 20 62   with a valid, b
1530: 75 74 20 6f 75 74 2d 6f 66 2d 64 61 74 65 2c 20  ut out-of-date, 
1540: 68 65 61 64 65 72 2e 0a 23 0a 23 20 42 65 63 61  header..#.# Beca
1550: 75 73 65 20 74 68 65 20 68 65 61 64 65 72 20 63  use the header c
1560: 68 65 63 6b 73 75 6d 20 6c 6f 6f 6b 73 20 4f 6b  hecksum looks Ok
1570: 2c 20 74 68 65 20 72 65 61 64 65 72 20 64 6f 65  , the reader doe
1580: 73 20 6e 6f 74 20 72 75 6e 20 72 65 63 6f 76 65  s not run recove
1590: 72 79 2c 0a 23 20 69 74 20 73 69 6d 70 6c 79 20  ry,.# it simply 
15a0: 64 72 6f 70 73 20 62 61 63 6b 20 74 6f 20 61 20  drops back to a 
15b0: 52 45 41 44 20 6c 6f 63 6b 20 61 6e 64 20 70 72  READ lock and pr
15c0: 6f 63 65 65 64 73 2e 20 42 75 74 20 62 65 63 61  oceeds. But beca
15d0: 75 73 65 20 74 68 65 0a 23 20 68 65 61 64 65 72  use the.# header
15e0: 20 69 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65 2c   is out-of-date,
15f0: 20 74 68 65 20 72 65 61 64 65 72 20 72 65 61 64   the reader read
1600: 73 20 74 68 65 20 6f 75 74 2d 6f 66 2d 64 61 74  s the out-of-dat
1610: 65 20 73 6e 61 70 73 68 6f 74 2e 0a 23 0a 23 20  e snapshot..#.# 
1620: 41 66 74 65 72 20 74 68 69 73 2c 20 74 68 65 20  After this, the 
1630: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1640: 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74 68  ted again and th
1650: 65 20 72 65 61 64 65 72 20 69 73 20 61 6c 6c 6f  e reader is allo
1660: 77 65 64 0a 23 20 74 6f 20 72 75 6e 20 72 65 63  wed.# to run rec
1670: 6f 76 65 72 79 2e 20 54 68 69 73 20 74 69 6d 65  overy. This time
1680: 2c 20 69 74 20 73 65 65 73 20 61 6e 20 75 70 2d  , it sees an up-
1690: 74 6f 2d 64 61 74 65 20 73 6e 61 70 73 68 6f 74  to-date snapshot
16a0: 20 6f 66 20 74 68 65 0a 23 20 64 61 74 61 62 61   of the.# databa
16b0: 73 65 20 66 69 6c 65 2e 0a 23 0a 73 65 74 20 57  se file..#.set W
16c0: 52 49 54 45 52 20 5b 6c 69 73 74 20 30 20 31 20  RITER [list 0 1 
16d0: 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 5d 0a  lock exclusive].
16e0: 73 65 74 20 4c 4f 43 4b 53 20 20 5b 6c 69 73 74  set LOCKS  [list
16f0: 20 5c 0a 20 20 7b 30 20 31 20 6c 6f 63 6b 20 65   \.  {0 1 lock e
1700: 78 63 6c 75 73 69 76 65 7d 20 7b 30 20 31 20 75  xclusive} {0 1 u
1710: 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d  nlock exclusive}
1720: 20 5c 0a 20 20 7b 34 20 31 20 6c 6f 63 6b 20 65   \.  {4 1 lock e
1730: 78 63 6c 75 73 69 76 65 7d 20 7b 34 20 31 20 75  xclusive} {4 1 u
1740: 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d  nlock exclusive}
1750: 20 5c 0a 20 20 7b 34 20 31 20 6c 6f 63 6b 20 73   \.  {4 1 lock s
1760: 68 61 72 65 64 7d 20 20 20 20 7b 34 20 31 20 75  hared}    {4 1 u
1770: 6e 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 20 20  nlock shared}   
1780: 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   \.].do_test wal
1790: 32 2d 32 2e 30 20 7b 0a 0a 20 20 74 65 73 74 76  2-2.0 {..  testv
17a0: 66 73 20 74 76 66 73 0a 20 20 74 76 66 73 20 73  fs tvfs.  tvfs s
17b0: 63 72 69 70 74 20 74 76 66 73 5f 63 62 0a 20 20  cript tvfs_cb.  
17c0: 74 76 66 73 20 66 69 6c 74 65 72 20 78 53 68 6d  tvfs filter xShm
17d0: 4f 70 65 6e 0a 20 20 70 72 6f 63 20 74 76 66 73  Open.  proc tvfs
17e0: 5f 63 62 20 7b 6d 65 74 68 6f 64 20 61 72 67 73  _cb {method args
17f0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 66 69  } {.    set ::fi
1800: 6c 65 6e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24  lename [lindex $
1810: 61 72 67 73 20 30 5d 0a 20 20 20 20 72 65 74 75  args 0].    retu
1820: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d  rn SQLITE_OK.  }
1830: 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 20  ..  sqlite3 db  
1840: 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 66  test.db -vfs tvf
1850: 73 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  s.  sqlite3 db2 
1860: 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 66  test.db -vfs tvf
1870: 73 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  s..  execsql {. 
1880: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
1890: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
18a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
18b0: 31 28 61 29 3b 0a 20 20 7d 20 64 62 32 0a 20 20  1(a);.  } db2.  
18c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
18d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
18e0: 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45  UES(1);.    INSE
18f0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1900: 53 28 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  S(2);.    INSERT
1910: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1920: 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  3);.    INSERT I
1930: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 29  NTO t1 VALUES(4)
1940: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
1950: 6e 74 28 61 29 2c 20 73 75 6d 28 61 29 20 46 52  nt(a), sum(a) FR
1960: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 34 20  OM t1;.  }.} {4 
1970: 31 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32  10}.do_test wal2
1980: 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.1 {.  execsql
1990: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
19a0: 61 29 2c 20 73 75 6d 28 61 29 20 46 52 4f 4d 20  a), sum(a) FROM 
19b0: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 34 20 31 30  t1 } db2.} {4 10
19c0: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 69  }..foreach {tn i
19d0: 49 6e 73 65 72 74 20 72 65 73 30 20 72 65 73 31  Insert res0 res1
19e0: 20 77 61 6c 5f 69 6e 64 65 78 5f 68 64 72 5f 6d   wal_index_hdr_m
19f0: 6f 64 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 32  od} {.         2
1a00: 20 20 20 20 35 20 20 20 7b 34 20 31 30 7d 20 20      5   {4 10}  
1a10: 20 7b 35 20 31 35 7d 20 20 20 20 30 0a 20 20 20   {5 15}    0.   
1a20: 20 20 20 20 20 20 33 20 20 20 20 36 20 20 20 7b        3    6   {
1a30: 35 20 31 35 7d 20 20 20 7b 36 20 32 31 7d 20 20  5 15}   {6 21}  
1a40: 20 20 31 0a 20 20 20 20 20 20 20 20 20 34 20 20    1.         4  
1a50: 20 20 37 20 20 20 7b 36 20 32 31 7d 20 20 20 7b    7   {6 21}   {
1a60: 37 20 32 38 7d 20 20 20 20 32 0a 20 20 20 20 20  7 28}    2.     
1a70: 20 20 20 20 35 20 20 20 20 38 20 20 20 7b 37 20      5    8   {7 
1a80: 32 38 7d 20 20 20 7b 38 20 33 36 7d 20 20 20 20  28}   {8 36}    
1a90: 33 0a 20 20 20 20 20 20 20 20 20 36 20 20 20 20  3.         6    
1aa0: 39 20 20 20 7b 38 20 33 36 7d 20 20 20 7b 39 20  9   {8 36}   {9 
1ab0: 34 35 7d 20 20 20 20 34 0a 20 20 20 20 20 20 20  45}    4.       
1ac0: 20 20 37 20 20 20 31 30 20 20 20 7b 39 20 34 35    7   10   {9 45
1ad0: 7d 20 20 20 7b 31 30 20 35 35 7d 20 20 20 35 0a  }   {10 55}   5.
1ae0: 20 20 20 20 20 20 20 20 20 38 20 20 20 31 31 20           8   11 
1af0: 20 20 7b 31 30 20 35 35 7d 20 20 7b 31 31 20 36    {10 55}  {11 6
1b00: 36 7d 20 20 20 36 0a 20 20 20 20 20 20 20 20 20  6}   6.         
1b10: 39 20 20 20 31 32 20 20 20 7b 31 31 20 36 36 7d  9   12   {11 66}
1b20: 20 20 7b 31 32 20 37 38 7d 20 20 20 37 0a 7d 20    {12 78}   7.} 
1b30: 7b 0a 20 20 74 76 66 73 20 66 69 6c 74 65 72 20  {.  tvfs filter 
1b40: 78 53 68 6d 4c 6f 63 6b 0a 0a 20 20 64 6f 5f 74  xShmLock..  do_t
1b50: 65 73 74 20 77 61 6c 32 2d 32 2e 24 74 6e 2e 31  est wal2-2.$tn.1
1b60: 20 7b 0a 20 20 20 20 73 65 74 20 6f 6c 64 68 64   {.    set oldhd
1b70: 72 20 5b 73 65 74 5f 74 76 66 73 5f 68 64 72 20  r [set_tvfs_hdr 
1b80: 24 3a 3a 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 20  $::filename].   
1b90: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
1ba0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1bb0: 28 24 69 49 6e 73 65 72 74 29 20 7d 0a 20 20 20  ($iInsert) }.   
1bc0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
1bd0: 54 20 63 6f 75 6e 74 28 61 29 2c 20 73 75 6d 28  T count(a), sum(
1be0: 61 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d  a) FROM t1 }.  }
1bf0: 20 24 72 65 73 31 0a 0a 20 20 64 6f 5f 74 65 73   $res1..  do_tes
1c00: 74 20 77 61 6c 32 2d 32 2e 24 74 6e 2e 32 20 7b  t wal2-2.$tn.2 {
1c10: 0a 20 20 20 20 73 65 74 20 3a 3a 6c 6f 63 6b 73  .    set ::locks
1c20: 20 5b 6c 69 73 74 5d 0a 20 20 20 20 70 72 6f 63   [list].    proc
1c30: 20 74 76 66 73 5f 63 62 20 7b 6d 65 74 68 6f 64   tvfs_cb {method
1c40: 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 20 20 73   args} {.      s
1c50: 65 74 20 6c 6f 63 6b 20 5b 6c 69 6e 64 65 78 20  et lock [lindex 
1c60: 24 61 72 67 73 20 32 5d 0a 20 20 20 20 20 20 6c  $args 2].      l
1c70: 61 70 70 65 6e 64 20 3a 3a 6c 6f 63 6b 73 20 24  append ::locks $
1c80: 6c 6f 63 6b 0a 20 20 20 20 20 20 69 66 20 7b 24  lock.      if {$
1c90: 6c 6f 63 6b 20 3d 3d 20 24 3a 3a 57 52 49 54 45  lock == $::WRITE
1ca0: 52 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74  R} {.        set
1cb0: 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c  _tvfs_hdr $::fil
1cc0: 65 6e 61 6d 65 20 24 3a 3a 6f 6c 64 68 64 72 0a  ename $::oldhdr.
1cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1ce0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  turn SQLITE_OK. 
1cf0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b 24 3a     }..    if {$:
1d00: 3a 77 61 6c 5f 69 6e 64 65 78 5f 68 64 72 5f 6d  :wal_index_hdr_m
1d10: 6f 64 20 3e 3d 20 30 7d 20 7b 0a 20 20 20 20 20  od >= 0} {.     
1d20: 20 69 6e 63 72 5f 74 76 66 73 5f 68 64 72 20 24   incr_tvfs_hdr $
1d30: 3a 3a 66 69 6c 65 6e 61 6d 65 20 24 3a 3a 77 61  ::filename $::wa
1d40: 6c 5f 69 6e 64 65 78 5f 68 64 72 5f 6d 6f 64 20  l_index_hdr_mod 
1d50: 31 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63  1.    }.    exec
1d60: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
1d70: 6e 74 28 61 29 2c 20 73 75 6d 28 61 29 20 46 52  nt(a), sum(a) FR
1d80: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20  OM t1 } db2.  } 
1d90: 24 72 65 73 30 0a 0a 20 20 64 6f 5f 74 65 73 74  $res0..  do_test
1da0: 20 77 61 6c 32 2d 32 2e 24 74 6e 2e 33 20 7b 0a   wal2-2.$tn.3 {.
1db0: 20 20 20 20 73 65 74 20 3a 3a 6c 6f 63 6b 73 0a      set ::locks.
1dc0: 20 20 7d 20 24 4c 4f 43 4b 53 0a 0a 20 20 64 6f    } $LOCKS..  do
1dd0: 5f 74 65 73 74 20 77 61 6c 32 2d 32 2e 24 74 6e  _test wal2-2.$tn
1de0: 2e 34 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 6c  .4 {.    set ::l
1df0: 6f 63 6b 73 20 5b 6c 69 73 74 5d 0a 20 20 20 20  ocks [list].    
1e00: 70 72 6f 63 20 74 76 66 73 5f 63 62 20 7b 6d 65  proc tvfs_cb {me
1e10: 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20 20 20  thod args} {.   
1e20: 20 20 20 73 65 74 20 6c 6f 63 6b 20 5b 6c 69 6e     set lock [lin
1e30: 64 65 78 20 24 61 72 67 73 20 32 5d 0a 20 20 20  dex $args 2].   
1e40: 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 6c 6f 63     lappend ::loc
1e50: 6b 73 20 24 6c 6f 63 6b 0a 20 20 20 20 20 20 72  ks $lock.      r
1e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
1e70: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b 24      }..    if {$
1e80: 3a 3a 77 61 6c 5f 69 6e 64 65 78 5f 68 64 72 5f  ::wal_index_hdr_
1e90: 6d 6f 64 20 3e 3d 20 30 7d 20 7b 0a 20 20 20 20  mod >= 0} {.    
1ea0: 20 20 69 6e 63 72 5f 74 76 66 73 5f 68 64 72 20    incr_tvfs_hdr 
1eb0: 24 3a 3a 66 69 6c 65 6e 61 6d 65 20 24 3a 3a 77  $::filename $::w
1ec0: 61 6c 5f 69 6e 64 65 78 5f 68 64 72 5f 6d 6f 64  al_index_hdr_mod
1ed0: 20 31 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65   1.    }.    exe
1ee0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
1ef0: 75 6e 74 28 61 29 2c 20 73 75 6d 28 61 29 20 46  unt(a), sum(a) F
1f00: 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d  ROM t1 } db2.  }
1f10: 20 24 72 65 73 31 0a 7d 0a 64 62 20 63 6c 6f 73   $res1.}.db clos
1f20: 65 0a 64 62 32 20 63 6c 6f 73 65 0a 74 76 66 73  e.db2 close.tvfs
1f30: 20 64 65 6c 65 74 65 0a 66 6f 72 63 65 64 65 6c   delete.forcedel
1f40: 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  ete test.db test
1f50: 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d  .db-wal test.db-
1f60: 6a 6f 75 72 6e 61 6c 0a 0a 0a 69 66 20 30 20 7b  journal...if 0 {
1f70: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
1fc0: 69 73 20 74 65 73 74 20 63 61 73 65 20 2d 20 77  is test case - w
1fd0: 61 6c 32 2d 33 2e 2a 20 2d 20 74 65 73 74 73 20  al2-3.* - tests 
1fe0: 74 68 65 20 72 65 73 70 6f 6e 73 65 20 6f 66 20  the response of 
1ff0: 74 68 65 20 6c 69 62 72 61 72 79 20 74 6f 20 61  the library to a
2000: 6e 0a 23 20 53 51 4c 49 54 45 5f 42 55 53 59 20  n.# SQLITE_BUSY 
2010: 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20  when attempting 
2020: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 41 44  to obtain a READ
2030: 20 6f 72 20 52 45 43 4f 56 45 52 20 6c 6f 63 6b   or RECOVER lock
2040: 2e 0a 23 0a 23 20 20 20 77 61 6c 32 2d 33 2e 30  ..#.#   wal2-3.0
2050: 20 2d 20 32 3a 20 53 51 4c 49 54 45 5f 42 55 53   - 2: SQLITE_BUS
2060: 59 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67  Y when obtaining
2070: 20 61 20 52 45 41 44 20 6c 6f 63 6b 0a 23 20 20   a READ lock.#  
2080: 20 77 61 6c 32 2d 33 2e 33 20 2d 20 36 3a 20 53   wal2-3.3 - 6: S
2090: 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
20a0: 6f 62 74 61 69 6e 69 6e 67 20 61 20 52 45 43 4f  obtaining a RECO
20b0: 56 45 52 20 6c 6f 63 6b 0a 23 0a 64 6f 5f 74 65  VER lock.#.do_te
20c0: 73 74 20 77 61 6c 32 2d 33 2e 30 20 7b 0a 20 20  st wal2-3.0 {.  
20d0: 70 72 6f 63 20 74 76 66 73 5f 63 62 20 7b 6d 65  proc tvfs_cb {me
20e0: 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20 20 20  thod args} {.   
20f0: 20 69 66 20 7b 24 6d 65 74 68 6f 64 20 3d 3d 20   if {$method == 
2100: 22 78 53 68 6d 4c 6f 63 6b 22 7d 20 7b 0a 20 20  "xShmLock"} {.  
2110: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
2120: 69 73 74 73 20 3a 3a 6c 6f 63 6b 65 64 5d 7d 20  ists ::locked]} 
2130: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
2140: 42 55 53 59 20 7d 0a 20 20 20 20 7d 0a 20 20 20  BUSY }.    }.   
2150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2160: 4b 0a 20 20 7d 0a 0a 20 20 70 72 6f 63 20 62 75  K.  }..  proc bu
2170: 73 79 68 61 6e 64 6c 65 72 20 78 20 7b 0a 20 20  syhandler x {.  
2180: 20 20 69 66 20 7b 24 78 3e 33 7d 20 7b 20 75 6e    if {$x>3} { un
2190: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
21a0: 3a 3a 6c 6f 63 6b 65 64 20 7d 0a 20 20 20 20 72  ::locked }.    r
21b0: 65 74 75 72 6e 20 30 0a 20 20 7d 0a 0a 20 20 74  eturn 0.  }..  t
21c0: 65 73 74 76 66 73 20 74 76 66 73 0a 20 20 74 76  estvfs tvfs.  tv
21d0: 66 73 20 73 63 72 69 70 74 20 74 76 66 73 5f 63  fs script tvfs_c
21e0: 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  b.  sqlite3 db t
21f0: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 66 73  est.db -vfs tvfs
2200: 0a 20 20 64 62 20 62 75 73 79 20 62 75 73 79 68  .  db busy busyh
2210: 61 6e 64 6c 65 72 0a 0a 20 20 65 78 65 63 73 71  andler..  execsq
2220: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
2230: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
2240: 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  L;.    CREATE TA
2250: 42 4c 45 20 74 31 28 61 29 3b 0a 20 20 20 20 49  BLE t1(a);.    I
2260: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2270: 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53  LUES(1);.    INS
2280: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2290: 45 53 28 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  ES(2);.    INSER
22a0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
22b0: 28 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (3);.    INSERT 
22c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34  INTO t1 VALUES(4
22d0: 29 3b 0a 20 20 7d 20 0a 0a 20 20 73 65 74 20 3a  );.  } ..  set :
22e0: 3a 6c 6f 63 6b 65 64 20 31 0a 20 20 69 6e 66 6f  :locked 1.  info
22f0: 20 65 78 69 73 74 73 20 3a 3a 6c 6f 63 6b 65 64   exists ::locked
2300: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {1}.do_test w
2310: 61 6c 32 2d 33 2e 31 20 7b 0a 20 20 65 78 65 63  al2-3.1 {.  exec
2320: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
2330: 6e 74 28 61 29 2c 20 73 75 6d 28 61 29 20 46 52  nt(a), sum(a) FR
2340: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 34 20 31 30 7d  OM t1 }.} {4 10}
2350: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 33 2e  .do_test wal2-3.
2360: 32 20 7b 0a 20 20 69 6e 66 6f 20 65 78 69 73 74  2 {.  info exist
2370: 73 20 3a 3a 6c 6f 63 6b 65 64 0a 7d 20 7b 30 7d  s ::locked.} {0}
2380: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 33  ..do_test wal2-3
2390: 2e 33 20 7b 0a 20 20 70 72 6f 63 20 74 76 66 73  .3 {.  proc tvfs
23a0: 5f 63 62 20 7b 6d 65 74 68 6f 64 20 61 72 67 73  _cb {method args
23b0: 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 6d 65 74  } {.    if {$met
23c0: 68 6f 64 20 3d 3d 20 22 78 53 68 6d 4c 6f 63 6b  hod == "xShmLock
23d0: 22 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b  "} {.      if {[
23e0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 61  info exists ::sa
23f0: 62 6f 74 61 67 65 5d 7d 20 7b 0a 20 20 20 20 20  botage]} {.     
2400: 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
2410: 6c 61 69 6e 20 3a 3a 73 61 62 6f 74 61 67 65 0a  lain ::sabotage.
2420: 20 20 20 20 20 20 20 20 69 6e 63 72 5f 74 76 66          incr_tvf
2430: 73 5f 68 64 72 20 5b 6c 69 6e 64 65 78 20 24 61  s_hdr [lindex $a
2440: 72 67 73 20 30 5d 20 31 20 31 0a 20 20 20 20 20  rgs 0] 1 1.     
2450: 20 7d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e   }.      if {[in
2460: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6c 6f 63 6b  fo exists ::lock
2470: 65 64 5d 20 26 26 20 5b 6c 69 6e 64 65 78 20 24  ed] && [lindex $
2480: 61 72 67 73 20 32 5d 20 3d 3d 20 22 52 45 43 4f  args 2] == "RECO
2490: 56 45 52 22 7d 20 7b 0a 20 20 20 20 20 20 20 20  VER"} {.        
24a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
24b0: 53 59 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  SY.      }.    }
24c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24d0: 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 73 65 74 20  TE_OK.  }.  set 
24e0: 3a 3a 73 61 62 6f 74 61 67 65 20 31 0a 20 20 73  ::sabotage 1.  s
24f0: 65 74 20 3a 3a 6c 6f 63 6b 65 64 20 31 0a 20 20  et ::locked 1.  
2500: 6c 69 73 74 20 5b 69 6e 66 6f 20 65 78 69 73 74  list [info exist
2510: 73 20 3a 3a 73 61 62 6f 74 61 67 65 5d 20 5b 69  s ::sabotage] [i
2520: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6c 6f 63  nfo exists ::loc
2530: 6b 65 64 5d 0a 7d 20 7b 31 20 31 7d 0a 64 6f 5f  ked].} {1 1}.do_
2540: 74 65 73 74 20 77 61 6c 32 2d 33 2e 34 20 7b 0a  test wal2-3.4 {.
2550: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
2560: 43 54 20 63 6f 75 6e 74 28 61 29 2c 20 73 75 6d  CT count(a), sum
2570: 28 61 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  (a) FROM t1 }.} 
2580: 7b 34 20 31 30 7d 0a 64 6f 5f 74 65 73 74 20 77  {4 10}.do_test w
2590: 61 6c 32 2d 33 2e 35 20 7b 0a 20 20 6c 69 73 74  al2-3.5 {.  list
25a0: 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a   [info exists ::
25b0: 73 61 62 6f 74 61 67 65 5d 20 5b 69 6e 66 6f 20  sabotage] [info 
25c0: 65 78 69 73 74 73 20 3a 3a 6c 6f 63 6b 65 64 5d  exists ::locked]
25d0: 0a 7d 20 7b 30 20 30 7d 0a 64 62 20 63 6c 6f 73  .} {0 0}.db clos
25e0: 65 0a 74 76 66 73 20 64 65 6c 65 74 65 0a 66 6f  e.tvfs delete.fo
25f0: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
2600: 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  b test.db-wal te
2610: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 0a 7d  st.db-journal..}
2620: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
2670: 65 73 74 20 74 68 61 74 20 61 20 64 61 74 61 62  est that a datab
2680: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 75  ase connection u
2690: 73 69 6e 67 20 61 20 56 46 53 20 74 68 61 74 20  sing a VFS that 
26a0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
26b0: 20 74 68 65 0a 23 20 78 53 68 6d 58 58 58 20 69   the.# xShmXXX i
26c0: 6e 74 65 72 66 61 63 65 73 20 63 61 6e 6e 6f 74  nterfaces cannot
26d0: 20 6f 70 65 6e 20 61 20 57 41 4c 20 64 61 74 61   open a WAL data
26e0: 62 61 73 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  base..#.do_test 
26f0: 77 61 6c 32 2d 34 2e 31 20 7b 0a 20 20 73 71 6c  wal2-4.1 {.  sql
2700: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
2710: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2720: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
2730: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52 41 47  um = 0;.    PRAG
2740: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
2750: 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54  = WAL;.    CREAT
2760: 45 20 54 41 42 4c 45 20 64 61 74 61 28 78 29 3b  E TABLE data(x);
2770: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2780: 20 64 61 74 61 20 56 41 4c 55 45 53 28 27 6e 65   data VALUES('ne
2790: 65 64 20 78 53 68 6d 4f 70 65 6e 20 74 6f 20 73  ed xShmOpen to s
27a0: 65 65 20 74 68 69 73 27 29 3b 0a 20 20 20 20 50  ee this');.    P
27b0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
27c0: 6f 69 6e 74 3b 0a 20 20 7d 0a 20 20 23 20 54 68  oint;.  }.  # Th
27d0: 72 65 65 20 70 61 67 65 73 20 69 6e 20 74 68 65  ree pages in the
27e0: 20 57 41 4c 20 66 69 6c 65 20 61 74 20 74 68 69   WAL file at thi
27f0: 73 20 70 6f 69 6e 74 3a 20 4f 6e 65 20 63 6f 70  s point: One cop
2800: 79 20 6f 66 20 70 61 67 65 20 31 20 61 6e 64 20  y of page 1 and 
2810: 74 77 6f 0a 20 20 23 20 6f 66 20 74 68 65 20 72  two.  # of the r
2820: 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74 61 62  oot page for tab
2830: 6c 65 20 22 64 61 74 61 22 2e 0a 7d 20 7b 77 61  le "data"..} {wa
2840: 6c 20 30 20 33 20 33 7d 0a 64 6f 5f 74 65 73 74  l 0 3 3}.do_test
2850: 20 77 61 6c 32 2d 34 2e 32 20 7b 0a 20 20 64 62   wal2-4.2 {.  db
2860: 20 63 6c 6f 73 65 0a 20 20 74 65 73 74 76 66 73   close.  testvfs
2870: 20 74 76 66 73 20 2d 6e 6f 73 68 6d 20 31 0a 20   tvfs -noshm 1. 
2880: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
2890: 2e 64 62 20 2d 76 66 73 20 74 76 66 73 0a 20 20  .db -vfs tvfs.  
28a0: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
28b0: 54 20 2a 20 46 52 4f 4d 20 64 61 74 61 20 7d 0a  T * FROM data }.
28c0: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  } {1 {unable to 
28d0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
28e0: 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  le}}.do_test wal
28f0: 32 2d 34 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f  2-4.3 {.  db clo
2900: 73 65 0a 20 20 74 65 73 74 76 66 73 20 74 76 66  se.  testvfs tvf
2910: 73 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  s.  sqlite3 db t
2920: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 66 73  est.db -vfs tvfs
2930: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
2940: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 61 74 61  LECT * FROM data
2950: 20 7d 0a 7d 20 7b 30 20 7b 7b 6e 65 65 64 20 78   }.} {0 {{need x
2960: 53 68 6d 4f 70 65 6e 20 74 6f 20 73 65 65 20 74  ShmOpen to see t
2970: 68 69 73 7d 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a  his}}}.db close.
2980: 74 76 66 73 20 64 65 6c 65 74 65 0a 0a 23 2d 2d  tvfs delete..#--
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29d0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
29e0: 68 61 74 20 69 66 20 61 20 64 61 74 61 62 61 73  hat if a databas
29f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
2a00: 66 6f 72 63 65 64 20 74 6f 20 72 75 6e 20 72 65  forced to run re
2a10: 63 6f 76 65 72 79 20 62 65 66 6f 72 65 20 69 74  covery before it
2a20: 0a 23 20 63 61 6e 20 70 65 72 66 6f 72 6d 20 61  .# can perform a
2a30: 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 69 74 20   checkpoint, it 
2a40: 64 6f 65 73 20 6e 6f 74 20 74 72 61 6e 73 69 74  does not transit
2a50: 69 6f 6e 20 69 6e 74 6f 20 52 45 43 4f 56 45 52  ion into RECOVER
2a60: 20 73 74 61 74 65 2e 0a 23 0a 23 20 55 50 44 41   state..#.# UPDA
2a70: 54 45 3a 20 54 68 69 73 20 68 61 73 20 6e 6f 77  TE: This has now
2a80: 20 63 68 61 6e 67 65 64 2e 20 57 68 65 6e 20 72   changed. When r
2a90: 75 6e 6e 69 6e 67 20 61 20 63 68 65 63 6b 70 6f  unning a checkpo
2aa0: 69 6e 74 2c 20 69 66 20 72 65 63 6f 76 65 72 79  int, if recovery
2ab0: 20 69 73 0a 23 20 72 65 71 75 69 72 65 64 20 74   is.# required t
2ac0: 68 65 20 63 6c 69 65 6e 74 20 67 72 61 62 73 20  he client grabs 
2ad0: 61 6c 6c 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  all exclusive lo
2ae0: 63 6b 73 20 28 6a 75 73 74 20 61 73 20 69 74 20  cks (just as it 
2af0: 77 6f 75 6c 64 20 66 6f 72 20 61 0a 23 20 72 65  would for a.# re
2b00: 63 6f 76 65 72 79 20 70 65 72 66 6f 72 6d 65 64  covery performed
2b10: 20 61 73 20 61 20 70 72 65 2d 63 75 72 73 6f 72   as a pre-cursor
2b20: 20 74 6f 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74   to a normal dat
2b30: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
2b40: 6e 29 2e 0a 23 0a 73 65 74 20 65 78 70 65 63 74  n)..#.set expect
2b50: 65 64 5f 6c 6f 63 6b 73 20 5b 6c 69 73 74 5d 0a  ed_locks [list].
2b60: 6c 61 70 70 65 6e 64 20 65 78 70 65 63 74 65 64  lappend expected
2b70: 5f 6c 6f 63 6b 73 20 7b 31 20 31 20 6c 6f 63 6b  _locks {1 1 lock
2b80: 20 65 78 63 6c 75 73 69 76 65 7d 20 20 20 3b 23   exclusive}   ;#
2b90: 20 4c 6f 63 6b 20 63 68 65 63 6b 70 6f 69 6e 74   Lock checkpoint
2ba0: 0a 6c 61 70 70 65 6e 64 20 65 78 70 65 63 74 65  .lappend expecte
2bb0: 64 5f 6c 6f 63 6b 73 20 7b 30 20 31 20 6c 6f 63  d_locks {0 1 loc
2bc0: 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 20 20 3b  k exclusive}   ;
2bd0: 23 20 4c 6f 63 6b 20 77 72 69 74 65 72 0a 6c 61  # Lock writer.la
2be0: 70 70 65 6e 64 20 65 78 70 65 63 74 65 64 5f 6c  ppend expected_l
2bf0: 6f 63 6b 73 20 7b 32 20 31 20 6c 6f 63 6b 20 65  ocks {2 1 lock e
2c00: 78 63 6c 75 73 69 76 65 7d 20 20 20 3b 23 20 4c  xclusive}   ;# L
2c10: 6f 63 6b 20 72 65 63 6f 76 65 72 79 0a 6c 61 70  ock recovery.lap
2c20: 70 65 6e 64 20 65 78 70 65 63 74 65 64 5f 6c 6f  pend expected_lo
2c30: 63 6b 73 20 7b 34 20 34 20 6c 6f 63 6b 20 65 78  cks {4 4 lock ex
2c40: 63 6c 75 73 69 76 65 7d 20 20 20 3b 23 20 4c 6f  clusive}   ;# Lo
2c50: 63 6b 20 61 6c 6c 20 61 52 65 61 64 4d 61 72 6b  ck all aReadMark
2c60: 5b 5d 0a 6c 61 70 70 65 6e 64 20 65 78 70 65 63  [].lappend expec
2c70: 74 65 64 5f 6c 6f 63 6b 73 20 7b 32 20 31 20 75  ted_locks {2 1 u
2c80: 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d  nlock exclusive}
2c90: 20 3b 23 20 55 6e 6c 6f 63 6b 20 72 65 63 6f 76   ;# Unlock recov
2ca0: 65 72 79 20 0a 6c 61 70 70 65 6e 64 20 65 78 70  ery .lappend exp
2cb0: 65 63 74 65 64 5f 6c 6f 63 6b 73 20 7b 34 20 34  ected_locks {4 4
2cc0: 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76   unlock exclusiv
2cd0: 65 7d 20 3b 23 20 55 6e 6c 6f 63 6b 20 61 6c 6c  e} ;# Unlock all
2ce0: 20 61 52 65 61 64 4d 61 72 6b 5b 5d 20 0a 6c 61   aReadMark[] .la
2cf0: 70 70 65 6e 64 20 65 78 70 65 63 74 65 64 5f 6c  ppend expected_l
2d00: 6f 63 6b 73 20 7b 30 20 31 20 75 6e 6c 6f 63 6b  ocks {0 1 unlock
2d10: 20 65 78 63 6c 75 73 69 76 65 7d 20 3b 23 20 55   exclusive} ;# U
2d20: 6e 6c 6f 63 6b 20 77 72 69 74 65 72 0a 6c 61 70  nlock writer.lap
2d30: 70 65 6e 64 20 65 78 70 65 63 74 65 64 5f 6c 6f  pend expected_lo
2d40: 63 6b 73 20 7b 33 20 31 20 6c 6f 63 6b 20 65 78  cks {3 1 lock ex
2d50: 63 6c 75 73 69 76 65 7d 20 20 20 3b 23 20 4c 6f  clusive}   ;# Lo
2d60: 63 6b 20 61 52 65 61 64 4d 61 72 6b 5b 30 5d 0a  ck aReadMark[0].
2d70: 6c 61 70 70 65 6e 64 20 65 78 70 65 63 74 65 64  lappend expected
2d80: 5f 6c 6f 63 6b 73 20 7b 33 20 31 20 75 6e 6c 6f  _locks {3 1 unlo
2d90: 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 3b 23  ck exclusive} ;#
2da0: 20 55 6e 6c 6f 63 6b 20 61 52 65 61 64 4d 61 72   Unlock aReadMar
2db0: 6b 5b 30 5d 0a 6c 61 70 70 65 6e 64 20 65 78 70  k[0].lappend exp
2dc0: 65 63 74 65 64 5f 6c 6f 63 6b 73 20 7b 31 20 31  ected_locks {1 1
2dd0: 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76   unlock exclusiv
2de0: 65 7d 20 3b 23 20 55 6e 6c 6f 63 6b 20 63 68 65  e} ;# Unlock che
2df0: 63 6b 70 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20  ckpoint.do_test 
2e00: 77 61 6c 32 2d 35 2e 31 20 7b 0a 20 20 70 72 6f  wal2-5.1 {.  pro
2e10: 63 20 74 76 66 73 5f 63 62 20 7b 6d 65 74 68 6f  c tvfs_cb {metho
2e20: 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65  d args} {.    se
2e30: 74 20 3a 3a 73 68 6d 5f 66 69 6c 65 20 5b 6c 69  t ::shm_file [li
2e40: 6e 64 65 78 20 24 61 72 67 73 20 30 5d 0a 20 20  ndex $args 0].  
2e50: 20 20 69 66 20 7b 24 6d 65 74 68 6f 64 20 3d 3d    if {$method ==
2e60: 20 22 78 53 68 6d 4c 6f 63 6b 22 7d 20 7b 20 6c   "xShmLock"} { l
2e70: 61 70 70 65 6e 64 20 3a 3a 6c 6f 63 6b 73 20 5b  append ::locks [
2e80: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 32 5d 20  lindex $args 2] 
2e90: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a  }.    return $::
2ea0: 74 76 66 73 5f 63 62 5f 72 65 74 75 72 6e 0a 20  tvfs_cb_return. 
2eb0: 20 7d 0a 20 20 73 65 74 20 74 76 66 73 5f 63 62   }.  set tvfs_cb
2ec0: 5f 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f  _return SQLITE_O
2ed0: 4b 0a 0a 20 20 74 65 73 74 76 66 73 20 74 76 66  K..  testvfs tvf
2ee0: 73 0a 20 20 74 76 66 73 20 73 63 72 69 70 74 20  s.  tvfs script 
2ef0: 74 76 66 73 5f 63 62 0a 0a 20 20 73 71 6c 69 74  tvfs_cb..  sqlit
2f00: 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76  e3 db test.db -v
2f10: 66 73 20 74 76 66 73 0a 20 20 65 78 65 63 73 71  fs tvfs.  execsq
2f20: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
2f30: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
2f40: 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  L;.    CREATE TA
2f50: 42 4c 45 20 78 28 79 29 3b 0a 20 20 20 20 49 4e  BLE x(y);.    IN
2f60: 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41 4c 55  SERT INTO x VALU
2f70: 45 53 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ES(1);.  }..  in
2f80: 63 72 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a 73  cr_tvfs_hdr $::s
2f90: 68 6d 5f 66 69 6c 65 20 31 20 31 0a 20 20 73 65  hm_file 1 1.  se
2fa0: 74 20 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 73 74 5d  t ::locks [list]
2fb0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
2fc0: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
2fd0: 6e 74 20 7d 0a 20 20 73 65 74 20 3a 3a 6c 6f 63  nt }.  set ::loc
2fe0: 6b 73 0a 7d 20 24 65 78 70 65 63 74 65 64 5f 6c  ks.} $expected_l
2ff0: 6f 63 6b 73 0a 64 62 20 63 6c 6f 73 65 0a 74 76  ocks.db close.tv
3000: 66 73 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d  fs delete..#----
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f  -----.# This blo
3060: 63 6b 2c 20 74 65 73 74 20 63 61 73 65 73 20 77  ck, test cases w
3070: 61 6c 32 2d 36 2e 2a 2c 20 74 65 73 74 73 20 74  al2-6.*, tests t
3080: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  he operation of 
3090: 57 41 4c 20 77 69 74 68 0a 23 20 22 50 52 41 47  WAL with.# "PRAG
30a0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  MA locking_mode=
30b0: 45 58 43 4c 55 53 49 56 45 22 20 73 65 74 2e 0a  EXCLUSIVE" set..
30c0: 23 0a 23 20 20 20 77 61 6c 32 2d 36 2e 31 2e 2a  #.#   wal2-6.1.*
30d0: 3a 20 43 68 61 6e 67 69 6e 67 20 74 6f 20 57 41  : Changing to WA
30e0: 4c 20 6d 6f 64 65 20 62 65 66 6f 72 65 20 73 65  L mode before se
30f0: 74 74 69 6e 67 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  tting locking_mo
3100: 64 65 3d 65 78 63 6c 75 73 69 76 65 2e 0a 23 0a  de=exclusive..#.
3110: 23 20 20 20 77 61 6c 32 2d 36 2e 32 2e 2a 3a 20  #   wal2-6.2.*: 
3120: 43 68 61 6e 67 69 6e 67 20 74 6f 20 57 41 4c 20  Changing to WAL 
3130: 6d 6f 64 65 20 61 66 74 65 72 20 73 65 74 74 69  mode after setti
3140: 6e 67 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ng locking_mode=
3150: 65 78 63 6c 75 73 69 76 65 2e 0a 23 0a 23 20 20  exclusive..#.#  
3160: 20 77 61 6c 32 2d 36 2e 33 2e 2a 3a 20 43 68 61   wal2-6.3.*: Cha
3170: 6e 67 69 6e 67 20 62 61 63 6b 20 74 6f 20 72 6f  nging back to ro
3180: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 66 72 6f 6d  llback mode from
3190: 20 57 41 4c 20 6d 6f 64 65 20 61 66 74 65 72 20   WAL mode after 
31a0: 73 65 74 74 69 6e 67 20 0a 23 20 20 20 20 20 20  setting .#      
31b0: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 69 6e 67           locking
31c0: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2e  _mode=exclusive.
31d0: 0a 23 0a 23 20 20 20 77 61 6c 32 2d 36 2e 34 2e  .#.#   wal2-6.4.
31e0: 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20 78 53  *: Check that xS
31f0: 68 6d 4c 6f 63 6b 20 63 61 6c 6c 73 20 61 72 65  hmLock calls are
3200: 20 6f 6d 69 74 74 65 64 20 69 6e 20 65 78 63 6c   omitted in excl
3210: 75 73 69 76 65 20 6c 6f 63 6b 69 6e 67 0a 23 20  usive locking.# 
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f                mo
3230: 64 65 2e 0a 23 0a 23 20 20 20 77 61 6c 32 2d 36  de..#.#   wal2-6
3240: 2e 35 2e 2a 3a 20 0a 23 0a 23 20 20 20 77 61 6c  .5.*: .#.#   wal
3250: 32 2d 36 2e 36 2e 2a 3a 20 43 68 65 63 6b 20 74  2-6.6.*: Check t
3260: 68 61 74 20 69 66 20 74 68 65 20 78 53 68 6d 4c  hat if the xShmL
3270: 6f 63 6b 28 29 20 74 6f 20 72 65 61 71 75 69 72  ock() to reaquir
3280: 65 20 61 20 57 41 4c 20 72 65 61 64 2d 6c 6f 63  e a WAL read-loc
3290: 6b 20 77 68 65 6e 0a 23 20 20 20 20 20 20 20 20  k when.#        
32a0: 20 20 20 20 20 20 20 65 78 69 74 69 6e 67 20 65         exiting e
32b0: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 66 61  xclusive mode fa
32c0: 69 6c 73 20 28 69 2e 65 2e 20 53 51 4c 49 54 45  ils (i.e. SQLITE
32d0: 5f 49 4f 45 52 52 29 2c 20 74 68 65 6e 20 74 68  _IOERR), then th
32e0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
32f0: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6c    connection sil
3300: 65 6e 74 6c 79 20 72 65 6d 61 69 6e 73 20 69 6e  ently remains in
3310: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
3320: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  .#.do_test wal2-
3330: 36 2e 31 2e 31 20 7b 0a 20 20 66 6f 72 63 65 64  6.1.1 {.  forced
3340: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65  elete test.db te
3350: 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64  st.db-wal test.d
3360: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69  b-journal.  sqli
3370: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
3380: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
3390: 72 61 67 6d 61 20 4a 6f 75 72 6e 61 6c 5f 4d 6f  ragma Journal_Mo
33a0: 64 65 20 3d 20 57 61 6c 3b 0a 20 20 7d 0a 7d 20  de = Wal;.  }.} 
33b0: 7b 77 61 6c 7d 0a 64 6f 5f 74 65 73 74 20 77 61  {wal}.do_test wa
33c0: 6c 32 2d 36 2e 31 2e 32 20 7b 0a 20 20 65 78 65  l2-6.1.2 {.  exe
33d0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c 6f  csql { PRAGMA lo
33e0: 63 6b 5f 73 74 61 74 75 73 20 7d 0a 7d 20 7b 6d  ck_status }.} {m
33f0: 61 69 6e 20 75 6e 6c 6f 63 6b 65 64 20 74 65 6d  ain unlocked tem
3400: 70 20 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65 73  p closed}.do_tes
3410: 74 20 77 61 6c 32 2d 36 2e 31 2e 33 20 7b 0a 20  t wal2-6.1.3 {. 
3420: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3430: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
3440: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20  ite_master;.    
3450: 50 72 61 67 6d 61 20 4c 6f 63 6b 69 6e 67 5f 4d  Pragma Locking_M
3460: 6f 64 65 20 3d 20 45 78 63 6c 75 73 69 76 65 3b  ode = Exclusive;
3470: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
3480: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
3490: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
34a0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49  1(a, b);.      I
34b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
34c0: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
34d0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47  COMMIT;.    PRAG
34e0: 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a  MA lock_status;.
34f0: 20 20 7d 0a 7d 20 7b 6d 61 69 6e 20 65 78 63 6c    }.} {main excl
3500: 75 73 69 76 65 20 74 65 6d 70 20 63 6c 6f 73 65  usive temp close
3510: 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  d}.do_test wal2-
3520: 36 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  6.1.4 {.  execsq
3530: 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20  l { .    PRAGMA 
3540: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e  locking_mode = n
3550: 6f 72 6d 61 6c 3b 20 0a 20 20 20 20 50 52 41 47  ormal; .    PRAG
3560: 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a  MA lock_status;.
3570: 20 20 7d 0a 7d 20 7b 6e 6f 72 6d 61 6c 20 6d 61    }.} {normal ma
3580: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 74 65 6d  in exclusive tem
3590: 70 20 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65 73  p closed}.do_tes
35a0: 74 20 77 61 6c 32 2d 36 2e 31 2e 35 20 7b 0a 20  t wal2-6.1.5 {. 
35b0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
35c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
35d0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  ;.    PRAGMA loc
35e0: 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20  k_status;.  }.} 
35f0: 7b 31 20 32 20 6d 61 69 6e 20 73 68 61 72 65 64  {1 2 main shared
3600: 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 64 6f   temp closed}.do
3610: 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 31 2e 36  _test wal2-6.1.6
3620: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3630: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3640: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a  1 VALUES(3, 4);.
3650: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
3660: 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 6d  status;.  }.} {m
3670: 61 69 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20  ain shared temp 
3680: 63 6c 6f 73 65 64 7d 0a 64 62 20 63 6c 6f 73 65  closed}.db close
3690: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  ..do_test wal2-6
36a0: 2e 32 2e 31 20 7b 0a 20 20 66 6f 72 63 65 64 65  .2.1 {.  forcede
36b0: 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73  lete test.db tes
36c0: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62  t.db-wal test.db
36d0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74  -journal.  sqlit
36e0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
36f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 72  execsql {.    Pr
3700: 61 67 6d 61 20 4c 6f 63 6b 69 6e 67 5f 4d 6f 64  agma Locking_Mod
3710: 65 20 3d 20 45 78 63 6c 75 73 69 76 65 3b 0a 20  e = Exclusive;. 
3720: 20 20 20 50 72 61 67 6d 61 20 4a 6f 75 72 6e 61     Pragma Journa
3730: 6c 5f 4d 6f 64 65 20 3d 20 57 61 6c 3b 0a 20 20  l_Mode = Wal;.  
3740: 20 20 50 72 61 67 6d 61 20 4c 6f 63 6b 5f 53 74    Pragma Lock_St
3750: 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63  atus;.  }.} {exc
3760: 6c 75 73 69 76 65 20 77 61 6c 20 6d 61 69 6e 20  lusive wal main 
3770: 65 78 63 6c 75 73 69 76 65 20 74 65 6d 70 20 63  exclusive temp c
3780: 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20 77  losed}.do_test w
3790: 61 6c 32 2d 36 2e 32 2e 32 20 7b 0a 20 20 65 78  al2-6.2.2 {.  ex
37a0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
37b0: 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  N;.      CREATE 
37c0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
37d0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
37e0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
37f0: 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  );.    COMMIT;. 
3800: 20 20 20 50 72 61 67 6d 61 20 6c 6f 43 4b 5f 53     Pragma loCK_S
3810: 54 41 54 75 73 3b 0a 20 20 7d 0a 7d 20 7b 6d 61  TATus;.  }.} {ma
3820: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 74 65 6d  in exclusive tem
3830: 70 20 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65 73  p closed}.do_tes
3840: 74 20 77 61 6c 32 2d 36 2e 32 2e 33 20 7b 0a 20  t wal2-6.2.3 {. 
3850: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
3860: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
3870: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
3880: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
3890: 6d 61 73 74 65 72 20 7d 0a 20 20 65 78 65 63 73  master }.  execs
38a0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 4c 4f 43 4b  ql { PRAGMA LOCK
38b0: 49 4e 47 5f 4d 4f 44 45 20 3d 20 45 58 43 4c 55  ING_MODE = EXCLU
38c0: 53 49 56 45 20 7d 0a 7d 20 7b 65 78 63 6c 75 73  SIVE }.} {exclus
38d0: 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  ive}.do_test wal
38e0: 32 2d 36 2e 32 2e 34 20 7b 0a 20 20 65 78 65 63  2-6.2.4 {.  exec
38f0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
3900: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
3910: 70 72 61 67 6d 61 20 6c 6f 63 6b 5f 73 74 61 74  pragma lock_stat
3920: 75 73 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 6d  us;.  }.} {1 2 m
3930: 61 69 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20  ain shared temp 
3940: 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20  closed}.do_test 
3950: 77 61 6c 32 2d 36 2e 32 2e 35 20 7b 0a 20 20 65  wal2-6.2.5 {.  e
3960: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
3970: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3980: 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 70 72  ES(3, 4);.    pr
3990: 61 67 6d 61 20 6c 6f 63 6b 5f 73 74 61 74 75 73  agma lock_status
39a0: 3b 0a 20 20 7d 0a 7d 20 7b 6d 61 69 6e 20 65 78  ;.  }.} {main ex
39b0: 63 6c 75 73 69 76 65 20 74 65 6d 70 20 63 6c 6f  clusive temp clo
39c0: 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  sed}.do_test wal
39d0: 32 2d 36 2e 32 2e 36 20 7b 0a 20 20 65 78 65 63  2-6.2.6 {.  exec
39e0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
39f0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20   locking_mode = 
3a00: 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 72 61 67  NORMAL;.    prag
3a10: 6d 61 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a  ma lock_status;.
3a20: 20 20 7d 0a 7d 20 7b 6e 6f 72 6d 61 6c 20 6d 61    }.} {normal ma
3a30: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 74 65 6d  in exclusive tem
3a40: 70 20 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65 73  p closed}.do_tes
3a50: 74 20 77 61 6c 32 2d 36 2e 32 2e 37 20 7b 0a 20  t wal2-6.2.7 {. 
3a60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
3a70: 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 20  EGIN IMMEDIATE; 
3a80: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 70 72 61 67  COMMIT;.    prag
3a90: 6d 61 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a  ma lock_status;.
3aa0: 20 20 7d 0a 7d 20 7b 6d 61 69 6e 20 73 68 61 72    }.} {main shar
3ab0: 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a  ed temp closed}.
3ac0: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 32  do_test wal2-6.2
3ad0: 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .8 {.  execsql {
3ae0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
3af0: 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55  ing_mode = EXCLU
3b00: 53 49 56 45 3b 0a 20 20 20 20 42 45 47 49 4e 20  SIVE;.    BEGIN 
3b10: 49 4d 4d 45 44 49 41 54 45 3b 20 43 4f 4d 4d 49  IMMEDIATE; COMMI
3b20: 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f  T;.    PRAGMA lo
3b30: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 4e 4f 52  cking_mode = NOR
3b40: 4d 41 4c 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  MAL;.  }.  execs
3b50: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3b60: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 70  * FROM t1;.    p
3b70: 72 61 67 6d 61 20 6c 6f 63 6b 5f 73 74 61 74 75  ragma lock_statu
3b80: 73 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20  s;.  }.} {1 2 3 
3b90: 34 20 6d 61 69 6e 20 73 68 61 72 65 64 20 74 65  4 main shared te
3ba0: 6d 70 20 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65  mp closed}.do_te
3bb0: 73 74 20 77 61 6c 32 2d 36 2e 32 2e 39 20 7b 0a  st wal2-6.2.9 {.
3bc0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3bd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3be0: 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20  ALUES(5, 6);.   
3bf0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3c00: 31 3b 0a 20 20 20 20 70 72 61 67 6d 61 20 6c 6f  1;.    pragma lo
3c10: 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d  ck_status;.  }.}
3c20: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 6d 61   {1 2 3 4 5 6 ma
3c30: 69 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20 63  in shared temp c
3c40: 6c 6f 73 65 64 7d 0a 64 62 20 63 6c 6f 73 65 0a  losed}.db close.
3c50: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e  .do_test wal2-6.
3c60: 33 2e 31 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c  3.1 {.  forcedel
3c70: 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  ete test.db test
3c80: 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d  .db-wal test.db-
3c90: 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65  journal.  sqlite
3ca0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
3cb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
3cc0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
3cd0: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 50 52 41 47   = WAL;.    PRAG
3ce0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
3cf0: 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20  = exclusive;.   
3d00: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
3d10: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
3d20: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3d30: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 43  NTO t1 VALUES('C
3d40: 68 69 63 6f 27 29 3b 0a 20 20 20 20 20 20 49 4e  hico');.      IN
3d50: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3d60: 55 45 53 28 27 48 61 72 70 6f 27 29 3b 0a 20 20  UES('Harpo');.  
3d70: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
3d80: 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74  list [file exist
3d90: 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 5b  s test.db-wal] [
3da0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
3db0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 0a 7d 20 7b  .db-journal].} {
3dc0: 31 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  1 0}.do_test wal
3dd0: 32 2d 36 2e 33 2e 32 20 7b 0a 20 20 69 66 63 61  2-6.3.2 {.  ifca
3de0: 70 61 62 6c 65 20 65 6e 61 62 6c 65 5f 70 65 72  pable enable_per
3df0: 73 69 73 74 5f 77 61 6c 20 7b 0a 20 20 20 20 66  sist_wal {.    f
3e00: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
3e10: 69 73 74 5f 77 61 6c 20 64 62 20 30 0a 20 20 7d  ist_wal db 0.  }
3e20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
3e30: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
3e40: 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 66 69   = DELETE }.  fi
3e50: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
3e60: 62 2d 77 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74  b-wal.} {0}.do_t
3e70: 65 73 74 20 77 61 6c 32 2d 36 2e 33 2e 32 2e 31  est wal2-6.3.2.1
3e80: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
3e90: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
3ea0: 64 65 3b 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d  de; }.} {delete}
3eb0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e  .do_test wal2-6.
3ec0: 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.3 {.  execsql 
3ed0: 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74  { PRAGMA lock_st
3ee0: 61 74 75 73 20 7d 0a 7d 20 7b 6d 61 69 6e 20 65  atus }.} {main e
3ef0: 78 63 6c 75 73 69 76 65 20 74 65 6d 70 20 63 6c  xclusive temp cl
3f00: 6f 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61  osed}.do_test wa
3f10: 6c 32 2d 36 2e 33 2e 34 20 7b 0a 20 20 65 78 65  l2-6.3.4 {.  exe
3f20: 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49  csql { .    BEGI
3f30: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
3f40: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
3f50: 47 72 6f 75 63 68 6f 27 29 3b 0a 20 20 7d 0a 7d  Groucho');.  }.}
3f60: 20 7b 7d 0a 69 66 20 7b 5b 61 74 6f 6d 69 63 5f   {}.if {[atomic_
3f70: 62 61 74 63 68 5f 77 72 69 74 65 20 74 65 73 74  batch_write test
3f80: 2e 64 62 5d 3d 3d 30 7d 20 7b 0a 20 20 64 6f 5f  .db]==0} {.  do_
3f90: 74 65 73 74 20 77 61 6c 32 2d 36 2e 33 2e 34 2e  test wal2-6.3.4.
3fa0: 31 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 66 69  1 {.    list [fi
3fb0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
3fc0: 62 2d 77 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69  b-wal] [file exi
3fd0: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
3fe0: 6e 61 6c 5d 0a 20 20 7d 20 7b 30 20 31 7d 0a 7d  nal].  } {0 1}.}
3ff0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e  .do_test wal2-6.
4000: 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.5 {.  execsql 
4010: 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74  { PRAGMA lock_st
4020: 61 74 75 73 20 7d 0a 7d 20 7b 6d 61 69 6e 20 65  atus }.} {main e
4030: 78 63 6c 75 73 69 76 65 20 74 65 6d 70 20 63 6c  xclusive temp cl
4040: 6f 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61  osed}.do_test wa
4050: 6c 32 2d 36 2e 33 2e 36 20 7b 0a 20 20 65 78 65  l2-6.3.6 {.  exe
4060: 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a  csql { COMMIT }.
4070: 7d 20 7b 7d 0a 69 66 20 7b 5b 61 74 6f 6d 69 63  } {}.if {[atomic
4080: 5f 62 61 74 63 68 5f 77 72 69 74 65 20 74 65 73  _batch_write tes
4090: 74 2e 64 62 5d 3d 3d 30 7d 20 7b 0a 20 20 64 6f  t.db]==0} {.  do
40a0: 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 33 2e 36  _test wal2-6.3.6
40b0: 2e 31 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 66  .1 {.    list [f
40c0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
40d0: 64 62 2d 77 61 6c 5d 20 5b 66 69 6c 65 20 65 78  db-wal] [file ex
40e0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
40f0: 72 6e 61 6c 5d 0a 20 20 7d 20 7b 30 20 31 7d 0a  rnal].  } {0 1}.
4100: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  }.do_test wal2-6
4110: 2e 33 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.7 {.  execsql
4120: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73   { PRAGMA lock_s
4130: 74 61 74 75 73 20 7d 0a 7d 20 7b 6d 61 69 6e 20  tatus }.} {main 
4140: 65 78 63 6c 75 73 69 76 65 20 74 65 6d 70 20 63  exclusive temp c
4150: 6c 6f 73 65 64 7d 0a 64 62 20 63 6c 6f 73 65 0a  losed}.db close.
4160: 0a 0a 23 20 54 68 69 73 20 74 65 73 74 20 2d 20  ..# This test - 
4170: 77 61 6c 32 2d 36 2e 34 2e 2a 20 2d 20 75 73 65  wal2-6.4.* - use
4180: 73 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  s a single datab
4190: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ase connection a
41a0: 6e 64 20 74 68 65 0a 23 20 5b 74 65 73 74 76 66  nd the.# [testvf
41b0: 73 5d 20 69 6e 73 74 72 75 6d 65 6e 74 61 74 69  s] instrumentati
41c0: 6f 6e 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  on to test that 
41d0: 78 53 68 6d 4c 6f 63 6b 28 29 20 69 73 20 62 65  xShmLock() is be
41e0: 69 6e 67 20 63 61 6c 6c 65 64 0a 23 20 61 73 20  ing called.# as 
41f0: 65 78 70 65 63 74 65 64 20 77 68 65 6e 20 61 20  expected when a 
4200: 57 41 4c 20 64 61 74 61 62 61 73 65 20 69 73 20  WAL database is 
4210: 75 73 65 64 20 77 69 74 68 20 6c 6f 63 6b 69 6e  used with lockin
4220: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
4230: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32  ..#.do_test wal2
4240: 2d 36 2e 34 2e 31 20 7b 0a 20 20 66 6f 72 63 65  -6.4.1 {.  force
4250: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74  delete test.db t
4260: 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e  est.db-wal test.
4270: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 70 72 6f  db-journal.  pro
4280: 63 20 74 76 66 73 5f 63 62 20 7b 6d 65 74 68 6f  c tvfs_cb {metho
4290: 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65  d args} {.    se
42a0: 74 20 3a 3a 73 68 6d 5f 66 69 6c 65 20 5b 6c 69  t ::shm_file [li
42b0: 6e 64 65 78 20 24 61 72 67 73 20 30 5d 0a 20 20  ndex $args 0].  
42c0: 20 20 69 66 20 7b 24 6d 65 74 68 6f 64 20 3d 3d    if {$method ==
42d0: 20 22 78 53 68 6d 4c 6f 63 6b 22 7d 20 7b 20 6c   "xShmLock"} { l
42e0: 61 70 70 65 6e 64 20 3a 3a 6c 6f 63 6b 73 20 5b  append ::locks [
42f0: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 32 5d 20  lindex $args 2] 
4300: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 22 53 51  }.    return "SQ
4310: 4c 49 54 45 5f 4f 4b 22 0a 20 20 7d 0a 20 20 74  LITE_OK".  }.  t
4320: 65 73 74 76 66 73 20 74 76 66 73 0a 20 20 74 76  estvfs tvfs.  tv
4330: 66 73 20 73 63 72 69 70 74 20 74 76 66 73 5f 63  fs script tvfs_c
4340: 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  b.  sqlite3 db t
4350: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 66 73  est.db -vfs tvfs
4360: 0a 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 7d 20 7b  .  set {} {}.} {
4370: 7d 0a 0a 73 65 74 20 52 45 43 4f 56 45 52 59 20  }..set RECOVERY 
4380: 7b 0a 20 20 7b 30 20 31 20 6c 6f 63 6b 20 65 78  {.  {0 1 lock ex
4390: 63 6c 75 73 69 76 65 7d 20 7b 31 20 32 20 6c 6f  clusive} {1 2 lo
43a0: 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 7b 34  ck exclusive} {4
43b0: 20 34 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76   4 lock exclusiv
43c0: 65 7d 0a 20 20 7b 31 20 32 20 75 6e 6c 6f 63 6b  e}.  {1 2 unlock
43d0: 20 65 78 63 6c 75 73 69 76 65 7d 20 7b 34 20 34   exclusive} {4 4
43e0: 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76   unlock exclusiv
43f0: 65 7d 20 7b 30 20 31 20 75 6e 6c 6f 63 6b 20 65  e} {0 1 unlock e
4400: 78 63 6c 75 73 69 76 65 7d 0a 7d 0a 73 65 74 20  xclusive}.}.set 
4410: 52 45 41 44 4d 41 52 4b 30 5f 52 45 41 44 20 7b  READMARK0_READ {
4420: 0a 20 20 7b 33 20 31 20 6c 6f 63 6b 20 73 68 61  .  {3 1 lock sha
4430: 72 65 64 7d 20 7b 33 20 31 20 75 6e 6c 6f 63 6b  red} {3 1 unlock
4440: 20 73 68 61 72 65 64 7d 0a 7d 0a 73 65 74 20 52   shared}.}.set R
4450: 45 41 44 4d 41 52 4b 30 5f 57 52 49 54 45 20 7b  EADMARK0_WRITE {
4460: 0a 20 20 7b 33 20 31 20 6c 6f 63 6b 20 73 68 61  .  {3 1 lock sha
4470: 72 65 64 7d 20 0a 20 20 7b 30 20 31 20 6c 6f 63  red} .  {0 1 loc
4480: 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 7b 33 20  k exclusive} {3 
4490: 31 20 75 6e 6c 6f 63 6b 20 73 68 61 72 65 64 7d  1 unlock shared}
44a0: 20 0a 20 20 7b 34 20 31 20 6c 6f 63 6b 20 65 78   .  {4 1 lock ex
44b0: 63 6c 75 73 69 76 65 7d 20 7b 34 20 31 20 75 6e  clusive} {4 1 un
44c0: 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 20  lock exclusive} 
44d0: 7b 34 20 31 20 6c 6f 63 6b 20 73 68 61 72 65 64  {4 1 lock shared
44e0: 7d 20 0a 20 20 7b 30 20 31 20 75 6e 6c 6f 63 6b  } .  {0 1 unlock
44f0: 20 65 78 63 6c 75 73 69 76 65 7d 20 7b 34 20 31   exclusive} {4 1
4500: 20 75 6e 6c 6f 63 6b 20 73 68 61 72 65 64 7d 0a   unlock shared}.
4510: 7d 0a 73 65 74 20 52 45 41 44 4d 41 52 4b 31 5f  }.set READMARK1_
4520: 53 45 54 20 7b 0a 20 20 7b 34 20 31 20 6c 6f 63  SET {.  {4 1 loc
4530: 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 7b 34 20  k exclusive} {4 
4540: 31 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69  1 unlock exclusi
4550: 76 65 7d 0a 7d 0a 73 65 74 20 52 45 41 44 4d 41  ve}.}.set READMA
4560: 52 4b 31 5f 52 45 41 44 20 7b 0a 20 20 7b 34 20  RK1_READ {.  {4 
4570: 31 20 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 7b  1 lock shared} {
4580: 34 20 31 20 75 6e 6c 6f 63 6b 20 73 68 61 72 65  4 1 unlock share
4590: 64 7d 0a 7d 0a 73 65 74 20 52 45 41 44 4d 41 52  d}.}.set READMAR
45a0: 4b 31 5f 57 52 49 54 45 20 7b 0a 20 20 7b 34 20  K1_WRITE {.  {4 
45b0: 31 20 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 0a  1 lock shared} .
45c0: 20 20 20 20 7b 30 20 31 20 6c 6f 63 6b 20 65 78      {0 1 lock ex
45d0: 63 6c 75 73 69 76 65 7d 20 7b 30 20 31 20 75 6e  clusive} {0 1 un
45e0: 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 20  lock exclusive} 
45f0: 0a 20 20 7b 34 20 31 20 75 6e 6c 6f 63 6b 20 73  .  {4 1 unlock s
4600: 68 61 72 65 64 7d 0a 7d 0a 0a 66 6f 72 65 61 63  hared}.}..foreac
4610: 68 20 7b 74 6e 20 73 71 6c 20 72 65 73 20 65 78  h {tn sql res ex
4620: 70 65 63 74 65 64 5f 6c 6f 63 6b 73 7d 20 7b 0a  pected_locks} {.
4630: 20 20 32 20 7b 0a 20 20 20 20 50 52 41 47 4d 41    2 {.    PRAGMA
4640: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30   auto_vacuum = 0
4650: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
4660: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
4670: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
4680: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4690: 31 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  1(x);.      INSE
46a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
46b0: 53 28 27 4c 65 6f 6e 61 72 64 27 29 3b 0a 20 20  S('Leonard');.  
46c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
46d0: 74 31 20 56 41 4c 55 45 53 28 27 41 72 74 68 75  t1 VALUES('Arthu
46e0: 72 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  r');.    COMMIT;
46f0: 0a 20 20 7d 20 7b 77 61 6c 7d 20 7b 0a 20 20 20  .  } {wal} {.   
4700: 20 24 52 45 43 4f 56 45 52 59 20 0a 20 20 20 20   $RECOVERY .    
4710: 24 52 45 41 44 4d 41 52 4b 30 5f 57 52 49 54 45  $READMARK0_WRITE
4720: 0a 20 20 7d 0a 0a 20 20 33 20 7b 0a 20 20 20 20  .  }..  3 {.    
4730: 23 20 54 68 69 73 20 74 65 73 74 20 73 68 6f 75  # This test shou
4740: 6c 64 20 64 6f 20 74 68 65 20 52 45 41 44 4d 41  ld do the READMA
4750: 52 4b 31 5f 53 45 54 20 6c 6f 63 6b 69 6e 67 20  RK1_SET locking 
4760: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
4770: 0a 20 20 20 20 23 20 61 52 65 61 64 4d 61 72 6b  .    # aReadMark
4780: 5b 31 5d 20 73 6c 6f 74 20 77 69 74 68 20 74 68  [1] slot with th
4790: 65 20 63 75 72 72 65 6e 74 20 6d 78 46 72 61 6d  e current mxFram
47a0: 65 20 76 61 6c 75 65 2e 20 46 6f 6c 6c 6f 77 65  e value. Followe
47b0: 64 20 62 79 0a 20 20 20 20 23 20 52 45 41 44 4d  d by.    # READM
47c0: 41 52 4b 31 5f 52 45 41 44 20 74 6f 20 72 65 61  ARK1_READ to rea
47d0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  d the database..
47e0: 20 20 20 20 23 0a 20 20 20 20 53 45 4c 45 43 54      #.    SELECT
47f0: 20 2a 20 46 52 4f 4d 20 74 31 0a 20 20 7d 20 7b   * FROM t1.  } {
4800: 4c 65 6f 6e 61 72 64 20 41 72 74 68 75 72 7d 20  Leonard Arthur} 
4810: 7b 0a 20 20 20 20 24 52 45 41 44 4d 41 52 4b 31  {.    $READMARK1
4820: 5f 53 45 54 0a 20 20 20 20 24 52 45 41 44 4d 41  _SET.    $READMA
4830: 52 4b 31 5f 52 45 41 44 0a 20 20 7d 0a 0a 20 20  RK1_READ.  }..  
4840: 34 20 7b 0a 20 20 20 20 23 20 61 52 65 61 64 4d  4 {.    # aReadM
4850: 61 72 6b 5b 31 5d 20 69 73 20 61 6c 72 65 61 64  ark[1] is alread
4860: 79 20 73 65 74 20 74 6f 20 6d 78 46 72 61 6d 65  y set to mxFrame
4870: 2e 20 53 6f 20 6a 75 73 74 20 52 45 41 44 4d 41  . So just READMA
4880: 52 4b 31 5f 52 45 41 44 0a 20 20 20 20 23 20 74  RK1_READ.    # t
4890: 68 69 73 20 74 69 6d 65 2c 20 6e 6f 74 20 52 45  his time, not RE
48a0: 41 44 4d 41 52 4b 31 5f 53 45 54 2e 0a 20 20 20  ADMARK1_SET..   
48b0: 20 23 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   #.    SELECT * 
48c0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
48d0: 20 78 0a 20 20 7d 20 7b 41 72 74 68 75 72 20 4c   x.  } {Arthur L
48e0: 65 6f 6e 61 72 64 7d 20 7b 20 0a 20 20 20 20 24  eonard} { .    $
48f0: 52 45 41 44 4d 41 52 4b 31 5f 52 45 41 44 20 0a  READMARK1_READ .
4900: 20 20 7d 0a 0a 20 20 35 20 7b 0a 20 20 20 20 50    }..  5 {.    P
4910: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
4920: 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 0a 20  de = exclusive. 
4930: 20 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 20 7b   } {exclusive} {
4940: 20 7d 20 0a 0a 20 20 36 20 7b 0a 20 20 20 20 49   } ..  6 {.    I
4950: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4960: 4c 55 45 53 28 27 4a 75 6c 69 75 73 20 48 65 6e  LUES('Julius Hen
4970: 72 79 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  ry');.    SELECT
4980: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20   * FROM t1;.  } 
4990: 7b 4c 65 6f 6e 61 72 64 20 41 72 74 68 75 72 20  {Leonard Arthur 
49a0: 7b 4a 75 6c 69 75 73 20 48 65 6e 72 79 7d 7d 20  {Julius Henry}} 
49b0: 7b 0a 20 20 20 20 24 52 45 41 44 4d 41 52 4b 31  {.    $READMARK1
49c0: 5f 52 45 41 44 0a 20 20 7d 0a 0a 20 20 37 20 7b  _READ.  }..  7 {
49d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
49e0: 20 74 31 20 56 41 4c 55 45 53 28 27 4b 61 72 6c   t1 VALUES('Karl
49f0: 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  ');.    SELECT *
4a00: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 7b 4c   FROM t1;.  } {L
4a10: 65 6f 6e 61 72 64 20 41 72 74 68 75 72 20 7b 4a  eonard Arthur {J
4a20: 75 6c 69 75 73 20 48 65 6e 72 79 7d 20 4b 61 72  ulius Henry} Kar
4a30: 6c 7d 20 7b 20 7d 0a 0a 20 20 38 20 7b 0a 20 20  l} { }..  8 {.  
4a40: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
4a50: 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 0a 20  _mode = normal. 
4a60: 20 7d 20 7b 6e 6f 72 6d 61 6c 7d 20 7b 20 7d 0a   } {normal} { }.
4a70: 0a 20 20 39 20 7b 0a 20 20 20 20 53 45 4c 45 43  .  9 {.    SELEC
4a80: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  T * FROM t1 ORDE
4a90: 52 20 42 59 20 78 0a 20 20 7d 20 7b 41 72 74 68  R BY x.  } {Arth
4aa0: 75 72 20 7b 4a 75 6c 69 75 73 20 48 65 6e 72 79  ur {Julius Henry
4ab0: 7d 20 4b 61 72 6c 20 4c 65 6f 6e 61 72 64 7d 20  } Karl Leonard} 
4ac0: 24 52 45 41 44 4d 41 52 4b 31 5f 52 45 41 44 0a  $READMARK1_READ.
4ad0: 0a 20 20 31 30 20 7b 20 44 45 4c 45 54 45 20 46  .  10 { DELETE F
4ae0: 52 4f 4d 20 74 31 20 7d 20 7b 7d 20 24 52 45 41  ROM t1 } {} $REA
4af0: 44 4d 41 52 4b 31 5f 57 52 49 54 45 0a 0a 20 20  DMARK1_WRITE..  
4b00: 31 31 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  11 {.    SELECT 
4b10: 2a 20 46 52 4f 4d 20 74 31 0a 20 20 7d 20 7b 7d  * FROM t1.  } {}
4b20: 20 7b 0a 20 20 20 20 24 52 45 41 44 4d 41 52 4b   {.    $READMARK
4b30: 31 5f 53 45 54 0a 20 20 20 20 24 52 45 41 44 4d  1_SET.    $READM
4b40: 41 52 4b 31 5f 52 45 41 44 0a 20 20 7d 0a 7d 20  ARK1_READ.  }.} 
4b50: 7b 0a 0a 20 20 73 65 74 20 4c 20 5b 6c 69 73 74  {..  set L [list
4b60: 5d 0a 20 20 66 6f 72 65 61 63 68 20 65 6c 20 5b  ].  foreach el [
4b70: 73 75 62 73 74 20 24 65 78 70 65 63 74 65 64 5f  subst $expected_
4b80: 6c 6f 63 6b 73 5d 20 7b 20 6c 61 70 70 65 6e 64  locks] { lappend
4b90: 20 4c 20 24 65 6c 20 7d 0a 0a 20 20 73 65 74 20   L $el }..  set 
4ba0: 53 20 22 22 0a 20 20 66 6f 72 65 61 63 68 20 73  S "".  foreach s
4bb0: 71 20 5b 73 70 6c 69 74 20 24 73 71 6c 20 22 5c  q [split $sql "\
4bc0: 6e 22 5d 20 7b 20 0a 20 20 20 20 73 65 74 20 73  n"] { .    set s
4bd0: 71 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  q [string trim $
4be0: 73 71 5d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72  sq].    if {[str
4bf0: 69 6e 67 20 6d 61 74 63 68 20 7b 23 2a 7d 20 24  ing match {#*} $
4c00: 73 71 5d 3d 3d 30 7d 20 7b 61 70 70 65 6e 64 20  sq]==0} {append 
4c10: 53 20 22 24 73 71 5c 6e 22 7d 0a 20 20 7d 0a 0a  S "$sq\n"}.  }..
4c20: 20 20 73 65 74 20 3a 3a 6c 6f 63 6b 73 20 5b 6c    set ::locks [l
4c30: 69 73 74 5d 0a 20 20 64 6f 5f 74 65 73 74 20 77  ist].  do_test w
4c40: 61 6c 32 2d 36 2e 34 2e 24 74 6e 2e 31 20 7b 20  al2-6.4.$tn.1 { 
4c50: 65 78 65 63 73 71 6c 20 24 53 20 7d 20 24 72 65  execsql $S } $re
4c60: 73 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32  s.  do_test wal2
4c70: 2d 36 2e 34 2e 24 74 6e 2e 32 20 7b 20 73 65 74  -6.4.$tn.2 { set
4c80: 20 3a 3a 6c 6f 63 6b 73 20 20 7d 20 24 4c 0a 7d   ::locks  } $L.}
4c90: 0a 69 66 63 61 70 61 62 6c 65 20 65 6e 61 62 6c  .ifcapable enabl
4ca0: 65 5f 70 65 72 73 69 73 74 5f 77 61 6c 20 7b 0a  e_persist_wal {.
4cb0: 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70    file_control_p
4cc0: 65 72 73 69 73 74 5f 77 61 6c 20 64 62 20 30 0a  ersist_wal db 0.
4cd0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 66 73 20  }.db close.tvfs 
4ce0: 64 65 6c 65 74 65 0a 0a 64 6f 5f 74 65 73 74 20  delete..do_test 
4cf0: 77 61 6c 32 2d 36 2e 35 2e 31 20 7b 0a 20 20 73  wal2-6.5.1 {.  s
4d00: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
4d10: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
4d20: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
4d30: 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52  cuum = 0;.    PR
4d40: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
4d50: 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 50 52 41  e = wal;.    PRA
4d60: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4d70: 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20   = exclusive;.  
4d80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4d90: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41  2(a, b);.    PRA
4da0: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
4db0: 6e 74 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  nt;.    INSERT I
4dc0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 49  NTO t2 VALUES('I
4dd0: 27 2c 20 27 49 49 27 29 3b 0a 20 20 20 20 50 52  ', 'II');.    PR
4de0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
4df0: 65 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 20 65 78  e;.  }.} {wal ex
4e00: 63 6c 75 73 69 76 65 20 30 20 32 20 32 20 77 61  clusive 0 2 2 wa
4e10: 6c 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  l}.do_test wal2-
4e20: 36 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  6.5.2 {.  execsq
4e30: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c  l {.    PRAGMA l
4e40: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f  ocking_mode = no
4e50: 72 6d 61 6c 3b 0a 20 20 20 20 49 4e 53 45 52 54  rmal;.    INSERT
4e60: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
4e70: 27 49 49 49 27 2c 20 27 49 56 27 29 3b 0a 20 20  'III', 'IV');.  
4e80: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
4e90: 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76  _mode = exclusiv
4ea0: 65 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  e;.    SELECT * 
4eb0: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
4ec0: 6e 6f 72 6d 61 6c 20 65 78 63 6c 75 73 69 76 65  normal exclusive
4ed0: 20 49 20 49 49 20 49 49 49 20 49 56 7d 0a 64 6f   I II III IV}.do
4ee0: 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 35 2e 33  _test wal2-6.5.3
4ef0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
4f00: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
4f10: 6f 69 6e 74 20 7d 0a 7d 20 7b 30 20 32 20 32 7d  oint }.} {0 2 2}
4f20: 0a 64 62 20 63 6c 6f 73 65 0a 0a 70 72 6f 63 20  .db close..proc 
4f30: 6c 6f 63 6b 5f 63 6f 6e 74 72 6f 6c 20 7b 6d 65  lock_control {me
4f40: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 68 61  thod filename ha
4f50: 6e 64 6c 65 20 73 70 65 63 7d 20 7b 0a 20 20 66  ndle spec} {.  f
4f60: 6f 72 65 61 63 68 20 7b 73 74 61 72 74 20 6e 20  oreach {start n 
4f70: 6f 70 20 74 79 70 65 7d 20 24 73 70 65 63 20 62  op type} $spec b
4f80: 72 65 61 6b 0a 20 20 69 66 20 7b 24 6f 70 20 3d  reak.  if {$op =
4f90: 3d 20 22 6c 6f 63 6b 22 7d 20 7b 20 72 65 74 75  = "lock"} { retu
4fa0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
4fb0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
4fc0: 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20 77  E_OK.}.do_test w
4fd0: 61 6c 32 2d 36 2e 36 2e 31 20 7b 0a 20 20 74 65  al2-6.6.1 {.  te
4fe0: 73 74 76 66 73 20 54 0a 20 20 54 20 73 63 72 69  stvfs T.  T scri
4ff0: 70 74 20 6c 6f 63 6b 5f 63 6f 6e 74 72 6f 6c 0a  pt lock_control.
5000: 20 20 54 20 66 69 6c 74 65 72 20 7b 7d 0a 20 20    T filter {}.  
5010: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
5020: 64 62 20 2d 76 66 73 20 54 0a 20 20 65 78 65 63  db -vfs T.  exec
5030: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
5040: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
5050: 72 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  r }.  execsql { 
5060: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
5070: 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 20  ode = exclusive 
5080: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  }.  execsql { IN
5090: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
50a0: 55 45 53 28 27 56 27 2c 20 27 56 49 27 29 20 7d  UES('V', 'VI') }
50b0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  .} {}.do_test wa
50c0: 6c 32 2d 36 2e 36 2e 32 20 7b 0a 20 20 65 78 65  l2-6.6.2 {.  exe
50d0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c 6f  csql { PRAGMA lo
50e0: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72  cking_mode = nor
50f0: 6d 61 6c 20 7d 0a 20 20 54 20 66 69 6c 74 65 72  mal }.  T filter
5100: 20 78 53 68 6d 4c 6f 63 6b 0a 20 20 65 78 65 63   xShmLock.  exec
5110: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
5120: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 56 49 49  O t2 VALUES('VII
5130: 27 2c 20 27 56 49 49 49 27 29 20 7d 0a 7d 20 7b  ', 'VIII') }.} {
5140: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  }.do_test wal2-6
5150: 2e 36 2e 33 20 7b 0a 20 20 23 20 41 74 20 74 68  .6.3 {.  # At th
5160: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 6e  is point the con
5170: 6e 65 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 73  nection should s
5180: 74 69 6c 6c 20 62 65 20 69 6e 20 65 78 63 6c 75  till be in exclu
5190: 73 69 76 65 2d 6d 6f 64 65 2c 20 65 76 65 6e 0a  sive-mode, even.
51a0: 20 20 23 20 74 68 6f 75 67 68 20 69 74 20 74 72    # though it tr
51b0: 69 65 64 20 74 6f 20 65 78 69 74 20 65 78 63 6c  ied to exit excl
51c0: 75 73 69 76 65 2d 6d 6f 64 65 20 77 68 65 6e 20  usive-mode when 
51d0: 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 49  committing the I
51e0: 4e 53 45 52 54 0a 20 20 23 20 73 74 61 74 65 6d  NSERT.  # statem
51f0: 65 6e 74 20 61 62 6f 76 65 2e 20 54 6f 20 65 78  ent above. To ex
5200: 69 74 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  it exclusive mod
5210: 65 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f  e, SQLite has to
5220: 20 74 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f 63   take a read-loc
5230: 6b 20 0a 20 20 23 20 6f 6e 20 74 68 65 20 57 41  k .  # on the WA
5240: 4c 20 66 69 6c 65 20 75 73 69 6e 67 20 78 53 68  L file using xSh
5250: 6d 4c 6f 63 6b 28 29 2e 20 53 69 6e 63 65 20 74  mLock(). Since t
5260: 68 61 74 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c  hat call failed,
5270: 20 69 74 20 72 65 6d 61 69 6e 73 0a 20 20 23 20   it remains.  # 
5280: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
5290: 65 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33  e..  #.  sqlite3
52a0: 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76 66   db2 test.db -vf
52b0: 73 20 54 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  s T.  catchsql {
52c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
52d0: 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61  2 } db2.} {1 {da
52e0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
52f0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  }}.do_test wal2-
5300: 36 2e 36 2e 32 20 7b 0a 20 20 64 62 32 20 63 6c  6.6.2 {.  db2 cl
5310: 6f 73 65 0a 20 20 54 20 66 69 6c 74 65 72 20 7b  ose.  T filter {
5320: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  }.  execsql { IN
5330: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
5340: 55 45 53 28 27 49 58 27 2c 20 27 58 27 29 20 7d  UES('IX', 'X') }
5350: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  .} {}.do_test wa
5360: 6c 32 2d 36 2e 36 2e 34 20 7b 0a 20 20 23 20 54  l2-6.6.4 {.  # T
5370: 68 69 73 20 74 69 6d 65 2c 20 77 65 20 68 61 76  his time, we hav
5380: 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65  e successfully e
5390: 78 69 74 65 64 20 65 78 63 6c 75 73 69 76 65 20  xited exclusive 
53a0: 6d 6f 64 65 2e 20 53 6f 20 74 68 65 20 73 65 63  mode. So the sec
53b0: 6f 6e 64 0a 20 20 23 20 63 6f 6e 6e 65 63 74 69  ond.  # connecti
53c0: 6f 6e 20 63 61 6e 20 72 65 61 64 20 74 68 65 20  on can read the 
53d0: 64 61 74 61 62 61 73 65 2e 0a 20 20 73 71 6c 69  database..  sqli
53e0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20  te3 db2 test.db 
53f0: 2d 76 66 73 20 54 0a 20 20 63 61 74 63 68 73 71  -vfs T.  catchsq
5400: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
5410: 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 30 20  M t2 } db2.} {0 
5420: 7b 49 20 49 49 20 49 49 49 20 49 56 20 56 20 56  {I II III IV V V
5430: 49 20 56 49 49 20 56 49 49 49 20 49 58 20 58 7d  I VII VIII IX X}
5440: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20  }..db close.db2 
5450: 63 6c 6f 73 65 0a 54 20 64 65 6c 65 74 65 0a 0a  close.T delete..
5460: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
54b0: 74 20 61 20 74 68 65 6f 72 79 20 61 62 6f 75 74  t a theory about
54c0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6c   the checksum al
54d0: 67 6f 72 69 74 68 6d 2e 20 54 68 65 6f 72 79 20  gorithm. Theory 
54e0: 77 61 73 20 66 61 6c 73 65 20 61 6e 64 20 74 68  was false and th
54f0: 69 73 0a 23 20 74 65 73 74 20 64 69 64 20 6e 6f  is.# test did no
5500: 74 20 70 72 6f 76 6f 6b 65 20 61 20 62 75 67 2e  t provoke a bug.
5510: 0a 23 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .#.forcedelete t
5520: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
5530: 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  al test.db-journ
5540: 61 6c 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  al.do_test wal2-
5550: 37 2e 31 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  7.1.1 {.  sqlite
5560: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
5570: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
5580: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
5590: 34 30 39 36 3b 0a 20 20 20 20 50 52 41 47 4d 41  4096;.    PRAGMA
55a0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
55b0: 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  WAL;.    CREATE 
55c0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
55d0: 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20    }.  file size 
55e0: 74 65 73 74 2e 64 62 0a 7d 20 7b 34 30 39 36 7d  test.db.} {4096}
55f0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 37 2e  .do_test wal2-7.
5600: 31 2e 32 20 7b 0a 20 20 66 6f 72 63 65 63 6f 70  1.2 {.  forcecop
5610: 79 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e  y test.db test2.
5620: 64 62 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74  db.  forcecopy t
5630: 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32  est.db-wal test2
5640: 2e 64 62 2d 77 61 6c 0a 20 20 23 20 54 68 65 20  .db-wal.  # The 
5650: 66 69 72 73 74 20 33 32 20 62 79 74 65 73 20 6f  first 32 bytes o
5660: 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 63  f the WAL file c
5670: 6f 6e 74 61 69 6e 20 74 68 65 20 57 41 4c 20 68  ontain the WAL h
5680: 65 61 64 65 72 2e 20 4f 66 66 73 65 74 20 34 38  eader. Offset 48
5690: 0a 20 20 23 20 69 73 20 74 68 65 20 66 69 72 73  .  # is the firs
56a0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 68  t byte of the ch
56b0: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 66  ecksum for the f
56c0: 69 72 73 74 20 66 72 61 6d 65 20 69 6e 20 74 68  irst frame in th
56d0: 65 20 57 41 4c 2e 20 0a 20 20 23 20 54 68 65 20  e WAL. .  # The 
56e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
56f0: 6c 69 6e 65 73 20 72 65 70 6c 61 63 65 73 20 74  lines replaces t
5700: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
5710: 68 61 74 20 62 79 74 65 20 77 69 74 68 20 0a 20  hat byte with . 
5720: 20 23 20 61 20 64 69 66 66 65 72 65 6e 74 20 76   # a different v
5730: 61 6c 75 65 2e 0a 20 20 73 65 74 20 6e 65 77 76  alue..  set newv
5740: 61 6c 20 46 46 0a 20 20 69 66 20 7b 24 6e 65 77  al FF.  if {$new
5750: 76 61 6c 20 3d 3d 20 5b 68 65 78 69 6f 5f 72 65  val == [hexio_re
5760: 61 64 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 20  ad test2.db-wal 
5770: 34 38 20 31 5d 7d 20 7b 20 73 65 74 20 6e 65 77  48 1]} { set new
5780: 76 61 6c 20 30 30 20 7d 0a 20 20 68 65 78 69 6f  val 00 }.  hexio
5790: 5f 77 72 69 74 65 20 74 65 73 74 32 2e 64 62 2d  _write test2.db-
57a0: 77 61 6c 20 34 38 20 24 6e 65 77 76 61 6c 0a 7d  wal 48 $newval.}
57b0: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   {1}.do_test wal
57c0: 32 2d 37 2e 31 2e 33 20 7b 0a 20 20 73 71 6c 69  2-7.1.3 {.  sqli
57d0: 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64 62  te3 db2 test2.db
57e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
57f0: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
5800: 6e 74 20 7d 20 64 62 32 0a 20 20 65 78 65 63 73  nt } db2.  execs
5810: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
5820: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
5830: 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 62 20 63   } db2.} {}.db c
5840: 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 66  lose.db2 close.f
5850: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
5860: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74  db test.db-wal t
5870: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 64  est.db-journal.d
5880: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 38 2e 31 2e  o_test wal2-8.1.
5890: 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  2 {.  sqlite3 db
58a0: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
58b0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
58c0: 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b  auto_vacuum=OFF;
58d0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
58e0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
58f0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
5900: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
5910: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
5920: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (x);.    INSERT 
5930: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 7a  INTO t1 VALUES(z
5940: 65 72 6f 62 6c 6f 62 28 38 31 38 38 2a 31 30 32  eroblob(8188*102
5950: 30 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  0));.    CREATE 
5960: 54 41 42 4c 45 20 74 32 28 79 29 3b 0a 20 20 20  TABLE t2(y);.   
5970: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
5980: 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20 20 65 78  kpoint;.  }.  ex
5990: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
59a0: 43 54 20 72 6f 6f 74 70 61 67 65 3e 3d 38 31 39  CT rootpage>=819
59b0: 32 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  2 FROM sqlite_ma
59c0: 73 74 65 72 20 57 48 45 52 45 20 74 62 6c 5f 6e  ster WHERE tbl_n
59d0: 61 6d 65 20 3d 20 27 74 32 27 3b 0a 20 20 7d 0a  ame = 't2';.  }.
59e0: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61  } {1}.do_test wa
59f0: 6c 32 2d 38 2e 31 2e 33 20 7b 0a 20 20 65 78 65  l2-8.1.3 {.  exe
5a00: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
5a10: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
5a20: 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  0;.    CREATE TA
5a30: 42 4c 45 20 74 33 28 7a 29 3b 0a 20 20 20 20 42  BLE t3(z);.    B
5a40: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
5a50: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
5a60: 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  S(randomblob(900
5a70: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
5a80: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
5a90: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
5aa0: 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 49  FROM t3;.      I
5ab0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
5ac0: 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29 3b 0a 20  LUES('hello');. 
5ad0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5ae0: 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t3 SELECT rando
5af0: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
5b00: 74 33 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t3;.      INSERT
5b10: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
5b20: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
5b30: 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 49  FROM t3;.      I
5b40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
5b50: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
5b60: 39 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20  900) FROM t3;.  
5b70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5b80: 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t3 SELECT random
5b90: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
5ba0: 33 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  3;.      INSERT 
5bb0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72  INTO t3 SELECT r
5bc0: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
5bd0: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 49 4e  ROM t3;.      IN
5be0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
5bf0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
5c00: 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20  00) FROM t3;.   
5c10: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20   ROLLBACK;.  }. 
5c20: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
5c30: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
5c40: 4c 55 45 53 28 27 67 6f 6f 64 62 79 65 27 29 3b  LUES('goodbye');
5c50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5c60: 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t3 SELECT rando
5c70: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
5c80: 74 33 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t3;.    INSERT I
5c90: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61  NTO t3 SELECT ra
5ca0: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
5cb0: 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM t3;.  }.} {}.
5cc0: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 38 2e 31  do_test wal2-8.1
5cd0: 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .4 {.  sqlite3 d
5ce0: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  b2 test.db.  exe
5cf0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
5d00: 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 67 6f 6f  FROM t2 }.} {goo
5d10: 64 62 79 65 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  dbye}.db2 close.
5d20: 64 62 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d  db close..#-----
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
5d80: 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 68 65   even if the che
5d90: 63 6b 73 75 6d 73 20 66 6f 72 20 62 6f 74 68 20  cksums for both 
5da0: 61 72 65 20 76 61 6c 69 64 2c 20 69 66 20 74 68  are valid, if th
5db0: 65 20 74 77 6f 20 63 6f 70 69 65 73 0a 23 20 6f  e two copies.# o
5dc0: 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
5dd0: 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 77 61  header in the wa
5de0: 6c 2d 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6d  l-index do not m
5df0: 61 74 63 68 2c 20 74 68 65 20 63 6c 69 65 6e 74  atch, the client
5e00: 0a 23 20 72 75 6e 73 20 28 6f 72 20 61 74 20 6c  .# runs (or at l
5e10: 65 61 73 74 20 74 72 69 65 73 20 74 6f 20 72 75  east tries to ru
5e20: 6e 29 20 64 61 74 61 62 61 73 65 20 72 65 63 6f  n) database reco
5e30: 76 65 72 79 2e 0a 23 20 0a 23 0a 70 72 6f 63 20  very..# .#.proc 
5e40: 67 65 74 5f 6e 61 6d 65 20 7b 6d 65 74 68 6f 64  get_name {method
5e50: 20 61 72 67 73 7d 20 7b 20 73 65 74 20 3a 3a 66   args} { set ::f
5e60: 69 6c 65 6e 61 6d 65 20 5b 6c 69 6e 64 65 78 20  ilename [lindex 
5e70: 24 61 72 67 73 20 30 5d 20 3b 20 74 76 66 73 20  $args 0] ; tvfs 
5e80: 66 69 6c 74 65 72 20 7b 7d 20 7d 0a 74 65 73 74  filter {} }.test
5e90: 76 66 73 20 74 76 66 73 0a 74 76 66 73 20 73 63  vfs tvfs.tvfs sc
5ea0: 72 69 70 74 20 67 65 74 5f 6e 61 6d 65 0a 74 76  ript get_name.tv
5eb0: 66 73 20 66 69 6c 74 65 72 20 78 53 68 6d 4f 70  fs filter xShmOp
5ec0: 65 6e 0a 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  en..forcedelete 
5ed0: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
5ee0: 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  wal test.db-jour
5ef0: 6e 61 6c 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32  nal.do_test wal2
5f00: 2d 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  -9.1 {.  sqlite3
5f10: 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73   db test.db -vfs
5f20: 20 74 76 66 73 0a 20 20 65 78 65 63 73 71 6c 20   tvfs.  execsql 
5f30: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
5f40: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
5f50: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5f60: 45 20 78 28 79 29 3b 0a 20 20 20 20 49 4e 53 45  E x(y);.    INSE
5f70: 52 54 20 49 4e 54 4f 20 78 20 56 41 4c 55 45 53  RT INTO x VALUES
5f80: 28 27 42 61 72 74 6f 6e 27 29 3b 0a 20 20 20 20  ('Barton');.    
5f90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41  INSERT INTO x VA
5fa0: 4c 55 45 53 28 27 44 65 61 6b 69 6e 27 29 3b 0a  LUES('Deakin');.
5fb0: 20 20 7d 0a 0a 20 20 23 20 53 65 74 20 24 77 69    }..  # Set $wi
5fc0: 68 28 31 29 20 74 6f 20 74 68 65 20 63 6f 6e 74  h(1) to the cont
5fd0: 65 6e 74 73 20 6f 66 20 74 68 65 20 77 61 6c 2d  ents of the wal-
5fe0: 69 6e 64 65 78 20 68 65 61 64 65 72 20 61 66 74  index header aft
5ff0: 65 72 0a 20 20 23 20 74 68 65 20 66 72 61 6d 65  er.  # the frame
6000: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
6010: 68 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  h the first two 
6020: 72 6f 77 73 20 69 6e 20 74 61 62 6c 65 20 27 78  rows in table 'x
6030: 27 20 68 61 76 65 0a 20 20 23 20 62 65 65 6e 20  ' have.  # been 
6040: 69 6e 73 65 72 74 65 64 2e 20 54 68 65 6e 20 69  inserted. Then i
6050: 6e 73 65 72 74 20 6f 6e 65 20 6d 6f 72 65 20 72  nsert one more r
6060: 6f 77 20 61 6e 64 20 73 65 74 20 24 77 69 68 28  ow and set $wih(
6070: 32 29 0a 20 20 23 20 74 6f 20 74 68 65 20 6e 65  2).  # to the ne
6080: 77 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 77  w value of the w
6090: 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 2e  al-index header.
60a0: 0a 20 20 23 0a 20 20 23 20 49 66 20 74 68 65 20  .  #.  # If the 
60b0: 24 77 69 68 28 31 29 20 69 73 20 77 72 69 74 74  $wih(1) is writt
60c0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 77 61 6c 2d  en into the wal-
60d0: 69 6e 64 65 78 20 62 65 66 6f 72 65 20 72 75 6e  index before run
60e0: 6e 69 6e 67 0a 20 20 23 20 61 20 72 65 61 64 20  ning.  # a read 
60f0: 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 65 20 63  operation, the c
6100: 6c 69 65 6e 74 20 77 69 6c 6c 20 73 65 65 20 6f  lient will see o
6110: 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 74 77  nly the first tw
6120: 6f 20 72 6f 77 73 2e 20 49 66 0a 20 20 23 20 24  o rows. If.  # $
6130: 77 69 68 28 32 29 20 69 73 20 77 72 69 74 74 65  wih(2) is writte
6140: 6e 20 69 6e 74 6f 20 74 68 65 20 77 61 6c 2d 69  n into the wal-i
6150: 6e 64 65 78 2c 20 74 68 65 20 63 6c 69 65 6e 74  ndex, the client
6160: 20 77 69 6c 6c 20 73 65 65 0a 20 20 23 20 74 68   will see.  # th
6170: 72 65 65 20 72 6f 77 73 2e 20 49 66 20 61 6e 20  ree rows. If an 
6180: 69 6e 76 61 6c 69 64 20 68 65 61 64 65 72 20 69  invalid header i
6190: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
61a0: 68 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 74 68  he wal-index, th
61b0: 65 6e 0a 20 20 23 20 74 68 65 20 63 6c 69 65 6e  en.  # the clien
61c0: 74 20 77 69 6c 6c 20 72 75 6e 20 72 65 63 6f 76  t will run recov
61d0: 65 72 79 20 61 6e 64 20 73 65 65 20 74 68 72 65  ery and see thre
61e0: 65 20 72 6f 77 73 2e 0a 20 20 23 0a 20 20 73 65  e rows..  #.  se
61f0: 74 20 77 69 68 28 31 29 20 5b 73 65 74 5f 74 76  t wih(1) [set_tv
6200: 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e 61  fs_hdr $::filena
6210: 6d 65 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  me].  execsql { 
6220: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41  INSERT INTO x VA
6230: 4c 55 45 53 28 27 57 61 74 73 6f 6e 27 29 20 7d  LUES('Watson') }
6240: 0a 20 20 73 65 74 20 77 69 68 28 32 29 20 5b 73  .  set wih(2) [s
6250: 65 74 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a 66  et_tvfs_hdr $::f
6260: 69 6c 65 6e 61 6d 65 5d 0a 0a 20 20 73 71 6c 69  ilename]..  sqli
6270: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20  te3 db2 test.db 
6280: 2d 76 66 73 20 74 76 66 73 0a 20 20 65 78 65 63  -vfs tvfs.  exec
6290: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
62a0: 52 4f 4d 20 78 20 7d 20 64 62 32 0a 7d 20 7b 42  ROM x } db2.} {B
62b0: 61 72 74 6f 6e 20 44 65 61 6b 69 6e 20 57 61 74  arton Deakin Wat
62c0: 73 6f 6e 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  son}..foreach {t
62d0: 6e 20 68 64 72 31 20 68 64 72 32 20 72 65 73 7d  n hdr1 hdr2 res}
62e0: 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20   [list          
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 20 5c 0a 20 20 33 20 20 24 77 69 68 28 31 29    \.  3  $wih(1)
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6330: 24 77 69 68 28 31 29 20 20 20 20 20 20 20 20 20  $wih(1)         
6340: 20 20 20 20 20 20 20 7b 42 61 72 74 6f 6e 20 44         {Barton D
6350: 65 61 6b 69 6e 7d 20 20 20 20 20 20 20 20 20 20  eakin}          
6360: 5c 0a 20 20 34 20 20 24 77 69 68 28 31 29 20 20  \.  4  $wih(1)  
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 77                $w
6380: 69 68 28 32 29 20 20 20 20 20 20 20 20 20 20 20  ih(2)           
6390: 20 20 20 20 20 7b 42 61 72 74 6f 6e 20 44 65 61       {Barton Dea
63a0: 6b 69 6e 20 57 61 74 73 6f 6e 7d 20 20 20 5c 0a  kin Watson}   \.
63b0: 20 20 35 20 20 24 77 69 68 28 32 29 20 20 20 20    5  $wih(2)    
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 24 77 69 68              $wih
63d0: 28 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (1)             
63e0: 20 20 20 7b 42 61 72 74 6f 6e 20 44 65 61 6b 69     {Barton Deaki
63f0: 6e 20 57 61 74 73 6f 6e 7d 20 20 20 5c 0a 20 20  n Watson}   \.  
6400: 36 20 20 24 77 69 68 28 32 29 20 20 20 20 20 20  6  $wih(2)      
6410: 20 20 20 20 20 20 20 20 20 20 24 77 69 68 28 32            $wih(2
6420: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
6430: 20 7b 42 61 72 74 6f 6e 20 44 65 61 6b 69 6e 20   {Barton Deakin 
6440: 57 61 74 73 6f 6e 7d 20 20 20 5c 0a 20 20 37 20  Watson}   \.  7 
6450: 20 24 77 69 68 28 31 29 20 20 20 20 20 20 20 20   $wih(1)        
6460: 20 20 20 20 20 20 20 20 24 77 69 68 28 31 29 20          $wih(1) 
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
6480: 42 61 72 74 6f 6e 20 44 65 61 6b 69 6e 7d 20 20  Barton Deakin}  
6490: 20 20 20 20 20 20 20 20 5c 0a 20 20 38 20 20 7b          \.  8  {
64a0: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20  0 0 0 0 0 0 0 0 
64b0: 30 20 30 20 30 20 30 7d 20 7b 30 20 30 20 30 20  0 0 0 0} {0 0 0 
64c0: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20  0 0 0 0 0 0 0 0 
64d0: 30 7d 20 7b 42 61 72 74 6f 6e 20 44 65 61 6b 69  0} {Barton Deaki
64e0: 6e 20 57 61 74 73 6f 6e 7d 0a 5d 20 7b 0a 20 20  n Watson}.] {.  
64f0: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 39 2e 24  do_test wal2-9.$
6500: 74 6e 20 7b 0a 20 20 20 20 73 65 74 5f 74 76 66  tn {.    set_tvf
6510: 73 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e 61 6d  s_hdr $::filenam
6520: 65 20 24 68 64 72 31 20 24 68 64 72 32 0a 20 20  e $hdr1 $hdr2.  
6530: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
6540: 43 54 20 2a 20 46 52 4f 4d 20 78 20 7d 20 64 62  CT * FROM x } db
6550: 32 0a 20 20 7d 20 24 72 65 73 0a 7d 0a 0a 64 62  2.  } $res.}..db
6560: 32 20 63 6c 6f 73 65 0a 64 62 20 63 6c 6f 73 65  2 close.db close
6570: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
65c0: 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  his block of tes
65d0: 74 73 20 2d 20 77 61 6c 32 2d 31 30 2e 2a 20 2d  ts - wal2-10.* -
65e0: 20 66 6f 63 75 73 20 6f 6e 20 74 68 65 20 6c 69   focus on the li
65f0: 62 72 61 72 69 65 73 20 72 65 73 70 6f 6e 73 65  braries response
6600: 20 74 6f 0a 23 20 6e 65 77 20 76 65 72 73 69 6f   to.# new versio
6610: 6e 73 20 6f 66 20 74 68 65 20 77 61 6c 20 6f 72  ns of the wal or
6620: 20 77 61 6c 2d 69 6e 64 65 78 20 66 6f 72 6d 61   wal-index forma
6630: 74 73 2e 20 0a 23 0a 23 20 20 20 77 61 6c 32 2d  ts. .#.#   wal2-
6640: 31 30 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61  10.1.*: Test tha
6650: 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 72 65  t the library re
6660: 66 75 73 65 73 20 74 6f 20 22 72 65 63 6f 76 65  fuses to "recove
6670: 72 22 20 61 20 6e 65 77 20 57 41 4c 20 0a 23 20  r" a new WAL .# 
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
6690: 6f 72 6d 61 74 2e 0a 23 0a 23 20 20 20 77 61 6c  ormat..#.#   wal
66a0: 32 2d 31 30 2e 32 2e 2a 3a 20 54 65 73 74 20 74  2-10.2.*: Test t
66b0: 68 61 74 20 74 68 65 20 6c 69 62 72 61 72 79 20  hat the library 
66c0: 72 65 66 75 73 65 73 20 74 6f 20 72 65 61 64 20  refuses to read 
66d0: 6f 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62  or write a datab
66e0: 61 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ase.#           
66f0: 20 20 20 20 20 69 66 20 74 68 65 20 77 61 6c 2d       if the wal-
6700: 69 6e 64 65 78 20 76 65 72 73 69 6f 6e 20 69 73  index version is
6710: 20 6e 65 77 65 72 20 74 68 61 6e 20 69 74 20 75   newer than it u
6720: 6e 64 65 72 73 74 61 6e 64 73 2e 0a 23 0a 23 20  nderstands..#.# 
6730: 41 74 20 74 69 6d 65 20 6f 66 20 77 72 69 74 69  At time of writi
6740: 6e 67 2c 20 74 68 65 20 6f 6e 6c 79 20 76 65 72  ng, the only ver
6750: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 77 61 6c  sions of the wal
6760: 20 61 6e 64 20 77 61 6c 2d 69 6e 64 65 78 20 66   and wal-index f
6770: 6f 72 6d 61 74 73 0a 23 20 74 68 61 74 20 65 78  ormats.# that ex
6780: 69 73 74 20 61 72 65 20 76 65 72 73 69 6f 6e 73  ist are versions
6790: 20 33 30 30 37 30 30 30 20 28 63 6f 72 72 65 73   3007000 (corres
67a0: 70 6f 6e 64 69 6e 67 20 74 6f 20 53 51 4c 69 74  ponding to SQLit
67b0: 65 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2c  e version 3.7.0,
67c0: 0a 23 20 74 68 65 20 66 69 72 73 74 20 76 65 72  .# the first ver
67d0: 73 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 20 74  sion of SQLite t
67e0: 6f 20 66 65 61 74 75 72 65 20 77 61 6c 20 6d 6f  o feature wal mo
67f0: 64 65 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77  de)..#.do_test w
6800: 61 6c 32 2d 31 30 2e 31 2e 31 20 7b 0a 20 20 66  al2-10.1.1 {.  f
6810: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
6820: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
6830: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
6840: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
6850: 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  WAL;.    CREATE 
6860: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
6870: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
6880: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 49  heckpoint;.    I
6890: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
68a0: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
68b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
68c0: 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d  ALUES(3, 4);.  }
68d0: 0a 20 20 69 66 20 7b 5b 66 6f 72 63 65 64 5f 70  .  if {[forced_p
68e0: 72 6f 78 79 5f 6c 6f 63 6b 69 6e 67 5d 7d 20 7b  roxy_locking]} {
68f0: 0a 20 20 20 20 66 6f 72 63 65 63 6f 70 79 20 24  .    forcecopy $
6900: 73 68 6d 70 61 74 68 20 73 76 5f 74 65 73 74 2e  shmpath sv_test.
6910: 64 62 2d 73 68 6d 0a 20 20 7d 0a 20 20 66 61 75  db-shm.  }.  fau
6920: 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63  ltsim_save_and_c
6930: 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  lose.} {}.do_tes
6940: 74 20 77 61 6c 32 2d 31 30 2e 31 2e 32 20 7b 0a  t wal2-10.1.2 {.
6950: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
6960: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
6970: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
6980: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b   * FROM t1 }.} {
6990: 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74  1 2 3 4}.do_test
69a0: 20 77 61 6c 32 2d 31 30 2e 31 2e 33 20 7b 0a 20   wal2-10.1.3 {. 
69b0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
69c0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73  e_and_reopen.  s
69d0: 65 74 20 68 64 72 20 5b 77 61 6c 5f 73 65 74 5f  et hdr [wal_set_
69e0: 77 61 6c 68 64 72 20 74 65 73 74 2e 64 62 2d 77  walhdr test.db-w
69f0: 61 6c 5d 0a 20 20 6c 69 6e 64 65 78 20 24 68 64  al].  lindex $hd
6a00: 72 20 31 0a 7d 20 7b 33 30 30 37 30 30 30 7d 0a  r 1.} {3007000}.
6a10: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 30 2e  do_test wal2-10.
6a20: 31 2e 34 20 7b 0a 20 20 6c 73 65 74 20 68 64 72  1.4 {.  lset hdr
6a30: 20 31 20 33 30 30 37 30 30 31 0a 20 20 77 61 6c   1 3007001.  wal
6a40: 5f 73 65 74 5f 77 61 6c 68 64 72 20 74 65 73 74  _set_walhdr test
6a50: 2e 64 62 2d 77 61 6c 20 24 68 64 72 0a 20 20 63  .db-wal $hdr.  c
6a60: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
6a70: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b   * FROM t1 }.} {
6a80: 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  1 {unable to ope
6a90: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d  n database file}
6aa0: 7d 0a 0a 74 65 73 74 76 66 73 20 74 76 66 73 20  }..testvfs tvfs 
6ab0: 2d 64 65 66 61 75 6c 74 20 31 0a 64 6f 5f 74 65  -default 1.do_te
6ac0: 73 74 20 77 61 6c 32 2d 31 30 2e 32 2e 31 20 7b  st wal2-10.2.1 {
6ad0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
6ae0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
6af0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
6b00: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
6b10: 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73  {1 2 3 4}.do_tes
6b20: 74 20 77 61 6c 32 2d 31 30 2e 32 2e 32 20 7b 20  t wal2-10.2.2 { 
6b30: 0a 20 20 73 65 74 20 68 64 72 20 5b 73 65 74 5f  .  set hdr [set_
6b40: 74 76 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c 65  tvfs_hdr $::file
6b50: 6e 61 6d 65 5d 20 0a 20 20 6c 69 6e 64 65 78 20  name] .  lindex 
6b60: 24 68 64 72 20 30 20 0a 7d 20 7b 33 30 30 37 30  $hdr 0 .} {30070
6b70: 30 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32  00}.do_test wal2
6b80: 2d 31 30 2e 32 2e 33 20 7b 20 0a 20 20 6c 73 65  -10.2.3 { .  lse
6b90: 74 20 68 64 72 20 30 20 33 30 30 37 30 30 31 0a  t hdr 0 3007001.
6ba0: 20 20 77 61 6c 5f 66 69 78 5f 77 61 6c 69 6e 64    wal_fix_walind
6bb0: 65 78 5f 63 6b 73 75 6d 20 68 64 72 20 0a 20 20  ex_cksum hdr .  
6bc0: 73 65 74 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a  set_tvfs_hdr $::
6bd0: 66 69 6c 65 6e 61 6d 65 20 24 68 64 72 0a 20 20  filename $hdr.  
6be0: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
6bf0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
6c00: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70  {1 {unable to op
6c10: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
6c20: 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 66 73  }}.db close.tvfs
6c30: 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d   delete..#------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c80: 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b  ---.# This block
6c90: 20 6f 66 20 74 65 73 74 73 20 2d 20 77 61 6c 32   of tests - wal2
6ca0: 2d 31 31 2e 2a 20 2d 20 74 65 73 74 73 20 74 68  -11.* - tests th
6cb0: 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  at it is not pos
6cc0: 73 69 62 6c 65 20 74 6f 20 70 75 74 0a 23 20 74  sible to put.# t
6cd0: 68 65 20 6c 69 62 72 61 72 79 20 69 6e 74 6f 20  he library into 
6ce0: 61 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70  an infinite loop
6cf0: 20 62 79 20 70 72 65 73 65 6e 74 69 6e 67 20 69   by presenting i
6d00: 74 20 77 69 74 68 20 61 20 63 6f 72 72 75 70 74  t with a corrupt
6d10: 0a 23 20 68 61 73 68 20 74 61 62 6c 65 20 28 6f  .# hash table (o
6d20: 6e 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ne that appears 
6d30: 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 6e  to contain a sin
6d40: 67 6c 65 20 63 68 61 69 6e 20 6f 66 20 69 6e 66  gle chain of inf
6d50: 69 6e 69 74 65 20 0a 23 20 6c 65 6e 67 74 68 29  inite .# length)
6d60: 2e 0a 23 0a 23 20 20 20 77 61 6c 32 2d 31 31 2e  ..#.#   wal2-11.
6d70: 31 2e 2a 3a 20 57 68 69 6c 65 20 72 65 61 64 69  1.*: While readi
6d80: 6e 67 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c  ng the hash-tabl
6d90: 65 2e 0a 23 0a 23 20 20 20 77 61 6c 32 2d 31 31  e..#.#   wal2-11
6da0: 2e 32 2e 2a 3a 20 57 68 69 6c 65 20 77 72 69 74  .2.*: While writ
6db0: 69 6e 67 20 74 68 65 20 68 61 73 68 2d 74 61 62  ing the hash-tab
6dc0: 6c 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  le..#.testvfs tv
6dd0: 66 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 64 6f  fs -default 1.do
6de0: 5f 74 65 73 74 20 77 61 6c 32 2d 31 31 2e 30 20  _test wal2-11.0 
6df0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
6e00: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
6e10: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
6e20: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
6e30: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52  de = WAL;.    CR
6e40: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
6e50: 20 62 2c 20 63 29 3b 0a 20 20 20 20 49 4e 53 45   b, c);.    INSE
6e60: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6e70: 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20  S(1, 2, 3);.    
6e80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6e90: 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a  ALUES(4, 5, 6);.
6ea0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6eb0: 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20  t1 VALUES(7, 8, 
6ec0: 39 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  9);.    SELECT *
6ed0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
6ee0: 7b 77 61 6c 20 31 20 32 20 33 20 34 20 35 20 36  {wal 1 2 3 4 5 6
6ef0: 20 37 20 38 20 39 7d 0a 0a 64 6f 5f 74 65 73 74   7 8 9}..do_test
6f00: 20 77 61 6c 32 2d 31 31 2e 31 2e 31 20 7b 0a 20   wal2-11.1.1 {. 
6f10: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
6f20: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
6f30: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f   SELECT name FRO
6f40: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
6f50: 7d 20 64 62 32 0a 7d 20 7b 74 31 7d 0a 0a 69 66  } db2.} {t1}..if
6f60: 20 7b 24 3a 3a 74 63 6c 5f 76 65 72 73 69 6f 6e   {$::tcl_version
6f70: 3e 3d 38 2e 35 7d 20 7b 0a 20 20 23 20 53 65 74  >=8.5} {.  # Set
6f80: 20 61 6c 6c 20 7a 65 72 6f 65 64 20 73 6c 6f 74   all zeroed slot
6f90: 73 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 68  s in the first h
6fa0: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 69 6e 76  ash table to inv
6fb0: 61 6c 69 64 20 76 61 6c 75 65 73 2e 0a 20 20 23  alid values..  #
6fc0: 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b 73 74 72  .  set blob [str
6fd0: 69 6e 67 20 72 61 6e 67 65 20 5b 74 76 66 73 20  ing range [tvfs 
6fe0: 73 68 6d 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 5d  shm $::filename]
6ff0: 20 30 20 31 36 33 38 33 5d 0a 20 20 73 65 74 20   0 16383].  set 
7000: 49 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  I [string range 
7010: 5b 74 76 66 73 20 73 68 6d 20 24 3a 3a 66 69 6c  [tvfs shm $::fil
7020: 65 6e 61 6d 65 5d 20 31 36 33 38 34 20 65 6e 64  ename] 16384 end
7030: 5d 0a 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20  ].  binary scan 
7040: 24 49 20 74 2a 20 4c 0a 20 20 73 65 74 20 49 20  $I t* L.  set I 
7050: 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 68  [list].  foreach
7060: 20 70 20 24 4c 20 7b 0a 20 20 20 20 6c 61 70 70   p $L {.    lapp
7070: 65 6e 64 20 49 20 5b 65 78 70 72 20 24 70 20 3f  end I [expr $p ?
7080: 20 24 70 20 3a 20 34 30 30 5d 0a 20 20 7d 0a 20   $p : 400].  }. 
7090: 20 61 70 70 65 6e 64 20 62 6c 6f 62 20 5b 62 69   append blob [bi
70a0: 6e 61 72 79 20 66 6f 72 6d 61 74 20 74 2a 20 24  nary format t* $
70b0: 49 5d 0a 20 20 74 76 66 73 20 73 68 6d 20 24 3a  I].  tvfs shm $:
70c0: 3a 66 69 6c 65 6e 61 6d 65 20 24 62 6c 6f 62 0a  :filename $blob.
70d0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31    do_test wal2-1
70e0: 31 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73  1.2 {.    catchs
70f0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
7100: 20 74 31 20 56 41 4c 55 45 53 28 31 30 2c 20 31   t1 VALUES(10, 1
7110: 31 2c 20 31 32 29 20 7d 0a 20 20 7d 20 7b 31 20  1, 12) }.  } {1 
7120: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
7130: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
7140: 64 7d 7d 0a 20 20 0a 20 20 23 20 46 69 6c 6c 20  d}}.  .  # Fill 
7150: 75 70 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  up the hash tabl
7160: 65 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 70  e on the first p
7170: 61 67 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65  age of shared me
7180: 6d 6f 72 79 20 77 69 74 68 20 30 78 35 35 20 62  mory with 0x55 b
7190: 79 74 65 73 2e 0a 20 20 23 0a 20 20 73 65 74 20  ytes..  #.  set 
71a0: 62 6c 6f 62 20 5b 73 74 72 69 6e 67 20 72 61 6e  blob [string ran
71b0: 67 65 20 5b 74 76 66 73 20 73 68 6d 20 24 3a 3a  ge [tvfs shm $::
71c0: 66 69 6c 65 6e 61 6d 65 5d 20 30 20 31 36 33 38  filename] 0 1638
71d0: 33 5d 0a 20 20 61 70 70 65 6e 64 20 62 6c 6f 62  3].  append blob
71e0: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
71f0: 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63  [binary format c
7200: 20 35 35 5d 20 31 36 33 38 34 5d 0a 20 20 74 76   55] 16384].  tv
7210: 66 73 20 73 68 6d 20 24 3a 3a 66 69 6c 65 6e 61  fs shm $::filena
7220: 6d 65 20 24 62 6c 6f 62 0a 20 20 64 6f 5f 74 65  me $blob.  do_te
7230: 73 74 20 77 61 6c 32 2d 31 31 2e 33 20 7b 0a 20  st wal2-11.3 {. 
7240: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45     catchsql { SE
7250: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
7260: 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 64 61 74   db2.  } {1 {dat
7270: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
7280: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
7290: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20  }..db close.db2 
72a0: 63 6c 6f 73 65 0a 74 76 66 73 20 64 65 6c 65 74  close.tvfs delet
72b0: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
72c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
7300: 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  If a connection 
7310: 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  is required to c
7320: 72 65 61 74 65 20 61 20 57 41 4c 20 6f 72 20 53  reate a WAL or S
7330: 48 4d 20 66 69 6c 65 2c 20 69 74 20 63 72 65 61  HM file, it crea
7340: 74 65 73 20 0a 23 20 74 68 65 20 6e 65 77 20 66  tes .# the new f
7350: 69 6c 65 73 20 77 69 74 68 20 74 68 65 20 73 61  iles with the sa
7360: 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  me file-system p
7370: 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68  ermissions as th
7380: 65 20 64 61 74 61 62 61 73 65 20 0a 23 20 66 69  e database .# fi
7390: 6c 65 20 69 74 73 65 6c 66 2e 20 54 65 73 74 20  le itself. Test 
73a0: 74 68 69 73 2e 0a 23 0a 69 66 20 7b 24 3a 3a 74  this..#.if {$::t
73b0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74  cl_platform(plat
73c0: 66 6f 72 6d 29 20 3d 3d 20 22 75 6e 69 78 22 7d  form) == "unix"}
73d0: 20 7b 0a 20 20 69 66 20 7b 5b 66 6f 72 63 65 64   {.  if {[forced
73e0: 5f 70 72 6f 78 79 5f 6c 6f 63 6b 69 6e 67 5d 7d  _proxy_locking]}
73f0: 20 7b 0a 20 20 20 20 23 20 66 61 75 6c 74 73 69   {.    # faultsi
7400: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
7410: 70 65 6e 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  pen doesn't know
7420: 20 61 62 6f 75 74 20 74 68 65 20 73 68 6d 20 66   about the shm f
7430: 69 6c 65 20 72 65 64 69 72 65 63 74 2e 2e 2e 0a  ile redirect....
7440: 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20      forcedelete 
7450: 24 73 68 6d 70 61 74 68 0a 20 20 7d 0a 20 20 0a  $shmpath.  }.  .
7460: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
7470: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 23  e_and_reopen.  #
7480: 20 43 68 61 6e 67 65 64 20 6f 6e 20 32 30 31 32   Changed on 2012
7490: 2d 30 32 2d 31 33 3a 20 75 6d 61 73 6b 20 69 73  -02-13: umask is
74a0: 20 64 65 6c 69 62 65 72 61 74 65 6c 79 20 69 67   deliberately ig
74b0: 6e 6f 72 65 64 20 66 6f 72 20 2d 77 61 6c 20 66  nored for -wal f
74c0: 69 6c 65 73 2e 0a 20 20 23 73 65 74 20 75 6d 61  iles..  #set uma
74d0: 73 6b 20 5b 65 78 65 63 20 2f 62 69 6e 2f 73 68  sk [exec /bin/sh
74e0: 20 2d 63 20 75 6d 61 73 6b 5d 0a 20 20 73 65 74   -c umask].  set
74f0: 20 75 6d 61 73 6b 20 30 0a 20 20 0a 0a 20 20 64   umask 0.  ..  d
7500: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 32 2e 31  o_test wal2-12.1
7510: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
7520: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  b test.db.    ex
7530: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 43  ecsql { .      C
7540: 52 45 41 54 45 20 54 41 42 4c 45 20 74 78 28 79  REATE TABLE tx(y
7550: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 50 52 41 47  , z);.      PRAG
7560: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7570: 3d 20 57 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  = WAL;.    }.   
7580: 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 6c 69   db close.    li
7590: 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  st [file exists 
75a0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 5b 66 69  test.db-wal] [fi
75b0: 6c 65 20 65 78 69 73 74 73 20 24 73 68 6d 70 61  le exists $shmpa
75c0: 74 68 5d 0a 20 20 7d 20 7b 30 20 30 7d 0a 20 20  th].  } {0 0}.  
75d0: 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 70  .  foreach {tn p
75e0: 65 72 6d 69 73 73 69 6f 6e 73 7d 20 7b 0a 20 20  ermissions} {.  
75f0: 20 31 20 30 30 36 34 34 0a 20 20 20 32 20 30 30   1 00644.   2 00
7600: 36 36 36 0a 20 20 20 33 20 30 30 36 30 30 0a 20  666.   3 00600. 
7610: 20 20 34 20 30 30 37 35 35 0a 20 20 7d 20 7b 0a    4 00755.  } {.
7620: 20 20 20 20 73 65 74 20 65 66 66 65 63 74 69 76      set effectiv
7630: 65 20 5b 66 6f 72 6d 61 74 20 25 2e 35 6f 20 5b  e [format %.5o [
7640: 65 78 70 72 20 24 70 65 72 6d 69 73 73 69 6f 6e  expr $permission
7650: 73 20 26 20 7e 24 75 6d 61 73 6b 5d 5d 0a 20 20  s & ~$umask]].  
7660: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31    do_test wal2-1
7670: 32 2e 32 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  2.2.$tn.1 {.    
7680: 20 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65    file attribute
7690: 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72 6d 69  s test.db -permi
76a0: 73 73 69 6f 6e 73 20 24 70 65 72 6d 69 73 73 69  ssions $permissi
76b0: 6f 6e 73 0a 20 20 20 20 20 20 66 69 6c 65 20 61  ons.      file a
76c0: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
76d0: 62 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20  b -permissions. 
76e0: 20 20 20 7d 20 24 70 65 72 6d 69 73 73 69 6f 6e     } $permission
76f0: 73 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61  s.    do_test wa
7700: 6c 32 2d 31 32 2e 32 2e 24 74 6e 2e 32 20 7b 0a  l2-12.2.$tn.2 {.
7710: 20 20 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65        list [file
7720: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
7730: 77 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73 74  wal] [file exist
7740: 73 20 24 73 68 6d 70 61 74 68 5d 0a 20 20 20 20  s $shmpath].    
7750: 7d 20 7b 30 20 30 7d 0a 20 20 20 20 64 6f 5f 74  } {0 0}.    do_t
7760: 65 73 74 20 77 61 6c 32 2d 31 32 2e 32 2e 24 74  est wal2-12.2.$t
7770: 6e 2e 33 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  n.3 {.      sqli
7780: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
7790: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49       execsql { I
77a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 78 20 44 45  NSERT INTO tx DE
77b0: 46 41 55 4c 54 20 56 41 4c 55 45 53 20 7d 0a 20  FAULT VALUES }. 
77c0: 20 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20       list [file 
77d0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77  exists test.db-w
77e0: 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73  al] [file exists
77f0: 20 24 73 68 6d 70 61 74 68 5d 0a 20 20 20 20 7d   $shmpath].    }
7800: 20 7b 31 20 31 7d 0a 20 20 20 20 64 6f 5f 74 65   {1 1}.    do_te
7810: 73 74 20 77 61 6c 32 2d 31 32 2e 32 2e 24 74 6e  st wal2-12.2.$tn
7820: 2e 34 20 7b 0a 20 20 20 20 20 20 6c 69 73 74 20  .4 {.      list 
7830: 5b 66 69 6c 65 20 61 74 74 72 20 74 65 73 74 2e  [file attr test.
7840: 64 62 2d 77 61 6c 20 2d 70 65 72 6d 5d 20 5b 66  db-wal -perm] [f
7850: 69 6c 65 20 61 74 74 72 20 24 73 68 6d 70 61 74  ile attr $shmpat
7860: 68 20 2d 70 65 72 6d 5d 0a 20 20 20 20 7d 20 5b  h -perm].    } [
7870: 6c 69 73 74 20 24 65 66 66 65 63 74 69 76 65 20  list $effective 
7880: 24 65 66 66 65 63 74 69 76 65 5d 0a 20 20 20 20  $effective].    
7890: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 32 2e  do_test wal2-12.
78a0: 32 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 20 20  2.$tn.5 {.      
78b0: 69 66 63 61 70 61 62 6c 65 20 65 6e 61 62 6c 65  ifcapable enable
78c0: 5f 70 65 72 73 69 73 74 5f 77 61 6c 20 7b 0a 20  _persist_wal {. 
78d0: 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74         file_cont
78e0: 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 20  rol_persist_wal 
78f0: 64 62 20 30 0a 20 20 20 20 20 20 7d 0a 20 20 20  db 0.      }.   
7900: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
7910: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69    list [file exi
7920: 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  sts test.db-wal]
7930: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73   [file exists $s
7940: 68 6d 70 61 74 68 5d 0a 20 20 20 20 7d 20 7b 30  hmpath].    } {0
7950: 20 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d   0}.  }.}..#----
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79a0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65  -----.# Test the
79b0: 20 6c 69 62 72 61 72 69 65 73 20 72 65 73 70 6f   libraries respo
79c0: 6e 73 65 20 74 6f 20 64 69 73 63 6f 76 65 72 69  nse to discoveri
79d0: 6e 67 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 6d  ng that one or m
79e0: 6f 72 65 20 6f 66 20 74 68 65 0a 23 20 64 61 74  ore of the.# dat
79f0: 61 62 61 73 65 2c 20 77 61 6c 20 6f 72 20 73 68  abase, wal or sh
7a00: 6d 20 66 69 6c 65 73 20 63 61 6e 6e 6f 74 20 62  m files cannot b
7a10: 65 20 6f 70 65 6e 65 64 2c 20 6f 72 20 63 61 6e  e opened, or can
7a20: 20 6f 6e 6c 79 20 62 65 20 6f 70 65 6e 65 64 0a   only be opened.
7a30: 23 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 23 0a 69  # read-only..#.i
7a40: 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  f {$::tcl_platfo
7a50: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 20 3d 3d 20  rm(platform) == 
7a60: 22 75 6e 69 78 22 7d 20 7b 0a 20 20 70 72 6f 63  "unix"} {.  proc
7a70: 20 70 65 72 6d 20 7b 7d 20 7b 0a 20 20 20 20 73   perm {} {.    s
7a80: 65 74 20 4c 20 5b 6c 69 73 74 5d 0a 20 20 20 20  et L [list].    
7a90: 66 6f 72 65 61 63 68 20 66 20 7b 74 65 73 74 2e  foreach f {test.
7aa0: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 24  db test.db-wal $
7ab0: 73 68 6d 70 61 74 68 7d 20 7b 0a 20 20 20 20 20  shmpath} {.     
7ac0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
7ad0: 73 20 24 66 5d 7d 20 7b 0a 20 20 20 20 20 20 20  s $f]} {.       
7ae0: 20 6c 61 70 70 65 6e 64 20 4c 20 5b 66 69 6c 65   lappend L [file
7af0: 20 61 74 74 72 20 24 66 20 2d 70 65 72 6d 5d 0a   attr $f -perm].
7b00: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
7b10: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 4c         lappend L
7b20: 20 7b 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   {}.      }.    
7b30: 7d 0a 20 20 20 20 73 65 74 20 4c 0a 20 20 7d 0a  }.    set L.  }.
7b40: 0a 20 20 69 66 20 7b 5b 66 6f 72 63 65 64 5f 70  .  if {[forced_p
7b50: 72 6f 78 79 5f 6c 6f 63 6b 69 6e 67 5d 7d 20 7b  roxy_locking]} {
7b60: 0a 20 20 20 20 23 20 66 61 75 6c 74 73 69 6d 5f  .    # faultsim_
7b70: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
7b80: 6e 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 61  n doesn't know a
7b90: 62 6f 75 74 20 74 68 65 20 73 68 6d 20 66 69 6c  bout the shm fil
7ba0: 65 20 72 65 64 69 72 65 63 74 2e 2e 2e 0a 20 20  e redirect....  
7bb0: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 73    forcedelete $s
7bc0: 68 6d 70 61 74 68 0a 20 20 7d 0a 20 20 66 61 75  hmpath.  }.  fau
7bd0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
7be0: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
7bf0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
7c00: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
7c10: 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  L;.    CREATE TA
7c20: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
7c30: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
7c40: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 49 4e 53  ckpoint;.    INS
7c50: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7c60: 45 53 28 27 33 2e 31 34 27 2c 20 27 32 2e 37 32  ES('3.14', '2.72
7c70: 27 29 3b 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73  ');.  }.  do_tes
7c80: 74 20 77 61 6c 32 2d 31 33 2e 31 2e 31 20 7b 0a  t wal2-13.1.1 {.
7c90: 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65      list [file e
7ca0: 78 69 73 74 73 20 24 73 68 6d 70 61 74 68 5d 20  xists $shmpath] 
7cb0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73  [file exists tes
7cc0: 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 7b 31  t.db-wal].  } {1
7cd0: 20 31 7d 0a 20 20 69 66 20 7b 5b 66 6f 72 63 65   1}.  if {[force
7ce0: 64 5f 70 72 6f 78 79 5f 6c 6f 63 6b 69 6e 67 5d  d_proxy_locking]
7cf0: 7d 20 7b 0a 20 20 20 20 66 6f 72 63 65 63 6f 70  } {.    forcecop
7d00: 79 20 24 73 68 6d 70 61 74 68 20 70 72 6f 78 79  y $shmpath proxy
7d10: 73 76 5f 74 65 73 74 2e 64 62 2d 73 68 6d 20 0a  sv_test.db-shm .
7d20: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73    }.  faultsim_s
7d30: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 0a 20  ave_and_close.. 
7d40: 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 64 62 5f   foreach {tn db_
7d50: 70 65 72 6d 20 77 61 6c 5f 70 65 72 6d 20 73 68  perm wal_perm sh
7d60: 6d 5f 70 65 72 6d 20 63 61 6e 5f 6f 70 65 6e 20  m_perm can_open 
7d70: 63 61 6e 5f 72 65 61 64 20 63 61 6e 5f 77 72 69  can_read can_wri
7d80: 74 65 7d 20 7b 0a 20 20 20 20 32 20 20 20 30 30  te} {.    2   00
7d90: 36 34 34 20 20 20 30 30 36 34 34 20 20 20 30 30  644   00644   00
7da0: 36 34 34 20 20 20 31 20 20 20 31 20 20 20 31 0a  644   1   1   1.
7db0: 20 20 20 20 33 20 20 20 30 30 36 34 34 20 20 20      3   00644   
7dc0: 30 30 34 30 30 20 20 20 30 30 36 34 34 20 20 20  00400   00644   
7dd0: 31 20 20 20 31 20 20 20 30 0a 20 20 20 20 34 20  1   1   0.    4 
7de0: 20 20 30 30 36 34 34 20 20 20 30 30 36 34 34 20    00644   00644 
7df0: 20 20 30 30 34 30 30 20 20 20 31 20 20 20 31 20    00400   1   1 
7e00: 20 20 30 0a 20 20 20 20 35 20 20 20 30 30 34 30    0.    5   0040
7e10: 30 20 20 20 30 30 36 34 34 20 20 20 30 30 36 34  0   00644   0064
7e20: 34 20 20 20 31 20 20 20 31 20 20 20 30 0a 0a 20  4   1   1   0.. 
7e30: 20 20 20 37 20 20 20 30 30 36 34 34 20 20 20 30     7   00644   0
7e40: 30 30 30 30 20 20 20 30 30 36 34 34 20 20 20 31  0000   00644   1
7e50: 20 20 20 30 20 20 20 30 0a 20 20 20 20 38 20 20     0   0.    8  
7e60: 20 30 30 36 34 34 20 20 20 30 30 36 34 34 20 20   00644   00644  
7e70: 20 30 30 30 30 30 20 20 20 31 20 20 20 30 20 20   00000   1   0  
7e80: 20 30 0a 20 20 20 20 39 20 20 20 30 30 30 30 30   0.    9   00000
7e90: 20 20 20 30 30 36 34 34 20 20 20 30 30 36 34 34     00644   00644
7ea0: 20 20 20 30 20 20 20 30 20 20 20 30 0a 20 20 7d     0   0   0.  }
7eb0: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
7ec0: 72 65 73 74 6f 72 65 0a 20 20 20 20 69 66 20 7b  restore.    if {
7ed0: 5b 66 6f 72 63 65 64 5f 70 72 6f 78 79 5f 6c 6f  [forced_proxy_lo
7ee0: 63 6b 69 6e 67 5d 7d 20 7b 0a 20 20 20 20 20 20  cking]} {.      
7ef0: 66 6f 72 63 65 63 6f 70 79 20 70 72 6f 78 79 73  forcecopy proxys
7f00: 76 5f 74 65 73 74 2e 64 62 2d 73 68 6d 20 24 73  v_test.db-shm $s
7f10: 68 6d 70 61 74 68 20 20 0a 20 20 20 20 7d 0a 20  hmpath  .    }. 
7f20: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d     do_test wal2-
7f30: 31 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20  13.$tn.1 {.     
7f40: 20 66 69 6c 65 20 61 74 74 72 20 74 65 73 74 2e   file attr test.
7f50: 64 62 20 20 20 20 20 2d 70 65 72 6d 20 24 64 62  db     -perm $db
7f60: 5f 70 65 72 6d 0a 20 20 20 20 20 20 66 69 6c 65  _perm.      file
7f70: 20 61 74 74 72 20 74 65 73 74 2e 64 62 2d 77 61   attr test.db-wa
7f80: 6c 20 2d 70 65 72 6d 20 24 77 61 6c 5f 70 65 72  l -perm $wal_per
7f90: 6d 0a 20 20 20 20 20 20 66 69 6c 65 20 61 74 74  m.      file att
7fa0: 72 20 24 73 68 6d 70 61 74 68 20 2d 70 65 72 6d  r $shmpath -perm
7fb0: 20 24 73 68 6d 5f 70 65 72 6d 0a 0a 20 20 20 20   $shm_perm..    
7fc0: 20 20 73 65 74 20 20 20 20 20 4c 20 5b 66 69 6c    set     L [fil
7fd0: 65 20 61 74 74 72 20 74 65 73 74 2e 64 62 20 2d  e attr test.db -
7fe0: 70 65 72 6d 5d 0a 20 20 20 20 20 20 6c 61 70 70  perm].      lapp
7ff0: 65 6e 64 20 4c 20 5b 66 69 6c 65 20 61 74 74 72  end L [file attr
8000: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 2d 70 65   test.db-wal -pe
8010: 72 6d 5d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e  rm].      lappen
8020: 64 20 4c 20 5b 66 69 6c 65 20 61 74 74 72 20 24  d L [file attr $
8030: 73 68 6d 70 61 74 68 20 2d 70 65 72 6d 5d 0a 20  shmpath -perm]. 
8040: 20 20 20 7d 20 5b 6c 69 73 74 20 24 64 62 5f 70     } [list $db_p
8050: 65 72 6d 20 24 77 61 6c 5f 70 65 72 6d 20 24 73  erm $wal_perm $s
8060: 68 6d 5f 70 65 72 6d 5d 0a 0a 20 20 20 20 23 20  hm_perm]..    # 
8070: 49 66 20 24 63 61 6e 5f 6f 70 65 6e 20 69 73 20  If $can_open is 
8080: 74 72 75 65 2c 20 74 68 65 6e 20 69 74 20 73 68  true, then it sh
8090: 6f 75 6c 64 20 62 65 20 70 6f 73 73 69 62 6c 65  ould be possible
80a0: 20 74 6f 20 6f 70 65 6e 20 61 20 64 61 74 61 62   to open a datab
80b0: 61 73 65 0a 20 20 20 20 23 20 68 61 6e 64 6c 65  ase.    # handle
80c0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
80d0: 24 63 61 6e 5f 6f 70 65 6e 20 69 73 20 30 2c 20  $can_open is 0, 
80e0: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70  attempting to op
80f0: 65 6e 20 74 68 65 20 64 62 0a 20 20 20 20 23 20  en the db.    # 
8100: 68 61 6e 64 6c 65 20 74 68 72 6f 77 73 20 61 6e  handle throws an
8110: 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
8120: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 20   database file" 
8130: 65 78 63 65 70 74 69 6f 6e 2e 0a 20 20 20 20 23  exception..    #
8140: 0a 20 20 20 20 73 65 74 20 72 28 31 29 20 7b 30  .    set r(1) {0
8150: 20 6f 6b 7d 0a 20 20 20 20 73 65 74 20 72 28 30   ok}.    set r(0
8160: 29 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  ) {1 {unable to 
8170: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
8180: 6c 65 7d 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  le}}.    do_test
8190: 20 77 61 6c 32 2d 31 33 2e 24 74 6e 2e 32 20 7b   wal2-13.$tn.2 {
81a0: 0a 20 20 20 20 20 20 6c 69 73 74 20 5b 63 61 74  .      list [cat
81b0: 63 68 20 7b 73 71 6c 69 74 65 33 20 64 62 20 74  ch {sqlite3 db t
81c0: 65 73 74 2e 64 62 20 3b 20 73 65 74 20 7b 7d 20  est.db ; set {} 
81d0: 6f 6b 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20  ok} msg] $msg.  
81e0: 20 20 7d 20 24 72 28 24 63 61 6e 5f 6f 70 65 6e    } $r($can_open
81f0: 29 0a 0a 20 20 20 20 69 66 20 7b 24 63 61 6e 5f  )..    if {$can_
8200: 6f 70 65 6e 7d 20 7b 0a 20 20 20 20 20 20 23 20  open} {.      # 
8210: 44 69 66 66 65 72 65 6e 74 20 62 65 68 61 76 69  Different behavi
8220: 6f 72 2c 20 62 65 63 61 75 73 65 20 44 61 72 77  or, because Darw
8230: 69 6e 20 64 6f 65 73 20 61 6e 20 61 63 63 65 73  in does an acces
8240: 73 28 29 20 63 61 6c 6c 20 70 72 69 6f 72 0a 20  s() call prior. 
8250: 20 20 20 20 20 23 20 74 6f 20 61 74 74 65 6d 70       # to attemp
8260: 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20 74 68 65  ting to open the
8270: 20 53 48 4d 20 69 6e 20 72 65 61 64 2f 77 72 69   SHM in read/wri
8280: 74 65 20 6d 6f 64 65 20 61 6e 64 20 64 65 6d 6f  te mode and demo
8290: 74 65 73 20 74 6f 0a 20 20 20 20 20 20 23 20 72  tes to.      # r
82a0: 65 61 64 2d 6f 6e 6c 79 20 69 66 20 74 68 65 20  ead-only if the 
82b0: 53 48 4d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  SHM is read-only
82c0: 2e 0a 20 20 20 20 20 20 69 66 20 7b 24 74 6e 3d  ..      if {$tn=
82d0: 3d 34 20 26 26 20 24 3a 3a 74 63 6c 5f 70 6c 61  =4 && $::tcl_pla
82e0: 74 66 6f 72 6d 28 6f 73 29 3d 3d 22 44 61 72 77  tform(os)=="Darw
82f0: 69 6e 22 7d 20 7b 73 65 74 20 63 61 6e 5f 72 65  in"} {set can_re
8300: 61 64 20 31 7d 0a 0a 20 20 20 20 20 20 23 20 49  ad 1}..      # I
8310: 66 20 24 63 61 6e 5f 72 65 61 64 20 69 73 20 74  f $can_read is t
8320: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6c  rue, then the cl
8330: 69 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 61  ient should be a
8340: 62 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ble to read from
8350: 0a 20 20 20 20 20 20 23 20 74 68 65 20 64 61 74  .      # the dat
8360: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 24  abase file. If $
8370: 63 61 6e 5f 72 65 61 64 20 69 73 20 66 61 6c 73  can_read is fals
8380: 65 2c 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  e, attempting to
8390: 20 72 65 61 64 20 73 68 6f 75 6c 64 0a 20 20 20   read should.   
83a0: 20 20 20 23 20 74 68 72 6f 77 20 74 68 65 20 22     # throw the "
83b0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
83c0: 61 74 61 62 61 73 65 20 66 69 6c 65 22 20 65 78  atabase file" ex
83d0: 63 65 70 74 69 6f 6e 2e 20 0a 20 20 20 20 20 20  ception. .      
83e0: 23 0a 20 20 20 20 20 20 73 65 74 20 61 28 30 29  #.      set a(0)
83f0: 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f   {1 {unable to o
8400: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
8410: 65 7d 7d 0a 20 20 20 20 20 20 73 65 74 20 61 28  e}}.      set a(
8420: 31 29 20 7b 30 20 7b 33 2e 31 34 20 32 2e 37 32  1) {0 {3.14 2.72
8430: 7d 7d 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74  }}.      do_test
8440: 20 77 61 6c 32 2d 31 33 2e 24 74 6e 2e 33 20 7b   wal2-13.$tn.3 {
8450: 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 73 71  .        catchsq
8460: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
8470: 4d 20 74 31 20 7d 0a 20 20 20 20 20 20 7d 20 24  M t1 }.      } $
8480: 61 28 24 63 61 6e 5f 72 65 61 64 29 0a 20 20 0a  a($can_read).  .
8490: 20 20 20 20 20 20 23 20 4e 6f 77 20 74 72 79 20        # Now try 
84a0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
84b0: 64 62 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  db file. If the 
84c0: 63 6c 69 65 6e 74 20 63 61 6e 20 72 65 61 64 20  client can read 
84d0: 62 75 74 20 6e 6f 74 0a 20 20 20 20 20 20 23 20  but not.      # 
84e0: 77 72 69 74 65 2c 20 74 68 65 6e 20 69 74 20 73  write, then it s
84f0: 68 6f 75 6c 64 20 74 68 72 6f 77 20 74 68 65 20  hould throw the 
8500: 66 61 6d 69 6c 69 61 72 20 22 75 6e 61 62 6c 65  familiar "unable
8510: 20 74 6f 20 6f 70 65 6e 20 64 62 20 66 69 6c 65   to open db file
8520: 22 0a 20 20 20 20 20 20 23 20 65 78 63 65 70 74  ".      # except
8530: 69 6f 6e 2e 20 49 66 20 69 74 20 63 61 6e 20 72  ion. If it can r
8540: 65 61 64 20 62 75 74 20 6e 6f 74 20 77 72 69 74  ead but not writ
8550: 65 2c 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e  e, the exception
8560: 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 23 20   should.      # 
8570: 62 65 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77  be "attempt to w
8580: 72 69 74 65 20 61 20 72 65 61 64 20 6f 6e 6c 79  rite a read only
8590: 20 64 61 74 61 62 61 73 65 22 2e 0a 20 20 20 20   database"..    
85a0: 20 20 23 0a 20 20 20 20 20 20 23 20 49 66 20 74    #.      # If t
85b0: 68 65 20 63 6c 69 65 6e 74 20 63 61 6e 20 72 65  he client can re
85c0: 61 64 20 61 6e 64 20 77 72 69 74 65 2c 20 74 68  ad and write, th
85d0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 68 6f 75  e operation shou
85e0: 6c 64 20 73 75 63 63 65 65 64 2e 0a 20 20 20 20  ld succeed..    
85f0: 20 20 23 0a 20 20 20 20 20 20 73 65 74 20 62 28    #.      set b(
8600: 30 2c 30 29 20 7b 31 20 7b 75 6e 61 62 6c 65 20  0,0) {1 {unable 
8610: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
8620: 20 66 69 6c 65 7d 7d 0a 20 20 20 20 20 20 73 65   file}}.      se
8630: 74 20 62 28 31 2c 30 29 20 7b 31 20 7b 61 74 74  t b(1,0) {1 {att
8640: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20  empt to write a 
8650: 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73  readonly databas
8660: 65 7d 7d 0a 20 20 20 20 20 20 73 65 74 20 62 28  e}}.      set b(
8670: 31 2c 31 29 20 7b 30 20 7b 7d 7d 0a 20 20 20 20  1,1) {0 {}}.    
8680: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31    do_test wal2-1
8690: 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 20 20  3.$tn.4 {.      
86a0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
86b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 44 45 46 41  ERT INTO t1 DEFA
86c0: 55 4c 54 20 56 41 4c 55 45 53 20 7d 0a 20 20 20  ULT VALUES }.   
86d0: 20 20 20 7d 20 24 62 28 24 63 61 6e 5f 72 65 61     } $b($can_rea
86e0: 64 2c 24 63 61 6e 5f 77 72 69 74 65 29 0a 20 20  d,$can_write).  
86f0: 20 20 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20    }.    catch { 
8700: 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 7d 0a 7d  db close }.  }.}
8710: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
8760: 65 73 74 20 74 68 61 74 20 22 50 52 41 47 4d 41  est that "PRAGMA
8770: 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c   checkpoint_full
8780: 73 79 6e 63 22 20 61 70 70 65 61 72 73 20 74 6f  sync" appears to
8790: 20 62 65 20 77 6f 72 6b 69 6e 67 2e 0a 23 0a 66   be working..#.f
87a0: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72  oreach {tn sql r
87b0: 65 73 6c 69 73 74 7d 20 7b 0a 20 20 31 20 7b 20  eslist} {.  1 { 
87c0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 20 20 7b 31 30 20 30 20 34 20 30 20 36 20 30 7d    {10 0 4 0 6 0}
87f0: 0a 20 20 32 20 7b 20 50 52 41 47 4d 41 20 63 68  .  2 { PRAGMA ch
8800: 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79  eckpoint_fullfsy
8810: 6e 63 20 3d 20 31 20 7d 20 7b 31 30 20 36 20 34  nc = 1 } {10 6 4
8820: 20 33 20 36 20 33 7d 0a 20 20 33 20 7b 20 50 52   3 6 3}.  3 { PR
8830: 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f  AGMA checkpoint_
8840: 66 75 6c 6c 66 73 79 6e 63 20 3d 20 30 20 7d 20  fullfsync = 0 } 
8850: 7b 31 30 20 30 20 34 20 30 20 36 20 30 7d 0a 7d  {10 0 4 0 6 0}.}
8860: 20 7b 0a 20 20 69 66 63 61 70 61 62 6c 65 20 64   {.  ifcapable d
8870: 65 66 61 75 6c 74 5f 63 6b 70 74 66 75 6c 6c 66  efault_ckptfullf
8880: 73 79 6e 63 20 7b 0a 20 20 20 20 69 66 20 7b 5b  sync {.    if {[
8890: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71 6c  string trim $sql
88a0: 5d 3d 3d 22 22 7d 20 63 6f 6e 74 69 6e 75 65 0a  ]==""} continue.
88b0: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64    }.  faultsim_d
88c0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
88d0: 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41  ..  execsql {PRA
88e0: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
88f0: 3d 20 30 3b 20 50 52 41 47 4d 41 20 73 79 6e 63  = 0; PRAGMA sync
8900: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 3b 7d  hronous = FULL;}
8910: 0a 20 20 65 78 65 63 73 71 6c 20 24 73 71 6c 0a  .  execsql $sql.
8920: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
8930: 74 20 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 30 20  t wal2-14.$tn.0 
8940: 7b 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69  { PRAGMA page_si
8950: 7a 65 20 3d 20 34 30 39 36 20 7d 20 20 20 7b 7d  ze = 4096 }   {}
8960: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
8970: 73 74 20 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 31  st wal2-14.$tn.1
8980: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
8990: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20 7b  l_mode = WAL } {
89a0: 77 61 6c 7d 0a 0a 20 20 73 65 74 20 73 71 6c 69  wal}..  set sqli
89b0: 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 30 0a  te_sync_count 0.
89c0: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 66 75 6c    set sqlite_ful
89d0: 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 30 0a 0a 20  lsync_count 0.. 
89e0: 20 73 65 74 20 75 73 65 72 65 73 20 24 72 65 73   set useres $res
89f0: 6c 69 73 74 0a 0a 20 20 64 6f 5f 65 78 65 63 73  list..  do_execs
8a00: 71 6c 5f 74 65 73 74 20 77 61 6c 32 2d 31 34 2e  ql_test wal2-14.
8a10: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 50 52 41 47  $tn.2 {.    PRAG
8a20: 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  MA wal_autocheck
8a30: 70 6f 69 6e 74 20 3d 20 31 30 3b 0a 20 20 20 20  point = 10;.    
8a40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
8a50: 61 2c 20 62 29 3b 20 20 20 20 20 20 20 20 20 20  a, b);          
8a60: 20 20 20 20 20 20 2d 2d 20 32 20 77 61 6c 20 73        -- 2 wal s
8a70: 79 6e 63 73 0a 20 20 20 20 49 4e 53 45 52 54 20  yncs.    INSERT 
8a80: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
8a90: 2c 20 32 29 3b 20 20 20 20 20 20 20 20 20 20 2d  , 2);          -
8aa0: 2d 20 32 20 77 61 6c 20 73 79 6e 63 0a 20 20 20  - 2 wal sync.   
8ab0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
8ac0: 6b 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  kpoint;         
8ad0: 20 20 20 20 20 20 20 2d 2d 20 31 20 77 61 6c 20         -- 1 wal 
8ae0: 73 79 6e 63 2c 20 31 20 64 62 20 73 79 6e 63 0a  sync, 1 db sync.
8af0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
8b00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8b10: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
8b20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8b30: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
8b40: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 20 20 20 20  .    COMMIT;    
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 20             -- 2 
8b70: 77 61 6c 20 73 79 6e 63 0a 20 20 20 20 50 52 41  wal sync.    PRA
8b80: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
8b90: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
8ba0: 20 20 20 2d 2d 20 31 20 77 61 6c 20 73 79 6e 63     -- 1 wal sync
8bb0: 2c 20 31 20 64 62 20 73 79 6e 63 0a 20 20 7d 20  , 1 db sync.  } 
8bc0: 7b 31 30 20 30 20 33 20 33 20 30 20 31 20 31 7d  {10 0 3 3 0 1 1}
8bd0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32  ..  do_test wal2
8be0: 2d 31 34 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  -14.$tn.3 {.    
8bf0: 63 6f 6e 64 5f 69 6e 63 72 5f 73 79 6e 63 5f 63  cond_incr_sync_c
8c00: 6f 75 6e 74 20 31 0a 20 20 20 20 6c 69 73 74 20  ount 1.    list 
8c10: 24 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75  $sqlite_sync_cou
8c20: 6e 74 20 24 73 71 6c 69 74 65 5f 66 75 6c 6c 73  nt $sqlite_fulls
8c30: 79 6e 63 5f 63 6f 75 6e 74 0a 20 20 7d 20 5b 6c  ync_count.  } [l
8c40: 72 61 6e 67 65 20 24 75 73 65 72 65 73 20 30 20  range $useres 0 
8c50: 31 5d 0a 0a 20 20 73 65 74 20 73 71 6c 69 74 65  1]..  set sqlite
8c60: 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 30 0a 20 20  _sync_count 0.  
8c70: 73 65 74 20 73 71 6c 69 74 65 5f 66 75 6c 6c 73  set sqlite_fulls
8c80: 79 6e 63 5f 63 6f 75 6e 74 20 30 0a 0a 20 20 64  ync_count 0..  d
8c90: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 34 2e 24  o_test wal2-14.$
8ca0: 74 6e 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.4 {.    execs
8cb0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
8cc0: 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 7a 65   t1 VALUES(7, ze
8cd0: 72 6f 62 6c 6f 62 28 31 32 2a 34 30 39 36 29 29  roblob(12*4096))
8ce0: 20 7d 0a 20 20 20 20 6c 69 73 74 20 24 73 71 6c   }.    list $sql
8cf0: 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 24  ite_sync_count $
8d00: 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f  sqlite_fullsync_
8d10: 63 6f 75 6e 74 0a 20 20 7d 20 5b 6c 72 61 6e 67  count.  } [lrang
8d20: 65 20 24 75 73 65 72 65 73 20 32 20 33 5d 0a 0a  e $useres 2 3]..
8d30: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 73 79 6e    set sqlite_syn
8d40: 63 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20  c_count 0.  set 
8d50: 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f  sqlite_fullsync_
8d60: 63 6f 75 6e 74 20 30 0a 0a 20 20 64 6f 5f 74 65  count 0..  do_te
8d70: 73 74 20 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 35  st wal2-14.$tn.5
8d80: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
8d90: 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f   PRAGMA wal_auto
8da0: 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 31 30 30  checkpoint = 100
8db0: 30 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  0 }.    execsql 
8dc0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
8dd0: 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d   VALUES(9, 10) }
8de0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
8df0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
8e00: 4c 55 45 53 28 31 31 2c 20 31 32 29 20 7d 0a 20  LUES(11, 12) }. 
8e10: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
8e20: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8e30: 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20 20 20  ES(13, 14) }.   
8e40: 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 6c 69   db close.    li
8e50: 73 74 20 24 73 71 6c 69 74 65 5f 73 79 6e 63 5f  st $sqlite_sync_
8e60: 63 6f 75 6e 74 20 24 73 71 6c 69 74 65 5f 66 75  count $sqlite_fu
8e70: 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 0a 20 20 7d  llsync_count.  }
8e80: 20 5b 6c 72 61 6e 67 65 20 24 75 73 65 72 65 73   [lrange $useres
8e90: 20 34 20 35 5d 0a 7d 0a 0a 63 61 74 63 68 20 7b   4 5].}..catch {
8ea0: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 0a 23 20 50   db close }..# P
8eb0: 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74  RAGMA checkpoint
8ec0: 5f 66 75 6c 6c 73 79 6e 63 0a 23 20 50 52 41 47  _fullsync.# PRAG
8ed0: 4d 41 20 66 75 6c 6c 66 73 79 6e 63 0a 23 20 50  MA fullfsync.# P
8ee0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
8ef0: 73 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  s.#.foreach {tn 
8f00: 73 65 74 74 69 6e 67 73 20 72 65 73 74 61 72 74  settings restart
8f10: 5f 73 79 6e 63 20 63 6f 6d 6d 69 74 5f 73 79 6e  _sync commit_syn
8f20: 63 20 63 6b 70 74 5f 73 79 6e 63 7d 20 7b 0a 20  c ckpt_sync} {. 
8f30: 20 31 20 20 7b 30 20 30 20 6f 66 66 7d 20 20 20   1  {0 0 off}   
8f40: 20 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d 20 20    {0 0}  {0 0}  
8f50: 7b 30 20 30 7d 0a 20 20 32 20 20 7b 30 20 30 20  {0 0}.  2  {0 0 
8f60: 6e 6f 72 6d 61 6c 7d 20 20 7b 31 20 30 7d 20 20  normal}  {1 0}  
8f70: 7b 30 20 30 7d 20 20 7b 32 20 30 7d 0a 20 20 33  {0 0}  {2 0}.  3
8f80: 20 20 7b 30 20 30 20 66 75 6c 6c 7d 20 20 20 20    {0 0 full}    
8f90: 7b 32 20 30 7d 20 20 7b 31 20 30 7d 20 20 7b 32  {2 0}  {1 0}  {2
8fa0: 20 30 7d 0a 0a 20 20 34 20 20 7b 30 20 31 20 6f   0}..  4  {0 1 o
8fb0: 66 66 7d 20 20 20 20 20 7b 30 20 30 7d 20 20 7b  ff}     {0 0}  {
8fc0: 30 20 30 7d 20 20 7b 30 20 30 7d 0a 20 20 35 20  0 0}  {0 0}.  5 
8fd0: 20 7b 30 20 31 20 6e 6f 72 6d 61 6c 7d 20 20 7b   {0 1 normal}  {
8fe0: 30 20 31 7d 20 20 7b 30 20 30 7d 20 20 7b 30 20  0 1}  {0 0}  {0 
8ff0: 32 7d 0a 20 20 36 20 20 7b 30 20 31 20 66 75 6c  2}.  6  {0 1 ful
9000: 6c 7d 20 20 20 20 7b 30 20 32 7d 20 20 7b 30 20  l}    {0 2}  {0 
9010: 31 7d 20 20 7b 30 20 32 7d 0a 0a 20 20 37 20 20  1}  {0 2}..  7  
9020: 7b 31 20 30 20 6f 66 66 7d 20 20 20 20 20 7b 30  {1 0 off}     {0
9030: 20 30 7d 20 20 7b 30 20 30 7d 20 20 7b 30 20 30   0}  {0 0}  {0 0
9040: 7d 0a 20 20 38 20 20 7b 31 20 30 20 6e 6f 72 6d  }.  8  {1 0 norm
9050: 61 6c 7d 20 20 7b 30 20 31 7d 20 20 7b 30 20 30  al}  {0 1}  {0 0
9060: 7d 20 20 7b 30 20 32 7d 0a 20 20 39 20 20 7b 31  }  {0 2}.  9  {1
9070: 20 30 20 66 75 6c 6c 7d 20 20 20 20 7b 31 20 31   0 full}    {1 1
9080: 7d 20 20 7b 31 20 30 7d 20 20 7b 30 20 32 7d 0a  }  {1 0}  {0 2}.
9090: 0a 20 20 31 30 20 7b 31 20 31 20 6f 66 66 7d 20  .  10 {1 1 off} 
90a0: 20 20 20 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d      {0 0}  {0 0}
90b0: 20 20 7b 30 20 30 7d 0a 20 20 31 31 20 7b 31 20    {0 0}.  11 {1 
90c0: 31 20 6e 6f 72 6d 61 6c 7d 20 20 7b 30 20 31 7d  1 normal}  {0 1}
90d0: 20 20 7b 30 20 30 7d 20 20 7b 30 20 32 7d 0a 20    {0 0}  {0 2}. 
90e0: 20 31 32 20 7b 31 20 31 20 66 75 6c 6c 7d 20 20   12 {1 1 full}  
90f0: 20 20 7b 30 20 32 7d 20 20 7b 30 20 31 7d 20 20    {0 2}  {0 1}  
9100: 7b 30 20 32 7d 0a 7d 20 7b 0a 20 20 66 6f 72 63  {0 2}.} {.  forc
9110: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a  edelete test.db.
9120: 0a 20 20 74 65 73 74 76 66 73 20 74 76 66 73 20  .  testvfs tvfs 
9130: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 66  -default 1.  tvf
9140: 73 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20  s filter xSync. 
9150: 20 74 76 66 73 20 73 63 72 69 70 74 20 78 53 79   tvfs script xSy
9160: 6e 63 43 62 0a 20 20 70 72 6f 63 20 78 53 79 6e  ncCb.  proc xSyn
9170: 63 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65  cCb {method file
9180: 20 66 69 6c 65 69 64 20 66 6c 61 67 73 7d 20 7b   fileid flags} {
9190: 0a 20 20 20 20 69 6e 63 72 20 3a 3a 73 79 6e 63  .    incr ::sync
91a0: 28 24 66 6c 61 67 73 29 0a 20 20 7d 0a 0a 20 20  ($flags).  }..  
91b0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
91c0: 64 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  db.  do_execsql_
91d0: 74 65 73 74 20 31 35 2e 24 74 6e 2e 31 20 22 0a  test 15.$tn.1 ".
91e0: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
91f0: 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20  size = 4096;.   
9200: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
9210: 28 78 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  (x);.    PRAGMA 
9220: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
9230: 6e 74 20 3d 20 4f 46 46 3b 0a 20 20 20 20 50 52  nt = OFF;.    PR
9240: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
9250: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 50 52 41  e = WAL;.    PRA
9260: 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66  GMA checkpoint_f
9270: 75 6c 6c 66 73 79 6e 63 20 3d 20 5b 6c 69 6e 64  ullfsync = [lind
9280: 65 78 20 24 73 65 74 74 69 6e 67 73 20 30 5d 3b  ex $settings 0];
9290: 0a 20 20 20 20 50 52 41 47 4d 41 20 66 75 6c 6c  .    PRAGMA full
92a0: 66 73 79 6e 63 20 3d 20 5b 6c 69 6e 64 65 78 20  fsync = [lindex 
92b0: 24 73 65 74 74 69 6e 67 73 20 31 5d 3b 0a 20 20  $settings 1];.  
92c0: 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
92d0: 6e 6f 75 73 20 3d 20 5b 6c 69 6e 64 65 78 20 24  nous = [lindex $
92e0: 73 65 74 74 69 6e 67 73 20 32 5d 3b 0a 20 20 22  settings 2];.  "
92f0: 20 7b 30 20 77 61 6c 7d 0a 0a 20 20 64 6f 5f 74   {0 wal}..  do_t
9300: 65 73 74 20 31 35 2e 24 74 6e 2e 32 20 7b 0a 20  est 15.$tn.2 {. 
9310: 20 20 20 73 65 74 20 73 79 6e 63 28 6e 6f 72 6d     set sync(norm
9320: 61 6c 29 20 30 0a 20 20 20 20 73 65 74 20 73 79  al) 0.    set sy
9330: 6e 63 28 66 75 6c 6c 29 20 30 0a 20 20 20 20 65  nc(full) 0.    e
9340: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
9350: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
9360: 61 62 63 27 29 20 7d 0a 20 20 20 20 6c 69 73 74  abc') }.    list
9370: 20 24 3a 3a 73 79 6e 63 28 6e 6f 72 6d 61 6c 29   $::sync(normal)
9380: 20 24 3a 3a 73 79 6e 63 28 66 75 6c 6c 29 0a 20   $::sync(full). 
9390: 20 7d 20 24 72 65 73 74 61 72 74 5f 73 79 6e 63   } $restart_sync
93a0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 35 2e 24  ..  do_test 15.$
93b0: 74 6e 2e 33 20 7b 0a 20 20 20 20 73 65 74 20 73  tn.3 {.    set s
93c0: 79 6e 63 28 6e 6f 72 6d 61 6c 29 20 30 0a 20 20  ync(normal) 0.  
93d0: 20 20 73 65 74 20 73 79 6e 63 28 66 75 6c 6c 29    set sync(full)
93e0: 20 30 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   0.    execsql {
93f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9400: 56 41 4c 55 45 53 28 27 61 62 63 27 29 20 7d 0a  VALUES('abc') }.
9410: 20 20 20 20 6c 69 73 74 20 24 3a 3a 73 79 6e 63      list $::sync
9420: 28 6e 6f 72 6d 61 6c 29 20 24 3a 3a 73 79 6e 63  (normal) $::sync
9430: 28 66 75 6c 6c 29 0a 20 20 7d 20 24 63 6f 6d 6d  (full).  } $comm
9440: 69 74 5f 73 79 6e 63 0a 0a 20 20 64 6f 5f 74 65  it_sync..  do_te
9450: 73 74 20 31 35 2e 24 74 6e 2e 34 20 7b 0a 20 20  st 15.$tn.4 {.  
9460: 20 20 73 65 74 20 73 79 6e 63 28 6e 6f 72 6d 61    set sync(norma
9470: 6c 29 20 30 0a 20 20 20 20 73 65 74 20 73 79 6e  l) 0.    set syn
9480: 63 28 66 75 6c 6c 29 20 30 0a 20 20 20 20 65 78  c(full) 0.    ex
9490: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
94a0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 64  NTO t1 VALUES('d
94b0: 65 66 27 29 20 7d 0a 20 20 20 20 6c 69 73 74 20  ef') }.    list 
94c0: 24 3a 3a 73 79 6e 63 28 6e 6f 72 6d 61 6c 29 20  $::sync(normal) 
94d0: 24 3a 3a 73 79 6e 63 28 66 75 6c 6c 29 0a 20 20  $::sync(full).  
94e0: 7d 20 24 63 6f 6d 6d 69 74 5f 73 79 6e 63 0a 0a  } $commit_sync..
94f0: 20 20 64 6f 5f 74 65 73 74 20 31 35 2e 24 74 6e    do_test 15.$tn
9500: 2e 35 20 7b 0a 20 20 20 20 73 65 74 20 73 79 6e  .5 {.    set syn
9510: 63 28 6e 6f 72 6d 61 6c 29 20 30 0a 20 20 20 20  c(normal) 0.    
9520: 73 65 74 20 73 79 6e 63 28 66 75 6c 6c 29 20 30  set sync(full) 0
9530: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
9540: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
9550: 6f 69 6e 74 20 7d 0a 20 20 20 20 6c 69 73 74 20  oint }.    list 
9560: 24 3a 3a 73 79 6e 63 28 6e 6f 72 6d 61 6c 29 20  $::sync(normal) 
9570: 24 3a 3a 73 79 6e 63 28 66 75 6c 6c 29 0a 20 20  $::sync(full).  
9580: 7d 20 24 63 6b 70 74 5f 73 79 6e 63 0a 20 20 0a  } $ckpt_sync.  .
9590: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 66    db close.  tvf
95a0: 73 20 64 65 6c 65 74 65 0a 7d 0a 0a 0a 0a 66 69  s delete.}....fi
95b0: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.