/ Hex Artifact Content
Login

Artifact 6ac39b94a284ebac6efb6be93b0cdfe73ee6083f129555e3144d8a615e9900ef:


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 23 20 54 68 65 20 66 69  b-wal.  # The fi
5380: 72 73 74 20 33 32 20 62 79 74 65 73 20 6f 66 20  rst 32 bytes of 
5390: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 63 6f 6e  the WAL file con
53a0: 74 61 69 6e 20 74 68 65 20 57 41 4c 20 68 65 61  tain the WAL hea
53b0: 64 65 72 2e 20 4f 66 66 73 65 74 20 34 38 0a 20  der. Offset 48. 
53c0: 20 23 20 69 73 20 74 68 65 20 66 69 72 73 74 20   # is the first 
53d0: 62 79 74 65 20 6f 66 20 74 68 65 20 63 68 65 63  byte of the chec
53e0: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 66 69 72  ksum for the fir
53f0: 73 74 20 66 72 61 6d 65 20 69 6e 20 74 68 65 20  st frame in the 
5400: 57 41 4c 2e 20 0a 20 20 23 20 54 68 65 20 66 6f  WAL. .  # The fo
5410: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 6c 69  llowing three li
5420: 6e 65 73 20 72 65 70 6c 61 63 65 73 20 74 68 65  nes replaces the
5430: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 61   contents of tha
5440: 74 20 62 79 74 65 20 77 69 74 68 20 0a 20 20 23  t byte with .  #
5450: 20 61 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c   a different val
5460: 75 65 2e 0a 20 20 73 65 74 20 6e 65 77 76 61 6c  ue..  set newval
5470: 20 46 46 0a 20 20 69 66 20 7b 24 6e 65 77 76 61   FF.  if {$newva
5480: 6c 20 3d 3d 20 5b 68 65 78 69 6f 5f 72 65 61 64  l == [hexio_read
5490: 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 20 34 38   test2.db-wal 48
54a0: 20 31 5d 7d 20 7b 20 73 65 74 20 6e 65 77 76 61   1]} { set newva
54b0: 6c 20 30 30 20 7d 0a 20 20 68 65 78 69 6f 5f 77  l 00 }.  hexio_w
54c0: 72 69 74 65 20 74 65 73 74 32 2e 64 62 2d 77 61  rite test2.db-wa
54d0: 6c 20 34 38 20 24 6e 65 77 76 61 6c 0a 7d 20 7b  l 48 $newval.} {
54e0: 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d  1}.do_test wal2-
54f0: 37 2e 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65  7.1.3 {.  sqlite
5500: 33 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20  3 db2 test2.db. 
5510: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
5520: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
5530: 20 7d 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c   } db2.  execsql
5540: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
5550: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d   sqlite_master }
5560: 20 64 62 32 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f   db2.} {}.db clo
5570: 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 66 6f 72  se.db2 close.for
5580: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
5590: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
55a0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 64 6f 5f  t.db-journal.do_
55b0: 74 65 73 74 20 77 61 6c 32 2d 38 2e 31 2e 32 20  test wal2-8.1.2 
55c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  {.  sqlite3 db t
55d0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
55e0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75   {.    PRAGMA au
55f0: 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a 20  to_vacuum=OFF;. 
5600: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
5610: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
5620: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
5630: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43  ode = WAL;.    C
5640: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
5650: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
5660: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 7a 65 72  TO t1 VALUES(zer
5670: 6f 62 6c 6f 62 28 38 31 38 38 2a 31 30 32 30 29  oblob(8188*1020)
5680: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
5690: 42 4c 45 20 74 32 28 79 29 3b 0a 20 20 20 20 50  BLE t2(y);.    P
56a0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
56b0: 6f 69 6e 74 3b 0a 20 20 7d 0a 20 20 65 78 65 63  oint;.  }.  exec
56c0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
56d0: 20 72 6f 6f 74 70 61 67 65 3e 3d 38 31 39 32 20   rootpage>=8192 
56e0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
56f0: 65 72 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  er WHERE tbl_nam
5700: 65 20 3d 20 27 74 32 27 3b 0a 20 20 7d 0a 7d 20  e = 't2';.  }.} 
5710: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32  {1}.do_test wal2
5720: 2d 38 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  -8.1.3 {.  execs
5730: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
5740: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
5750: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5760: 45 20 74 33 28 7a 29 3b 0a 20 20 20 20 42 45 47  E t3(z);.    BEG
5770: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
5780: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
5790: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
57a0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
57b0: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61  NTO t3 SELECT ra
57c0: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
57d0: 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 49 4e 53  OM t3;.      INS
57e0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
57f0: 45 53 28 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20  ES('hello');.   
5800: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5810: 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  3 SELECT randomb
5820: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 33  lob(900) FROM t3
5830: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
5840: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61  NTO t3 SELECT ra
5850: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
5860: 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 49 4e 53  OM t3;.      INS
5870: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
5880: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
5890: 30 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20  0) FROM t3;.    
58a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
58b0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
58c0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 33 3b  ob(900) FROM t3;
58d0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
58e0: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e  TO t3 SELECT ran
58f0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
5900: 4d 20 74 33 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t3;.      INSE
5910: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
5920: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
5930: 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 52  ) FROM t3;.    R
5940: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 65  OLLBACK;.  }.  e
5950: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
5960: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
5970: 45 53 28 27 67 6f 6f 64 62 79 65 27 29 3b 0a 20  ES('goodbye');. 
5980: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5990: 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  3 SELECT randomb
59a0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 33  lob(900) FROM t3
59b0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
59c0: 4f 20 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64  O t3 SELECT rand
59d0: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
59e0: 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   t3;.  }.} {}.do
59f0: 5f 74 65 73 74 20 77 61 6c 32 2d 38 2e 31 2e 34  _test wal2-8.1.4
5a00: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
5a10: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
5a20: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
5a30: 4f 4d 20 74 32 20 7d 0a 7d 20 7b 67 6f 6f 64 62  OM t2 }.} {goodb
5a40: 79 65 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 62  ye}.db2 close.db
5a50: 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   close..#-------
5a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5aa0: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 65  --.# Test that e
5ab0: 76 65 6e 20 69 66 20 74 68 65 20 63 68 65 63 6b  ven if the check
5ac0: 73 75 6d 73 20 66 6f 72 20 62 6f 74 68 20 61 72  sums for both ar
5ad0: 65 20 76 61 6c 69 64 2c 20 69 66 20 74 68 65 20  e valid, if the 
5ae0: 74 77 6f 20 63 6f 70 69 65 73 0a 23 20 6f 66 20  two copies.# of 
5af0: 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65  the wal-index he
5b00: 61 64 65 72 20 69 6e 20 74 68 65 20 77 61 6c 2d  ader in the wal-
5b10: 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6d 61 74  index do not mat
5b20: 63 68 2c 20 74 68 65 20 63 6c 69 65 6e 74 0a 23  ch, the client.#
5b30: 20 72 75 6e 73 20 28 6f 72 20 61 74 20 6c 65 61   runs (or at lea
5b40: 73 74 20 74 72 69 65 73 20 74 6f 20 72 75 6e 29  st tries to run)
5b50: 20 64 61 74 61 62 61 73 65 20 72 65 63 6f 76 65   database recove
5b60: 72 79 2e 0a 23 20 0a 23 0a 70 72 6f 63 20 67 65  ry..# .#.proc ge
5b70: 74 5f 6e 61 6d 65 20 7b 6d 65 74 68 6f 64 20 61  t_name {method a
5b80: 72 67 73 7d 20 7b 20 73 65 74 20 3a 3a 66 69 6c  rgs} { set ::fil
5b90: 65 6e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24 61  ename [lindex $a
5ba0: 72 67 73 20 30 5d 20 3b 20 74 76 66 73 20 66 69  rgs 0] ; tvfs fi
5bb0: 6c 74 65 72 20 7b 7d 20 7d 0a 74 65 73 74 76 66  lter {} }.testvf
5bc0: 73 20 74 76 66 73 0a 74 76 66 73 20 73 63 72 69  s tvfs.tvfs scri
5bd0: 70 74 20 67 65 74 5f 6e 61 6d 65 0a 74 76 66 73  pt get_name.tvfs
5be0: 20 66 69 6c 74 65 72 20 78 53 68 6d 4f 70 65 6e   filter xShmOpen
5bf0: 0a 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65  ..forcedelete te
5c00: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61  st.db test.db-wa
5c10: 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  l test.db-journa
5c20: 6c 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 39  l.do_test wal2-9
5c30: 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .1 {.  sqlite3 d
5c40: 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74  b test.db -vfs t
5c50: 76 66 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  vfs.  execsql {.
5c60: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
5c70: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
5c80: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5c90: 78 28 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  x(y);.    INSERT
5ca0: 20 49 4e 54 4f 20 78 20 56 41 4c 55 45 53 28 27   INTO x VALUES('
5cb0: 42 61 72 74 6f 6e 27 29 3b 0a 20 20 20 20 49 4e  Barton');.    IN
5cc0: 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41 4c 55  SERT INTO x VALU
5cd0: 45 53 28 27 44 65 61 6b 69 6e 27 29 3b 0a 20 20  ES('Deakin');.  
5ce0: 7d 0a 0a 20 20 23 20 53 65 74 20 24 77 69 68 28  }..  # Set $wih(
5cf0: 31 29 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  1) to the conten
5d00: 74 73 20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e  ts of the wal-in
5d10: 64 65 78 20 68 65 61 64 65 72 20 61 66 74 65 72  dex header after
5d20: 0a 20 20 23 20 74 68 65 20 66 72 61 6d 65 73 20  .  # the frames 
5d30: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5d40: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 72 6f  the first two ro
5d50: 77 73 20 69 6e 20 74 61 62 6c 65 20 27 78 27 20  ws in table 'x' 
5d60: 68 61 76 65 0a 20 20 23 20 62 65 65 6e 20 69 6e  have.  # been in
5d70: 73 65 72 74 65 64 2e 20 54 68 65 6e 20 69 6e 73  serted. Then ins
5d80: 65 72 74 20 6f 6e 65 20 6d 6f 72 65 20 72 6f 77  ert one more row
5d90: 20 61 6e 64 20 73 65 74 20 24 77 69 68 28 32 29   and set $wih(2)
5da0: 0a 20 20 23 20 74 6f 20 74 68 65 20 6e 65 77 20  .  # to the new 
5db0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 77 61 6c  value of the wal
5dc0: 2d 69 6e 64 65 78 20 68 65 61 64 65 72 2e 0a 20  -index header.. 
5dd0: 20 23 0a 20 20 23 20 49 66 20 74 68 65 20 24 77   #.  # If the $w
5de0: 69 68 28 31 29 20 69 73 20 77 72 69 74 74 65 6e  ih(1) is written
5df0: 20 69 6e 74 6f 20 74 68 65 20 77 61 6c 2d 69 6e   into the wal-in
5e00: 64 65 78 20 62 65 66 6f 72 65 20 72 75 6e 6e 69  dex before runni
5e10: 6e 67 0a 20 20 23 20 61 20 72 65 61 64 20 6f 70  ng.  # a read op
5e20: 65 72 61 74 69 6f 6e 2c 20 74 68 65 20 63 6c 69  eration, the cli
5e30: 65 6e 74 20 77 69 6c 6c 20 73 65 65 20 6f 6e 6c  ent will see onl
5e40: 79 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  y the first two 
5e50: 72 6f 77 73 2e 20 49 66 0a 20 20 23 20 24 77 69  rows. If.  # $wi
5e60: 68 28 32 29 20 69 73 20 77 72 69 74 74 65 6e 20  h(2) is written 
5e70: 69 6e 74 6f 20 74 68 65 20 77 61 6c 2d 69 6e 64  into the wal-ind
5e80: 65 78 2c 20 74 68 65 20 63 6c 69 65 6e 74 20 77  ex, the client w
5e90: 69 6c 6c 20 73 65 65 0a 20 20 23 20 74 68 72 65  ill see.  # thre
5ea0: 65 20 72 6f 77 73 2e 20 49 66 20 61 6e 20 69 6e  e rows. If an in
5eb0: 76 61 6c 69 64 20 68 65 61 64 65 72 20 69 73 20  valid header is 
5ec0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
5ed0: 20 77 61 6c 2d 69 6e 64 65 78 2c 20 74 68 65 6e   wal-index, then
5ee0: 0a 20 20 23 20 74 68 65 20 63 6c 69 65 6e 74 20  .  # the client 
5ef0: 77 69 6c 6c 20 72 75 6e 20 72 65 63 6f 76 65 72  will run recover
5f00: 79 20 61 6e 64 20 73 65 65 20 74 68 72 65 65 20  y and see three 
5f10: 72 6f 77 73 2e 0a 20 20 23 0a 20 20 73 65 74 20  rows..  #.  set 
5f20: 77 69 68 28 31 29 20 5b 73 65 74 5f 74 76 66 73  wih(1) [set_tvfs
5f30: 5f 68 64 72 20 24 3a 3a 66 69 6c 65 6e 61 6d 65  _hdr $::filename
5f40: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  ].  execsql { IN
5f50: 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41 4c 55  SERT INTO x VALU
5f60: 45 53 28 27 57 61 74 73 6f 6e 27 29 20 7d 0a 20  ES('Watson') }. 
5f70: 20 73 65 74 20 77 69 68 28 32 29 20 5b 73 65 74   set wih(2) [set
5f80: 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a 66 69 6c  _tvfs_hdr $::fil
5f90: 65 6e 61 6d 65 5d 0a 0a 20 20 73 71 6c 69 74 65  ename]..  sqlite
5fa0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76  3 db2 test.db -v
5fb0: 66 73 20 74 76 66 73 0a 20 20 65 78 65 63 73 71  fs tvfs.  execsq
5fc0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
5fd0: 4d 20 78 20 7d 20 64 62 32 0a 7d 20 7b 42 61 72  M x } db2.} {Bar
5fe0: 74 6f 6e 20 44 65 61 6b 69 6e 20 57 61 74 73 6f  ton Deakin Watso
5ff0: 6e 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  n}..foreach {tn 
6000: 68 64 72 31 20 68 64 72 32 20 72 65 73 7d 20 5b  hdr1 hdr2 res} [
6010: 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6040: 5c 0a 20 20 33 20 20 24 77 69 68 28 31 29 20 20  \.  3  $wih(1)  
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 77                $w
6060: 69 68 28 31 29 20 20 20 20 20 20 20 20 20 20 20  ih(1)           
6070: 20 20 20 20 20 7b 42 61 72 74 6f 6e 20 44 65 61       {Barton Dea
6080: 6b 69 6e 7d 20 20 20 20 20 20 20 20 20 20 5c 0a  kin}          \.
6090: 20 20 34 20 20 24 77 69 68 28 31 29 20 20 20 20    4  $wih(1)    
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 24 77 69 68              $wih
60b0: 28 32 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (2)             
60c0: 20 20 20 7b 42 61 72 74 6f 6e 20 44 65 61 6b 69     {Barton Deaki
60d0: 6e 20 57 61 74 73 6f 6e 7d 20 20 20 5c 0a 20 20  n Watson}   \.  
60e0: 35 20 20 24 77 69 68 28 32 29 20 20 20 20 20 20  5  $wih(2)      
60f0: 20 20 20 20 20 20 20 20 20 20 24 77 69 68 28 31            $wih(1
6100: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
6110: 20 7b 42 61 72 74 6f 6e 20 44 65 61 6b 69 6e 20   {Barton Deakin 
6120: 57 61 74 73 6f 6e 7d 20 20 20 5c 0a 20 20 36 20  Watson}   \.  6 
6130: 20 24 77 69 68 28 32 29 20 20 20 20 20 20 20 20   $wih(2)        
6140: 20 20 20 20 20 20 20 20 24 77 69 68 28 32 29 20          $wih(2) 
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
6160: 42 61 72 74 6f 6e 20 44 65 61 6b 69 6e 20 57 61  Barton Deakin Wa
6170: 74 73 6f 6e 7d 20 20 20 5c 0a 20 20 37 20 20 24  tson}   \.  7  $
6180: 77 69 68 28 31 29 20 20 20 20 20 20 20 20 20 20  wih(1)          
6190: 20 20 20 20 20 20 24 77 69 68 28 31 29 20 20 20        $wih(1)   
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 42 61               {Ba
61b0: 72 74 6f 6e 20 44 65 61 6b 69 6e 7d 20 20 20 20  rton Deakin}    
61c0: 20 20 20 20 20 20 5c 0a 20 20 38 20 20 7b 30 20        \.  8  {0 
61d0: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20  0 0 0 0 0 0 0 0 
61e0: 30 20 30 20 30 7d 20 7b 30 20 30 20 30 20 30 20  0 0 0} {0 0 0 0 
61f0: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 7d  0 0 0 0 0 0 0 0}
6200: 20 7b 42 61 72 74 6f 6e 20 44 65 61 6b 69 6e 20   {Barton Deakin 
6210: 57 61 74 73 6f 6e 7d 0a 5d 20 7b 0a 20 20 64 6f  Watson}.] {.  do
6220: 5f 74 65 73 74 20 77 61 6c 32 2d 39 2e 24 74 6e  _test wal2-9.$tn
6230: 20 7b 0a 20 20 20 20 73 65 74 5f 74 76 66 73 5f   {.    set_tvfs_
6240: 68 64 72 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 20  hdr $::filename 
6250: 24 68 64 72 31 20 24 68 64 72 32 0a 20 20 20 20  $hdr1 $hdr2.    
6260: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
6270: 20 2a 20 46 52 4f 4d 20 78 20 7d 20 64 62 32 0a   * FROM x } db2.
6280: 20 20 7d 20 24 72 65 73 0a 7d 0a 0a 64 62 32 20    } $res.}..db2 
6290: 63 6c 6f 73 65 0a 64 62 20 63 6c 6f 73 65 0a 0a  close.db close..
62a0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
62b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69  ----------.# Thi
62f0: 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73  s block of tests
6300: 20 2d 20 77 61 6c 32 2d 31 30 2e 2a 20 2d 20 66   - wal2-10.* - f
6310: 6f 63 75 73 20 6f 6e 20 74 68 65 20 6c 69 62 72  ocus on the libr
6320: 61 72 69 65 73 20 72 65 73 70 6f 6e 73 65 20 74  aries response t
6330: 6f 0a 23 20 6e 65 77 20 76 65 72 73 69 6f 6e 73  o.# new versions
6340: 20 6f 66 20 74 68 65 20 77 61 6c 20 6f 72 20 77   of the wal or w
6350: 61 6c 2d 69 6e 64 65 78 20 66 6f 72 6d 61 74 73  al-index formats
6360: 2e 20 0a 23 0a 23 20 20 20 77 61 6c 32 2d 31 30  . .#.#   wal2-10
6370: 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .1.*: Test that 
6380: 74 68 65 20 6c 69 62 72 61 72 79 20 72 65 66 75  the library refu
6390: 73 65 73 20 74 6f 20 22 72 65 63 6f 76 65 72 22  ses to "recover"
63a0: 20 61 20 6e 65 77 20 57 41 4c 20 0a 23 20 20 20   a new WAL .#   
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
63c0: 6d 61 74 2e 0a 23 0a 23 20 20 20 77 61 6c 32 2d  mat..#.#   wal2-
63d0: 31 30 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61  10.2.*: Test tha
63e0: 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 72 65  t the library re
63f0: 66 75 73 65 73 20 74 6f 20 72 65 61 64 20 6f 72  fuses to read or
6400: 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
6410: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
6420: 20 20 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e     if the wal-in
6430: 64 65 78 20 76 65 72 73 69 6f 6e 20 69 73 20 6e  dex version is n
6440: 65 77 65 72 20 74 68 61 6e 20 69 74 20 75 6e 64  ewer than it und
6450: 65 72 73 74 61 6e 64 73 2e 0a 23 0a 23 20 41 74  erstands..#.# At
6460: 20 74 69 6d 65 20 6f 66 20 77 72 69 74 69 6e 67   time of writing
6470: 2c 20 74 68 65 20 6f 6e 6c 79 20 76 65 72 73 69  , the only versi
6480: 6f 6e 73 20 6f 66 20 74 68 65 20 77 61 6c 20 61  ons of the wal a
6490: 6e 64 20 77 61 6c 2d 69 6e 64 65 78 20 66 6f 72  nd wal-index for
64a0: 6d 61 74 73 0a 23 20 74 68 61 74 20 65 78 69 73  mats.# that exis
64b0: 74 20 61 72 65 20 76 65 72 73 69 6f 6e 73 20 33  t are versions 3
64c0: 30 30 37 30 30 30 20 28 63 6f 72 72 65 73 70 6f  007000 (correspo
64d0: 6e 64 69 6e 67 20 74 6f 20 53 51 4c 69 74 65 20  nding to SQLite 
64e0: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2c 0a 23  version 3.7.0,.#
64f0: 20 74 68 65 20 66 69 72 73 74 20 76 65 72 73 69   the first versi
6500: 6f 6e 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20  on of SQLite to 
6510: 66 65 61 74 75 72 65 20 77 61 6c 20 6d 6f 64 65  feature wal mode
6520: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c  )..#.do_test wal
6530: 32 2d 31 30 2e 31 2e 31 20 7b 0a 20 20 66 61 75  2-10.1.1 {.  fau
6540: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
6550: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
6560: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
6570: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
6580: 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  L;.    CREATE TA
6590: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
65a0: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
65b0: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 49 4e 53  ckpoint;.    INS
65c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
65d0: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e  ES(1, 2);.    IN
65e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
65f0: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 20  UES(3, 4);.  }. 
6600: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61   faultsim_save_a
6610: 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 64 6f  nd_close.} {}.do
6620: 5f 74 65 73 74 20 77 61 6c 32 2d 31 30 2e 31 2e  _test wal2-10.1.
6630: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
6640: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
6650: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  n.  execsql { SE
6660: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
6670: 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f  .} {1 2 3 4}.do_
6680: 74 65 73 74 20 77 61 6c 32 2d 31 30 2e 31 2e 33  test wal2-10.1.3
6690: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
66a0: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
66b0: 0a 20 20 73 65 74 20 68 64 72 20 5b 77 61 6c 5f  .  set hdr [wal_
66c0: 73 65 74 5f 77 61 6c 68 64 72 20 74 65 73 74 2e  set_walhdr test.
66d0: 64 62 2d 77 61 6c 5d 0a 20 20 6c 69 6e 64 65 78  db-wal].  lindex
66e0: 20 24 68 64 72 20 31 0a 7d 20 7b 33 30 30 37 30   $hdr 1.} {30070
66f0: 30 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32  00}.do_test wal2
6700: 2d 31 30 2e 31 2e 34 20 7b 0a 20 20 6c 73 65 74  -10.1.4 {.  lset
6710: 20 68 64 72 20 31 20 33 30 30 37 30 30 31 0a 20   hdr 1 3007001. 
6720: 20 77 61 6c 5f 73 65 74 5f 77 61 6c 68 64 72 20   wal_set_walhdr 
6730: 74 65 73 74 2e 64 62 2d 77 61 6c 20 24 68 64 72  test.db-wal $hdr
6740: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
6750: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
6760: 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f  .} {1 {unable to
6770: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
6780: 69 6c 65 7d 7d 0a 0a 74 65 73 74 76 66 73 20 74  ile}}..testvfs t
6790: 76 66 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 64  vfs -default 1.d
67a0: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 30 2e 32  o_test wal2-10.2
67b0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
67c0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
67d0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  en.  execsql { S
67e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
67f0: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f  }.} {1 2 3 4}.do
6800: 5f 74 65 73 74 20 77 61 6c 32 2d 31 30 2e 32 2e  _test wal2-10.2.
6810: 32 20 7b 20 0a 20 20 73 65 74 20 68 64 72 20 5b  2 { .  set hdr [
6820: 73 65 74 5f 74 76 66 73 5f 68 64 72 20 24 3a 3a  set_tvfs_hdr $::
6830: 66 69 6c 65 6e 61 6d 65 5d 20 0a 20 20 6c 69 6e  filename] .  lin
6840: 64 65 78 20 24 68 64 72 20 30 20 0a 7d 20 7b 33  dex $hdr 0 .} {3
6850: 30 30 37 30 30 30 7d 0a 64 6f 5f 74 65 73 74 20  007000}.do_test 
6860: 77 61 6c 32 2d 31 30 2e 32 2e 33 20 7b 20 0a 20  wal2-10.2.3 { . 
6870: 20 6c 73 65 74 20 68 64 72 20 30 20 33 30 30 37   lset hdr 0 3007
6880: 30 30 31 0a 20 20 77 61 6c 5f 66 69 78 5f 77 61  001.  wal_fix_wa
6890: 6c 69 6e 64 65 78 5f 63 6b 73 75 6d 20 68 64 72  lindex_cksum hdr
68a0: 20 0a 20 20 73 65 74 5f 74 76 66 73 5f 68 64 72   .  set_tvfs_hdr
68b0: 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 20 24 68 64   $::filename $hd
68c0: 72 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  r.  catchsql { S
68d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
68e0: 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74  }.} {1 {unable t
68f0: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
6900: 66 69 6c 65 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a  file}}.db close.
6910: 74 76 66 73 20 64 65 6c 65 74 65 0a 0a 23 2d 2d  tvfs delete..#--
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6960: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62  -------.# This b
6970: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20  lock of tests - 
6980: 77 61 6c 32 2d 31 31 2e 2a 20 2d 20 74 65 73 74  wal2-11.* - test
6990: 73 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  s that it is not
69a0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 70 75 74   possible to put
69b0: 0a 23 20 74 68 65 20 6c 69 62 72 61 72 79 20 69  .# the library i
69c0: 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65 20  nto an infinite 
69d0: 6c 6f 6f 70 20 62 79 20 70 72 65 73 65 6e 74 69  loop by presenti
69e0: 6e 67 20 69 74 20 77 69 74 68 20 61 20 63 6f 72  ng it with a cor
69f0: 72 75 70 74 0a 23 20 68 61 73 68 20 74 61 62 6c  rupt.# hash tabl
6a00: 65 20 28 6f 6e 65 20 74 68 61 74 20 61 70 70 65  e (one that appe
6a10: 61 72 73 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  ars to contain a
6a20: 20 73 69 6e 67 6c 65 20 63 68 61 69 6e 20 6f 66   single chain of
6a30: 20 69 6e 66 69 6e 69 74 65 20 0a 23 20 6c 65 6e   infinite .# len
6a40: 67 74 68 29 2e 0a 23 0a 23 20 20 20 77 61 6c 32  gth)..#.#   wal2
6a50: 2d 31 31 2e 31 2e 2a 3a 20 57 68 69 6c 65 20 72  -11.1.*: While r
6a60: 65 61 64 69 6e 67 20 74 68 65 20 68 61 73 68 2d  eading the hash-
6a70: 74 61 62 6c 65 2e 0a 23 0a 23 20 20 20 77 61 6c  table..#.#   wal
6a80: 32 2d 31 31 2e 32 2e 2a 3a 20 57 68 69 6c 65 20  2-11.2.*: While 
6a90: 77 72 69 74 69 6e 67 20 74 68 65 20 68 61 73 68  writing the hash
6aa0: 2d 74 61 62 6c 65 2e 0a 23 0a 74 65 73 74 76 66  -table..#.testvf
6ab0: 73 20 74 76 66 73 20 2d 64 65 66 61 75 6c 74 20  s tvfs -default 
6ac0: 31 0a 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31  1.do_test wal2-1
6ad0: 31 2e 30 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.0 {.  faultsim
6ae0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
6af0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
6b00: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
6b10: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
6b20: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
6b30: 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  1(a, b, c);.    
6b40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6b50: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a  ALUES(1, 2, 3);.
6b60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6b70: 74 31 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20  t1 VALUES(4, 5, 
6b80: 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  6);.    INSERT I
6b90: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c  NTO t1 VALUES(7,
6ba0: 20 38 2c 20 39 29 3b 0a 20 20 20 20 53 45 4c 45   8, 9);.    SELE
6bb0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
6bc0: 7d 0a 7d 20 7b 77 61 6c 20 31 20 32 20 33 20 34  }.} {wal 1 2 3 4
6bd0: 20 35 20 36 20 37 20 38 20 39 7d 0a 0a 64 6f 5f   5 6 7 8 9}..do_
6be0: 74 65 73 74 20 77 61 6c 32 2d 31 31 2e 31 2e 31  test wal2-11.1.1
6bf0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
6c00: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
6c10: 71 6c 20 7b 20 53 45 4c 45 43 54 20 6e 61 6d 65  ql { SELECT name
6c20: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
6c30: 74 65 72 20 7d 20 64 62 32 0a 7d 20 7b 74 31 7d  ter } db2.} {t1}
6c40: 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 76 65 72  ..if {$::tcl_ver
6c50: 73 69 6f 6e 3e 3d 38 2e 35 7d 20 7b 0a 20 20 23  sion>=8.5} {.  #
6c60: 20 53 65 74 20 61 6c 6c 20 7a 65 72 6f 65 64 20   Set all zeroed 
6c70: 73 6c 6f 74 73 20 69 6e 20 74 68 65 20 66 69 72  slots in the fir
6c80: 73 74 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  st hash table to
6c90: 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 73 2e   invalid values.
6ca0: 0a 20 20 23 0a 20 20 73 65 74 20 62 6c 6f 62 20  .  #.  set blob 
6cb0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 74  [string range [t
6cc0: 76 66 73 20 73 68 6d 20 24 3a 3a 66 69 6c 65 6e  vfs shm $::filen
6cd0: 61 6d 65 5d 20 30 20 31 36 33 38 33 5d 0a 20 20  ame] 0 16383].  
6ce0: 73 65 74 20 49 20 5b 73 74 72 69 6e 67 20 72 61  set I [string ra
6cf0: 6e 67 65 20 5b 74 76 66 73 20 73 68 6d 20 24 3a  nge [tvfs shm $:
6d00: 3a 66 69 6c 65 6e 61 6d 65 5d 20 31 36 33 38 34  :filename] 16384
6d10: 20 65 6e 64 5d 0a 20 20 62 69 6e 61 72 79 20 73   end].  binary s
6d20: 63 61 6e 20 24 49 20 74 2a 20 4c 0a 20 20 73 65  can $I t* L.  se
6d30: 74 20 49 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72  t I [list].  for
6d40: 65 61 63 68 20 70 20 24 4c 20 7b 0a 20 20 20 20  each p $L {.    
6d50: 6c 61 70 70 65 6e 64 20 49 20 5b 65 78 70 72 20  lappend I [expr 
6d60: 24 70 20 3f 20 24 70 20 3a 20 34 30 30 5d 0a 20  $p ? $p : 400]. 
6d70: 20 7d 0a 20 20 61 70 70 65 6e 64 20 62 6c 6f 62   }.  append blob
6d80: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
6d90: 74 2a 20 24 49 5d 0a 20 20 74 76 66 73 20 73 68  t* $I].  tvfs sh
6da0: 6d 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 20 24 62  m $::filename $b
6db0: 6c 6f 62 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  lob.  do_test wa
6dc0: 6c 32 2d 31 31 2e 32 20 7b 0a 20 20 20 20 63 61  l2-11.2 {.    ca
6dd0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
6de0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
6df0: 30 2c 20 31 31 2c 20 31 32 29 20 7d 0a 20 20 7d  0, 11, 12) }.  }
6e00: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
6e10: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
6e20: 6f 72 6d 65 64 7d 7d 0a 20 20 0a 20 20 23 20 46  ormed}}.  .  # F
6e30: 69 6c 6c 20 75 70 20 74 68 65 20 68 61 73 68 20  ill up the hash 
6e40: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 66 69 72  table on the fir
6e50: 73 74 20 70 61 67 65 20 6f 66 20 73 68 61 72 65  st page of share
6e60: 64 20 6d 65 6d 6f 72 79 20 77 69 74 68 20 30 78  d memory with 0x
6e70: 35 35 20 62 79 74 65 73 2e 0a 20 20 23 0a 20 20  55 bytes..  #.  
6e80: 73 65 74 20 62 6c 6f 62 20 5b 73 74 72 69 6e 67  set blob [string
6e90: 20 72 61 6e 67 65 20 5b 74 76 66 73 20 73 68 6d   range [tvfs shm
6ea0: 20 24 3a 3a 66 69 6c 65 6e 61 6d 65 5d 20 30 20   $::filename] 0 
6eb0: 31 36 33 38 33 5d 0a 20 20 61 70 70 65 6e 64 20  16383].  append 
6ec0: 62 6c 6f 62 20 5b 73 74 72 69 6e 67 20 72 65 70  blob [string rep
6ed0: 65 61 74 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  eat [binary form
6ee0: 61 74 20 63 20 35 35 5d 20 31 36 33 38 34 5d 0a  at c 55] 16384].
6ef0: 20 20 74 76 66 73 20 73 68 6d 20 24 3a 3a 66 69    tvfs shm $::fi
6f00: 6c 65 6e 61 6d 65 20 24 62 6c 6f 62 0a 20 20 64  lename $blob.  d
6f10: 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 31 2e 33  o_test wal2-11.3
6f20: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
6f30: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6f40: 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20  t1 } db2.  } {1 
6f50: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
6f60: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
6f70: 64 7d 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a  d}}.}..db close.
6f80: 64 62 32 20 63 6c 6f 73 65 0a 74 76 66 73 20 64  db2 close.tvfs d
6f90: 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  elete..#--------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fe0: 2d 0a 23 20 49 66 20 61 20 63 6f 6e 6e 65 63 74  -.# If a connect
6ff0: 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
7000: 74 6f 20 63 72 65 61 74 65 20 61 20 57 41 4c 20  to create a WAL 
7010: 6f 72 20 53 48 4d 20 66 69 6c 65 2c 20 69 74 20  or SHM file, it 
7020: 63 72 65 61 74 65 73 20 0a 23 20 74 68 65 20 6e  creates .# the n
7030: 65 77 20 66 69 6c 65 73 20 77 69 74 68 20 74 68  ew files with th
7040: 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
7050: 65 6d 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61  em permissions a
7060: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  s the database .
7070: 23 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 20 54  # file itself. T
7080: 65 73 74 20 74 68 69 73 2e 0a 23 0a 69 66 20 7b  est this..#.if {
7090: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
70a0: 70 6c 61 74 66 6f 72 6d 29 20 3d 3d 20 22 75 6e  platform) == "un
70b0: 69 78 22 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69  ix"} {.  faultsi
70c0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
70d0: 70 65 6e 0a 20 20 23 20 43 68 61 6e 67 65 64 20  pen.  # Changed 
70e0: 6f 6e 20 32 30 31 32 2d 30 32 2d 31 33 3a 20 75  on 2012-02-13: u
70f0: 6d 61 73 6b 20 69 73 20 64 65 6c 69 62 65 72 61  mask is delibera
7100: 74 65 6c 79 20 69 67 6e 6f 72 65 64 20 66 6f 72  tely ignored for
7110: 20 2d 77 61 6c 20 66 69 6c 65 73 2e 0a 20 20 23   -wal files..  #
7120: 73 65 74 20 75 6d 61 73 6b 20 5b 65 78 65 63 20  set umask [exec 
7130: 2f 62 69 6e 2f 73 68 20 2d 63 20 75 6d 61 73 6b  /bin/sh -c umask
7140: 5d 0a 20 20 73 65 74 20 75 6d 61 73 6b 20 30 0a  ].  set umask 0.
7150: 20 20 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    ..  do_test wa
7160: 6c 32 2d 31 32 2e 31 20 7b 0a 20 20 20 20 73 71  l2-12.1 {.    sq
7170: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
7180: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
7190: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
71a0: 4c 45 20 74 78 28 79 2c 20 7a 29 3b 0a 20 20 20  LE tx(y, z);.   
71b0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
71c0: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
71d0: 20 20 7d 0a 20 20 20 20 64 62 20 63 6c 6f 73 65    }.    db close
71e0: 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20  .    list [file 
71f0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77  exists test.db-w
7200: 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73  al] [file exists
7210: 20 74 65 73 74 2e 64 62 2d 73 68 6d 5d 0a 20 20   test.db-shm].  
7220: 7d 20 7b 30 20 30 7d 0a 20 20 0a 20 20 66 6f 72  } {0 0}.  .  for
7230: 65 61 63 68 20 7b 74 6e 20 70 65 72 6d 69 73 73  each {tn permiss
7240: 69 6f 6e 73 7d 20 7b 0a 20 20 20 31 20 30 30 36  ions} {.   1 006
7250: 34 34 0a 20 20 20 32 20 30 30 36 36 36 0a 20 20  44.   2 00666.  
7260: 20 33 20 30 30 36 30 30 0a 20 20 20 34 20 30 30   3 00600.   4 00
7270: 37 35 35 0a 20 20 7d 20 7b 0a 20 20 20 20 73 65  755.  } {.    se
7280: 74 20 65 66 66 65 63 74 69 76 65 20 5b 66 6f 72  t effective [for
7290: 6d 61 74 20 25 2e 35 6f 20 5b 65 78 70 72 20 24  mat %.5o [expr $
72a0: 70 65 72 6d 69 73 73 69 6f 6e 73 20 26 20 7e 24  permissions & ~$
72b0: 75 6d 61 73 6b 5d 5d 0a 20 20 20 20 64 6f 5f 74  umask]].    do_t
72c0: 65 73 74 20 77 61 6c 32 2d 31 32 2e 32 2e 24 74  est wal2-12.2.$t
72d0: 6e 2e 31 20 7b 0a 20 20 20 20 20 20 66 69 6c 65  n.1 {.      file
72e0: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
72f0: 2e 64 62 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73  .db -permissions
7300: 20 24 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20 20   $permissions.  
7310: 20 20 20 20 66 69 6c 65 20 61 74 74 72 69 62 75      file attribu
7320: 74 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72  tes test.db -per
7330: 6d 69 73 73 69 6f 6e 73 0a 20 20 20 20 7d 20 24  missions.    } $
7340: 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20 20 20 20  permissions.    
7350: 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31 32 2e  do_test wal2-12.
7360: 32 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20  2.$tn.2 {.      
7370: 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74  list [file exist
7380: 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 5b  s test.db-wal] [
7390: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
73a0: 2e 64 62 2d 73 68 6d 5d 0a 20 20 20 20 7d 20 7b  .db-shm].    } {
73b0: 30 20 30 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  0 0}.    do_test
73c0: 20 77 61 6c 32 2d 31 32 2e 32 2e 24 74 6e 2e 33   wal2-12.2.$tn.3
73d0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
73e0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20   db test.db.    
73f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
7400: 52 54 20 49 4e 54 4f 20 74 78 20 44 45 46 41 55  RT INTO tx DEFAU
7410: 4c 54 20 56 41 4c 55 45 53 20 7d 0a 20 20 20 20  LT VALUES }.    
7420: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69    list [file exi
7430: 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  sts test.db-wal]
7440: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65   [file exists te
7450: 73 74 2e 64 62 2d 73 68 6d 5d 0a 20 20 20 20 7d  st.db-shm].    }
7460: 20 7b 31 20 31 7d 0a 20 20 20 20 64 6f 5f 74 65   {1 1}.    do_te
7470: 73 74 20 77 61 6c 32 2d 31 32 2e 32 2e 24 74 6e  st wal2-12.2.$tn
7480: 2e 34 20 7b 0a 20 20 20 20 20 20 6c 69 73 74 20  .4 {.      list 
7490: 5b 66 69 6c 65 20 61 74 74 72 20 74 65 73 74 2e  [file attr test.
74a0: 64 62 2d 77 61 6c 20 2d 70 65 72 6d 5d 20 5b 66  db-wal -perm] [f
74b0: 69 6c 65 20 61 74 74 72 20 74 65 73 74 2e 64 62  ile attr test.db
74c0: 2d 73 68 6d 20 2d 70 65 72 6d 5d 0a 20 20 20 20  -shm -perm].    
74d0: 7d 20 5b 6c 69 73 74 20 24 65 66 66 65 63 74 69  } [list $effecti
74e0: 76 65 20 24 65 66 66 65 63 74 69 76 65 5d 0a 20  ve $effective]. 
74f0: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d     do_test wal2-
7500: 31 32 2e 32 2e 24 74 6e 2e 35 20 7b 0a 20 20 20  12.2.$tn.5 {.   
7510: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
7520: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69    list [file exi
7530: 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  sts test.db-wal]
7540: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65   [file exists te
7550: 73 74 2e 64 62 2d 73 68 6d 5d 0a 20 20 20 20 7d  st.db-shm].    }
7560: 20 7b 30 20 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d   {0 0}.  }.}..#-
7570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
75c0: 74 68 65 20 6c 69 62 72 61 72 69 65 73 20 72 65  the libraries re
75d0: 73 70 6f 6e 73 65 20 74 6f 20 64 69 73 63 6f 76  sponse to discov
75e0: 65 72 69 6e 67 20 74 68 61 74 20 6f 6e 65 20 6f  ering that one o
75f0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 0a 23 20  r more of the.# 
7600: 64 61 74 61 62 61 73 65 2c 20 77 61 6c 20 6f 72  database, wal or
7610: 20 73 68 6d 20 66 69 6c 65 73 20 63 61 6e 6e 6f   shm files canno
7620: 74 20 62 65 20 6f 70 65 6e 65 64 2c 20 6f 72 20  t be opened, or 
7630: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 6f 70 65 6e  can only be open
7640: 65 64 0a 23 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  ed.# read-only..
7650: 23 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61  #.if {$::tcl_pla
7660: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 20  tform(platform) 
7670: 3d 3d 20 22 75 6e 69 78 22 7d 20 7b 0a 20 20 70  == "unix"} {.  p
7680: 72 6f 63 20 70 65 72 6d 20 7b 7d 20 7b 0a 20 20  roc perm {} {.  
7690: 20 20 73 65 74 20 4c 20 5b 6c 69 73 74 5d 0a 20    set L [list]. 
76a0: 20 20 20 66 6f 72 65 61 63 68 20 66 20 7b 74 65     foreach f {te
76b0: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61  st.db test.db-wa
76c0: 6c 20 74 65 73 74 2e 64 62 2d 73 68 6d 7d 20 7b  l test.db-shm} {
76d0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65  .      if {[file
76e0: 20 65 78 69 73 74 73 20 24 66 5d 7d 20 7b 0a 20   exists $f]} {. 
76f0: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 4c         lappend L
7700: 20 5b 66 69 6c 65 20 61 74 74 72 20 24 66 20 2d   [file attr $f -
7710: 70 65 72 6d 5d 0a 20 20 20 20 20 20 7d 20 65 6c  perm].      } el
7720: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 70  se {.        lap
7730: 70 65 6e 64 20 4c 20 7b 7d 0a 20 20 20 20 20 20  pend L {}.      
7740: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20  }.    }.    set 
7750: 4c 0a 20 20 7d 0a 0a 20 20 66 61 75 6c 74 73 69  L.  }..  faultsi
7760: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
7770: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
7780: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7790: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
77a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
77b0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52  t1(a, b);.    PR
77c0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
77d0: 69 6e 74 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  int;.    INSERT 
77e0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
77f0: 33 2e 31 34 27 2c 20 27 32 2e 37 32 27 29 3b 0a  3.14', '2.72');.
7800: 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    }.  do_test wa
7810: 6c 32 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 20 20  l2-13.1.1 {.    
7820: 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74  list [file exist
7830: 73 20 74 65 73 74 2e 64 62 2d 73 68 6d 5d 20 5b  s test.db-shm] [
7840: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
7850: 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 7b 31 20  .db-wal].  } {1 
7860: 31 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61  1}.  faultsim_sa
7870: 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 0a 20 20  ve_and_close..  
7880: 66 6f 72 65 61 63 68 20 7b 74 6e 20 64 62 5f 70  foreach {tn db_p
7890: 65 72 6d 20 77 61 6c 5f 70 65 72 6d 20 73 68 6d  erm wal_perm shm
78a0: 5f 70 65 72 6d 20 63 61 6e 5f 6f 70 65 6e 20 63  _perm can_open c
78b0: 61 6e 5f 72 65 61 64 20 63 61 6e 5f 77 72 69 74  an_read can_writ
78c0: 65 7d 20 7b 0a 20 20 20 20 32 20 20 20 30 30 36  e} {.    2   006
78d0: 34 34 20 20 20 30 30 36 34 34 20 20 20 30 30 36  44   00644   006
78e0: 34 34 20 20 20 31 20 20 20 31 20 20 20 31 0a 20  44   1   1   1. 
78f0: 20 20 20 33 20 20 20 30 30 36 34 34 20 20 20 30     3   00644   0
7900: 30 34 30 30 20 20 20 30 30 36 34 34 20 20 20 31  0400   00644   1
7910: 20 20 20 31 20 20 20 30 0a 20 20 20 20 34 20 20     1   0.    4  
7920: 20 30 30 36 34 34 20 20 20 30 30 36 34 34 20 20   00644   00644  
7930: 20 30 30 34 30 30 20 20 20 31 20 20 20 30 20 20   00400   1   0  
7940: 20 30 0a 20 20 20 20 35 20 20 20 30 30 34 30 30   0.    5   00400
7950: 20 20 20 30 30 36 34 34 20 20 20 30 30 36 34 34     00644   00644
7960: 20 20 20 31 20 20 20 31 20 20 20 30 0a 0a 20 20     1   1   0..  
7970: 20 20 37 20 20 20 30 30 36 34 34 20 20 20 30 30    7   00644   00
7980: 30 30 30 20 20 20 30 30 36 34 34 20 20 20 31 20  000   00644   1 
7990: 20 20 30 20 20 20 30 0a 20 20 20 20 38 20 20 20    0   0.    8   
79a0: 30 30 36 34 34 20 20 20 30 30 36 34 34 20 20 20  00644   00644   
79b0: 30 30 30 30 30 20 20 20 31 20 20 20 30 20 20 20  00000   1   0   
79c0: 30 0a 20 20 20 20 39 20 20 20 30 30 30 30 30 20  0.    9   00000 
79d0: 20 20 30 30 36 34 34 20 20 20 30 30 36 34 34 20    00644   00644 
79e0: 20 20 30 20 20 20 30 20 20 20 30 0a 20 20 7d 20    0   0   0.  } 
79f0: 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72  {.    faultsim_r
7a00: 65 73 74 6f 72 65 0a 20 20 20 20 64 6f 5f 74 65  estore.    do_te
7a10: 73 74 20 77 61 6c 32 2d 31 33 2e 24 74 6e 2e 31  st wal2-13.$tn.1
7a20: 20 7b 0a 20 20 20 20 20 20 66 69 6c 65 20 61 74   {.      file at
7a30: 74 72 20 74 65 73 74 2e 64 62 20 20 20 20 20 2d  tr test.db     -
7a40: 70 65 72 6d 20 24 64 62 5f 70 65 72 6d 0a 20 20  perm $db_perm.  
7a50: 20 20 20 20 66 69 6c 65 20 61 74 74 72 20 74 65      file attr te
7a60: 73 74 2e 64 62 2d 77 61 6c 20 2d 70 65 72 6d 20  st.db-wal -perm 
7a70: 24 77 61 6c 5f 70 65 72 6d 0a 20 20 20 20 20 20  $wal_perm.      
7a80: 66 69 6c 65 20 61 74 74 72 20 74 65 73 74 2e 64  file attr test.d
7a90: 62 2d 73 68 6d 20 2d 70 65 72 6d 20 24 73 68 6d  b-shm -perm $shm
7aa0: 5f 70 65 72 6d 0a 0a 20 20 20 20 20 20 73 65 74  _perm..      set
7ab0: 20 20 20 20 20 4c 20 5b 66 69 6c 65 20 61 74 74       L [file att
7ac0: 72 20 74 65 73 74 2e 64 62 20 2d 70 65 72 6d 5d  r test.db -perm]
7ad0: 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 4c  .      lappend L
7ae0: 20 5b 66 69 6c 65 20 61 74 74 72 20 74 65 73 74   [file attr test
7af0: 2e 64 62 2d 77 61 6c 20 2d 70 65 72 6d 5d 0a 20  .db-wal -perm]. 
7b00: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 4c 20 5b       lappend L [
7b10: 66 69 6c 65 20 61 74 74 72 20 74 65 73 74 2e 64  file attr test.d
7b20: 62 2d 73 68 6d 20 2d 70 65 72 6d 5d 0a 20 20 20  b-shm -perm].   
7b30: 20 7d 20 5b 6c 69 73 74 20 24 64 62 5f 70 65 72   } [list $db_per
7b40: 6d 20 24 77 61 6c 5f 70 65 72 6d 20 24 73 68 6d  m $wal_perm $shm
7b50: 5f 70 65 72 6d 5d 0a 0a 20 20 20 20 23 20 49 66  _perm]..    # If
7b60: 20 24 63 61 6e 5f 6f 70 65 6e 20 69 73 20 74 72   $can_open is tr
7b70: 75 65 2c 20 74 68 65 6e 20 69 74 20 73 68 6f 75  ue, then it shou
7b80: 6c 64 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ld be possible t
7b90: 6f 20 6f 70 65 6e 20 61 20 64 61 74 61 62 61 73  o open a databas
7ba0: 65 0a 20 20 20 20 23 20 68 61 6e 64 6c 65 2e 20  e.    # handle. 
7bb0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 24 63  Otherwise, if $c
7bc0: 61 6e 5f 6f 70 65 6e 20 69 73 20 30 2c 20 61 74  an_open is 0, at
7bd0: 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e  tempting to open
7be0: 20 74 68 65 20 64 62 0a 20 20 20 20 23 20 68 61   the db.    # ha
7bf0: 6e 64 6c 65 20 74 68 72 6f 77 73 20 61 6e 20 22  ndle throws an "
7c00: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
7c10: 61 74 61 62 61 73 65 20 66 69 6c 65 22 20 65 78  atabase file" ex
7c20: 63 65 70 74 69 6f 6e 2e 0a 20 20 20 20 23 0a 20  ception..    #. 
7c30: 20 20 20 73 65 74 20 72 28 31 29 20 7b 30 20 6f     set r(1) {0 o
7c40: 6b 7d 0a 20 20 20 20 73 65 74 20 72 28 30 29 20  k}.    set r(0) 
7c50: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70  {1 {unable to op
7c60: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
7c70: 7d 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77  }}.    do_test w
7c80: 61 6c 32 2d 31 33 2e 24 74 6e 2e 32 20 7b 0a 20  al2-13.$tn.2 {. 
7c90: 20 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68       list [catch
7ca0: 20 7b 73 71 6c 69 74 65 33 20 64 62 20 74 65 73   {sqlite3 db tes
7cb0: 74 2e 64 62 20 3b 20 73 65 74 20 7b 7d 20 6f 6b  t.db ; set {} ok
7cc0: 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 20 20  } msg] $msg.    
7cd0: 7d 20 24 72 28 24 63 61 6e 5f 6f 70 65 6e 29 0a  } $r($can_open).
7ce0: 0a 20 20 20 20 69 66 20 7b 24 63 61 6e 5f 6f 70  .    if {$can_op
7cf0: 65 6e 7d 20 7b 0a 0a 20 20 20 20 20 20 23 20 49  en} {..      # I
7d00: 66 20 24 63 61 6e 5f 72 65 61 64 20 69 73 20 74  f $can_read is t
7d10: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6c  rue, then the cl
7d20: 69 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 61  ient should be a
7d30: 62 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ble to read from
7d40: 0a 20 20 20 20 20 20 23 20 74 68 65 20 64 61 74  .      # the dat
7d50: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 24  abase file. If $
7d60: 63 61 6e 5f 72 65 61 64 20 69 73 20 66 61 6c 73  can_read is fals
7d70: 65 2c 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  e, attempting to
7d80: 20 72 65 61 64 20 73 68 6f 75 6c 64 0a 20 20 20   read should.   
7d90: 20 20 20 23 20 74 68 72 6f 77 20 74 68 65 20 22     # throw the "
7da0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
7db0: 61 74 61 62 61 73 65 20 66 69 6c 65 22 20 65 78  atabase file" ex
7dc0: 63 65 70 74 69 6f 6e 2e 20 0a 20 20 20 20 20 20  ception. .      
7dd0: 23 0a 20 20 20 20 20 20 73 65 74 20 61 28 30 29  #.      set a(0)
7de0: 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f   {1 {unable to o
7df0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
7e00: 65 7d 7d 0a 20 20 20 20 20 20 73 65 74 20 61 28  e}}.      set a(
7e10: 31 29 20 7b 30 20 7b 33 2e 31 34 20 32 2e 37 32  1) {0 {3.14 2.72
7e20: 7d 7d 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74  }}.      do_test
7e30: 20 77 61 6c 32 2d 31 33 2e 24 74 6e 2e 33 20 7b   wal2-13.$tn.3 {
7e40: 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 73 71  .        catchsq
7e50: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
7e60: 4d 20 74 31 20 7d 0a 20 20 20 20 20 20 7d 20 24  M t1 }.      } $
7e70: 61 28 24 63 61 6e 5f 72 65 61 64 29 0a 20 20 0a  a($can_read).  .
7e80: 20 20 20 20 20 20 23 20 4e 6f 77 20 74 72 79 20        # Now try 
7e90: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
7ea0: 64 62 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  db file. If the 
7eb0: 63 6c 69 65 6e 74 20 63 61 6e 20 72 65 61 64 20  client can read 
7ec0: 62 75 74 20 6e 6f 74 0a 20 20 20 20 20 20 23 20  but not.      # 
7ed0: 77 72 69 74 65 2c 20 74 68 65 6e 20 69 74 20 73  write, then it s
7ee0: 68 6f 75 6c 64 20 74 68 72 6f 77 20 74 68 65 20  hould throw the 
7ef0: 66 61 6d 69 6c 69 61 72 20 22 75 6e 61 62 6c 65  familiar "unable
7f00: 20 74 6f 20 6f 70 65 6e 20 64 62 20 66 69 6c 65   to open db file
7f10: 22 0a 20 20 20 20 20 20 23 20 65 78 63 65 70 74  ".      # except
7f20: 69 6f 6e 2e 20 49 66 20 69 74 20 63 61 6e 20 72  ion. If it can r
7f30: 65 61 64 20 62 75 74 20 6e 6f 74 20 77 72 69 74  ead but not writ
7f40: 65 2c 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e  e, the exception
7f50: 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 23 20   should.      # 
7f60: 62 65 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77  be "attempt to w
7f70: 72 69 74 65 20 61 20 72 65 61 64 20 6f 6e 6c 79  rite a read only
7f80: 20 64 61 74 61 62 61 73 65 22 2e 0a 20 20 20 20   database"..    
7f90: 20 20 23 0a 20 20 20 20 20 20 23 20 49 66 20 74    #.      # If t
7fa0: 68 65 20 63 6c 69 65 6e 74 20 63 61 6e 20 72 65  he client can re
7fb0: 61 64 20 61 6e 64 20 77 72 69 74 65 2c 20 74 68  ad and write, th
7fc0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 68 6f 75  e operation shou
7fd0: 6c 64 20 73 75 63 63 65 65 64 2e 0a 20 20 20 20  ld succeed..    
7fe0: 20 20 23 0a 20 20 20 20 20 20 73 65 74 20 62 28    #.      set b(
7ff0: 30 2c 30 29 20 7b 31 20 7b 75 6e 61 62 6c 65 20  0,0) {1 {unable 
8000: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
8010: 20 66 69 6c 65 7d 7d 0a 20 20 20 20 20 20 73 65   file}}.      se
8020: 74 20 62 28 31 2c 30 29 20 7b 31 20 7b 61 74 74  t b(1,0) {1 {att
8030: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20  empt to write a 
8040: 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73  readonly databas
8050: 65 7d 7d 0a 20 20 20 20 20 20 73 65 74 20 62 28  e}}.      set b(
8060: 31 2c 31 29 20 7b 30 20 7b 7d 7d 0a 20 20 20 20  1,1) {0 {}}.    
8070: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 32 2d 31    do_test wal2-1
8080: 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 20 20  3.$tn.4 {.      
8090: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
80a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 44 45 46 41  ERT INTO t1 DEFA
80b0: 55 4c 54 20 56 41 4c 55 45 53 20 7d 0a 20 20 20  ULT VALUES }.   
80c0: 20 20 20 7d 20 24 62 28 24 63 61 6e 5f 72 65 61     } $b($can_rea
80d0: 64 2c 24 63 61 6e 5f 77 72 69 74 65 29 0a 20 20  d,$can_write).  
80e0: 20 20 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20    }.    catch { 
80f0: 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 7d 0a 7d  db close }.  }.}
8100: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
8150: 65 73 74 20 74 68 61 74 20 22 50 52 41 47 4d 41  est that "PRAGMA
8160: 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c   checkpoint_full
8170: 73 79 6e 63 22 20 61 70 70 65 61 72 73 20 74 6f  sync" appears to
8180: 20 62 65 20 77 6f 72 6b 69 6e 67 2e 0a 23 0a 66   be working..#.f
8190: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72  oreach {tn sql r
81a0: 65 73 6c 69 73 74 7d 20 7b 0a 20 20 31 20 7b 20  eslist} {.  1 { 
81b0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 7b 31 30 20 30 20 34 20 30 20 36 20 30 7d    {10 0 4 0 6 0}
81e0: 0a 20 20 32 20 7b 20 50 52 41 47 4d 41 20 63 68  .  2 { PRAGMA ch
81f0: 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79  eckpoint_fullfsy
8200: 6e 63 20 3d 20 31 20 7d 20 7b 31 30 20 36 20 34  nc = 1 } {10 6 4
8210: 20 33 20 36 20 33 7d 0a 20 20 33 20 7b 20 50 52   3 6 3}.  3 { PR
8220: 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f  AGMA checkpoint_
8230: 66 75 6c 6c 66 73 79 6e 63 20 3d 20 30 20 7d 20  fullfsync = 0 } 
8240: 7b 31 30 20 30 20 34 20 30 20 36 20 30 7d 0a 7d  {10 0 4 0 6 0}.}
8250: 20 7b 0a 20 20 69 66 63 61 70 61 62 6c 65 20 64   {.  ifcapable d
8260: 65 66 61 75 6c 74 5f 63 6b 70 74 66 75 6c 6c 66  efault_ckptfullf
8270: 73 79 6e 63 20 7b 0a 20 20 20 20 69 66 20 7b 5b  sync {.    if {[
8280: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71 6c  string trim $sql
8290: 5d 3d 3d 22 22 7d 20 63 6f 6e 74 69 6e 75 65 0a  ]==""} continue.
82a0: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64    }.  faultsim_d
82b0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
82c0: 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41  ..  execsql {PRA
82d0: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
82e0: 3d 20 30 3b 20 50 52 41 47 4d 41 20 73 79 6e 63  = 0; PRAGMA sync
82f0: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 3b 7d  hronous = FULL;}
8300: 0a 20 20 65 78 65 63 73 71 6c 20 24 73 71 6c 0a  .  execsql $sql.
8310: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
8320: 74 20 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 30 20  t wal2-14.$tn.0 
8330: 7b 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69  { PRAGMA page_si
8340: 7a 65 20 3d 20 34 30 39 36 20 7d 20 20 20 7b 7d  ze = 4096 }   {}
8350: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
8360: 73 74 20 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 31  st wal2-14.$tn.1
8370: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
8380: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20 7b  l_mode = WAL } {
8390: 77 61 6c 7d 0a 0a 20 20 73 65 74 20 73 71 6c 69  wal}..  set sqli
83a0: 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 30 0a  te_sync_count 0.
83b0: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 66 75 6c    set sqlite_ful
83c0: 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 30 0a 0a 20  lsync_count 0.. 
83d0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
83e0: 20 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 32 20 7b   wal2-14.$tn.2 {
83f0: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
8400: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d  autocheckpoint =
8410: 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20   10;.    CREATE 
8420: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 20  TABLE t1(a, b); 
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
8440: 2d 20 32 20 77 61 6c 20 73 79 6e 63 73 0a 20 20  - 2 wal syncs.  
8450: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
8460: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 20 20   VALUES(1, 2);  
8470: 20 20 20 20 20 20 20 20 2d 2d 20 32 20 77 61 6c          -- 2 wal
8480: 20 73 79 6e 63 0a 20 20 20 20 50 52 41 47 4d 41   sync.    PRAGMA
8490: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b   wal_checkpoint;
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 2d 2d 20 31 20 77 61 6c 20 73 79 6e 63 2c 20 31  -- 1 wal sync, 1
84c0: 20 64 62 20 73 79 6e 63 0a 20 20 20 20 42 45 47   db sync.    BEG
84d0: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
84e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
84f0: 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 49 4e 53  3, 4);.      INS
8500: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8510: 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 43 4f  ES(5, 6);.    CO
8520: 4d 4d 49 54 3b 20 20 20 20 20 20 20 20 20 20 20  MMIT;           
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 2d 2d 20 32 20 77 61 6c 20 73 79 6e      -- 2 wal syn
8550: 63 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c  c.    PRAGMA wal
8560: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 20 20 20 20  _checkpoint;    
8570: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
8580: 20 77 61 6c 20 73 79 6e 63 2c 20 31 20 64 62 20   wal sync, 1 db 
8590: 73 79 6e 63 0a 20 20 7d 20 7b 31 30 20 30 20 33  sync.  } {10 0 3
85a0: 20 33 20 30 20 31 20 31 7d 0a 0a 20 20 64 6f 5f   3 0 1 1}..  do_
85b0: 74 65 73 74 20 77 61 6c 32 2d 31 34 2e 24 74 6e  test wal2-14.$tn
85c0: 2e 33 20 7b 0a 20 20 20 20 63 6f 6e 64 5f 69 6e  .3 {.    cond_in
85d0: 63 72 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 31 0a  cr_sync_count 1.
85e0: 20 20 20 20 6c 69 73 74 20 24 73 71 6c 69 74 65      list $sqlite
85f0: 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 24 73 71 6c  _sync_count $sql
8600: 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  ite_fullsync_cou
8610: 6e 74 0a 20 20 7d 20 5b 6c 72 61 6e 67 65 20 24  nt.  } [lrange $
8620: 72 65 73 6c 69 73 74 20 30 20 31 5d 0a 0a 20 20  reslist 0 1]..  
8630: 73 65 74 20 73 71 6c 69 74 65 5f 73 79 6e 63 5f  set sqlite_sync_
8640: 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20 73 71  count 0.  set sq
8650: 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  lite_fullsync_co
8660: 75 6e 74 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74  unt 0..  do_test
8670: 20 77 61 6c 32 2d 31 34 2e 24 74 6e 2e 34 20 7b   wal2-14.$tn.4 {
8680: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
8690: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
86a0: 4c 55 45 53 28 37 2c 20 7a 65 72 6f 62 6c 6f 62  LUES(7, zeroblob
86b0: 28 31 32 2a 34 30 39 36 29 29 20 7d 0a 20 20 20  (12*4096)) }.   
86c0: 20 6c 69 73 74 20 24 73 71 6c 69 74 65 5f 73 79   list $sqlite_sy
86d0: 6e 63 5f 63 6f 75 6e 74 20 24 73 71 6c 69 74 65  nc_count $sqlite
86e0: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 0a  _fullsync_count.
86f0: 20 20 7d 20 5b 6c 72 61 6e 67 65 20 24 72 65 73    } [lrange $res
8700: 6c 69 73 74 20 32 20 33 5d 0a 0a 20 20 73 65 74  list 2 3]..  set
8710: 20 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75   sqlite_sync_cou
8720: 6e 74 20 30 0a 20 20 73 65 74 20 73 71 6c 69 74  nt 0.  set sqlit
8730: 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  e_fullsync_count
8740: 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61   0..  do_test wa
8750: 6c 32 2d 31 34 2e 24 74 6e 2e 35 20 7b 0a 20 20  l2-14.$tn.5 {.  
8760: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
8770: 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  MA wal_autocheck
8780: 70 6f 69 6e 74 20 3d 20 31 30 30 30 20 7d 0a 20  point = 1000 }. 
8790: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
87a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
87b0: 45 53 28 39 2c 20 31 30 29 20 7d 0a 20 20 20 20  ES(9, 10) }.    
87c0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
87d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
87e0: 31 31 2c 20 31 32 29 20 7d 0a 20 20 20 20 65 78  11, 12) }.    ex
87f0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
8800: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 33  NTO t1 VALUES(13
8810: 2c 20 31 34 29 20 7d 0a 20 20 20 20 64 62 20 63  , 14) }.    db c
8820: 6c 6f 73 65 0a 20 20 20 20 6c 69 73 74 20 24 73  lose.    list $s
8830: 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74  qlite_sync_count
8840: 20 24 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e   $sqlite_fullsyn
8850: 63 5f 63 6f 75 6e 74 0a 20 20 7d 20 5b 6c 72 61  c_count.  } [lra
8860: 6e 67 65 20 24 72 65 73 6c 69 73 74 20 34 20 35  nge $reslist 4 5
8870: 5d 0a 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62 20  ].}..catch { db 
8880: 63 6c 6f 73 65 20 7d 0a 0a 23 20 50 52 41 47 4d  close }..# PRAGM
8890: 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c  A checkpoint_ful
88a0: 6c 73 79 6e 63 0a 23 20 50 52 41 47 4d 41 20 66  lsync.# PRAGMA f
88b0: 75 6c 6c 66 73 79 6e 63 0a 23 20 50 52 41 47 4d  ullfsync.# PRAGM
88c0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 23 0a  A synchronous.#.
88d0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65 74 74  foreach {tn sett
88e0: 69 6e 67 73 20 72 65 73 74 61 72 74 5f 73 79 6e  ings restart_syn
88f0: 63 20 63 6f 6d 6d 69 74 5f 73 79 6e 63 20 63 6b  c commit_sync ck
8900: 70 74 5f 73 79 6e 63 7d 20 7b 0a 20 20 31 20 20  pt_sync} {.  1  
8910: 7b 30 20 30 20 6f 66 66 7d 20 20 20 20 20 7b 30  {0 0 off}     {0
8920: 20 30 7d 20 20 7b 30 20 30 7d 20 20 7b 30 20 30   0}  {0 0}  {0 0
8930: 7d 0a 20 20 32 20 20 7b 30 20 30 20 6e 6f 72 6d  }.  2  {0 0 norm
8940: 61 6c 7d 20 20 7b 31 20 30 7d 20 20 7b 30 20 30  al}  {1 0}  {0 0
8950: 7d 20 20 7b 32 20 30 7d 0a 20 20 33 20 20 7b 30  }  {2 0}.  3  {0
8960: 20 30 20 66 75 6c 6c 7d 20 20 20 20 7b 32 20 30   0 full}    {2 0
8970: 7d 20 20 7b 31 20 30 7d 20 20 7b 32 20 30 7d 0a  }  {1 0}  {2 0}.
8980: 0a 20 20 34 20 20 7b 30 20 31 20 6f 66 66 7d 20  .  4  {0 1 off} 
8990: 20 20 20 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d      {0 0}  {0 0}
89a0: 20 20 7b 30 20 30 7d 0a 20 20 35 20 20 7b 30 20    {0 0}.  5  {0 
89b0: 31 20 6e 6f 72 6d 61 6c 7d 20 20 7b 30 20 31 7d  1 normal}  {0 1}
89c0: 20 20 7b 30 20 30 7d 20 20 7b 30 20 32 7d 0a 20    {0 0}  {0 2}. 
89d0: 20 36 20 20 7b 30 20 31 20 66 75 6c 6c 7d 20 20   6  {0 1 full}  
89e0: 20 20 7b 30 20 32 7d 20 20 7b 30 20 31 7d 20 20    {0 2}  {0 1}  
89f0: 7b 30 20 32 7d 0a 0a 20 20 37 20 20 7b 31 20 30  {0 2}..  7  {1 0
8a00: 20 6f 66 66 7d 20 20 20 20 20 7b 30 20 30 7d 20   off}     {0 0} 
8a10: 20 7b 30 20 30 7d 20 20 7b 30 20 30 7d 0a 20 20   {0 0}  {0 0}.  
8a20: 38 20 20 7b 31 20 30 20 6e 6f 72 6d 61 6c 7d 20  8  {1 0 normal} 
8a30: 20 7b 30 20 31 7d 20 20 7b 30 20 30 7d 20 20 7b   {0 1}  {0 0}  {
8a40: 30 20 32 7d 0a 20 20 39 20 20 7b 31 20 30 20 66  0 2}.  9  {1 0 f
8a50: 75 6c 6c 7d 20 20 20 20 7b 31 20 31 7d 20 20 7b  ull}    {1 1}  {
8a60: 31 20 30 7d 20 20 7b 30 20 32 7d 0a 0a 20 20 31  1 0}  {0 2}..  1
8a70: 30 20 7b 31 20 31 20 6f 66 66 7d 20 20 20 20 20  0 {1 1 off}     
8a80: 7b 30 20 30 7d 20 20 7b 30 20 30 7d 20 20 7b 30  {0 0}  {0 0}  {0
8a90: 20 30 7d 0a 20 20 31 31 20 7b 31 20 31 20 6e 6f   0}.  11 {1 1 no
8aa0: 72 6d 61 6c 7d 20 20 7b 30 20 31 7d 20 20 7b 30  rmal}  {0 1}  {0
8ab0: 20 30 7d 20 20 7b 30 20 32 7d 0a 20 20 31 32 20   0}  {0 2}.  12 
8ac0: 7b 31 20 31 20 66 75 6c 6c 7d 20 20 20 20 7b 30  {1 1 full}    {0
8ad0: 20 32 7d 20 20 7b 30 20 31 7d 20 20 7b 30 20 32   2}  {0 1}  {0 2
8ae0: 7d 0a 7d 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c  }.} {.  forcedel
8af0: 65 74 65 20 74 65 73 74 2e 64 62 0a 0a 20 20 74  ete test.db..  t
8b00: 65 73 74 76 66 73 20 74 76 66 73 20 2d 64 65 66  estvfs tvfs -def
8b10: 61 75 6c 74 20 31 0a 20 20 74 76 66 73 20 66 69  ault 1.  tvfs fi
8b20: 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74 76 66  lter xSync.  tvf
8b30: 73 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62  s script xSyncCb
8b40: 0a 20 20 70 72 6f 63 20 78 53 79 6e 63 43 62 20  .  proc xSyncCb 
8b50: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 66 69 6c  {method file fil
8b60: 65 69 64 20 66 6c 61 67 73 7d 20 7b 0a 20 20 20  eid flags} {.   
8b70: 20 69 6e 63 72 20 3a 3a 73 79 6e 63 28 24 66 6c   incr ::sync($fl
8b80: 61 67 73 29 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ags).  }..  sqli
8b90: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
8ba0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
8bb0: 20 31 35 2e 24 74 6e 2e 31 20 22 0a 20 20 20 20   15.$tn.1 ".    
8bc0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
8bd0: 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 43 52 45   = 4096;.    CRE
8be0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
8bf0: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
8c00: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d  autocheckpoint =
8c10: 20 4f 46 46 3b 0a 20 20 20 20 50 52 41 47 4d 41   OFF;.    PRAGMA
8c20: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
8c30: 57 41 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  WAL;.    PRAGMA 
8c40: 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66  checkpoint_fullf
8c50: 73 79 6e 63 20 3d 20 5b 6c 69 6e 64 65 78 20 24  sync = [lindex $
8c60: 73 65 74 74 69 6e 67 73 20 30 5d 3b 0a 20 20 20  settings 0];.   
8c70: 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e   PRAGMA fullfsyn
8c80: 63 20 3d 20 5b 6c 69 6e 64 65 78 20 24 73 65 74  c = [lindex $set
8c90: 74 69 6e 67 73 20 31 5d 3b 0a 20 20 20 20 50 52  tings 1];.    PR
8ca0: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
8cb0: 20 3d 20 5b 6c 69 6e 64 65 78 20 24 73 65 74 74   = [lindex $sett
8cc0: 69 6e 67 73 20 32 5d 3b 0a 20 20 22 20 7b 30 20  ings 2];.  " {0 
8cd0: 77 61 6c 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  wal}..  do_test 
8ce0: 31 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73  15.$tn.2 {.    s
8cf0: 65 74 20 73 79 6e 63 28 6e 6f 72 6d 61 6c 29 20  et sync(normal) 
8d00: 30 0a 20 20 20 20 73 65 74 20 73 79 6e 63 28 66  0.    set sync(f
8d10: 75 6c 6c 29 20 30 0a 20 20 20 20 65 78 65 63 73  ull) 0.    execs
8d20: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
8d30: 20 74 31 20 56 41 4c 55 45 53 28 27 61 62 63 27   t1 VALUES('abc'
8d40: 29 20 7d 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a  ) }.    list $::
8d50: 73 79 6e 63 28 6e 6f 72 6d 61 6c 29 20 24 3a 3a  sync(normal) $::
8d60: 73 79 6e 63 28 66 75 6c 6c 29 0a 20 20 7d 20 24  sync(full).  } $
8d70: 72 65 73 74 61 72 74 5f 73 79 6e 63 0a 0a 20 20  restart_sync..  
8d80: 64 6f 5f 74 65 73 74 20 31 35 2e 24 74 6e 2e 33  do_test 15.$tn.3
8d90: 20 7b 0a 20 20 20 20 73 65 74 20 73 79 6e 63 28   {.    set sync(
8da0: 6e 6f 72 6d 61 6c 29 20 30 0a 20 20 20 20 73 65  normal) 0.    se
8db0: 74 20 73 79 6e 63 28 66 75 6c 6c 29 20 30 0a 20  t sync(full) 0. 
8dc0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
8dd0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8de0: 45 53 28 27 61 62 63 27 29 20 7d 0a 20 20 20 20  ES('abc') }.    
8df0: 6c 69 73 74 20 24 3a 3a 73 79 6e 63 28 6e 6f 72  list $::sync(nor
8e00: 6d 61 6c 29 20 24 3a 3a 73 79 6e 63 28 66 75 6c  mal) $::sync(ful
8e10: 6c 29 0a 20 20 7d 20 24 63 6f 6d 6d 69 74 5f 73  l).  } $commit_s
8e20: 79 6e 63 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31  ync..  do_test 1
8e30: 35 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73 65  5.$tn.4 {.    se
8e40: 74 20 73 79 6e 63 28 6e 6f 72 6d 61 6c 29 20 30  t sync(normal) 0
8e50: 0a 20 20 20 20 73 65 74 20 73 79 6e 63 28 66 75  .    set sync(fu
8e60: 6c 6c 29 20 30 0a 20 20 20 20 65 78 65 63 73 71  ll) 0.    execsq
8e70: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
8e80: 74 31 20 56 41 4c 55 45 53 28 27 64 65 66 27 29  t1 VALUES('def')
8e90: 20 7d 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a 73   }.    list $::s
8ea0: 79 6e 63 28 6e 6f 72 6d 61 6c 29 20 24 3a 3a 73  ync(normal) $::s
8eb0: 79 6e 63 28 66 75 6c 6c 29 0a 20 20 7d 20 24 63  ync(full).  } $c
8ec0: 6f 6d 6d 69 74 5f 73 79 6e 63 0a 0a 20 20 64 6f  ommit_sync..  do
8ed0: 5f 74 65 73 74 20 31 35 2e 24 74 6e 2e 35 20 7b  _test 15.$tn.5 {
8ee0: 0a 20 20 20 20 73 65 74 20 73 79 6e 63 28 6e 6f  .    set sync(no
8ef0: 72 6d 61 6c 29 20 30 0a 20 20 20 20 73 65 74 20  rmal) 0.    set 
8f00: 73 79 6e 63 28 66 75 6c 6c 29 20 30 0a 20 20 20  sync(full) 0.   
8f10: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
8f20: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
8f30: 20 7d 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a 73   }.    list $::s
8f40: 79 6e 63 28 6e 6f 72 6d 61 6c 29 20 24 3a 3a 73  ync(normal) $::s
8f50: 79 6e 63 28 66 75 6c 6c 29 0a 20 20 7d 20 24 63  ync(full).  } $c
8f60: 6b 70 74 5f 73 79 6e 63 0a 20 20 0a 20 20 64 62  kpt_sync.  .  db
8f70: 20 63 6c 6f 73 65 0a 20 20 74 76 66 73 20 64 65   close.  tvfs de
8f80: 6c 65 74 65 0a 7d 0a 0a 0a 0a 66 69 6e 69 73 68  lete.}....finish
8f90: 5f 74 65 73 74 0a                                _test.