/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact de1182f52eda816f298b678f4721eb4fecba7ac99d2a72d60cd41b88b83746e4:


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 20  Groucho');.  }. 
3f60: 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73   list [file exis
3f70: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20  ts test.db-wal] 
3f80: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73  [file exists tes
3f90: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 0a 7d 20  t.db-journal].} 
3fa0: 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61  {0 1}.do_test wa
3fb0: 6c 32 2d 36 2e 33 2e 35 20 7b 0a 20 20 65 78 65  l2-6.3.5 {.  exe
3fc0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c 6f  csql { PRAGMA lo
3fd0: 63 6b 5f 73 74 61 74 75 73 20 7d 0a 7d 20 7b 6d  ck_status }.} {m
3fe0: 61 69 6e 20 65 78 63 6c 75 73 69 76 65 20 74 65  ain exclusive te
3ff0: 6d 70 20 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65  mp closed}.do_te
4000: 73 74 20 77 61 6c 32 2d 36 2e 33 2e 36 20 7b 0a  st wal2-6.3.6 {.
4010: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d    execsql { COMM
4020: 49 54 20 7d 0a 20 20 6c 69 73 74 20 5b 66 69 6c  IT }.  list [fil
4030: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
4040: 2d 77 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73  -wal] [file exis
4050: 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
4060: 61 6c 5d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74  al].} {0 1}.do_t
4070: 65 73 74 20 77 61 6c 32 2d 36 2e 33 2e 37 20 7b  est wal2-6.3.7 {
4080: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
4090: 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20  GMA lock_status 
40a0: 7d 0a 7d 20 7b 6d 61 69 6e 20 65 78 63 6c 75 73  }.} {main exclus
40b0: 69 76 65 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d  ive temp closed}
40c0: 0a 64 62 20 63 6c 6f 73 65 0a 0a 0a 23 20 54 68  .db close...# Th
40d0: 69 73 20 74 65 73 74 20 2d 20 77 61 6c 32 2d 36  is test - wal2-6
40e0: 2e 34 2e 2a 20 2d 20 75 73 65 73 20 61 20 73 69  .4.* - uses a si
40f0: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f  ngle database co
4100: 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 74 68 65  nnection and the
4110: 0a 23 20 5b 74 65 73 74 76 66 73 5d 20 69 6e 73  .# [testvfs] ins
4120: 74 72 75 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20  trumentation to 
4130: 74 65 73 74 20 74 68 61 74 20 78 53 68 6d 4c 6f  test that xShmLo
4140: 63 6b 28 29 20 69 73 20 62 65 69 6e 67 20 63 61  ck() is being ca
4150: 6c 6c 65 64 0a 23 20 61 73 20 65 78 70 65 63 74  lled.# as expect
4160: 65 64 20 77 68 65 6e 20 61 20 57 41 4c 20 64 61  ed when a WAL da
4170: 74 61 62 61 73 65 20 69 73 20 75 73 65 64 20 77  tabase is used w
4180: 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ith locking_mode
4190: 3d 65 78 63 6c 75 73 69 76 65 2e 0a 23 0a 64 6f  =exclusive..#.do
41a0: 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 34 2e 31  _test wal2-6.4.1
41b0: 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65   {.  forcedelete
41c0: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
41d0: 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75  -wal test.db-jou
41e0: 72 6e 61 6c 0a 20 20 70 72 6f 63 20 74 76 66 73  rnal.  proc tvfs
41f0: 5f 63 62 20 7b 6d 65 74 68 6f 64 20 61 72 67 73  _cb {method args
4200: 7d 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73 68  } {.    set ::sh
4210: 6d 5f 66 69 6c 65 20 5b 6c 69 6e 64 65 78 20 24  m_file [lindex $
4220: 61 72 67 73 20 30 5d 0a 20 20 20 20 69 66 20 7b  args 0].    if {
4230: 24 6d 65 74 68 6f 64 20 3d 3d 20 22 78 53 68 6d  $method == "xShm
4240: 4c 6f 63 6b 22 7d 20 7b 20 6c 61 70 70 65 6e 64  Lock"} { lappend
4250: 20 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 6e 64 65 78   ::locks [lindex
4260: 20 24 61 72 67 73 20 32 5d 20 7d 0a 20 20 20 20   $args 2] }.    
4270: 72 65 74 75 72 6e 20 22 53 51 4c 49 54 45 5f 4f  return "SQLITE_O
4280: 4b 22 0a 20 20 7d 0a 20 20 74 65 73 74 76 66 73  K".  }.  testvfs
4290: 20 74 76 66 73 0a 20 20 74 76 66 73 20 73 63 72   tvfs.  tvfs scr
42a0: 69 70 74 20 74 76 66 73 5f 63 62 0a 20 20 73 71  ipt tvfs_cb.  sq
42b0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
42c0: 20 2d 76 66 73 20 74 76 66 73 0a 20 20 73 65 74   -vfs tvfs.  set
42d0: 20 7b 7d 20 7b 7d 0a 7d 20 7b 7d 0a 0a 73 65 74   {} {}.} {}..set
42e0: 20 52 45 43 4f 56 45 52 59 20 7b 0a 20 20 7b 30   RECOVERY {.  {0
42f0: 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76   1 lock exclusiv
4300: 65 7d 20 7b 31 20 32 20 6c 6f 63 6b 20 65 78 63  e} {1 2 lock exc
4310: 6c 75 73 69 76 65 7d 20 7b 34 20 34 20 6c 6f 63  lusive} {4 4 loc
4320: 6b 20 65 78 63 6c 75 73 69 76 65 7d 0a 20 20 7b  k exclusive}.  {
4330: 31 20 32 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75  1 2 unlock exclu
4340: 73 69 76 65 7d 20 7b 34 20 34 20 75 6e 6c 6f 63  sive} {4 4 unloc
4350: 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 7b 30 20  k exclusive} {0 
4360: 31 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69  1 unlock exclusi
4370: 76 65 7d 0a 7d 0a 73 65 74 20 52 45 41 44 4d 41  ve}.}.set READMA
4380: 52 4b 30 5f 52 45 41 44 20 7b 0a 20 20 7b 33 20  RK0_READ {.  {3 
4390: 31 20 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 7b  1 lock shared} {
43a0: 33 20 31 20 75 6e 6c 6f 63 6b 20 73 68 61 72 65  3 1 unlock share
43b0: 64 7d 0a 7d 0a 73 65 74 20 52 45 41 44 4d 41 52  d}.}.set READMAR
43c0: 4b 30 5f 57 52 49 54 45 20 7b 0a 20 20 7b 33 20  K0_WRITE {.  {3 
43d0: 31 20 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 0a  1 lock shared} .
43e0: 20 20 7b 30 20 31 20 6c 6f 63 6b 20 65 78 63 6c    {0 1 lock excl
43f0: 75 73 69 76 65 7d 20 7b 33 20 31 20 75 6e 6c 6f  usive} {3 1 unlo
4400: 63 6b 20 73 68 61 72 65 64 7d 20 0a 20 20 7b 34  ck shared} .  {4
4410: 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76   1 lock exclusiv
4420: 65 7d 20 7b 34 20 31 20 75 6e 6c 6f 63 6b 20 65  e} {4 1 unlock e
4430: 78 63 6c 75 73 69 76 65 7d 20 7b 34 20 31 20 6c  xclusive} {4 1 l
4440: 6f 63 6b 20 73 68 61 72 65 64 7d 20 0a 20 20 7b  ock shared} .  {
4450: 30 20 31 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75  0 1 unlock exclu
4460: 73 69 76 65 7d 20 7b 34 20 31 20 75 6e 6c 6f 63  sive} {4 1 unloc
4470: 6b 20 73 68 61 72 65 64 7d 0a 7d 0a 73 65 74 20  k shared}.}.set 
4480: 52 45 41 44 4d 41 52 4b 31 5f 53 45 54 20 7b 0a  READMARK1_SET {.
4490: 20 20 7b 34 20 31 20 6c 6f 63 6b 20 65 78 63 6c    {4 1 lock excl
44a0: 75 73 69 76 65 7d 20 7b 34 20 31 20 75 6e 6c 6f  usive} {4 1 unlo
44b0: 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 0a 7d 0a  ck exclusive}.}.
44c0: 73 65 74 20 52 45 41 44 4d 41 52 4b 31 5f 52 45  set READMARK1_RE
44d0: 41 44 20 7b 0a 20 20 7b 34 20 31 20 6c 6f 63 6b  AD {.  {4 1 lock
44e0: 20 73 68 61 72 65 64 7d 20 7b 34 20 31 20 75 6e   shared} {4 1 un
44f0: 6c 6f 63 6b 20 73 68 61 72 65 64 7d 0a 7d 0a 73  lock shared}.}.s
4500: 65 74 20 52 45 41 44 4d 41 52 4b 31 5f 57 52 49  et READMARK1_WRI
4510: 54 45 20 7b 0a 20 20 7b 34 20 31 20 6c 6f 63 6b  TE {.  {4 1 lock
4520: 20 73 68 61 72 65 64 7d 20 0a 20 20 20 20 7b 30   shared} .    {0
4530: 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76   1 lock exclusiv
4540: 65 7d 20 7b 30 20 31 20 75 6e 6c 6f 63 6b 20 65  e} {0 1 unlock e
4550: 78 63 6c 75 73 69 76 65 7d 20 0a 20 20 7b 34 20  xclusive} .  {4 
4560: 31 20 75 6e 6c 6f 63 6b 20 73 68 61 72 65 64 7d  1 unlock shared}
4570: 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  .}..foreach {tn 
4580: 73 71 6c 20 72 65 73 20 65 78 70 65 63 74 65 64  sql res expected
4590: 5f 6c 6f 63 6b 73 7d 20 7b 0a 20 20 32 20 7b 0a  _locks} {.  2 {.
45a0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
45b0: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
45c0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
45d0: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 42  ode = WAL;.    B
45e0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
45f0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
4600: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4610: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 4c 65 6f  O t1 VALUES('Leo
4620: 6e 61 72 64 27 29 3b 0a 20 20 20 20 20 20 49 4e  nard');.      IN
4630: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4640: 55 45 53 28 27 41 72 74 68 75 72 27 29 3b 0a 20  UES('Arthur');. 
4650: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 20 7b     COMMIT;.  } {
4660: 77 61 6c 7d 20 7b 0a 20 20 20 20 24 52 45 43 4f  wal} {.    $RECO
4670: 56 45 52 59 20 0a 20 20 20 20 24 52 45 41 44 4d  VERY .    $READM
4680: 41 52 4b 30 5f 57 52 49 54 45 0a 20 20 7d 0a 0a  ARK0_WRITE.  }..
4690: 20 20 33 20 7b 0a 20 20 20 20 23 20 54 68 69 73    3 {.    # This
46a0: 20 74 65 73 74 20 73 68 6f 75 6c 64 20 64 6f 20   test should do 
46b0: 74 68 65 20 52 45 41 44 4d 41 52 4b 31 5f 53 45  the READMARK1_SE
46c0: 54 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70 6f 70  T locking to pop
46d0: 75 6c 61 74 65 20 74 68 65 20 0a 20 20 20 20 23  ulate the .    #
46e0: 20 61 52 65 61 64 4d 61 72 6b 5b 31 5d 20 73 6c   aReadMark[1] sl
46f0: 6f 74 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ot with the curr
4700: 65 6e 74 20 6d 78 46 72 61 6d 65 20 76 61 6c 75  ent mxFrame valu
4710: 65 2e 20 46 6f 6c 6c 6f 77 65 64 20 62 79 0a 20  e. Followed by. 
4720: 20 20 20 23 20 52 45 41 44 4d 41 52 4b 31 5f 52     # READMARK1_R
4730: 45 41 44 20 74 6f 20 72 65 61 64 20 74 68 65 20  EAD to read the 
4740: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 23 0a  database..    #.
4750: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4760: 4d 20 74 31 0a 20 20 7d 20 7b 4c 65 6f 6e 61 72  M t1.  } {Leonar
4770: 64 20 41 72 74 68 75 72 7d 20 7b 0a 20 20 20 20  d Arthur} {.    
4780: 24 52 45 41 44 4d 41 52 4b 31 5f 53 45 54 0a 20  $READMARK1_SET. 
4790: 20 20 20 24 52 45 41 44 4d 41 52 4b 31 5f 52 45     $READMARK1_RE
47a0: 41 44 0a 20 20 7d 0a 0a 20 20 34 20 7b 0a 20 20  AD.  }..  4 {.  
47b0: 20 20 23 20 61 52 65 61 64 4d 61 72 6b 5b 31 5d    # aReadMark[1]
47c0: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
47d0: 74 6f 20 6d 78 46 72 61 6d 65 2e 20 53 6f 20 6a  to mxFrame. So j
47e0: 75 73 74 20 52 45 41 44 4d 41 52 4b 31 5f 52 45  ust READMARK1_RE
47f0: 41 44 0a 20 20 20 20 23 20 74 68 69 73 20 74 69  AD.    # this ti
4800: 6d 65 2c 20 6e 6f 74 20 52 45 41 44 4d 41 52 4b  me, not READMARK
4810: 31 5f 53 45 54 2e 0a 20 20 20 20 23 0a 20 20 20  1_SET..    #.   
4820: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4830: 31 20 4f 52 44 45 52 20 42 59 20 78 0a 20 20 7d  1 ORDER BY x.  }
4840: 20 7b 41 72 74 68 75 72 20 4c 65 6f 6e 61 72 64   {Arthur Leonard
4850: 7d 20 7b 20 0a 20 20 20 20 24 52 45 41 44 4d 41  } { .    $READMA
4860: 52 4b 31 5f 52 45 41 44 20 0a 20 20 7d 0a 0a 20  RK1_READ .  }.. 
4870: 20 35 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20   5 {.    PRAGMA 
4880: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65  locking_mode = e
4890: 78 63 6c 75 73 69 76 65 0a 20 20 7d 20 7b 65 78  xclusive.  } {ex
48a0: 63 6c 75 73 69 76 65 7d 20 7b 20 7d 20 0a 0a 20  clusive} { } .. 
48b0: 20 36 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20   6 {.    INSERT 
48c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
48d0: 4a 75 6c 69 75 73 20 48 65 6e 72 79 27 29 3b 0a  Julius Henry');.
48e0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
48f0: 4d 20 74 31 3b 0a 20 20 7d 20 7b 4c 65 6f 6e 61  M t1;.  } {Leona
4900: 72 64 20 41 72 74 68 75 72 20 7b 4a 75 6c 69 75  rd Arthur {Juliu
4910: 73 20 48 65 6e 72 79 7d 7d 20 7b 0a 20 20 20 20  s Henry}} {.    
4920: 24 52 45 41 44 4d 41 52 4b 31 5f 52 45 41 44 0a  $READMARK1_READ.
4930: 20 20 7d 0a 0a 20 20 37 20 7b 0a 20 20 20 20 49    }..  7 {.    I
4940: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4950: 4c 55 45 53 28 27 4b 61 72 6c 27 29 3b 0a 20 20  LUES('Karl');.  
4960: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4970: 74 31 3b 0a 20 20 7d 20 7b 4c 65 6f 6e 61 72 64  t1;.  } {Leonard
4980: 20 41 72 74 68 75 72 20 7b 4a 75 6c 69 75 73 20   Arthur {Julius 
4990: 48 65 6e 72 79 7d 20 4b 61 72 6c 7d 20 7b 20 7d  Henry} Karl} { }
49a0: 0a 0a 20 20 38 20 7b 0a 20 20 20 20 50 52 41 47  ..  8 {.    PRAG
49b0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
49c0: 3d 20 6e 6f 72 6d 61 6c 0a 20 20 7d 20 7b 6e 6f  = normal.  } {no
49d0: 72 6d 61 6c 7d 20 7b 20 7d 0a 0a 20 20 39 20 7b  rmal} { }..  9 {
49e0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
49f0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 78  OM t1 ORDER BY x
4a00: 0a 20 20 7d 20 7b 41 72 74 68 75 72 20 7b 4a 75  .  } {Arthur {Ju
4a10: 6c 69 75 73 20 48 65 6e 72 79 7d 20 4b 61 72 6c  lius Henry} Karl
4a20: 20 4c 65 6f 6e 61 72 64 7d 20 24 52 45 41 44 4d   Leonard} $READM
4a30: 41 52 4b 31 5f 52 45 41 44 0a 0a 20 20 31 30 20  ARK1_READ..  10 
4a40: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31  { DELETE FROM t1
4a50: 20 7d 20 7b 7d 20 24 52 45 41 44 4d 41 52 4b 31   } {} $READMARK1
4a60: 5f 57 52 49 54 45 0a 0a 20 20 31 31 20 7b 0a 20  _WRITE..  11 {. 
4a70: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4a80: 20 74 31 0a 20 20 7d 20 7b 7d 20 7b 0a 20 20 20   t1.  } {} {.   
4a90: 20 24 52 45 41 44 4d 41 52 4b 31 5f 53 45 54 0a   $READMARK1_SET.
4aa0: 20 20 20 20 24 52 45 41 44 4d 41 52 4b 31 5f 52      $READMARK1_R
4ab0: 45 41 44 0a 20 20 7d 0a 7d 20 7b 0a 0a 20 20 73  EAD.  }.} {..  s
4ac0: 65 74 20 4c 20 5b 6c 69 73 74 5d 0a 20 20 66 6f  et L [list].  fo
4ad0: 72 65 61 63 68 20 65 6c 20 5b 73 75 62 73 74 20  reach el [subst 
4ae0: 24 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b 73 5d  $expected_locks]
4af0: 20 7b 20 6c 61 70 70 65 6e 64 20 4c 20 24 65 6c   { lappend L $el
4b00: 20 7d 0a 0a 20 20 73 65 74 20 53 20 22 22 0a 20   }..  set S "". 
4b10: 20 66 6f 72 65 61 63 68 20 73 71 20 5b 73 70 6c   foreach sq [spl
4b20: 69 74 20 24 73 71 6c 20 22 5c 6e 22 5d 20 7b 20  it $sql "\n"] { 
4b30: 0a 20 20 20 20 73 65 74 20 73 71 20 5b 73 74 72  .    set sq [str
4b40: 69 6e 67 20 74 72 69 6d 20 24 73 71 5d 0a 20 20  ing trim $sq].  
4b50: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
4b60: 74 63 68 20 7b 23 2a 7d 20 24 73 71 5d 3d 3d 30  tch {#*} $sq]==0
4b70: 7d 20 7b 61 70 70 65 6e 64 20 53 20 22 24 73 71  } {append S "$sq
4b80: 5c 6e 22 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20  \n"}.  }..  set 
4b90: 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 73 74 5d 0a 20  ::locks [list]. 
4ba0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e   do_test wal2-6.
4bb0: 34 2e 24 74 6e 2e 31 20 7b 20 65 78 65 63 73 71  4.$tn.1 { execsq
4bc0: 6c 20 24 53 20 7d 20 24 72 65 73 0a 20 20 64 6f  l $S } $res.  do
4bd0: 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 34 2e 24  _test wal2-6.4.$
4be0: 74 6e 2e 32 20 7b 20 73 65 74 20 3a 3a 6c 6f 63  tn.2 { set ::loc
4bf0: 6b 73 20 20 7d 20 24 4c 0a 7d 0a 69 66 63 61 70  ks  } $L.}.ifcap
4c00: 61 62 6c 65 20 65 6e 61 62 6c 65 5f 70 65 72 73  able enable_pers
4c10: 69 73 74 5f 77 61 6c 20 7b 0a 20 20 66 69 6c 65  ist_wal {.  file
4c20: 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74  _control_persist
4c30: 5f 77 61 6c 20 64 62 20 30 0a 7d 0a 64 62 20 63  _wal db 0.}.db c
4c40: 6c 6f 73 65 0a 74 76 66 73 20 64 65 6c 65 74 65  lose.tvfs delete
4c50: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  ..do_test wal2-6
4c60: 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  .5.1 {.  sqlite3
4c70: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
4c80: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
4c90: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
4ca0: 20 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a   0;.    PRAGMA j
4cb0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61  ournal_mode = wa
4cc0: 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f  l;.    PRAGMA lo
4cd0: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63  cking_mode = exc
4ce0: 6c 75 73 69 76 65 3b 0a 20 20 20 20 43 52 45 41  lusive;.    CREA
4cf0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
4d00: 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  );.    PRAGMA wa
4d10: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
4d20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
4d30: 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49   VALUES('I', 'II
4d40: 27 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  ');.    PRAGMA j
4d50: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3b 0a 20 20 7d  ournal_mode;.  }
4d60: 0a 7d 20 7b 77 61 6c 20 65 78 63 6c 75 73 69 76  .} {wal exclusiv
4d70: 65 20 30 20 32 20 32 20 77 61 6c 7d 0a 64 6f 5f  e 0 2 2 wal}.do_
4d80: 74 65 73 74 20 77 61 6c 32 2d 36 2e 35 2e 32 20  test wal2-6.5.2 
4d90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4da0: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
4db0: 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 3b 0a  _mode = normal;.
4dc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4dd0: 74 32 20 56 41 4c 55 45 53 28 27 49 49 49 27 2c  t2 VALUES('III',
4de0: 20 27 49 56 27 29 3b 0a 20 20 20 20 50 52 41 47   'IV');.    PRAG
4df0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
4e00: 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20  = exclusive;.   
4e10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4e20: 32 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f 72 6d 61 6c  2;.  }.} {normal
4e30: 20 65 78 63 6c 75 73 69 76 65 20 49 20 49 49 20   exclusive I II 
4e40: 49 49 49 20 49 56 7d 0a 64 6f 5f 74 65 73 74 20  III IV}.do_test 
4e50: 77 61 6c 32 2d 36 2e 35 2e 33 20 7b 0a 20 20 65  wal2-6.5.3 {.  e
4e60: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
4e70: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
4e80: 0a 7d 20 7b 30 20 32 20 32 7d 0a 64 62 20 63 6c  .} {0 2 2}.db cl
4e90: 6f 73 65 0a 0a 70 72 6f 63 20 6c 6f 63 6b 5f 63  ose..proc lock_c
4ea0: 6f 6e 74 72 6f 6c 20 7b 6d 65 74 68 6f 64 20 66  ontrol {method f
4eb0: 69 6c 65 6e 61 6d 65 20 68 61 6e 64 6c 65 20 73  ilename handle s
4ec0: 70 65 63 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68  pec} {.  foreach
4ed0: 20 7b 73 74 61 72 74 20 6e 20 6f 70 20 74 79 70   {start n op typ
4ee0: 65 7d 20 24 73 70 65 63 20 62 72 65 61 6b 0a 20  e} $spec break. 
4ef0: 20 69 66 20 7b 24 6f 70 20 3d 3d 20 22 6c 6f 63   if {$op == "loc
4f00: 6b 22 7d 20 7b 20 72 65 74 75 72 6e 20 53 51 4c  k"} { return SQL
4f10: 49 54 45 5f 49 4f 45 52 52 20 7d 0a 20 20 72 65  ITE_IOERR }.  re
4f20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
4f30: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e  .do_test wal2-6.
4f40: 36 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20  6.1 {.  testvfs 
4f50: 54 0a 20 20 54 20 73 63 72 69 70 74 20 6c 6f 63  T.  T script loc
4f60: 6b 5f 63 6f 6e 74 72 6f 6c 0a 20 20 54 20 66 69  k_control.  T fi
4f70: 6c 74 65 72 20 7b 7d 0a 20 20 73 71 6c 69 74 65  lter {}.  sqlite
4f80: 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66  3 db test.db -vf
4f90: 73 20 54 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  s T.  execsql { 
4fa0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
4fb0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 0a 20 20  lite_master }.  
4fc0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
4fd0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20   locking_mode = 
4fe0: 65 78 63 6c 75 73 69 76 65 20 7d 0a 20 20 65 78  exclusive }.  ex
4ff0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
5000: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 56  NTO t2 VALUES('V
5010: 27 2c 20 27 56 49 27 29 20 7d 0a 7d 20 7b 7d 0a  ', 'VI') }.} {}.
5020: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 36  do_test wal2-6.6
5030: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
5040: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
5050: 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 20 7d 0a  mode = normal }.
5060: 20 20 54 20 66 69 6c 74 65 72 20 78 53 68 6d 4c    T filter xShmL
5070: 6f 63 6b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ock.  execsql { 
5080: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
5090: 41 4c 55 45 53 28 27 56 49 49 27 2c 20 27 56 49  ALUES('VII', 'VI
50a0: 49 49 27 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  II') }.} {}.do_t
50b0: 65 73 74 20 77 61 6c 32 2d 36 2e 36 2e 33 20 7b  est wal2-6.6.3 {
50c0: 0a 20 20 23 20 41 74 20 74 68 69 73 20 70 6f 69  .  # At this poi
50d0: 6e 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  nt the connectio
50e0: 6e 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  n should still b
50f0: 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  e in exclusive-m
5100: 6f 64 65 2c 20 65 76 65 6e 0a 20 20 23 20 74 68  ode, even.  # th
5110: 6f 75 67 68 20 69 74 20 74 72 69 65 64 20 74 6f  ough it tried to
5120: 20 65 78 69 74 20 65 78 63 6c 75 73 69 76 65 2d   exit exclusive-
5130: 6d 6f 64 65 20 77 68 65 6e 20 63 6f 6d 6d 69 74  mode when commit
5140: 74 69 6e 67 20 74 68 65 20 49 4e 53 45 52 54 0a  ting the INSERT.
5150: 20 20 23 20 73 74 61 74 65 6d 65 6e 74 20 61 62    # statement ab
5160: 6f 76 65 2e 20 54 6f 20 65 78 69 74 20 65 78 63  ove. To exit exc
5170: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 53 51 4c  lusive mode, SQL
5180: 69 74 65 20 68 61 73 20 74 6f 20 74 61 6b 65 20  ite has to take 
5190: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 20 20 23  a read-lock .  #
51a0: 20 6f 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65   on the WAL file
51b0: 20 75 73 69 6e 67 20 78 53 68 6d 4c 6f 63 6b 28   using xShmLock(
51c0: 29 2e 20 53 69 6e 63 65 20 74 68 61 74 20 63 61  ). Since that ca
51d0: 6c 6c 20 66 61 69 6c 65 64 2c 20 69 74 20 72 65  ll failed, it re
51e0: 6d 61 69 6e 73 0a 20 20 23 20 69 6e 20 65 78 63  mains.  # in exc
51f0: 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 20 20 23  lusive mode..  #
5200: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
5210: 65 73 74 2e 64 62 20 2d 76 66 73 20 54 0a 20 20  est.db -vfs T.  
5220: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
5230: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  T * FROM t2 } db
5240: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
5250: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f   is locked}}.do_
5260: 74 65 73 74 20 77 61 6c 32 2d 36 2e 36 2e 32 20  test wal2-6.6.2 
5270: 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20  {.  db2 close.  
5280: 54 20 66 69 6c 74 65 72 20 7b 7d 0a 20 20 65 78  T filter {}.  ex
5290: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
52a0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 49  NTO t2 VALUES('I
52b0: 58 27 2c 20 27 58 27 29 20 7d 0a 7d 20 7b 7d 0a  X', 'X') }.} {}.
52c0: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 36  do_test wal2-6.6
52d0: 2e 34 20 7b 0a 20 20 23 20 54 68 69 73 20 74 69  .4 {.  # This ti
52e0: 6d 65 2c 20 77 65 20 68 61 76 65 20 73 75 63 63  me, we have succ
52f0: 65 73 73 66 75 6c 6c 79 20 65 78 69 74 65 64 20  essfully exited 
5300: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20  exclusive mode. 
5310: 53 6f 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  So the second.  
5320: 23 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  # connection can
5330: 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
5340: 73 65 2e 0a 20 20 73 71 6c 69 74 65 33 20 64 62  se..  sqlite3 db
5350: 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 54  2 test.db -vfs T
5360: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
5370: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d  LECT * FROM t2 }
5380: 20 64 62 32 0a 7d 20 7b 30 20 7b 49 20 49 49 20   db2.} {0 {I II 
5390: 49 49 49 20 49 56 20 56 20 56 49 20 56 49 49 20  III IV V VI VII 
53a0: 56 49 49 49 20 49 58 20 58 7d 7d 0a 0a 64 62 20  VIII IX X}}..db 
53b0: 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a  close.db2 close.
53c0: 54 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d  T delete..#-----
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5410: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 61 20 74 68  ----.# Test a th
5420: 65 6f 72 79 20 61 62 6f 75 74 20 74 68 65 20 63  eory about the c
5430: 68 65 63 6b 73 75 6d 20 61 6c 67 6f 72 69 74 68  hecksum algorith
5440: 6d 2e 20 54 68 65 6f 72 79 20 77 61 73 20 66 61  m. Theory was fa
5450: 6c 73 65 20 61 6e 64 20 74 68 69 73 0a 23 20 74  lse and this.# t
5460: 65 73 74 20 64 69 64 20 6e 6f 74 20 70 72 6f 76  est did not prov
5470: 6f 6b 65 20 61 20 62 75 67 2e 0a 23 0a 66 6f 72  oke a bug..#.for
5480: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
5490: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
54a0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 64 6f 5f  t.db-journal.do_
54b0: 74 65 73 74 20 77 61 6c 32 2d 37 2e 31 2e 31 20  test wal2-7.1.1 
54c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  {.  sqlite3 db t
54d0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
54e0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
54f0: 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a  ge_size = 4096;.
5500: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
5510: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
5520: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5530: 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20  t1(a, b);.  }.  
5540: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
5550: 62 0a 7d 20 7b 34 30 39 36 7d 0a 64 6f 5f 74 65  b.} {4096}.do_te
5560: 73 74 20 77 61 6c 32 2d 37 2e 31 2e 32 20 7b 0a  st wal2-7.1.2 {.
5570: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
5580: 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66  .db test2.db.  f
5590: 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62  orcecopy test.db
55a0: 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61  -wal test2.db-wa
55b0: 6c 0a 20 20 23 20 54 68 65 20 66 69 72 73 74 20  l.  # The first 
55c0: 33 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  32 bytes of the 
55d0: 57 41 4c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  WAL file contain
55e0: 20 74 68 65 20 57 41 4c 20 68 65 61 64 65 72 2e   the WAL header.
55f0: 20 4f 66 66 73 65 74 20 34 38 0a 20 20 23 20 69   Offset 48.  # i
5600: 73 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  s the first byte
5610: 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   of the checksum
5620: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 66   for the first f
5630: 72 61 6d 65 20 69 6e 20 74 68 65 20 57 41 4c 2e  rame in the WAL.
5640: 20 0a 20 20 23 20 54 68 65 20 66 6f 6c 6c 6f 77   .  # The follow
5650: 69 6e 67 20 74 68 72 65 65 20 6c 69 6e 65 73 20  ing three lines 
5660: 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 6f 6e  replaces the con
5670: 74 65 6e 74 73 20 6f 66 20 74 68 61 74 20 62 79  tents of that by
5680: 74 65 20 77 69 74 68 20 0a 20 20 23 20 61 20 64  te with .  # a d
5690: 69 66 66 65 72 65 6e 74 20 76 61 6c 75 65 2e 0a  ifferent value..
56a0: 20 20 73 65 74 20 6e 65 77 76 61 6c 20 46 46 0a    set newval FF.
56b0: 20 20 69 66 20 7b 24 6e 65 77 76 61 6c 20 3d 3d    if {$newval ==
56c0: 20 5b 68 65 78 69 6f 5f 72 65 61 64 20 74 65 73   [hexio_read tes
56d0: 74 32 2e 64 62 2d 77 61 6c 20 34 38 20 31 5d 7d  t2.db-wal 48 1]}
56e0: 20 7b 20 73 65 74 20 6e 65 77 76 61 6c 20 30 30   { set newval 00
56f0: 20 7d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65   }.  hexio_write
5700: 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 20 34 38   test2.db-wal 48
5710: 20 24 6e 65 77 76 61 6c 0a 7d 20 7b 31 7d 0a 64   $newval.} {1}.d
5720: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 37 2e 31 2e  o_test wal2-7.1.
5730: 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  3 {.  sqlite3 db
5740: 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65  2 test2.db.  exe
5750: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
5760: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 64  l_checkpoint } d
5770: 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  b2.  execsql { S
5780: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
5790: 69 74 65 5f 6d 61 73 74 65 72 20 7d 20 64 62 32  ite_master } db2
57a0: 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 64  .} {}.db close.d
57b0: 62 32 20 63 6c 6f 73 65 0a 66 6f 72 63 65 64 65  b2 close.forcede
57c0: 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73  lete test.db tes
57d0: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62  t.db-wal test.db
57e0: 2d 6a 6f 75 72 6e 61 6c 0a 64 6f 5f 74 65 73 74  -journal.do_test
57f0: 20 77 61 6c 32 2d 38 2e 31 2e 32 20 7b 0a 20 20   wal2-8.1.2 {.  
5800: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
5810: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
5820: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
5830: 61 63 75 75 6d 3d 4f 46 46 3b 0a 20 20 20 20 50  acuum=OFF;.    P
5840: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
5850: 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47  = 1024;.    PRAG
5860: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
5870: 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54  = WAL;.    CREAT
5880: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
5890: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
58a0: 31 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f  1 VALUES(zeroblo
58b0: 62 28 38 31 38 38 2a 31 30 32 30 29 29 3b 0a 20  b(8188*1020));. 
58c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
58d0: 74 32 28 79 29 3b 0a 20 20 20 20 50 52 41 47 4d  t2(y);.    PRAGM
58e0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
58f0: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
5900: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f 6f  {.    SELECT roo
5910: 74 70 61 67 65 3e 3d 38 31 39 32 20 46 52 4f 4d  tpage>=8192 FROM
5920: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
5930: 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20  HERE tbl_name = 
5940: 27 74 32 27 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a  't2';.  }.} {1}.
5950: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 38 2e 31  do_test wal2-8.1
5960: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
5970: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
5980: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
5990: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
59a0: 28 7a 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  (z);.    BEGIN;.
59b0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
59c0: 4f 20 74 33 20 56 41 4c 55 45 53 28 72 61 6e 64  O t3 VALUES(rand
59d0: 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20  omblob(900));.  
59e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
59f0: 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t3 SELECT random
5a00: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
5a10: 33 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  3;.      INSERT 
5a20: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
5a30: 68 65 6c 6c 6f 27 29 3b 0a 20 20 20 20 20 20 49  hello');.      I
5a40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
5a50: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
5a60: 39 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20  900) FROM t3;.  
5a70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5a80: 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t3 SELECT random
5a90: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
5aa0: 33 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  3;.      INSERT 
5ab0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72  INTO t3 SELECT r
5ac0: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
5ad0: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 49 4e  ROM t3;.      IN
5ae0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
5af0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
5b00: 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20  00) FROM t3;.   
5b10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5b20: 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  3 SELECT randomb
5b30: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 33  lob(900) FROM t3
5b40: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
5b50: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61  NTO t3 SELECT ra
5b60: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
5b70: 4f 4d 20 74 33 3b 0a 20 20 20 20 52 4f 4c 4c 42  OM t3;.    ROLLB
5b80: 41 43 4b 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  ACK;.  }.  execs
5b90: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
5ba0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
5bb0: 67 6f 6f 64 62 79 65 27 29 3b 0a 20 20 20 20 49  goodbye');.    I
5bc0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
5bd0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
5be0: 39 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20  900) FROM t3;.  
5bf0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
5c00: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
5c10: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 33 3b  ob(900) FROM t3;
5c20: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
5c30: 74 20 77 61 6c 32 2d 38 2e 31 2e 34 20 7b 0a 20  t wal2-8.1.4 {. 
5c40: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
5c50: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
5c60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5c70: 32 20 7d 0a 7d 20 7b 67 6f 6f 64 62 79 65 7d 0a  2 }.} {goodbye}.
5c80: 64 62 32 20 63 6c 6f 73 65 0a 64 62 20 63 6c 6f  db2 close.db clo
5c90: 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  se..#-----------
5ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
5ce0: 20 54 65 73 74 20 74 68 61 74 20 65 76 65 6e 20   Test that even 
5cf0: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  if the checksums
5d00: 20 66 6f 72 20 62 6f 74 68 20 61 72 65 20 76 61   for both are va
5d10: 6c 69 64 2c 20 69 66 20 74 68 65 20 74 77 6f 20  lid, if the two 
5d20: 63 6f 70 69 65 73 0a 23 20 6f 66 20 74 68 65 20  copies.# of the 
5d30: 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72  wal-index header
5d40: 20 69 6e 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   in the wal-inde
5d50: 78 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20  x do not match, 
5d60: 74 68 65 20 63 6c 69 65 6e 74 0a 23 20 72 75 6e  the client.# run
5d70: 73 20 28 6f 72 20 61 74 20 6c 65 61 73 74 20 74  s (or at least t
5d80: 72 69 65 73 20 74 6f 20 72 75 6e 29 20 64 61 74  ries to run) dat
5d90: 61 62 61 73 65 20 72 65 63 6f 76 65 72 79 2e 0a  abase recovery..
5da0: 23 20 0a 23 0a 70 72 6f 63 20 67 65 74 5f 6e 61  # .#.proc get_na
5db0: 6d 65 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d  me {method args}
5dc0: 20 7b 20 73 65 74 20 3a 3a 66 69 6c 65 6e 61 6d   { set ::filenam
5dd0: 65 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20  e [lindex $args 
5de0: 30 5d 20 3b 20 74 76 66 73 20 66 69 6c 74 65 72  0] ; tvfs filter
5df0: 20 7b 7d 20 7d 0a 74 65 73 74 76 66 73 20 74 76   {} }.testvfs tv
5e00: 66 73 0a 74 76 66 73 20 73 63 72 69 70 74 20 67  fs.tvfs script g
5e10: 65 74 5f 6e 61 6d 65 0a 74 76 66 73 20 66 69 6c  et_name.tvfs fil
5e20: 74 65 72 20 78 53 68 6d 4f 70 65 6e 0a 0a 66 6f  ter xShmOpen..fo
5e30: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
5e40: 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  b test.db-wal te
5e50: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 64 6f  st.db-journal.do
5e60: 5f 74 65 73 74 20 77 61 6c 32 2d 39 2e 31 20 7b  _test wal2-9.1 {
5e70: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
5e80: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 66 73 0a  st.db -vfs tvfs.
5e90: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5ea0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
5eb0: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43  ode = WAL;.    C
5ec0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 79 29  REATE TABLE x(y)
5ed0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5ee0: 4f 20 78 20 56 41 4c 55 45 53 28 27 42 61 72 74  O x VALUES('Bart
5ef0: 6f 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  on');.    INSERT
5f00: 20 49 4e 54 4f 20 78 20 56 41 4c 55 45 53 28 27   INTO x VALUES('
5f10: 44 65 61 6b 69 6e 27 29 3b 0a 20 20 7d 0a 0a 20  Deakin');.  }.. 
5f20: 20 23 20 53 65 74 20 24 77 69 68 28 31 29 20 74   # Set $wih(1) t
5f30: 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  o the contents o
5f40: 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
5f50: 68 65 61 64 65 72 20 61 66 74 65 72 0a 20 20 23  header after.  #
5f60: 20 74 68 65 20 66 72 61 6d 65 73 20 61 73 73 6f   the frames asso
5f70: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
5f80: 66 69 72 73 74 20 74 77 6f 20 72 6f 77 73 20 69  first two rows i
5f90: 6e 20 74 61 62 6c 65 20 27 78 27 20 68 61 76 65  n table 'x' have
5fa0: 0a 20 20 23 20 62 65 65 6e 20 69 6e 73 65 72 74  .  # been insert
5fb0: 65 64 2e 20 54 68 65 6e 20 69 6e 73 65 72 74 20  ed. Then insert 
5fc0: 6f 6e 65 20 6d 6f 72 65 20 72 6f 77 20 61 6e 64  one more row and
5fd0: 20 73 65 74 20 24 77 69 68 28 32 29 0a 20 20 23   set $wih(2).  #
5fe0: 20 74 6f 20 74 68 65 20 6e 65 77 20 76 61 6c 75   to the new valu
5ff0: 65 20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  e of the wal-ind
6000: 65 78 20 68 65 61 64 65 72 2e 0a 20 20 23 0a 20  ex header..  #. 
6010: 20 23 20 49 66 20 74 68 65 20 24 77 69 68 28 31   # If the $wih(1
6020: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
6030: 6f 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  o the wal-index 
6040: 62 65 66 6f 72 65 20 72 75 6e 6e 69 6e 67 0a 20  before running. 
6050: 20 23 20 61 20 72 65 61 64 20 6f 70 65 72 61 74   # a read operat
6060: 69 6f 6e 2c 20 74 68 65 20 63 6c 69 65 6e 74 20  ion, the client 
6070: 77 69 6c 6c 20 73 65 65 20 6f 6e 6c 79 20 74 68  will see only th
6080: 65 20 66 69 72 73 74 20 74 77 6f 20 72 6f 77 73  e first two rows
6090: 2e 20 49 66 0a 20 20 23 20 24 77 69 68 28 32 29  . If.  # $wih(2)
60a0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
60b0: 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20   the wal-index, 
60c0: 74 68 65 20 63 6c 69 65 6e 74 20 77 69 6c 6c 20  the client will 
60d0: 73 65 65 0a 20 20 23 20 74 68 72 65 65 20 72 6f  see.  # three ro
60e0: 77 73 2e 20 49 66 20 61 6e 20 69 6e 76 61 6c 69  ws. If an invali
60f0: 64 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  d header is writ
6100: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 77 61 6c  ten into the wal
6110: 2d 69 6e 64 65 78 2c 20 74 68 65 6e 0a 20 20 23  -index, then.  #
6120: 20 74 68 65 20 63 6c 69 65 6e 74 20 77 69 6c 6c   the client will
6130: 20 72 75 6e 20 72 65 63 6f 76 65 72 79 20 61 6e   run recovery an
6140: 64 20 73 65 65 20 74 68 72 65 65 20 72 6f 77 73  d see three rows
6150: 2e 0a 20 20 23 0a 20 20 73 65 74 20 77 69 68 28  ..  #.  set wih(
6160: 31 29 20 5b 73 65 74 5f 74 76 66 73 5f 68 64 72  1) [set_tvfs_hdr
6170: 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 5d 0a 20 20   $::filename].  
6180: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
6190: 20 49 4e 54 4f 20 78 20 56 41 4c 55 45 53 28 27   INTO x VALUES('
61a0: 57 61 74 73 6f 6e 27 29 20 7d 0a 20 20 73 65 74  Watson') }.  set
61b0: 20 77 69 68 28 32 29 20 5b 73 65 74 5f 74 76 66   wih(2) [set_tvf
61c0: 73 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e 61 6d  s_hdr $::filenam
61d0: 65 5d 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62  e]..  sqlite3 db
61e0: 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74  2 test.db -vfs t
61f0: 76 66 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  vfs.  execsql { 
6200: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 20  SELECT * FROM x 
6210: 7d 20 64 62 32 0a 7d 20 7b 42 61 72 74 6f 6e 20  } db2.} {Barton 
6220: 44 65 61 6b 69 6e 20 57 61 74 73 6f 6e 7d 0a 0a  Deakin Watson}..
6230: 66 6f 72 65 61 63 68 20 7b 74 6e 20 68 64 72 31  foreach {tn hdr1
6240: 20 68 64 72 32 20 72 65 73 7d 20 5b 6c 69 73 74   hdr2 res} [list
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6270: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
6280: 33 20 20 24 77 69 68 28 31 29 20 20 20 20 20 20  3  $wih(1)      
6290: 20 20 20 20 20 20 20 20 20 20 24 77 69 68 28 31            $wih(1
62a0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
62b0: 20 7b 42 61 72 74 6f 6e 20 44 65 61 6b 69 6e 7d   {Barton Deakin}
62c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 34 20            \.  4 
62d0: 20 24 77 69 68 28 31 29 20 20 20 20 20 20 20 20   $wih(1)        
62e0: 20 20 20 20 20 20 20 20 24 77 69 68 28 32 29 20          $wih(2) 
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
6300: 42 61 72 74 6f 6e 20 44 65 61 6b 69 6e 20 57 61  Barton Deakin Wa
6310: 74 73 6f 6e 7d 20 20 20 5c 0a 20 20 35 20 20 24  tson}   \.  5  $
6320: 77 69 68 28 32 29 20 20 20 20 20 20 20 20 20 20  wih(2)          
6330: 20 20 20 20 20 20 24 77 69 68 28 31 29 20 20 20        $wih(1)   
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 42 61               {Ba
6350: 72 74 6f 6e 20 44 65 61 6b 69 6e 20 57 61 74 73  rton Deakin Wats
6360: 6f 6e 7d 20 20 20 5c 0a 20 20 36 20 20 24 77 69  on}   \.  6  $wi
6370: 68 28 32 29 20 20 20 20 20 20 20 20 20 20 20 20  h(2)            
6380: 20 20 20 20 24 77 69 68 28 32 29 20 20 20 20 20      $wih(2)     
6390: 20 20 20 20 20 20 20 20 20 20 20 7b 42 61 72 74             {Bart
63a0: 6f 6e 20 44 65 61 6b 69 6e 20 57 61 74 73 6f 6e  on Deakin Watson
63b0: 7d 20 20 20 5c 0a 20 20 37 20 20 24 77 69 68 28  }   \.  7  $wih(
63c0: 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1)              
63d0: 20 20 24 77 69 68 28 31 29 20 20 20 20 20 20 20    $wih(1)       
63e0: 20 20 20 20 20 20 20 20 20 7b 42 61 72 74 6f 6e           {Barton
63f0: 20 44 65 61 6b 69 6e 7d 20 20 20 20 20 20 20 20   Deakin}        
6400: 20 20 5c 0a 20 20 38 20 20 7b 30 20 30 20 30 20    \.  8  {0 0 0 
6410: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20  0 0 0 0 0 0 0 0 
6420: 30 7d 20 7b 30 20 30 20 30 20 30 20 30 20 30 20  0} {0 0 0 0 0 0 
6430: 30 20 30 20 30 20 30 20 30 20 30 7d 20 7b 42 61  0 0 0 0 0 0} {Ba
6440: 72 74 6f 6e 20 44 65 61 6b 69 6e 20 57 61 74 73  rton Deakin Wats
6450: 6f 6e 7d 0a 5d 20 7b 0a 20 20 64 6f 5f 74 65 73  on}.] {.  do_tes
6460: 74 20 77 61 6c 32 2d 39 2e 24 74 6e 20 7b 0a 20  t wal2-9.$tn {. 
6470: 20 20 20 73 65 74 5f 74 76 66 73 5f 68 64 72 20     set_tvfs_hdr 
6480: 24 3a 3a 66 69 6c 65 6e 61 6d 65 20 24 68 64 72  $::filename $hdr
6490: 31 20 24 68 64 72 32 0a 20 20 20 20 65 78 65 63  1 $hdr2.    exec
64a0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
64b0: 52 4f 4d 20 78 20 7d 20 64 62 32 0a 20 20 7d 20  ROM x } db2.  } 
64c0: 24 72 65 73 0a 7d 0a 0a 64 62 32 20 63 6c 6f 73  $res.}..db2 clos
64d0: 65 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d  e.db close..#---
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6520: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c  ------.# This bl
6530: 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 77  ock of tests - w
6540: 61 6c 32 2d 31 30 2e 2a 20 2d 20 66 6f 63 75 73  al2-10.* - focus
6550: 20 6f 6e 20 74 68 65 20 6c 69 62 72 61 72 69 65   on the librarie
6560: 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 0a 23 20  s response to.# 
6570: 6e 65 77 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  new versions of 
6580: 74 68 65 20 77 61 6c 20 6f 72 20 77 61 6c 2d 69  the wal or wal-i
6590: 6e 64 65 78 20 66 6f 72 6d 61 74 73 2e 20 0a 23  ndex formats. .#
65a0: 0a 23 20 20 20 77 61 6c 32 2d 31 30 2e 31 2e 2a  .#   wal2-10.1.*
65b0: 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  : Test that the 
65c0: 6c 69 62 72 61 72 79 20 72 65 66 75 73 65 73 20  library refuses 
65d0: 74 6f 20 22 72 65 63 6f 76 65 72 22 20 61 20 6e  to "recover" a n
65e0: 65 77 20 57 41 4c 20 0a 23 20 20 20 20 20 20 20  ew WAL .#       
65f0: 20 20 20 20 20 20 20 20 20 66 6f 72 6d 61 74 2e           format.
6600: 0a 23 0a 23 20 20 20 77 61 6c 32 2d 31 30 2e 32  .#.#   wal2-10.2
6610: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68  .*: Test that th
6620: 65 20 6c 69 62 72 61 72 79 20 72 65 66 75 73 65  e library refuse
6630: 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  s to read or wri
6640: 74 65 20 61 20 64 61 74 61 62 61 73 65 0a 23 20  te a database.# 
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
6660: 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
6670: 76 65 72 73 69 6f 6e 20 69 73 20 6e 65 77 65 72  version is newer
6680: 20 74 68 61 6e 20 69 74 20 75 6e 64 65 72 73 74   than it underst
6690: 61 6e 64 73 2e 0a 23 0a 23 20 41 74 20 74 69 6d  ands..#.# At tim
66a0: 65 20 6f 66 20 77 72 69 74 69 6e 67 2c 20 74 68  e of writing, th
66b0: 65 20 6f 6e 6c 79 20 76 65 72 73 69 6f 6e 73 20  e only versions 
66c0: 6f 66 20 74 68 65 20 77 61 6c 20 61 6e 64 20 77  of the wal and w
66d0: 61 6c 2d 69 6e 64 65 78 20 66 6f 72 6d 61 74 73  al-index formats
66e0: 0a 23 20 74 68 61 74 20 65 78 69 73 74 20 61 72  .# that exist ar
66f0: 65 20 76 65 72 73 69 6f 6e 73 20 33 30 30 37 30  e versions 30070
6700: 30 30 20 28 63 6f 72 72 65 73 70 6f 6e 64 69 6e  00 (correspondin
6710: 67 20 74 6f 20 53 51 4c 69 74 65 20 76 65 72 73  g to SQLite vers
6720: 69 6f 6e 20 33 2e 37 2e 30 2c 0a 23 20 74 68 65  ion 3.7.0,.# the
6730: 20 66 69 72 73 74 20 76 65 72 73 69 6f 6e 20 6f   first version o
6740: 66 20 53 51 4c 69 74 65 20 74 6f 20 66 65 61 74  f SQLite to feat
6750: 75 72 65 20 77 61 6c 20 6d 6f 64 65 29 2e 0a 23  ure wal mode)..#
6760: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 30  .do_test wal2-10
6770: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
6780: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
6790: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
67a0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
67b0: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
67c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
67d0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52  t1(a, b);.    PR
67e0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
67f0: 69 6e 74 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  int;.    INSERT 
6800: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
6810: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
6820: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6830: 33 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 20  3, 4);.  }.  if 
6840: 7b 5b 66 6f 72 63 65 64 5f 70 72 6f 78 79 5f 6c  {[forced_proxy_l
6850: 6f 63 6b 69 6e 67 5d 7d 20 7b 0a 20 20 20 20 66  ocking]} {.    f
6860: 6f 72 63 65 63 6f 70 79 20 24 73 68 6d 70 61 74  orcecopy $shmpat
6870: 68 20 73 76 5f 74 65 73 74 2e 64 62 2d 73 68 6d  h sv_test.db-shm
6880: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
6890: 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d  save_and_close.}
68a0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32   {}.do_test wal2
68b0: 2d 31 30 2e 31 2e 32 20 7b 0a 20 20 66 61 75 6c  -10.1.2 {.  faul
68c0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
68d0: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
68e0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
68f0: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20  M t1 }.} {1 2 3 
6900: 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  4}.do_test wal2-
6910: 31 30 2e 31 2e 33 20 7b 0a 20 20 66 61 75 6c 74  10.1.3 {.  fault
6920: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
6930: 72 65 6f 70 65 6e 0a 20 20 73 65 74 20 68 64 72  reopen.  set hdr
6940: 20 5b 77 61 6c 5f 73 65 74 5f 77 61 6c 68 64 72   [wal_set_walhdr
6950: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20   test.db-wal].  
6960: 6c 69 6e 64 65 78 20 24 68 64 72 20 31 0a 7d 20  lindex $hdr 1.} 
6970: 7b 33 30 30 37 30 30 30 7d 0a 64 6f 5f 74 65 73  {3007000}.do_tes
6980: 74 20 77 61 6c 32 2d 31 30 2e 31 2e 34 20 7b 0a  t wal2-10.1.4 {.
6990: 20 20 6c 73 65 74 20 68 64 72 20 31 20 33 30 30    lset hdr 1 300
69a0: 37 30 30 31 0a 20 20 77 61 6c 5f 73 65 74 5f 77  7001.  wal_set_w
69b0: 61 6c 68 64 72 20 74 65 73 74 2e 64 62 2d 77 61  alhdr test.db-wa
69c0: 6c 20 24 68 64 72 0a 20 20 63 61 74 63 68 73 71  l $hdr.  catchsq
69d0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
69e0: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 75 6e 61  M t1 }.} {1 {una
69f0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
6a00: 62 61 73 65 20 66 69 6c 65 7d 7d 0a 0a 74 65 73  base file}}..tes
6a10: 74 76 66 73 20 74 76 66 73 20 2d 64 65 66 61 75  tvfs tvfs -defau
6a20: 6c 74 20 31 0a 64 6f 5f 74 65 73 74 20 77 61 6c  lt 1.do_test wal
6a30: 32 2d 31 30 2e 32 2e 31 20 7b 0a 20 20 66 61 75  2-10.2.1 {.  fau
6a40: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
6a50: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
6a60: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
6a70: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33  OM t1 }.} {1 2 3
6a80: 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32   4}.do_test wal2
6a90: 2d 31 30 2e 32 2e 32 20 7b 20 0a 20 20 73 65 74  -10.2.2 { .  set
6aa0: 20 68 64 72 20 5b 73 65 74 5f 74 76 66 73 5f 68   hdr [set_tvfs_h
6ab0: 64 72 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 5d 20  dr $::filename] 
6ac0: 0a 20 20 6c 69 6e 64 65 78 20 24 68 64 72 20 30  .  lindex $hdr 0
6ad0: 20 0a 7d 20 7b 33 30 30 37 30 30 30 7d 0a 64 6f   .} {3007000}.do
6ae0: 5f 74 65 73 74 20 77 61 6c 32 2d 31 30 2e 32 2e  _test wal2-10.2.
6af0: 33 20 7b 20 0a 20 20 6c 73 65 74 20 68 64 72 20  3 { .  lset hdr 
6b00: 30 20 33 30 30 37 30 30 31 0a 20 20 77 61 6c 5f  0 3007001.  wal_
6b10: 66 69 78 5f 77 61 6c 69 6e 64 65 78 5f 63 6b 73  fix_walindex_cks
6b20: 75 6d 20 68 64 72 20 0a 20 20 73 65 74 5f 74 76  um hdr .  set_tv
6b30: 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e 61  fs_hdr $::filena
6b40: 6d 65 20 24 68 64 72 0a 20 20 63 61 74 63 68 73  me $hdr.  catchs
6b50: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
6b60: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 75 6e  OM t1 }.} {1 {un
6b70: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
6b80: 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 64 62 20  abase file}}.db 
6b90: 63 6c 6f 73 65 0a 74 76 66 73 20 64 65 6c 65 74  close.tvfs delet
6ba0: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
6bf0: 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65  This block of te
6c00: 73 74 73 20 2d 20 77 61 6c 32 2d 31 31 2e 2a 20  sts - wal2-11.* 
6c10: 2d 20 74 65 73 74 73 20 74 68 61 74 20 69 74 20  - tests that it 
6c20: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
6c30: 74 6f 20 70 75 74 0a 23 20 74 68 65 20 6c 69 62  to put.# the lib
6c40: 72 61 72 79 20 69 6e 74 6f 20 61 6e 20 69 6e 66  rary into an inf
6c50: 69 6e 69 74 65 20 6c 6f 6f 70 20 62 79 20 70 72  inite loop by pr
6c60: 65 73 65 6e 74 69 6e 67 20 69 74 20 77 69 74 68  esenting it with
6c70: 20 61 20 63 6f 72 72 75 70 74 0a 23 20 68 61 73   a corrupt.# has
6c80: 68 20 74 61 62 6c 65 20 28 6f 6e 65 20 74 68 61  h table (one tha
6c90: 74 20 61 70 70 65 61 72 73 20 74 6f 20 63 6f 6e  t appears to con
6ca0: 74 61 69 6e 20 61 20 73 69 6e 67 6c 65 20 63 68  tain a single ch
6cb0: 61 69 6e 20 6f 66 20 69 6e 66 69 6e 69 74 65 20  ain of infinite 
6cc0: 0a 23 20 6c 65 6e 67 74 68 29 2e 0a 23 0a 23 20  .# length)..#.# 
6cd0: 20 20 77 61 6c 32 2d 31 31 2e 31 2e 2a 3a 20 57    wal2-11.1.*: W
6ce0: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
6cf0: 20 68 61 73 68 2d 74 61 62 6c 65 2e 0a 23 0a 23   hash-table..#.#
6d00: 20 20 20 77 61 6c 32 2d 31 31 2e 32 2e 2a 3a 20     wal2-11.2.*: 
6d10: 57 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 68  While writing th
6d20: 65 20 68 61 73 68 2d 74 61 62 6c 65 2e 0a 23 0a  e hash-table..#.
6d30: 74 65 73 74 76 66 73 20 74 76 66 73 20 2d 64 65  testvfs tvfs -de
6d40: 66 61 75 6c 74 20 31 0a 64 6f 5f 74 65 73 74 20  fault 1.do_test 
6d50: 77 61 6c 32 2d 31 31 2e 30 20 7b 0a 20 20 66 61  wal2-11.0 {.  fa
6d60: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
6d70: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
6d80: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
6d90: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
6da0: 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  AL;.    CREATE T
6db0: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29  ABLE t1(a, b, c)
6dc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6dd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
6de0: 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 3);.    INSERT
6df0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6e00: 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 49 4e  4, 5, 6);.    IN
6e10: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6e20: 55 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20  UES(7, 8, 9);.  
6e30: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6e40: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 20 31  t1;.  }.} {wal 1
6e50: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
6e60: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  }..do_test wal2-
6e70: 31 31 2e 31 2e 31 20 7b 0a 20 20 73 71 6c 69 74  11.1.1 {.  sqlit
6e80: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
6e90: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
6ea0: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
6eb0: 74 65 5f 6d 61 73 74 65 72 20 7d 20 64 62 32 0a  te_master } db2.
6ec0: 7d 20 7b 74 31 7d 0a 0a 69 66 20 7b 24 3a 3a 74  } {t1}..if {$::t
6ed0: 63 6c 5f 76 65 72 73 69 6f 6e 3e 3d 38 2e 35 7d  cl_version>=8.5}
6ee0: 20 7b 0a 20 20 23 20 53 65 74 20 61 6c 6c 20 7a   {.  # Set all z
6ef0: 65 72 6f 65 64 20 73 6c 6f 74 73 20 69 6e 20 74  eroed slots in t
6f00: 68 65 20 66 69 72 73 74 20 68 61 73 68 20 74 61  he first hash ta
6f10: 62 6c 65 20 74 6f 20 69 6e 76 61 6c 69 64 20 76  ble to invalid v
6f20: 61 6c 75 65 73 2e 0a 20 20 23 0a 20 20 73 65 74  alues..  #.  set
6f30: 20 62 6c 6f 62 20 5b 73 74 72 69 6e 67 20 72 61   blob [string ra
6f40: 6e 67 65 20 5b 74 76 66 73 20 73 68 6d 20 24 3a  nge [tvfs shm $:
6f50: 3a 66 69 6c 65 6e 61 6d 65 5d 20 30 20 31 36 33  :filename] 0 163
6f60: 38 33 5d 0a 20 20 73 65 74 20 49 20 5b 73 74 72  83].  set I [str
6f70: 69 6e 67 20 72 61 6e 67 65 20 5b 74 76 66 73 20  ing range [tvfs 
6f80: 73 68 6d 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 5d  shm $::filename]
6f90: 20 31 36 33 38 34 20 65 6e 64 5d 0a 20 20 62 69   16384 end].  bi
6fa0: 6e 61 72 79 20 73 63 61 6e 20 24 49 20 74 2a 20  nary scan $I t* 
6fb0: 4c 0a 20 20 73 65 74 20 49 20 5b 6c 69 73 74 5d  L.  set I [list]
6fc0: 0a 20 20 66 6f 72 65 61 63 68 20 70 20 24 4c 20  .  foreach p $L 
6fd0: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 49 20  {.    lappend I 
6fe0: 5b 65 78 70 72 20 24 70 20 3f 20 24 70 20 3a 20  [expr $p ? $p : 
6ff0: 34 30 30 5d 0a 20 20 7d 0a 20 20 61 70 70 65 6e  400].  }.  appen
7000: 64 20 62 6c 6f 62 20 5b 62 69 6e 61 72 79 20 66  d blob [binary f
7010: 6f 72 6d 61 74 20 74 2a 20 24 49 5d 0a 20 20 74  ormat t* $I].  t
7020: 76 66 73 20 73 68 6d 20 24 3a 3a 66 69 6c 65 6e  vfs shm $::filen
7030: 61 6d 65 20 24 62 6c 6f 62 0a 20 20 64 6f 5f 74  ame $blob.  do_t
7040: 65 73 74 20 77 61 6c 32 2d 31 31 2e 32 20 7b 0a  est wal2-11.2 {.
7050: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
7060: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7070: 4c 55 45 53 28 31 30 2c 20 31 31 2c 20 31 32 29  LUES(10, 11, 12)
7080: 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62   }.  } {1 {datab
7090: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
70a0: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 20 20  s malformed}}.  
70b0: 0a 20 20 23 20 46 69 6c 6c 20 75 70 20 74 68 65  .  # Fill up the
70c0: 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 20 74   hash table on t
70d0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
70e0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
70f0: 69 74 68 20 30 78 35 35 20 62 79 74 65 73 2e 0a  ith 0x55 bytes..
7100: 20 20 23 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b    #.  set blob [
7110: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 74 76  string range [tv
7120: 66 73 20 73 68 6d 20 24 3a 3a 66 69 6c 65 6e 61  fs shm $::filena
7130: 6d 65 5d 20 30 20 31 36 33 38 33 5d 0a 20 20 61  me] 0 16383].  a
7140: 70 70 65 6e 64 20 62 6c 6f 62 20 5b 73 74 72 69  ppend blob [stri
7150: 6e 67 20 72 65 70 65 61 74 20 5b 62 69 6e 61 72  ng repeat [binar
7160: 79 20 66 6f 72 6d 61 74 20 63 20 35 35 5d 20 31  y format c 55] 1
7170: 36 33 38 34 5d 0a 20 20 74 76 66 73 20 73 68 6d  6384].  tvfs shm
7180: 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 20 24 62 6c   $::filename $bl
7190: 6f 62 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  ob.  do_test wal
71a0: 32 2d 31 31 2e 33 20 7b 0a 20 20 20 20 63 61 74  2-11.3 {.    cat
71b0: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
71c0: 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20   FROM t1 } db2. 
71d0: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
71e0: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
71f0: 6c 66 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 64 62 20  lformed}}.}..db 
7200: 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a  close.db2 close.
7210: 74 76 66 73 20 64 65 6c 65 74 65 0a 0a 23 2d 2d  tvfs delete..#--
7220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7260: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20 61 20 63  -------.# If a c
7270: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 71  onnection is req
7280: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
7290: 61 20 57 41 4c 20 6f 72 20 53 48 4d 20 66 69 6c  a WAL or SHM fil
72a0: 65 2c 20 69 74 20 63 72 65 61 74 65 73 20 0a 23  e, it creates .#
72b0: 20 74 68 65 20 6e 65 77 20 66 69 6c 65 73 20 77   the new files w
72c0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c  ith the same fil
72d0: 65 2d 73 79 73 74 65 6d 20 70 65 72 6d 69 73 73  e-system permiss
72e0: 69 6f 6e 73 20 61 73 20 74 68 65 20 64 61 74 61  ions as the data
72f0: 62 61 73 65 20 0a 23 20 66 69 6c 65 20 69 74 73  base .# file its
7300: 65 6c 66 2e 20 54 65 73 74 20 74 68 69 73 2e 0a  elf. Test this..
7310: 23 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61  #.if {$::tcl_pla
7320: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 20  tform(platform) 
7330: 3d 3d 20 22 75 6e 69 78 22 7d 20 7b 0a 20 20 69  == "unix"} {.  i
7340: 66 20 7b 5b 66 6f 72 63 65 64 5f 70 72 6f 78 79  f {[forced_proxy
7350: 5f 6c 6f 63 6b 69 6e 67 5d 7d 20 7b 0a 20 20 20  _locking]} {.   
7360: 20 23 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65   # faultsim_dele
7370: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 64 6f  te_and_reopen do
7380: 65 73 6e 27 74 20 6b 6e 6f 77 20 61 62 6f 75 74  esn't know about
7390: 20 74 68 65 20 73 68 6d 20 66 69 6c 65 20 72 65   the shm file re
73a0: 64 69 72 65 63 74 2e 2e 2e 0a 20 20 20 20 66 6f  direct....    fo
73b0: 72 63 65 64 65 6c 65 74 65 20 24 73 68 6d 70 61  rcedelete $shmpa
73c0: 74 68 0a 20 20 7d 0a 20 20 0a 20 20 66 61 75 6c  th.  }.  .  faul
73d0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
73e0: 72 65 6f 70 65 6e 0a 20 20 23 20 43 68 61 6e 67  reopen.  # Chang
73f0: 65 64 20 6f 6e 20 32 30 31 32 2d 30 32 2d 31 33  ed on 2012-02-13
7400: 3a 20 75 6d 61 73 6b 20 69 73 20 64 65 6c 69 62  : umask is delib
7410: 65 72 61 74 65 6c 79 20 69 67 6e 6f 72 65 64 20  erately ignored 
7420: 66 6f 72 20 2d 77 61 6c 20 66 69 6c 65 73 2e 0a  for -wal files..
7430: 20 20 23 73 65 74 20 75 6d 61 73 6b 20 5b 65 78    #set umask [ex
7440: 65 63 20 2f 62 69 6e 2f 73 68 20 2d 63 20 75 6d  ec /bin/sh -c um
7450: 61 73 6b 5d 0a 20 20 73 65 74 20 75 6d 61 73 6b  ask].  set umask
7460: 20 30 0a 20 20 0a 0a 20 20 64 6f 5f 74 65 73 74   0.  ..  do_test
7470: 20 77 61 6c 32 2d 31 32 2e 31 20 7b 0a 20 20 20   wal2-12.1 {.   
7480: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
7490: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
74a0: 7b 20 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  { .      CREATE 
74b0: 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29 3b 0a  TABLE tx(y, z);.
74c0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
74d0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
74e0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 20 63 6c  .    }.    db cl
74f0: 6f 73 65 0a 20 20 20 20 6c 69 73 74 20 5b 66 69  ose.    list [fi
7500: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
7510: 62 2d 77 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69  b-wal] [file exi
7520: 73 74 73 20 24 73 68 6d 70 61 74 68 5d 0a 20 20  sts $shmpath].  
7530: 7d 20 7b 30 20 30 7d 0a 20 20 0a 20 20 66 6f 72  } {0 0}.  .  for
7540: 65 61 63 68 20 7b 74 6e 20 70 65 72 6d 69 73 73  each {tn permiss
7550: 69 6f 6e 73 7d 20 7b 0a 20 20 20 31 20 30 30 36  ions} {.   1 006
7560: 34 34 0a 20 20 20 32 20 30 30 36 36 36 0a 20 20  44.   2 00666.  
7570: 20 33 20 30 30 36 30 30 0a 20 20 20 34 20 30 30   3 00600.   4 00
7580: 37 35 35 0a 20 20 7d 20 7b 0a 20 20 20 20 73 65  755.  } {.    se
7590: 74 20 65 66 66 65 63 74 69 76 65 20 5b 66 6f 72  t effective [for
75a0: 6d 61 74 20 25 2e 35 6f 20 5b 65 78 70 72 20 24  mat %.5o [expr $
75b0: 70 65 72 6d 69 73 73 69 6f 6e 73 20 26 20 7e 24  permissions & ~$
75c0: 75 6d 61 73 6b 5d 5d 0a 20 20 20 20 64 6f 5f 74  umask]].    do_t
75d0: 65 73 74 20 77 61 6c 32 2d 31 32 2e 32 2e 24 74  est wal2-12.2.$t
75e0: 6e 2e 31 20 7b 0a 20 20 20 20 20 20 66 69 6c 65  n.1 {.      file
75f0: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
7600: 2e 64 62 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73  .db -permissions
7610: 20 24 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20 20   $permissions.  
7620: 20 20 20 20 66 69 6c 65 20 61 74 74 72 69 62 75      file attribu
7630: 74 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72  tes test.db -per
7640: 6d 69 73 73 69 6f 6e 73 0a 20 20 20 20 7d 20 24  missions.    } $
7650: 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20 20 20 20  permissions.    
7660: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 32 2e  do_test wal2-12.
7670: 32 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20  2.$tn.2 {.      
7680: 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74  list [file exist
7690: 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 5b  s test.db-wal] [
76a0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 68 6d  file exists $shm
76b0: 70 61 74 68 5d 0a 20 20 20 20 7d 20 7b 30 20 30  path].    } {0 0
76c0: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61  }.    do_test wa
76d0: 6c 32 2d 31 32 2e 32 2e 24 74 6e 2e 33 20 7b 0a  l2-12.2.$tn.3 {.
76e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
76f0: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 20 20 65   test.db.      e
7700: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
7710: 49 4e 54 4f 20 74 78 20 44 45 46 41 55 4c 54 20  INTO tx DEFAULT 
7720: 56 41 4c 55 45 53 20 7d 0a 20 20 20 20 20 20 6c  VALUES }.      l
7730: 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73  ist [file exists
7740: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 5b 66   test.db-wal] [f
7750: 69 6c 65 20 65 78 69 73 74 73 20 24 73 68 6d 70  ile exists $shmp
7760: 61 74 68 5d 0a 20 20 20 20 7d 20 7b 31 20 31 7d  ath].    } {1 1}
7770: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
7780: 32 2d 31 32 2e 32 2e 24 74 6e 2e 34 20 7b 0a 20  2-12.2.$tn.4 {. 
7790: 20 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20       list [file 
77a0: 61 74 74 72 20 74 65 73 74 2e 64 62 2d 77 61 6c  attr test.db-wal
77b0: 20 2d 70 65 72 6d 5d 20 5b 66 69 6c 65 20 61 74   -perm] [file at
77c0: 74 72 20 24 73 68 6d 70 61 74 68 20 2d 70 65 72  tr $shmpath -per
77d0: 6d 5d 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20 24  m].    } [list $
77e0: 65 66 66 65 63 74 69 76 65 20 24 65 66 66 65 63  effective $effec
77f0: 74 69 76 65 5d 0a 20 20 20 20 64 6f 5f 74 65 73  tive].    do_tes
7800: 74 20 77 61 6c 32 2d 31 32 2e 32 2e 24 74 6e 2e  t wal2-12.2.$tn.
7810: 35 20 7b 0a 20 20 20 20 20 20 69 66 63 61 70 61  5 {.      ifcapa
7820: 62 6c 65 20 65 6e 61 62 6c 65 5f 70 65 72 73 69  ble enable_persi
7830: 73 74 5f 77 61 6c 20 7b 0a 20 20 20 20 20 20 20  st_wal {.       
7840: 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65   file_control_pe
7850: 72 73 69 73 74 5f 77 61 6c 20 64 62 20 30 0a 20  rsist_wal db 0. 
7860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 20       }.      db 
7870: 63 6c 6f 73 65 0a 20 20 20 20 20 20 6c 69 73 74  close.      list
7880: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65   [file exists te
7890: 73 74 2e 64 62 2d 77 61 6c 5d 20 5b 66 69 6c 65  st.db-wal] [file
78a0: 20 65 78 69 73 74 73 20 24 73 68 6d 70 61 74 68   exists $shmpath
78b0: 5d 0a 20 20 20 20 7d 20 7b 30 20 30 7d 0a 20 20  ].    } {0 0}.  
78c0: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7910: 23 20 54 65 73 74 20 74 68 65 20 6c 69 62 72 61  # Test the libra
7920: 72 69 65 73 20 72 65 73 70 6f 6e 73 65 20 74 6f  ries response to
7930: 20 64 69 73 63 6f 76 65 72 69 6e 67 20 74 68 61   discovering tha
7940: 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  t one or more of
7950: 20 74 68 65 0a 23 20 64 61 74 61 62 61 73 65 2c   the.# database,
7960: 20 77 61 6c 20 6f 72 20 73 68 6d 20 66 69 6c 65   wal or shm file
7970: 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  s cannot be open
7980: 65 64 2c 20 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  ed, or can only 
7990: 62 65 20 6f 70 65 6e 65 64 0a 23 20 72 65 61 64  be opened.# read
79a0: 2d 6f 6e 6c 79 2e 0a 23 0a 69 66 20 7b 24 3a 3a  -only..#.if {$::
79b0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
79c0: 74 66 6f 72 6d 29 20 3d 3d 20 22 75 6e 69 78 22  tform) == "unix"
79d0: 7d 20 7b 0a 20 20 70 72 6f 63 20 70 65 72 6d 20  } {.  proc perm 
79e0: 7b 7d 20 7b 0a 20 20 20 20 73 65 74 20 4c 20 5b  {} {.    set L [
79f0: 6c 69 73 74 5d 0a 20 20 20 20 66 6f 72 65 61 63  list].    foreac
7a00: 68 20 66 20 7b 74 65 73 74 2e 64 62 20 74 65 73  h f {test.db tes
7a10: 74 2e 64 62 2d 77 61 6c 20 24 73 68 6d 70 61 74  t.db-wal $shmpat
7a20: 68 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b  h} {.      if {[
7a30: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 5d 7d  file exists $f]}
7a40: 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65   {.        lappe
7a50: 6e 64 20 4c 20 5b 66 69 6c 65 20 61 74 74 72 20  nd L [file attr 
7a60: 24 66 20 2d 70 65 72 6d 5d 0a 20 20 20 20 20 20  $f -perm].      
7a70: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
7a80: 20 6c 61 70 70 65 6e 64 20 4c 20 7b 7d 0a 20 20   lappend L {}.  
7a90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7aa0: 73 65 74 20 4c 0a 20 20 7d 0a 0a 20 20 69 66 20  set L.  }..  if 
7ab0: 7b 5b 66 6f 72 63 65 64 5f 70 72 6f 78 79 5f 6c  {[forced_proxy_l
7ac0: 6f 63 6b 69 6e 67 5d 7d 20 7b 0a 20 20 20 20 23  ocking]} {.    #
7ad0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
7ae0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 64 6f 65 73  _and_reopen does
7af0: 6e 27 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74  n't know about t
7b00: 68 65 20 73 68 6d 20 66 69 6c 65 20 72 65 64 69  he shm file redi
7b10: 72 65 63 74 2e 2e 2e 0a 20 20 20 20 66 6f 72 63  rect....    forc
7b20: 65 64 65 6c 65 74 65 20 24 73 68 6d 70 61 74 68  edelete $shmpath
7b30: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
7b40: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
7b50: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
7b60: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
7b70: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
7b80: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
7b90: 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47  (a, b);.    PRAG
7ba0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
7bb0: 74 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  t;.    INSERT IN
7bc0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 33 2e  TO t1 VALUES('3.
7bd0: 31 34 27 2c 20 27 32 2e 37 32 27 29 3b 0a 20 20  14', '2.72');.  
7be0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32  }.  do_test wal2
7bf0: 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 20 20 6c 69  -13.1.1 {.    li
7c00: 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  st [file exists 
7c10: 24 73 68 6d 70 61 74 68 5d 20 5b 66 69 6c 65 20  $shmpath] [file 
7c20: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77  exists test.db-w
7c30: 61 6c 5d 0a 20 20 7d 20 7b 31 20 31 7d 0a 20 20  al].  } {1 1}.  
7c40: 69 66 20 7b 5b 66 6f 72 63 65 64 5f 70 72 6f 78  if {[forced_prox
7c50: 79 5f 6c 6f 63 6b 69 6e 67 5d 7d 20 7b 0a 20 20  y_locking]} {.  
7c60: 20 20 66 6f 72 63 65 63 6f 70 79 20 24 73 68 6d    forcecopy $shm
7c70: 70 61 74 68 20 70 72 6f 78 79 73 76 5f 74 65 73  path proxysv_tes
7c80: 74 2e 64 62 2d 73 68 6d 20 0a 20 20 7d 0a 20 20  t.db-shm .  }.  
7c90: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e  faultsim_save_an
7ca0: 64 5f 63 6c 6f 73 65 0a 0a 20 20 66 6f 72 65 61  d_close..  forea
7cb0: 63 68 20 7b 74 6e 20 64 62 5f 70 65 72 6d 20 77  ch {tn db_perm w
7cc0: 61 6c 5f 70 65 72 6d 20 73 68 6d 5f 70 65 72 6d  al_perm shm_perm
7cd0: 20 63 61 6e 5f 6f 70 65 6e 20 63 61 6e 5f 72 65   can_open can_re
7ce0: 61 64 20 63 61 6e 5f 77 72 69 74 65 7d 20 7b 0a  ad can_write} {.
7cf0: 20 20 20 20 32 20 20 20 30 30 36 34 34 20 20 20      2   00644   
7d00: 30 30 36 34 34 20 20 20 30 30 36 34 34 20 20 20  00644   00644   
7d10: 31 20 20 20 31 20 20 20 31 0a 20 20 20 20 33 20  1   1   1.    3 
7d20: 20 20 30 30 36 34 34 20 20 20 30 30 34 30 30 20    00644   00400 
7d30: 20 20 30 30 36 34 34 20 20 20 31 20 20 20 31 20    00644   1   1 
7d40: 20 20 30 0a 20 20 20 20 34 20 20 20 30 30 36 34    0.    4   0064
7d50: 34 20 20 20 30 30 36 34 34 20 20 20 30 30 34 30  4   00644   0040
7d60: 30 20 20 20 31 20 20 20 31 20 20 20 30 0a 20 20  0   1   1   0.  
7d70: 20 20 35 20 20 20 30 30 34 30 30 20 20 20 30 30    5   00400   00
7d80: 36 34 34 20 20 20 30 30 36 34 34 20 20 20 31 20  644   00644   1 
7d90: 20 20 31 20 20 20 30 0a 0a 20 20 20 20 37 20 20    1   0..    7  
7da0: 20 30 30 36 34 34 20 20 20 30 30 30 30 30 20 20   00644   00000  
7db0: 20 30 30 36 34 34 20 20 20 31 20 20 20 30 20 20   00644   1   0  
7dc0: 20 30 0a 20 20 20 20 38 20 20 20 30 30 36 34 34   0.    8   00644
7dd0: 20 20 20 30 30 36 34 34 20 20 20 30 30 30 30 30     00644   00000
7de0: 20 20 20 31 20 20 20 30 20 20 20 30 0a 20 20 20     1   0   0.   
7df0: 20 39 20 20 20 30 30 30 30 30 20 20 20 30 30 36   9   00000   006
7e00: 34 34 20 20 20 30 30 36 34 34 20 20 20 30 20 20  44   00644   0  
7e10: 20 30 20 20 20 30 0a 20 20 7d 20 7b 0a 20 20 20   0   0.  } {.   
7e20: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
7e30: 65 0a 20 20 20 20 69 66 20 7b 5b 66 6f 72 63 65  e.    if {[force
7e40: 64 5f 70 72 6f 78 79 5f 6c 6f 63 6b 69 6e 67 5d  d_proxy_locking]
7e50: 7d 20 7b 0a 20 20 20 20 20 20 66 6f 72 63 65 63  } {.      forcec
7e60: 6f 70 79 20 70 72 6f 78 79 73 76 5f 74 65 73 74  opy proxysv_test
7e70: 2e 64 62 2d 73 68 6d 20 24 73 68 6d 70 61 74 68  .db-shm $shmpath
7e80: 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 5f    .    }.    do_
7e90: 74 65 73 74 20 77 61 6c 32 2d 31 33 2e 24 74 6e  test wal2-13.$tn
7ea0: 2e 31 20 7b 0a 20 20 20 20 20 20 66 69 6c 65 20  .1 {.      file 
7eb0: 61 74 74 72 20 74 65 73 74 2e 64 62 20 20 20 20  attr test.db    
7ec0: 20 2d 70 65 72 6d 20 24 64 62 5f 70 65 72 6d 0a   -perm $db_perm.
7ed0: 20 20 20 20 20 20 66 69 6c 65 20 61 74 74 72 20        file attr 
7ee0: 74 65 73 74 2e 64 62 2d 77 61 6c 20 2d 70 65 72  test.db-wal -per
7ef0: 6d 20 24 77 61 6c 5f 70 65 72 6d 0a 20 20 20 20  m $wal_perm.    
7f00: 20 20 66 69 6c 65 20 61 74 74 72 20 24 73 68 6d    file attr $shm
7f10: 70 61 74 68 20 2d 70 65 72 6d 20 24 73 68 6d 5f  path -perm $shm_
7f20: 70 65 72 6d 0a 0a 20 20 20 20 20 20 73 65 74 20  perm..      set 
7f30: 20 20 20 20 4c 20 5b 66 69 6c 65 20 61 74 74 72      L [file attr
7f40: 20 74 65 73 74 2e 64 62 20 2d 70 65 72 6d 5d 0a   test.db -perm].
7f50: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 4c 20        lappend L 
7f60: 5b 66 69 6c 65 20 61 74 74 72 20 74 65 73 74 2e  [file attr test.
7f70: 64 62 2d 77 61 6c 20 2d 70 65 72 6d 5d 0a 20 20  db-wal -perm].  
7f80: 20 20 20 20 6c 61 70 70 65 6e 64 20 4c 20 5b 66      lappend L [f
7f90: 69 6c 65 20 61 74 74 72 20 24 73 68 6d 70 61 74  ile attr $shmpat
7fa0: 68 20 2d 70 65 72 6d 5d 0a 20 20 20 20 7d 20 5b  h -perm].    } [
7fb0: 6c 69 73 74 20 24 64 62 5f 70 65 72 6d 20 24 77  list $db_perm $w
7fc0: 61 6c 5f 70 65 72 6d 20 24 73 68 6d 5f 70 65 72  al_perm $shm_per
7fd0: 6d 5d 0a 0a 20 20 20 20 23 20 49 66 20 24 63 61  m]..    # If $ca
7fe0: 6e 5f 6f 70 65 6e 20 69 73 20 74 72 75 65 2c 20  n_open is true, 
7ff0: 74 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 62  then it should b
8000: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
8010: 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a 20 20  en a database.  
8020: 20 20 23 20 68 61 6e 64 6c 65 2e 20 4f 74 68 65    # handle. Othe
8030: 72 77 69 73 65 2c 20 69 66 20 24 63 61 6e 5f 6f  rwise, if $can_o
8040: 70 65 6e 20 69 73 20 30 2c 20 61 74 74 65 6d 70  pen is 0, attemp
8050: 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20 74 68 65  ting to open the
8060: 20 64 62 0a 20 20 20 20 23 20 68 61 6e 64 6c 65   db.    # handle
8070: 20 74 68 72 6f 77 73 20 61 6e 20 22 75 6e 61 62   throws an "unab
8080: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
8090: 61 73 65 20 66 69 6c 65 22 20 65 78 63 65 70 74  ase file" except
80a0: 69 6f 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20 73  ion..    #.    s
80b0: 65 74 20 72 28 31 29 20 7b 30 20 6f 6b 7d 0a 20  et r(1) {0 ok}. 
80c0: 20 20 20 73 65 74 20 72 28 30 29 20 7b 31 20 7b     set r(0) {1 {
80d0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
80e0: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20  atabase file}}. 
80f0: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d     do_test wal2-
8100: 31 33 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20  13.$tn.2 {.     
8110: 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 73 71   list [catch {sq
8120: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
8130: 20 3b 20 73 65 74 20 7b 7d 20 6f 6b 7d 20 6d 73   ; set {} ok} ms
8140: 67 5d 20 24 6d 73 67 0a 20 20 20 20 7d 20 24 72  g] $msg.    } $r
8150: 28 24 63 61 6e 5f 6f 70 65 6e 29 0a 0a 20 20 20  ($can_open)..   
8160: 20 69 66 20 7b 24 63 61 6e 5f 6f 70 65 6e 7d 20   if {$can_open} 
8170: 7b 0a 20 20 20 20 20 20 23 20 44 69 66 66 65 72  {.      # Differ
8180: 65 6e 74 20 62 65 68 61 76 69 6f 72 2c 20 62 65  ent behavior, be
8190: 63 61 75 73 65 20 44 61 72 77 69 6e 20 64 6f 65  cause Darwin doe
81a0: 73 20 61 6e 20 61 63 63 65 73 73 28 29 20 63 61  s an access() ca
81b0: 6c 6c 20 70 72 69 6f 72 0a 20 20 20 20 20 20 23  ll prior.      #
81c0: 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 74   to attempting t
81d0: 6f 20 6f 70 65 6e 20 74 68 65 20 53 48 4d 20 69  o open the SHM i
81e0: 6e 20 72 65 61 64 2f 77 72 69 74 65 20 6d 6f 64  n read/write mod
81f0: 65 20 61 6e 64 20 64 65 6d 6f 74 65 73 20 74 6f  e and demotes to
8200: 0a 20 20 20 20 20 20 23 20 72 65 61 64 2d 6f 6e  .      # read-on
8210: 6c 79 20 69 66 20 74 68 65 20 53 48 4d 20 69 73  ly if the SHM is
8220: 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 20 20   read-only..    
8230: 20 20 69 66 20 7b 24 74 6e 3d 3d 34 20 26 26 20    if {$tn==4 && 
8240: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
8250: 6f 73 29 3d 3d 22 44 61 72 77 69 6e 22 7d 20 7b  os)=="Darwin"} {
8260: 73 65 74 20 63 61 6e 5f 72 65 61 64 20 31 7d 0a  set can_read 1}.
8270: 0a 20 20 20 20 20 20 23 20 49 66 20 24 63 61 6e  .      # If $can
8280: 5f 72 65 61 64 20 69 73 20 74 72 75 65 2c 20 74  _read is true, t
8290: 68 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 20 73  hen the client s
82a0: 68 6f 75 6c 64 20 62 65 20 61 62 6c 65 20 74 6f  hould be able to
82b0: 20 72 65 61 64 20 66 72 6f 6d 0a 20 20 20 20 20   read from.     
82c0: 20 23 20 74 68 65 20 64 61 74 61 62 61 73 65 20   # the database 
82d0: 66 69 6c 65 2e 20 49 66 20 24 63 61 6e 5f 72 65  file. If $can_re
82e0: 61 64 20 69 73 20 66 61 6c 73 65 2c 20 61 74 74  ad is false, att
82f0: 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 61 64 20  empting to read 
8300: 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 23 20 74  should.      # t
8310: 68 72 6f 77 20 74 68 65 20 22 75 6e 61 62 6c 65  hrow the "unable
8320: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
8330: 65 20 66 69 6c 65 22 20 65 78 63 65 70 74 69 6f  e file" exceptio
8340: 6e 2e 20 0a 20 20 20 20 20 20 23 0a 20 20 20 20  n. .      #.    
8350: 20 20 73 65 74 20 61 28 30 29 20 7b 31 20 7b 75    set a(0) {1 {u
8360: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
8370: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20  tabase file}}.  
8380: 20 20 20 20 73 65 74 20 61 28 31 29 20 7b 30 20      set a(1) {0 
8390: 7b 33 2e 31 34 20 32 2e 37 32 7d 7d 0a 20 20 20  {3.14 2.72}}.   
83a0: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d     do_test wal2-
83b0: 31 33 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 20  13.$tn.3 {.     
83c0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45     catchsql { SE
83d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
83e0: 0a 20 20 20 20 20 20 7d 20 24 61 28 24 63 61 6e  .      } $a($can
83f0: 5f 72 65 61 64 29 0a 20 20 0a 20 20 20 20 20 20  _read).  .      
8400: 23 20 4e 6f 77 20 74 72 79 20 74 6f 20 77 72 69  # Now try to wri
8410: 74 65 20 74 6f 20 74 68 65 20 64 62 20 66 69 6c  te to the db fil
8420: 65 2e 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74  e. If the client
8430: 20 63 61 6e 20 72 65 61 64 20 62 75 74 20 6e 6f   can read but no
8440: 74 0a 20 20 20 20 20 20 23 20 77 72 69 74 65 2c  t.      # write,
8450: 20 74 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20   then it should 
8460: 74 68 72 6f 77 20 74 68 65 20 66 61 6d 69 6c 69  throw the famili
8470: 61 72 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  ar "unable to op
8480: 65 6e 20 64 62 20 66 69 6c 65 22 0a 20 20 20 20  en db file".    
8490: 20 20 23 20 65 78 63 65 70 74 69 6f 6e 2e 20 49    # exception. I
84a0: 66 20 69 74 20 63 61 6e 20 72 65 61 64 20 62 75  f it can read bu
84b0: 74 20 6e 6f 74 20 77 72 69 74 65 2c 20 74 68 65  t not write, the
84c0: 20 65 78 63 65 70 74 69 6f 6e 20 73 68 6f 75 6c   exception shoul
84d0: 64 0a 20 20 20 20 20 20 23 20 62 65 20 22 61 74  d.      # be "at
84e0: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61  tempt to write a
84f0: 20 72 65 61 64 20 6f 6e 6c 79 20 64 61 74 61 62   read only datab
8500: 61 73 65 22 2e 0a 20 20 20 20 20 20 23 0a 20 20  ase"..      #.  
8510: 20 20 20 20 23 20 49 66 20 74 68 65 20 63 6c 69      # If the cli
8520: 65 6e 74 20 63 61 6e 20 72 65 61 64 20 61 6e 64  ent can read and
8530: 20 77 72 69 74 65 2c 20 74 68 65 20 6f 70 65 72   write, the oper
8540: 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 73 75 63  ation should suc
8550: 63 65 65 64 2e 0a 20 20 20 20 20 20 23 0a 20 20  ceed..      #.  
8560: 20 20 20 20 73 65 74 20 62 28 30 2c 30 29 20 7b      set b(0,0) {
8570: 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  1 {unable to ope
8580: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d  n database file}
8590: 7d 0a 20 20 20 20 20 20 73 65 74 20 62 28 31 2c  }.      set b(1,
85a0: 30 29 20 7b 31 20 7b 61 74 74 65 6d 70 74 20 74  0) {1 {attempt t
85b0: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
85c0: 6c 79 20 64 61 74 61 62 61 73 65 7d 7d 0a 20 20  ly database}}.  
85d0: 20 20 20 20 73 65 74 20 62 28 31 2c 31 29 20 7b      set b(1,1) {
85e0: 30 20 7b 7d 7d 0a 20 20 20 20 20 20 64 6f 5f 74  0 {}}.      do_t
85f0: 65 73 74 20 77 61 6c 32 2d 31 33 2e 24 74 6e 2e  est wal2-13.$tn.
8600: 34 20 7b 0a 20 20 20 20 20 20 20 20 63 61 74 63  4 {.        catc
8610: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
8620: 54 4f 20 74 31 20 44 45 46 41 55 4c 54 20 56 41  TO t1 DEFAULT VA
8630: 4c 55 45 53 20 7d 0a 20 20 20 20 20 20 7d 20 24  LUES }.      } $
8640: 62 28 24 63 61 6e 5f 72 65 61 64 2c 24 63 61 6e  b($can_read,$can
8650: 5f 77 72 69 74 65 29 0a 20 20 20 20 7d 0a 20 20  _write).    }.  
8660: 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f    catch { db clo
8670: 73 65 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d  se }.  }.}..#---
8680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86c0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
86d0: 61 74 20 22 50 52 41 47 4d 41 20 63 68 65 63 6b  at "PRAGMA check
86e0: 70 6f 69 6e 74 5f 66 75 6c 6c 73 79 6e 63 22 20  point_fullsync" 
86f0: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 77 6f  appears to be wo
8700: 72 6b 69 6e 67 2e 0a 23 0a 66 6f 72 65 61 63 68  rking..#.foreach
8710: 20 7b 74 6e 20 73 71 6c 20 72 65 73 6c 69 73 74   {tn sql reslist
8720: 7d 20 7b 0a 20 20 31 20 7b 20 7d 20 20 20 20 20  } {.  1 { }     
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 30 20              {10 
8750: 30 20 34 20 30 20 36 20 30 7d 0a 20 20 32 20 7b  0 4 0 6 0}.  2 {
8760: 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
8770: 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 3d 20 31  nt_fullfsync = 1
8780: 20 7d 20 7b 31 30 20 36 20 34 20 33 20 36 20 33   } {10 6 4 3 6 3
8790: 7d 0a 20 20 33 20 7b 20 50 52 41 47 4d 41 20 63  }.  3 { PRAGMA c
87a0: 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73  heckpoint_fullfs
87b0: 79 6e 63 20 3d 20 30 20 7d 20 7b 31 30 20 30 20  ync = 0 } {10 0 
87c0: 34 20 30 20 36 20 30 7d 0a 7d 20 7b 0a 20 20 69  4 0 6 0}.} {.  i
87d0: 66 63 61 70 61 62 6c 65 20 64 65 66 61 75 6c 74  fcapable default
87e0: 5f 63 6b 70 74 66 75 6c 6c 66 73 79 6e 63 20 7b  _ckptfullfsync {
87f0: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
8800: 20 74 72 69 6d 20 24 73 71 6c 5d 3d 3d 22 22 7d   trim $sql]==""}
8810: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 7d 0a 20 20   continue.  }.  
8820: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
8830: 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 65 78  and_reopen..  ex
8840: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 61 75  ecsql {PRAGMA au
8850: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 20 50  to_vacuum = 0; P
8860: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
8870: 73 20 3d 20 46 55 4c 4c 3b 7d 0a 20 20 65 78 65  s = FULL;}.  exe
8880: 63 73 71 6c 20 24 73 71 6c 0a 20 20 64 6f 5f 65  csql $sql.  do_e
8890: 78 65 63 73 71 6c 5f 74 65 73 74 20 77 61 6c 32  xecsql_test wal2
88a0: 2d 31 34 2e 24 74 6e 2e 30 20 7b 20 50 52 41 47  -14.$tn.0 { PRAG
88b0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34  MA page_size = 4
88c0: 30 39 36 20 7d 20 20 20 7b 7d 0a 20 20 64 6f 5f  096 }   {}.  do_
88d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 61 6c  execsql_test wal
88e0: 32 2d 31 34 2e 24 74 6e 2e 31 20 7b 20 50 52 41  2-14.$tn.1 { PRA
88f0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8900: 20 3d 20 57 41 4c 20 7d 20 7b 77 61 6c 7d 0a 0a   = WAL } {wal}..
8910: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 73 79 6e    set sqlite_syn
8920: 63 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20  c_count 0.  set 
8930: 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f  sqlite_fullsync_
8940: 63 6f 75 6e 74 20 30 0a 0a 20 20 73 65 74 20 75  count 0..  set u
8950: 73 65 72 65 73 20 24 72 65 73 6c 69 73 74 0a 0a  seres $reslist..
8960: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
8970: 74 20 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 32 20  t wal2-14.$tn.2 
8980: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c  {.    PRAGMA wal
8990: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20  _autocheckpoint 
89a0: 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45  = 10;.    CREATE
89b0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
89c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89d0: 2d 2d 20 32 20 77 61 6c 20 73 79 6e 63 73 0a 20  -- 2 wal syncs. 
89e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
89f0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 20  1 VALUES(1, 2); 
8a00: 20 20 20 20 20 20 20 20 20 2d 2d 20 32 20 77 61           -- 2 wa
8a10: 6c 20 73 79 6e 63 0a 20 20 20 20 50 52 41 47 4d  l sync.    PRAGM
8a20: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
8a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8a40: 20 2d 2d 20 31 20 77 61 6c 20 73 79 6e 63 2c 20   -- 1 wal sync, 
8a50: 31 20 64 62 20 73 79 6e 63 0a 20 20 20 20 42 45  1 db sync.    BE
8a60: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
8a70: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
8a80: 28 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 49 4e  (3, 4);.      IN
8a90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
8aa0: 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 43  UES(5, 6);.    C
8ab0: 4f 4d 4d 49 54 3b 20 20 20 20 20 20 20 20 20 20  OMMIT;          
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 20 20 20 20 2d 2d 20 32 20 77 61 6c 20 73 79       -- 2 wal sy
8ae0: 6e 63 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  nc.    PRAGMA wa
8af0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 20 20 20  l_checkpoint;   
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
8b10: 31 20 77 61 6c 20 73 79 6e 63 2c 20 31 20 64 62  1 wal sync, 1 db
8b20: 20 73 79 6e 63 0a 20 20 7d 20 7b 31 30 20 30 20   sync.  } {10 0 
8b30: 33 20 33 20 30 20 31 20 31 7d 0a 0a 20 20 64 6f  3 3 0 1 1}..  do
8b40: 5f 74 65 73 74 20 77 61 6c 32 2d 31 34 2e 24 74  _test wal2-14.$t
8b50: 6e 2e 33 20 7b 0a 20 20 20 20 63 6f 6e 64 5f 69  n.3 {.    cond_i
8b60: 6e 63 72 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 31  ncr_sync_count 1
8b70: 0a 20 20 20 20 6c 69 73 74 20 24 73 71 6c 69 74  .    list $sqlit
8b80: 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 24 73 71  e_sync_count $sq
8b90: 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  lite_fullsync_co
8ba0: 75 6e 74 0a 20 20 7d 20 5b 6c 72 61 6e 67 65 20  unt.  } [lrange 
8bb0: 24 75 73 65 72 65 73 20 30 20 31 5d 0a 0a 20 20  $useres 0 1]..  
8bc0: 73 65 74 20 73 71 6c 69 74 65 5f 73 79 6e 63 5f  set sqlite_sync_
8bd0: 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20 73 71  count 0.  set sq
8be0: 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  lite_fullsync_co
8bf0: 75 6e 74 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74  unt 0..  do_test
8c00: 20 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 34 20 7b   wal2-14.$tn.4 {
8c10: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
8c20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
8c30: 4c 55 45 53 28 37 2c 20 7a 65 72 6f 62 6c 6f 62  LUES(7, zeroblob
8c40: 28 31 32 2a 34 30 39 36 29 29 20 7d 0a 20 20 20  (12*4096)) }.   
8c50: 20 6c 69 73 74 20 24 73 71 6c 69 74 65 5f 73 79   list $sqlite_sy
8c60: 6e 63 5f 63 6f 75 6e 74 20 24 73 71 6c 69 74 65  nc_count $sqlite
8c70: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 0a  _fullsync_count.
8c80: 20 20 7d 20 5b 6c 72 61 6e 67 65 20 24 75 73 65    } [lrange $use
8c90: 72 65 73 20 32 20 33 5d 0a 0a 20 20 73 65 74 20  res 2 3]..  set 
8ca0: 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e  sqlite_sync_coun
8cb0: 74 20 30 0a 20 20 73 65 74 20 73 71 6c 69 74 65  t 0.  set sqlite
8cc0: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
8cd0: 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  0..  do_test wal
8ce0: 32 2d 31 34 2e 24 74 6e 2e 35 20 7b 0a 20 20 20  2-14.$tn.5 {.   
8cf0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
8d00: 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  A wal_autocheckp
8d10: 6f 69 6e 74 20 3d 20 31 30 30 30 20 7d 0a 20 20  oint = 1000 }.  
8d20: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
8d30: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
8d40: 53 28 39 2c 20 31 30 29 20 7d 0a 20 20 20 20 65  S(9, 10) }.    e
8d50: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
8d60: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
8d70: 31 2c 20 31 32 29 20 7d 0a 20 20 20 20 65 78 65  1, 12) }.    exe
8d80: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
8d90: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 33 2c  TO t1 VALUES(13,
8da0: 20 31 34 29 20 7d 0a 20 20 20 20 64 62 20 63 6c   14) }.    db cl
8db0: 6f 73 65 0a 20 20 20 20 6c 69 73 74 20 24 73 71  ose.    list $sq
8dc0: 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  lite_sync_count 
8dd0: 24 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63  $sqlite_fullsync
8de0: 5f 63 6f 75 6e 74 0a 20 20 7d 20 5b 6c 72 61 6e  _count.  } [lran
8df0: 67 65 20 24 75 73 65 72 65 73 20 34 20 35 5d 0a  ge $useres 4 5].
8e00: 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c  }..catch { db cl
8e10: 6f 73 65 20 7d 0a 0a 23 20 50 52 41 47 4d 41 20  ose }..# PRAGMA 
8e20: 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 73  checkpoint_fulls
8e30: 79 6e 63 0a 23 20 50 52 41 47 4d 41 20 66 75 6c  ync.# PRAGMA ful
8e40: 6c 66 73 79 6e 63 0a 23 20 50 52 41 47 4d 41 20  lfsync.# PRAGMA 
8e50: 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 23 0a 66 6f  synchronous.#.fo
8e60: 72 65 61 63 68 20 7b 74 6e 20 73 65 74 74 69 6e  reach {tn settin
8e70: 67 73 20 72 65 73 74 61 72 74 5f 73 79 6e 63 20  gs restart_sync 
8e80: 63 6f 6d 6d 69 74 5f 73 79 6e 63 20 63 6b 70 74  commit_sync ckpt
8e90: 5f 73 79 6e 63 7d 20 7b 0a 20 20 31 20 20 7b 30  _sync} {.  1  {0
8ea0: 20 30 20 6f 66 66 7d 20 20 20 20 20 7b 30 20 30   0 off}     {0 0
8eb0: 7d 20 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d 0a  }  {0 0}  {0 0}.
8ec0: 20 20 32 20 20 7b 30 20 30 20 6e 6f 72 6d 61 6c    2  {0 0 normal
8ed0: 7d 20 20 7b 31 20 30 7d 20 20 7b 30 20 30 7d 20  }  {1 0}  {0 0} 
8ee0: 20 7b 32 20 30 7d 0a 20 20 33 20 20 7b 30 20 30   {2 0}.  3  {0 0
8ef0: 20 66 75 6c 6c 7d 20 20 20 20 7b 32 20 30 7d 20   full}    {2 0} 
8f00: 20 7b 31 20 30 7d 20 20 7b 32 20 30 7d 0a 0a 20   {1 0}  {2 0}.. 
8f10: 20 34 20 20 7b 30 20 31 20 6f 66 66 7d 20 20 20   4  {0 1 off}   
8f20: 20 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d 20 20    {0 0}  {0 0}  
8f30: 7b 30 20 30 7d 0a 20 20 35 20 20 7b 30 20 31 20  {0 0}.  5  {0 1 
8f40: 6e 6f 72 6d 61 6c 7d 20 20 7b 30 20 31 7d 20 20  normal}  {0 1}  
8f50: 7b 30 20 30 7d 20 20 7b 30 20 32 7d 0a 20 20 36  {0 0}  {0 2}.  6
8f60: 20 20 7b 30 20 31 20 66 75 6c 6c 7d 20 20 20 20    {0 1 full}    
8f70: 7b 30 20 32 7d 20 20 7b 30 20 31 7d 20 20 7b 30  {0 2}  {0 1}  {0
8f80: 20 32 7d 0a 0a 20 20 37 20 20 7b 31 20 30 20 6f   2}..  7  {1 0 o
8f90: 66 66 7d 20 20 20 20 20 7b 30 20 30 7d 20 20 7b  ff}     {0 0}  {
8fa0: 30 20 30 7d 20 20 7b 30 20 30 7d 0a 20 20 38 20  0 0}  {0 0}.  8 
8fb0: 20 7b 31 20 30 20 6e 6f 72 6d 61 6c 7d 20 20 7b   {1 0 normal}  {
8fc0: 30 20 31 7d 20 20 7b 30 20 30 7d 20 20 7b 30 20  0 1}  {0 0}  {0 
8fd0: 32 7d 0a 20 20 39 20 20 7b 31 20 30 20 66 75 6c  2}.  9  {1 0 ful
8fe0: 6c 7d 20 20 20 20 7b 31 20 31 7d 20 20 7b 31 20  l}    {1 1}  {1 
8ff0: 30 7d 20 20 7b 30 20 32 7d 0a 0a 20 20 31 30 20  0}  {0 2}..  10 
9000: 7b 31 20 31 20 6f 66 66 7d 20 20 20 20 20 7b 30  {1 1 off}     {0
9010: 20 30 7d 20 20 7b 30 20 30 7d 20 20 7b 30 20 30   0}  {0 0}  {0 0
9020: 7d 0a 20 20 31 31 20 7b 31 20 31 20 6e 6f 72 6d  }.  11 {1 1 norm
9030: 61 6c 7d 20 20 7b 30 20 31 7d 20 20 7b 30 20 30  al}  {0 1}  {0 0
9040: 7d 20 20 7b 30 20 32 7d 0a 20 20 31 32 20 7b 31  }  {0 2}.  12 {1
9050: 20 31 20 66 75 6c 6c 7d 20 20 20 20 7b 30 20 32   1 full}    {0 2
9060: 7d 20 20 7b 30 20 31 7d 20 20 7b 30 20 32 7d 0a  }  {0 1}  {0 2}.
9070: 7d 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74  } {.  forcedelet
9080: 65 20 74 65 73 74 2e 64 62 0a 0a 20 20 74 65 73  e test.db..  tes
9090: 74 76 66 73 20 74 76 66 73 20 2d 64 65 66 61 75  tvfs tvfs -defau
90a0: 6c 74 20 31 0a 20 20 74 76 66 73 20 66 69 6c 74  lt 1.  tvfs filt
90b0: 65 72 20 78 53 79 6e 63 0a 20 20 74 76 66 73 20  er xSync.  tvfs 
90c0: 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 20  script xSyncCb. 
90d0: 20 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 6d   proc xSyncCb {m
90e0: 65 74 68 6f 64 20 66 69 6c 65 20 66 69 6c 65 69  ethod file filei
90f0: 64 20 66 6c 61 67 73 7d 20 7b 0a 20 20 20 20 69  d flags} {.    i
9100: 6e 63 72 20 3a 3a 73 79 6e 63 28 24 66 6c 61 67  ncr ::sync($flag
9110: 73 29 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  s).  }..  sqlite
9120: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
9130: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
9140: 35 2e 24 74 6e 2e 31 20 22 0a 20 20 20 20 50 52  5.$tn.1 ".    PR
9150: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
9160: 20 34 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54   4096;.    CREAT
9170: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
9180: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75     PRAGMA wal_au
9190: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 4f  tocheckpoint = O
91a0: 46 46 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  FF;.    PRAGMA j
91b0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
91c0: 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 68  L;.    PRAGMA ch
91d0: 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79  eckpoint_fullfsy
91e0: 6e 63 20 3d 20 5b 6c 69 6e 64 65 78 20 24 73 65  nc = [lindex $se
91f0: 74 74 69 6e 67 73 20 30 5d 3b 0a 20 20 20 20 50  ttings 0];.    P
9200: 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20  RAGMA fullfsync 
9210: 3d 20 5b 6c 69 6e 64 65 78 20 24 73 65 74 74 69  = [lindex $setti
9220: 6e 67 73 20 31 5d 3b 0a 20 20 20 20 50 52 41 47  ngs 1];.    PRAG
9230: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
9240: 20 5b 6c 69 6e 64 65 78 20 24 73 65 74 74 69 6e   [lindex $settin
9250: 67 73 20 32 5d 3b 0a 20 20 22 20 7b 30 20 77 61  gs 2];.  " {0 wa
9260: 6c 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 35  l}..  do_test 15
9270: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 65 74  .$tn.2 {.    set
9280: 20 73 79 6e 63 28 6e 6f 72 6d 61 6c 29 20 30 0a   sync(normal) 0.
9290: 20 20 20 20 73 65 74 20 73 79 6e 63 28 66 75 6c      set sync(ful
92a0: 6c 29 20 30 0a 20 20 20 20 65 78 65 63 73 71 6c  l) 0.    execsql
92b0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
92c0: 31 20 56 41 4c 55 45 53 28 27 61 62 63 27 29 20  1 VALUES('abc') 
92d0: 7d 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a 73 79  }.    list $::sy
92e0: 6e 63 28 6e 6f 72 6d 61 6c 29 20 24 3a 3a 73 79  nc(normal) $::sy
92f0: 6e 63 28 66 75 6c 6c 29 0a 20 20 7d 20 24 72 65  nc(full).  } $re
9300: 73 74 61 72 74 5f 73 79 6e 63 0a 0a 20 20 64 6f  start_sync..  do
9310: 5f 74 65 73 74 20 31 35 2e 24 74 6e 2e 33 20 7b  _test 15.$tn.3 {
9320: 0a 20 20 20 20 73 65 74 20 73 79 6e 63 28 6e 6f  .    set sync(no
9330: 72 6d 61 6c 29 20 30 0a 20 20 20 20 73 65 74 20  rmal) 0.    set 
9340: 73 79 6e 63 28 66 75 6c 6c 29 20 30 0a 20 20 20  sync(full) 0.   
9350: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
9360: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
9370: 28 27 61 62 63 27 29 20 7d 0a 20 20 20 20 6c 69  ('abc') }.    li
9380: 73 74 20 24 3a 3a 73 79 6e 63 28 6e 6f 72 6d 61  st $::sync(norma
9390: 6c 29 20 24 3a 3a 73 79 6e 63 28 66 75 6c 6c 29  l) $::sync(full)
93a0: 0a 20 20 7d 20 24 63 6f 6d 6d 69 74 5f 73 79 6e  .  } $commit_syn
93b0: 63 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 35 2e  c..  do_test 15.
93c0: 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73 65 74 20  $tn.4 {.    set 
93d0: 73 79 6e 63 28 6e 6f 72 6d 61 6c 29 20 30 0a 20  sync(normal) 0. 
93e0: 20 20 20 73 65 74 20 73 79 6e 63 28 66 75 6c 6c     set sync(full
93f0: 29 20 30 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ) 0.    execsql 
9400: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
9410: 20 56 41 4c 55 45 53 28 27 64 65 66 27 29 20 7d   VALUES('def') }
9420: 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a 73 79 6e  .    list $::syn
9430: 63 28 6e 6f 72 6d 61 6c 29 20 24 3a 3a 73 79 6e  c(normal) $::syn
9440: 63 28 66 75 6c 6c 29 0a 20 20 7d 20 24 63 6f 6d  c(full).  } $com
9450: 6d 69 74 5f 73 79 6e 63 0a 0a 20 20 64 6f 5f 74  mit_sync..  do_t
9460: 65 73 74 20 31 35 2e 24 74 6e 2e 35 20 7b 0a 20  est 15.$tn.5 {. 
9470: 20 20 20 73 65 74 20 73 79 6e 63 28 6e 6f 72 6d     set sync(norm
9480: 61 6c 29 20 30 0a 20 20 20 20 73 65 74 20 73 79  al) 0.    set sy
9490: 6e 63 28 66 75 6c 6c 29 20 30 0a 20 20 20 20 65  nc(full) 0.    e
94a0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
94b0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
94c0: 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a 73 79 6e  .    list $::syn
94d0: 63 28 6e 6f 72 6d 61 6c 29 20 24 3a 3a 73 79 6e  c(normal) $::syn
94e0: 63 28 66 75 6c 6c 29 0a 20 20 7d 20 24 63 6b 70  c(full).  } $ckp
94f0: 74 5f 73 79 6e 63 0a 20 20 0a 20 20 64 62 20 63  t_sync.  .  db c
9500: 6c 6f 73 65 0a 20 20 74 76 66 73 20 64 65 6c 65  lose.  tvfs dele
9510: 74 65 0a 7d 0a 0a 0a 0a 66 69 6e 69 73 68 5f 74  te.}....finish_t
9520: 65 73 74 0a                                      est.