/ Hex Artifact Content
Login

Artifact d4b470f13c87f6d8268b004380afa04c3c67cb90:


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 37 20 6c 6f 63 6b  ive}   {1 7 lock
0d10: 20 65 78 63 6c 75 73 69 76 65 7d 20 20 20 20 20   exclusive}     
0d20: 20 20 20 20 20 5c 0a 20 20 7b 31 20 37 20 75 6e       \.  {1 7 un
0d30: 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 20  lock exclusive} 
0d40: 7b 30 20 31 20 75 6e 6c 6f 63 6b 20 65 78 63 6c  {0 1 unlock excl
0d50: 75 73 69 76 65 7d 20 20 20 20 20 20 20 20 5c 0a  usive}        \.
0d60: 5d 0a 73 65 74 20 52 45 41 44 20 5b 6c 69 73 74  ].set READ [list
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 34 20           \.  {4 
0da0: 31 20 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 20  1 lock shared}  
0db0: 20 20 7b 34 20 31 20 75 6e 6c 6f 63 6b 20 73 68    {4 1 unlock sh
0dc0: 61 72 65 64 7d 20 20 20 20 20 20 20 20 20 20 20  ared}           
0dd0: 20 20 5c 0a 5d 0a 73 65 74 20 49 4e 49 54 53 4c    \.].set INITSL
0de0: 4f 54 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  OT [list        
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
0e10: 20 7b 34 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75   {4 1 lock exclu
0e20: 73 69 76 65 7d 20 7b 34 20 31 20 75 6e 6c 6f 63  sive} {4 1 unloc
0e30: 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 20 20 20  k exclusive}    
0e40: 20 20 20 20 20 20 5c 0a 5d 0a 0a 66 6f 72 65 61        \.]..forea
0e50: 63 68 20 7b 74 6e 20 69 49 6e 73 65 72 74 20 72  ch {tn iInsert r
0e60: 65 73 20 77 61 6c 5f 69 6e 64 65 78 5f 68 64 72  es wal_index_hdr
0e70: 5f 6d 6f 64 20 77 61 6c 5f 6c 6f 63 6b 73 7d 20  _mod wal_locks} 
0e80: 22 0a 20 20 20 20 20 20 20 20 20 32 20 20 20 20  ".         2    
0e90: 35 20 20 20 7b 35 20 31 35 7d 20 20 20 20 30 20  5   {5 15}    0 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 52 45              {$RE
0eb0: 43 4f 56 45 52 20 24 52 45 41 44 7d 0a 20 20 20  COVER $READ}.   
0ec0: 20 20 20 20 20 20 33 20 20 20 20 36 20 20 20 7b        3    6   {
0ed0: 36 20 32 31 7d 20 20 20 20 31 20 20 20 20 20 20  6 21}    1      
0ee0: 20 20 20 20 20 20 20 7b 24 52 45 43 4f 56 45 52         {$RECOVER
0ef0: 20 24 52 45 41 44 7d 0a 20 20 20 20 20 20 20 20   $READ}.        
0f00: 20 34 20 20 20 20 37 20 20 20 7b 37 20 32 38 7d   4    7   {7 28}
0f10: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
0f20: 20 20 7b 24 52 45 43 4f 56 45 52 20 24 52 45 41    {$RECOVER $REA
0f30: 44 7d 0a 20 20 20 20 20 20 20 20 20 35 20 20 20  D}.         5   
0f40: 20 38 20 20 20 7b 38 20 33 36 7d 20 20 20 20 33   8   {8 36}    3
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 52               {$R
0f60: 45 43 4f 56 45 52 20 24 52 45 41 44 7d 0a 20 20  ECOVER $READ}.  
0f70: 20 20 20 20 20 20 20 36 20 20 20 20 39 20 20 20         6    9   
0f80: 7b 39 20 34 35 7d 20 20 20 20 34 20 20 20 20 20  {9 45}    4     
0f90: 20 20 20 20 20 20 20 20 7b 24 52 45 43 4f 56 45          {$RECOVE
0fa0: 52 20 24 52 45 41 44 7d 0a 20 20 20 20 20 20 20  R $READ}.       
0fb0: 20 20 37 20 20 20 31 30 20 20 20 7b 31 30 20 35    7   10   {10 5
0fc0: 35 7d 20 20 20 35 20 20 20 20 20 20 20 20 20 20  5}   5          
0fd0: 20 20 20 7b 24 52 45 43 4f 56 45 52 20 24 52 45     {$RECOVER $RE
0fe0: 41 44 7d 0a 20 20 20 20 20 20 20 20 20 38 20 20  AD}.         8  
0ff0: 20 31 31 20 20 20 7b 31 31 20 36 36 7d 20 20 20   11   {11 66}   
1000: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24  6             {$
1010: 52 45 43 4f 56 45 52 20 24 52 45 41 44 7d 0a 20  RECOVER $READ}. 
1020: 20 20 20 20 20 20 20 20 39 20 20 20 31 32 20 20          9   12  
1030: 20 7b 31 32 20 37 38 7d 20 20 20 37 20 20 20 20   {12 78}   7    
1040: 20 20 20 20 20 20 20 20 20 7b 24 52 45 43 4f 56           {$RECOV
1050: 45 52 20 24 52 45 41 44 7d 0a 20 20 20 20 20 20  ER $READ}.      
1060: 20 20 31 30 20 20 20 31 33 20 20 20 7b 31 33 20    10   13   {13 
1070: 39 31 7d 20 20 20 38 20 20 20 20 20 20 20 20 20  91}   8         
1080: 20 20 20 20 7b 24 52 45 43 4f 56 45 52 20 24 52      {$RECOVER $R
1090: 45 41 44 7d 0a 20 20 20 20 20 20 20 20 31 31 20  EAD}.        11 
10a0: 20 20 31 34 20 20 20 7b 31 34 20 31 30 35 7d 20    14   {14 105} 
10b0: 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 7b   9             {
10c0: 24 52 45 43 4f 56 45 52 20 24 52 45 41 44 7d 0a  $RECOVER $READ}.
10d0: 20 20 20 20 20 20 20 20 31 32 20 20 20 31 35 20          12   15 
10e0: 20 20 7b 31 35 20 31 32 30 7d 20 20 2d 31 20 20    {15 120}  -1  
10f0: 20 20 20 20 20 20 20 20 20 20 7b 24 49 4e 49 54            {$INIT
1100: 53 4c 4f 54 20 24 52 45 41 44 7d 0a 22 20 7b 0a  SLOT $READ}." {.
1110: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  .  do_test wal2-
1120: 31 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78  1.$tn.1 {.    ex
1130: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
1140: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69  NTO t1 VALUES($i
1150: 49 6e 73 65 72 74 29 20 7d 0a 20 20 20 20 73 65  Insert) }.    se
1160: 74 20 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 73 74 5d  t ::locks [list]
1170: 0a 20 20 20 20 70 72 6f 63 20 74 76 66 73 5f 63  .    proc tvfs_c
1180: 62 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20  b {method args} 
1190: 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20  {.      lappend 
11a0: 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 6e 64 65 78 20  ::locks [lindex 
11b0: 24 61 72 67 73 20 32 5d 0a 20 20 20 20 20 20 72  $args 2].      r
11c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
11d0: 20 20 20 20 7d 0a 20 20 20 20 74 76 66 73 20 66      }.    tvfs f
11e0: 69 6c 74 65 72 20 78 53 68 6d 4c 6f 63 6b 0a 20  ilter xShmLock. 
11f0: 20 20 20 69 66 20 7b 24 3a 3a 77 61 6c 5f 69 6e     if {$::wal_in
1200: 64 65 78 5f 68 64 72 5f 6d 6f 64 20 3e 3d 20 30  dex_hdr_mod >= 0
1210: 7d 20 7b 0a 20 20 20 20 20 20 69 6e 63 72 5f 74  } {.      incr_t
1220: 76 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e  vfs_hdr $::filen
1230: 61 6d 65 20 24 3a 3a 77 61 6c 5f 69 6e 64 65 78  ame $::wal_index
1240: 5f 68 64 72 5f 6d 6f 64 20 31 0a 20 20 20 20 7d  _hdr_mod 1.    }
1250: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
1260: 45 4c 45 43 54 20 63 6f 75 6e 74 28 61 29 2c 20  ELECT count(a), 
1270: 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 31 20 7d  sum(a) FROM t1 }
1280: 20 64 62 32 0a 20 20 7d 20 24 72 65 73 0a 0a 20   db2.  } $res.. 
1290: 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 2e   do_test wal2-1.
12a0: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 65 74 20  $tn.2 {.    set 
12b0: 3a 3a 6c 6f 63 6b 73 0a 20 20 7d 20 24 77 61 6c  ::locks.  } $wal
12c0: 5f 6c 6f 63 6b 73 0a 7d 0a 64 62 20 63 6c 6f 73  _locks.}.db clos
12d0: 65 0a 64 62 32 20 63 6c 6f 73 65 0a 74 76 66 73  e.db2 close.tvfs
12e0: 20 64 65 6c 65 74 65 0a 66 6f 72 63 65 64 65 6c   delete.forcedel
12f0: 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  ete test.db test
1300: 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d  .db-wal test.db-
1310: 6a 6f 75 72 6e 61 6c 0a 0a 23 2d 2d 2d 2d 2d 2d  journal..#------
1320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 69 73 20 74 65 73 74 20  ---.# This test 
1370: 63 61 73 65 20 69 73 20 76 65 72 79 20 73 69 6d  case is very sim
1380: 69 6c 61 72 20 74 6f 20 74 68 65 20 70 72 65 76  ilar to the prev
1390: 69 6f 75 73 20 6f 6e 65 2c 20 65 78 63 65 70 74  ious one, except
13a0: 2c 20 61 66 74 65 72 0a 23 20 74 68 65 20 72 65  , after.# the re
13b0: 61 64 65 72 20 72 65 61 64 73 20 74 68 65 20 63  ader reads the c
13c0: 6f 72 72 75 70 74 20 77 61 6c 2d 69 6e 64 65 78  orrupt wal-index
13d0: 20 68 65 61 64 65 72 2c 20 62 75 74 20 62 65 66   header, but bef
13e0: 6f 72 65 20 69 74 20 68 61 73 0a 23 20 61 20 63  ore it has.# a c
13f0: 68 61 6e 63 65 20 74 6f 20 72 65 2d 72 65 61 64  hance to re-read
1400: 20 69 74 20 75 6e 64 65 72 20 74 68 65 20 63 6f   it under the co
1410: 76 65 72 20 6f 66 20 74 68 65 20 52 45 43 4f 56  ver of the RECOV
1420: 45 52 20 6c 6f 63 6b 2c 20 74 68 65 0a 23 20 77  ER lock, the.# w
1430: 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 20  al-index header 
1440: 69 73 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  is replaced with
1450: 20 61 20 76 61 6c 69 64 2c 20 62 75 74 20 6f 75   a valid, but ou
1460: 74 2d 6f 66 2d 64 61 74 65 2c 20 68 65 61 64 65  t-of-date, heade
1470: 72 2e 0a 23 0a 23 20 42 65 63 61 75 73 65 20 74  r..#.# Because t
1480: 68 65 20 68 65 61 64 65 72 20 63 68 65 63 6b 73  he header checks
1490: 75 6d 20 6c 6f 6f 6b 73 20 4f 6b 2c 20 74 68 65  um looks Ok, the
14a0: 20 72 65 61 64 65 72 20 64 6f 65 73 20 6e 6f 74   reader does not
14b0: 20 72 75 6e 20 72 65 63 6f 76 65 72 79 2c 0a 23   run recovery,.#
14c0: 20 69 74 20 73 69 6d 70 6c 79 20 64 72 6f 70 73   it simply drops
14d0: 20 62 61 63 6b 20 74 6f 20 61 20 52 45 41 44 20   back to a READ 
14e0: 6c 6f 63 6b 20 61 6e 64 20 70 72 6f 63 65 65 64  lock and proceed
14f0: 73 2e 20 42 75 74 20 62 65 63 61 75 73 65 20 74  s. But because t
1500: 68 65 0a 23 20 68 65 61 64 65 72 20 69 73 20 6f  he.# header is o
1510: 75 74 2d 6f 66 2d 64 61 74 65 2c 20 74 68 65 20  ut-of-date, the 
1520: 72 65 61 64 65 72 20 72 65 61 64 73 20 74 68 65  reader reads the
1530: 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 73 6e 61   out-of-date sna
1540: 70 73 68 6f 74 2e 0a 23 0a 23 20 41 66 74 65 72  pshot..#.# After
1550: 20 74 68 69 73 2c 20 74 68 65 20 68 65 61 64 65   this, the heade
1560: 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 61  r is corrupted a
1570: 67 61 69 6e 20 61 6e 64 20 74 68 65 20 72 65 61  gain and the rea
1580: 64 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 0a 23  der is allowed.#
1590: 20 74 6f 20 72 75 6e 20 72 65 63 6f 76 65 72 79   to run recovery
15a0: 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 69 74 20  . This time, it 
15b0: 73 65 65 73 20 61 6e 20 75 70 2d 74 6f 2d 64 61  sees an up-to-da
15c0: 74 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74  te snapshot of t
15d0: 68 65 0a 23 20 64 61 74 61 62 61 73 65 20 66 69  he.# database fi
15e0: 6c 65 2e 0a 23 0a 73 65 74 20 57 52 49 54 45 52  le..#.set WRITER
15f0: 20 5b 6c 69 73 74 20 30 20 31 20 6c 6f 63 6b 20   [list 0 1 lock 
1600: 65 78 63 6c 75 73 69 76 65 5d 0a 73 65 74 20 4c  exclusive].set L
1610: 4f 43 4b 53 20 20 5b 6c 69 73 74 20 5c 0a 20 20  OCKS  [list \.  
1620: 7b 30 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73  {0 1 lock exclus
1630: 69 76 65 7d 20 7b 30 20 31 20 75 6e 6c 6f 63 6b  ive} {0 1 unlock
1640: 20 65 78 63 6c 75 73 69 76 65 7d 20 5c 0a 20 20   exclusive} \.  
1650: 7b 34 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73  {4 1 lock exclus
1660: 69 76 65 7d 20 7b 34 20 31 20 75 6e 6c 6f 63 6b  ive} {4 1 unlock
1670: 20 65 78 63 6c 75 73 69 76 65 7d 20 5c 0a 20 20   exclusive} \.  
1680: 7b 34 20 31 20 6c 6f 63 6b 20 73 68 61 72 65 64  {4 1 lock shared
1690: 7d 20 20 20 20 7b 34 20 31 20 75 6e 6c 6f 63 6b  }    {4 1 unlock
16a0: 20 73 68 61 72 65 64 7d 20 20 20 20 5c 0a 5d 0a   shared}    \.].
16b0: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 32 2e 30  do_test wal2-2.0
16c0: 20 7b 0a 0a 20 20 74 65 73 74 76 66 73 20 74 76   {..  testvfs tv
16d0: 66 73 0a 20 20 74 76 66 73 20 73 63 72 69 70 74  fs.  tvfs script
16e0: 20 74 76 66 73 5f 63 62 0a 20 20 74 76 66 73 20   tvfs_cb.  tvfs 
16f0: 66 69 6c 74 65 72 20 78 53 68 6d 4f 70 65 6e 0a  filter xShmOpen.
1700: 20 20 70 72 6f 63 20 74 76 66 73 5f 63 62 20 7b    proc tvfs_cb {
1710: 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20  method args} {. 
1720: 20 20 20 73 65 74 20 3a 3a 66 69 6c 65 6e 61 6d     set ::filenam
1730: 65 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20  e [lindex $args 
1740: 30 5d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0].    return SQ
1750: 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 0a 20 20 73  LITE_OK.  }..  s
1760: 71 6c 69 74 65 33 20 64 62 20 20 74 65 73 74 2e  qlite3 db  test.
1770: 64 62 20 2d 76 66 73 20 74 76 66 73 0a 20 20 73  db -vfs tvfs.  s
1780: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
1790: 64 62 20 2d 76 66 73 20 74 76 66 73 0a 0a 20 20  db -vfs tvfs..  
17a0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
17b0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
17c0: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45  e = WAL;.    CRE
17d0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b  ATE TABLE t1(a);
17e0: 0a 20 20 7d 20 64 62 32 0a 20 20 65 78 65 63 73  .  } db2.  execs
17f0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
1800: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
1810: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1820: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 29 3b  TO t1 VALUES(2);
1830: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1840: 20 74 31 20 56 41 4c 55 45 53 28 33 29 3b 0a 20   t1 VALUES(3);. 
1850: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1860: 31 20 56 41 4c 55 45 53 28 34 29 3b 0a 20 20 20  1 VALUES(4);.   
1870: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 61 29   SELECT count(a)
1880: 2c 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 31  , sum(a) FROM t1
1890: 3b 0a 20 20 7d 0a 7d 20 7b 34 20 31 30 7d 0a 64  ;.  }.} {4 10}.d
18a0: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 32 2e 31 20  o_test wal2-2.1 
18b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
18c0: 4c 45 43 54 20 63 6f 75 6e 74 28 61 29 2c 20 73  LECT count(a), s
18d0: 75 6d 28 61 29 20 46 52 4f 4d 20 74 31 20 7d 20  um(a) FROM t1 } 
18e0: 64 62 32 0a 7d 20 7b 34 20 31 30 7d 0a 0a 66 6f  db2.} {4 10}..fo
18f0: 72 65 61 63 68 20 7b 74 6e 20 69 49 6e 73 65 72  reach {tn iInser
1900: 74 20 72 65 73 30 20 72 65 73 31 20 77 61 6c 5f  t res0 res1 wal_
1910: 69 6e 64 65 78 5f 68 64 72 5f 6d 6f 64 7d 20 7b  index_hdr_mod} {
1920: 0a 20 20 20 20 20 20 20 20 20 32 20 20 20 20 35  .         2    5
1930: 20 20 20 7b 34 20 31 30 7d 20 20 20 7b 35 20 31     {4 10}   {5 1
1940: 35 7d 20 20 20 20 30 0a 20 20 20 20 20 20 20 20  5}    0.        
1950: 20 33 20 20 20 20 36 20 20 20 7b 35 20 31 35 7d   3    6   {5 15}
1960: 20 20 20 7b 36 20 32 31 7d 20 20 20 20 31 0a 20     {6 21}    1. 
1970: 20 20 20 20 20 20 20 20 34 20 20 20 20 37 20 20          4    7  
1980: 20 7b 36 20 32 31 7d 20 20 20 7b 37 20 32 38 7d   {6 21}   {7 28}
1990: 20 20 20 20 32 0a 20 20 20 20 20 20 20 20 20 35      2.         5
19a0: 20 20 20 20 38 20 20 20 7b 37 20 32 38 7d 20 20      8   {7 28}  
19b0: 20 7b 38 20 33 36 7d 20 20 20 20 33 0a 20 20 20   {8 36}    3.   
19c0: 20 20 20 20 20 20 36 20 20 20 20 39 20 20 20 7b        6    9   {
19d0: 38 20 33 36 7d 20 20 20 7b 39 20 34 35 7d 20 20  8 36}   {9 45}  
19e0: 20 20 34 0a 20 20 20 20 20 20 20 20 20 37 20 20    4.         7  
19f0: 20 31 30 20 20 20 7b 39 20 34 35 7d 20 20 20 7b   10   {9 45}   {
1a00: 31 30 20 35 35 7d 20 20 20 35 0a 20 20 20 20 20  10 55}   5.     
1a10: 20 20 20 20 38 20 20 20 31 31 20 20 20 7b 31 30      8   11   {10
1a20: 20 35 35 7d 20 20 7b 31 31 20 36 36 7d 20 20 20   55}  {11 66}   
1a30: 36 0a 20 20 20 20 20 20 20 20 20 39 20 20 20 31  6.         9   1
1a40: 32 20 20 20 7b 31 31 20 36 36 7d 20 20 7b 31 32  2   {11 66}  {12
1a50: 20 37 38 7d 20 20 20 37 0a 7d 20 7b 0a 20 20 74   78}   7.} {.  t
1a60: 76 66 73 20 66 69 6c 74 65 72 20 78 53 68 6d 4c  vfs filter xShmL
1a70: 6f 63 6b 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77  ock..  do_test w
1a80: 61 6c 32 2d 32 2e 24 74 6e 2e 31 20 7b 0a 20 20  al2-2.$tn.1 {.  
1a90: 20 20 73 65 74 20 6f 6c 64 68 64 72 20 5b 73 65    set oldhdr [se
1aa0: 74 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a 66 69  t_tvfs_hdr $::fi
1ab0: 6c 65 6e 61 6d 65 5d 0a 20 20 20 20 65 78 65 63  lename].    exec
1ac0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
1ad0: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 49 6e  O t1 VALUES($iIn
1ae0: 73 65 72 74 29 20 7d 0a 20 20 20 20 65 78 65 63  sert) }.    exec
1af0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
1b00: 6e 74 28 61 29 2c 20 73 75 6d 28 61 29 20 46 52  nt(a), sum(a) FR
1b10: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 24 72 65 73  OM t1 }.  } $res
1b20: 31 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  1..  do_test wal
1b30: 32 2d 32 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  2-2.$tn.2 {.    
1b40: 73 65 74 20 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 73  set ::locks [lis
1b50: 74 5d 0a 20 20 20 20 70 72 6f 63 20 74 76 66 73  t].    proc tvfs
1b60: 5f 63 62 20 7b 6d 65 74 68 6f 64 20 61 72 67 73  _cb {method args
1b70: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6c 6f  } {.      set lo
1b80: 63 6b 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73  ck [lindex $args
1b90: 20 32 5d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e   2].      lappen
1ba0: 64 20 3a 3a 6c 6f 63 6b 73 20 24 6c 6f 63 6b 0a  d ::locks $lock.
1bb0: 20 20 20 20 20 20 69 66 20 7b 24 6c 6f 63 6b 20        if {$lock 
1bc0: 3d 3d 20 24 3a 3a 57 52 49 54 45 52 7d 20 7b 0a  == $::WRITER} {.
1bd0: 20 20 20 20 20 20 20 20 73 65 74 5f 74 76 66 73          set_tvfs
1be0: 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e 61 6d 65  _hdr $::filename
1bf0: 20 24 3a 3a 6f 6c 64 68 64 72 0a 20 20 20 20 20   $::oldhdr.     
1c00: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1c10: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 7d 0a  SQLITE_OK.    }.
1c20: 0a 20 20 20 20 69 66 20 7b 24 3a 3a 77 61 6c 5f  .    if {$::wal_
1c30: 69 6e 64 65 78 5f 68 64 72 5f 6d 6f 64 20 3e 3d  index_hdr_mod >=
1c40: 20 30 7d 20 7b 0a 20 20 20 20 20 20 69 6e 63 72   0} {.      incr
1c50: 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c  _tvfs_hdr $::fil
1c60: 65 6e 61 6d 65 20 24 3a 3a 77 61 6c 5f 69 6e 64  ename $::wal_ind
1c70: 65 78 5f 68 64 72 5f 6d 6f 64 20 31 0a 20 20 20  ex_hdr_mod 1.   
1c80: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
1c90: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 61 29   SELECT count(a)
1ca0: 2c 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 31  , sum(a) FROM t1
1cb0: 20 7d 20 64 62 32 0a 20 20 7d 20 24 72 65 73 30   } db2.  } $res0
1cc0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32  ..  do_test wal2
1cd0: 2d 32 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 73  -2.$tn.3 {.    s
1ce0: 65 74 20 3a 3a 6c 6f 63 6b 73 0a 20 20 7d 20 24  et ::locks.  } $
1cf0: 4c 4f 43 4b 53 0a 0a 20 20 64 6f 5f 74 65 73 74  LOCKS..  do_test
1d00: 20 77 61 6c 32 2d 32 2e 24 74 6e 2e 34 20 7b 0a   wal2-2.$tn.4 {.
1d10: 20 20 20 20 73 65 74 20 3a 3a 6c 6f 63 6b 73 20      set ::locks 
1d20: 5b 6c 69 73 74 5d 0a 20 20 20 20 70 72 6f 63 20  [list].    proc 
1d30: 74 76 66 73 5f 63 62 20 7b 6d 65 74 68 6f 64 20  tvfs_cb {method 
1d40: 61 72 67 73 7d 20 7b 0a 20 20 20 20 20 20 73 65  args} {.      se
1d50: 74 20 6c 6f 63 6b 20 5b 6c 69 6e 64 65 78 20 24  t lock [lindex $
1d60: 61 72 67 73 20 32 5d 0a 20 20 20 20 20 20 6c 61  args 2].      la
1d70: 70 70 65 6e 64 20 3a 3a 6c 6f 63 6b 73 20 24 6c  ppend ::locks $l
1d80: 6f 63 6b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ock.      return
1d90: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 7d   SQLITE_OK.    }
1da0: 0a 0a 20 20 20 20 69 66 20 7b 24 3a 3a 77 61 6c  ..    if {$::wal
1db0: 5f 69 6e 64 65 78 5f 68 64 72 5f 6d 6f 64 20 3e  _index_hdr_mod >
1dc0: 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20 69 6e 63  = 0} {.      inc
1dd0: 72 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a 66 69  r_tvfs_hdr $::fi
1de0: 6c 65 6e 61 6d 65 20 24 3a 3a 77 61 6c 5f 69 6e  lename $::wal_in
1df0: 64 65 78 5f 68 64 72 5f 6d 6f 64 20 31 0a 20 20  dex_hdr_mod 1.  
1e00: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
1e10: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 61  { SELECT count(a
1e20: 29 2c 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74  ), sum(a) FROM t
1e30: 31 20 7d 20 64 62 32 0a 20 20 7d 20 24 72 65 73  1 } db2.  } $res
1e40: 31 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32  1.}.db close.db2
1e50: 20 63 6c 6f 73 65 0a 74 76 66 73 20 64 65 6c 65   close.tvfs dele
1e60: 74 65 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  te.forcedelete t
1e70: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
1e80: 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  al test.db-journ
1e90: 61 6c 0a 0a 0a 69 66 20 30 20 7b 0a 23 2d 2d 2d  al...if 0 {.#---
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 69 73 20 74 65  ------.# This te
1ef0: 73 74 20 63 61 73 65 20 2d 20 77 61 6c 32 2d 33  st case - wal2-3
1f00: 2e 2a 20 2d 20 74 65 73 74 73 20 74 68 65 20 72  .* - tests the r
1f10: 65 73 70 6f 6e 73 65 20 6f 66 20 74 68 65 20 6c  esponse of the l
1f20: 69 62 72 61 72 79 20 74 6f 20 61 6e 0a 23 20 53  ibrary to an.# S
1f30: 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
1f40: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 62  attempting to ob
1f50: 74 61 69 6e 20 61 20 52 45 41 44 20 6f 72 20 52  tain a READ or R
1f60: 45 43 4f 56 45 52 20 6c 6f 63 6b 2e 0a 23 0a 23  ECOVER lock..#.#
1f70: 20 20 20 77 61 6c 32 2d 33 2e 30 20 2d 20 32 3a     wal2-3.0 - 2:
1f80: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
1f90: 6e 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 52 45  n obtaining a RE
1fa0: 41 44 20 6c 6f 63 6b 0a 23 20 20 20 77 61 6c 32  AD lock.#   wal2
1fb0: 2d 33 2e 33 20 2d 20 36 3a 20 53 51 4c 49 54 45  -3.3 - 6: SQLITE
1fc0: 5f 42 55 53 59 20 77 68 65 6e 20 6f 62 74 61 69  _BUSY when obtai
1fd0: 6e 69 6e 67 20 61 20 52 45 43 4f 56 45 52 20 6c  ning a RECOVER l
1fe0: 6f 63 6b 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61  ock.#.do_test wa
1ff0: 6c 32 2d 33 2e 30 20 7b 0a 20 20 70 72 6f 63 20  l2-3.0 {.  proc 
2000: 74 76 66 73 5f 63 62 20 7b 6d 65 74 68 6f 64 20  tvfs_cb {method 
2010: 61 72 67 73 7d 20 7b 0a 20 20 20 20 69 66 20 7b  args} {.    if {
2020: 24 6d 65 74 68 6f 64 20 3d 3d 20 22 78 53 68 6d  $method == "xShm
2030: 4c 6f 63 6b 22 7d 20 7b 0a 20 20 20 20 20 20 69  Lock"} {.      i
2040: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2050: 3a 3a 6c 6f 63 6b 65 64 5d 7d 20 7b 20 72 65 74  ::locked]} { ret
2060: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
2070: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
2080: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d  rn SQLITE_OK.  }
2090: 0a 0a 20 20 70 72 6f 63 20 62 75 73 79 68 61 6e  ..  proc busyhan
20a0: 64 6c 65 72 20 78 20 7b 0a 20 20 20 20 69 66 20  dler x {.    if 
20b0: 7b 24 78 3e 33 7d 20 7b 20 75 6e 73 65 74 20 2d  {$x>3} { unset -
20c0: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 6c 6f 63  nocomplain ::loc
20d0: 6b 65 64 20 7d 0a 20 20 20 20 72 65 74 75 72 6e  ked }.    return
20e0: 20 30 0a 20 20 7d 0a 0a 20 20 74 65 73 74 76 66   0.  }..  testvf
20f0: 73 20 74 76 66 73 0a 20 20 74 76 66 73 20 73 63  s tvfs.  tvfs sc
2100: 72 69 70 74 20 74 76 66 73 5f 63 62 0a 20 20 73  ript tvfs_cb.  s
2110: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
2120: 62 20 2d 76 66 73 20 74 76 66 73 0a 20 20 64 62  b -vfs tvfs.  db
2130: 20 62 75 73 79 20 62 75 73 79 68 61 6e 64 6c 65   busy busyhandle
2140: 72 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  r..  execsql {. 
2150: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
2160: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
2170: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2180: 31 28 61 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1(a);.    INSERT
2190: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
21a0: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
21b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 29  NTO t1 VALUES(2)
21c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
21d0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 29 3b 0a  O t1 VALUES(3);.
21e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
21f0: 74 31 20 56 41 4c 55 45 53 28 34 29 3b 0a 20 20  t1 VALUES(4);.  
2200: 7d 20 0a 0a 20 20 73 65 74 20 3a 3a 6c 6f 63 6b  } ..  set ::lock
2210: 65 64 20 31 0a 20 20 69 6e 66 6f 20 65 78 69 73  ed 1.  info exis
2220: 74 73 20 3a 3a 6c 6f 63 6b 65 64 0a 7d 20 7b 31  ts ::locked.} {1
2230: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 33  }.do_test wal2-3
2240: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
2250: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 61 29   SELECT count(a)
2260: 2c 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 31  , sum(a) FROM t1
2270: 20 7d 0a 7d 20 7b 34 20 31 30 7d 0a 64 6f 5f 74   }.} {4 10}.do_t
2280: 65 73 74 20 77 61 6c 32 2d 33 2e 32 20 7b 0a 20  est wal2-3.2 {. 
2290: 20 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6c   info exists ::l
22a0: 6f 63 6b 65 64 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f  ocked.} {0}..do_
22b0: 74 65 73 74 20 77 61 6c 32 2d 33 2e 33 20 7b 0a  test wal2-3.3 {.
22c0: 20 20 70 72 6f 63 20 74 76 66 73 5f 63 62 20 7b    proc tvfs_cb {
22d0: 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20  method args} {. 
22e0: 20 20 20 69 66 20 7b 24 6d 65 74 68 6f 64 20 3d     if {$method =
22f0: 3d 20 22 78 53 68 6d 4c 6f 63 6b 22 7d 20 7b 0a  = "xShmLock"} {.
2300: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
2310: 65 78 69 73 74 73 20 3a 3a 73 61 62 6f 74 61 67  exists ::sabotag
2320: 65 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 75 6e  e]} {.        un
2330: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
2340: 3a 3a 73 61 62 6f 74 61 67 65 0a 20 20 20 20 20  ::sabotage.     
2350: 20 20 20 69 6e 63 72 5f 74 76 66 73 5f 68 64 72     incr_tvfs_hdr
2360: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
2370: 5d 20 31 20 31 0a 20 20 20 20 20 20 7d 0a 20 20  ] 1 1.      }.  
2380: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
2390: 69 73 74 73 20 3a 3a 6c 6f 63 6b 65 64 5d 20 26  ists ::locked] &
23a0: 26 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20  & [lindex $args 
23b0: 32 5d 20 3d 3d 20 22 52 45 43 4f 56 45 52 22 7d  2] == "RECOVER"}
23c0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
23d0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20  n SQLITE_BUSY.  
23e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2400: 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 73 61 62  .  }.  set ::sab
2410: 6f 74 61 67 65 20 31 0a 20 20 73 65 74 20 3a 3a  otage 1.  set ::
2420: 6c 6f 63 6b 65 64 20 31 0a 20 20 6c 69 73 74 20  locked 1.  list 
2430: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73  [info exists ::s
2440: 61 62 6f 74 61 67 65 5d 20 5b 69 6e 66 6f 20 65  abotage] [info e
2450: 78 69 73 74 73 20 3a 3a 6c 6f 63 6b 65 64 5d 0a  xists ::locked].
2460: 7d 20 7b 31 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {1 1}.do_test 
2470: 77 61 6c 32 2d 33 2e 34 20 7b 0a 20 20 65 78 65  wal2-3.4 {.  exe
2480: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
2490: 75 6e 74 28 61 29 2c 20 73 75 6d 28 61 29 20 46  unt(a), sum(a) F
24a0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 34 20 31 30  ROM t1 }.} {4 10
24b0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 33  }.do_test wal2-3
24c0: 2e 35 20 7b 0a 20 20 6c 69 73 74 20 5b 69 6e 66  .5 {.  list [inf
24d0: 6f 20 65 78 69 73 74 73 20 3a 3a 73 61 62 6f 74  o exists ::sabot
24e0: 61 67 65 5d 20 5b 69 6e 66 6f 20 65 78 69 73 74  age] [info exist
24f0: 73 20 3a 3a 6c 6f 63 6b 65 64 5d 0a 7d 20 7b 30  s ::locked].} {0
2500: 20 30 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 66   0}.db close.tvf
2510: 73 20 64 65 6c 65 74 65 0a 66 6f 72 63 65 64 65  s delete.forcede
2520: 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73  lete test.db tes
2530: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62  t.db-wal test.db
2540: 2d 6a 6f 75 72 6e 61 6c 0a 0a 7d 0a 0a 23 2d 2d  -journal..}..#--
2550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20 74  -------.# Test t
25a0: 68 61 74 20 61 20 64 61 74 61 62 61 73 65 20 63  hat a database c
25b0: 6f 6e 6e 65 63 74 69 6f 6e 20 75 73 69 6e 67 20  onnection using 
25c0: 61 20 56 46 53 20 74 68 61 74 20 64 6f 65 73 20  a VFS that does 
25d0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 0a  not support the.
25e0: 23 20 78 53 68 6d 58 58 58 20 69 6e 74 65 72 66  # xShmXXX interf
25f0: 61 63 65 73 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  aces cannot open
2600: 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
2610: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  .#.do_test wal2-
2620: 34 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  4.1 {.  sqlite3 
2630: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
2640: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
2650: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
2660: 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  0;.    PRAGMA jo
2670: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
2680: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
2690: 4c 45 20 64 61 74 61 28 78 29 3b 0a 20 20 20 20  LE data(x);.    
26a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 61 74 61  INSERT INTO data
26b0: 20 56 41 4c 55 45 53 28 27 6e 65 65 64 20 78 53   VALUES('need xS
26c0: 68 6d 4f 70 65 6e 20 74 6f 20 73 65 65 20 74 68  hmOpen to see th
26d0: 69 73 27 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  is');.    PRAGMA
26e0: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b   wal_checkpoint;
26f0: 0a 20 20 7d 0a 20 20 23 20 54 68 72 65 65 20 70  .  }.  # Three p
2700: 61 67 65 73 20 69 6e 20 74 68 65 20 57 41 4c 20  ages in the WAL 
2710: 66 69 6c 65 20 61 74 20 74 68 69 73 20 70 6f 69  file at this poi
2720: 6e 74 3a 20 4f 6e 65 20 63 6f 70 79 20 6f 66 20  nt: One copy of 
2730: 70 61 67 65 20 31 20 61 6e 64 20 74 77 6f 0a 20  page 1 and two. 
2740: 20 23 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70   # of the root p
2750: 61 67 65 20 66 6f 72 20 74 61 62 6c 65 20 22 64  age for table "d
2760: 61 74 61 22 2e 0a 7d 20 7b 77 61 6c 20 30 20 33  ata"..} {wal 0 3
2770: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32   3}.do_test wal2
2780: 2d 34 2e 32 20 7b 0a 20 20 64 62 20 63 6c 6f 73  -4.2 {.  db clos
2790: 65 0a 20 20 74 65 73 74 76 66 73 20 74 76 66 73  e.  testvfs tvfs
27a0: 20 2d 6e 6f 73 68 6d 20 31 0a 20 20 73 71 6c 69   -noshm 1.  sqli
27b0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d  te3 db test.db -
27c0: 76 66 73 20 74 76 66 73 0a 20 20 63 61 74 63 68  vfs tvfs.  catch
27d0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
27e0: 52 4f 4d 20 64 61 74 61 20 7d 0a 7d 20 7b 31 20  ROM data }.} {1 
27f0: 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  {unable to open 
2800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a  database file}}.
2810: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 34 2e 33  do_test wal2-4.3
2820: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
2830: 74 65 73 74 76 66 73 20 74 76 66 73 0a 20 20 73  testvfs tvfs.  s
2840: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
2850: 62 20 2d 76 66 73 20 74 76 66 73 0a 20 20 63 61  b -vfs tvfs.  ca
2860: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
2870: 2a 20 46 52 4f 4d 20 64 61 74 61 20 7d 0a 7d 20  * FROM data }.} 
2880: 7b 30 20 7b 7b 6e 65 65 64 20 78 53 68 6d 4f 70  {0 {{need xShmOp
2890: 65 6e 20 74 6f 20 73 65 65 20 74 68 69 73 7d 7d  en to see this}}
28a0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 66 73 20  }.db close.tvfs 
28b0: 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  delete..#-------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  --.# Test that i
2910: 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  f a database con
2920: 6e 65 63 74 69 6f 6e 20 69 73 20 66 6f 72 63 65  nection is force
2930: 64 20 74 6f 20 72 75 6e 20 72 65 63 6f 76 65 72  d to run recover
2940: 79 20 62 65 66 6f 72 65 20 69 74 0a 23 20 63 61  y before it.# ca
2950: 6e 20 70 65 72 66 6f 72 6d 20 61 20 63 68 65 63  n perform a chec
2960: 6b 70 6f 69 6e 74 2c 20 69 74 20 64 6f 65 73 20  kpoint, it does 
2970: 6e 6f 74 20 74 72 61 6e 73 69 74 69 6f 6e 20 69  not transition i
2980: 6e 74 6f 20 52 45 43 4f 56 45 52 20 73 74 61 74  nto RECOVER stat
2990: 65 2e 0a 23 0a 23 20 55 50 44 41 54 45 3a 20 54  e..#.# UPDATE: T
29a0: 68 69 73 20 68 61 73 20 6e 6f 77 20 63 68 61 6e  his has now chan
29b0: 67 65 64 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ged. When runnin
29c0: 67 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20  g a checkpoint, 
29d0: 69 66 20 72 65 63 6f 76 65 72 79 20 69 73 0a 23  if recovery is.#
29e0: 20 72 65 71 75 69 72 65 64 20 74 68 65 20 63 6c   required the cl
29f0: 69 65 6e 74 20 67 72 61 62 73 20 61 6c 6c 20 65  ient grabs all e
2a00: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 28  xclusive locks (
2a10: 6a 75 73 74 20 61 73 20 69 74 20 77 6f 75 6c 64  just as it would
2a20: 20 66 6f 72 20 61 0a 23 20 72 65 63 6f 76 65 72   for a.# recover
2a30: 79 20 70 65 72 66 6f 72 6d 65 64 20 61 73 20 61  y performed as a
2a40: 20 70 72 65 2d 63 75 72 73 6f 72 20 74 6f 20 61   pre-cursor to a
2a50: 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
2a60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 23   transaction)..#
2a70: 0a 73 65 74 20 65 78 70 65 63 74 65 64 5f 6c 6f  .set expected_lo
2a80: 63 6b 73 20 5b 6c 69 73 74 5d 0a 6c 61 70 70 65  cks [list].lappe
2a90: 6e 64 20 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b  nd expected_lock
2aa0: 73 20 7b 31 20 31 20 6c 6f 63 6b 20 65 78 63 6c  s {1 1 lock excl
2ab0: 75 73 69 76 65 7d 20 20 20 3b 23 20 4c 6f 63 6b  usive}   ;# Lock
2ac0: 20 63 68 65 63 6b 70 6f 69 6e 74 0a 6c 61 70 70   checkpoint.lapp
2ad0: 65 6e 64 20 65 78 70 65 63 74 65 64 5f 6c 6f 63  end expected_loc
2ae0: 6b 73 20 7b 30 20 31 20 6c 6f 63 6b 20 65 78 63  ks {0 1 lock exc
2af0: 6c 75 73 69 76 65 7d 20 20 20 3b 23 20 4c 6f 63  lusive}   ;# Loc
2b00: 6b 20 77 72 69 74 65 72 0a 6c 61 70 70 65 6e 64  k writer.lappend
2b10: 20 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b 73 20   expected_locks 
2b20: 7b 32 20 36 20 6c 6f 63 6b 20 65 78 63 6c 75 73  {2 6 lock exclus
2b30: 69 76 65 7d 20 20 20 3b 23 20 4c 6f 63 6b 20 72  ive}   ;# Lock r
2b40: 65 63 6f 76 65 72 79 20 26 20 61 6c 6c 20 61 52  ecovery & all aR
2b50: 65 61 64 4d 61 72 6b 5b 5d 0a 6c 61 70 70 65 6e  eadMark[].lappen
2b60: 64 20 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b 73  d expected_locks
2b70: 20 7b 32 20 36 20 75 6e 6c 6f 63 6b 20 65 78 63   {2 6 unlock exc
2b80: 6c 75 73 69 76 65 7d 20 3b 23 20 55 6e 6c 6f 63  lusive} ;# Unloc
2b90: 6b 20 72 65 63 6f 76 65 72 79 20 26 20 61 52 65  k recovery & aRe
2ba0: 61 64 4d 61 72 6b 5b 5d 0a 6c 61 70 70 65 6e 64  adMark[].lappend
2bb0: 20 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b 73 20   expected_locks 
2bc0: 7b 30 20 31 20 75 6e 6c 6f 63 6b 20 65 78 63 6c  {0 1 unlock excl
2bd0: 75 73 69 76 65 7d 20 3b 23 20 55 6e 6c 6f 63 6b  usive} ;# Unlock
2be0: 20 77 72 69 74 65 72 0a 6c 61 70 70 65 6e 64 20   writer.lappend 
2bf0: 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b 73 20 7b  expected_locks {
2c00: 33 20 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69  3 1 lock exclusi
2c10: 76 65 7d 20 20 20 3b 23 20 4c 6f 63 6b 20 61 52  ve}   ;# Lock aR
2c20: 65 61 64 4d 61 72 6b 5b 30 5d 0a 6c 61 70 70 65  eadMark[0].lappe
2c30: 6e 64 20 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b  nd expected_lock
2c40: 73 20 7b 33 20 31 20 75 6e 6c 6f 63 6b 20 65 78  s {3 1 unlock ex
2c50: 63 6c 75 73 69 76 65 7d 20 3b 23 20 55 6e 6c 6f  clusive} ;# Unlo
2c60: 63 6b 20 61 52 65 61 64 4d 61 72 6b 5b 30 5d 0a  ck aReadMark[0].
2c70: 6c 61 70 70 65 6e 64 20 65 78 70 65 63 74 65 64  lappend expected
2c80: 5f 6c 6f 63 6b 73 20 7b 31 20 31 20 75 6e 6c 6f  _locks {1 1 unlo
2c90: 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 3b 23  ck exclusive} ;#
2ca0: 20 55 6e 6c 6f 63 6b 20 63 68 65 63 6b 70 6f 69   Unlock checkpoi
2cb0: 6e 74 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  nt.do_test wal2-
2cc0: 35 2e 31 20 7b 0a 20 20 70 72 6f 63 20 74 76 66  5.1 {.  proc tvf
2cd0: 73 5f 63 62 20 7b 6d 65 74 68 6f 64 20 61 72 67  s_cb {method arg
2ce0: 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73  s} {.    set ::s
2cf0: 68 6d 5f 66 69 6c 65 20 5b 6c 69 6e 64 65 78 20  hm_file [lindex 
2d00: 24 61 72 67 73 20 30 5d 0a 20 20 20 20 69 66 20  $args 0].    if 
2d10: 7b 24 6d 65 74 68 6f 64 20 3d 3d 20 22 78 53 68  {$method == "xSh
2d20: 6d 4c 6f 63 6b 22 7d 20 7b 20 6c 61 70 70 65 6e  mLock"} { lappen
2d30: 64 20 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 6e 64 65  d ::locks [linde
2d40: 78 20 24 61 72 67 73 20 32 5d 20 7d 0a 20 20 20  x $args 2] }.   
2d50: 20 72 65 74 75 72 6e 20 24 3a 3a 74 76 66 73 5f   return $::tvfs_
2d60: 63 62 5f 72 65 74 75 72 6e 0a 20 20 7d 0a 20 20  cb_return.  }.  
2d70: 73 65 74 20 74 76 66 73 5f 63 62 5f 72 65 74 75  set tvfs_cb_retu
2d80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 0a 20 20  rn SQLITE_OK..  
2d90: 74 65 73 74 76 66 73 20 74 76 66 73 0a 20 20 74  testvfs tvfs.  t
2da0: 76 66 73 20 73 63 72 69 70 74 20 74 76 66 73 5f  vfs script tvfs_
2db0: 63 62 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62  cb..  sqlite3 db
2dc0: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76   test.db -vfs tv
2dd0: 66 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  fs.  execsql {. 
2de0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
2df0: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
2e00: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
2e10: 28 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (y);.    INSERT 
2e20: 49 4e 54 4f 20 78 20 56 41 4c 55 45 53 28 31 29  INTO x VALUES(1)
2e30: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 63 72 5f 74 76  ;.  }..  incr_tv
2e40: 66 73 5f 68 64 72 20 24 3a 3a 73 68 6d 5f 66 69  fs_hdr $::shm_fi
2e50: 6c 65 20 31 20 31 0a 20 20 73 65 74 20 3a 3a 6c  le 1 1.  set ::l
2e60: 6f 63 6b 73 20 5b 6c 69 73 74 5d 0a 20 20 65 78  ocks [list].  ex
2e70: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
2e80: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
2e90: 20 20 73 65 74 20 3a 3a 6c 6f 63 6b 73 0a 7d 20    set ::locks.} 
2ea0: 24 65 78 70 65 63 74 65 64 5f 6c 6f 63 6b 73 0a  $expected_locks.
2eb0: 64 62 20 63 6c 6f 73 65 0a 74 76 66 73 20 64 65  db close.tvfs de
2ec0: 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lete..#---------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 2c 20 74  .# This block, t
2f20: 65 73 74 20 63 61 73 65 73 20 77 61 6c 32 2d 36  est cases wal2-6
2f30: 2e 2a 2c 20 74 65 73 74 73 20 74 68 65 20 6f 70  .*, tests the op
2f40: 65 72 61 74 69 6f 6e 20 6f 66 20 57 41 4c 20 77  eration of WAL w
2f50: 69 74 68 0a 23 20 22 50 52 41 47 4d 41 20 6c 6f  ith.# "PRAGMA lo
2f60: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
2f70: 53 49 56 45 22 20 73 65 74 2e 0a 23 0a 23 20 20  SIVE" set..#.#  
2f80: 20 77 61 6c 32 2d 36 2e 31 2e 2a 3a 20 43 68 61   wal2-6.1.*: Cha
2f90: 6e 67 69 6e 67 20 74 6f 20 57 41 4c 20 6d 6f 64  nging to WAL mod
2fa0: 65 20 62 65 66 6f 72 65 20 73 65 74 74 69 6e 67  e before setting
2fb0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
2fc0: 63 6c 75 73 69 76 65 2e 0a 23 0a 23 20 20 20 77  clusive..#.#   w
2fd0: 61 6c 32 2d 36 2e 32 2e 2a 3a 20 43 68 61 6e 67  al2-6.2.*: Chang
2fe0: 69 6e 67 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20  ing to WAL mode 
2ff0: 61 66 74 65 72 20 73 65 74 74 69 6e 67 20 6c 6f  after setting lo
3000: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
3010: 73 69 76 65 2e 0a 23 0a 23 20 20 20 77 61 6c 32  sive..#.#   wal2
3020: 2d 36 2e 33 2e 2a 3a 20 43 68 61 6e 67 69 6e 67  -6.3.*: Changing
3030: 20 62 61 63 6b 20 74 6f 20 72 6f 6c 6c 62 61 63   back to rollbac
3040: 6b 20 6d 6f 64 65 20 66 72 6f 6d 20 57 41 4c 20  k mode from WAL 
3050: 6d 6f 64 65 20 61 66 74 65 72 20 73 65 74 74 69  mode after setti
3060: 6e 67 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  ng .#           
3070: 20 20 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65      locking_mode
3080: 3d 65 78 63 6c 75 73 69 76 65 2e 0a 23 0a 23 20  =exclusive..#.# 
3090: 20 20 77 61 6c 32 2d 36 2e 34 2e 2a 3a 20 43 68    wal2-6.4.*: Ch
30a0: 65 63 6b 20 74 68 61 74 20 78 53 68 6d 4c 6f 63  eck that xShmLoc
30b0: 6b 20 63 61 6c 6c 73 20 61 72 65 20 6f 6d 69 74  k calls are omit
30c0: 74 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ted in exclusive
30d0: 20 6c 6f 63 6b 69 6e 67 0a 23 20 20 20 20 20 20   locking.#      
30e0: 20 20 20 20 20 20 20 20 20 6d 6f 64 65 2e 0a 23           mode..#
30f0: 0a 23 20 20 20 77 61 6c 32 2d 36 2e 35 2e 2a 3a  .#   wal2-6.5.*:
3100: 20 0a 23 0a 23 20 20 20 77 61 6c 32 2d 36 2e 36   .#.#   wal2-6.6
3110: 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20 69  .*: Check that i
3120: 66 20 74 68 65 20 78 53 68 6d 4c 6f 63 6b 28 29  f the xShmLock()
3130: 20 74 6f 20 72 65 61 71 75 69 72 65 20 61 20 57   to reaquire a W
3140: 41 4c 20 72 65 61 64 2d 6c 6f 63 6b 20 77 68 65  AL read-lock whe
3150: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
3160: 20 20 65 78 69 74 69 6e 67 20 65 78 63 6c 75 73    exiting exclus
3170: 69 76 65 20 6d 6f 64 65 20 66 61 69 6c 73 20 28  ive mode fails (
3180: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  i.e. SQLITE_IOER
3190: 52 29 2c 20 74 68 65 6e 20 74 68 65 0a 23 20 20  R), then the.#  
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
31b0: 6e 65 63 74 69 6f 6e 20 73 69 6c 65 6e 74 6c 79  nection silently
31c0: 20 72 65 6d 61 69 6e 73 20 69 6e 20 65 78 63 6c   remains in excl
31d0: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 23 0a 64 6f  usive mode..#.do
31e0: 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 31 2e 31  _test wal2-6.1.1
31f0: 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65   {.  forcedelete
3200: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
3210: 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75  -wal test.db-jou
3220: 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64  rnal.  sqlite3 d
3230: 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
3240: 73 71 6c 20 7b 0a 20 20 20 20 50 72 61 67 6d 61  sql {.    Pragma
3250: 20 4a 6f 75 72 6e 61 6c 5f 4d 6f 64 65 20 3d 20   Journal_Mode = 
3260: 57 61 6c 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 7d  Wal;.  }.} {wal}
3270: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e  .do_test wal2-6.
3280: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
3290: 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74  { PRAGMA lock_st
32a0: 61 74 75 73 20 7d 0a 7d 20 7b 6d 61 69 6e 20 75  atus }.} {main u
32b0: 6e 6c 6f 63 6b 65 64 20 74 65 6d 70 20 63 6c 6f  nlocked temp clo
32c0: 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  sed}.do_test wal
32d0: 32 2d 36 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63  2-6.1.3 {.  exec
32e0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
32f0: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
3300: 61 73 74 65 72 3b 0a 20 20 20 20 50 72 61 67 6d  aster;.    Pragm
3310: 61 20 4c 6f 63 6b 69 6e 67 5f 4d 6f 64 65 20 3d  a Locking_Mode =
3320: 20 45 78 63 6c 75 73 69 76 65 3b 0a 20 20 7d 0a   Exclusive;.  }.
3330: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3340: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45  BEGIN;.      CRE
3350: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
3360: 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
3370: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3380: 31 2c 20 32 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  1, 2);.    COMMI
3390: 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f  T;.    PRAGMA lo
33a0: 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d  ck_status;.  }.}
33b0: 20 7b 6d 61 69 6e 20 65 78 63 6c 75 73 69 76 65   {main exclusive
33c0: 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 64 6f   temp closed}.do
33d0: 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 31 2e 34  _test wal2-6.1.4
33e0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
33f0: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
3400: 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c  ng_mode = normal
3410: 3b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f  ; .    PRAGMA lo
3420: 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d  ck_status;.  }.}
3430: 20 7b 6e 6f 72 6d 61 6c 20 6d 61 69 6e 20 65 78   {normal main ex
3440: 63 6c 75 73 69 76 65 20 74 65 6d 70 20 63 6c 6f  clusive temp clo
3450: 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  sed}.do_test wal
3460: 32 2d 36 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63  2-6.1.5 {.  exec
3470: 73 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45 43  sql { .    SELEC
3480: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
3490: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
34a0: 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20  tus;.  }.} {1 2 
34b0: 6d 61 69 6e 20 73 68 61 72 65 64 20 74 65 6d 70  main shared temp
34c0: 20 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65 73 74   closed}.do_test
34d0: 20 77 61 6c 32 2d 36 2e 31 2e 36 20 7b 0a 20 20   wal2-6.1.6 {.  
34e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
34f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3500: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 50  UES(3, 4);.    P
3510: 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75  RAGMA lock_statu
3520: 73 3b 0a 20 20 7d 0a 7d 20 7b 6d 61 69 6e 20 73  s;.  }.} {main s
3530: 68 61 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65  hared temp close
3540: 64 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f  d}.db close..do_
3550: 74 65 73 74 20 77 61 6c 32 2d 36 2e 32 2e 31 20  test wal2-6.2.1 
3560: 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  {.  forcedelete 
3570: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
3580: 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  wal test.db-jour
3590: 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62  nal.  sqlite3 db
35a0: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
35b0: 71 6c 20 7b 0a 20 20 20 20 50 72 61 67 6d 61 20  ql {.    Pragma 
35c0: 4c 6f 63 6b 69 6e 67 5f 4d 6f 64 65 20 3d 20 45  Locking_Mode = E
35d0: 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 50 72  xclusive;.    Pr
35e0: 61 67 6d 61 20 4a 6f 75 72 6e 61 6c 5f 4d 6f 64  agma Journal_Mod
35f0: 65 20 3d 20 57 61 6c 3b 0a 20 20 20 20 50 72 61  e = Wal;.    Pra
3600: 67 6d 61 20 4c 6f 63 6b 5f 53 74 61 74 75 73 3b  gma Lock_Status;
3610: 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76  .  }.} {exclusiv
3620: 65 20 77 61 6c 20 6d 61 69 6e 20 65 78 63 6c 75  e wal main exclu
3630: 73 69 76 65 20 74 65 6d 70 20 63 6c 6f 73 65 64  sive temp closed
3640: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36  }.do_test wal2-6
3650: 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.2 {.  execsql
3660: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
3670: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3680: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
3690: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
36a0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
36b0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 72    COMMIT;.    Pr
36c0: 61 67 6d 61 20 6c 6f 43 4b 5f 53 54 41 54 75 73  agma loCK_STATus
36d0: 3b 0a 20 20 7d 0a 7d 20 7b 6d 61 69 6e 20 65 78  ;.  }.} {main ex
36e0: 63 6c 75 73 69 76 65 20 74 65 6d 70 20 63 6c 6f  clusive temp clo
36f0: 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  sed}.do_test wal
3700: 32 2d 36 2e 32 2e 33 20 7b 0a 20 20 64 62 20 63  2-6.2.3 {.  db c
3710: 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64  lose.  sqlite3 d
3720: 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
3730: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
3740: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
3750: 72 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  r }.  execsql { 
3760: 50 52 41 47 4d 41 20 4c 4f 43 4b 49 4e 47 5f 4d  PRAGMA LOCKING_M
3770: 4f 44 45 20 3d 20 45 58 43 4c 55 53 49 56 45 20  ODE = EXCLUSIVE 
3780: 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a  }.} {exclusive}.
3790: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 32  do_test wal2-6.2
37a0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
37b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
37c0: 4f 4d 20 74 31 3b 0a 20 20 20 20 70 72 61 67 6d  OM t1;.    pragm
37d0: 61 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20  a lock_status;. 
37e0: 20 7d 0a 7d 20 7b 31 20 32 20 6d 61 69 6e 20 73   }.} {1 2 main s
37f0: 68 61 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65  hared temp close
3800: 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  d}.do_test wal2-
3810: 36 2e 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  6.2.5 {.  execsq
3820: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
3830: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
3840: 20 34 29 3b 0a 20 20 20 20 70 72 61 67 6d 61 20   4);.    pragma 
3850: 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d  lock_status;.  }
3860: 0a 7d 20 7b 6d 61 69 6e 20 65 78 63 6c 75 73 69  .} {main exclusi
3870: 76 65 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a  ve temp closed}.
3880: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 32  do_test wal2-6.2
3890: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
38a0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
38b0: 69 6e 67 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41  ing_mode = NORMA
38c0: 4c 3b 0a 20 20 20 20 70 72 61 67 6d 61 20 6c 6f  L;.    pragma lo
38d0: 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d  ck_status;.  }.}
38e0: 20 7b 6e 6f 72 6d 61 6c 20 6d 61 69 6e 20 65 78   {normal main ex
38f0: 63 6c 75 73 69 76 65 20 74 65 6d 70 20 63 6c 6f  clusive temp clo
3900: 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  sed}.do_test wal
3910: 32 2d 36 2e 32 2e 37 20 7b 0a 20 20 65 78 65 63  2-6.2.7 {.  exec
3920: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20  sql {.    BEGIN 
3930: 49 4d 4d 45 44 49 41 54 45 3b 20 43 4f 4d 4d 49  IMMEDIATE; COMMI
3940: 54 3b 0a 20 20 20 20 70 72 61 67 6d 61 20 6c 6f  T;.    pragma lo
3950: 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20 7d 0a 7d  ck_status;.  }.}
3960: 20 7b 6d 61 69 6e 20 73 68 61 72 65 64 20 74 65   {main shared te
3970: 6d 70 20 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65  mp closed}.do_te
3980: 73 74 20 77 61 6c 32 2d 36 2e 32 2e 38 20 7b 0a  st wal2-6.2.8 {.
3990: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
39a0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
39b0: 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45 3b  ode = EXCLUSIVE;
39c0: 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45 44  .    BEGIN IMMED
39d0: 49 41 54 45 3b 20 43 4f 4d 4d 49 54 3b 0a 20 20  IATE; COMMIT;.  
39e0: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
39f0: 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 3b 0a  _mode = NORMAL;.
3a00: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
3a10: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3a20: 4d 20 74 31 3b 0a 20 20 20 20 70 72 61 67 6d 61  M t1;.    pragma
3a30: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20   lock_status;.  
3a40: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 6d 61 69  }.} {1 2 3 4 mai
3a50: 6e 20 73 68 61 72 65 64 20 74 65 6d 70 20 63 6c  n shared temp cl
3a60: 6f 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61  osed}.do_test wa
3a70: 6c 32 2d 36 2e 32 2e 39 20 7b 0a 20 20 65 78 65  l2-6.2.9 {.  exe
3a80: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
3a90: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3aa0: 28 35 2c 20 36 29 3b 0a 20 20 20 20 53 45 4c 45  (5, 6);.    SELE
3ab0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
3ac0: 20 20 70 72 61 67 6d 61 20 6c 6f 63 6b 5f 73 74    pragma lock_st
3ad0: 61 74 75 73 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  atus;.  }.} {1 2
3ae0: 20 33 20 34 20 35 20 36 20 6d 61 69 6e 20 73 68   3 4 5 6 main sh
3af0: 61 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64  ared temp closed
3b00: 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74  }.db close..do_t
3b10: 65 73 74 20 77 61 6c 32 2d 36 2e 33 2e 31 20 7b  est wal2-6.3.1 {
3b20: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
3b30: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
3b40: 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  al test.db-journ
3b50: 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  al.  sqlite3 db 
3b60: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
3b70: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
3b80: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
3b90: 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f  L;.    PRAGMA lo
3ba0: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63  cking_mode = exc
3bb0: 6c 75 73 69 76 65 3b 0a 20 20 20 20 42 45 47 49  lusive;.    BEGI
3bc0: 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  N;.      CREATE 
3bd0: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
3be0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3bf0: 31 20 56 41 4c 55 45 53 28 27 43 68 69 63 6f 27  1 VALUES('Chico'
3c00: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
3c10: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
3c20: 48 61 72 70 6f 27 29 3b 0a 20 20 20 20 43 4f 4d  Harpo');.    COM
3c30: 4d 49 54 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20  MIT;.  }.  list 
3c40: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73  [file exists tes
3c50: 74 2e 64 62 2d 77 61 6c 5d 20 5b 66 69 6c 65 20  t.db-wal] [file 
3c60: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
3c70: 6f 75 72 6e 61 6c 5d 0a 7d 20 7b 31 20 30 7d 0a  ournal].} {1 0}.
3c80: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 33  do_test wal2-6.3
3c90: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
3ca0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
3cb0: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a  mode = DELETE }.
3cc0: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
3cd0: 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 7b 30 7d 0a  st.db-wal.} {0}.
3ce0: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 33  do_test wal2-6.3
3cf0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
3d00: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
3d10: 74 75 73 20 7d 0a 7d 20 7b 6d 61 69 6e 20 65 78  tus }.} {main ex
3d20: 63 6c 75 73 69 76 65 20 74 65 6d 70 20 63 6c 6f  clusive temp clo
3d30: 73 65 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  sed}.do_test wal
3d40: 32 2d 36 2e 33 2e 34 20 7b 0a 20 20 65 78 65 63  2-6.3.4 {.  exec
3d50: 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e  sql { .    BEGIN
3d60: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3d70: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 47  NTO t1 VALUES('G
3d80: 72 6f 75 63 68 6f 27 29 3b 0a 20 20 7d 0a 20 20  roucho');.  }.  
3d90: 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74  list [file exist
3da0: 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 5b  s test.db-wal] [
3db0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
3dc0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 0a 7d 20 7b  .db-journal].} {
3dd0: 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  0 1}.do_test wal
3de0: 32 2d 36 2e 33 2e 35 20 7b 0a 20 20 65 78 65 63  2-6.3.5 {.  exec
3df0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63  sql { PRAGMA loc
3e00: 6b 5f 73 74 61 74 75 73 20 7d 0a 7d 20 7b 6d 61  k_status }.} {ma
3e10: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 74 65 6d  in exclusive tem
3e20: 70 20 63 6c 6f 73 65 64 7d 0a 64 6f 5f 74 65 73  p closed}.do_tes
3e30: 74 20 77 61 6c 32 2d 36 2e 33 2e 36 20 7b 0a 20  t wal2-6.3.6 {. 
3e40: 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49   execsql { COMMI
3e50: 54 20 7d 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65  T }.  list [file
3e60: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
3e70: 77 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73 74  wal] [file exist
3e80: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
3e90: 6c 5d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65  l].} {0 1}.do_te
3ea0: 73 74 20 77 61 6c 32 2d 36 2e 33 2e 37 20 7b 0a  st wal2-6.3.7 {.
3eb0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
3ec0: 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d  MA lock_status }
3ed0: 0a 7d 20 7b 6d 61 69 6e 20 65 78 63 6c 75 73 69  .} {main exclusi
3ee0: 76 65 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a  ve temp closed}.
3ef0: 64 62 20 63 6c 6f 73 65 0a 0a 0a 23 20 54 68 69  db close...# Thi
3f00: 73 20 74 65 73 74 20 2d 20 77 61 6c 32 2d 36 2e  s test - wal2-6.
3f10: 34 2e 2a 20 2d 20 75 73 65 73 20 61 20 73 69 6e  4.* - uses a sin
3f20: 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  gle database con
3f30: 6e 65 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 0a  nection and the.
3f40: 23 20 5b 74 65 73 74 76 66 73 5d 20 69 6e 73 74  # [testvfs] inst
3f50: 72 75 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 74  rumentation to t
3f60: 65 73 74 20 74 68 61 74 20 78 53 68 6d 4c 6f 63  est that xShmLoc
3f70: 6b 28 29 20 69 73 20 62 65 69 6e 67 20 63 61 6c  k() is being cal
3f80: 6c 65 64 0a 23 20 61 73 20 65 78 70 65 63 74 65  led.# as expecte
3f90: 64 20 77 68 65 6e 20 61 20 57 41 4c 20 64 61 74  d when a WAL dat
3fa0: 61 62 61 73 65 20 69 73 20 75 73 65 64 20 77 69  abase is used wi
3fb0: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
3fc0: 65 78 63 6c 75 73 69 76 65 2e 0a 23 0a 64 6f 5f  exclusive..#.do_
3fd0: 74 65 73 74 20 77 61 6c 32 2d 36 2e 34 2e 31 20  test wal2-6.4.1 
3fe0: 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  {.  forcedelete 
3ff0: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
4000: 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  wal test.db-jour
4010: 6e 61 6c 0a 20 20 70 72 6f 63 20 74 76 66 73 5f  nal.  proc tvfs_
4020: 63 62 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d  cb {method args}
4030: 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73 68 6d   {.    set ::shm
4040: 5f 66 69 6c 65 20 5b 6c 69 6e 64 65 78 20 24 61  _file [lindex $a
4050: 72 67 73 20 30 5d 0a 20 20 20 20 69 66 20 7b 24  rgs 0].    if {$
4060: 6d 65 74 68 6f 64 20 3d 3d 20 22 78 53 68 6d 4c  method == "xShmL
4070: 6f 63 6b 22 7d 20 7b 20 6c 61 70 70 65 6e 64 20  ock"} { lappend 
4080: 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 6e 64 65 78 20  ::locks [lindex 
4090: 24 61 72 67 73 20 32 5d 20 7d 0a 20 20 20 20 72  $args 2] }.    r
40a0: 65 74 75 72 6e 20 22 53 51 4c 49 54 45 5f 4f 4b  eturn "SQLITE_OK
40b0: 22 0a 20 20 7d 0a 20 20 74 65 73 74 76 66 73 20  ".  }.  testvfs 
40c0: 74 76 66 73 0a 20 20 74 76 66 73 20 73 63 72 69  tvfs.  tvfs scri
40d0: 70 74 20 74 76 66 73 5f 63 62 0a 20 20 73 71 6c  pt tvfs_cb.  sql
40e0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20  ite3 db test.db 
40f0: 2d 76 66 73 20 74 76 66 73 0a 20 20 73 65 74 20  -vfs tvfs.  set 
4100: 7b 7d 20 7b 7d 0a 7d 20 7b 7d 0a 0a 73 65 74 20  {} {}.} {}..set 
4110: 52 45 43 4f 56 45 52 59 20 7b 0a 20 20 7b 30 20  RECOVERY {.  {0 
4120: 31 20 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65  1 lock exclusive
4130: 7d 20 7b 31 20 37 20 6c 6f 63 6b 20 65 78 63 6c  } {1 7 lock excl
4140: 75 73 69 76 65 7d 20 0a 20 20 7b 31 20 37 20 75  usive} .  {1 7 u
4150: 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65 7d  nlock exclusive}
4160: 20 7b 30 20 31 20 75 6e 6c 6f 63 6b 20 65 78 63   {0 1 unlock exc
4170: 6c 75 73 69 76 65 7d 0a 7d 0a 73 65 74 20 52 45  lusive}.}.set RE
4180: 41 44 4d 41 52 4b 30 5f 52 45 41 44 20 7b 0a 20  ADMARK0_READ {. 
4190: 20 7b 33 20 31 20 6c 6f 63 6b 20 73 68 61 72 65   {3 1 lock share
41a0: 64 7d 20 7b 33 20 31 20 75 6e 6c 6f 63 6b 20 73  d} {3 1 unlock s
41b0: 68 61 72 65 64 7d 0a 7d 0a 73 65 74 20 52 45 41  hared}.}.set REA
41c0: 44 4d 41 52 4b 30 5f 57 52 49 54 45 20 7b 0a 20  DMARK0_WRITE {. 
41d0: 20 7b 33 20 31 20 6c 6f 63 6b 20 73 68 61 72 65   {3 1 lock share
41e0: 64 7d 20 0a 20 20 7b 30 20 31 20 6c 6f 63 6b 20  d} .  {0 1 lock 
41f0: 65 78 63 6c 75 73 69 76 65 7d 20 7b 33 20 31 20  exclusive} {3 1 
4200: 75 6e 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 0a  unlock shared} .
4210: 20 20 7b 34 20 31 20 6c 6f 63 6b 20 65 78 63 6c    {4 1 lock excl
4220: 75 73 69 76 65 7d 20 7b 34 20 31 20 75 6e 6c 6f  usive} {4 1 unlo
4230: 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 7b 34  ck exclusive} {4
4240: 20 31 20 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20   1 lock shared} 
4250: 0a 20 20 7b 30 20 31 20 75 6e 6c 6f 63 6b 20 65  .  {0 1 unlock e
4260: 78 63 6c 75 73 69 76 65 7d 20 7b 34 20 31 20 75  xclusive} {4 1 u
4270: 6e 6c 6f 63 6b 20 73 68 61 72 65 64 7d 0a 7d 0a  nlock shared}.}.
4280: 73 65 74 20 52 45 41 44 4d 41 52 4b 31 5f 53 45  set READMARK1_SE
4290: 54 20 7b 0a 20 20 7b 34 20 31 20 6c 6f 63 6b 20  T {.  {4 1 lock 
42a0: 65 78 63 6c 75 73 69 76 65 7d 20 7b 34 20 31 20  exclusive} {4 1 
42b0: 75 6e 6c 6f 63 6b 20 65 78 63 6c 75 73 69 76 65  unlock exclusive
42c0: 7d 0a 7d 0a 73 65 74 20 52 45 41 44 4d 41 52 4b  }.}.set READMARK
42d0: 31 5f 52 45 41 44 20 7b 0a 20 20 7b 34 20 31 20  1_READ {.  {4 1 
42e0: 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 7b 34 20  lock shared} {4 
42f0: 31 20 75 6e 6c 6f 63 6b 20 73 68 61 72 65 64 7d  1 unlock shared}
4300: 0a 7d 0a 73 65 74 20 52 45 41 44 4d 41 52 4b 31  .}.set READMARK1
4310: 5f 57 52 49 54 45 20 7b 0a 20 20 7b 34 20 31 20  _WRITE {.  {4 1 
4320: 6c 6f 63 6b 20 73 68 61 72 65 64 7d 20 0a 20 20  lock shared} .  
4330: 20 20 7b 30 20 31 20 6c 6f 63 6b 20 65 78 63 6c    {0 1 lock excl
4340: 75 73 69 76 65 7d 20 7b 30 20 31 20 75 6e 6c 6f  usive} {0 1 unlo
4350: 63 6b 20 65 78 63 6c 75 73 69 76 65 7d 20 0a 20  ck exclusive} . 
4360: 20 7b 34 20 31 20 75 6e 6c 6f 63 6b 20 73 68 61   {4 1 unlock sha
4370: 72 65 64 7d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20  red}.}..foreach 
4380: 7b 74 6e 20 73 71 6c 20 72 65 73 20 65 78 70 65  {tn sql res expe
4390: 63 74 65 64 5f 6c 6f 63 6b 73 7d 20 7b 0a 20 20  cted_locks} {.  
43a0: 32 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  2 {.    PRAGMA a
43b0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a  uto_vacuum = 0;.
43c0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
43d0: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
43e0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
43f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4400: 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  x);.      INSERT
4410: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4420: 27 4c 65 6f 6e 61 72 64 27 29 3b 0a 20 20 20 20  'Leonard');.    
4430: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4440: 20 56 41 4c 55 45 53 28 27 41 72 74 68 75 72 27   VALUES('Arthur'
4450: 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  );.    COMMIT;. 
4460: 20 7d 20 7b 77 61 6c 7d 20 7b 0a 20 20 20 20 24   } {wal} {.    $
4470: 52 45 43 4f 56 45 52 59 20 0a 20 20 20 20 24 52  RECOVERY .    $R
4480: 45 41 44 4d 41 52 4b 30 5f 57 52 49 54 45 0a 20  EADMARK0_WRITE. 
4490: 20 7d 0a 0a 20 20 33 20 7b 0a 20 20 20 20 23 20   }..  3 {.    # 
44a0: 54 68 69 73 20 74 65 73 74 20 73 68 6f 75 6c 64  This test should
44b0: 20 64 6f 20 74 68 65 20 52 45 41 44 4d 41 52 4b   do the READMARK
44c0: 31 5f 53 45 54 20 6c 6f 63 6b 69 6e 67 20 74 6f  1_SET locking to
44d0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 20   populate the . 
44e0: 20 20 20 23 20 61 52 65 61 64 4d 61 72 6b 5b 31     # aReadMark[1
44f0: 5d 20 73 6c 6f 74 20 77 69 74 68 20 74 68 65 20  ] slot with the 
4500: 63 75 72 72 65 6e 74 20 6d 78 46 72 61 6d 65 20  current mxFrame 
4510: 76 61 6c 75 65 2e 20 46 6f 6c 6c 6f 77 65 64 20  value. Followed 
4520: 62 79 0a 20 20 20 20 23 20 52 45 41 44 4d 41 52  by.    # READMAR
4530: 4b 31 5f 52 45 41 44 20 74 6f 20 72 65 61 64 20  K1_READ to read 
4540: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
4550: 20 20 23 0a 20 20 20 20 53 45 4c 45 43 54 20 2a    #.    SELECT *
4560: 20 46 52 4f 4d 20 74 31 0a 20 20 7d 20 7b 4c 65   FROM t1.  } {Le
4570: 6f 6e 61 72 64 20 41 72 74 68 75 72 7d 20 7b 0a  onard Arthur} {.
4580: 20 20 20 20 24 52 45 41 44 4d 41 52 4b 31 5f 53      $READMARK1_S
4590: 45 54 0a 20 20 20 20 24 52 45 41 44 4d 41 52 4b  ET.    $READMARK
45a0: 31 5f 52 45 41 44 0a 20 20 7d 0a 0a 20 20 34 20  1_READ.  }..  4 
45b0: 7b 0a 20 20 20 20 23 20 61 52 65 61 64 4d 61 72  {.    # aReadMar
45c0: 6b 5b 31 5d 20 69 73 20 61 6c 72 65 61 64 79 20  k[1] is already 
45d0: 73 65 74 20 74 6f 20 6d 78 46 72 61 6d 65 2e 20  set to mxFrame. 
45e0: 53 6f 20 6a 75 73 74 20 52 45 41 44 4d 41 52 4b  So just READMARK
45f0: 31 5f 52 45 41 44 0a 20 20 20 20 23 20 74 68 69  1_READ.    # thi
4600: 73 20 74 69 6d 65 2c 20 6e 6f 74 20 52 45 41 44  s time, not READ
4610: 4d 41 52 4b 31 5f 53 45 54 2e 0a 20 20 20 20 23  MARK1_SET..    #
4620: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
4630: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 78  OM t1 ORDER BY x
4640: 0a 20 20 7d 20 7b 41 72 74 68 75 72 20 4c 65 6f  .  } {Arthur Leo
4650: 6e 61 72 64 7d 20 7b 20 0a 20 20 20 20 24 52 45  nard} { .    $RE
4660: 41 44 4d 41 52 4b 31 5f 52 45 41 44 20 0a 20 20  ADMARK1_READ .  
4670: 7d 0a 0a 20 20 35 20 7b 0a 20 20 20 20 50 52 41  }..  5 {.    PRA
4680: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4690: 20 3d 20 65 78 63 6c 75 73 69 76 65 0a 20 20 7d   = exclusive.  }
46a0: 20 7b 65 78 63 6c 75 73 69 76 65 7d 20 7b 20 7d   {exclusive} { }
46b0: 20 0a 0a 20 20 36 20 7b 0a 20 20 20 20 49 4e 53   ..  6 {.    INS
46c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
46d0: 45 53 28 27 4a 75 6c 69 75 73 20 48 65 6e 72 79  ES('Julius Henry
46e0: 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  ');.    SELECT *
46f0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 7b 4c   FROM t1;.  } {L
4700: 65 6f 6e 61 72 64 20 41 72 74 68 75 72 20 7b 4a  eonard Arthur {J
4710: 75 6c 69 75 73 20 48 65 6e 72 79 7d 7d 20 7b 0a  ulius Henry}} {.
4720: 20 20 20 20 24 52 45 41 44 4d 41 52 4b 31 5f 52      $READMARK1_R
4730: 45 41 44 0a 20 20 7d 0a 0a 20 20 37 20 7b 0a 20  EAD.  }..  7 {. 
4740: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4750: 31 20 56 41 4c 55 45 53 28 27 4b 61 72 6c 27 29  1 VALUES('Karl')
4760: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
4770: 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 7b 4c 65 6f  ROM t1;.  } {Leo
4780: 6e 61 72 64 20 41 72 74 68 75 72 20 7b 4a 75 6c  nard Arthur {Jul
4790: 69 75 73 20 48 65 6e 72 79 7d 20 4b 61 72 6c 7d  ius Henry} Karl}
47a0: 20 7b 20 7d 0a 0a 20 20 38 20 7b 0a 20 20 20 20   { }..  8 {.    
47b0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
47c0: 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 0a 20 20 7d  ode = normal.  }
47d0: 20 7b 6e 6f 72 6d 61 6c 7d 20 7b 20 7d 0a 0a 20   {normal} { }.. 
47e0: 20 39 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20   9 {.    SELECT 
47f0: 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  * FROM t1 ORDER 
4800: 42 59 20 78 0a 20 20 7d 20 7b 41 72 74 68 75 72  BY x.  } {Arthur
4810: 20 7b 4a 75 6c 69 75 73 20 48 65 6e 72 79 7d 20   {Julius Henry} 
4820: 4b 61 72 6c 20 4c 65 6f 6e 61 72 64 7d 20 24 52  Karl Leonard} $R
4830: 45 41 44 4d 41 52 4b 31 5f 52 45 41 44 0a 0a 20  EADMARK1_READ.. 
4840: 20 31 30 20 7b 20 44 45 4c 45 54 45 20 46 52 4f   10 { DELETE FRO
4850: 4d 20 74 31 20 7d 20 7b 7d 20 24 52 45 41 44 4d  M t1 } {} $READM
4860: 41 52 4b 31 5f 57 52 49 54 45 0a 0a 20 20 31 31  ARK1_WRITE..  11
4870: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
4880: 46 52 4f 4d 20 74 31 0a 20 20 7d 20 7b 7d 20 7b  FROM t1.  } {} {
4890: 0a 20 20 20 20 24 52 45 41 44 4d 41 52 4b 31 5f  .    $READMARK1_
48a0: 53 45 54 0a 20 20 20 20 24 52 45 41 44 4d 41 52  SET.    $READMAR
48b0: 4b 31 5f 52 45 41 44 0a 20 20 7d 0a 7d 20 7b 0a  K1_READ.  }.} {.
48c0: 0a 20 20 73 65 74 20 4c 20 5b 6c 69 73 74 5d 0a  .  set L [list].
48d0: 20 20 66 6f 72 65 61 63 68 20 65 6c 20 5b 73 75    foreach el [su
48e0: 62 73 74 20 24 65 78 70 65 63 74 65 64 5f 6c 6f  bst $expected_lo
48f0: 63 6b 73 5d 20 7b 20 6c 61 70 70 65 6e 64 20 4c  cks] { lappend L
4900: 20 24 65 6c 20 7d 0a 0a 20 20 73 65 74 20 53 20   $el }..  set S 
4910: 22 22 0a 20 20 66 6f 72 65 61 63 68 20 73 71 20  "".  foreach sq 
4920: 5b 73 70 6c 69 74 20 24 73 71 6c 20 22 5c 6e 22  [split $sql "\n"
4930: 5d 20 7b 20 0a 20 20 20 20 73 65 74 20 73 71 20  ] { .    set sq 
4940: 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71  [string trim $sq
4950: 5d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e  ].    if {[strin
4960: 67 20 6d 61 74 63 68 20 7b 23 2a 7d 20 24 73 71  g match {#*} $sq
4970: 5d 3d 3d 30 7d 20 7b 61 70 70 65 6e 64 20 53 20  ]==0} {append S 
4980: 22 24 73 71 5c 6e 22 7d 0a 20 20 7d 0a 0a 20 20  "$sq\n"}.  }..  
4990: 73 65 74 20 3a 3a 6c 6f 63 6b 73 20 5b 6c 69 73  set ::locks [lis
49a0: 74 5d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  t].  do_test wal
49b0: 32 2d 36 2e 34 2e 24 74 6e 2e 31 20 7b 20 65 78  2-6.4.$tn.1 { ex
49c0: 65 63 73 71 6c 20 24 53 20 7d 20 24 72 65 73 0a  ecsql $S } $res.
49d0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36    do_test wal2-6
49e0: 2e 34 2e 24 74 6e 2e 32 20 7b 20 73 65 74 20 3a  .4.$tn.2 { set :
49f0: 3a 6c 6f 63 6b 73 20 20 7d 20 24 4c 0a 7d 0a 0a  :locks  } $L.}..
4a00: 64 62 20 63 6c 6f 73 65 0a 74 76 66 73 20 64 65  db close.tvfs de
4a10: 6c 65 74 65 0a 0a 64 6f 5f 74 65 73 74 20 77 61  lete..do_test wa
4a20: 6c 32 2d 36 2e 35 2e 31 20 7b 0a 20 20 73 71 6c  l2-6.5.1 {.  sql
4a30: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
4a40: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4a50: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
4a60: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52 41 47  um = 0;.    PRAG
4a70: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
4a80: 3d 20 77 61 6c 3b 0a 20 20 20 20 50 52 41 47 4d  = wal;.    PRAGM
4a90: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
4aa0: 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20   exclusive;.    
4ab0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
4ac0: 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47 4d  a, b);.    PRAGM
4ad0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
4ae0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4af0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 49 27 2c  O t2 VALUES('I',
4b00: 20 27 49 49 27 29 3b 0a 20 20 20 20 50 52 41 47   'II');.    PRAG
4b10: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3b  MA journal_mode;
4b20: 0a 20 20 7d 0a 7d 20 7b 77 61 6c 20 65 78 63 6c  .  }.} {wal excl
4b30: 75 73 69 76 65 20 30 20 32 20 32 20 77 61 6c 7d  usive 0 2 2 wal}
4b40: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e  .do_test wal2-6.
4b50: 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.2 {.  execsql 
4b60: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  {.    PRAGMA loc
4b70: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d  king_mode = norm
4b80: 61 6c 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  al;.    INSERT I
4b90: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 49  NTO t2 VALUES('I
4ba0: 49 49 27 2c 20 27 49 56 27 29 3b 0a 20 20 20 20  II', 'IV');.    
4bb0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
4bc0: 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b  ode = exclusive;
4bd0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
4be0: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f  OM t2;.  }.} {no
4bf0: 72 6d 61 6c 20 65 78 63 6c 75 73 69 76 65 20 49  rmal exclusive I
4c00: 20 49 49 20 49 49 49 20 49 56 7d 0a 64 6f 5f 74   II III IV}.do_t
4c10: 65 73 74 20 77 61 6c 32 2d 36 2e 35 2e 33 20 7b  est wal2-6.5.3 {
4c20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
4c30: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
4c40: 6e 74 20 7d 0a 7d 20 7b 30 20 32 20 32 7d 0a 64  nt }.} {0 2 2}.d
4c50: 62 20 63 6c 6f 73 65 0a 0a 70 72 6f 63 20 6c 6f  b close..proc lo
4c60: 63 6b 5f 63 6f 6e 74 72 6f 6c 20 7b 6d 65 74 68  ck_control {meth
4c70: 6f 64 20 66 69 6c 65 6e 61 6d 65 20 68 61 6e 64  od filename hand
4c80: 6c 65 20 73 70 65 63 7d 20 7b 0a 20 20 66 6f 72  le spec} {.  for
4c90: 65 61 63 68 20 7b 73 74 61 72 74 20 6e 20 6f 70  each {start n op
4ca0: 20 74 79 70 65 7d 20 24 73 70 65 63 20 62 72 65   type} $spec bre
4cb0: 61 6b 0a 20 20 69 66 20 7b 24 6f 70 20 3d 3d 20  ak.  if {$op == 
4cc0: 22 6c 6f 63 6b 22 7d 20 7b 20 72 65 74 75 72 6e  "lock"} { return
4cd0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7d 0a   SQLITE_IOERR }.
4ce0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4cf0: 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  OK.}.do_test wal
4d00: 32 2d 36 2e 36 2e 31 20 7b 0a 20 20 74 65 73 74  2-6.6.1 {.  test
4d10: 76 66 73 20 54 0a 20 20 54 20 73 63 72 69 70 74  vfs T.  T script
4d20: 20 6c 6f 63 6b 5f 63 6f 6e 74 72 6f 6c 0a 20 20   lock_control.  
4d30: 54 20 66 69 6c 74 65 72 20 7b 7d 0a 20 20 73 71  T filter {}.  sq
4d40: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
4d50: 20 2d 76 66 73 20 54 0a 20 20 65 78 65 63 73 71   -vfs T.  execsq
4d60: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
4d70: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
4d80: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  }.  execsql { PR
4d90: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
4da0: 65 20 3d 20 65 78 63 6c 75 73 69 76 65 20 7d 0a  e = exclusive }.
4db0: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
4dc0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
4dd0: 53 28 27 56 27 2c 20 27 56 49 27 29 20 7d 0a 7d  S('V', 'VI') }.}
4de0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32   {}.do_test wal2
4df0: 2d 36 2e 36 2e 32 20 7b 0a 20 20 65 78 65 63 73  -6.6.2 {.  execs
4e00: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b  ql { PRAGMA lock
4e10: 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61  ing_mode = norma
4e20: 6c 20 7d 0a 20 20 54 20 66 69 6c 74 65 72 20 78  l }.  T filter x
4e30: 53 68 6d 4c 6f 63 6b 0a 20 20 65 78 65 63 73 71  ShmLock.  execsq
4e40: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
4e50: 74 32 20 56 41 4c 55 45 53 28 27 56 49 49 27 2c  t2 VALUES('VII',
4e60: 20 27 56 49 49 49 27 29 20 7d 0a 7d 20 7b 7d 0a   'VIII') }.} {}.
4e70: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e 36  do_test wal2-6.6
4e80: 2e 33 20 7b 0a 20 20 23 20 41 74 20 74 68 69 73  .3 {.  # At this
4e90: 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 6e 6e 65   point the conne
4ea0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 73 74 69  ction should sti
4eb0: 6c 6c 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ll be in exclusi
4ec0: 76 65 2d 6d 6f 64 65 2c 20 65 76 65 6e 0a 20 20  ve-mode, even.  
4ed0: 23 20 74 68 6f 75 67 68 20 69 74 20 74 72 69 65  # though it trie
4ee0: 64 20 74 6f 20 65 78 69 74 20 65 78 63 6c 75 73  d to exit exclus
4ef0: 69 76 65 2d 6d 6f 64 65 20 77 68 65 6e 20 63 6f  ive-mode when co
4f00: 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 49 4e 53  mmitting the INS
4f10: 45 52 54 0a 20 20 23 20 73 74 61 74 65 6d 65 6e  ERT.  # statemen
4f20: 74 20 61 62 6f 76 65 2e 20 54 6f 20 65 78 69 74  t above. To exit
4f30: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
4f40: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 74   SQLite has to t
4f50: 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ake a read-lock 
4f60: 0a 20 20 23 20 6f 6e 20 74 68 65 20 57 41 4c 20  .  # on the WAL 
4f70: 66 69 6c 65 20 75 73 69 6e 67 20 78 53 68 6d 4c  file using xShmL
4f80: 6f 63 6b 28 29 2e 20 53 69 6e 63 65 20 74 68 61  ock(). Since tha
4f90: 74 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 69  t call failed, i
4fa0: 74 20 72 65 6d 61 69 6e 73 0a 20 20 23 20 69 6e  t remains.  # in
4fb0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
4fc0: 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33 20 64  .  #.  sqlite3 d
4fd0: 62 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20  b2 test.db -vfs 
4fe0: 54 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  T.  catchsql { S
4ff0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
5000: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
5010: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
5020: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 36 2e  .do_test wal2-6.
5030: 36 2e 32 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73  6.2 {.  db2 clos
5040: 65 0a 20 20 54 20 66 69 6c 74 65 72 20 7b 7d 0a  e.  T filter {}.
5050: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
5060: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
5070: 53 28 27 49 58 27 2c 20 27 58 27 29 20 7d 0a 7d  S('IX', 'X') }.}
5080: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32   {}.do_test wal2
5090: 2d 36 2e 36 2e 34 20 7b 0a 20 20 23 20 54 68 69  -6.6.4 {.  # Thi
50a0: 73 20 74 69 6d 65 2c 20 77 65 20 68 61 76 65 20  s time, we have 
50b0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65 78 69  successfully exi
50c0: 74 65 64 20 65 78 63 6c 75 73 69 76 65 20 6d 6f  ted exclusive mo
50d0: 64 65 2e 20 53 6f 20 74 68 65 20 73 65 63 6f 6e  de. So the secon
50e0: 64 0a 20 20 23 20 63 6f 6e 6e 65 63 74 69 6f 6e  d.  # connection
50f0: 20 63 61 6e 20 72 65 61 64 20 74 68 65 20 64 61   can read the da
5100: 74 61 62 61 73 65 2e 0a 20 20 73 71 6c 69 74 65  tabase..  sqlite
5110: 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76  3 db2 test.db -v
5120: 66 73 20 54 0a 20 20 63 61 74 63 68 73 71 6c 20  fs T.  catchsql 
5130: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
5140: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 49  t2 } db2.} {0 {I
5150: 20 49 49 20 49 49 49 20 49 56 20 56 20 56 49 20   II III IV V VI 
5160: 56 49 49 20 56 49 49 49 20 49 58 20 58 7d 7d 0a  VII VIII IX X}}.
5170: 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c  .db close.db2 cl
5180: 6f 73 65 0a 54 20 64 65 6c 65 74 65 0a 0a 23 2d  ose.T delete..#-
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
51e0: 61 20 74 68 65 6f 72 79 20 61 62 6f 75 74 20 74  a theory about t
51f0: 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6c 67 6f  he checksum algo
5200: 72 69 74 68 6d 2e 20 54 68 65 6f 72 79 20 77 61  rithm. Theory wa
5210: 73 20 66 61 6c 73 65 20 61 6e 64 20 74 68 69 73  s false and this
5220: 0a 23 20 74 65 73 74 20 64 69 64 20 6e 6f 74 20  .# test did not 
5230: 70 72 6f 76 6f 6b 65 20 61 20 62 75 67 2e 0a 23  provoke a bug..#
5240: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
5250: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
5260: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
5270: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 37 2e  .do_test wal2-7.
5280: 31 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  1.1 {.  sqlite3 
5290: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
52a0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
52b0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30  A page_size = 40
52c0: 39 36 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  96;.    PRAGMA j
52d0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
52e0: 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  L;.    CREATE TA
52f0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
5300: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
5310: 73 74 2e 64 62 0a 7d 20 7b 34 30 39 36 7d 0a 64  st.db.} {4096}.d
5320: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 37 2e 31 2e  o_test wal2-7.1.
5330: 32 20 7b 0a 20 20 66 6f 72 63 65 63 6f 70 79 20  2 {.  forcecopy 
5340: 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62  test.db test2.db
5350: 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73  .  forcecopy tes
5360: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64  t.db-wal test2.d
5370: 62 2d 77 61 6c 0a 20 20 68 65 78 69 6f 5f 77 72  b-wal.  hexio_wr
5380: 69 74 65 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  ite test2.db-wal
5390: 20 34 38 20 46 46 0a 7d 20 7b 31 7d 0a 64 6f 5f   48 FF.} {1}.do_
53a0: 74 65 73 74 20 77 61 6c 32 2d 37 2e 31 2e 33 20  test wal2-7.1.3 
53b0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
53c0: 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73  test2.db.  execs
53d0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
53e0: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 64 62 32  checkpoint } db2
53f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
5400: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
5410: 65 5f 6d 61 73 74 65 72 20 7d 20 64 62 32 0a 7d  e_master } db2.}
5420: 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32   {}.db close.db2
5430: 20 63 6c 6f 73 65 0a 66 6f 72 63 65 64 65 6c 65   close.forcedele
5440: 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  te test.db test.
5450: 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a  db-wal test.db-j
5460: 6f 75 72 6e 61 6c 0a 64 6f 5f 74 65 73 74 20 77  ournal.do_test w
5470: 61 6c 32 2d 38 2e 31 2e 32 20 7b 0a 20 20 73 71  al2-8.1.2 {.  sq
5480: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
5490: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
54a0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
54b0: 75 75 6d 3d 4f 46 46 3b 0a 20 20 20 20 50 52 41  uum=OFF;.    PRA
54c0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
54d0: 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41  1024;.    PRAGMA
54e0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
54f0: 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  WAL;.    CREATE 
5500: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
5510: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5520: 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f 62 28  VALUES(zeroblob(
5530: 38 31 38 38 2a 31 30 32 30 29 29 3b 0a 20 20 20  8188*1020));.   
5540: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
5550: 28 79 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  (y);.    PRAGMA 
5560: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
5570: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
5580: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 6f 74 70      SELECT rootp
5590: 61 67 65 3e 3d 38 31 39 32 20 46 52 4f 4d 20 73  age>=8192 FROM s
55a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
55b0: 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74  RE tbl_name = 't
55c0: 32 27 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f  2';.  }.} {1}.do
55d0: 5f 74 65 73 74 20 77 61 6c 32 2d 38 2e 31 2e 33  _test wal2-8.1.3
55e0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
55f0: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
5600: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 43  size = 10;.    C
5610: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 7a  REATE TABLE t3(z
5620: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
5630: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5640: 74 33 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t3 VALUES(random
5650: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
5660: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
5670: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
5680: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 33 3b  ob(900) FROM t3;
5690: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
56a0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 68 65  TO t2 VALUES('he
56b0: 6c 6c 6f 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  llo');.      INS
56c0: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
56d0: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
56e0: 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20  0) FROM t3;.    
56f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
5700: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
5710: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 33 3b  ob(900) FROM t3;
5720: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
5730: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e  TO t3 SELECT ran
5740: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
5750: 4d 20 74 33 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t3;.      INSE
5760: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
5770: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
5780: 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20  ) FROM t3;.     
5790: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
57a0: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
57b0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a  b(900) FROM t3;.
57c0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
57d0: 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64  O t3 SELECT rand
57e0: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
57f0: 20 74 33 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43   t3;.    ROLLBAC
5800: 4b 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  K;.  }.  execsql
5810: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
5820: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 67 6f  TO t2 VALUES('go
5830: 6f 64 62 79 65 27 29 3b 0a 20 20 20 20 49 4e 53  odbye');.    INS
5840: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
5850: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
5860: 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20  0) FROM t3;.    
5870: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
5880: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
5890: 28 39 30 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20  (900) FROM t3;. 
58a0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
58b0: 77 61 6c 32 2d 38 2e 31 2e 34 20 7b 0a 20 20 73  wal2-8.1.4 {.  s
58c0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
58d0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  db.  execsql { S
58e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
58f0: 7d 0a 7d 20 7b 67 6f 6f 64 62 79 65 7d 0a 64 62  }.} {goodbye}.db
5900: 32 20 63 6c 6f 73 65 0a 64 62 20 63 6c 6f 73 65  2 close.db close
5910: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
5960: 65 73 74 20 74 68 61 74 20 65 76 65 6e 20 69 66  est that even if
5970: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 66   the checksums f
5980: 6f 72 20 62 6f 74 68 20 61 72 65 20 76 61 6c 69  or both are vali
5990: 64 2c 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  d, if the two co
59a0: 70 69 65 73 0a 23 20 6f 66 20 74 68 65 20 77 61  pies.# of the wa
59b0: 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 20 69  l-index header i
59c0: 6e 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  n the wal-index 
59d0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68  do not match, th
59e0: 65 20 63 6c 69 65 6e 74 0a 23 20 72 75 6e 73 20  e client.# runs 
59f0: 28 6f 72 20 61 74 20 6c 65 61 73 74 20 74 72 69  (or at least tri
5a00: 65 73 20 74 6f 20 72 75 6e 29 20 64 61 74 61 62  es to run) datab
5a10: 61 73 65 20 72 65 63 6f 76 65 72 79 2e 0a 23 20  ase recovery..# 
5a20: 0a 23 0a 70 72 6f 63 20 67 65 74 5f 6e 61 6d 65  .#.proc get_name
5a30: 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b   {method args} {
5a40: 20 73 65 74 20 3a 3a 66 69 6c 65 6e 61 6d 65 20   set ::filename 
5a50: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d  [lindex $args 0]
5a60: 20 3b 20 74 76 66 73 20 66 69 6c 74 65 72 20 7b   ; tvfs filter {
5a70: 7d 20 7d 0a 74 65 73 74 76 66 73 20 74 76 66 73  } }.testvfs tvfs
5a80: 0a 74 76 66 73 20 73 63 72 69 70 74 20 67 65 74  .tvfs script get
5a90: 5f 6e 61 6d 65 0a 74 76 66 73 20 66 69 6c 74 65  _name.tvfs filte
5aa0: 72 20 78 53 68 6d 4f 70 65 6e 0a 0a 66 6f 72 63  r xShmOpen..forc
5ab0: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20  edelete test.db 
5ac0: 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74  test.db-wal test
5ad0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 64 6f 5f 74  .db-journal.do_t
5ae0: 65 73 74 20 77 61 6c 32 2d 39 2e 31 20 7b 0a 20  est wal2-9.1 {. 
5af0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
5b00: 2e 64 62 20 2d 76 66 73 20 74 76 66 73 0a 20 20  .db -vfs tvfs.  
5b10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
5b20: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
5b30: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45  e = WAL;.    CRE
5b40: 41 54 45 20 54 41 42 4c 45 20 78 28 79 29 3b 0a  ATE TABLE x(y);.
5b50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5b60: 78 20 56 41 4c 55 45 53 28 27 42 61 72 74 6f 6e  x VALUES('Barton
5b70: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
5b80: 4e 54 4f 20 78 20 56 41 4c 55 45 53 28 27 44 65  NTO x VALUES('De
5b90: 61 6b 69 6e 27 29 3b 0a 20 20 7d 0a 0a 20 20 23  akin');.  }..  #
5ba0: 20 53 65 74 20 24 77 69 68 28 31 29 20 74 6f 20   Set $wih(1) to 
5bb0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
5bc0: 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65  the wal-index he
5bd0: 61 64 65 72 20 61 66 74 65 72 0a 20 20 23 20 74  ader after.  # t
5be0: 68 65 20 66 72 61 6d 65 73 20 61 73 73 6f 63 69  he frames associ
5bf0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
5c00: 72 73 74 20 74 77 6f 20 72 6f 77 73 20 69 6e 20  rst two rows in 
5c10: 74 61 62 6c 65 20 27 78 27 20 68 61 76 65 0a 20  table 'x' have. 
5c20: 20 23 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64   # been inserted
5c30: 2e 20 54 68 65 6e 20 69 6e 73 65 72 74 20 6f 6e  . Then insert on
5c40: 65 20 6d 6f 72 65 20 72 6f 77 20 61 6e 64 20 73  e more row and s
5c50: 65 74 20 24 77 69 68 28 32 29 0a 20 20 23 20 74  et $wih(2).  # t
5c60: 6f 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  o the new value 
5c70: 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  of the wal-index
5c80: 20 68 65 61 64 65 72 2e 0a 20 20 23 0a 20 20 23   header..  #.  #
5c90: 20 49 66 20 74 68 65 20 24 77 69 68 28 31 29 20   If the $wih(1) 
5ca0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5cb0: 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 62 65  the wal-index be
5cc0: 66 6f 72 65 20 72 75 6e 6e 69 6e 67 0a 20 20 23  fore running.  #
5cd0: 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
5ce0: 6e 2c 20 74 68 65 20 63 6c 69 65 6e 74 20 77 69  n, the client wi
5cf0: 6c 6c 20 73 65 65 20 6f 6e 6c 79 20 74 68 65 20  ll see only the 
5d00: 66 69 72 73 74 20 74 77 6f 20 72 6f 77 73 2e 20  first two rows. 
5d10: 49 66 0a 20 20 23 20 24 77 69 68 28 32 29 20 69  If.  # $wih(2) i
5d20: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
5d30: 68 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 74 68  he wal-index, th
5d40: 65 20 63 6c 69 65 6e 74 20 77 69 6c 6c 20 73 65  e client will se
5d50: 65 0a 20 20 23 20 74 68 72 65 65 20 72 6f 77 73  e.  # three rows
5d60: 2e 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20  . If an invalid 
5d70: 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
5d80: 6e 20 69 6e 74 6f 20 74 68 65 20 77 61 6c 2d 69  n into the wal-i
5d90: 6e 64 65 78 2c 20 74 68 65 6e 0a 20 20 23 20 74  ndex, then.  # t
5da0: 68 65 20 63 6c 69 65 6e 74 20 77 69 6c 6c 20 72  he client will r
5db0: 75 6e 20 72 65 63 6f 76 65 72 79 20 61 6e 64 20  un recovery and 
5dc0: 73 65 65 20 74 68 72 65 65 20 72 6f 77 73 2e 0a  see three rows..
5dd0: 20 20 23 0a 20 20 73 65 74 20 77 69 68 28 31 29    #.  set wih(1)
5de0: 20 5b 73 65 74 5f 74 76 66 73 5f 68 64 72 20 24   [set_tvfs_hdr $
5df0: 3a 3a 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 65 78  ::filename].  ex
5e00: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
5e10: 4e 54 4f 20 78 20 56 41 4c 55 45 53 28 27 57 61  NTO x VALUES('Wa
5e20: 74 73 6f 6e 27 29 20 7d 0a 20 20 73 65 74 20 77  tson') }.  set w
5e30: 69 68 28 32 29 20 5b 73 65 74 5f 74 76 66 73 5f  ih(2) [set_tvfs_
5e40: 68 64 72 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 5d  hdr $::filename]
5e50: 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  ..  sqlite3 db2 
5e60: 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 66  test.db -vfs tvf
5e70: 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  s.  execsql { SE
5e80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 20 7d 20  LECT * FROM x } 
5e90: 64 62 32 0a 7d 20 7b 42 61 72 74 6f 6e 20 44 65  db2.} {Barton De
5ea0: 61 6b 69 6e 20 57 61 74 73 6f 6e 7d 0a 0a 66 6f  akin Watson}..fo
5eb0: 72 65 61 63 68 20 7b 74 6e 20 68 64 72 31 20 68  reach {tn hdr1 h
5ec0: 64 72 32 20 72 65 73 7d 20 5b 6c 69 73 74 20 20  dr2 res} [list  
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 33 20            \.  3 
5f00: 20 24 77 69 68 28 31 29 20 20 20 20 20 20 20 20   $wih(1)        
5f10: 20 20 20 20 20 20 20 20 24 77 69 68 28 31 29 20          $wih(1) 
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5f30: 42 61 72 74 6f 6e 20 44 65 61 6b 69 6e 7d 20 20  Barton Deakin}  
5f40: 20 20 20 20 20 20 20 20 5c 0a 20 20 34 20 20 24          \.  4  $
5f50: 77 69 68 28 31 29 20 20 20 20 20 20 20 20 20 20  wih(1)          
5f60: 20 20 20 20 20 20 24 77 69 68 28 32 29 20 20 20        $wih(2)   
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 42 61               {Ba
5f80: 72 74 6f 6e 20 44 65 61 6b 69 6e 20 57 61 74 73  rton Deakin Wats
5f90: 6f 6e 7d 20 20 20 5c 0a 20 20 35 20 20 24 77 69  on}   \.  5  $wi
5fa0: 68 28 32 29 20 20 20 20 20 20 20 20 20 20 20 20  h(2)            
5fb0: 20 20 20 20 24 77 69 68 28 31 29 20 20 20 20 20      $wih(1)     
5fc0: 20 20 20 20 20 20 20 20 20 20 20 7b 42 61 72 74             {Bart
5fd0: 6f 6e 20 44 65 61 6b 69 6e 20 57 61 74 73 6f 6e  on Deakin Watson
5fe0: 7d 20 20 20 5c 0a 20 20 36 20 20 24 77 69 68 28  }   \.  6  $wih(
5ff0: 32 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2)              
6000: 20 20 24 77 69 68 28 32 29 20 20 20 20 20 20 20    $wih(2)       
6010: 20 20 20 20 20 20 20 20 20 7b 42 61 72 74 6f 6e           {Barton
6020: 20 44 65 61 6b 69 6e 20 57 61 74 73 6f 6e 7d 20   Deakin Watson} 
6030: 20 20 5c 0a 20 20 37 20 20 24 77 69 68 28 31 29    \.  7  $wih(1)
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 24 77 69 68 28 31 29 20 20 20 20 20 20 20 20 20  $wih(1)         
6060: 20 20 20 20 20 20 20 7b 42 61 72 74 6f 6e 20 44         {Barton D
6070: 65 61 6b 69 6e 7d 20 20 20 20 20 20 20 20 20 20  eakin}          
6080: 5c 0a 20 20 38 20 20 7b 30 20 30 20 30 20 30 20  \.  8  {0 0 0 0 
6090: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 7d  0 0 0 0 0 0 0 0}
60a0: 20 7b 30 20 30 20 30 20 30 20 30 20 30 20 30 20   {0 0 0 0 0 0 0 
60b0: 30 20 30 20 30 20 30 20 30 7d 20 7b 42 61 72 74  0 0 0 0 0} {Bart
60c0: 6f 6e 20 44 65 61 6b 69 6e 20 57 61 74 73 6f 6e  on Deakin Watson
60d0: 7d 0a 5d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  }.] {.  do_test 
60e0: 77 61 6c 32 2d 39 2e 24 74 6e 20 7b 0a 20 20 20  wal2-9.$tn {.   
60f0: 20 73 65 74 5f 74 76 66 73 5f 68 64 72 20 24 3a   set_tvfs_hdr $:
6100: 3a 66 69 6c 65 6e 61 6d 65 20 24 68 64 72 31 20  :filename $hdr1 
6110: 24 68 64 72 32 0a 20 20 20 20 65 78 65 63 73 71  $hdr2.    execsq
6120: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
6130: 4d 20 78 20 7d 20 64 62 32 0a 20 20 7d 20 24 72  M x } db2.  } $r
6140: 65 73 0a 7d 0a 0a 64 62 32 20 63 6c 6f 73 65 0a  es.}..db2 close.
6150: 64 62 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d  db close..#-----
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61a0: 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63  ----.# This bloc
61b0: 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 77 61 6c  k of tests - wal
61c0: 32 2d 31 30 2e 2a 20 2d 20 66 6f 63 75 73 20 6f  2-10.* - focus o
61d0: 6e 20 74 68 65 20 6c 69 62 72 61 72 69 65 73 20  n the libraries 
61e0: 72 65 73 70 6f 6e 73 65 20 74 6f 0a 23 20 6e 65  response to.# ne
61f0: 77 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  w versions of th
6200: 65 20 77 61 6c 20 6f 72 20 77 61 6c 2d 69 6e 64  e wal or wal-ind
6210: 65 78 20 66 6f 72 6d 61 74 73 2e 20 0a 23 0a 23  ex formats. .#.#
6220: 20 20 20 77 61 6c 32 2d 31 30 2e 31 2e 2a 3a 20     wal2-10.1.*: 
6230: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 6c 69  Test that the li
6240: 62 72 61 72 79 20 72 65 66 75 73 65 73 20 74 6f  brary refuses to
6250: 20 22 72 65 63 6f 76 65 72 22 20 61 20 6e 65 77   "recover" a new
6260: 20 57 41 4c 20 0a 23 20 20 20 20 20 20 20 20 20   WAL .#         
6270: 20 20 20 20 20 20 20 66 6f 72 6d 61 74 2e 0a 23         format..#
6280: 0a 23 20 20 20 77 61 6c 32 2d 31 30 2e 32 2e 2a  .#   wal2-10.2.*
6290: 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  : Test that the 
62a0: 6c 69 62 72 61 72 79 20 72 65 66 75 73 65 73 20  library refuses 
62b0: 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
62c0: 20 61 20 64 61 74 61 62 61 73 65 0a 23 20 20 20   a database.#   
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
62e0: 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 76 65  the wal-index ve
62f0: 72 73 69 6f 6e 20 69 73 20 6e 65 77 65 72 20 74  rsion is newer t
6300: 68 61 6e 20 69 74 20 75 6e 64 65 72 73 74 61 6e  han it understan
6310: 64 73 2e 0a 23 0a 23 20 41 74 20 74 69 6d 65 20  ds..#.# At time 
6320: 6f 66 20 77 72 69 74 69 6e 67 2c 20 74 68 65 20  of writing, the 
6330: 6f 6e 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  only versions of
6340: 20 74 68 65 20 77 61 6c 20 61 6e 64 20 77 61 6c   the wal and wal
6350: 2d 69 6e 64 65 78 20 66 6f 72 6d 61 74 73 0a 23  -index formats.#
6360: 20 74 68 61 74 20 65 78 69 73 74 20 61 72 65 20   that exist are 
6370: 76 65 72 73 69 6f 6e 73 20 33 30 30 37 30 30 30  versions 3007000
6380: 20 28 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20   (corresponding 
6390: 74 6f 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  to SQLite versio
63a0: 6e 20 33 2e 37 2e 30 2c 0a 23 20 74 68 65 20 66  n 3.7.0,.# the f
63b0: 69 72 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  irst version of 
63c0: 53 51 4c 69 74 65 20 74 6f 20 66 65 61 74 75 72  SQLite to featur
63d0: 65 20 77 61 6c 20 6d 6f 64 65 29 2e 0a 23 0a 64  e wal mode)..#.d
63e0: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 30 2e 31  o_test wal2-10.1
63f0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
6400: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
6410: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
6420: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
6430: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
6440: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
6450: 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47  (a, b);.    PRAG
6460: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
6470: 74 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  t;.    INSERT IN
6480: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
6490: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
64a0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
64b0: 20 34 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74   4);.  }.  fault
64c0: 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f  sim_save_and_clo
64d0: 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  se.} {}.do_test 
64e0: 77 61 6c 32 2d 31 30 2e 31 2e 32 20 7b 0a 20 20  wal2-10.1.2 {.  
64f0: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
6500: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
6510: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
6520: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20   FROM t1 }.} {1 
6530: 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77  2 3 4}.do_test w
6540: 61 6c 32 2d 31 30 2e 31 2e 33 20 7b 0a 20 20 66  al2-10.1.3 {.  f
6550: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
6560: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 65 74  and_reopen.  set
6570: 20 68 64 72 20 5b 77 61 6c 5f 73 65 74 5f 77 61   hdr [wal_set_wa
6580: 6c 68 64 72 20 74 65 73 74 2e 64 62 2d 77 61 6c  lhdr test.db-wal
6590: 5d 0a 20 20 6c 69 6e 64 65 78 20 24 68 64 72 20  ].  lindex $hdr 
65a0: 31 0a 7d 20 7b 33 30 30 37 30 30 30 7d 0a 64 6f  1.} {3007000}.do
65b0: 5f 74 65 73 74 20 77 61 6c 32 2d 31 30 2e 31 2e  _test wal2-10.1.
65c0: 34 20 7b 0a 20 20 6c 73 65 74 20 68 64 72 20 31  4 {.  lset hdr 1
65d0: 20 33 30 30 37 30 30 31 0a 20 20 77 61 6c 5f 73   3007001.  wal_s
65e0: 65 74 5f 77 61 6c 68 64 72 20 74 65 73 74 2e 64  et_walhdr test.d
65f0: 62 2d 77 61 6c 20 24 68 64 72 0a 20 20 63 61 74  b-wal $hdr.  cat
6600: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
6610: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20   FROM t1 }.} {1 
6620: 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  {unable to open 
6630: 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a  database file}}.
6640: 0a 74 65 73 74 76 66 73 20 74 76 66 73 20 2d 64  .testvfs tvfs -d
6650: 65 66 61 75 6c 74 20 31 0a 64 6f 5f 74 65 73 74  efault 1.do_test
6660: 20 77 61 6c 32 2d 31 30 2e 32 2e 31 20 7b 0a 20   wal2-10.2.1 {. 
6670: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
6680: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
6690: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
66a0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
66b0: 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20   2 3 4}.do_test 
66c0: 77 61 6c 32 2d 31 30 2e 32 2e 32 20 7b 20 0a 20  wal2-10.2.2 { . 
66d0: 20 73 65 74 20 68 64 72 20 5b 73 65 74 5f 74 76   set hdr [set_tv
66e0: 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e 61  fs_hdr $::filena
66f0: 6d 65 5d 20 0a 20 20 6c 69 6e 64 65 78 20 24 68  me] .  lindex $h
6700: 64 72 20 30 20 0a 7d 20 7b 33 30 30 37 30 30 30  dr 0 .} {3007000
6710: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31  }.do_test wal2-1
6720: 30 2e 32 2e 33 20 7b 20 0a 20 20 6c 73 65 74 20  0.2.3 { .  lset 
6730: 68 64 72 20 30 20 33 30 30 37 30 30 31 0a 20 20  hdr 0 3007001.  
6740: 77 61 6c 5f 66 69 78 5f 77 61 6c 69 6e 64 65 78  wal_fix_walindex
6750: 5f 63 6b 73 75 6d 20 68 64 72 20 0a 20 20 73 65  _cksum hdr .  se
6760: 74 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a 66 69  t_tvfs_hdr $::fi
6770: 6c 65 6e 61 6d 65 20 24 68 64 72 0a 20 20 63 61  lename $hdr.  ca
6780: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
6790: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
67a0: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
67b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
67c0: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 66 73 20 64  .db close.tvfs d
67d0: 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  elete..#--------
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6820: 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  -.# This block o
6830: 66 20 74 65 73 74 73 20 2d 20 77 61 6c 32 2d 31  f tests - wal2-1
6840: 31 2e 2a 20 2d 20 74 65 73 74 73 20 74 68 61 74  1.* - tests that
6850: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
6860: 62 6c 65 20 74 6f 20 70 75 74 0a 23 20 74 68 65  ble to put.# the
6870: 20 6c 69 62 72 61 72 79 20 69 6e 74 6f 20 61 6e   library into an
6880: 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20 62   infinite loop b
6890: 79 20 70 72 65 73 65 6e 74 69 6e 67 20 69 74 20  y presenting it 
68a0: 77 69 74 68 20 61 20 63 6f 72 72 75 70 74 0a 23  with a corrupt.#
68b0: 20 68 61 73 68 20 74 61 62 6c 65 20 28 6f 6e 65   hash table (one
68c0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 74 6f   that appears to
68d0: 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 6e 67 6c   contain a singl
68e0: 65 20 63 68 61 69 6e 20 6f 66 20 69 6e 66 69 6e  e chain of infin
68f0: 69 74 65 20 0a 23 20 6c 65 6e 67 74 68 29 2e 0a  ite .# length)..
6900: 23 0a 23 20 20 20 77 61 6c 32 2d 31 31 2e 31 2e  #.#   wal2-11.1.
6910: 2a 3a 20 57 68 69 6c 65 20 72 65 61 64 69 6e 67  *: While reading
6920: 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 2e   the hash-table.
6930: 0a 23 0a 23 20 20 20 77 61 6c 32 2d 31 31 2e 32  .#.#   wal2-11.2
6940: 2e 2a 3a 20 57 68 69 6c 65 20 77 72 69 74 69 6e  .*: While writin
6950: 67 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  g the hash-table
6960: 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 66 73  ..#.testvfs tvfs
6970: 20 2d 64 65 66 61 75 6c 74 20 31 0a 64 6f 5f 74   -default 1.do_t
6980: 65 73 74 20 77 61 6c 32 2d 31 31 2e 30 20 7b 0a  est wal2-11.0 {.
6990: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
69a0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
69b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
69c0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
69d0: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41   = WAL;.    CREA
69e0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
69f0: 2c 20 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , c);.    INSERT
6a00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6a10: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e  1, 2, 3);.    IN
6a20: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6a30: 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20  UES(4, 5, 6);.  
6a40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6a50: 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29   VALUES(7, 8, 9)
6a60: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
6a70: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 77  ROM t1;.  }.} {w
6a80: 61 6c 20 31 20 32 20 33 20 34 20 35 20 36 20 37  al 1 2 3 4 5 6 7
6a90: 20 38 20 39 7d 0a 0a 64 6f 5f 74 65 73 74 20 77   8 9}..do_test w
6aa0: 61 6c 32 2d 31 31 2e 31 2e 31 20 7b 0a 20 20 73  al2-11.1.1 {.  s
6ab0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
6ac0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  db.  execsql { S
6ad0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
6ae0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 20  sqlite_master } 
6af0: 64 62 32 0a 7d 20 7b 74 31 7d 0a 0a 69 66 20 7b  db2.} {t1}..if {
6b00: 24 3a 3a 74 63 6c 5f 76 65 72 73 69 6f 6e 3e 3d  $::tcl_version>=
6b10: 38 2e 35 7d 20 7b 0a 20 20 23 20 53 65 74 20 61  8.5} {.  # Set a
6b20: 6c 6c 20 7a 65 72 6f 65 64 20 73 6c 6f 74 73 20  ll zeroed slots 
6b30: 69 6e 20 74 68 65 20 66 69 72 73 74 20 68 61 73  in the first has
6b40: 68 20 74 61 62 6c 65 20 74 6f 20 69 6e 76 61 6c  h table to inval
6b50: 69 64 20 76 61 6c 75 65 73 2e 0a 20 20 23 0a 20  id values..  #. 
6b60: 20 73 65 74 20 62 6c 6f 62 20 5b 73 74 72 69 6e   set blob [strin
6b70: 67 20 72 61 6e 67 65 20 5b 74 76 66 73 20 73 68  g range [tvfs sh
6b80: 6d 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 5d 20 30  m $::filename] 0
6b90: 20 31 36 33 38 33 5d 0a 20 20 73 65 74 20 49 20   16383].  set I 
6ba0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 74  [string range [t
6bb0: 76 66 73 20 73 68 6d 20 24 3a 3a 66 69 6c 65 6e  vfs shm $::filen
6bc0: 61 6d 65 5d 20 31 36 33 38 34 20 65 6e 64 5d 0a  ame] 16384 end].
6bd0: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 49    binary scan $I
6be0: 20 74 2a 20 4c 0a 20 20 73 65 74 20 49 20 5b 6c   t* L.  set I [l
6bf0: 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 68 20 70  ist].  foreach p
6c00: 20 24 4c 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e   $L {.    lappen
6c10: 64 20 49 20 5b 65 78 70 72 20 24 70 20 3f 20 24  d I [expr $p ? $
6c20: 70 20 3a 20 34 30 30 5d 0a 20 20 7d 0a 20 20 61  p : 400].  }.  a
6c30: 70 70 65 6e 64 20 62 6c 6f 62 20 5b 62 69 6e 61  ppend blob [bina
6c40: 72 79 20 66 6f 72 6d 61 74 20 74 2a 20 24 49 5d  ry format t* $I]
6c50: 0a 20 20 74 76 66 73 20 73 68 6d 20 24 3a 3a 66  .  tvfs shm $::f
6c60: 69 6c 65 6e 61 6d 65 20 24 62 6c 6f 62 0a 20 20  ilename $blob.  
6c70: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 31 2e  do_test wal2-11.
6c80: 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  2 {.    catchsql
6c90: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
6ca0: 31 20 56 41 4c 55 45 53 28 31 30 2c 20 31 31 2c  1 VALUES(10, 11,
6cb0: 20 31 32 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64   12) }.  } {1 {d
6cc0: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
6cd0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
6ce0: 7d 0a 20 20 0a 20 20 23 20 46 69 6c 6c 20 75 70  }.  .  # Fill up
6cf0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
6d00: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  on the first pag
6d10: 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f  e of shared memo
6d20: 72 79 20 77 69 74 68 20 30 78 35 35 20 62 79 74  ry with 0x55 byt
6d30: 65 73 2e 0a 20 20 23 0a 20 20 73 65 74 20 62 6c  es..  #.  set bl
6d40: 6f 62 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  ob [string range
6d50: 20 5b 74 76 66 73 20 73 68 6d 20 24 3a 3a 66 69   [tvfs shm $::fi
6d60: 6c 65 6e 61 6d 65 5d 20 30 20 31 36 33 38 33 5d  lename] 0 16383]
6d70: 0a 20 20 61 70 70 65 6e 64 20 62 6c 6f 62 20 5b  .  append blob [
6d80: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 5b 62  string repeat [b
6d90: 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 20 35  inary format c 5
6da0: 35 5d 20 31 36 33 38 34 5d 0a 20 20 74 76 66 73  5] 16384].  tvfs
6db0: 20 73 68 6d 20 24 3a 3a 66 69 6c 65 6e 61 6d 65   shm $::filename
6dc0: 20 24 62 6c 6f 62 0a 20 20 64 6f 5f 74 65 73 74   $blob.  do_test
6dd0: 20 77 61 6c 32 2d 31 31 2e 33 20 7b 0a 20 20 20   wal2-11.3 {.   
6de0: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
6df0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64  CT * FROM t1 } d
6e00: 62 32 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62  b2.  } {1 {datab
6e10: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
6e20: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 7d 0a  s malformed}}.}.
6e30: 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c  .db close.db2 cl
6e40: 6f 73 65 0a 74 76 66 73 20 64 65 6c 65 74 65 0a  ose.tvfs delete.
6e50: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66  -----------.# If
6ea0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73   a connection is
6eb0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
6ec0: 61 74 65 20 61 20 57 41 4c 20 6f 72 20 53 48 4d  ate a WAL or SHM
6ed0: 20 66 69 6c 65 2c 20 69 74 20 63 72 65 61 74 65   file, it create
6ee0: 73 20 0a 23 20 74 68 65 20 6e 65 77 20 66 69 6c  s .# the new fil
6ef0: 65 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  es with the same
6f00: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 65 72   file-system per
6f10: 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 20  missions as the 
6f20: 64 61 74 61 62 61 73 65 20 0a 23 20 66 69 6c 65  database .# file
6f30: 20 69 74 73 65 6c 66 2e 20 54 65 73 74 20 74 68   itself. Test th
6f40: 69 73 2e 0a 23 0a 69 66 20 7b 24 3a 3a 74 63 6c  is..#.if {$::tcl
6f50: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
6f60: 72 6d 29 20 3d 3d 20 22 75 6e 69 78 22 7d 20 7b  rm) == "unix"} {
6f70: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
6f80: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
6f90: 23 20 43 68 61 6e 67 65 64 20 6f 6e 20 32 30 31  # Changed on 201
6fa0: 32 2d 30 32 2d 31 33 3a 20 75 6d 61 73 6b 20 69  2-02-13: umask i
6fb0: 73 20 64 65 6c 69 62 65 72 61 74 65 6c 79 20 69  s deliberately i
6fc0: 67 6e 6f 72 65 64 20 66 6f 72 20 2d 77 61 6c 20  gnored for -wal 
6fd0: 66 69 6c 65 73 2e 0a 20 20 23 73 65 74 20 75 6d  files..  #set um
6fe0: 61 73 6b 20 5b 65 78 65 63 20 2f 62 69 6e 2f 73  ask [exec /bin/s
6ff0: 68 20 2d 63 20 75 6d 61 73 6b 5d 0a 20 20 73 65  h -c umask].  se
7000: 74 20 75 6d 61 73 6b 20 30 0a 20 20 0a 0a 20 20  t umask 0.  ..  
7010: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 32 2e  do_test wal2-12.
7020: 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  1 {.    sqlite3 
7030: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  db test.db.    e
7040: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
7050: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 78 28  CREATE TABLE tx(
7060: 79 2c 20 7a 29 3b 0a 20 20 20 20 20 20 50 52 41  y, z);.      PRA
7070: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
7080: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 7d 0a 20 20   = WAL;.    }.  
7090: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 6c    db close.    l
70a0: 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73  ist [file exists
70b0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 5b 66   test.db-wal] [f
70c0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
70d0: 64 62 2d 73 68 6d 5d 0a 20 20 7d 20 7b 30 20 30  db-shm].  } {0 0
70e0: 7d 0a 20 20 0a 20 20 66 6f 72 65 61 63 68 20 7b  }.  .  foreach {
70f0: 74 6e 20 70 65 72 6d 69 73 73 69 6f 6e 73 7d 20  tn permissions} 
7100: 7b 0a 20 20 20 31 20 30 30 36 34 34 0a 20 20 20  {.   1 00644.   
7110: 32 20 30 30 36 36 36 0a 20 20 20 33 20 30 30 36  2 00666.   3 006
7120: 30 30 0a 20 20 20 34 20 30 30 37 35 35 0a 20 20  00.   4 00755.  
7130: 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 66 66 65  } {.    set effe
7140: 63 74 69 76 65 20 5b 66 6f 72 6d 61 74 20 25 2e  ctive [format %.
7150: 35 6f 20 5b 65 78 70 72 20 24 70 65 72 6d 69 73  5o [expr $permis
7160: 73 69 6f 6e 73 20 26 20 7e 24 75 6d 61 73 6b 5d  sions & ~$umask]
7170: 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61  ].    do_test wa
7180: 6c 32 2d 31 32 2e 32 2e 24 74 6e 2e 31 20 7b 0a  l2-12.2.$tn.1 {.
7190: 20 20 20 20 20 20 66 69 6c 65 20 61 74 74 72 69        file attri
71a0: 62 75 74 65 73 20 74 65 73 74 2e 64 62 20 2d 70  butes test.db -p
71b0: 65 72 6d 69 73 73 69 6f 6e 73 20 24 70 65 72 6d  ermissions $perm
71c0: 69 73 73 69 6f 6e 73 0a 20 20 20 20 20 20 66 69  issions.      fi
71d0: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
71e0: 73 74 2e 64 62 20 2d 70 65 72 6d 69 73 73 69 6f  st.db -permissio
71f0: 6e 73 0a 20 20 20 20 7d 20 24 70 65 72 6d 69 73  ns.    } $permis
7200: 73 69 6f 6e 73 0a 20 20 20 20 64 6f 5f 74 65 73  sions.    do_tes
7210: 74 20 77 61 6c 32 2d 31 32 2e 32 2e 24 74 6e 2e  t wal2-12.2.$tn.
7220: 32 20 7b 0a 20 20 20 20 20 20 6c 69 73 74 20 5b  2 {.      list [
7230: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
7240: 2e 64 62 2d 77 61 6c 5d 20 5b 66 69 6c 65 20 65  .db-wal] [file e
7250: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 73 68  xists test.db-sh
7260: 6d 5d 0a 20 20 20 20 7d 20 7b 30 20 30 7d 0a 20  m].    } {0 0}. 
7270: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d     do_test wal2-
7280: 31 32 2e 32 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  12.2.$tn.3 {.   
7290: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
72a0: 73 74 2e 64 62 0a 20 20 20 20 20 20 65 78 65 63  st.db.      exec
72b0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
72c0: 4f 20 74 78 20 44 45 46 41 55 4c 54 20 56 41 4c  O tx DEFAULT VAL
72d0: 55 45 53 20 7d 0a 20 20 20 20 20 20 6c 69 73 74  UES }.      list
72e0: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65   [file exists te
72f0: 73 74 2e 64 62 2d 77 61 6c 5d 20 5b 66 69 6c 65  st.db-wal] [file
7300: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
7310: 73 68 6d 5d 0a 20 20 20 20 7d 20 7b 31 20 31 7d  shm].    } {1 1}
7320: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
7330: 32 2d 31 32 2e 32 2e 24 74 6e 2e 34 20 7b 0a 20  2-12.2.$tn.4 {. 
7340: 20 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20       list [file 
7350: 61 74 74 72 20 74 65 73 74 2e 64 62 2d 77 61 6c  attr test.db-wal
7360: 20 2d 70 65 72 6d 5d 20 5b 66 69 6c 65 20 61 74   -perm] [file at
7370: 74 72 20 74 65 73 74 2e 64 62 2d 73 68 6d 20 2d  tr test.db-shm -
7380: 70 65 72 6d 5d 0a 20 20 20 20 7d 20 5b 6c 69 73  perm].    } [lis
7390: 74 20 24 65 66 66 65 63 74 69 76 65 20 24 65 66  t $effective $ef
73a0: 66 65 63 74 69 76 65 5d 0a 20 20 20 20 64 6f 5f  fective].    do_
73b0: 74 65 73 74 20 77 61 6c 32 2d 31 32 2e 32 2e 24  test wal2-12.2.$
73c0: 74 6e 2e 35 20 7b 0a 20 20 20 20 20 20 64 62 20  tn.5 {.      db 
73d0: 63 6c 6f 73 65 0a 20 20 20 20 20 20 6c 69 73 74  close.      list
73e0: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65   [file exists te
73f0: 73 74 2e 64 62 2d 77 61 6c 5d 20 5b 66 69 6c 65  st.db-wal] [file
7400: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
7410: 73 68 6d 5d 0a 20 20 20 20 7d 20 7b 30 20 30 7d  shm].    } {0 0}
7420: 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .  }.}..#-------
7430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7470: 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 6c 69  --.# Test the li
7480: 62 72 61 72 69 65 73 20 72 65 73 70 6f 6e 73 65  braries response
7490: 20 74 6f 20 64 69 73 63 6f 76 65 72 69 6e 67 20   to discovering 
74a0: 74 68 61 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  that one or more
74b0: 20 6f 66 20 74 68 65 0a 23 20 64 61 74 61 62 61   of the.# databa
74c0: 73 65 2c 20 77 61 6c 20 6f 72 20 73 68 6d 20 66  se, wal or shm f
74d0: 69 6c 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f  iles cannot be o
74e0: 70 65 6e 65 64 2c 20 6f 72 20 63 61 6e 20 6f 6e  pened, or can on
74f0: 6c 79 20 62 65 20 6f 70 65 6e 65 64 0a 23 20 72  ly be opened.# r
7500: 65 61 64 2d 6f 6e 6c 79 2e 0a 23 0a 69 66 20 7b  ead-only..#.if {
7510: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
7520: 70 6c 61 74 66 6f 72 6d 29 20 3d 3d 20 22 75 6e  platform) == "un
7530: 69 78 22 7d 20 7b 0a 20 20 70 72 6f 63 20 70 65  ix"} {.  proc pe
7540: 72 6d 20 7b 7d 20 7b 0a 20 20 20 20 73 65 74 20  rm {} {.    set 
7550: 4c 20 5b 6c 69 73 74 5d 0a 20 20 20 20 66 6f 72  L [list].    for
7560: 65 61 63 68 20 66 20 7b 74 65 73 74 2e 64 62 20  each f {test.db 
7570: 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74  test.db-wal test
7580: 2e 64 62 2d 73 68 6d 7d 20 7b 0a 20 20 20 20 20  .db-shm} {.     
7590: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
75a0: 73 20 24 66 5d 7d 20 7b 0a 20 20 20 20 20 20 20  s $f]} {.       
75b0: 20 6c 61 70 70 65 6e 64 20 4c 20 5b 66 69 6c 65   lappend L [file
75c0: 20 61 74 74 72 20 24 66 20 2d 70 65 72 6d 5d 0a   attr $f -perm].
75d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
75e0: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 4c         lappend L
75f0: 20 7b 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   {}.      }.    
7600: 7d 0a 20 20 20 20 73 65 74 20 4c 0a 20 20 7d 0a  }.    set L.  }.
7610: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
7620: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
7630: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
7640: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
7650: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45  e = WAL;.    CRE
7660: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
7670: 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  b);.    PRAGMA w
7680: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20  al_checkpoint;. 
7690: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
76a0: 31 20 56 41 4c 55 45 53 28 27 33 2e 31 34 27 2c  1 VALUES('3.14',
76b0: 20 27 32 2e 37 32 27 29 3b 0a 20 20 7d 0a 20 20   '2.72');.  }.  
76c0: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 33 2e  do_test wal2-13.
76d0: 31 2e 31 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b  1.1 {.    list [
76e0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
76f0: 2e 64 62 2d 73 68 6d 5d 20 5b 66 69 6c 65 20 65  .db-shm] [file e
7700: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61  xists test.db-wa
7710: 6c 5d 0a 20 20 7d 20 7b 31 20 31 7d 0a 20 20 66  l].  } {1 1}.  f
7720: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
7730: 5f 63 6c 6f 73 65 0a 0a 20 20 66 6f 72 65 61 63  _close..  foreac
7740: 68 20 7b 74 6e 20 64 62 5f 70 65 72 6d 20 77 61  h {tn db_perm wa
7750: 6c 5f 70 65 72 6d 20 73 68 6d 5f 70 65 72 6d 20  l_perm shm_perm 
7760: 63 61 6e 5f 6f 70 65 6e 20 63 61 6e 5f 72 65 61  can_open can_rea
7770: 64 20 63 61 6e 5f 77 72 69 74 65 7d 20 7b 0a 20  d can_write} {. 
7780: 20 20 20 32 20 20 20 30 30 36 34 34 20 20 20 30     2   00644   0
7790: 30 36 34 34 20 20 20 30 30 36 34 34 20 20 20 31  0644   00644   1
77a0: 20 20 20 31 20 20 20 31 0a 20 20 20 20 33 20 20     1   1.    3  
77b0: 20 30 30 36 34 34 20 20 20 30 30 34 30 30 20 20   00644   00400  
77c0: 20 30 30 36 34 34 20 20 20 31 20 20 20 31 20 20   00644   1   1  
77d0: 20 30 0a 20 20 20 20 34 20 20 20 30 30 36 34 34   0.    4   00644
77e0: 20 20 20 30 30 36 34 34 20 20 20 30 30 34 30 30     00644   00400
77f0: 20 20 20 31 20 20 20 30 20 20 20 30 0a 20 20 20     1   0   0.   
7800: 20 35 20 20 20 30 30 34 30 30 20 20 20 30 30 36   5   00400   006
7810: 34 34 20 20 20 30 30 36 34 34 20 20 20 31 20 20  44   00644   1  
7820: 20 31 20 20 20 30 0a 0a 20 20 20 20 37 20 20 20   1   0..    7   
7830: 30 30 36 34 34 20 20 20 30 30 30 30 30 20 20 20  00644   00000   
7840: 30 30 36 34 34 20 20 20 31 20 20 20 30 20 20 20  00644   1   0   
7850: 30 0a 20 20 20 20 38 20 20 20 30 30 36 34 34 20  0.    8   00644 
7860: 20 20 30 30 36 34 34 20 20 20 30 30 30 30 30 20    00644   00000 
7870: 20 20 31 20 20 20 30 20 20 20 30 0a 20 20 20 20    1   0   0.    
7880: 39 20 20 20 30 30 30 30 30 20 20 20 30 30 36 34  9   00000   0064
7890: 34 20 20 20 30 30 36 34 34 20 20 20 30 20 20 20  4   00644   0   
78a0: 30 20 20 20 30 0a 20 20 7d 20 7b 0a 20 20 20 20  0   0.  } {.    
78b0: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
78c0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
78d0: 32 2d 31 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  2-13.$tn.1 {.   
78e0: 20 20 20 66 69 6c 65 20 61 74 74 72 20 74 65 73     file attr tes
78f0: 74 2e 64 62 20 20 20 20 20 2d 70 65 72 6d 20 24  t.db     -perm $
7900: 64 62 5f 70 65 72 6d 0a 20 20 20 20 20 20 66 69  db_perm.      fi
7910: 6c 65 20 61 74 74 72 20 74 65 73 74 2e 64 62 2d  le attr test.db-
7920: 77 61 6c 20 2d 70 65 72 6d 20 24 77 61 6c 5f 70  wal -perm $wal_p
7930: 65 72 6d 0a 20 20 20 20 20 20 66 69 6c 65 20 61  erm.      file a
7940: 74 74 72 20 74 65 73 74 2e 64 62 2d 73 68 6d 20  ttr test.db-shm 
7950: 2d 70 65 72 6d 20 24 73 68 6d 5f 70 65 72 6d 0a  -perm $shm_perm.
7960: 0a 20 20 20 20 20 20 73 65 74 20 20 20 20 20 4c  .      set     L
7970: 20 5b 66 69 6c 65 20 61 74 74 72 20 74 65 73 74   [file attr test
7980: 2e 64 62 20 2d 70 65 72 6d 5d 0a 20 20 20 20 20  .db -perm].     
7990: 20 6c 61 70 70 65 6e 64 20 4c 20 5b 66 69 6c 65   lappend L [file
79a0: 20 61 74 74 72 20 74 65 73 74 2e 64 62 2d 77 61   attr test.db-wa
79b0: 6c 20 2d 70 65 72 6d 5d 0a 20 20 20 20 20 20 6c  l -perm].      l
79c0: 61 70 70 65 6e 64 20 4c 20 5b 66 69 6c 65 20 61  append L [file a
79d0: 74 74 72 20 74 65 73 74 2e 64 62 2d 73 68 6d 20  ttr test.db-shm 
79e0: 2d 70 65 72 6d 5d 0a 20 20 20 20 7d 20 5b 6c 69  -perm].    } [li
79f0: 73 74 20 24 64 62 5f 70 65 72 6d 20 24 77 61 6c  st $db_perm $wal
7a00: 5f 70 65 72 6d 20 24 73 68 6d 5f 70 65 72 6d 5d  _perm $shm_perm]
7a10: 0a 0a 20 20 20 20 23 20 49 66 20 24 63 61 6e 5f  ..    # If $can_
7a20: 6f 70 65 6e 20 69 73 20 74 72 75 65 2c 20 74 68  open is true, th
7a30: 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  en it should be 
7a40: 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
7a50: 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 20 20   a database.    
7a60: 23 20 68 61 6e 64 6c 65 2e 20 4f 74 68 65 72 77  # handle. Otherw
7a70: 69 73 65 2c 20 69 66 20 24 63 61 6e 5f 6f 70 65  ise, if $can_ope
7a80: 6e 20 69 73 20 30 2c 20 61 74 74 65 6d 70 74 69  n is 0, attempti
7a90: 6e 67 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64  ng to open the d
7aa0: 62 0a 20 20 20 20 23 20 68 61 6e 64 6c 65 20 74  b.    # handle t
7ab0: 68 72 6f 77 73 20 61 6e 20 22 75 6e 61 62 6c 65  hrows an "unable
7ac0: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
7ad0: 65 20 66 69 6c 65 22 20 65 78 63 65 70 74 69 6f  e file" exceptio
7ae0: 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74  n..    #.    set
7af0: 20 72 28 31 29 20 7b 30 20 6f 6b 7d 0a 20 20 20   r(1) {0 ok}.   
7b00: 20 73 65 74 20 72 28 30 29 20 7b 31 20 7b 75 6e   set r(0) {1 {un
7b10: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
7b20: 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 20  abase file}}.   
7b30: 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 33   do_test wal2-13
7b40: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 6c  .$tn.2 {.      l
7b50: 69 73 74 20 5b 63 61 74 63 68 20 7b 73 71 6c 69  ist [catch {sqli
7b60: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 3b  te3 db test.db ;
7b70: 20 73 65 74 20 7b 7d 20 6f 6b 7d 20 6d 73 67 5d   set {} ok} msg]
7b80: 20 24 6d 73 67 0a 20 20 20 20 7d 20 24 72 28 24   $msg.    } $r($
7b90: 63 61 6e 5f 6f 70 65 6e 29 0a 0a 20 20 20 20 69  can_open)..    i
7ba0: 66 20 7b 24 63 61 6e 5f 6f 70 65 6e 7d 20 7b 0a  f {$can_open} {.
7bb0: 0a 20 20 20 20 20 20 23 20 49 66 20 24 63 61 6e  .      # If $can
7bc0: 5f 72 65 61 64 20 69 73 20 74 72 75 65 2c 20 74  _read is true, t
7bd0: 68 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 20 73  hen the client s
7be0: 68 6f 75 6c 64 20 62 65 20 61 62 6c 65 20 74 6f  hould be able to
7bf0: 20 72 65 61 64 20 66 72 6f 6d 0a 20 20 20 20 20   read from.     
7c00: 20 23 20 74 68 65 20 64 61 74 61 62 61 73 65 20   # the database 
7c10: 66 69 6c 65 2e 20 49 66 20 24 63 61 6e 5f 72 65  file. If $can_re
7c20: 61 64 20 69 73 20 66 61 6c 73 65 2c 20 61 74 74  ad is false, att
7c30: 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 61 64 20  empting to read 
7c40: 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 23 20 74  should.      # t
7c50: 68 72 6f 77 20 74 68 65 20 22 75 6e 61 62 6c 65  hrow the "unable
7c60: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
7c70: 65 20 66 69 6c 65 22 20 65 78 63 65 70 74 69 6f  e file" exceptio
7c80: 6e 2e 20 0a 20 20 20 20 20 20 23 0a 20 20 20 20  n. .      #.    
7c90: 20 20 73 65 74 20 61 28 30 29 20 7b 31 20 7b 75    set a(0) {1 {u
7ca0: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
7cb0: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20  tabase file}}.  
7cc0: 20 20 20 20 73 65 74 20 61 28 31 29 20 7b 30 20      set a(1) {0 
7cd0: 7b 33 2e 31 34 20 32 2e 37 32 7d 7d 0a 20 20 20  {3.14 2.72}}.   
7ce0: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d     do_test wal2-
7cf0: 31 33 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 20  13.$tn.3 {.     
7d00: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45     catchsql { SE
7d10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
7d20: 0a 20 20 20 20 20 20 7d 20 24 61 28 24 63 61 6e  .      } $a($can
7d30: 5f 72 65 61 64 29 0a 20 20 0a 20 20 20 20 20 20  _read).  .      
7d40: 23 20 4e 6f 77 20 74 72 79 20 74 6f 20 77 72 69  # Now try to wri
7d50: 74 65 20 74 6f 20 74 68 65 20 64 62 20 66 69 6c  te to the db fil
7d60: 65 2e 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74  e. If the client
7d70: 20 63 61 6e 20 72 65 61 64 20 62 75 74 20 6e 6f   can read but no
7d80: 74 0a 20 20 20 20 20 20 23 20 77 72 69 74 65 2c  t.      # write,
7d90: 20 74 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20   then it should 
7da0: 74 68 72 6f 77 20 74 68 65 20 66 61 6d 69 6c 69  throw the famili
7db0: 61 72 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  ar "unable to op
7dc0: 65 6e 20 64 62 20 66 69 6c 65 22 0a 20 20 20 20  en db file".    
7dd0: 20 20 23 20 65 78 63 65 70 74 69 6f 6e 2e 20 49    # exception. I
7de0: 66 20 69 74 20 63 61 6e 20 72 65 61 64 20 62 75  f it can read bu
7df0: 74 20 6e 6f 74 20 77 72 69 74 65 2c 20 74 68 65  t not write, the
7e00: 20 65 78 63 65 70 74 69 6f 6e 20 73 68 6f 75 6c   exception shoul
7e10: 64 0a 20 20 20 20 20 20 23 20 62 65 20 22 61 74  d.      # be "at
7e20: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61  tempt to write a
7e30: 20 72 65 61 64 20 6f 6e 6c 79 20 64 61 74 61 62   read only datab
7e40: 61 73 65 22 2e 0a 20 20 20 20 20 20 23 0a 20 20  ase"..      #.  
7e50: 20 20 20 20 23 20 49 66 20 74 68 65 20 63 6c 69      # If the cli
7e60: 65 6e 74 20 63 61 6e 20 72 65 61 64 20 61 6e 64  ent can read and
7e70: 20 77 72 69 74 65 2c 20 74 68 65 20 6f 70 65 72   write, the oper
7e80: 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 73 75 63  ation should suc
7e90: 63 65 65 64 2e 0a 20 20 20 20 20 20 23 0a 20 20  ceed..      #.  
7ea0: 20 20 20 20 73 65 74 20 62 28 30 2c 30 29 20 7b      set b(0,0) {
7eb0: 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  1 {unable to ope
7ec0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d  n database file}
7ed0: 7d 0a 20 20 20 20 20 20 73 65 74 20 62 28 31 2c  }.      set b(1,
7ee0: 30 29 20 7b 31 20 7b 61 74 74 65 6d 70 74 20 74  0) {1 {attempt t
7ef0: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
7f00: 6c 79 20 64 61 74 61 62 61 73 65 7d 7d 0a 20 20  ly database}}.  
7f10: 20 20 20 20 73 65 74 20 62 28 31 2c 31 29 20 7b      set b(1,1) {
7f20: 30 20 7b 7d 7d 0a 20 20 20 20 20 20 64 6f 5f 74  0 {}}.      do_t
7f30: 65 73 74 20 77 61 6c 32 2d 31 33 2e 24 74 6e 2e  est wal2-13.$tn.
7f40: 34 20 7b 0a 20 20 20 20 20 20 20 20 63 61 74 63  4 {.        catc
7f50: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
7f60: 54 4f 20 74 31 20 44 45 46 41 55 4c 54 20 56 41  TO t1 DEFAULT VA
7f70: 4c 55 45 53 20 7d 0a 20 20 20 20 20 20 7d 20 24  LUES }.      } $
7f80: 62 28 24 63 61 6e 5f 72 65 61 64 2c 24 63 61 6e  b($can_read,$can
7f90: 5f 77 72 69 74 65 29 0a 20 20 20 20 7d 0a 20 20  _write).    }.  
7fa0: 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f    catch { db clo
7fb0: 73 65 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d  se }.  }.}..#---
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8000: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
8010: 61 74 20 22 50 52 41 47 4d 41 20 63 68 65 63 6b  at "PRAGMA check
8020: 70 6f 69 6e 74 5f 66 75 6c 6c 73 79 6e 63 22 20  point_fullsync" 
8030: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 77 6f  appears to be wo
8040: 72 6b 69 6e 67 2e 0a 23 0a 66 6f 72 65 61 63 68  rking..#.foreach
8050: 20 7b 74 6e 20 73 71 6c 20 72 65 73 6c 69 73 74   {tn sql reslist
8060: 7d 20 7b 0a 20 20 31 20 7b 20 7d 20 20 20 20 20  } {.  1 { }     
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8080: 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 30 20              {10 
8090: 30 20 34 20 30 20 36 20 30 7d 0a 20 20 32 20 7b  0 4 0 6 0}.  2 {
80a0: 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
80b0: 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 3d 20 31  nt_fullfsync = 1
80c0: 20 7d 20 7b 31 30 20 34 20 34 20 32 20 36 20 32   } {10 4 4 2 6 2
80d0: 7d 0a 20 20 33 20 7b 20 50 52 41 47 4d 41 20 63  }.  3 { PRAGMA c
80e0: 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73  heckpoint_fullfs
80f0: 79 6e 63 20 3d 20 30 20 7d 20 7b 31 30 20 30 20  ync = 0 } {10 0 
8100: 34 20 30 20 36 20 30 7d 0a 7d 20 7b 0a 20 20 66  4 0 6 0}.} {.  f
8110: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
8120: 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 65 78 65  nd_reopen..  exe
8130: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 61 75 74  csql {PRAGMA aut
8140: 6f 5f 76 61 63 75 75 6d 20 3d 20 30 7d 0a 20 20  o_vacuum = 0}.  
8150: 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 20 20 64  execsql $sql.  d
8160: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77  o_execsql_test w
8170: 61 6c 32 2d 31 34 2e 24 74 6e 2e 30 20 7b 20 50  al2-14.$tn.0 { P
8180: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
8190: 3d 20 34 30 39 36 20 7d 20 20 20 7b 7d 0a 20 20  = 4096 }   {}.  
81a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
81b0: 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 31 20 7b 20  wal2-14.$tn.1 { 
81c0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
81d0: 6f 64 65 20 3d 20 57 41 4c 20 7d 20 7b 77 61 6c  ode = WAL } {wal
81e0: 7d 0a 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f  }..  set sqlite_
81f0: 73 79 6e 63 5f 63 6f 75 6e 74 20 30 0a 20 20 73  sync_count 0.  s
8200: 65 74 20 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79  et sqlite_fullsy
8210: 6e 63 5f 63 6f 75 6e 74 20 30 0a 0a 20 20 64 6f  nc_count 0..  do
8220: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 61  _execsql_test wa
8230: 6c 32 2d 31 34 2e 24 74 6e 2e 32 20 7b 0a 20 20  l2-14.$tn.2 {.  
8240: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74    PRAGMA wal_aut
8250: 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 31 30  ocheckpoint = 10
8260: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8270: 4c 45 20 74 31 28 61 2c 20 62 29 3b 20 20 20 20  LE t1(a, b);    
8280: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
8290: 20 77 61 6c 20 73 79 6e 63 73 0a 20 20 20 20 49   wal syncs.    I
82a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
82b0: 4c 55 45 53 28 31 2c 20 32 29 3b 20 20 20 20 20  LUES(1, 2);     
82c0: 20 20 20 20 20 2d 2d 20 32 20 77 61 6c 20 73 79       -- 2 wal sy
82d0: 6e 63 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  nc.    PRAGMA wa
82e0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 20 20 20  l_checkpoint;   
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
8300: 31 20 77 61 6c 20 73 79 6e 63 2c 20 31 20 64 62  1 wal sync, 1 db
8310: 20 73 79 6e 63 0a 20 20 20 20 42 45 47 49 4e 3b   sync.    BEGIN;
8320: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
8330: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
8340: 34 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  4);.      INSERT
8350: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8360: 35 2c 20 36 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  5, 6);.    COMMI
8370: 54 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T;              
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 20 2d 2d 20 32 20 77 61 6c 20 73 79 6e 63 0a 20   -- 2 wal sync. 
83a0: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
83b0: 65 63 6b 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  eckpoint;       
83c0: 20 20 20 20 20 20 20 20 20 2d 2d 20 31 20 77 61           -- 1 wa
83d0: 6c 20 73 79 6e 63 2c 20 31 20 64 62 20 73 79 6e  l sync, 1 db syn
83e0: 63 0a 20 20 7d 20 7b 31 30 20 30 20 33 20 33 20  c.  } {10 0 3 3 
83f0: 30 20 31 20 31 7d 0a 0a 20 20 64 6f 5f 74 65 73  0 1 1}..  do_tes
8400: 74 20 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 33 20  t wal2-14.$tn.3 
8410: 7b 0a 20 20 20 20 63 6f 6e 64 5f 69 6e 63 72 5f  {.    cond_incr_
8420: 73 79 6e 63 5f 63 6f 75 6e 74 20 31 0a 20 20 20  sync_count 1.   
8430: 20 6c 69 73 74 20 24 73 71 6c 69 74 65 5f 73 79   list $sqlite_sy
8440: 6e 63 5f 63 6f 75 6e 74 20 24 73 71 6c 69 74 65  nc_count $sqlite
8450: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 0a  _fullsync_count.
8460: 20 20 7d 20 5b 6c 72 61 6e 67 65 20 24 72 65 73    } [lrange $res
8470: 6c 69 73 74 20 30 20 31 5d 0a 0a 20 20 73 65 74  list 0 1]..  set
8480: 20 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75   sqlite_sync_cou
8490: 6e 74 20 30 0a 20 20 73 65 74 20 73 71 6c 69 74  nt 0.  set sqlit
84a0: 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  e_fullsync_count
84b0: 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61   0..  do_test wa
84c0: 6c 32 2d 31 34 2e 24 74 6e 2e 34 20 7b 0a 20 20  l2-14.$tn.4 {.  
84d0: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
84e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
84f0: 53 28 37 2c 20 7a 65 72 6f 62 6c 6f 62 28 31 32  S(7, zeroblob(12
8500: 2a 34 30 39 36 29 29 20 7d 0a 20 20 20 20 6c 69  *4096)) }.    li
8510: 73 74 20 24 73 71 6c 69 74 65 5f 73 79 6e 63 5f  st $sqlite_sync_
8520: 63 6f 75 6e 74 20 24 73 71 6c 69 74 65 5f 66 75  count $sqlite_fu
8530: 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 0a 20 20 7d  llsync_count.  }
8540: 20 5b 6c 72 61 6e 67 65 20 24 72 65 73 6c 69 73   [lrange $reslis
8550: 74 20 32 20 33 5d 0a 0a 20 20 73 65 74 20 73 71  t 2 3]..  set sq
8560: 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  lite_sync_count 
8570: 30 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 66  0.  set sqlite_f
8580: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 30 0a  ullsync_count 0.
8590: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  .  do_test wal2-
85a0: 31 34 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 65  14.$tn.5 {.    e
85b0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
85c0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
85d0: 6e 74 20 3d 20 31 30 30 30 20 7d 0a 20 20 20 20  nt = 1000 }.    
85e0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
85f0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8600: 39 2c 20 31 30 29 20 7d 0a 20 20 20 20 65 78 65  9, 10) }.    exe
8610: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
8620: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 31 2c  TO t1 VALUES(11,
8630: 20 31 32 29 20 7d 0a 20 20 20 20 65 78 65 63 73   12) }.    execs
8640: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
8650: 20 74 31 20 56 41 4c 55 45 53 28 31 33 2c 20 31   t1 VALUES(13, 1
8660: 34 29 20 7d 0a 20 20 20 20 64 62 20 63 6c 6f 73  4) }.    db clos
8670: 65 0a 20 20 20 20 6c 69 73 74 20 24 73 71 6c 69  e.    list $sqli
8680: 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 24 73  te_sync_count $s
8690: 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63  qlite_fullsync_c
86a0: 6f 75 6e 74 0a 20 20 7d 20 5b 6c 72 61 6e 67 65  ount.  } [lrange
86b0: 20 24 72 65 73 6c 69 73 74 20 34 20 35 5d 0a 7d   $reslist 4 5].}
86c0: 0a 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f  ..catch { db clo
86d0: 73 65 20 7d 0a 0a 23 20 50 52 41 47 4d 41 20 63  se }..# PRAGMA c
86e0: 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 73 79  heckpoint_fullsy
86f0: 6e 63 0a 23 20 50 52 41 47 4d 41 20 66 75 6c 6c  nc.# PRAGMA full
8700: 66 73 79 6e 63 0a 23 20 50 52 41 47 4d 41 20 73  fsync.# PRAGMA s
8710: 79 6e 63 68 72 6f 6e 6f 75 73 0a 23 0a 66 6f 72  ynchronous.#.for
8720: 65 61 63 68 20 7b 74 6e 20 73 65 74 74 69 6e 67  each {tn setting
8730: 73 20 72 65 73 74 61 72 74 5f 73 79 6e 63 20 63  s restart_sync c
8740: 6f 6d 6d 69 74 5f 73 79 6e 63 20 63 6b 70 74 5f  ommit_sync ckpt_
8750: 73 79 6e 63 7d 20 7b 0a 20 20 31 20 20 7b 30 20  sync} {.  1  {0 
8760: 30 20 6f 66 66 7d 20 20 20 20 20 7b 30 20 30 7d  0 off}     {0 0}
8770: 20 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d 0a 20    {0 0}  {0 0}. 
8780: 20 32 20 20 7b 30 20 30 20 6e 6f 72 6d 61 6c 7d   2  {0 0 normal}
8790: 20 20 7b 31 20 30 7d 20 20 7b 30 20 30 7d 20 20    {1 0}  {0 0}  
87a0: 7b 32 20 30 7d 0a 20 20 33 20 20 7b 30 20 30 20  {2 0}.  3  {0 0 
87b0: 66 75 6c 6c 7d 20 20 20 20 7b 32 20 30 7d 20 20  full}    {2 0}  
87c0: 7b 31 20 30 7d 20 20 7b 32 20 30 7d 0a 0a 20 20  {1 0}  {2 0}..  
87d0: 34 20 20 7b 30 20 31 20 6f 66 66 7d 20 20 20 20  4  {0 1 off}    
87e0: 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d 20 20 7b   {0 0}  {0 0}  {
87f0: 30 20 30 7d 0a 20 20 35 20 20 7b 30 20 31 20 6e  0 0}.  5  {0 1 n
8800: 6f 72 6d 61 6c 7d 20 20 7b 30 20 31 7d 20 20 7b  ormal}  {0 1}  {
8810: 30 20 30 7d 20 20 7b 30 20 32 7d 0a 20 20 36 20  0 0}  {0 2}.  6 
8820: 20 7b 30 20 31 20 66 75 6c 6c 7d 20 20 20 20 7b   {0 1 full}    {
8830: 30 20 32 7d 20 20 7b 30 20 31 7d 20 20 7b 30 20  0 2}  {0 1}  {0 
8840: 32 7d 0a 0a 20 20 37 20 20 7b 31 20 30 20 6f 66  2}..  7  {1 0 of
8850: 66 7d 20 20 20 20 20 7b 30 20 30 7d 20 20 7b 30  f}     {0 0}  {0
8860: 20 30 7d 20 20 7b 30 20 30 7d 0a 20 20 38 20 20   0}  {0 0}.  8  
8870: 7b 31 20 30 20 6e 6f 72 6d 61 6c 7d 20 20 7b 31  {1 0 normal}  {1
8880: 20 30 7d 20 20 7b 30 20 30 7d 20 20 7b 30 20 32   0}  {0 0}  {0 2
8890: 7d 0a 20 20 39 20 20 7b 31 20 30 20 66 75 6c 6c  }.  9  {1 0 full
88a0: 7d 20 20 20 20 7b 32 20 30 7d 20 20 7b 31 20 30  }    {2 0}  {1 0
88b0: 7d 20 20 7b 30 20 32 7d 0a 0a 20 20 31 30 20 7b  }  {0 2}..  10 {
88c0: 31 20 31 20 6f 66 66 7d 20 20 20 20 20 7b 30 20  1 1 off}     {0 
88d0: 30 7d 20 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d  0}  {0 0}  {0 0}
88e0: 0a 20 20 31 31 20 7b 31 20 31 20 6e 6f 72 6d 61  .  11 {1 1 norma
88f0: 6c 7d 20 20 7b 30 20 31 7d 20 20 7b 30 20 30 7d  l}  {0 1}  {0 0}
8900: 20 20 7b 30 20 32 7d 0a 20 20 31 32 20 7b 31 20    {0 2}.  12 {1 
8910: 31 20 66 75 6c 6c 7d 20 20 20 20 7b 30 20 32 7d  1 full}    {0 2}
8920: 20 20 7b 30 20 31 7d 20 20 7b 30 20 32 7d 0a 7d    {0 1}  {0 2}.}
8930: 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65   {.  forcedelete
8940: 20 74 65 73 74 2e 64 62 0a 0a 20 20 74 65 73 74   test.db..  test
8950: 76 66 73 20 74 76 66 73 20 2d 64 65 66 61 75 6c  vfs tvfs -defaul
8960: 74 20 31 0a 20 20 74 76 66 73 20 66 69 6c 74 65  t 1.  tvfs filte
8970: 72 20 78 53 79 6e 63 0a 20 20 74 76 66 73 20 73  r xSync.  tvfs s
8980: 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 20 20  cript xSyncCb.  
8990: 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 6d 65  proc xSyncCb {me
89a0: 74 68 6f 64 20 66 69 6c 65 20 66 69 6c 65 69 64  thod file fileid
89b0: 20 66 6c 61 67 73 7d 20 7b 0a 20 20 20 20 69 6e   flags} {.    in
89c0: 63 72 20 3a 3a 73 79 6e 63 28 24 66 6c 61 67 73  cr ::sync($flags
89d0: 29 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ).  }..  sqlite3
89e0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f   db test.db.  do
89f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35  _execsql_test 15
8a00: 2e 24 74 6e 2e 31 20 22 0a 20 20 20 20 50 52 41  .$tn.1 ".    PRA
8a10: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
8a20: 34 30 39 36 3b 0a 20 20 20 20 43 52 45 41 54 45  4096;.    CREATE
8a30: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
8a40: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74    PRAGMA wal_aut
8a50: 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 4f 46  ocheckpoint = OF
8a60: 46 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  F;.    PRAGMA jo
8a70: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
8a80: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 68 65  ;.    PRAGMA che
8a90: 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79 6e  ckpoint_fullfsyn
8aa0: 63 20 3d 20 5b 6c 69 6e 64 65 78 20 24 73 65 74  c = [lindex $set
8ab0: 74 69 6e 67 73 20 30 5d 3b 0a 20 20 20 20 50 52  tings 0];.    PR
8ac0: 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20 3d  AGMA fullfsync =
8ad0: 20 5b 6c 69 6e 64 65 78 20 24 73 65 74 74 69 6e   [lindex $settin
8ae0: 67 73 20 31 5d 3b 0a 20 20 20 20 50 52 41 47 4d  gs 1];.    PRAGM
8af0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
8b00: 5b 6c 69 6e 64 65 78 20 24 73 65 74 74 69 6e 67  [lindex $setting
8b10: 73 20 32 5d 3b 0a 20 20 22 20 7b 30 20 77 61 6c  s 2];.  " {0 wal
8b20: 7d 0a 0a 69 66 20 7b 20 24 74 6e 3d 3d 32 7d 20  }..if { $tn==2} 
8b30: 62 72 65 61 6b 70 6f 69 6e 74 0a 20 20 64 6f 5f  breakpoint.  do_
8b40: 74 65 73 74 20 31 35 2e 24 74 6e 2e 32 20 7b 0a  test 15.$tn.2 {.
8b50: 20 20 20 20 73 65 74 20 73 79 6e 63 28 6e 6f 72      set sync(nor
8b60: 6d 61 6c 29 20 30 0a 20 20 20 20 73 65 74 20 73  mal) 0.    set s
8b70: 79 6e 63 28 66 75 6c 6c 29 20 30 0a 20 20 20 20  ync(full) 0.    
8b80: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
8b90: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8ba0: 27 61 62 63 27 29 20 7d 0a 20 20 20 20 6c 69 73  'abc') }.    lis
8bb0: 74 20 24 3a 3a 73 79 6e 63 28 6e 6f 72 6d 61 6c  t $::sync(normal
8bc0: 29 20 24 3a 3a 73 79 6e 63 28 66 75 6c 6c 29 0a  ) $::sync(full).
8bd0: 20 20 7d 20 24 72 65 73 74 61 72 74 5f 73 79 6e    } $restart_syn
8be0: 63 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 35 2e  c..  do_test 15.
8bf0: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 73 65 74 20  $tn.3 {.    set 
8c00: 73 79 6e 63 28 6e 6f 72 6d 61 6c 29 20 30 0a 20  sync(normal) 0. 
8c10: 20 20 20 73 65 74 20 73 79 6e 63 28 66 75 6c 6c     set sync(full
8c20: 29 20 30 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ) 0.    execsql 
8c30: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
8c40: 20 56 41 4c 55 45 53 28 27 61 62 63 27 29 20 7d   VALUES('abc') }
8c50: 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a 73 79 6e  .    list $::syn
8c60: 63 28 6e 6f 72 6d 61 6c 29 20 24 3a 3a 73 79 6e  c(normal) $::syn
8c70: 63 28 66 75 6c 6c 29 0a 20 20 7d 20 24 63 6f 6d  c(full).  } $com
8c80: 6d 69 74 5f 73 79 6e 63 0a 0a 20 20 64 6f 5f 74  mit_sync..  do_t
8c90: 65 73 74 20 31 35 2e 24 74 6e 2e 34 20 7b 0a 20  est 15.$tn.4 {. 
8ca0: 20 20 20 73 65 74 20 73 79 6e 63 28 6e 6f 72 6d     set sync(norm
8cb0: 61 6c 29 20 30 0a 20 20 20 20 73 65 74 20 73 79  al) 0.    set sy
8cc0: 6e 63 28 66 75 6c 6c 29 20 30 0a 20 20 20 20 65  nc(full) 0.    e
8cd0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
8ce0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
8cf0: 64 65 66 27 29 20 7d 0a 20 20 20 20 6c 69 73 74  def') }.    list
8d00: 20 24 3a 3a 73 79 6e 63 28 6e 6f 72 6d 61 6c 29   $::sync(normal)
8d10: 20 24 3a 3a 73 79 6e 63 28 66 75 6c 6c 29 0a 20   $::sync(full). 
8d20: 20 7d 20 24 63 6f 6d 6d 69 74 5f 73 79 6e 63 0a   } $commit_sync.
8d30: 0a 20 20 64 6f 5f 74 65 73 74 20 31 35 2e 24 74  .  do_test 15.$t
8d40: 6e 2e 35 20 7b 0a 20 20 20 20 73 65 74 20 73 79  n.5 {.    set sy
8d50: 6e 63 28 6e 6f 72 6d 61 6c 29 20 30 0a 20 20 20  nc(normal) 0.   
8d60: 20 73 65 74 20 73 79 6e 63 28 66 75 6c 6c 29 20   set sync(full) 
8d70: 30 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  0.    execsql { 
8d80: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
8d90: 70 6f 69 6e 74 20 7d 0a 20 20 20 20 6c 69 73 74  point }.    list
8da0: 20 24 3a 3a 73 79 6e 63 28 6e 6f 72 6d 61 6c 29   $::sync(normal)
8db0: 20 24 3a 3a 73 79 6e 63 28 66 75 6c 6c 29 0a 20   $::sync(full). 
8dc0: 20 7d 20 24 63 6b 70 74 5f 73 79 6e 63 0a 20 20   } $ckpt_sync.  
8dd0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76  .  db close.  tv
8de0: 66 73 20 64 65 6c 65 74 65 0a 7d 0a 0a 0a 0a 66  fs delete.}....f
8df0: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.