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

Artifact 537f59e5c5932e3b45bf3591ae3e48a2601360c2e52821b633e222fe6ebd5b09:


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 0a 73 65 74 20 73 71 6c 69 74 65 5f  n }..set sqlite_
02f0: 73 79 6e 63 5f 63 6f 75 6e 74 20 30 0a 70 72 6f  sync_count 0.pro
0300: 63 20 63 6f 6e 64 5f 69 6e 63 72 5f 73 79 6e 63  c cond_incr_sync
0310: 5f 63 6f 75 6e 74 20 7b 61 64 6a 7d 20 7b 0a 20  _count {adj} {. 
0320: 20 67 6c 6f 62 61 6c 20 73 71 6c 69 74 65 5f 73   global sqlite_s
0330: 79 6e 63 5f 63 6f 75 6e 74 0a 20 20 69 66 20 7b  ync_count.  if {
0340: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
0350: 70 6c 61 74 66 6f 72 6d 29 20 3d 3d 20 22 77 69  platform) == "wi
0360: 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20 69 6e  ndows"} {.    in
0370: 63 72 20 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63  cr sqlite_sync_c
0380: 6f 75 6e 74 20 24 61 64 6a 0a 20 20 7d 20 7b 0a  ount $adj.  } {.
0390: 20 20 20 20 69 66 63 61 70 61 62 6c 65 20 21 64      ifcapable !d
03a0: 69 72 73 79 6e 63 20 7b 0a 20 20 20 20 20 20 69  irsync {.      i
03b0: 6e 63 72 20 73 71 6c 69 74 65 5f 73 79 6e 63 5f  ncr sqlite_sync_
03c0: 63 6f 75 6e 74 20 24 61 64 6a 0a 20 20 20 20 7d  count $adj.    }
03d0: 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 73 65 74  .  }.}..proc set
03e0: 5f 74 76 66 73 5f 68 64 72 20 7b 66 69 6c 65 20  _tvfs_hdr {file 
03f0: 61 72 67 73 7d 20 7b 0a 0a 20 20 23 20 53 65 74  args} {..  # Set
0400: 20 24 6e 48 64 72 20 74 6f 20 74 68 65 20 6e 75   $nHdr to the nu
0410: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
0420: 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 68   the wal-index h
0430: 65 61 64 65 72 3a 0a 20 20 73 65 74 20 6e 48 64  eader:.  set nHd
0440: 72 20 34 38 0a 20 20 73 65 74 20 6e 49 6e 74 20  r 48.  set nInt 
0450: 5b 65 78 70 72 20 7b 24 6e 48 64 72 2f 34 7d 5d  [expr {$nHdr/4}]
0460: 0a 0a 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68  ..  if {[llength
0470: 20 24 61 72 67 73 5d 3e 32 7d 20 7b 0a 20 20 20   $args]>2} {.   
0480: 20 65 72 72 6f 72 20 7b 77 72 6f 6e 67 20 23 20   error {wrong # 
0490: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
04a0: 22 73 65 74 5f 74 76 66 73 5f 68 64 72 20 66 69  "set_tvfs_hdr fi
04b0: 6c 65 4e 61 6d 65 20 3f 76 61 6c 31 3f 20 3f 76  leName ?val1? ?v
04c0: 61 6c 32 3f 22 7d 0a 20 20 7d 0a 0a 20 20 73 65  al2?"}.  }..  se
04d0: 74 20 62 6c 6f 62 20 5b 74 76 66 73 20 73 68 6d  t blob [tvfs shm
04e0: 20 24 66 69 6c 65 5d 0a 20 20 69 66 20 7b 24 3a   $file].  if {$:
04f0: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 62 79  :tcl_platform(by
0500: 74 65 4f 72 64 65 72 29 3d 3d 22 62 69 67 45 6e  teOrder)=="bigEn
0510: 64 69 61 6e 22 7d 20 7b 73 65 74 20 66 6d 74 20  dian"} {set fmt 
0520: 49 7d 20 7b 73 65 74 20 66 6d 74 20 69 7d 0a 0a  I} {set fmt i}..
0530: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
0540: 61 72 67 73 5d 7d 20 7b 0a 20 20 20 20 73 65 74  args]} {.    set
0550: 20 69 61 20 5b 6c 69 6e 64 65 78 20 24 61 72 67   ia [lindex $arg
0560: 73 20 30 5d 0a 20 20 20 20 73 65 74 20 69 62 20  s 0].    set ib 
0570: 24 69 61 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65  $ia.    if {[lle
0580: 6e 67 74 68 20 24 61 72 67 73 5d 3d 3d 32 7d 20  ngth $args]==2} 
0590: 7b 0a 20 20 20 20 20 20 73 65 74 20 69 62 20 5b  {.      set ib [
05a0: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 31 5d 0a  lindex $args 1].
05b0: 20 20 20 20 7d 0a 20 20 20 20 62 69 6e 61 72 79      }.    binary
05c0: 20 73 63 61 6e 20 24 62 6c 6f 62 20 61 5b 65 78   scan $blob a[ex
05d0: 70 72 20 24 6e 48 64 72 2a 32 5d 61 2a 20 64 75  pr $nHdr*2]a* du
05e0: 6d 6d 79 20 74 61 69 6c 0a 20 20 20 20 73 65 74  mmy tail.    set
05f0: 20 62 6c 6f 62 20 5b 62 69 6e 61 72 79 20 66 6f   blob [binary fo
0600: 72 6d 61 74 20 24 7b 66 6d 74 7d 24 7b 6e 49 6e  rmat ${fmt}${nIn
0610: 74 7d 24 7b 66 6d 74 7d 24 7b 6e 49 6e 74 7d 61  t}${fmt}${nInt}a
0620: 2a 20 24 69 61 20 24 69 62 20 24 74 61 69 6c 5d  * $ia $ib $tail]
0630: 0a 20 20 20 20 74 76 66 73 20 73 68 6d 20 24 66  .    tvfs shm $f
0640: 69 6c 65 20 24 62 6c 6f 62 0a 20 20 7d 0a 0a 20  ile $blob.  }.. 
0650: 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 62 6c   binary scan $bl
0660: 6f 62 20 24 7b 66 6d 74 7d 24 7b 6e 49 6e 74 7d  ob ${fmt}${nInt}
0670: 20 69 6e 74 73 0a 20 20 72 65 74 75 72 6e 20 24   ints.  return $
0680: 69 6e 74 73 0a 7d 0a 0a 70 72 6f 63 20 69 6e 63  ints.}..proc inc
0690: 72 5f 74 76 66 73 5f 68 64 72 20 7b 66 69 6c 65  r_tvfs_hdr {file
06a0: 20 69 64 78 20 69 6e 63 72 76 61 6c 7d 20 7b 0a   idx incrval} {.
06b0: 20 20 73 65 74 20 69 6e 74 73 20 5b 73 65 74 5f    set ints [set_
06c0: 74 76 66 73 5f 68 64 72 20 24 66 69 6c 65 5d 0a  tvfs_hdr $file].
06d0: 20 20 73 65 74 20 76 20 5b 6c 69 6e 64 65 78 20    set v [lindex 
06e0: 24 69 6e 74 73 20 24 69 64 78 5d 0a 20 20 69 6e  $ints $idx].  in
06f0: 63 72 20 76 20 24 69 6e 63 72 76 61 6c 0a 20 20  cr v $incrval.  
0700: 6c 73 65 74 20 69 6e 74 73 20 24 69 64 78 20 24  lset ints $idx $
0710: 76 0a 20 20 73 65 74 5f 74 76 66 73 5f 68 64 72  v.  set_tvfs_hdr
0720: 20 24 66 69 6c 65 20 24 69 6e 74 73 0a 7d 0a 0a   $file $ints.}..
0730: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
0780: 73 74 20 63 61 73 65 20 77 61 6c 32 2d 31 2e 2a  st case wal2-1.*
0790: 3a 0a 23 0a 23 20 53 65 74 20 75 70 20 61 20 73  :.#.# Set up a s
07a0: 6d 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f  mall database co
07b0: 6e 74 61 69 6e 69 6e 67 20 61 20 73 69 6e 67 6c  ntaining a singl
07c0: 65 20 74 61 62 6c 65 2e 20 54 68 65 20 64 61 74  e table. The dat
07d0: 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 23 20 63  abase is not.# c
07e0: 68 65 63 6b 70 6f 69 6e 74 65 64 20 64 75 72 69  heckpointed duri
07f0: 6e 67 20 74 68 65 20 74 65 73 74 20 2d 20 61 6c  ng the test - al
0800: 6c 20 63 6f 6e 74 65 6e 74 20 72 65 73 69 64 65  l content reside
0810: 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
0820: 65 2e 0a 23 0a 23 20 54 77 6f 20 63 6f 6e 6e 65  e..#.# Two conne
0830: 63 74 69 6f 6e 73 20 61 72 65 20 65 73 74 61 62  ctions are estab
0840: 6c 69 73 68 65 64 20 74 6f 20 74 68 65 20 64 61  lished to the da
0850: 74 61 62 61 73 65 20 66 69 6c 65 20 2d 20 61 20  tabase file - a 
0860: 77 72 69 74 65 72 20 28 5b 64 62 5d 29 0a 23 20  writer ([db]).# 
0870: 61 6e 64 20 61 20 72 65 61 64 65 72 20 28 5b 64  and a reader ([d
0880: 62 32 5d 29 2e 20 46 6f 72 20 65 61 63 68 20 6f  b2]). For each o
0890: 66 20 74 68 65 20 38 20 69 6e 74 65 67 65 72 20  f the 8 integer 
08a0: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 77 61  fields in the wa
08b0: 6c 2d 69 6e 64 65 78 0a 23 20 68 65 61 64 65 72  l-index.# header
08c0: 20 28 36 20 66 69 65 6c 64 73 20 61 6e 64 20 32   (6 fields and 2
08d0: 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 73   checksum values
08e0: 29 2c 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ), do the follow
08f0: 69 6e 67 3a 0a 23 0a 23 20 20 20 31 2e 20 4d 6f  ing:.#.#   1. Mo
0900: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
0910: 65 20 75 73 69 6e 67 20 74 68 65 20 77 72 69 74  e using the writ
0920: 65 72 2e 0a 23 0a 23 20 20 20 32 2e 20 41 74 74  er..#.#   2. Att
0930: 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65  empt to read the
0940: 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
0950: 74 68 65 20 72 65 61 64 65 72 2e 20 42 65 66 6f  the reader. Befo
0960: 72 65 20 74 68 65 20 72 65 61 64 65 72 0a 23 20  re the reader.# 
0970: 20 20 20 20 20 68 61 73 20 61 20 63 68 61 6e 63       has a chanc
0980: 65 20 74 6f 20 73 6e 61 70 73 68 6f 74 20 74 68  e to snapshot th
0990: 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64  e wal-index head
09a0: 65 72 2c 20 69 6e 63 72 65 6d 65 6e 74 20 6f 6e  er, increment on
09b0: 65 0a 23 20 20 20 20 20 20 6f 66 20 74 68 65 20  e.#      of the 
09c0: 69 6e 74 65 67 65 72 20 66 69 65 6c 64 73 20 28  integer fields (
09d0: 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 61 64  so that the read
09e0: 65 72 20 65 6e 64 73 20 75 70 20 77 69 74 68 20  er ends up with 
09f0: 61 20 63 6f 72 72 75 70 74 65 64 0a 23 20 20 20  a corrupted.#   
0a00: 20 20 20 68 65 61 64 65 72 29 2e 0a 23 0a 23 20     header)..#.# 
0a10: 20 20 33 2e 20 43 68 65 63 6b 20 74 68 61 74 20    3. Check that 
0a20: 74 68 65 20 72 65 61 64 65 72 20 72 65 63 6f 76  the reader recov
0a30: 65 72 73 20 74 68 65 20 77 61 6c 2d 69 6e 64 65  ers the wal-inde
0a40: 78 20 61 6e 64 20 72 65 61 64 73 20 74 68 65 20  x and reads the 
0a50: 63 6f 72 72 65 63 74 0a 23 20 20 20 20 20 20 64  correct.#      d
0a60: 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 2e  atabase content.
0a70: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  .#.do_test wal2-
0a80: 31 2e 30 20 7b 0a 20 20 70 72 6f 63 20 74 76 66  1.0 {.  proc tvf
0a90: 73 5f 63 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c  s_cb {method fil
0aa0: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 20 0a 20  ename args} { . 
0ab0: 20 20 20 73 65 74 20 3a 3a 66 69 6c 65 6e 61 6d     set ::filenam
0ac0: 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  e $filename.    
0ad0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0ae0: 20 0a 20 20 7d 0a 0a 20 20 74 65 73 74 76 66 73   .  }..  testvfs
0af0: 20 74 76 66 73 0a 20 20 74 76 66 73 20 73 63 72   tvfs.  tvfs scr
0b00: 69 70 74 20 74 76 66 73 5f 63 62 0a 20 20 74 76  ipt tvfs_cb.  tv
0b10: 66 73 20 66 69 6c 74 65 72 20 78 53 68 6d 4f 70  fs filter xShmOp
0b20: 65 6e 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62  en..  sqlite3 db
0b30: 20 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74    test.db -vfs t
0b40: 76 66 73 0a 20 20 73 71 6c 69 74 65 33 20 64 62  vfs.  sqlite3 db
0b50: 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74  2 test.db -vfs t
0b60: 76 66 73 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b  vfs..  execsql {
0b70: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
0b80: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
0b90: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0ba0: 20 74 31 28 61 29 3b 0a 20 20 7d 20 64 62 32 0a   t1(a);.  } db2.
0bb0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0bc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0bd0: 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e  ALUES(1);.    IN
0be0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0bf0: 55 45 53 28 32 29 3b 0a 20 20 20 20 49 4e 53 45  UES(2);.    INSE
0c00: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0c10: 53 28 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  S(3);.    INSERT
0c20: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0c30: 34 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  4);.    SELECT c
0c40: 6f 75 6e 74 28 61 29 2c 20 73 75 6d 28 61 29 20  ount(a), sum(a) 
0c50: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
0c60: 34 20 31 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61  4 10}.do_test wa
0c70: 6c 32 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  l2-1.1 {.  execs
0c80: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
0c90: 74 28 61 29 2c 20 73 75 6d 28 61 29 20 46 52 4f  t(a), sum(a) FRO
0ca0: 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 34 20  M t1 } db2.} {4 
0cb0: 31 30 7d 0a 0a 73 65 74 20 52 45 43 4f 56 45 52  10}..set RECOVER
0cc0: 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20   [list          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0cf0: 7b 30 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73  {0 1 lock exclus
0d00: 69 76 65 7d 20 20 20 7b 31 20 32 20 6c 6f 63 6b  ive}   {1 2 lock
0d10: 20 65 78 63 6c 75 73 69 76 65 7d 20 7b 34 20 34   exclusive} {4 4
0d20: 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d   lock exclusive}
0d30: 20 5c 0a 20 20 7b 31 20 32 20 75 6e 6c 6f 63 6b   \.  {1 2 unlock
0d40: 20 65 78 63 6c 75 73 69 76 65 7d 20 7b 34 20 34   exclusive} {4 4
0d50: 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76   unlock exclusiv
0d60: 65 7d 20 7b 30 20 31 20 75 6e 6c 6f 63 6b 20 65  e} {0 1 unlock e
0d70: 78 63 6c 75 73 69 76 65 7d 20 20 5c 0a 5d 0a 73  xclusive}  \.].s
0d80: 65 74 20 52 45 41 44 20 5b 6c 69 73 74 20 20 20  et READ [list   
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 20 20 20 20 5c 0a 20 20 7b 34 20 31 20 6c        \.  {4 1 l
0dc0: 6f 63 6b 20 73 68 61 72 65 64 7d 20 20 20 20 7b  ock shared}    {
0dd0: 34 20 31 20 75 6e 6c 6f 63 6b 20 73 68 61 72 65  4 1 unlock share
0de0: 64 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  d}             \
0df0: 0a 5d 0a 73 65 74 20 49 4e 49 54 53 4c 4f 54 20  .].set INITSLOT 
0e00: 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  [list           
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 34            \.  {4
0e30: 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76   1 lock exclusiv
0e40: 65 7d 20 7b 34 20 31 20 75 6e 6c 6f 63 6b 20 65  e} {4 1 unlock e
0e50: 78 63 6c 75 73 69 76 65 7d 20 20 20 20 20 20 20  xclusive}       
0e60: 20 20 20 5c 0a 5d 0a 0a 66 6f 72 65 61 63 68 20     \.]..foreach 
0e70: 7b 74 6e 20 69 49 6e 73 65 72 74 20 72 65 73 20  {tn iInsert res 
0e80: 77 61 6c 5f 69 6e 64 65 78 5f 68 64 72 5f 6d 6f  wal_index_hdr_mo
0e90: 64 20 77 61 6c 5f 6c 6f 63 6b 73 7d 20 22 0a 20  d wal_locks} ". 
0ea0: 20 20 20 20 20 20 20 20 32 20 20 20 20 35 20 20          2    5  
0eb0: 20 7b 35 20 31 35 7d 20 20 20 20 30 20 20 20 20   {5 15}    0    
0ec0: 20 20 20 20 20 20 20 20 20 7b 24 52 45 43 4f 56           {$RECOV
0ed0: 45 52 20 24 52 45 41 44 7d 0a 20 20 20 20 20 20  ER $READ}.      
0ee0: 20 20 20 33 20 20 20 20 36 20 20 20 7b 36 20 32     3    6   {6 2
0ef0: 31 7d 20 20 20 20 31 20 20 20 20 20 20 20 20 20  1}    1         
0f00: 20 20 20 20 7b 24 52 45 43 4f 56 45 52 20 24 52      {$RECOVER $R
0f10: 45 41 44 7d 0a 20 20 20 20 20 20 20 20 20 34 20  EAD}.         4 
0f20: 20 20 20 37 20 20 20 7b 37 20 32 38 7d 20 20 20     7   {7 28}   
0f30: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 7b   2             {
0f40: 24 52 45 43 4f 56 45 52 20 24 52 45 41 44 7d 0a  $RECOVER $READ}.
0f50: 20 20 20 20 20 20 20 20 20 35 20 20 20 20 38 20           5    8 
0f60: 20 20 7b 38 20 33 36 7d 20 20 20 20 33 20 20 20    {8 36}    3   
0f70: 20 20 20 20 20 20 20 20 20 20 7b 24 52 45 43 4f            {$RECO
0f80: 56 45 52 20 24 52 45 41 44 7d 0a 20 20 20 20 20  VER $READ}.     
0f90: 20 20 20 20 36 20 20 20 20 39 20 20 20 7b 39 20      6    9   {9 
0fa0: 34 35 7d 20 20 20 20 34 20 20 20 20 20 20 20 20  45}    4        
0fb0: 20 20 20 20 20 7b 24 52 45 43 4f 56 45 52 20 24       {$RECOVER $
0fc0: 52 45 41 44 7d 0a 20 20 20 20 20 20 20 20 20 37  READ}.         7
0fd0: 20 20 20 31 30 20 20 20 7b 31 30 20 35 35 7d 20     10   {10 55} 
0fe0: 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
0ff0: 7b 24 52 45 43 4f 56 45 52 20 24 52 45 41 44 7d  {$RECOVER $READ}
1000: 0a 20 20 20 20 20 20 20 20 20 38 20 20 20 31 31  .         8   11
1010: 20 20 20 7b 31 31 20 36 36 7d 20 20 20 36 20 20     {11 66}   6  
1020: 20 20 20 20 20 20 20 20 20 20 20 7b 24 52 45 43             {$REC
1030: 4f 56 45 52 20 24 52 45 41 44 7d 0a 20 20 20 20  OVER $READ}.    
1040: 20 20 20 20 20 39 20 20 20 31 32 20 20 20 7b 31       9   12   {1
1050: 32 20 37 38 7d 20 20 20 37 20 20 20 20 20 20 20  2 78}   7       
1060: 20 20 20 20 20 20 7b 24 52 45 43 4f 56 45 52 20        {$RECOVER 
1070: 24 52 45 41 44 7d 0a 20 20 20 20 20 20 20 20 31  $READ}.        1
1080: 30 20 20 20 31 33 20 20 20 7b 31 33 20 39 31 7d  0   13   {13 91}
1090: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
10a0: 20 7b 24 52 45 43 4f 56 45 52 20 24 52 45 41 44   {$RECOVER $READ
10b0: 7d 0a 20 20 20 20 20 20 20 20 31 31 20 20 20 31  }.        11   1
10c0: 34 20 20 20 7b 31 34 20 31 30 35 7d 20 20 39 20  4   {14 105}  9 
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 52 45              {$RE
10e0: 43 4f 56 45 52 20 24 52 45 41 44 7d 0a 20 20 20  COVER $READ}.   
10f0: 20 20 20 20 20 31 32 20 20 20 31 35 20 20 20 7b       12   15   {
1100: 31 35 20 31 32 30 7d 20 20 2d 31 20 20 20 20 20  15 120}  -1     
1110: 20 20 20 20 20 20 20 7b 24 49 4e 49 54 53 4c 4f         {$INITSLO
1120: 54 20 24 52 45 41 44 7d 0a 22 20 7b 0a 0a 20 20  T $READ}." {..  
1130: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 2e 24  do_test wal2-1.$
1140: 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.1 {.    execs
1150: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
1160: 20 74 31 20 56 41 4c 55 45 53 28 24 69 49 6e 73   t1 VALUES($iIns
1170: 65 72 74 29 20 7d 0a 20 20 20 20 73 65 74 20 3a  ert) }.    set :
1180: 3a 6c 6f 63 6b 73 20 5b 6c 69 73 74 5d 0a 20 20  :locks [list].  
1190: 20 20 70 72 6f 63 20 74 76 66 73 5f 63 62 20 7b    proc tvfs_cb {
11a0: 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20  method args} {. 
11b0: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 6c       lappend ::l
11c0: 6f 63 6b 73 20 5b 6c 69 6e 64 65 78 20 24 61 72  ocks [lindex $ar
11d0: 67 73 20 32 5d 0a 20 20 20 20 20 20 72 65 74 75  gs 2].      retu
11e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  rn SQLITE_OK.   
11f0: 20 7d 0a 20 20 20 20 74 76 66 73 20 66 69 6c 74   }.    tvfs filt
1200: 65 72 20 78 53 68 6d 4c 6f 63 6b 0a 20 20 20 20  er xShmLock.    
1210: 69 66 20 7b 24 3a 3a 77 61 6c 5f 69 6e 64 65 78  if {$::wal_index
1220: 5f 68 64 72 5f 6d 6f 64 20 3e 3d 20 30 7d 20 7b  _hdr_mod >= 0} {
1230: 0a 20 20 20 20 20 20 69 6e 63 72 5f 74 76 66 73  .      incr_tvfs
1240: 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e 61 6d 65  _hdr $::filename
1250: 20 24 3a 3a 77 61 6c 5f 69 6e 64 65 78 5f 68 64   $::wal_index_hd
1260: 72 5f 6d 6f 64 20 31 0a 20 20 20 20 7d 0a 20 20  r_mod 1.    }.  
1270: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
1280: 43 54 20 63 6f 75 6e 74 28 61 29 2c 20 73 75 6d  CT count(a), sum
1290: 28 61 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  (a) FROM t1 } db
12a0: 32 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20 64 6f  2.  } $res..  do
12b0: 5f 74 65 73 74 20 77 61 6c 32 2d 31 2e 24 74 6e  _test wal2-1.$tn
12c0: 2e 32 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 6c  .2 {.    set ::l
12d0: 6f 63 6b 73 0a 20 20 7d 20 24 77 61 6c 5f 6c 6f  ocks.  } $wal_lo
12e0: 63 6b 73 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 64  cks.}.db close.d
12f0: 62 32 20 63 6c 6f 73 65 0a 74 76 66 73 20 64 65  b2 close.tvfs de
1300: 6c 65 74 65 0a 66 6f 72 63 65 64 65 6c 65 74 65  lete.forcedelete
1310: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
1320: 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75  -wal test.db-jou
1330: 72 6e 61 6c 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  rnal..#---------
1340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1380: 0a 23 20 54 68 69 73 20 74 65 73 74 20 63 61 73  .# This test cas
1390: 65 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61  e is very simila
13a0: 72 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  r to the previou
13b0: 73 20 6f 6e 65 2c 20 65 78 63 65 70 74 2c 20 61  s one, except, a
13c0: 66 74 65 72 0a 23 20 74 68 65 20 72 65 61 64 65  fter.# the reade
13d0: 72 20 72 65 61 64 73 20 74 68 65 20 63 6f 72 72  r reads the corr
13e0: 75 70 74 20 77 61 6c 2d 69 6e 64 65 78 20 68 65  upt wal-index he
13f0: 61 64 65 72 2c 20 62 75 74 20 62 65 66 6f 72 65  ader, but before
1400: 20 69 74 20 68 61 73 0a 23 20 61 20 63 68 61 6e   it has.# a chan
1410: 63 65 20 74 6f 20 72 65 2d 72 65 61 64 20 69 74  ce to re-read it
1420: 20 75 6e 64 65 72 20 74 68 65 20 63 6f 76 65 72   under the cover
1430: 20 6f 66 20 74 68 65 20 52 45 43 4f 56 45 52 20   of the RECOVER 
1440: 6c 6f 63 6b 2c 20 74 68 65 0a 23 20 77 61 6c 2d  lock, the.# wal-
1450: 69 6e 64 65 78 20 68 65 61 64 65 72 20 69 73 20  index header is 
1460: 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 61 20  replaced with a 
1470: 76 61 6c 69 64 2c 20 62 75 74 20 6f 75 74 2d 6f  valid, but out-o
1480: 66 2d 64 61 74 65 2c 20 68 65 61 64 65 72 2e 0a  f-date, header..
1490: 23 0a 23 20 42 65 63 61 75 73 65 20 74 68 65 20  #.# Because the 
14a0: 68 65 61 64 65 72 20 63 68 65 63 6b 73 75 6d 20  header checksum 
14b0: 6c 6f 6f 6b 73 20 4f 6b 2c 20 74 68 65 20 72 65  looks Ok, the re
14c0: 61 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 72 75  ader does not ru
14d0: 6e 20 72 65 63 6f 76 65 72 79 2c 0a 23 20 69 74  n recovery,.# it
14e0: 20 73 69 6d 70 6c 79 20 64 72 6f 70 73 20 62 61   simply drops ba
14f0: 63 6b 20 74 6f 20 61 20 52 45 41 44 20 6c 6f 63  ck to a READ loc
1500: 6b 20 61 6e 64 20 70 72 6f 63 65 65 64 73 2e 20  k and proceeds. 
1510: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a  But because the.
1520: 23 20 68 65 61 64 65 72 20 69 73 20 6f 75 74 2d  # header is out-
1530: 6f 66 2d 64 61 74 65 2c 20 74 68 65 20 72 65 61  of-date, the rea
1540: 64 65 72 20 72 65 61 64 73 20 74 68 65 20 6f 75  der reads the ou
1550: 74 2d 6f 66 2d 64 61 74 65 20 73 6e 61 70 73 68  t-of-date snapsh
1560: 6f 74 2e 0a 23 0a 23 20 41 66 74 65 72 20 74 68  ot..#.# After th
1570: 69 73 2c 20 74 68 65 20 68 65 61 64 65 72 20 69  is, the header i
1580: 73 20 63 6f 72 72 75 70 74 65 64 20 61 67 61 69  s corrupted agai
1590: 6e 20 61 6e 64 20 74 68 65 20 72 65 61 64 65 72  n and the reader
15a0: 20 69 73 20 61 6c 6c 6f 77 65 64 0a 23 20 74 6f   is allowed.# to
15b0: 20 72 75 6e 20 72 65 63 6f 76 65 72 79 2e 20 54   run recovery. T
15c0: 68 69 73 20 74 69 6d 65 2c 20 69 74 20 73 65 65  his time, it see
15d0: 73 20 61 6e 20 75 70 2d 74 6f 2d 64 61 74 65 20  s an up-to-date 
15e0: 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 0a  snapshot of the.
15f0: 23 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  # database file.
1600: 0a 23 0a 73 65 74 20 57 52 49 54 45 52 20 5b 6c  .#.set WRITER [l
1610: 69 73 74 20 30 20 31 20 6c 6f 63 6b 20 65 78 63  ist 0 1 lock exc
1620: 6c 75 73 69 76 65 5d 0a 73 65 74 20 4c 4f 43 4b  lusive].set LOCK
1630: 53 20 20 5b 6c 69 73 74 20 5c 0a 20 20 7b 30 20  S  [list \.  {0 
1640: 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65  1 lock exclusive
1650: 7d 20 7b 30 20 31 20 75 6e 6c 6f 63 6b 20 65 78  } {0 1 unlock ex
1660: 63 6c 75 73 69 76 65 7d 20 5c 0a 20 20 7b 34 20  clusive} \.  {4 
1670: 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65  1 lock exclusive
1680: 7d 20 7b 34 20 31 20 75 6e 6c 6f 63 6b 20 65 78  } {4 1 unlock ex
1690: 63 6c 75 73 69 76 65 7d 20 5c 0a 20 20 7b 34 20  clusive} \.  {4 
16a0: 31 20 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 20  1 lock shared}  
16b0: 20 20 7b 34 20 31 20 75 6e 6c 6f 63 6b 20 73 68    {4 1 unlock sh
16c0: 61 72 65 64 7d 20 20 20 20 5c 0a 5d 0a 64 6f 5f  ared}    \.].do_
16d0: 74 65 73 74 20 77 61 6c 32 2d 32 2e 30 20 7b 0a  test wal2-2.0 {.
16e0: 0a 20 20 74 65 73 74 76 66 73 20 74 76 66 73 0a  .  testvfs tvfs.
16f0: 20 20 74 76 66 73 20 73 63 72 69 70 74 20 74 76    tvfs script tv
1700: 66 73 5f 63 62 0a 20 20 74 76 66 73 20 66 69 6c  fs_cb.  tvfs fil
1710: 74 65 72 20 78 53 68 6d 4f 70 65 6e 0a 20 20 70  ter xShmOpen.  p
1720: 72 6f 63 20 74 76 66 73 5f 63 62 20 7b 6d 65 74  roc tvfs_cb {met
1730: 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20  hod args} {.    
1740: 73 65 74 20 3a 3a 66 69 6c 65 6e 61 6d 65 20 5b  set ::filename [
1750: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 0a  lindex $args 0].
1760: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1770: 45 5f 4f 4b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E_OK.  }..  sqli
1780: 74 65 33 20 64 62 20 20 74 65 73 74 2e 64 62 20  te3 db  test.db 
1790: 2d 76 66 73 20 74 76 66 73 0a 20 20 73 71 6c 69  -vfs tvfs.  sqli
17a0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20  te3 db2 test.db 
17b0: 2d 76 66 73 20 74 76 66 73 0a 0a 20 20 65 78 65  -vfs tvfs..  exe
17c0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
17d0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
17e0: 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45   WAL;.    CREATE
17f0: 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 20 20   TABLE t1(a);.  
1800: 7d 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20  } db2.  execsql 
1810: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
1820: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 29 3b 0a  O t1 VALUES(1);.
1830: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1840: 74 31 20 56 41 4c 55 45 53 28 32 29 3b 0a 20 20  t1 VALUES(2);.  
1850: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1860: 20 56 41 4c 55 45 53 28 33 29 3b 0a 20 20 20 20   VALUES(3);.    
1870: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1880: 41 4c 55 45 53 28 34 29 3b 0a 20 20 20 20 53 45  ALUES(4);.    SE
1890: 4c 45 43 54 20 63 6f 75 6e 74 28 61 29 2c 20 73  LECT count(a), s
18a0: 75 6d 28 61 29 20 46 52 4f 4d 20 74 31 3b 0a 20  um(a) FROM t1;. 
18b0: 20 7d 0a 7d 20 7b 34 20 31 30 7d 0a 64 6f 5f 74   }.} {4 10}.do_t
18c0: 65 73 74 20 77 61 6c 32 2d 32 2e 31 20 7b 0a 20  est wal2-2.1 {. 
18d0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
18e0: 54 20 63 6f 75 6e 74 28 61 29 2c 20 73 75 6d 28  T count(a), sum(
18f0: 61 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32  a) FROM t1 } db2
1900: 0a 7d 20 7b 34 20 31 30 7d 0a 0a 66 6f 72 65 61  .} {4 10}..forea
1910: 63 68 20 7b 74 6e 20 69 49 6e 73 65 72 74 20 72  ch {tn iInsert r
1920: 65 73 30 20 72 65 73 31 20 77 61 6c 5f 69 6e 64  es0 res1 wal_ind
1930: 65 78 5f 68 64 72 5f 6d 6f 64 7d 20 7b 0a 20 20  ex_hdr_mod} {.  
1940: 20 20 20 20 20 20 20 32 20 20 20 20 35 20 20 20         2    5   
1950: 7b 34 20 31 30 7d 20 20 20 7b 35 20 31 35 7d 20  {4 10}   {5 15} 
1960: 20 20 20 30 0a 20 20 20 20 20 20 20 20 20 33 20     0.         3 
1970: 20 20 20 36 20 20 20 7b 35 20 31 35 7d 20 20 20     6   {5 15}   
1980: 7b 36 20 32 31 7d 20 20 20 20 31 0a 20 20 20 20  {6 21}    1.    
1990: 20 20 20 20 20 34 20 20 20 20 37 20 20 20 7b 36       4    7   {6
19a0: 20 32 31 7d 20 20 20 7b 37 20 32 38 7d 20 20 20   21}   {7 28}   
19b0: 20 32 0a 20 20 20 20 20 20 20 20 20 35 20 20 20   2.         5   
19c0: 20 38 20 20 20 7b 37 20 32 38 7d 20 20 20 7b 38   8   {7 28}   {8
19d0: 20 33 36 7d 20 20 20 20 33 0a 20 20 20 20 20 20   36}    3.      
19e0: 20 20 20 36 20 20 20 20 39 20 20 20 7b 38 20 33     6    9   {8 3
19f0: 36 7d 20 20 20 7b 39 20 34 35 7d 20 20 20 20 34  6}   {9 45}    4
1a00: 0a 20 20 20 20 20 20 20 20 20 37 20 20 20 31 30  .         7   10
1a10: 20 20 20 7b 39 20 34 35 7d 20 20 20 7b 31 30 20     {9 45}   {10 
1a20: 35 35 7d 20 20 20 35 0a 20 20 20 20 20 20 20 20  55}   5.        
1a30: 20 38 20 20 20 31 31 20 20 20 7b 31 30 20 35 35   8   11   {10 55
1a40: 7d 20 20 7b 31 31 20 36 36 7d 20 20 20 36 0a 20  }  {11 66}   6. 
1a50: 20 20 20 20 20 20 20 20 39 20 20 20 31 32 20 20          9   12  
1a60: 20 7b 31 31 20 36 36 7d 20 20 7b 31 32 20 37 38   {11 66}  {12 78
1a70: 7d 20 20 20 37 0a 7d 20 7b 0a 20 20 74 76 66 73  }   7.} {.  tvfs
1a80: 20 66 69 6c 74 65 72 20 78 53 68 6d 4c 6f 63 6b   filter xShmLock
1a90: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32  ..  do_test wal2
1aa0: 2d 32 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73  -2.$tn.1 {.    s
1ab0: 65 74 20 6f 6c 64 68 64 72 20 5b 73 65 74 5f 74  et oldhdr [set_t
1ac0: 76 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e  vfs_hdr $::filen
1ad0: 61 6d 65 5d 0a 20 20 20 20 65 78 65 63 73 71 6c  ame].    execsql
1ae0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
1af0: 31 20 56 41 4c 55 45 53 28 24 69 49 6e 73 65 72  1 VALUES($iInser
1b00: 74 29 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  t) }.    execsql
1b10: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
1b20: 61 29 2c 20 73 75 6d 28 61 29 20 46 52 4f 4d 20  a), sum(a) FROM 
1b30: 74 31 20 7d 0a 20 20 7d 20 24 72 65 73 31 0a 0a  t1 }.  } $res1..
1b40: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 32    do_test wal2-2
1b50: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 65 74  .$tn.2 {.    set
1b60: 20 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 73 74 5d 0a   ::locks [list].
1b70: 20 20 20 20 70 72 6f 63 20 74 76 66 73 5f 63 62      proc tvfs_cb
1b80: 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b   {method args} {
1b90: 0a 20 20 20 20 20 20 73 65 74 20 6c 6f 63 6b 20  .      set lock 
1ba0: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 32 5d  [lindex $args 2]
1bb0: 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 3a  .      lappend :
1bc0: 3a 6c 6f 63 6b 73 20 24 6c 6f 63 6b 0a 20 20 20  :locks $lock.   
1bd0: 20 20 20 69 66 20 7b 24 6c 6f 63 6b 20 3d 3d 20     if {$lock == 
1be0: 24 3a 3a 57 52 49 54 45 52 7d 20 7b 0a 20 20 20  $::WRITER} {.   
1bf0: 20 20 20 20 20 73 65 74 5f 74 76 66 73 5f 68 64       set_tvfs_hd
1c00: 72 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 20 24 3a  r $::filename $:
1c10: 3a 6f 6c 64 68 64 72 0a 20 20 20 20 20 20 7d 0a  :oldhdr.      }.
1c20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c30: 49 54 45 5f 4f 4b 0a 20 20 20 20 7d 0a 0a 20 20  ITE_OK.    }..  
1c40: 20 20 69 66 20 7b 24 3a 3a 77 61 6c 5f 69 6e 64    if {$::wal_ind
1c50: 65 78 5f 68 64 72 5f 6d 6f 64 20 3e 3d 20 30 7d  ex_hdr_mod >= 0}
1c60: 20 7b 0a 20 20 20 20 20 20 69 6e 63 72 5f 74 76   {.      incr_tv
1c70: 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e 61  fs_hdr $::filena
1c80: 6d 65 20 24 3a 3a 77 61 6c 5f 69 6e 64 65 78 5f  me $::wal_index_
1c90: 68 64 72 5f 6d 6f 64 20 31 0a 20 20 20 20 7d 0a  hdr_mod 1.    }.
1ca0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
1cb0: 4c 45 43 54 20 63 6f 75 6e 74 28 61 29 2c 20 73  LECT count(a), s
1cc0: 75 6d 28 61 29 20 46 52 4f 4d 20 74 31 20 7d 20  um(a) FROM t1 } 
1cd0: 64 62 32 0a 20 20 7d 20 24 72 65 73 30 0a 0a 20  db2.  } $res0.. 
1ce0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 32 2e   do_test wal2-2.
1cf0: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 73 65 74 20  $tn.3 {.    set 
1d00: 3a 3a 6c 6f 63 6b 73 0a 20 20 7d 20 24 4c 4f 43  ::locks.  } $LOC
1d10: 4b 53 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  KS..  do_test wa
1d20: 6c 32 2d 32 2e 24 74 6e 2e 34 20 7b 0a 20 20 20  l2-2.$tn.4 {.   
1d30: 20 73 65 74 20 3a 3a 6c 6f 63 6b 73 20 5b 6c 69   set ::locks [li
1d40: 73 74 5d 0a 20 20 20 20 70 72 6f 63 20 74 76 66  st].    proc tvf
1d50: 73 5f 63 62 20 7b 6d 65 74 68 6f 64 20 61 72 67  s_cb {method arg
1d60: 73 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6c  s} {.      set l
1d70: 6f 63 6b 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  ock [lindex $arg
1d80: 73 20 32 5d 0a 20 20 20 20 20 20 6c 61 70 70 65  s 2].      lappe
1d90: 6e 64 20 3a 3a 6c 6f 63 6b 73 20 24 6c 6f 63 6b  nd ::locks $lock
1da0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1db0: 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 7d 0a 0a 20  LITE_OK.    }.. 
1dc0: 20 20 20 69 66 20 7b 24 3a 3a 77 61 6c 5f 69 6e     if {$::wal_in
1dd0: 64 65 78 5f 68 64 72 5f 6d 6f 64 20 3e 3d 20 30  dex_hdr_mod >= 0
1de0: 7d 20 7b 0a 20 20 20 20 20 20 69 6e 63 72 5f 74  } {.      incr_t
1df0: 76 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e  vfs_hdr $::filen
1e00: 61 6d 65 20 24 3a 3a 77 61 6c 5f 69 6e 64 65 78  ame $::wal_index
1e10: 5f 68 64 72 5f 6d 6f 64 20 31 0a 20 20 20 20 7d  _hdr_mod 1.    }
1e20: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
1e30: 45 4c 45 43 54 20 63 6f 75 6e 74 28 61 29 2c 20  ELECT count(a), 
1e40: 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 31 20 7d  sum(a) FROM t1 }
1e50: 20 64 62 32 0a 20 20 7d 20 24 72 65 73 31 0a 7d   db2.  } $res1.}
1e60: 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c  .db close.db2 cl
1e70: 6f 73 65 0a 74 76 66 73 20 64 65 6c 65 74 65 0a  ose.tvfs delete.
1e80: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
1e90: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  .db test.db-wal 
1ea0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
1eb0: 0a 0a 69 66 20 30 20 7b 0a 23 2d 2d 2d 2d 2d 2d  ..if 0 {.#------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f00: 2d 2d 2d 0a 23 20 54 68 69 73 20 74 65 73 74 20  ---.# This test 
1f10: 63 61 73 65 20 2d 20 77 61 6c 32 2d 33 2e 2a 20  case - wal2-3.* 
1f20: 2d 20 74 65 73 74 73 20 74 68 65 20 72 65 73 70  - tests the resp
1f30: 6f 6e 73 65 20 6f 66 20 74 68 65 20 6c 69 62 72  onse of the libr
1f40: 61 72 79 20 74 6f 20 61 6e 0a 23 20 53 51 4c 49  ary to an.# SQLI
1f50: 54 45 5f 42 55 53 59 20 77 68 65 6e 20 61 74 74  TE_BUSY when att
1f60: 65 6d 70 74 69 6e 67 20 74 6f 20 6f 62 74 61 69  empting to obtai
1f70: 6e 20 61 20 52 45 41 44 20 6f 72 20 52 45 43 4f  n a READ or RECO
1f80: 56 45 52 20 6c 6f 63 6b 2e 0a 23 0a 23 20 20 20  VER lock..#.#   
1f90: 77 61 6c 32 2d 33 2e 30 20 2d 20 32 3a 20 53 51  wal2-3.0 - 2: SQ
1fa0: 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 6f  LITE_BUSY when o
1fb0: 62 74 61 69 6e 69 6e 67 20 61 20 52 45 41 44 20  btaining a READ 
1fc0: 6c 6f 63 6b 0a 23 20 20 20 77 61 6c 32 2d 33 2e  lock.#   wal2-3.
1fd0: 33 20 2d 20 36 3a 20 53 51 4c 49 54 45 5f 42 55  3 - 6: SQLITE_BU
1fe0: 53 59 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  SY when obtainin
1ff0: 67 20 61 20 52 45 43 4f 56 45 52 20 6c 6f 63 6b  g a RECOVER lock
2000: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  .#.do_test wal2-
2010: 33 2e 30 20 7b 0a 20 20 70 72 6f 63 20 74 76 66  3.0 {.  proc tvf
2020: 73 5f 63 62 20 7b 6d 65 74 68 6f 64 20 61 72 67  s_cb {method arg
2030: 73 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 6d 65  s} {.    if {$me
2040: 74 68 6f 64 20 3d 3d 20 22 78 53 68 6d 4c 6f 63  thod == "xShmLoc
2050: 6b 22 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b  k"} {.      if {
2060: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6c  [info exists ::l
2070: 6f 63 6b 65 64 5d 7d 20 7b 20 72 65 74 75 72 6e  ocked]} { return
2080: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 7d 0a 20   SQLITE_BUSY }. 
2090: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
20a0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 0a 20  SQLITE_OK.  }.. 
20b0: 20 70 72 6f 63 20 62 75 73 79 68 61 6e 64 6c 65   proc busyhandle
20c0: 72 20 78 20 7b 0a 20 20 20 20 69 66 20 7b 24 78  r x {.    if {$x
20d0: 3e 33 7d 20 7b 20 75 6e 73 65 74 20 2d 6e 6f 63  >3} { unset -noc
20e0: 6f 6d 70 6c 61 69 6e 20 3a 3a 6c 6f 63 6b 65 64  omplain ::locked
20f0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 0a   }.    return 0.
2100: 20 20 7d 0a 0a 20 20 74 65 73 74 76 66 73 20 74    }..  testvfs t
2110: 76 66 73 0a 20 20 74 76 66 73 20 73 63 72 69 70  vfs.  tvfs scrip
2120: 74 20 74 76 66 73 5f 63 62 0a 20 20 73 71 6c 69  t tvfs_cb.  sqli
2130: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d  te3 db test.db -
2140: 76 66 73 20 74 76 66 73 0a 20 20 64 62 20 62 75  vfs tvfs.  db bu
2150: 73 79 20 62 75 73 79 68 61 6e 64 6c 65 72 0a 0a  sy busyhandler..
2160: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2170: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
2180: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43  ode = WAL;.    C
2190: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
21a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
21b0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 29 3b  TO t1 VALUES(1);
21c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
21d0: 20 74 31 20 56 41 4c 55 45 53 28 32 29 3b 0a 20   t1 VALUES(2);. 
21e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
21f0: 31 20 56 41 4c 55 45 53 28 33 29 3b 0a 20 20 20  1 VALUES(3);.   
2200: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2210: 56 41 4c 55 45 53 28 34 29 3b 0a 20 20 7d 20 0a  VALUES(4);.  } .
2220: 0a 20 20 73 65 74 20 3a 3a 6c 6f 63 6b 65 64 20  .  set ::locked 
2230: 31 0a 20 20 69 6e 66 6f 20 65 78 69 73 74 73 20  1.  info exists 
2240: 3a 3a 6c 6f 63 6b 65 64 0a 7d 20 7b 31 7d 0a 64  ::locked.} {1}.d
2250: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 33 2e 31 20  o_test wal2-3.1 
2260: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
2270: 4c 45 43 54 20 63 6f 75 6e 74 28 61 29 2c 20 73  LECT count(a), s
2280: 75 6d 28 61 29 20 46 52 4f 4d 20 74 31 20 7d 0a  um(a) FROM t1 }.
2290: 7d 20 7b 34 20 31 30 7d 0a 64 6f 5f 74 65 73 74  } {4 10}.do_test
22a0: 20 77 61 6c 32 2d 33 2e 32 20 7b 0a 20 20 69 6e   wal2-3.2 {.  in
22b0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6c 6f 63 6b  fo exists ::lock
22c0: 65 64 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73  ed.} {0}..do_tes
22d0: 74 20 77 61 6c 32 2d 33 2e 33 20 7b 0a 20 20 70  t wal2-3.3 {.  p
22e0: 72 6f 63 20 74 76 66 73 5f 63 62 20 7b 6d 65 74  roc tvfs_cb {met
22f0: 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20  hod args} {.    
2300: 69 66 20 7b 24 6d 65 74 68 6f 64 20 3d 3d 20 22  if {$method == "
2310: 78 53 68 6d 4c 6f 63 6b 22 7d 20 7b 0a 20 20 20  xShmLock"} {.   
2320: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
2330: 73 74 73 20 3a 3a 73 61 62 6f 74 61 67 65 5d 7d  sts ::sabotage]}
2340: 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74   {.        unset
2350: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 73   -nocomplain ::s
2360: 61 62 6f 74 61 67 65 0a 20 20 20 20 20 20 20 20  abotage.        
2370: 69 6e 63 72 5f 74 76 66 73 5f 68 64 72 20 5b 6c  incr_tvfs_hdr [l
2380: 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20 31  index $args 0] 1
2390: 20 31 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   1.      }.     
23a0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
23b0: 73 20 3a 3a 6c 6f 63 6b 65 64 5d 20 26 26 20 5b  s ::locked] && [
23c0: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 32 5d 20  lindex $args 2] 
23d0: 3d 3d 20 22 52 45 43 4f 56 45 52 22 7d 20 7b 0a  == "RECOVER"} {.
23e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
23f0: 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20 20 20  QLITE_BUSY.     
2400: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
2410: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  urn SQLITE_OK.  
2420: 7d 0a 20 20 73 65 74 20 3a 3a 73 61 62 6f 74 61  }.  set ::sabota
2430: 67 65 20 31 0a 20 20 73 65 74 20 3a 3a 6c 6f 63  ge 1.  set ::loc
2440: 6b 65 64 20 31 0a 20 20 6c 69 73 74 20 5b 69 6e  ked 1.  list [in
2450: 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 61 62 6f  fo exists ::sabo
2460: 74 61 67 65 5d 20 5b 69 6e 66 6f 20 65 78 69 73  tage] [info exis
2470: 74 73 20 3a 3a 6c 6f 63 6b 65 64 5d 0a 7d 20 7b  ts ::locked].} {
2480: 31 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  1 1}.do_test wal
2490: 32 2d 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  2-3.4 {.  execsq
24a0: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
24b0: 28 61 29 2c 20 73 75 6d 28 61 29 20 46 52 4f 4d  (a), sum(a) FROM
24c0: 20 74 31 20 7d 0a 7d 20 7b 34 20 31 30 7d 0a 64   t1 }.} {4 10}.d
24d0: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 33 2e 35 20  o_test wal2-3.5 
24e0: 7b 0a 20 20 6c 69 73 74 20 5b 69 6e 66 6f 20 65  {.  list [info e
24f0: 78 69 73 74 73 20 3a 3a 73 61 62 6f 74 61 67 65  xists ::sabotage
2500: 5d 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  ] [info exists :
2510: 3a 6c 6f 63 6b 65 64 5d 0a 7d 20 7b 30 20 30 7d  :locked].} {0 0}
2520: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 66 73 20 64  .db close.tvfs d
2530: 65 6c 65 74 65 0a 66 6f 72 63 65 64 65 6c 65 74  elete.forcedelet
2540: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
2550: 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f  b-wal test.db-jo
2560: 75 72 6e 61 6c 0a 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  urnal..}..#-----
2570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25b0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
25c0: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
25d0: 65 63 74 69 6f 6e 20 75 73 69 6e 67 20 61 20 56  ection using a V
25e0: 46 53 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  FS that does not
25f0: 20 73 75 70 70 6f 72 74 20 74 68 65 0a 23 20 78   support the.# x
2600: 53 68 6d 58 58 58 20 69 6e 74 65 72 66 61 63 65  ShmXXX interface
2610: 73 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 61 20  s cannot open a 
2620: 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 23 0a  WAL database..#.
2630: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 34 2e 31  do_test wal2-4.1
2640: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
2650: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
2660: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  l {.    PRAGMA a
2670: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a  uto_vacuum = 0;.
2680: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
2690: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
26a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
26b0: 64 61 74 61 28 78 29 3b 0a 20 20 20 20 49 4e 53  data(x);.    INS
26c0: 45 52 54 20 49 4e 54 4f 20 64 61 74 61 20 56 41  ERT INTO data VA
26d0: 4c 55 45 53 28 27 6e 65 65 64 20 78 53 68 6d 4f  LUES('need xShmO
26e0: 70 65 6e 20 74 6f 20 73 65 65 20 74 68 69 73 27  pen to see this'
26f0: 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  );.    PRAGMA wa
2700: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
2710: 7d 0a 20 20 23 20 54 68 72 65 65 20 70 61 67 65  }.  # Three page
2720: 73 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c  s in the WAL fil
2730: 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 3a  e at this point:
2740: 20 4f 6e 65 20 63 6f 70 79 20 6f 66 20 70 61 67   One copy of pag
2750: 65 20 31 20 61 6e 64 20 74 77 6f 0a 20 20 23 20  e 1 and two.  # 
2760: 6f 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  of the root page
2770: 20 66 6f 72 20 74 61 62 6c 65 20 22 64 61 74 61   for table "data
2780: 22 2e 0a 7d 20 7b 77 61 6c 20 30 20 33 20 33 7d  "..} {wal 0 3 3}
2790: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 34 2e  .do_test wal2-4.
27a0: 32 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  2 {.  db close. 
27b0: 20 74 65 73 74 76 66 73 20 74 76 66 73 20 2d 6e   testvfs tvfs -n
27c0: 6f 73 68 6d 20 31 0a 20 20 73 71 6c 69 74 65 33  oshm 1.  sqlite3
27d0: 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73   db test.db -vfs
27e0: 20 74 76 66 73 0a 20 20 63 61 74 63 68 73 71 6c   tvfs.  catchsql
27f0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
2800: 20 64 61 74 61 20 7d 0a 7d 20 7b 31 20 7b 75 6e   data }.} {1 {un
2810: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
2820: 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 64 6f 5f  abase file}}.do_
2830: 74 65 73 74 20 77 61 6c 32 2d 34 2e 33 20 7b 0a  test wal2-4.3 {.
2840: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 65 73    db close.  tes
2850: 74 76 66 73 20 74 76 66 73 0a 20 20 73 71 6c 69  tvfs tvfs.  sqli
2860: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d  te3 db test.db -
2870: 76 66 73 20 74 76 66 73 0a 20 20 63 61 74 63 68  vfs tvfs.  catch
2880: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
2890: 52 4f 4d 20 64 61 74 61 20 7d 0a 7d 20 7b 30 20  ROM data }.} {0 
28a0: 7b 7b 6e 65 65 64 20 78 53 68 6d 4f 70 65 6e 20  {{need xShmOpen 
28b0: 74 6f 20 73 65 65 20 74 68 69 73 7d 7d 7d 0a 64  to see this}}}.d
28c0: 62 20 63 6c 6f 73 65 0a 74 76 66 73 20 64 65 6c  b close.tvfs del
28d0: 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete..#----------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2920: 23 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61  # Test that if a
2930: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2940: 74 69 6f 6e 20 69 73 20 66 6f 72 63 65 64 20 74  tion is forced t
2950: 6f 20 72 75 6e 20 72 65 63 6f 76 65 72 79 20 62  o run recovery b
2960: 65 66 6f 72 65 20 69 74 0a 23 20 63 61 6e 20 70  efore it.# can p
2970: 65 72 66 6f 72 6d 20 61 20 63 68 65 63 6b 70 6f  erform a checkpo
2980: 69 6e 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  int, it does not
2990: 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f   transition into
29a0: 20 52 45 43 4f 56 45 52 20 73 74 61 74 65 2e 0a   RECOVER state..
29b0: 23 0a 23 20 55 50 44 41 54 45 3a 20 54 68 69 73  #.# UPDATE: This
29c0: 20 68 61 73 20 6e 6f 77 20 63 68 61 6e 67 65 64   has now changed
29d0: 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61  . When running a
29e0: 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 69 66 20   checkpoint, if 
29f0: 72 65 63 6f 76 65 72 79 20 69 73 0a 23 20 72 65  recovery is.# re
2a00: 71 75 69 72 65 64 20 74 68 65 20 63 6c 69 65 6e  quired the clien
2a10: 74 20 67 72 61 62 73 20 61 6c 6c 20 65 78 63 6c  t grabs all excl
2a20: 75 73 69 76 65 20 6c 6f 63 6b 73 20 28 6a 75 73  usive locks (jus
2a30: 74 20 61 73 20 69 74 20 77 6f 75 6c 64 20 66 6f  t as it would fo
2a40: 72 20 61 0a 23 20 72 65 63 6f 76 65 72 79 20 70  r a.# recovery p
2a50: 65 72 66 6f 72 6d 65 64 20 61 73 20 61 20 70 72  erformed as a pr
2a60: 65 2d 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 6f  e-cursor to a no
2a70: 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 74 72  rmal database tr
2a80: 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 23 0a 73 65  ansaction)..#.se
2a90: 74 20 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b 73  t expected_locks
2aa0: 20 5b 6c 69 73 74 5d 0a 6c 61 70 70 65 6e 64 20   [list].lappend 
2ab0: 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b 73 20 7b  expected_locks {
2ac0: 31 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69  1 1 lock exclusi
2ad0: 76 65 7d 20 20 20 3b 23 20 4c 6f 63 6b 20 63 68  ve}   ;# Lock ch
2ae0: 65 63 6b 70 6f 69 6e 74 0a 6c 61 70 70 65 6e 64  eckpoint.lappend
2af0: 20 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b 73 20   expected_locks 
2b00: 7b 30 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73  {0 1 lock exclus
2b10: 69 76 65 7d 20 20 20 3b 23 20 4c 6f 63 6b 20 77  ive}   ;# Lock w
2b20: 72 69 74 65 72 0a 6c 61 70 70 65 6e 64 20 65 78  riter.lappend ex
2b30: 70 65 63 74 65 64 5f 6c 6f 63 6b 73 20 7b 32 20  pected_locks {2 
2b40: 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65  1 lock exclusive
2b50: 7d 20 20 20 3b 23 20 4c 6f 63 6b 20 72 65 63 6f  }   ;# Lock reco
2b60: 76 65 72 79 0a 6c 61 70 70 65 6e 64 20 65 78 70  very.lappend exp
2b70: 65 63 74 65 64 5f 6c 6f 63 6b 73 20 7b 34 20 34  ected_locks {4 4
2b80: 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d   lock exclusive}
2b90: 20 20 20 3b 23 20 4c 6f 63 6b 20 61 6c 6c 20 61     ;# Lock all a
2ba0: 52 65 61 64 4d 61 72 6b 5b 5d 0a 6c 61 70 70 65  ReadMark[].lappe
2bb0: 6e 64 20 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b  nd expected_lock
2bc0: 73 20 7b 32 20 31 20 75 6e 6c 6f 63 6b 20 65 78  s {2 1 unlock ex
2bd0: 63 6c 75 73 69 76 65 7d 20 3b 23 20 55 6e 6c 6f  clusive} ;# Unlo
2be0: 63 6b 20 72 65 63 6f 76 65 72 79 20 0a 6c 61 70  ck recovery .lap
2bf0: 70 65 6e 64 20 65 78 70 65 63 74 65 64 5f 6c 6f  pend expected_lo
2c00: 63 6b 73 20 7b 34 20 34 20 75 6e 6c 6f 63 6b 20  cks {4 4 unlock 
2c10: 65 78 63 6c 75 73 69 76 65 7d 20 3b 23 20 55 6e  exclusive} ;# Un
2c20: 6c 6f 63 6b 20 61 6c 6c 20 61 52 65 61 64 4d 61  lock all aReadMa
2c30: 72 6b 5b 5d 20 0a 6c 61 70 70 65 6e 64 20 65 78  rk[] .lappend ex
2c40: 70 65 63 74 65 64 5f 6c 6f 63 6b 73 20 7b 30 20  pected_locks {0 
2c50: 31 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69  1 unlock exclusi
2c60: 76 65 7d 20 3b 23 20 55 6e 6c 6f 63 6b 20 77 72  ve} ;# Unlock wr
2c70: 69 74 65 72 0a 6c 61 70 70 65 6e 64 20 65 78 70  iter.lappend exp
2c80: 65 63 74 65 64 5f 6c 6f 63 6b 73 20 7b 33 20 31  ected_locks {3 1
2c90: 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d   lock exclusive}
2ca0: 20 20 20 3b 23 20 4c 6f 63 6b 20 61 52 65 61 64     ;# Lock aRead
2cb0: 4d 61 72 6b 5b 30 5d 0a 6c 61 70 70 65 6e 64 20  Mark[0].lappend 
2cc0: 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b 73 20 7b  expected_locks {
2cd0: 33 20 31 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75  3 1 unlock exclu
2ce0: 73 69 76 65 7d 20 3b 23 20 55 6e 6c 6f 63 6b 20  sive} ;# Unlock 
2cf0: 61 52 65 61 64 4d 61 72 6b 5b 30 5d 0a 6c 61 70  aReadMark[0].lap
2d00: 70 65 6e 64 20 65 78 70 65 63 74 65 64 5f 6c 6f  pend expected_lo
2d10: 63 6b 73 20 7b 31 20 31 20 75 6e 6c 6f 63 6b 20  cks {1 1 unlock 
2d20: 65 78 63 6c 75 73 69 76 65 7d 20 3b 23 20 55 6e  exclusive} ;# Un
2d30: 6c 6f 63 6b 20 63 68 65 63 6b 70 6f 69 6e 74 0a  lock checkpoint.
2d40: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 35 2e 31  do_test wal2-5.1
2d50: 20 7b 0a 20 20 70 72 6f 63 20 74 76 66 73 5f 63   {.  proc tvfs_c
2d60: 62 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20  b {method args} 
2d70: 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73 68 6d 5f  {.    set ::shm_
2d80: 66 69 6c 65 20 5b 6c 69 6e 64 65 78 20 24 61 72  file [lindex $ar
2d90: 67 73 20 30 5d 0a 20 20 20 20 69 66 20 7b 24 6d  gs 0].    if {$m
2da0: 65 74 68 6f 64 20 3d 3d 20 22 78 53 68 6d 4c 6f  ethod == "xShmLo
2db0: 63 6b 22 7d 20 7b 20 6c 61 70 70 65 6e 64 20 3a  ck"} { lappend :
2dc0: 3a 6c 6f 63 6b 73 20 5b 6c 69 6e 64 65 78 20 24  :locks [lindex $
2dd0: 61 72 67 73 20 32 5d 20 7d 0a 20 20 20 20 72 65  args 2] }.    re
2de0: 74 75 72 6e 20 24 3a 3a 74 76 66 73 5f 63 62 5f  turn $::tvfs_cb_
2df0: 72 65 74 75 72 6e 0a 20 20 7d 0a 20 20 73 65 74  return.  }.  set
2e00: 20 74 76 66 73 5f 63 62 5f 72 65 74 75 72 6e 20   tvfs_cb_return 
2e10: 53 51 4c 49 54 45 5f 4f 4b 0a 0a 20 20 74 65 73  SQLITE_OK..  tes
2e20: 74 76 66 73 20 74 76 66 73 0a 20 20 74 76 66 73  tvfs tvfs.  tvfs
2e30: 20 73 63 72 69 70 74 20 74 76 66 73 5f 63 62 0a   script tvfs_cb.
2e40: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
2e50: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 66 73 0a  st.db -vfs tvfs.
2e60: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2e70: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
2e80: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43  ode = WAL;.    C
2e90: 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 79 29  REATE TABLE x(y)
2ea0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2eb0: 4f 20 78 20 56 41 4c 55 45 53 28 31 29 3b 0a 20  O x VALUES(1);. 
2ec0: 20 7d 0a 0a 20 20 69 6e 63 72 5f 74 76 66 73 5f   }..  incr_tvfs_
2ed0: 68 64 72 20 24 3a 3a 73 68 6d 5f 66 69 6c 65 20  hdr $::shm_file 
2ee0: 31 20 31 0a 20 20 73 65 74 20 3a 3a 6c 6f 63 6b  1 1.  set ::lock
2ef0: 73 20 5b 6c 69 73 74 5d 0a 20 20 65 78 65 63 73  s [list].  execs
2f00: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
2f10: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 73  checkpoint }.  s
2f20: 65 74 20 3a 3a 6c 6f 63 6b 73 0a 7d 20 24 65 78  et ::locks.} $ex
2f30: 70 65 63 74 65 64 5f 6c 6f 63 6b 73 0a 64 62 20  pected_locks.db 
2f40: 63 6c 6f 73 65 0a 74 76 66 73 20 64 65 6c 65 74  close.tvfs delet
2f50: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
2fa0: 54 68 69 73 20 62 6c 6f 63 6b 2c 20 74 65 73 74  This block, test
2fb0: 20 63 61 73 65 73 20 77 61 6c 32 2d 36 2e 2a 2c   cases wal2-6.*,
2fc0: 20 74 65 73 74 73 20 74 68 65 20 6f 70 65 72 61   tests the opera
2fd0: 74 69 6f 6e 20 6f 66 20 57 41 4c 20 77 69 74 68  tion of WAL with
2fe0: 0a 23 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69  .# "PRAGMA locki
2ff0: 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
3000: 45 22 20 73 65 74 2e 0a 23 0a 23 20 20 20 77 61  E" set..#.#   wa
3010: 6c 32 2d 36 2e 31 2e 2a 3a 20 43 68 61 6e 67 69  l2-6.1.*: Changi
3020: 6e 67 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 62  ng to WAL mode b
3030: 65 66 6f 72 65 20 73 65 74 74 69 6e 67 20 6c 6f  efore setting lo
3040: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
3050: 73 69 76 65 2e 0a 23 0a 23 20 20 20 77 61 6c 32  sive..#.#   wal2
3060: 2d 36 2e 32 2e 2a 3a 20 43 68 61 6e 67 69 6e 67  -6.2.*: Changing
3070: 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 61 66 74   to WAL mode aft
3080: 65 72 20 73 65 74 74 69 6e 67 20 6c 6f 63 6b 69  er setting locki
3090: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
30a0: 65 2e 0a 23 0a 23 20 20 20 77 61 6c 32 2d 36 2e  e..#.#   wal2-6.
30b0: 33 2e 2a 3a 20 43 68 61 6e 67 69 6e 67 20 62 61  3.*: Changing ba
30c0: 63 6b 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6d  ck to rollback m
30d0: 6f 64 65 20 66 72 6f 6d 20 57 41 4c 20 6d 6f 64  ode from WAL mod
30e0: 65 20 61 66 74 65 72 20 73 65 74 74 69 6e 67 20  e after setting 
30f0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
3100: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
3110: 63 6c 75 73 69 76 65 2e 0a 23 0a 23 20 20 20 77  clusive..#.#   w
3120: 61 6c 32 2d 36 2e 34 2e 2a 3a 20 43 68 65 63 6b  al2-6.4.*: Check
3130: 20 74 68 61 74 20 78 53 68 6d 4c 6f 63 6b 20 63   that xShmLock c
3140: 61 6c 6c 73 20 61 72 65 20 6f 6d 69 74 74 65 64  alls are omitted
3150: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   in exclusive lo
3160: 63 6b 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20  cking.#         
3170: 20 20 20 20 20 20 6d 6f 64 65 2e 0a 23 0a 23 20        mode..#.# 
3180: 20 20 77 61 6c 32 2d 36 2e 35 2e 2a 3a 20 0a 23    wal2-6.5.*: .#
3190: 0a 23 20 20 20 77 61 6c 32 2d 36 2e 36 2e 2a 3a  .#   wal2-6.6.*:
31a0: 20 43 68 65 63 6b 20 74 68 61 74 20 69 66 20 74   Check that if t
31b0: 68 65 20 78 53 68 6d 4c 6f 63 6b 28 29 20 74 6f  he xShmLock() to
31c0: 20 72 65 61 71 75 69 72 65 20 61 20 57 41 4c 20   reaquire a WAL 
31d0: 72 65 61 64 2d 6c 6f 63 6b 20 77 68 65 6e 0a 23  read-lock when.#
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
31f0: 78 69 74 69 6e 67 20 65 78 63 6c 75 73 69 76 65  xiting exclusive
3200: 20 6d 6f 64 65 20 66 61 69 6c 73 20 28 69 2e 65   mode fails (i.e
3210: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2c  . SQLITE_IOERR),
3220: 20 74 68 65 6e 20 74 68 65 0a 23 20 20 20 20 20   then the.#     
3230: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63            connec
3240: 74 69 6f 6e 20 73 69 6c 65 6e 74 6c 79 20 72 65  tion silently re
3250: 6d 61 69 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  mains in exclusi
3260: 76 65 20 6d 6f 64 65 2e 0a 23 0a 64 6f 5f 74 65  ve mode..#.do_te
3270: 73 74 20 77 61 6c 32 2d 36 2e 31 2e 31 20 7b 0a  st wal2-6.1.1 {.
3280: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
3290: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61  st.db test.db-wa
32a0: 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  l test.db-journa
32b0: 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  l.  sqlite3 db t
32c0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
32d0: 20 7b 0a 20 20 20 20 50 72 61 67 6d 61 20 4a 6f   {.    Pragma Jo
32e0: 75 72 6e 61 6c 5f 4d 6f 64 65 20 3d 20 57 61 6c  urnal_Mode = Wal
32f0: 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f  ;.  }.} {wal}.do
3300: 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 31 2e 32  _test wal2-6.1.2
3310: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
3320: 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75  RAGMA lock_statu
3330: 73 20 7d 0a 7d 20 7b 6d 61 69 6e 20 75 6e 6c 6f  s }.} {main unlo
3340: 63 6b 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64  cked temp closed
3350: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  }.do_test wal2-6
3360: 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
3370: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
3380: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
3390: 65 72 3b 0a 20 20 20 20 50 72 61 67 6d 61 20 4c  er;.    Pragma L
33a0: 6f 63 6b 69 6e 67 5f 4d 6f 64 65 20 3d 20 45 78  ocking_Mode = Ex
33b0: 63 6c 75 73 69 76 65 3b 0a 20 20 7d 0a 20 20 65  clusive;.  }.  e
33c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
33d0: 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  IN;.      CREATE
33e0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
33f0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3400: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
3410: 32 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  2);.    COMMIT;.
3420: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
3430: 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 6d  status;.  }.} {m
3440: 61 69 6e 20 65 78 63 6c 75 73 69 76 65 20 74 65  ain exclusive te
3450: 6d 70 20 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65  mp closed}.do_te
3460: 73 74 20 77 61 6c 32 2d 36 2e 31 2e 34 20 7b 0a  st wal2-6.1.4 {.
3470: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
3480: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
3490: 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 3b 20 0a  mode = normal; .
34a0: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
34b0: 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 6e  status;.  }.} {n
34c0: 6f 72 6d 61 6c 20 6d 61 69 6e 20 65 78 63 6c 75  ormal main exclu
34d0: 73 69 76 65 20 74 65 6d 70 20 63 6c 6f 73 65 64  sive temp closed
34e0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  }.do_test wal2-6
34f0: 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.5 {.  execsql
3500: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 2a   { .    SELECT *
3510: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52   FROM t1;.    PR
3520: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
3530: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 6d 61 69  ;.  }.} {1 2 mai
3540: 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20 63 6c  n shared temp cl
3550: 6f 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61  osed}.do_test wa
3560: 6c 32 2d 36 2e 31 2e 36 20 7b 0a 20 20 65 78 65  l2-6.1.6 {.  exe
3570: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
3580: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3590: 28 33 2c 20 34 29 3b 0a 20 20 20 20 50 52 41 47  (3, 4);.    PRAG
35a0: 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a  MA lock_status;.
35b0: 20 20 7d 0a 7d 20 7b 6d 61 69 6e 20 73 68 61 72    }.} {main shar
35c0: 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a  ed temp closed}.
35d0: 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73  db close..do_tes
35e0: 74 20 77 61 6c 32 2d 36 2e 32 2e 31 20 7b 0a 20  t wal2-6.2.1 {. 
35f0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
3600: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
3610: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3620: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
3630: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
3640: 7b 0a 20 20 20 20 50 72 61 67 6d 61 20 4c 6f 63  {.    Pragma Loc
3650: 6b 69 6e 67 5f 4d 6f 64 65 20 3d 20 45 78 63 6c  king_Mode = Excl
3660: 75 73 69 76 65 3b 0a 20 20 20 20 50 72 61 67 6d  usive;.    Pragm
3670: 61 20 4a 6f 75 72 6e 61 6c 5f 4d 6f 64 65 20 3d  a Journal_Mode =
3680: 20 57 61 6c 3b 0a 20 20 20 20 50 72 61 67 6d 61   Wal;.    Pragma
3690: 20 4c 6f 63 6b 5f 53 74 61 74 75 73 3b 0a 20 20   Lock_Status;.  
36a0: 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 77  }.} {exclusive w
36b0: 61 6c 20 6d 61 69 6e 20 65 78 63 6c 75 73 69 76  al main exclusiv
36c0: 65 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 64  e temp closed}.d
36d0: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 32 2e  o_test wal2-6.2.
36e0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
36f0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
3700: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
3710: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e  (a, b);.      IN
3720: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3730: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 43  UES(1, 2);.    C
3740: 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 72 61 67 6d  OMMIT;.    Pragm
3750: 61 20 6c 6f 43 4b 5f 53 54 41 54 75 73 3b 0a 20  a loCK_STATus;. 
3760: 20 7d 0a 7d 20 7b 6d 61 69 6e 20 65 78 63 6c 75   }.} {main exclu
3770: 73 69 76 65 20 74 65 6d 70 20 63 6c 6f 73 65 64  sive temp closed
3780: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  }.do_test wal2-6
3790: 2e 32 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73  .2.3 {.  db clos
37a0: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
37b0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
37c0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
37d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d   sqlite_master }
37e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
37f0: 47 4d 41 20 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  GMA LOCKING_MODE
3800: 20 3d 20 45 58 43 4c 55 53 49 56 45 20 7d 0a 7d   = EXCLUSIVE }.}
3810: 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f   {exclusive}.do_
3820: 74 65 73 74 20 77 61 6c 32 2d 36 2e 32 2e 34 20  test wal2-6.2.4 
3830: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3840: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3850: 74 31 3b 0a 20 20 20 20 70 72 61 67 6d 61 20 6c  t1;.    pragma l
3860: 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a  ock_status;.  }.
3870: 7d 20 7b 31 20 32 20 6d 61 69 6e 20 73 68 61 72  } {1 2 main shar
3880: 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a  ed temp closed}.
3890: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 32  do_test wal2-6.2
38a0: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
38b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
38c0: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
38d0: 3b 0a 20 20 20 20 70 72 61 67 6d 61 20 6c 6f 63  ;.    pragma loc
38e0: 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20  k_status;.  }.} 
38f0: 7b 6d 61 69 6e 20 65 78 63 6c 75 73 69 76 65 20  {main exclusive 
3900: 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 64 6f 5f  temp closed}.do_
3910: 74 65 73 74 20 77 61 6c 32 2d 36 2e 32 2e 36 20  test wal2-6.2.6 
3920: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3930: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
3940: 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 3b 0a  _mode = NORMAL;.
3950: 20 20 20 20 70 72 61 67 6d 61 20 6c 6f 63 6b 5f      pragma lock_
3960: 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 6e  status;.  }.} {n
3970: 6f 72 6d 61 6c 20 6d 61 69 6e 20 65 78 63 6c 75  ormal main exclu
3980: 73 69 76 65 20 74 65 6d 70 20 63 6c 6f 73 65 64  sive temp closed
3990: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  }.do_test wal2-6
39a0: 2e 32 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.7 {.  execsql
39b0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d   {.    BEGIN IMM
39c0: 45 44 49 41 54 45 3b 20 43 4f 4d 4d 49 54 3b 0a  EDIATE; COMMIT;.
39d0: 20 20 20 20 70 72 61 67 6d 61 20 6c 6f 63 6b 5f      pragma lock_
39e0: 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 6d  status;.  }.} {m
39f0: 61 69 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20  ain shared temp 
3a00: 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20  closed}.do_test 
3a10: 77 61 6c 32 2d 36 2e 32 2e 38 20 7b 0a 20 20 65  wal2-6.2.8 {.  e
3a20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
3a30: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
3a40: 20 3d 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20   = EXCLUSIVE;.  
3a50: 20 20 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54    BEGIN IMMEDIAT
3a60: 45 3b 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50  E; COMMIT;.    P
3a70: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
3a80: 64 65 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  de = NORMAL;.  }
3a90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3aa0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3ab0: 31 3b 0a 20 20 20 20 70 72 61 67 6d 61 20 6c 6f  1;.    pragma lo
3ac0: 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d  ck_status;.  }.}
3ad0: 20 7b 31 20 32 20 33 20 34 20 6d 61 69 6e 20 73   {1 2 3 4 main s
3ae0: 68 61 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65  hared temp close
3af0: 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  d}.do_test wal2-
3b00: 36 2e 32 2e 39 20 7b 0a 20 20 65 78 65 63 73 71  6.2.9 {.  execsq
3b10: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
3b20: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
3b30: 20 36 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   6);.    SELECT 
3b40: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 70  * FROM t1;.    p
3b50: 72 61 67 6d 61 20 6c 6f 63 6b 5f 73 74 61 74 75  ragma lock_statu
3b60: 73 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20  s;.  }.} {1 2 3 
3b70: 34 20 35 20 36 20 6d 61 69 6e 20 73 68 61 72 65  4 5 6 main share
3b80: 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 64  d temp closed}.d
3b90: 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74  b close..do_test
3ba0: 20 77 61 6c 32 2d 36 2e 33 2e 31 20 7b 0a 20 20   wal2-6.3.1 {.  
3bb0: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
3bc0: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  .db test.db-wal 
3bd0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
3be0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
3bf0: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
3c00: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
3c10: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
3c20: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
3c30: 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73  ng_mode = exclus
3c40: 69 76 65 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ive;.    BEGIN;.
3c50: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
3c60: 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20  LE t1(x);.      
3c70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3c80: 41 4c 55 45 53 28 27 43 68 69 63 6f 27 29 3b 0a  ALUES('Chico');.
3c90: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3ca0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 48 61 72  O t1 VALUES('Har
3cb0: 70 6f 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  po');.    COMMIT
3cc0: 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 66 69  ;.  }.  list [fi
3cd0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
3ce0: 62 2d 77 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69  b-wal] [file exi
3cf0: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
3d00: 6e 61 6c 5d 0a 7d 20 7b 31 20 30 7d 0a 64 6f 5f  nal].} {1 0}.do_
3d10: 74 65 73 74 20 77 61 6c 32 2d 36 2e 33 2e 32 20  test wal2-6.3.2 
3d20: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
3d30: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
3d40: 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 66  e = DELETE }.  f
3d50: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
3d60: 64 62 2d 77 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f  db-wal.} {0}.do_
3d70: 74 65 73 74 20 77 61 6c 32 2d 36 2e 33 2e 33 20  test wal2-6.3.3 
3d80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
3d90: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
3da0: 20 7d 0a 7d 20 7b 6d 61 69 6e 20 65 78 63 6c 75   }.} {main exclu
3db0: 73 69 76 65 20 74 65 6d 70 20 63 6c 6f 73 65 64  sive temp closed
3dc0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  }.do_test wal2-6
3dd0: 2e 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.4 {.  execsql
3de0: 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20   { .    BEGIN;. 
3df0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3e00: 20 74 31 20 56 41 4c 55 45 53 28 27 47 72 6f 75   t1 VALUES('Grou
3e10: 63 68 6f 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  cho');.  }.} {}.
3e20: 69 66 20 7b 5b 61 74 6f 6d 69 63 5f 62 61 74 63  if {[atomic_batc
3e30: 68 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 5d  h_write test.db]
3e40: 3d 3d 30 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  ==0} {.  do_test
3e50: 20 77 61 6c 32 2d 36 2e 33 2e 34 2e 31 20 7b 0a   wal2-6.3.4.1 {.
3e60: 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65      list [file e
3e70: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61  xists test.db-wa
3e80: 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  l] [file exists 
3e90: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d  test.db-journal]
3ea0: 0a 20 20 7d 20 7b 30 20 31 7d 0a 7d 0a 64 6f 5f  .  } {0 1}.}.do_
3eb0: 74 65 73 74 20 77 61 6c 32 2d 36 2e 33 2e 35 20  test wal2-6.3.5 
3ec0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
3ed0: 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73  AGMA lock_status
3ee0: 20 7d 0a 7d 20 7b 6d 61 69 6e 20 65 78 63 6c 75   }.} {main exclu
3ef0: 73 69 76 65 20 74 65 6d 70 20 63 6c 6f 73 65 64  sive temp closed
3f00: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  }.do_test wal2-6
3f10: 2e 33 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.6 {.  execsql
3f20: 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 7d 20 7b 7d   { COMMIT }.} {}
3f30: 0a 69 66 20 7b 5b 61 74 6f 6d 69 63 5f 62 61 74  .if {[atomic_bat
3f40: 63 68 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  ch_write test.db
3f50: 5d 3d 3d 30 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  ]==0} {.  do_tes
3f60: 74 20 77 61 6c 32 2d 36 2e 33 2e 36 2e 31 20 7b  t wal2-6.3.6.1 {
3f70: 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20  .    list [file 
3f80: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77  exists test.db-w
3f90: 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73  al] [file exists
3fa0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3fb0: 5d 0a 20 20 7d 20 7b 30 20 31 7d 0a 7d 0a 64 6f  ].  } {0 1}.}.do
3fc0: 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 33 2e 37  _test wal2-6.3.7
3fd0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
3fe0: 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75  RAGMA lock_statu
3ff0: 73 20 7d 0a 7d 20 7b 6d 61 69 6e 20 65 78 63 6c  s }.} {main excl
4000: 75 73 69 76 65 20 74 65 6d 70 20 63 6c 6f 73 65  usive temp close
4010: 64 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 0a 23 20  d}.db close...# 
4020: 54 68 69 73 20 74 65 73 74 20 2d 20 77 61 6c 32  This test - wal2
4030: 2d 36 2e 34 2e 2a 20 2d 20 75 73 65 73 20 61 20  -6.4.* - uses a 
4040: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
4050: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 74  connection and t
4060: 68 65 0a 23 20 5b 74 65 73 74 76 66 73 5d 20 69  he.# [testvfs] i
4070: 6e 73 74 72 75 6d 65 6e 74 61 74 69 6f 6e 20 74  nstrumentation t
4080: 6f 20 74 65 73 74 20 74 68 61 74 20 78 53 68 6d  o test that xShm
4090: 4c 6f 63 6b 28 29 20 69 73 20 62 65 69 6e 67 20  Lock() is being 
40a0: 63 61 6c 6c 65 64 0a 23 20 61 73 20 65 78 70 65  called.# as expe
40b0: 63 74 65 64 20 77 68 65 6e 20 61 20 57 41 4c 20  cted when a WAL 
40c0: 64 61 74 61 62 61 73 65 20 69 73 20 75 73 65 64  database is used
40d0: 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f   with locking_mo
40e0: 64 65 3d 65 78 63 6c 75 73 69 76 65 2e 0a 23 0a  de=exclusive..#.
40f0: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 34  do_test wal2-6.4
4100: 2e 31 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65  .1 {.  forcedele
4110: 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  te test.db test.
4120: 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a  db-wal test.db-j
4130: 6f 75 72 6e 61 6c 0a 20 20 70 72 6f 63 20 74 76  ournal.  proc tv
4140: 66 73 5f 63 62 20 7b 6d 65 74 68 6f 64 20 61 72  fs_cb {method ar
4150: 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a  gs} {.    set ::
4160: 73 68 6d 5f 66 69 6c 65 20 5b 6c 69 6e 64 65 78  shm_file [lindex
4170: 20 24 61 72 67 73 20 30 5d 0a 20 20 20 20 69 66   $args 0].    if
4180: 20 7b 24 6d 65 74 68 6f 64 20 3d 3d 20 22 78 53   {$method == "xS
4190: 68 6d 4c 6f 63 6b 22 7d 20 7b 20 6c 61 70 70 65  hmLock"} { lappe
41a0: 6e 64 20 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 6e 64  nd ::locks [lind
41b0: 65 78 20 24 61 72 67 73 20 32 5d 20 7d 0a 20 20  ex $args 2] }.  
41c0: 20 20 72 65 74 75 72 6e 20 22 53 51 4c 49 54 45    return "SQLITE
41d0: 5f 4f 4b 22 0a 20 20 7d 0a 20 20 74 65 73 74 76  _OK".  }.  testv
41e0: 66 73 20 74 76 66 73 0a 20 20 74 76 66 73 20 73  fs tvfs.  tvfs s
41f0: 63 72 69 70 74 20 74 76 66 73 5f 63 62 0a 20 20  cript tvfs_cb.  
4200: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
4210: 64 62 20 2d 76 66 73 20 74 76 66 73 0a 20 20 73  db -vfs tvfs.  s
4220: 65 74 20 7b 7d 20 7b 7d 0a 7d 20 7b 7d 0a 0a 73  et {} {}.} {}..s
4230: 65 74 20 52 45 43 4f 56 45 52 59 20 7b 0a 20 20  et RECOVERY {.  
4240: 7b 30 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73  {0 1 lock exclus
4250: 69 76 65 7d 20 7b 31 20 32 20 6c 6f 63 6b 20 65  ive} {1 2 lock e
4260: 78 63 6c 75 73 69 76 65 7d 20 7b 34 20 34 20 6c  xclusive} {4 4 l
4270: 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 0a 20  ock exclusive}. 
4280: 20 7b 31 20 32 20 75 6e 6c 6f 63 6b 20 65 78 63   {1 2 unlock exc
4290: 6c 75 73 69 76 65 7d 20 7b 34 20 34 20 75 6e 6c  lusive} {4 4 unl
42a0: 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 7b  ock exclusive} {
42b0: 30 20 31 20 75 6e 6c 6f 63 6b 20 65 78 63 6c 75  0 1 unlock exclu
42c0: 73 69 76 65 7d 0a 7d 0a 73 65 74 20 52 45 41 44  sive}.}.set READ
42d0: 4d 41 52 4b 30 5f 52 45 41 44 20 7b 0a 20 20 7b  MARK0_READ {.  {
42e0: 33 20 31 20 6c 6f 63 6b 20 73 68 61 72 65 64 7d  3 1 lock shared}
42f0: 20 7b 33 20 31 20 75 6e 6c 6f 63 6b 20 73 68 61   {3 1 unlock sha
4300: 72 65 64 7d 0a 7d 0a 73 65 74 20 52 45 41 44 4d  red}.}.set READM
4310: 41 52 4b 30 5f 57 52 49 54 45 20 7b 0a 20 20 7b  ARK0_WRITE {.  {
4320: 33 20 31 20 6c 6f 63 6b 20 73 68 61 72 65 64 7d  3 1 lock shared}
4330: 20 0a 20 20 7b 30 20 31 20 6c 6f 63 6b 20 65 78   .  {0 1 lock ex
4340: 63 6c 75 73 69 76 65 7d 20 7b 33 20 31 20 75 6e  clusive} {3 1 un
4350: 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 0a 20 20  lock shared} .  
4360: 7b 34 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73  {4 1 lock exclus
4370: 69 76 65 7d 20 7b 34 20 31 20 75 6e 6c 6f 63 6b  ive} {4 1 unlock
4380: 20 65 78 63 6c 75 73 69 76 65 7d 20 7b 34 20 31   exclusive} {4 1
4390: 20 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 0a 20   lock shared} . 
43a0: 20 7b 30 20 31 20 75 6e 6c 6f 63 6b 20 65 78 63   {0 1 unlock exc
43b0: 6c 75 73 69 76 65 7d 20 7b 34 20 31 20 75 6e 6c  lusive} {4 1 unl
43c0: 6f 63 6b 20 73 68 61 72 65 64 7d 0a 7d 0a 73 65  ock shared}.}.se
43d0: 74 20 52 45 41 44 4d 41 52 4b 31 5f 53 45 54 20  t READMARK1_SET 
43e0: 7b 0a 20 20 7b 34 20 31 20 6c 6f 63 6b 20 65 78  {.  {4 1 lock ex
43f0: 63 6c 75 73 69 76 65 7d 20 7b 34 20 31 20 75 6e  clusive} {4 1 un
4400: 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 0a  lock exclusive}.
4410: 7d 0a 73 65 74 20 52 45 41 44 4d 41 52 4b 31 5f  }.set READMARK1_
4420: 52 45 41 44 20 7b 0a 20 20 7b 34 20 31 20 6c 6f  READ {.  {4 1 lo
4430: 63 6b 20 73 68 61 72 65 64 7d 20 7b 34 20 31 20  ck shared} {4 1 
4440: 75 6e 6c 6f 63 6b 20 73 68 61 72 65 64 7d 0a 7d  unlock shared}.}
4450: 0a 73 65 74 20 52 45 41 44 4d 41 52 4b 31 5f 57  .set READMARK1_W
4460: 52 49 54 45 20 7b 0a 20 20 7b 34 20 31 20 6c 6f  RITE {.  {4 1 lo
4470: 63 6b 20 73 68 61 72 65 64 7d 20 0a 20 20 20 20  ck shared} .    
4480: 7b 30 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73  {0 1 lock exclus
4490: 69 76 65 7d 20 7b 30 20 31 20 75 6e 6c 6f 63 6b  ive} {0 1 unlock
44a0: 20 65 78 63 6c 75 73 69 76 65 7d 20 0a 20 20 7b   exclusive} .  {
44b0: 34 20 31 20 75 6e 6c 6f 63 6b 20 73 68 61 72 65  4 1 unlock share
44c0: 64 7d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  d}.}..foreach {t
44d0: 6e 20 73 71 6c 20 72 65 73 20 65 78 70 65 63 74  n sql res expect
44e0: 65 64 5f 6c 6f 63 6b 73 7d 20 7b 0a 20 20 32 20  ed_locks} {.  2 
44f0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
4500: 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20  o_vacuum = 0;.  
4510: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
4520: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
4530: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
4540: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
4550: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
4560: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 4c  NTO t1 VALUES('L
4570: 65 6f 6e 61 72 64 27 29 3b 0a 20 20 20 20 20 20  eonard');.      
4580: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4590: 41 4c 55 45 53 28 27 41 72 74 68 75 72 27 29 3b  ALUES('Arthur');
45a0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
45b0: 20 7b 77 61 6c 7d 20 7b 0a 20 20 20 20 24 52 45   {wal} {.    $RE
45c0: 43 4f 56 45 52 59 20 0a 20 20 20 20 24 52 45 41  COVERY .    $REA
45d0: 44 4d 41 52 4b 30 5f 57 52 49 54 45 0a 20 20 7d  DMARK0_WRITE.  }
45e0: 0a 0a 20 20 33 20 7b 0a 20 20 20 20 23 20 54 68  ..  3 {.    # Th
45f0: 69 73 20 74 65 73 74 20 73 68 6f 75 6c 64 20 64  is test should d
4600: 6f 20 74 68 65 20 52 45 41 44 4d 41 52 4b 31 5f  o the READMARK1_
4610: 53 45 54 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  SET locking to p
4620: 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 20 20 20  opulate the .   
4630: 20 23 20 61 52 65 61 64 4d 61 72 6b 5b 31 5d 20   # aReadMark[1] 
4640: 73 6c 6f 74 20 77 69 74 68 20 74 68 65 20 63 75  slot with the cu
4650: 72 72 65 6e 74 20 6d 78 46 72 61 6d 65 20 76 61  rrent mxFrame va
4660: 6c 75 65 2e 20 46 6f 6c 6c 6f 77 65 64 20 62 79  lue. Followed by
4670: 0a 20 20 20 20 23 20 52 45 41 44 4d 41 52 4b 31  .    # READMARK1
4680: 5f 52 45 41 44 20 74 6f 20 72 65 61 64 20 74 68  _READ to read th
4690: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
46a0: 23 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  #.    SELECT * F
46b0: 52 4f 4d 20 74 31 0a 20 20 7d 20 7b 4c 65 6f 6e  ROM t1.  } {Leon
46c0: 61 72 64 20 41 72 74 68 75 72 7d 20 7b 0a 20 20  ard Arthur} {.  
46d0: 20 20 24 52 45 41 44 4d 41 52 4b 31 5f 53 45 54    $READMARK1_SET
46e0: 0a 20 20 20 20 24 52 45 41 44 4d 41 52 4b 31 5f  .    $READMARK1_
46f0: 52 45 41 44 0a 20 20 7d 0a 0a 20 20 34 20 7b 0a  READ.  }..  4 {.
4700: 20 20 20 20 23 20 61 52 65 61 64 4d 61 72 6b 5b      # aReadMark[
4710: 31 5d 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  1] is already se
4720: 74 20 74 6f 20 6d 78 46 72 61 6d 65 2e 20 53 6f  t to mxFrame. So
4730: 20 6a 75 73 74 20 52 45 41 44 4d 41 52 4b 31 5f   just READMARK1_
4740: 52 45 41 44 0a 20 20 20 20 23 20 74 68 69 73 20  READ.    # this 
4750: 74 69 6d 65 2c 20 6e 6f 74 20 52 45 41 44 4d 41  time, not READMA
4760: 52 4b 31 5f 53 45 54 2e 0a 20 20 20 20 23 0a 20  RK1_SET..    #. 
4770: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4780: 20 74 31 20 4f 52 44 45 52 20 42 59 20 78 0a 20   t1 ORDER BY x. 
4790: 20 7d 20 7b 41 72 74 68 75 72 20 4c 65 6f 6e 61   } {Arthur Leona
47a0: 72 64 7d 20 7b 20 0a 20 20 20 20 24 52 45 41 44  rd} { .    $READ
47b0: 4d 41 52 4b 31 5f 52 45 41 44 20 0a 20 20 7d 0a  MARK1_READ .  }.
47c0: 0a 20 20 35 20 7b 0a 20 20 20 20 50 52 41 47 4d  .  5 {.    PRAGM
47d0: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
47e0: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 7d 20 7b   exclusive.  } {
47f0: 65 78 63 6c 75 73 69 76 65 7d 20 7b 20 7d 20 0a  exclusive} { } .
4800: 0a 20 20 36 20 7b 0a 20 20 20 20 49 4e 53 45 52  .  6 {.    INSER
4810: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4820: 28 27 4a 75 6c 69 75 73 20 48 65 6e 72 79 27 29  ('Julius Henry')
4830: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
4840: 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 7b 4c 65 6f  ROM t1;.  } {Leo
4850: 6e 61 72 64 20 41 72 74 68 75 72 20 7b 4a 75 6c  nard Arthur {Jul
4860: 69 75 73 20 48 65 6e 72 79 7d 7d 20 7b 0a 20 20  ius Henry}} {.  
4870: 20 20 24 52 45 41 44 4d 41 52 4b 31 5f 52 45 41    $READMARK1_REA
4880: 44 0a 20 20 7d 0a 0a 20 20 37 20 7b 0a 20 20 20  D.  }..  7 {.   
4890: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
48a0: 56 41 4c 55 45 53 28 27 4b 61 72 6c 27 29 3b 0a  VALUES('Karl');.
48b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
48c0: 4d 20 74 31 3b 0a 20 20 7d 20 7b 4c 65 6f 6e 61  M t1;.  } {Leona
48d0: 72 64 20 41 72 74 68 75 72 20 7b 4a 75 6c 69 75  rd Arthur {Juliu
48e0: 73 20 48 65 6e 72 79 7d 20 4b 61 72 6c 7d 20 7b  s Henry} Karl} {
48f0: 20 7d 0a 0a 20 20 38 20 7b 0a 20 20 20 20 50 52   }..  8 {.    PR
4900: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
4910: 65 20 3d 20 6e 6f 72 6d 61 6c 0a 20 20 7d 20 7b  e = normal.  } {
4920: 6e 6f 72 6d 61 6c 7d 20 7b 20 7d 0a 0a 20 20 39  normal} { }..  9
4930: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
4940: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
4950: 20 78 0a 20 20 7d 20 7b 41 72 74 68 75 72 20 7b   x.  } {Arthur {
4960: 4a 75 6c 69 75 73 20 48 65 6e 72 79 7d 20 4b 61  Julius Henry} Ka
4970: 72 6c 20 4c 65 6f 6e 61 72 64 7d 20 24 52 45 41  rl Leonard} $REA
4980: 44 4d 41 52 4b 31 5f 52 45 41 44 0a 0a 20 20 31  DMARK1_READ..  1
4990: 30 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  0 { DELETE FROM 
49a0: 74 31 20 7d 20 7b 7d 20 24 52 45 41 44 4d 41 52  t1 } {} $READMAR
49b0: 4b 31 5f 57 52 49 54 45 0a 0a 20 20 31 31 20 7b  K1_WRITE..  11 {
49c0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
49d0: 4f 4d 20 74 31 0a 20 20 7d 20 7b 7d 20 7b 0a 20  OM t1.  } {} {. 
49e0: 20 20 20 24 52 45 41 44 4d 41 52 4b 31 5f 53 45     $READMARK1_SE
49f0: 54 0a 20 20 20 20 24 52 45 41 44 4d 41 52 4b 31  T.    $READMARK1
4a00: 5f 52 45 41 44 0a 20 20 7d 0a 7d 20 7b 0a 0a 20  _READ.  }.} {.. 
4a10: 20 73 65 74 20 4c 20 5b 6c 69 73 74 5d 0a 20 20   set L [list].  
4a20: 66 6f 72 65 61 63 68 20 65 6c 20 5b 73 75 62 73  foreach el [subs
4a30: 74 20 24 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b  t $expected_lock
4a40: 73 5d 20 7b 20 6c 61 70 70 65 6e 64 20 4c 20 24  s] { lappend L $
4a50: 65 6c 20 7d 0a 0a 20 20 73 65 74 20 53 20 22 22  el }..  set S ""
4a60: 0a 20 20 66 6f 72 65 61 63 68 20 73 71 20 5b 73  .  foreach sq [s
4a70: 70 6c 69 74 20 24 73 71 6c 20 22 5c 6e 22 5d 20  plit $sql "\n"] 
4a80: 7b 20 0a 20 20 20 20 73 65 74 20 73 71 20 5b 73  { .    set sq [s
4a90: 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71 5d 0a  tring trim $sq].
4aa0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
4ab0: 6d 61 74 63 68 20 7b 23 2a 7d 20 24 73 71 5d 3d  match {#*} $sq]=
4ac0: 3d 30 7d 20 7b 61 70 70 65 6e 64 20 53 20 22 24  =0} {append S "$
4ad0: 73 71 5c 6e 22 7d 0a 20 20 7d 0a 0a 20 20 73 65  sq\n"}.  }..  se
4ae0: 74 20 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 73 74 5d  t ::locks [list]
4af0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  .  do_test wal2-
4b00: 36 2e 34 2e 24 74 6e 2e 31 20 7b 20 65 78 65 63  6.4.$tn.1 { exec
4b10: 73 71 6c 20 24 53 20 7d 20 24 72 65 73 0a 20 20  sql $S } $res.  
4b20: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 34  do_test wal2-6.4
4b30: 2e 24 74 6e 2e 32 20 7b 20 73 65 74 20 3a 3a 6c  .$tn.2 { set ::l
4b40: 6f 63 6b 73 20 20 7d 20 24 4c 0a 7d 0a 0a 64 62  ocks  } $L.}..db
4b50: 20 63 6c 6f 73 65 0a 74 76 66 73 20 64 65 6c 65   close.tvfs dele
4b60: 74 65 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32  te..do_test wal2
4b70: 2d 36 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74  -6.5.1 {.  sqlit
4b80: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
4b90: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
4ba0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
4bb0: 20 3d 20 30 3b 0a 20 20 20 20 50 52 41 47 4d 41   = 0;.    PRAGMA
4bc0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
4bd0: 77 61 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  wal;.    PRAGMA 
4be0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65  locking_mode = e
4bf0: 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 43 52  xclusive;.    CR
4c00: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
4c10: 20 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   b);.    PRAGMA 
4c20: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
4c30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4c40: 74 32 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27  t2 VALUES('I', '
4c50: 49 49 27 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  II');.    PRAGMA
4c60: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3b 0a 20   journal_mode;. 
4c70: 20 7d 0a 7d 20 7b 77 61 6c 20 65 78 63 6c 75 73   }.} {wal exclus
4c80: 69 76 65 20 30 20 32 20 32 20 77 61 6c 7d 0a 64  ive 0 2 2 wal}.d
4c90: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 35 2e  o_test wal2-6.5.
4ca0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
4cb0: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
4cc0: 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c  ng_mode = normal
4cd0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4ce0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 49 49 49  O t2 VALUES('III
4cf0: 27 2c 20 27 49 56 27 29 3b 0a 20 20 20 20 50 52  ', 'IV');.    PR
4d00: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
4d10: 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b 0a 20  e = exclusive;. 
4d20: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4d30: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f 72 6d   t2;.  }.} {norm
4d40: 61 6c 20 65 78 63 6c 75 73 69 76 65 20 49 20 49  al exclusive I I
4d50: 49 20 49 49 49 20 49 56 7d 0a 64 6f 5f 74 65 73  I III IV}.do_tes
4d60: 74 20 77 61 6c 32 2d 36 2e 35 2e 33 20 7b 0a 20  t wal2-6.5.3 {. 
4d70: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
4d80: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
4d90: 20 7d 0a 7d 20 7b 30 20 32 20 32 7d 0a 64 62 20   }.} {0 2 2}.db 
4da0: 63 6c 6f 73 65 0a 0a 70 72 6f 63 20 6c 6f 63 6b  close..proc lock
4db0: 5f 63 6f 6e 74 72 6f 6c 20 7b 6d 65 74 68 6f 64  _control {method
4dc0: 20 66 69 6c 65 6e 61 6d 65 20 68 61 6e 64 6c 65   filename handle
4dd0: 20 73 70 65 63 7d 20 7b 0a 20 20 66 6f 72 65 61   spec} {.  forea
4de0: 63 68 20 7b 73 74 61 72 74 20 6e 20 6f 70 20 74  ch {start n op t
4df0: 79 70 65 7d 20 24 73 70 65 63 20 62 72 65 61 6b  ype} $spec break
4e00: 0a 20 20 69 66 20 7b 24 6f 70 20 3d 3d 20 22 6c  .  if {$op == "l
4e10: 6f 63 6b 22 7d 20 7b 20 72 65 74 75 72 6e 20 53  ock"} { return S
4e20: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7d 0a 20 20  QLITE_IOERR }.  
4e30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4e40: 0a 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  .}.do_test wal2-
4e50: 36 2e 36 2e 31 20 7b 0a 20 20 74 65 73 74 76 66  6.6.1 {.  testvf
4e60: 73 20 54 0a 20 20 54 20 73 63 72 69 70 74 20 6c  s T.  T script l
4e70: 6f 63 6b 5f 63 6f 6e 74 72 6f 6c 0a 20 20 54 20  ock_control.  T 
4e80: 66 69 6c 74 65 72 20 7b 7d 0a 20 20 73 71 6c 69  filter {}.  sqli
4e90: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d  te3 db test.db -
4ea0: 76 66 73 20 54 0a 20 20 65 78 65 63 73 71 6c 20  vfs T.  execsql 
4eb0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
4ec0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 0a  sqlite_master }.
4ed0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
4ee0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
4ef0: 3d 20 65 78 63 6c 75 73 69 76 65 20 7d 0a 20 20  = exclusive }.  
4f00: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
4f10: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
4f20: 27 56 27 2c 20 27 56 49 27 29 20 7d 0a 7d 20 7b  'V', 'VI') }.} {
4f30: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  }.do_test wal2-6
4f40: 2e 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .6.2 {.  execsql
4f50: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
4f60: 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 20  g_mode = normal 
4f70: 7d 0a 20 20 54 20 66 69 6c 74 65 72 20 78 53 68  }.  T filter xSh
4f80: 6d 4c 6f 63 6b 0a 20 20 65 78 65 63 73 71 6c 20  mLock.  execsql 
4f90: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32  { INSERT INTO t2
4fa0: 20 56 41 4c 55 45 53 28 27 56 49 49 27 2c 20 27   VALUES('VII', '
4fb0: 56 49 49 49 27 29 20 7d 0a 7d 20 7b 7d 0a 64 6f  VIII') }.} {}.do
4fc0: 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 36 2e 33  _test wal2-6.6.3
4fd0: 20 7b 0a 20 20 23 20 41 74 20 74 68 69 73 20 70   {.  # At this p
4fe0: 6f 69 6e 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  oint the connect
4ff0: 69 6f 6e 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c  ion should still
5000: 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
5010: 2d 6d 6f 64 65 2c 20 65 76 65 6e 0a 20 20 23 20  -mode, even.  # 
5020: 74 68 6f 75 67 68 20 69 74 20 74 72 69 65 64 20  though it tried 
5030: 74 6f 20 65 78 69 74 20 65 78 63 6c 75 73 69 76  to exit exclusiv
5040: 65 2d 6d 6f 64 65 20 77 68 65 6e 20 63 6f 6d 6d  e-mode when comm
5050: 69 74 74 69 6e 67 20 74 68 65 20 49 4e 53 45 52  itting the INSER
5060: 54 0a 20 20 23 20 73 74 61 74 65 6d 65 6e 74 20  T.  # statement 
5070: 61 62 6f 76 65 2e 20 54 6f 20 65 78 69 74 20 65  above. To exit e
5080: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 53  xclusive mode, S
5090: 51 4c 69 74 65 20 68 61 73 20 74 6f 20 74 61 6b  QLite has to tak
50a0: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 20  e a read-lock . 
50b0: 20 23 20 6f 6e 20 74 68 65 20 57 41 4c 20 66 69   # on the WAL fi
50c0: 6c 65 20 75 73 69 6e 67 20 78 53 68 6d 4c 6f 63  le using xShmLoc
50d0: 6b 28 29 2e 20 53 69 6e 63 65 20 74 68 61 74 20  k(). Since that 
50e0: 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 69 74 20  call failed, it 
50f0: 72 65 6d 61 69 6e 73 0a 20 20 23 20 69 6e 20 65  remains.  # in e
5100: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 20  xclusive mode.. 
5110: 20 23 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   #.  sqlite3 db2
5120: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 54 0a   test.db -vfs T.
5130: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
5140: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20  ECT * FROM t2 } 
5150: 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  db2.} {1 {databa
5160: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64  se is locked}}.d
5170: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 36 2e  o_test wal2-6.6.
5180: 32 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  2 {.  db2 close.
5190: 20 20 54 20 66 69 6c 74 65 72 20 7b 7d 0a 20 20    T filter {}.  
51a0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
51b0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
51c0: 27 49 58 27 2c 20 27 58 27 29 20 7d 0a 7d 20 7b  'IX', 'X') }.} {
51d0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  }.do_test wal2-6
51e0: 2e 36 2e 34 20 7b 0a 20 20 23 20 54 68 69 73 20  .6.4 {.  # This 
51f0: 74 69 6d 65 2c 20 77 65 20 68 61 76 65 20 73 75  time, we have su
5200: 63 63 65 73 73 66 75 6c 6c 79 20 65 78 69 74 65  ccessfully exite
5210: 64 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  d exclusive mode
5220: 2e 20 53 6f 20 74 68 65 20 73 65 63 6f 6e 64 0a  . So the second.
5230: 20 20 23 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63    # connection c
5240: 61 6e 20 72 65 61 64 20 74 68 65 20 64 61 74 61  an read the data
5250: 62 61 73 65 2e 0a 20 20 73 71 6c 69 74 65 33 20  base..  sqlite3 
5260: 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73  db2 test.db -vfs
5270: 20 54 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   T.  catchsql { 
5280: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
5290: 20 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 49 20 49   } db2.} {0 {I I
52a0: 49 20 49 49 49 20 49 56 20 56 20 56 49 20 56 49  I III IV V VI VI
52b0: 49 20 56 49 49 49 20 49 58 20 58 7d 7d 0a 0a 64  I VIII IX X}}..d
52c0: 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73  b close.db2 clos
52d0: 65 0a 54 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d  e.T delete..#---
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 61 20  ------.# Test a 
5330: 74 68 65 6f 72 79 20 61 62 6f 75 74 20 74 68 65  theory about the
5340: 20 63 68 65 63 6b 73 75 6d 20 61 6c 67 6f 72 69   checksum algori
5350: 74 68 6d 2e 20 54 68 65 6f 72 79 20 77 61 73 20  thm. Theory was 
5360: 66 61 6c 73 65 20 61 6e 64 20 74 68 69 73 0a 23  false and this.#
5370: 20 74 65 73 74 20 64 69 64 20 6e 6f 74 20 70 72   test did not pr
5380: 6f 76 6f 6b 65 20 61 20 62 75 67 2e 0a 23 0a 66  ovoke a bug..#.f
5390: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
53a0: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74  db test.db-wal t
53b0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 64  est.db-journal.d
53c0: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 37 2e 31 2e  o_test wal2-7.1.
53d0: 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  1 {.  sqlite3 db
53e0: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
53f0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
5400: 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36  page_size = 4096
5410: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
5420: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
5430: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5440: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a  E t1(a, b);.  }.
5450: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
5460: 2e 64 62 0a 7d 20 7b 34 30 39 36 7d 0a 64 6f 5f  .db.} {4096}.do_
5470: 74 65 73 74 20 77 61 6c 32 2d 37 2e 31 2e 32 20  test wal2-7.1.2 
5480: 7b 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65  {.  forcecopy te
5490: 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20  st.db test2.db. 
54a0: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e   forcecopy test.
54b0: 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d  db-wal test2.db-
54c0: 77 61 6c 0a 20 20 23 20 54 68 65 20 66 69 72 73  wal.  # The firs
54d0: 74 20 33 32 20 62 79 74 65 73 20 6f 66 20 74 68  t 32 bytes of th
54e0: 65 20 57 41 4c 20 66 69 6c 65 20 63 6f 6e 74 61  e WAL file conta
54f0: 69 6e 20 74 68 65 20 57 41 4c 20 68 65 61 64 65  in the WAL heade
5500: 72 2e 20 4f 66 66 73 65 74 20 34 38 0a 20 20 23  r. Offset 48.  #
5510: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 62 79   is the first by
5520: 74 65 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73  te of the checks
5530: 75 6d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  um for the first
5540: 20 66 72 61 6d 65 20 69 6e 20 74 68 65 20 57 41   frame in the WA
5550: 4c 2e 20 0a 20 20 23 20 54 68 65 20 66 6f 6c 6c  L. .  # The foll
5560: 6f 77 69 6e 67 20 74 68 72 65 65 20 6c 69 6e 65  owing three line
5570: 73 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 63  s replaces the c
5580: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 61 74 20  ontents of that 
5590: 62 79 74 65 20 77 69 74 68 20 0a 20 20 23 20 61  byte with .  # a
55a0: 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c 75 65   different value
55b0: 2e 0a 20 20 73 65 74 20 6e 65 77 76 61 6c 20 46  ..  set newval F
55c0: 46 0a 20 20 69 66 20 7b 24 6e 65 77 76 61 6c 20  F.  if {$newval 
55d0: 3d 3d 20 5b 68 65 78 69 6f 5f 72 65 61 64 20 74  == [hexio_read t
55e0: 65 73 74 32 2e 64 62 2d 77 61 6c 20 34 38 20 31  est2.db-wal 48 1
55f0: 5d 7d 20 7b 20 73 65 74 20 6e 65 77 76 61 6c 20  ]} { set newval 
5600: 30 30 20 7d 0a 20 20 68 65 78 69 6f 5f 77 72 69  00 }.  hexio_wri
5610: 74 65 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 20  te test2.db-wal 
5620: 34 38 20 24 6e 65 77 76 61 6c 0a 7d 20 7b 31 7d  48 $newval.} {1}
5630: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 37 2e  .do_test wal2-7.
5640: 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  1.3 {.  sqlite3 
5650: 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65  db2 test2.db.  e
5660: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
5670: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
5680: 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b   db2.  execsql {
5690: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
56a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 20 64  qlite_master } d
56b0: 62 32 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65  b2.} {}.db close
56c0: 0a 64 62 32 20 63 6c 6f 73 65 0a 66 6f 72 63 65  .db2 close.force
56d0: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74  delete test.db t
56e0: 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e  est.db-wal test.
56f0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 64 6f 5f 74 65  db-journal.do_te
5700: 73 74 20 77 61 6c 32 2d 38 2e 31 2e 32 20 7b 0a  st wal2-8.1.2 {.
5710: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
5720: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
5730: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
5740: 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a 20 20 20  _vacuum=OFF;.   
5750: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
5760: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52  e = 1024;.    PR
5770: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
5780: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45  e = WAL;.    CRE
5790: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
57a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
57b0: 20 74 31 20 56 41 4c 55 45 53 28 7a 65 72 6f 62   t1 VALUES(zerob
57c0: 6c 6f 62 28 38 31 38 38 2a 31 30 32 30 29 29 3b  lob(8188*1020));
57d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
57e0: 45 20 74 32 28 79 29 3b 0a 20 20 20 20 50 52 41  E t2(y);.    PRA
57f0: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
5800: 6e 74 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  nt;.  }.  execsq
5810: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72  l {.    SELECT r
5820: 6f 6f 74 70 61 67 65 3e 3d 38 31 39 32 20 46 52  ootpage>=8192 FR
5830: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
5840: 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20   WHERE tbl_name 
5850: 3d 20 27 74 32 27 3b 0a 20 20 7d 0a 7d 20 7b 31  = 't2';.  }.} {1
5860: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 38  }.do_test wal2-8
5870: 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
5880: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
5890: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
58a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
58b0: 74 33 28 7a 29 3b 0a 20 20 20 20 42 45 47 49 4e  t3(z);.    BEGIN
58c0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
58d0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 72 61  NTO t3 VALUES(ra
58e0: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a  ndomblob(900));.
58f0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
5900: 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64  O t3 SELECT rand
5910: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
5920: 20 74 33 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t3;.      INSER
5930: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5940: 28 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20 20 20  ('hello');.     
5950: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
5960: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
5970: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a  b(900) FROM t3;.
5980: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
5990: 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64  O t3 SELECT rand
59a0: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
59b0: 20 74 33 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t3;.      INSER
59c0: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
59d0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
59e0: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20   FROM t3;.      
59f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
5a00: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
5a10: 28 39 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20  (900) FROM t3;. 
5a20: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5a30: 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t3 SELECT rando
5a40: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
5a50: 74 33 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t3;.      INSERT
5a60: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
5a70: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
5a80: 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 52 4f 4c  FROM t3;.    ROL
5a90: 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 65 78 65  LBACK;.  }.  exe
5aa0: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
5ab0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5ac0: 28 27 67 6f 6f 64 62 79 65 27 29 3b 0a 20 20 20  ('goodbye');.   
5ad0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
5ae0: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
5af0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a  b(900) FROM t3;.
5b00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5b10: 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t3 SELECT random
5b20: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
5b30: 33 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  3;.  }.} {}.do_t
5b40: 65 73 74 20 77 61 6c 32 2d 38 2e 31 2e 34 20 7b  est wal2-8.1.4 {
5b50: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
5b60: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
5b70: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
5b80: 20 74 32 20 7d 0a 7d 20 7b 67 6f 6f 64 62 79 65   t2 }.} {goodbye
5b90: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 62 20 63  }.db2 close.db c
5ba0: 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lose..#---------
5bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bf0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 65 76 65  .# Test that eve
5c00: 6e 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  n if the checksu
5c10: 6d 73 20 66 6f 72 20 62 6f 74 68 20 61 72 65 20  ms for both are 
5c20: 76 61 6c 69 64 2c 20 69 66 20 74 68 65 20 74 77  valid, if the tw
5c30: 6f 20 63 6f 70 69 65 73 0a 23 20 6f 66 20 74 68  o copies.# of th
5c40: 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64  e wal-index head
5c50: 65 72 20 69 6e 20 74 68 65 20 77 61 6c 2d 69 6e  er in the wal-in
5c60: 64 65 78 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  dex do not match
5c70: 2c 20 74 68 65 20 63 6c 69 65 6e 74 0a 23 20 72  , the client.# r
5c80: 75 6e 73 20 28 6f 72 20 61 74 20 6c 65 61 73 74  uns (or at least
5c90: 20 74 72 69 65 73 20 74 6f 20 72 75 6e 29 20 64   tries to run) d
5ca0: 61 74 61 62 61 73 65 20 72 65 63 6f 76 65 72 79  atabase recovery
5cb0: 2e 0a 23 20 0a 23 0a 70 72 6f 63 20 67 65 74 5f  ..# .#.proc get_
5cc0: 6e 61 6d 65 20 7b 6d 65 74 68 6f 64 20 61 72 67  name {method arg
5cd0: 73 7d 20 7b 20 73 65 74 20 3a 3a 66 69 6c 65 6e  s} { set ::filen
5ce0: 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  ame [lindex $arg
5cf0: 73 20 30 5d 20 3b 20 74 76 66 73 20 66 69 6c 74  s 0] ; tvfs filt
5d00: 65 72 20 7b 7d 20 7d 0a 74 65 73 74 76 66 73 20  er {} }.testvfs 
5d10: 74 76 66 73 0a 74 76 66 73 20 73 63 72 69 70 74  tvfs.tvfs script
5d20: 20 67 65 74 5f 6e 61 6d 65 0a 74 76 66 73 20 66   get_name.tvfs f
5d30: 69 6c 74 65 72 20 78 53 68 6d 4f 70 65 6e 0a 0a  ilter xShmOpen..
5d40: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
5d50: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  .db test.db-wal 
5d60: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
5d70: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 39 2e 31  do_test wal2-9.1
5d80: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
5d90: 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 66  test.db -vfs tvf
5da0: 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  s.  execsql {.  
5db0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
5dc0: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
5dd0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28   CREATE TABLE x(
5de0: 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  y);.    INSERT I
5df0: 4e 54 4f 20 78 20 56 41 4c 55 45 53 28 27 42 61  NTO x VALUES('Ba
5e00: 72 74 6f 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  rton');.    INSE
5e10: 52 54 20 49 4e 54 4f 20 78 20 56 41 4c 55 45 53  RT INTO x VALUES
5e20: 28 27 44 65 61 6b 69 6e 27 29 3b 0a 20 20 7d 0a  ('Deakin');.  }.
5e30: 0a 20 20 23 20 53 65 74 20 24 77 69 68 28 31 29  .  # Set $wih(1)
5e40: 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   to the contents
5e50: 20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   of the wal-inde
5e60: 78 20 68 65 61 64 65 72 20 61 66 74 65 72 0a 20  x header after. 
5e70: 20 23 20 74 68 65 20 66 72 61 6d 65 73 20 61 73   # the frames as
5e80: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
5e90: 65 20 66 69 72 73 74 20 74 77 6f 20 72 6f 77 73  e first two rows
5ea0: 20 69 6e 20 74 61 62 6c 65 20 27 78 27 20 68 61   in table 'x' ha
5eb0: 76 65 0a 20 20 23 20 62 65 65 6e 20 69 6e 73 65  ve.  # been inse
5ec0: 72 74 65 64 2e 20 54 68 65 6e 20 69 6e 73 65 72  rted. Then inser
5ed0: 74 20 6f 6e 65 20 6d 6f 72 65 20 72 6f 77 20 61  t one more row a
5ee0: 6e 64 20 73 65 74 20 24 77 69 68 28 32 29 0a 20  nd set $wih(2). 
5ef0: 20 23 20 74 6f 20 74 68 65 20 6e 65 77 20 76 61   # to the new va
5f00: 6c 75 65 20 6f 66 20 74 68 65 20 77 61 6c 2d 69  lue of the wal-i
5f10: 6e 64 65 78 20 68 65 61 64 65 72 2e 0a 20 20 23  ndex header..  #
5f20: 0a 20 20 23 20 49 66 20 74 68 65 20 24 77 69 68  .  # If the $wih
5f30: 28 31 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  (1) is written i
5f40: 6e 74 6f 20 74 68 65 20 77 61 6c 2d 69 6e 64 65  nto the wal-inde
5f50: 78 20 62 65 66 6f 72 65 20 72 75 6e 6e 69 6e 67  x before running
5f60: 0a 20 20 23 20 61 20 72 65 61 64 20 6f 70 65 72  .  # a read oper
5f70: 61 74 69 6f 6e 2c 20 74 68 65 20 63 6c 69 65 6e  ation, the clien
5f80: 74 20 77 69 6c 6c 20 73 65 65 20 6f 6e 6c 79 20  t will see only 
5f90: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 72 6f  the first two ro
5fa0: 77 73 2e 20 49 66 0a 20 20 23 20 24 77 69 68 28  ws. If.  # $wih(
5fb0: 32 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  2) is written in
5fc0: 74 6f 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  to the wal-index
5fd0: 2c 20 74 68 65 20 63 6c 69 65 6e 74 20 77 69 6c  , the client wil
5fe0: 6c 20 73 65 65 0a 20 20 23 20 74 68 72 65 65 20  l see.  # three 
5ff0: 72 6f 77 73 2e 20 49 66 20 61 6e 20 69 6e 76 61  rows. If an inva
6000: 6c 69 64 20 68 65 61 64 65 72 20 69 73 20 77 72  lid header is wr
6010: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 77  itten into the w
6020: 61 6c 2d 69 6e 64 65 78 2c 20 74 68 65 6e 0a 20  al-index, then. 
6030: 20 23 20 74 68 65 20 63 6c 69 65 6e 74 20 77 69   # the client wi
6040: 6c 6c 20 72 75 6e 20 72 65 63 6f 76 65 72 79 20  ll run recovery 
6050: 61 6e 64 20 73 65 65 20 74 68 72 65 65 20 72 6f  and see three ro
6060: 77 73 2e 0a 20 20 23 0a 20 20 73 65 74 20 77 69  ws..  #.  set wi
6070: 68 28 31 29 20 5b 73 65 74 5f 74 76 66 73 5f 68  h(1) [set_tvfs_h
6080: 64 72 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 5d 0a  dr $::filename].
6090: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
60a0: 52 54 20 49 4e 54 4f 20 78 20 56 41 4c 55 45 53  RT INTO x VALUES
60b0: 28 27 57 61 74 73 6f 6e 27 29 20 7d 0a 20 20 73  ('Watson') }.  s
60c0: 65 74 20 77 69 68 28 32 29 20 5b 73 65 74 5f 74  et wih(2) [set_t
60d0: 76 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e  vfs_hdr $::filen
60e0: 61 6d 65 5d 0a 0a 20 20 73 71 6c 69 74 65 33 20  ame]..  sqlite3 
60f0: 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73  db2 test.db -vfs
6100: 20 74 76 66 73 0a 20 20 65 78 65 63 73 71 6c 20   tvfs.  execsql 
6110: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6120: 78 20 7d 20 64 62 32 0a 7d 20 7b 42 61 72 74 6f  x } db2.} {Barto
6130: 6e 20 44 65 61 6b 69 6e 20 57 61 74 73 6f 6e 7d  n Deakin Watson}
6140: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 68 64  ..foreach {tn hd
6150: 72 31 20 68 64 72 32 20 72 65 73 7d 20 5b 6c 69  r1 hdr2 res} [li
6160: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
6190: 20 20 33 20 20 24 77 69 68 28 31 29 20 20 20 20    3  $wih(1)    
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 24 77 69 68              $wih
61b0: 28 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (1)             
61c0: 20 20 20 7b 42 61 72 74 6f 6e 20 44 65 61 6b 69     {Barton Deaki
61d0: 6e 7d 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20  n}          \.  
61e0: 34 20 20 24 77 69 68 28 31 29 20 20 20 20 20 20  4  $wih(1)      
61f0: 20 20 20 20 20 20 20 20 20 20 24 77 69 68 28 32            $wih(2
6200: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
6210: 20 7b 42 61 72 74 6f 6e 20 44 65 61 6b 69 6e 20   {Barton Deakin 
6220: 57 61 74 73 6f 6e 7d 20 20 20 5c 0a 20 20 35 20  Watson}   \.  5 
6230: 20 24 77 69 68 28 32 29 20 20 20 20 20 20 20 20   $wih(2)        
6240: 20 20 20 20 20 20 20 20 24 77 69 68 28 31 29 20          $wih(1) 
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
6260: 42 61 72 74 6f 6e 20 44 65 61 6b 69 6e 20 57 61  Barton Deakin Wa
6270: 74 73 6f 6e 7d 20 20 20 5c 0a 20 20 36 20 20 24  tson}   \.  6  $
6280: 77 69 68 28 32 29 20 20 20 20 20 20 20 20 20 20  wih(2)          
6290: 20 20 20 20 20 20 24 77 69 68 28 32 29 20 20 20        $wih(2)   
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 42 61               {Ba
62b0: 72 74 6f 6e 20 44 65 61 6b 69 6e 20 57 61 74 73  rton Deakin Wats
62c0: 6f 6e 7d 20 20 20 5c 0a 20 20 37 20 20 24 77 69  on}   \.  7  $wi
62d0: 68 28 31 29 20 20 20 20 20 20 20 20 20 20 20 20  h(1)            
62e0: 20 20 20 20 24 77 69 68 28 31 29 20 20 20 20 20      $wih(1)     
62f0: 20 20 20 20 20 20 20 20 20 20 20 7b 42 61 72 74             {Bart
6300: 6f 6e 20 44 65 61 6b 69 6e 7d 20 20 20 20 20 20  on Deakin}      
6310: 20 20 20 20 5c 0a 20 20 38 20 20 7b 30 20 30 20      \.  8  {0 0 
6320: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20  0 0 0 0 0 0 0 0 
6330: 30 20 30 7d 20 7b 30 20 30 20 30 20 30 20 30 20  0 0} {0 0 0 0 0 
6340: 30 20 30 20 30 20 30 20 30 20 30 20 30 7d 20 7b  0 0 0 0 0 0 0} {
6350: 42 61 72 74 6f 6e 20 44 65 61 6b 69 6e 20 57 61  Barton Deakin Wa
6360: 74 73 6f 6e 7d 0a 5d 20 7b 0a 20 20 64 6f 5f 74  tson}.] {.  do_t
6370: 65 73 74 20 77 61 6c 32 2d 39 2e 24 74 6e 20 7b  est wal2-9.$tn {
6380: 0a 20 20 20 20 73 65 74 5f 74 76 66 73 5f 68 64  .    set_tvfs_hd
6390: 72 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 20 24 68  r $::filename $h
63a0: 64 72 31 20 24 68 64 72 32 0a 20 20 20 20 65 78  dr1 $hdr2.    ex
63b0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
63c0: 20 46 52 4f 4d 20 78 20 7d 20 64 62 32 0a 20 20   FROM x } db2.  
63d0: 7d 20 24 72 65 73 0a 7d 0a 0a 64 62 32 20 63 6c  } $res.}..db2 cl
63e0: 6f 73 65 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 2d  ose.db close..#-
63f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20  --------.# This 
6440: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d  block of tests -
6450: 20 77 61 6c 32 2d 31 30 2e 2a 20 2d 20 66 6f 63   wal2-10.* - foc
6460: 75 73 20 6f 6e 20 74 68 65 20 6c 69 62 72 61 72  us on the librar
6470: 69 65 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 0a  ies response to.
6480: 23 20 6e 65 77 20 76 65 72 73 69 6f 6e 73 20 6f  # new versions o
6490: 66 20 74 68 65 20 77 61 6c 20 6f 72 20 77 61 6c  f the wal or wal
64a0: 2d 69 6e 64 65 78 20 66 6f 72 6d 61 74 73 2e 20  -index formats. 
64b0: 0a 23 0a 23 20 20 20 77 61 6c 32 2d 31 30 2e 31  .#.#   wal2-10.1
64c0: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68  .*: Test that th
64d0: 65 20 6c 69 62 72 61 72 79 20 72 65 66 75 73 65  e library refuse
64e0: 73 20 74 6f 20 22 72 65 63 6f 76 65 72 22 20 61  s to "recover" a
64f0: 20 6e 65 77 20 57 41 4c 20 0a 23 20 20 20 20 20   new WAL .#     
6500: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 6d 61             forma
6510: 74 2e 0a 23 0a 23 20 20 20 77 61 6c 32 2d 31 30  t..#.#   wal2-10
6520: 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .2.*: Test that 
6530: 74 68 65 20 6c 69 62 72 61 72 79 20 72 65 66 75  the library refu
6540: 73 65 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ses to read or w
6550: 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65 0a  rite a database.
6560: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
6570: 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
6580: 78 20 76 65 72 73 69 6f 6e 20 69 73 20 6e 65 77  x version is new
6590: 65 72 20 74 68 61 6e 20 69 74 20 75 6e 64 65 72  er than it under
65a0: 73 74 61 6e 64 73 2e 0a 23 0a 23 20 41 74 20 74  stands..#.# At t
65b0: 69 6d 65 20 6f 66 20 77 72 69 74 69 6e 67 2c 20  ime of writing, 
65c0: 74 68 65 20 6f 6e 6c 79 20 76 65 72 73 69 6f 6e  the only version
65d0: 73 20 6f 66 20 74 68 65 20 77 61 6c 20 61 6e 64  s of the wal and
65e0: 20 77 61 6c 2d 69 6e 64 65 78 20 66 6f 72 6d 61   wal-index forma
65f0: 74 73 0a 23 20 74 68 61 74 20 65 78 69 73 74 20  ts.# that exist 
6600: 61 72 65 20 76 65 72 73 69 6f 6e 73 20 33 30 30  are versions 300
6610: 37 30 30 30 20 28 63 6f 72 72 65 73 70 6f 6e 64  7000 (correspond
6620: 69 6e 67 20 74 6f 20 53 51 4c 69 74 65 20 76 65  ing to SQLite ve
6630: 72 73 69 6f 6e 20 33 2e 37 2e 30 2c 0a 23 20 74  rsion 3.7.0,.# t
6640: 68 65 20 66 69 72 73 74 20 76 65 72 73 69 6f 6e  he first version
6650: 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 66 65   of SQLite to fe
6660: 61 74 75 72 65 20 77 61 6c 20 6d 6f 64 65 29 2e  ature wal mode).
6670: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  .#.do_test wal2-
6680: 31 30 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  10.1.1 {.  fault
6690: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
66a0: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
66b0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
66c0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
66d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
66e0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
66f0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
6700: 70 6f 69 6e 74 3b 0a 20 20 20 20 49 4e 53 45 52  point;.    INSER
6710: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6720: 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 2);.    INSE
6730: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6740: 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 66  S(3, 4);.  }.  f
6750: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
6760: 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 74  _close.} {}.do_t
6770: 65 73 74 20 77 61 6c 32 2d 31 30 2e 31 2e 32 20  est wal2-10.1.2 
6780: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
6790: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
67a0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
67b0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  CT * FROM t1 }.}
67c0: 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65   {1 2 3 4}.do_te
67d0: 73 74 20 77 61 6c 32 2d 31 30 2e 31 2e 33 20 7b  st wal2-10.1.3 {
67e0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
67f0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
6800: 20 73 65 74 20 68 64 72 20 5b 77 61 6c 5f 73 65   set hdr [wal_se
6810: 74 5f 77 61 6c 68 64 72 20 74 65 73 74 2e 64 62  t_walhdr test.db
6820: 2d 77 61 6c 5d 0a 20 20 6c 69 6e 64 65 78 20 24  -wal].  lindex $
6830: 68 64 72 20 31 0a 7d 20 7b 33 30 30 37 30 30 30  hdr 1.} {3007000
6840: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31  }.do_test wal2-1
6850: 30 2e 31 2e 34 20 7b 0a 20 20 6c 73 65 74 20 68  0.1.4 {.  lset h
6860: 64 72 20 31 20 33 30 30 37 30 30 31 0a 20 20 77  dr 1 3007001.  w
6870: 61 6c 5f 73 65 74 5f 77 61 6c 68 64 72 20 74 65  al_set_walhdr te
6880: 73 74 2e 64 62 2d 77 61 6c 20 24 68 64 72 0a 20  st.db-wal $hdr. 
6890: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
68a0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  CT * FROM t1 }.}
68b0: 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f   {1 {unable to o
68c0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
68d0: 65 7d 7d 0a 0a 74 65 73 74 76 66 73 20 74 76 66  e}}..testvfs tvf
68e0: 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 64 6f 5f  s -default 1.do_
68f0: 74 65 73 74 20 77 61 6c 32 2d 31 30 2e 32 2e 31  test wal2-10.2.1
6900: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
6910: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
6920: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
6930: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
6940: 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74  } {1 2 3 4}.do_t
6950: 65 73 74 20 77 61 6c 32 2d 31 30 2e 32 2e 32 20  est wal2-10.2.2 
6960: 7b 20 0a 20 20 73 65 74 20 68 64 72 20 5b 73 65  { .  set hdr [se
6970: 74 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a 66 69  t_tvfs_hdr $::fi
6980: 6c 65 6e 61 6d 65 5d 20 0a 20 20 6c 69 6e 64 65  lename] .  linde
6990: 78 20 24 68 64 72 20 30 20 0a 7d 20 7b 33 30 30  x $hdr 0 .} {300
69a0: 37 30 30 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61  7000}.do_test wa
69b0: 6c 32 2d 31 30 2e 32 2e 33 20 7b 20 0a 20 20 6c  l2-10.2.3 { .  l
69c0: 73 65 74 20 68 64 72 20 30 20 33 30 30 37 30 30  set hdr 0 300700
69d0: 31 0a 20 20 77 61 6c 5f 66 69 78 5f 77 61 6c 69  1.  wal_fix_wali
69e0: 6e 64 65 78 5f 63 6b 73 75 6d 20 68 64 72 20 0a  ndex_cksum hdr .
69f0: 20 20 73 65 74 5f 74 76 66 73 5f 68 64 72 20 24    set_tvfs_hdr $
6a00: 3a 3a 66 69 6c 65 6e 61 6d 65 20 24 68 64 72 0a  ::filename $hdr.
6a10: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
6a20: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
6a30: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  } {1 {unable to 
6a40: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
6a50: 6c 65 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  le}}.db close.tv
6a60: 66 73 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d  fs delete..#----
6a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ab0: 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f  -----.# This blo
6ac0: 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 77 61  ck of tests - wa
6ad0: 6c 32 2d 31 31 2e 2a 20 2d 20 74 65 73 74 73 20  l2-11.* - tests 
6ae0: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70  that it is not p
6af0: 6f 73 73 69 62 6c 65 20 74 6f 20 70 75 74 0a 23  ossible to put.#
6b00: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 6e 74   the library int
6b10: 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f  o an infinite lo
6b20: 6f 70 20 62 79 20 70 72 65 73 65 6e 74 69 6e 67  op by presenting
6b30: 20 69 74 20 77 69 74 68 20 61 20 63 6f 72 72 75   it with a corru
6b40: 70 74 0a 23 20 68 61 73 68 20 74 61 62 6c 65 20  pt.# hash table 
6b50: 28 6f 6e 65 20 74 68 61 74 20 61 70 70 65 61 72  (one that appear
6b60: 73 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 73  s to contain a s
6b70: 69 6e 67 6c 65 20 63 68 61 69 6e 20 6f 66 20 69  ingle chain of i
6b80: 6e 66 69 6e 69 74 65 20 0a 23 20 6c 65 6e 67 74  nfinite .# lengt
6b90: 68 29 2e 0a 23 0a 23 20 20 20 77 61 6c 32 2d 31  h)..#.#   wal2-1
6ba0: 31 2e 31 2e 2a 3a 20 57 68 69 6c 65 20 72 65 61  1.1.*: While rea
6bb0: 64 69 6e 67 20 74 68 65 20 68 61 73 68 2d 74 61  ding the hash-ta
6bc0: 62 6c 65 2e 0a 23 0a 23 20 20 20 77 61 6c 32 2d  ble..#.#   wal2-
6bd0: 31 31 2e 32 2e 2a 3a 20 57 68 69 6c 65 20 77 72  11.2.*: While wr
6be0: 69 74 69 6e 67 20 74 68 65 20 68 61 73 68 2d 74  iting the hash-t
6bf0: 61 62 6c 65 2e 0a 23 0a 74 65 73 74 76 66 73 20  able..#.testvfs 
6c00: 74 76 66 73 20 2d 64 65 66 61 75 6c 74 20 31 0a  tvfs -default 1.
6c10: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 31 2e  do_test wal2-11.
6c20: 30 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  0 {.  faultsim_d
6c30: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
6c40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6c50: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
6c60: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
6c70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
6c80: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 49 4e  a, b, c);.    IN
6c90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6ca0: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20  UES(1, 2, 3);.  
6cb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6cc0: 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29   VALUES(4, 5, 6)
6cd0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6ce0: 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38  O t1 VALUES(7, 8
6cf0: 2c 20 39 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  , 9);.    SELECT
6d00: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
6d10: 7d 20 7b 77 61 6c 20 31 20 32 20 33 20 34 20 35  } {wal 1 2 3 4 5
6d20: 20 36 20 37 20 38 20 39 7d 0a 0a 64 6f 5f 74 65   6 7 8 9}..do_te
6d30: 73 74 20 77 61 6c 32 2d 31 31 2e 31 2e 31 20 7b  st wal2-11.1.1 {
6d40: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
6d50: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
6d60: 20 7b 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46   { SELECT name F
6d70: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
6d80: 72 20 7d 20 64 62 32 0a 7d 20 7b 74 31 7d 0a 0a  r } db2.} {t1}..
6d90: 69 66 20 7b 24 3a 3a 74 63 6c 5f 76 65 72 73 69  if {$::tcl_versi
6da0: 6f 6e 3e 3d 38 2e 35 7d 20 7b 0a 20 20 23 20 53  on>=8.5} {.  # S
6db0: 65 74 20 61 6c 6c 20 7a 65 72 6f 65 64 20 73 6c  et all zeroed sl
6dc0: 6f 74 73 20 69 6e 20 74 68 65 20 66 69 72 73 74  ots in the first
6dd0: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 69   hash table to i
6de0: 6e 76 61 6c 69 64 20 76 61 6c 75 65 73 2e 0a 20  nvalid values.. 
6df0: 20 23 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b 73   #.  set blob [s
6e00: 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 74 76 66  tring range [tvf
6e10: 73 20 73 68 6d 20 24 3a 3a 66 69 6c 65 6e 61 6d  s shm $::filenam
6e20: 65 5d 20 30 20 31 36 33 38 33 5d 0a 20 20 73 65  e] 0 16383].  se
6e30: 74 20 49 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  t I [string rang
6e40: 65 20 5b 74 76 66 73 20 73 68 6d 20 24 3a 3a 66  e [tvfs shm $::f
6e50: 69 6c 65 6e 61 6d 65 5d 20 31 36 33 38 34 20 65  ilename] 16384 e
6e60: 6e 64 5d 0a 20 20 62 69 6e 61 72 79 20 73 63 61  nd].  binary sca
6e70: 6e 20 24 49 20 74 2a 20 4c 0a 20 20 73 65 74 20  n $I t* L.  set 
6e80: 49 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61  I [list].  forea
6e90: 63 68 20 70 20 24 4c 20 7b 0a 20 20 20 20 6c 61  ch p $L {.    la
6ea0: 70 70 65 6e 64 20 49 20 5b 65 78 70 72 20 24 70  ppend I [expr $p
6eb0: 20 3f 20 24 70 20 3a 20 34 30 30 5d 0a 20 20 7d   ? $p : 400].  }
6ec0: 0a 20 20 61 70 70 65 6e 64 20 62 6c 6f 62 20 5b  .  append blob [
6ed0: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 74 2a  binary format t*
6ee0: 20 24 49 5d 0a 20 20 74 76 66 73 20 73 68 6d 20   $I].  tvfs shm 
6ef0: 24 3a 3a 66 69 6c 65 6e 61 6d 65 20 24 62 6c 6f  $::filename $blo
6f00: 62 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32  b.  do_test wal2
6f10: 2d 31 31 2e 32 20 7b 0a 20 20 20 20 63 61 74 63  -11.2 {.    catc
6f20: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
6f30: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 30 2c  TO t1 VALUES(10,
6f40: 20 31 31 2c 20 31 32 29 20 7d 0a 20 20 7d 20 7b   11, 12) }.  } {
6f50: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
6f60: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
6f70: 6d 65 64 7d 7d 0a 20 20 0a 20 20 23 20 46 69 6c  med}}.  .  # Fil
6f80: 6c 20 75 70 20 74 68 65 20 68 61 73 68 20 74 61  l up the hash ta
6f90: 62 6c 65 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ble on the first
6fa0: 20 70 61 67 65 20 6f 66 20 73 68 61 72 65 64 20   page of shared 
6fb0: 6d 65 6d 6f 72 79 20 77 69 74 68 20 30 78 35 35  memory with 0x55
6fc0: 20 62 79 74 65 73 2e 0a 20 20 23 0a 20 20 73 65   bytes..  #.  se
6fd0: 74 20 62 6c 6f 62 20 5b 73 74 72 69 6e 67 20 72  t blob [string r
6fe0: 61 6e 67 65 20 5b 74 76 66 73 20 73 68 6d 20 24  ange [tvfs shm $
6ff0: 3a 3a 66 69 6c 65 6e 61 6d 65 5d 20 30 20 31 36  ::filename] 0 16
7000: 33 38 33 5d 0a 20 20 61 70 70 65 6e 64 20 62 6c  383].  append bl
7010: 6f 62 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61  ob [string repea
7020: 74 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74  t [binary format
7030: 20 63 20 35 35 5d 20 31 36 33 38 34 5d 0a 20 20   c 55] 16384].  
7040: 74 76 66 73 20 73 68 6d 20 24 3a 3a 66 69 6c 65  tvfs shm $::file
7050: 6e 61 6d 65 20 24 62 6c 6f 62 0a 20 20 64 6f 5f  name $blob.  do_
7060: 74 65 73 74 20 77 61 6c 32 2d 31 31 2e 33 20 7b  test wal2-11.3 {
7070: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
7080: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
7090: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 64   } db2.  } {1 {d
70a0: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
70b0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
70c0: 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 64 62  }.}..db close.db
70d0: 32 20 63 6c 6f 73 65 0a 74 76 66 73 20 64 65 6c  2 close.tvfs del
70e0: 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete..#----------
70f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7130: 23 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f  # If a connectio
7140: 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
7150: 20 63 72 65 61 74 65 20 61 20 57 41 4c 20 6f 72   create a WAL or
7160: 20 53 48 4d 20 66 69 6c 65 2c 20 69 74 20 63 72   SHM file, it cr
7170: 65 61 74 65 73 20 0a 23 20 74 68 65 20 6e 65 77  eates .# the new
7180: 20 66 69 6c 65 73 20 77 69 74 68 20 74 68 65 20   files with the 
7190: 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
71a0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20   permissions as 
71b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 23 20  the database .# 
71c0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 20 54 65 73  file itself. Tes
71d0: 74 20 74 68 69 73 2e 0a 23 0a 69 66 20 7b 24 3a  t this..#.if {$:
71e0: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c  :tcl_platform(pl
71f0: 61 74 66 6f 72 6d 29 20 3d 3d 20 22 75 6e 69 78  atform) == "unix
7200: 22 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  "} {.  faultsim_
7210: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
7220: 6e 0a 20 20 23 20 43 68 61 6e 67 65 64 20 6f 6e  n.  # Changed on
7230: 20 32 30 31 32 2d 30 32 2d 31 33 3a 20 75 6d 61   2012-02-13: uma
7240: 73 6b 20 69 73 20 64 65 6c 69 62 65 72 61 74 65  sk is deliberate
7250: 6c 79 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 2d  ly ignored for -
7260: 77 61 6c 20 66 69 6c 65 73 2e 0a 20 20 23 73 65  wal files..  #se
7270: 74 20 75 6d 61 73 6b 20 5b 65 78 65 63 20 2f 62  t umask [exec /b
7280: 69 6e 2f 73 68 20 2d 63 20 75 6d 61 73 6b 5d 0a  in/sh -c umask].
7290: 20 20 73 65 74 20 75 6d 61 73 6b 20 30 0a 20 20    set umask 0.  
72a0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32  ..  do_test wal2
72b0: 2d 31 32 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69  -12.1 {.    sqli
72c0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
72d0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
72e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
72f0: 20 74 78 28 79 2c 20 7a 29 3b 0a 20 20 20 20 20   tx(y, z);.     
7300: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
7310: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
7320: 7d 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20  }.    db close. 
7330: 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78     list [file ex
7340: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
7350: 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74  ] [file exists t
7360: 65 73 74 2e 64 62 2d 73 68 6d 5d 0a 20 20 7d 20  est.db-shm].  } 
7370: 7b 30 20 30 7d 0a 20 20 0a 20 20 66 6f 72 65 61  {0 0}.  .  forea
7380: 63 68 20 7b 74 6e 20 70 65 72 6d 69 73 73 69 6f  ch {tn permissio
7390: 6e 73 7d 20 7b 0a 20 20 20 31 20 30 30 36 34 34  ns} {.   1 00644
73a0: 0a 20 20 20 32 20 30 30 36 36 36 0a 20 20 20 33  .   2 00666.   3
73b0: 20 30 30 36 30 30 0a 20 20 20 34 20 30 30 37 35   00600.   4 0075
73c0: 35 0a 20 20 7d 20 7b 0a 20 20 20 20 73 65 74 20  5.  } {.    set 
73d0: 65 66 66 65 63 74 69 76 65 20 5b 66 6f 72 6d 61  effective [forma
73e0: 74 20 25 2e 35 6f 20 5b 65 78 70 72 20 24 70 65  t %.5o [expr $pe
73f0: 72 6d 69 73 73 69 6f 6e 73 20 26 20 7e 24 75 6d  rmissions & ~$um
7400: 61 73 6b 5d 5d 0a 20 20 20 20 64 6f 5f 74 65 73  ask]].    do_tes
7410: 74 20 77 61 6c 32 2d 31 32 2e 32 2e 24 74 6e 2e  t wal2-12.2.$tn.
7420: 31 20 7b 0a 20 20 20 20 20 20 66 69 6c 65 20 61  1 {.      file a
7430: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
7440: 62 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 24  b -permissions $
7450: 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20 20 20 20  permissions.    
7460: 20 20 73 74 72 69 6e 67 20 6d 61 70 20 7b 6f 20    string map {o 
7470: 30 7d 20 5b 66 69 6c 65 20 61 74 74 72 69 62 75  0} [file attribu
7480: 74 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72  tes test.db -per
7490: 6d 69 73 73 69 6f 6e 73 5d 0a 20 20 20 20 7d 20  missions].    } 
74a0: 24 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20 20 20  $permissions.   
74b0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 32   do_test wal2-12
74c0: 2e 32 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20  .2.$tn.2 {.     
74d0: 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73   list [file exis
74e0: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20  ts test.db-wal] 
74f0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73  [file exists tes
7500: 74 2e 64 62 2d 73 68 6d 5d 0a 20 20 20 20 7d 20  t.db-shm].    } 
7510: 7b 30 20 30 7d 0a 20 20 20 20 64 6f 5f 74 65 73  {0 0}.    do_tes
7520: 74 20 77 61 6c 32 2d 31 32 2e 32 2e 24 74 6e 2e  t wal2-12.2.$tn.
7530: 33 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3 {.      sqlite
7540: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
7550: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
7560: 45 52 54 20 49 4e 54 4f 20 74 78 20 44 45 46 41  ERT INTO tx DEFA
7570: 55 4c 54 20 56 41 4c 55 45 53 20 7d 0a 20 20 20  ULT VALUES }.   
7580: 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78     list [file ex
7590: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
75a0: 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74  ] [file exists t
75b0: 65 73 74 2e 64 62 2d 73 68 6d 5d 0a 20 20 20 20  est.db-shm].    
75c0: 7d 20 7b 31 20 31 7d 0a 20 20 20 20 64 6f 5f 74  } {1 1}.    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 34 20 7b 0a 20 20 20 20 20 20 73 65 74 20  n.4 {.      set 
75f0: 78 20 5b 6c 69 73 74 20 5b 66 69 6c 65 20 61 74  x [list [file at
7600: 74 72 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 2d  tr test.db-wal -
7610: 70 65 72 6d 5d 20 5b 66 69 6c 65 20 61 74 74 72  perm] [file attr
7620: 20 74 65 73 74 2e 64 62 2d 73 68 6d 20 2d 70 65   test.db-shm -pe
7630: 72 6d 5d 5d 0a 20 20 20 20 20 20 73 74 72 69 6e  rm]].      strin
7640: 67 20 6d 61 70 20 7b 6f 20 30 7d 20 24 78 0a 20  g map {o 0} $x. 
7650: 20 20 20 7d 20 5b 6c 69 73 74 20 24 65 66 66 65     } [list $effe
7660: 63 74 69 76 65 20 24 65 66 66 65 63 74 69 76 65  ctive $effective
7670: 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61  ].    do_test wa
7680: 6c 32 2d 31 32 2e 32 2e 24 74 6e 2e 35 20 7b 0a  l2-12.2.$tn.5 {.
7690: 20 20 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20        db close. 
76a0: 20 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20       list [file 
76b0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77  exists test.db-w
76c0: 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73  al] [file exists
76d0: 20 74 65 73 74 2e 64 62 2d 73 68 6d 5d 0a 20 20   test.db-shm].  
76e0: 20 20 7d 20 7b 30 20 30 7d 0a 20 20 7d 0a 7d 0a    } {0 0}.  }.}.
76f0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
7740: 73 74 20 74 68 65 20 6c 69 62 72 61 72 69 65 73  st the libraries
7750: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 64 69 73   response to dis
7760: 63 6f 76 65 72 69 6e 67 20 74 68 61 74 20 6f 6e  covering that on
7770: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
7780: 0a 23 20 64 61 74 61 62 61 73 65 2c 20 77 61 6c  .# database, wal
7790: 20 6f 72 20 73 68 6d 20 66 69 6c 65 73 20 63 61   or shm files ca
77a0: 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 20  nnot be opened, 
77b0: 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 6f  or can only be o
77c0: 70 65 6e 65 64 0a 23 20 72 65 61 64 2d 6f 6e 6c  pened.# read-onl
77d0: 79 2e 0a 23 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f  y..#.if {$::tcl_
77e0: 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72  platform(platfor
77f0: 6d 29 20 3d 3d 20 22 75 6e 69 78 22 7d 20 7b 0a  m) == "unix"} {.
7800: 20 20 70 72 6f 63 20 70 65 72 6d 20 7b 7d 20 7b    proc perm {} {
7810: 0a 20 20 20 20 73 65 74 20 4c 20 5b 6c 69 73 74  .    set L [list
7820: 5d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 66 20  ].    foreach f 
7830: 7b 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62  {test.db test.db
7840: 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 73 68 6d  -wal test.db-shm
7850: 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b 66  } {.      if {[f
7860: 69 6c 65 20 65 78 69 73 74 73 20 24 66 5d 7d 20  ile exists $f]} 
7870: 7b 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  {.        lappen
7880: 64 20 4c 20 5b 66 69 6c 65 20 61 74 74 72 20 24  d L [file attr $
7890: 66 20 2d 70 65 72 6d 5d 0a 20 20 20 20 20 20 7d  f -perm].      }
78a0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
78b0: 6c 61 70 70 65 6e 64 20 4c 20 7b 7d 0a 20 20 20  lappend L {}.   
78c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
78d0: 65 74 20 4c 0a 20 20 7d 0a 0a 20 20 66 61 75 6c  et L.  }..  faul
78e0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
78f0: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
7900: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
7910: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
7920: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7930: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
7940: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
7950: 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 49 4e 53 45  kpoint;.    INSE
7960: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7970: 53 28 27 33 2e 31 34 27 2c 20 27 32 2e 37 32 27  S('3.14', '2.72'
7980: 29 3b 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74  );.  }.  do_test
7990: 20 77 61 6c 32 2d 31 33 2e 31 2e 31 20 7b 0a 20   wal2-13.1.1 {. 
79a0: 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78     list [file ex
79b0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 73 68 6d  ists test.db-shm
79c0: 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74  ] [file exists t
79d0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20  est.db-wal].  } 
79e0: 7b 31 20 31 7d 0a 20 20 66 61 75 6c 74 73 69 6d  {1 1}.  faultsim
79f0: 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a  _save_and_close.
7a00: 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 64  .  foreach {tn d
7a10: 62 5f 70 65 72 6d 20 77 61 6c 5f 70 65 72 6d 20  b_perm wal_perm 
7a20: 73 68 6d 5f 70 65 72 6d 20 63 61 6e 5f 6f 70 65  shm_perm can_ope
7a30: 6e 20 63 61 6e 5f 72 65 61 64 20 63 61 6e 5f 77  n can_read can_w
7a40: 72 69 74 65 7d 20 7b 0a 20 20 20 20 32 20 20 20  rite} {.    2   
7a50: 30 30 36 34 34 20 20 20 30 30 36 34 34 20 20 20  00644   00644   
7a60: 30 30 36 34 34 20 20 20 31 20 20 20 31 20 20 20  00644   1   1   
7a70: 31 0a 20 20 20 20 33 20 20 20 30 30 36 34 34 20  1.    3   00644 
7a80: 20 20 30 30 34 30 30 20 20 20 30 30 36 34 34 20    00400   00644 
7a90: 20 20 31 20 20 20 31 20 20 20 30 0a 20 20 20 20    1   1   0.    
7aa0: 34 20 20 20 30 30 36 34 34 20 20 20 30 30 36 34  4   00644   0064
7ab0: 34 20 20 20 30 30 34 30 30 20 20 20 31 20 20 20  4   00400   1   
7ac0: 31 20 20 20 30 0a 20 20 20 20 35 20 20 20 30 30  1   0.    5   00
7ad0: 34 30 30 20 20 20 30 30 36 34 34 20 20 20 30 30  400   00644   00
7ae0: 36 34 34 20 20 20 31 20 20 20 31 20 20 20 30 0a  644   1   1   0.
7af0: 0a 20 20 20 20 37 20 20 20 30 30 36 34 34 20 20  .    7   00644  
7b00: 20 30 30 30 30 30 20 20 20 30 30 36 34 34 20 20   00000   00644  
7b10: 20 31 20 20 20 30 20 20 20 30 0a 20 20 20 20 38   1   0   0.    8
7b20: 20 20 20 30 30 36 34 34 20 20 20 30 30 36 34 34     00644   00644
7b30: 20 20 20 30 30 30 30 30 20 20 20 31 20 20 20 30     00000   1   0
7b40: 20 20 20 30 0a 20 20 20 20 39 20 20 20 30 30 30     0.    9   000
7b50: 30 30 20 20 20 30 30 36 34 34 20 20 20 30 30 36  00   00644   006
7b60: 34 34 20 20 20 30 20 20 20 30 20 20 20 30 0a 20  44   0   0   0. 
7b70: 20 7d 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69   } {.    faultsi
7b80: 6d 5f 72 65 73 74 6f 72 65 0a 20 20 20 20 64 6f  m_restore.    do
7b90: 5f 74 65 73 74 20 77 61 6c 32 2d 31 33 2e 24 74  _test wal2-13.$t
7ba0: 6e 2e 31 20 7b 0a 20 20 20 20 20 20 66 69 6c 65  n.1 {.      file
7bb0: 20 61 74 74 72 20 74 65 73 74 2e 64 62 20 20 20   attr test.db   
7bc0: 20 20 2d 70 65 72 6d 20 24 64 62 5f 70 65 72 6d    -perm $db_perm
7bd0: 0a 20 20 20 20 20 20 66 69 6c 65 20 61 74 74 72  .      file attr
7be0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 2d 70 65   test.db-wal -pe
7bf0: 72 6d 20 24 77 61 6c 5f 70 65 72 6d 0a 20 20 20  rm $wal_perm.   
7c00: 20 20 20 66 69 6c 65 20 61 74 74 72 20 74 65 73     file attr tes
7c10: 74 2e 64 62 2d 73 68 6d 20 2d 70 65 72 6d 20 24  t.db-shm -perm $
7c20: 73 68 6d 5f 70 65 72 6d 0a 0a 20 20 20 20 20 20  shm_perm..      
7c30: 73 65 74 20 20 20 20 20 4c 20 5b 66 69 6c 65 20  set     L [file 
7c40: 61 74 74 72 20 74 65 73 74 2e 64 62 20 2d 70 65  attr test.db -pe
7c50: 72 6d 5d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e  rm].      lappen
7c60: 64 20 4c 20 5b 66 69 6c 65 20 61 74 74 72 20 74  d L [file attr t
7c70: 65 73 74 2e 64 62 2d 77 61 6c 20 2d 70 65 72 6d  est.db-wal -perm
7c80: 5d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20  ].      lappend 
7c90: 4c 20 5b 66 69 6c 65 20 61 74 74 72 20 74 65 73  L [file attr tes
7ca0: 74 2e 64 62 2d 73 68 6d 20 2d 70 65 72 6d 5d 0a  t.db-shm -perm].
7cb0: 20 20 20 20 20 20 73 74 72 69 6e 67 20 6d 61 70        string map
7cc0: 20 7b 6f 20 30 7d 20 24 4c 0a 20 20 20 20 7d 20   {o 0} $L.    } 
7cd0: 5b 6c 69 73 74 20 24 64 62 5f 70 65 72 6d 20 24  [list $db_perm $
7ce0: 77 61 6c 5f 70 65 72 6d 20 24 73 68 6d 5f 70 65  wal_perm $shm_pe
7cf0: 72 6d 5d 0a 0a 20 20 20 20 23 20 49 66 20 24 63  rm]..    # If $c
7d00: 61 6e 5f 6f 70 65 6e 20 69 73 20 74 72 75 65 2c  an_open is true,
7d10: 20 74 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20   then it should 
7d20: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
7d30: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a 20  pen a database. 
7d40: 20 20 20 23 20 68 61 6e 64 6c 65 2e 20 4f 74 68     # handle. Oth
7d50: 65 72 77 69 73 65 2c 20 69 66 20 24 63 61 6e 5f  erwise, if $can_
7d60: 6f 70 65 6e 20 69 73 20 30 2c 20 61 74 74 65 6d  open is 0, attem
7d70: 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20 74 68  pting to open th
7d80: 65 20 64 62 0a 20 20 20 20 23 20 68 61 6e 64 6c  e db.    # handl
7d90: 65 20 74 68 72 6f 77 73 20 61 6e 20 22 75 6e 61  e throws an "una
7da0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
7db0: 62 61 73 65 20 66 69 6c 65 22 20 65 78 63 65 70  base file" excep
7dc0: 74 69 6f 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20  tion..    #.    
7dd0: 73 65 74 20 72 28 31 29 20 7b 30 20 6f 6b 7d 0a  set r(1) {0 ok}.
7de0: 20 20 20 20 73 65 74 20 72 28 30 29 20 7b 31 20      set r(0) {1 
7df0: 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  {unable to open 
7e00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a  database file}}.
7e10: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32      do_test wal2
7e20: 2d 31 33 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  -13.$tn.2 {.    
7e30: 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 73    list [catch {s
7e40: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
7e50: 62 20 3b 20 73 65 74 20 7b 7d 20 6f 6b 7d 20 6d  b ; set {} ok} m
7e60: 73 67 5d 20 24 6d 73 67 0a 20 20 20 20 7d 20 24  sg] $msg.    } $
7e70: 72 28 24 63 61 6e 5f 6f 70 65 6e 29 0a 0a 20 20  r($can_open)..  
7e80: 20 20 69 66 20 7b 24 63 61 6e 5f 6f 70 65 6e 7d    if {$can_open}
7e90: 20 7b 0a 0a 20 20 20 20 20 20 23 20 49 66 20 24   {..      # If $
7ea0: 63 61 6e 5f 72 65 61 64 20 69 73 20 74 72 75 65  can_read is true
7eb0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6c 69 65 6e  , then the clien
7ec0: 74 20 73 68 6f 75 6c 64 20 62 65 20 61 62 6c 65  t should be able
7ed0: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 0a 20 20   to read from.  
7ee0: 20 20 20 20 23 20 74 68 65 20 64 61 74 61 62 61      # the databa
7ef0: 73 65 20 66 69 6c 65 2e 20 49 66 20 24 63 61 6e  se file. If $can
7f00: 5f 72 65 61 64 20 69 73 20 66 61 6c 73 65 2c 20  _read is false, 
7f10: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 65  attempting to re
7f20: 61 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20  ad should.      
7f30: 23 20 74 68 72 6f 77 20 74 68 65 20 22 75 6e 61  # throw the "una
7f40: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
7f50: 62 61 73 65 20 66 69 6c 65 22 20 65 78 63 65 70  base file" excep
7f60: 74 69 6f 6e 2e 20 0a 20 20 20 20 20 20 23 0a 20  tion. .      #. 
7f70: 20 20 20 20 20 73 65 74 20 61 28 30 29 20 7b 31       set a(0) {1
7f80: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
7f90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
7fa0: 0a 20 20 20 20 20 20 73 65 74 20 61 28 31 29 20  .      set a(1) 
7fb0: 7b 30 20 7b 33 2e 31 34 20 32 2e 37 32 7d 7d 0a  {0 {3.14 2.72}}.
7fc0: 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61        do_test wa
7fd0: 6c 32 2d 31 33 2e 24 74 6e 2e 33 20 7b 0a 20 20  l2-13.$tn.3 {.  
7fe0: 20 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b        catchsql {
7ff0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
8000: 31 20 7d 0a 20 20 20 20 20 20 7d 20 24 61 28 24  1 }.      } $a($
8010: 63 61 6e 5f 72 65 61 64 29 0a 20 20 0a 20 20 20  can_read).  .   
8020: 20 20 20 23 20 4e 6f 77 20 74 72 79 20 74 6f 20     # Now try to 
8030: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 62 20  write to the db 
8040: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 63 6c 69  file. If the cli
8050: 65 6e 74 20 63 61 6e 20 72 65 61 64 20 62 75 74  ent can read but
8060: 20 6e 6f 74 0a 20 20 20 20 20 20 23 20 77 72 69   not.      # wri
8070: 74 65 2c 20 74 68 65 6e 20 69 74 20 73 68 6f 75  te, then it shou
8080: 6c 64 20 74 68 72 6f 77 20 74 68 65 20 66 61 6d  ld throw the fam
8090: 69 6c 69 61 72 20 22 75 6e 61 62 6c 65 20 74 6f  iliar "unable to
80a0: 20 6f 70 65 6e 20 64 62 20 66 69 6c 65 22 0a 20   open db file". 
80b0: 20 20 20 20 20 23 20 65 78 63 65 70 74 69 6f 6e       # exception
80c0: 2e 20 49 66 20 69 74 20 63 61 6e 20 72 65 61 64  . If it can read
80d0: 20 62 75 74 20 6e 6f 74 20 77 72 69 74 65 2c 20   but not write, 
80e0: 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 73 68  the exception sh
80f0: 6f 75 6c 64 0a 20 20 20 20 20 20 23 20 62 65 20  ould.      # be 
8100: 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74  "attempt to writ
8110: 65 20 61 20 72 65 61 64 20 6f 6e 6c 79 20 64 61  e a read only da
8120: 74 61 62 61 73 65 22 2e 0a 20 20 20 20 20 20 23  tabase"..      #
8130: 0a 20 20 20 20 20 20 23 20 49 66 20 74 68 65 20  .      # If the 
8140: 63 6c 69 65 6e 74 20 63 61 6e 20 72 65 61 64 20  client can read 
8150: 61 6e 64 20 77 72 69 74 65 2c 20 74 68 65 20 6f  and write, the o
8160: 70 65 72 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  peration should 
8170: 73 75 63 63 65 65 64 2e 0a 20 20 20 20 20 20 23  succeed..      #
8180: 0a 20 20 20 20 20 20 73 65 74 20 62 28 30 2c 30  .      set b(0,0
8190: 29 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  ) {1 {unable to 
81a0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
81b0: 6c 65 7d 7d 0a 20 20 20 20 20 20 73 65 74 20 62  le}}.      set b
81c0: 28 31 2c 30 29 20 7b 31 20 7b 61 74 74 65 6d 70  (1,0) {1 {attemp
81d0: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
81e0: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 7d 7d  donly database}}
81f0: 0a 20 20 20 20 20 20 73 65 74 20 62 28 31 2c 31  .      set b(1,1
8200: 29 20 7b 30 20 7b 7d 7d 0a 20 20 20 20 20 20 64  ) {0 {}}.      d
8210: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 33 2e 24  o_test wal2-13.$
8220: 74 6e 2e 34 20 7b 0a 20 20 20 20 20 20 20 20 63  tn.4 {.        c
8230: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
8240: 20 49 4e 54 4f 20 74 31 20 44 45 46 41 55 4c 54   INTO t1 DEFAULT
8250: 20 56 41 4c 55 45 53 20 7d 0a 20 20 20 20 20 20   VALUES }.      
8260: 7d 20 24 62 28 24 63 61 6e 5f 72 65 61 64 2c 24  } $b($can_read,$
8270: 63 61 6e 5f 77 72 69 74 65 29 0a 20 20 20 20 7d  can_write).    }
8280: 0a 20 20 20 20 63 61 74 63 68 20 7b 20 64 62 20  .    catch { db 
8290: 63 6c 6f 73 65 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  close }.  }.}..#
82a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
82f0: 20 74 68 61 74 20 22 50 52 41 47 4d 41 20 63 68   that "PRAGMA ch
8300: 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 73 79 6e  eckpoint_fullsyn
8310: 63 22 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  c" appears to be
8320: 20 77 6f 72 6b 69 6e 67 2e 0a 23 0a 66 6f 72 65   working..#.fore
8330: 61 63 68 20 7b 74 6e 20 73 71 6c 20 72 65 73 6c  ach {tn sql resl
8340: 69 73 74 7d 20 7b 0a 20 20 31 20 7b 20 7d 20 20  ist} {.  1 { }  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
8370: 31 30 20 30 20 34 20 30 20 36 20 30 7d 0a 20 20  10 0 4 0 6 0}.  
8380: 32 20 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b  2 { PRAGMA check
8390: 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20  point_fullfsync 
83a0: 3d 20 31 20 7d 20 7b 31 30 20 36 20 34 20 33 20  = 1 } {10 6 4 3 
83b0: 36 20 33 7d 0a 20 20 33 20 7b 20 50 52 41 47 4d  6 3}.  3 { PRAGM
83c0: 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c  A checkpoint_ful
83d0: 6c 66 73 79 6e 63 20 3d 20 30 20 7d 20 7b 31 30  lfsync = 0 } {10
83e0: 20 30 20 34 20 30 20 36 20 30 7d 0a 7d 20 7b 0a   0 4 0 6 0}.} {.
83f0: 20 20 69 66 63 61 70 61 62 6c 65 20 64 65 66 61    ifcapable defa
8400: 75 6c 74 5f 63 6b 70 74 66 75 6c 6c 66 73 79 6e  ult_ckptfullfsyn
8410: 63 20 7b 0a 20 20 20 20 69 66 20 7b 5b 73 74 72  c {.    if {[str
8420: 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 3d 3d  ing trim $sql]==
8430: 22 22 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 7d  ""} continue.  }
8440: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
8450: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20  te_and_reopen.. 
8460: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
8470: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30   auto_vacuum = 0
8480: 3b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  ; PRAGMA synchro
8490: 6e 6f 75 73 20 3d 20 46 55 4c 4c 3b 7d 0a 20 20  nous = FULL;}.  
84a0: 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 20 20 64  execsql $sql.  d
84b0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77  o_execsql_test w
84c0: 61 6c 32 2d 31 34 2e 24 74 6e 2e 30 20 7b 20 50  al2-14.$tn.0 { P
84d0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
84e0: 3d 20 34 30 39 36 20 7d 20 20 20 7b 7d 0a 20 20  = 4096 }   {}.  
84f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8500: 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 31 20 7b 20  wal2-14.$tn.1 { 
8510: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
8520: 6f 64 65 20 3d 20 57 41 4c 20 7d 20 7b 77 61 6c  ode = WAL } {wal
8530: 7d 0a 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f  }..  set sqlite_
8540: 73 79 6e 63 5f 63 6f 75 6e 74 20 30 0a 20 20 73  sync_count 0.  s
8550: 65 74 20 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79  et sqlite_fullsy
8560: 6e 63 5f 63 6f 75 6e 74 20 30 0a 0a 20 20 64 6f  nc_count 0..  do
8570: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 61  _execsql_test wa
8580: 6c 32 2d 31 34 2e 24 74 6e 2e 32 20 7b 0a 20 20  l2-14.$tn.2 {.  
8590: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74    PRAGMA wal_aut
85a0: 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 31 30  ocheckpoint = 10
85b0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
85c0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 20 20 20 20  LE t1(a, b);    
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
85e0: 20 77 61 6c 20 73 79 6e 63 73 0a 20 20 20 20 49   wal syncs.    I
85f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
8600: 4c 55 45 53 28 31 2c 20 32 29 3b 20 20 20 20 20  LUES(1, 2);     
8610: 20 20 20 20 20 2d 2d 20 32 20 77 61 6c 20 73 79       -- 2 wal sy
8620: 6e 63 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  nc.    PRAGMA wa
8630: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 20 20 20  l_checkpoint;   
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
8650: 31 20 77 61 6c 20 73 79 6e 63 2c 20 31 20 64 62  1 wal sync, 1 db
8660: 20 73 79 6e 63 0a 20 20 20 20 42 45 47 49 4e 3b   sync.    BEGIN;
8670: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
8680: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
8690: 34 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  4);.      INSERT
86a0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
86b0: 35 2c 20 36 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  5, 6);.    COMMI
86c0: 54 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T;              
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 2d 2d 20 32 20 77 61 6c 20 73 79 6e 63 0a 20   -- 2 wal sync. 
86f0: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
8700: 65 63 6b 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  eckpoint;       
8710: 20 20 20 20 20 20 20 20 20 2d 2d 20 31 20 77 61           -- 1 wa
8720: 6c 20 73 79 6e 63 2c 20 31 20 64 62 20 73 79 6e  l sync, 1 db syn
8730: 63 0a 20 20 7d 20 7b 31 30 20 30 20 33 20 33 20  c.  } {10 0 3 3 
8740: 30 20 31 20 31 7d 0a 0a 20 20 64 6f 5f 74 65 73  0 1 1}..  do_tes
8750: 74 20 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 33 20  t wal2-14.$tn.3 
8760: 7b 0a 20 20 20 20 63 6f 6e 64 5f 69 6e 63 72 5f  {.    cond_incr_
8770: 73 79 6e 63 5f 63 6f 75 6e 74 20 31 0a 20 20 20  sync_count 1.   
8780: 20 6c 69 73 74 20 24 73 71 6c 69 74 65 5f 73 79   list $sqlite_sy
8790: 6e 63 5f 63 6f 75 6e 74 20 24 73 71 6c 69 74 65  nc_count $sqlite
87a0: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 0a  _fullsync_count.
87b0: 20 20 7d 20 5b 6c 72 61 6e 67 65 20 24 72 65 73    } [lrange $res
87c0: 6c 69 73 74 20 30 20 31 5d 0a 0a 20 20 73 65 74  list 0 1]..  set
87d0: 20 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75   sqlite_sync_cou
87e0: 6e 74 20 30 0a 20 20 73 65 74 20 73 71 6c 69 74  nt 0.  set sqlit
87f0: 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  e_fullsync_count
8800: 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61   0..  do_test wa
8810: 6c 32 2d 31 34 2e 24 74 6e 2e 34 20 7b 0a 20 20  l2-14.$tn.4 {.  
8820: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
8830: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
8840: 53 28 37 2c 20 7a 65 72 6f 62 6c 6f 62 28 31 32  S(7, zeroblob(12
8850: 2a 34 30 39 36 29 29 20 7d 0a 20 20 20 20 6c 69  *4096)) }.    li
8860: 73 74 20 24 73 71 6c 69 74 65 5f 73 79 6e 63 5f  st $sqlite_sync_
8870: 63 6f 75 6e 74 20 24 73 71 6c 69 74 65 5f 66 75  count $sqlite_fu
8880: 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 0a 20 20 7d  llsync_count.  }
8890: 20 5b 6c 72 61 6e 67 65 20 24 72 65 73 6c 69 73   [lrange $reslis
88a0: 74 20 32 20 33 5d 0a 0a 20 20 73 65 74 20 73 71  t 2 3]..  set sq
88b0: 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  lite_sync_count 
88c0: 30 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 66  0.  set sqlite_f
88d0: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 30 0a  ullsync_count 0.
88e0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  .  do_test wal2-
88f0: 31 34 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 65  14.$tn.5 {.    e
8900: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
8910: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
8920: 6e 74 20 3d 20 31 30 30 30 20 7d 0a 20 20 20 20  nt = 1000 }.    
8930: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
8940: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8950: 39 2c 20 31 30 29 20 7d 0a 20 20 20 20 65 78 65  9, 10) }.    exe
8960: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
8970: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 31 2c  TO t1 VALUES(11,
8980: 20 31 32 29 20 7d 0a 20 20 20 20 65 78 65 63 73   12) }.    execs
8990: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
89a0: 20 74 31 20 56 41 4c 55 45 53 28 31 33 2c 20 31   t1 VALUES(13, 1
89b0: 34 29 20 7d 0a 20 20 20 20 64 62 20 63 6c 6f 73  4) }.    db clos
89c0: 65 0a 20 20 20 20 6c 69 73 74 20 24 73 71 6c 69  e.    list $sqli
89d0: 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 24 73  te_sync_count $s
89e0: 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63  qlite_fullsync_c
89f0: 6f 75 6e 74 0a 20 20 7d 20 5b 6c 72 61 6e 67 65  ount.  } [lrange
8a00: 20 24 72 65 73 6c 69 73 74 20 34 20 35 5d 0a 7d   $reslist 4 5].}
8a10: 0a 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f  ..catch { db clo
8a20: 73 65 20 7d 0a 0a 23 20 50 52 41 47 4d 41 20 63  se }..# PRAGMA c
8a30: 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 73 79  heckpoint_fullsy
8a40: 6e 63 0a 23 20 50 52 41 47 4d 41 20 66 75 6c 6c  nc.# PRAGMA full
8a50: 66 73 79 6e 63 0a 23 20 50 52 41 47 4d 41 20 73  fsync.# PRAGMA s
8a60: 79 6e 63 68 72 6f 6e 6f 75 73 0a 23 0a 66 6f 72  ynchronous.#.for
8a70: 65 61 63 68 20 7b 74 6e 20 73 65 74 74 69 6e 67  each {tn setting
8a80: 73 20 72 65 73 74 61 72 74 5f 73 79 6e 63 20 63  s restart_sync c
8a90: 6f 6d 6d 69 74 5f 73 79 6e 63 20 63 6b 70 74 5f  ommit_sync ckpt_
8aa0: 73 79 6e 63 7d 20 7b 0a 20 20 31 20 20 7b 30 20  sync} {.  1  {0 
8ab0: 30 20 6f 66 66 7d 20 20 20 20 20 7b 30 20 30 7d  0 off}     {0 0}
8ac0: 20 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d 0a 20    {0 0}  {0 0}. 
8ad0: 20 32 20 20 7b 30 20 30 20 6e 6f 72 6d 61 6c 7d   2  {0 0 normal}
8ae0: 20 20 7b 31 20 30 7d 20 20 7b 30 20 30 7d 20 20    {1 0}  {0 0}  
8af0: 7b 32 20 30 7d 0a 20 20 33 20 20 7b 30 20 30 20  {2 0}.  3  {0 0 
8b00: 66 75 6c 6c 7d 20 20 20 20 7b 32 20 30 7d 20 20  full}    {2 0}  
8b10: 7b 31 20 30 7d 20 20 7b 32 20 30 7d 0a 0a 20 20  {1 0}  {2 0}..  
8b20: 34 20 20 7b 30 20 31 20 6f 66 66 7d 20 20 20 20  4  {0 1 off}    
8b30: 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d 20 20 7b   {0 0}  {0 0}  {
8b40: 30 20 30 7d 0a 20 20 35 20 20 7b 30 20 31 20 6e  0 0}.  5  {0 1 n
8b50: 6f 72 6d 61 6c 7d 20 20 7b 30 20 31 7d 20 20 7b  ormal}  {0 1}  {
8b60: 30 20 30 7d 20 20 7b 30 20 32 7d 0a 20 20 36 20  0 0}  {0 2}.  6 
8b70: 20 7b 30 20 31 20 66 75 6c 6c 7d 20 20 20 20 7b   {0 1 full}    {
8b80: 30 20 32 7d 20 20 7b 30 20 31 7d 20 20 7b 30 20  0 2}  {0 1}  {0 
8b90: 32 7d 0a 0a 20 20 37 20 20 7b 31 20 30 20 6f 66  2}..  7  {1 0 of
8ba0: 66 7d 20 20 20 20 20 7b 30 20 30 7d 20 20 7b 30  f}     {0 0}  {0
8bb0: 20 30 7d 20 20 7b 30 20 30 7d 0a 20 20 38 20 20   0}  {0 0}.  8  
8bc0: 7b 31 20 30 20 6e 6f 72 6d 61 6c 7d 20 20 7b 30  {1 0 normal}  {0
8bd0: 20 31 7d 20 20 7b 30 20 30 7d 20 20 7b 30 20 32   1}  {0 0}  {0 2
8be0: 7d 0a 20 20 39 20 20 7b 31 20 30 20 66 75 6c 6c  }.  9  {1 0 full
8bf0: 7d 20 20 20 20 7b 31 20 31 7d 20 20 7b 31 20 30  }    {1 1}  {1 0
8c00: 7d 20 20 7b 30 20 32 7d 0a 0a 20 20 31 30 20 7b  }  {0 2}..  10 {
8c10: 31 20 31 20 6f 66 66 7d 20 20 20 20 20 7b 30 20  1 1 off}     {0 
8c20: 30 7d 20 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d  0}  {0 0}  {0 0}
8c30: 0a 20 20 31 31 20 7b 31 20 31 20 6e 6f 72 6d 61  .  11 {1 1 norma
8c40: 6c 7d 20 20 7b 30 20 31 7d 20 20 7b 30 20 30 7d  l}  {0 1}  {0 0}
8c50: 20 20 7b 30 20 32 7d 0a 20 20 31 32 20 7b 31 20    {0 2}.  12 {1 
8c60: 31 20 66 75 6c 6c 7d 20 20 20 20 7b 30 20 32 7d  1 full}    {0 2}
8c70: 20 20 7b 30 20 31 7d 20 20 7b 30 20 32 7d 0a 7d    {0 1}  {0 2}.}
8c80: 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65   {.  forcedelete
8c90: 20 74 65 73 74 2e 64 62 0a 0a 20 20 74 65 73 74   test.db..  test
8ca0: 76 66 73 20 74 76 66 73 20 2d 64 65 66 61 75 6c  vfs tvfs -defaul
8cb0: 74 20 31 0a 20 20 74 76 66 73 20 66 69 6c 74 65  t 1.  tvfs filte
8cc0: 72 20 78 53 79 6e 63 0a 20 20 74 76 66 73 20 73  r xSync.  tvfs s
8cd0: 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 20 20  cript xSyncCb.  
8ce0: 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 6d 65  proc xSyncCb {me
8cf0: 74 68 6f 64 20 66 69 6c 65 20 66 69 6c 65 69 64  thod file fileid
8d00: 20 66 6c 61 67 73 7d 20 7b 0a 20 20 20 20 69 6e   flags} {.    in
8d10: 63 72 20 3a 3a 73 79 6e 63 28 24 66 6c 61 67 73  cr ::sync($flags
8d20: 29 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ).  }..  sqlite3
8d30: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f   db test.db.  do
8d40: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35  _execsql_test 15
8d50: 2e 24 74 6e 2e 31 20 22 0a 20 20 20 20 50 52 41  .$tn.1 ".    PRA
8d60: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
8d70: 34 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54 45  4096;.    CREATE
8d80: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
8d90: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74    PRAGMA wal_aut
8da0: 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 4f 46  ocheckpoint = OF
8db0: 46 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  F;.    PRAGMA jo
8dc0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
8dd0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 68 65  ;.    PRAGMA che
8de0: 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79 6e  ckpoint_fullfsyn
8df0: 63 20 3d 20 5b 6c 69 6e 64 65 78 20 24 73 65 74  c = [lindex $set
8e00: 74 69 6e 67 73 20 30 5d 3b 0a 20 20 20 20 50 52  tings 0];.    PR
8e10: 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20 3d  AGMA fullfsync =
8e20: 20 5b 6c 69 6e 64 65 78 20 24 73 65 74 74 69 6e   [lindex $settin
8e30: 67 73 20 31 5d 3b 0a 20 20 20 20 50 52 41 47 4d  gs 1];.    PRAGM
8e40: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
8e50: 5b 6c 69 6e 64 65 78 20 24 73 65 74 74 69 6e 67  [lindex $setting
8e60: 73 20 32 5d 3b 0a 20 20 22 20 7b 30 20 77 61 6c  s 2];.  " {0 wal
8e70: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 35 2e  }..  do_test 15.
8e80: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 65 74 20  $tn.2 {.    set 
8e90: 73 79 6e 63 28 6e 6f 72 6d 61 6c 29 20 30 0a 20  sync(normal) 0. 
8ea0: 20 20 20 73 65 74 20 73 79 6e 63 28 66 75 6c 6c     set sync(full
8eb0: 29 20 30 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ) 0.    execsql 
8ec0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
8ed0: 20 56 41 4c 55 45 53 28 27 61 62 63 27 29 20 7d   VALUES('abc') }
8ee0: 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a 73 79 6e  .    list $::syn
8ef0: 63 28 6e 6f 72 6d 61 6c 29 20 24 3a 3a 73 79 6e  c(normal) $::syn
8f00: 63 28 66 75 6c 6c 29 0a 20 20 7d 20 24 72 65 73  c(full).  } $res
8f10: 74 61 72 74 5f 73 79 6e 63 0a 0a 20 20 64 6f 5f  tart_sync..  do_
8f20: 74 65 73 74 20 31 35 2e 24 74 6e 2e 33 20 7b 0a  test 15.$tn.3 {.
8f30: 20 20 20 20 73 65 74 20 73 79 6e 63 28 6e 6f 72      set sync(nor
8f40: 6d 61 6c 29 20 30 0a 20 20 20 20 73 65 74 20 73  mal) 0.    set s
8f50: 79 6e 63 28 66 75 6c 6c 29 20 30 0a 20 20 20 20  ync(full) 0.    
8f60: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
8f70: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8f80: 27 61 62 63 27 29 20 7d 0a 20 20 20 20 6c 69 73  'abc') }.    lis
8f90: 74 20 24 3a 3a 73 79 6e 63 28 6e 6f 72 6d 61 6c  t $::sync(normal
8fa0: 29 20 24 3a 3a 73 79 6e 63 28 66 75 6c 6c 29 0a  ) $::sync(full).
8fb0: 20 20 7d 20 24 63 6f 6d 6d 69 74 5f 73 79 6e 63    } $commit_sync
8fc0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 35 2e 24  ..  do_test 15.$
8fd0: 74 6e 2e 34 20 7b 0a 20 20 20 20 73 65 74 20 73  tn.4 {.    set s
8fe0: 79 6e 63 28 6e 6f 72 6d 61 6c 29 20 30 0a 20 20  ync(normal) 0.  
8ff0: 20 20 73 65 74 20 73 79 6e 63 28 66 75 6c 6c 29    set sync(full)
9000: 20 30 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   0.    execsql {
9010: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9020: 56 41 4c 55 45 53 28 27 64 65 66 27 29 20 7d 0a  VALUES('def') }.
9030: 20 20 20 20 6c 69 73 74 20 24 3a 3a 73 79 6e 63      list $::sync
9040: 28 6e 6f 72 6d 61 6c 29 20 24 3a 3a 73 79 6e 63  (normal) $::sync
9050: 28 66 75 6c 6c 29 0a 20 20 7d 20 24 63 6f 6d 6d  (full).  } $comm
9060: 69 74 5f 73 79 6e 63 0a 0a 20 20 64 6f 5f 74 65  it_sync..  do_te
9070: 73 74 20 31 35 2e 24 74 6e 2e 35 20 7b 0a 20 20  st 15.$tn.5 {.  
9080: 20 20 73 65 74 20 73 79 6e 63 28 6e 6f 72 6d 61    set sync(norma
9090: 6c 29 20 30 0a 20 20 20 20 73 65 74 20 73 79 6e  l) 0.    set syn
90a0: 63 28 66 75 6c 6c 29 20 30 0a 20 20 20 20 65 78  c(full) 0.    ex
90b0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
90c0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
90d0: 20 20 20 20 6c 69 73 74 20 24 3a 3a 73 79 6e 63      list $::sync
90e0: 28 6e 6f 72 6d 61 6c 29 20 24 3a 3a 73 79 6e 63  (normal) $::sync
90f0: 28 66 75 6c 6c 29 0a 20 20 7d 20 24 63 6b 70 74  (full).  } $ckpt
9100: 5f 73 79 6e 63 0a 20 20 0a 20 20 64 62 20 63 6c  _sync.  .  db cl
9110: 6f 73 65 0a 20 20 74 76 66 73 20 64 65 6c 65 74  ose.  tvfs delet
9120: 65 0a 7d 0a 0a 0a 0a 66 69 6e 69 73 68 5f 74 65  e.}....finish_te
9130: 73 74 0a                                         st.