/ Hex Artifact Content
Login

Artifact ed0d04a508e4e4899c688c56028f453c75f2166d:


0000: 23 20 32 30 31 30 20 41 70 72 69 6c 20 31 33 0a  # 2010 April 13.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you 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 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c  *****.# This fil
0170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67  e implements reg
0180: 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f  ression tests fo
0190: 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  r SQLite library
01a0: 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f  .  The.# focus o
01b0: 66 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 74  f this file is t
01c0: 65 73 74 69 6e 67 20 74 68 65 20 6f 70 65 72 61  esting the opera
01d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  tion of the libr
01e0: 61 72 79 20 69 6e 0a 23 20 22 50 52 41 47 4d 41  ary in.# "PRAGMA
01f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41   journal_mode=WA
0200: 4c 22 20 6d 6f 64 65 2e 0a 23 0a 0a 73 65 74 20  L" mode..#..set 
0210: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0220: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0230: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
0240: 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20  ster.tcl.source 
0250: 24 74 65 73 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f  $testdir/lock_co
0260: 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20  mmon.tcl.source 
0270: 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f  $testdir/malloc_
0280: 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63  common.tcl.sourc
0290: 65 20 24 74 65 73 74 64 69 72 2f 77 61 6c 5f 63  e $testdir/wal_c
02a0: 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 73 65 74 20 74  ommon.tcl..set t
02b0: 65 73 74 70 72 65 66 69 78 20 77 61 6c 0a 0a 69  estprefix wal..i
02c0: 66 63 61 70 61 62 6c 65 20 21 77 61 6c 20 7b 66  fcapable !wal {f
02d0: 69 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65 74  inish_test ; ret
02e0: 75 72 6e 20 7d 0a 69 66 20 7b 20 21 5b 77 61 6c  urn }.if { ![wal
02f0: 5f 69 73 5f 6f 6b 5d 20 7d 20 7b 0a 20 20 66 69  _is_ok] } {.  fi
0300: 6e 69 73 68 5f 74 65 73 74 20 0a 20 20 72 65 74  nish_test .  ret
0310: 75 72 6e 20 0a 7d 0a 0a 70 72 6f 63 20 72 65 6f  urn .}..proc reo
0320: 70 65 6e 5f 64 62 20 7b 7d 20 7b 0a 20 20 63 61  pen_db {} {.  ca
0330: 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
0340: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
0350: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
0360: 61 6c 20 74 65 73 74 2e 64 62 2d 77 61 6c 2d 73  al test.db-wal-s
0370: 75 6d 6d 61 72 79 0a 20 20 73 71 6c 69 74 65 33  ummary.  sqlite3
0380: 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62 0a  _wal db test.db.
0390: 7d 0a 0a 73 65 74 20 3a 3a 62 6c 6f 62 63 6e 74  }..set ::blobcnt
03a0: 20 30 0a 70 72 6f 63 20 62 6c 6f 62 20 7b 6e 42   0.proc blob {nB
03b0: 79 74 65 7d 20 7b 0a 20 20 69 6e 63 72 20 3a 3a  yte} {.  incr ::
03c0: 62 6c 6f 62 63 6e 74 0a 20 20 72 65 74 75 72 6e  blobcnt.  return
03d0: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b   [string range [
03e0: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 22 24  string repeat "$
03f0: 7b 3a 3a 62 6c 6f 62 63 6e 74 7d 78 22 20 24 6e  {::blobcnt}x" $n
0400: 42 79 74 65 5d 20 31 20 24 6e 42 79 74 65 5d 0a  Byte] 1 $nByte].
0410: 7d 0a 0a 70 72 6f 63 20 73 71 6c 69 74 65 33 5f  }..proc sqlite3_
0420: 77 61 6c 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65  wal {args} {.  e
0430: 76 61 6c 20 73 71 6c 69 74 65 33 20 24 61 72 67  val sqlite3 $arg
0440: 73 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  s.  [lindex $arg
0450: 73 20 30 5d 20 65 76 61 6c 20 7b 20 50 52 41 47  s 0] eval { PRAG
0460: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
0470: 20 30 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24   0 }.  [lindex $
0480: 61 72 67 73 20 30 5d 20 65 76 61 6c 20 7b 20 50  args 0] eval { P
0490: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
04a0: 3d 20 31 30 32 34 20 7d 0a 20 20 5b 6c 69 6e 64  = 1024 }.  [lind
04b0: 65 78 20 24 61 72 67 73 20 30 5d 20 65 76 61 6c  ex $args 0] eval
04c0: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
04d0: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20  l_mode = wal }. 
04e0: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
04f0: 5d 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  ] eval { PRAGMA 
0500: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f  synchronous = no
0510: 72 6d 61 6c 20 7d 0a 20 20 5b 6c 69 6e 64 65 78  rmal }.  [lindex
0520: 20 24 61 72 67 73 20 30 5d 20 66 75 6e 63 74 69   $args 0] functi
0530: 6f 6e 20 62 6c 6f 62 20 62 6c 6f 62 0a 7d 0a 0a  on blob blob.}..
0540: 70 72 6f 63 20 6c 6f 67 5f 64 65 6c 65 74 65 64  proc log_deleted
0550: 20 7b 6c 6f 67 66 69 6c 65 7d 20 7b 0a 20 20 72   {logfile} {.  r
0560: 65 74 75 72 6e 20 5b 65 78 70 72 20 5b 66 69 6c  eturn [expr [fil
0570: 65 20 65 78 69 73 74 73 20 24 6c 6f 67 66 69 6c  e exists $logfil
0580: 65 5d 3d 3d 30 5d 0a 7d 0a 0a 23 0a 23 20 54 68  e]==0].}..#.# Th
0590: 65 73 65 20 61 72 65 20 27 77 61 72 6d 2d 62 6f  ese are 'warm-bo
05a0: 64 79 27 20 74 65 73 74 73 20 75 73 65 64 20 77  dy' tests used w
05b0: 68 69 6c 65 20 64 65 76 65 6c 6f 70 69 6e 67 20  hile developing 
05c0: 74 68 65 20 57 41 4c 20 63 6f 64 65 2e 20 54 68  the WAL code. Th
05d0: 65 79 0a 23 20 73 65 72 76 65 20 74 6f 20 70 72  ey.# serve to pr
05e0: 6f 76 65 20 74 68 61 74 20 61 20 66 65 77 20 72  ove that a few r
05f0: 65 61 6c 6c 79 20 73 69 6d 70 6c 65 20 63 61 73  eally simple cas
0600: 65 73 20 77 6f 72 6b 3a 0a 23 0a 23 20 77 61 6c  es work:.#.# wal
0610: 2d 31 2e 2a 3a 20 52 65 61 64 20 61 6e 64 20 77  -1.*: Read and w
0620: 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
0630: 65 2e 0a 23 20 77 61 6c 2d 32 2e 2a 3a 20 54 65  e..# wal-2.*: Te
0640: 73 74 20 4d 56 43 43 20 77 69 74 68 20 6f 6e 65  st MVCC with one
0650: 20 72 65 61 64 65 72 2c 20 6f 6e 65 20 77 72 69   reader, one wri
0660: 74 65 72 2e 0a 23 20 77 61 6c 2d 33 2e 2a 3a 20  ter..# wal-3.*: 
0670: 54 65 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  Test transaction
0680: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 77 61 6c   rollback..# wal
0690: 2d 34 2e 2a 3a 20 54 65 73 74 20 73 61 76 65 70  -4.*: Test savep
06a0: 6f 69 6e 74 2f 73 74 61 74 65 6d 65 6e 74 20 72  oint/statement r
06b0: 6f 6c 6c 62 61 63 6b 2e 0a 23 20 77 61 6c 2d 35  ollback..# wal-5
06c0: 2e 2a 3a 20 54 65 73 74 20 74 68 65 20 74 65 6d  .*: Test the tem
06d0: 70 20 64 61 74 61 62 61 73 65 2e 0a 23 20 77 61  p database..# wa
06e0: 6c 2d 36 2e 2a 3a 20 54 65 73 74 20 63 72 65 61  l-6.*: Test crea
06f0: 74 69 6e 67 20 64 61 74 61 62 61 73 65 73 20 77  ting databases w
0700: 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 70 61  ith different pa
0710: 67 65 20 73 69 7a 65 73 2e 0a 23 0a 23 0a 23 0a  ge sizes..#.#.#.
0720: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e 31 20  do_test wal-0.1 
0730: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
0740: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
0750: 20 3d 20 30 20 7d 0a 20 20 65 78 65 63 73 71 6c   = 0 }.  execsql
0760: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
0770: 6f 6e 6f 75 73 20 3d 20 6e 6f 72 6d 61 6c 20 7d  onous = normal }
0780: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
0790: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
07a0: 20 3d 20 77 61 6c 20 7d 0a 7d 20 7b 77 61 6c 7d   = wal }.} {wal}
07b0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e 32  .do_test wal-0.2
07c0: 20 7b 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   {.  file size t
07d0: 65 73 74 2e 64 62 0a 7d 20 7b 31 30 32 34 7d 0a  est.db.} {1024}.
07e0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 30  .do_test wal-1.0
07f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
0800: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43      BEGIN;.    C
0810: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
0820: 2c 20 62 29 3b 20 0a 20 20 7d 0a 20 20 6c 69 73  , b); .  }.  lis
0830: 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74  t [file exists t
0840: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20  est.db-journal] 
0850: 5c 0a 20 20 20 20 20 20 20 5b 66 69 6c 65 20 65  \.       [file e
0860: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61  xists test.db-wa
0870: 6c 5d 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20  l]     \.       
0880: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
0890: 64 62 5d 0a 7d 20 7b 30 20 31 20 31 30 32 34 7d  db].} {0 1 1024}
08a0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 31  .do_test wal-1.1
08b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   {.  execsql COM
08c0: 4d 49 54 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65  MIT.  list [file
08d0: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
08e0: 6a 6f 75 72 6e 61 6c 5d 20 5b 66 69 6c 65 20 65  journal] [file e
08f0: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61  xists test.db-wa
0900: 6c 5d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65  l].} {0 1}.do_te
0910: 73 74 20 77 61 6c 2d 31 2e 32 20 7b 0a 20 20 23  st wal-1.2 {.  #
0920: 20 54 68 65 72 65 20 61 72 65 20 6e 6f 77 20 74   There are now t
0930: 77 6f 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  wo pages in the 
0940: 6c 6f 67 2e 0a 20 20 66 69 6c 65 20 73 69 7a 65  log..  file size
0950: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 5b   test.db-wal.} [
0960: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20  wal_file_size 2 
0970: 31 30 32 34 5d 0a 0a 64 6f 5f 74 65 73 74 20 77  1024]..do_test w
0980: 61 6c 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  al-1.3 {.  execs
0990: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
09a0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
09b0: 20 7d 0a 7d 20 7b 74 61 62 6c 65 20 74 31 20 74   }.} {table t1 t
09c0: 31 20 32 20 7b 43 52 45 41 54 45 20 54 41 42 4c  1 2 {CREATE TABL
09d0: 45 20 74 31 28 61 2c 20 62 29 7d 7d 0a 0a 64 6f  E t1(a, b)}}..do
09e0: 5f 74 65 73 74 20 77 61 6c 2d 31 2e 34 20 7b 0a  _test wal-1.4 {.
09f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
0a00: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0a10: 53 28 31 2c 20 32 29 20 7d 0a 20 20 65 78 65 63  S(1, 2) }.  exec
0a20: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
0a30: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
0a40: 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ) }.  execsql { 
0a50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0a60: 41 4c 55 45 53 28 35 2c 20 36 29 20 7d 0a 20 20  ALUES(5, 6) }.  
0a70: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
0a80: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0a90: 37 2c 20 38 29 20 7d 0a 20 20 65 78 65 63 73 71  7, 8) }.  execsq
0aa0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
0ab0: 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29  t1 VALUES(9, 10)
0ac0: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
0ad0: 20 77 61 6c 2d 31 2e 35 20 7b 0a 20 20 65 78 65   wal-1.5 {.  exe
0ae0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0af0: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32  FROM t1 }.} {1 2
0b00: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
0b10: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  0}..do_test wal-
0b20: 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  2.1 {.  sqlite3_
0b30: 77 61 6c 20 64 62 32 20 2e 2f 74 65 73 74 2e 64  wal db2 ./test.d
0b40: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45  b.  execsql { BE
0b50: 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  GIN; SELECT * FR
0b60: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t1 } db2.} {1
0b70: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
0b80: 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61   10}..do_test wa
0b90: 6c 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  l-2.2 {.  execsq
0ba0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
0bb0: 74 31 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32  t1 VALUES(11, 12
0bc0: 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ) }.  execsql { 
0bd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0be0: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20   }.} {1 2 3 4 5 
0bf0: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
0c00: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
0c10: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
0c20: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0c30: 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33  1 } db2.} {1 2 3
0c40: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d   4 5 6 7 8 9 10}
0c50: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e  ..do_test wal-2.
0c60: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  4 {.  execsql { 
0c70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0c80: 41 4c 55 45 53 28 31 33 2c 20 31 34 29 20 7d 0a  ALUES(13, 14) }.
0c90: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0ca0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  CT * FROM t1 }.}
0cb0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
0cc0: 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20  8 9 10 11 12 13 
0cd0: 31 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  14}..do_test wal
0ce0: 2d 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.5 {.  execsql
0cf0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0d00: 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32   t1 } db2.} {1 2
0d10: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
0d20: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  0}..do_test wal-
0d30: 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.6 {.  execsql 
0d40: 7b 20 43 4f 4d 4d 49 54 3b 20 53 45 4c 45 43 54  { COMMIT; SELECT
0d50: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32   * FROM t1 } db2
0d60: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
0d70: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31  7 8 9 10 11 12 1
0d80: 33 20 31 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77  3 14}..do_test w
0d90: 61 6c 2d 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  al-3.1 {.  execs
0da0: 71 6c 20 7b 20 42 45 47 49 4e 3b 20 44 45 4c 45  ql { BEGIN; DELE
0db0: 54 45 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65  TE FROM t1 }.  e
0dc0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0dd0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 7d  * FROM t1 }.} {}
0de0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 33 2e 32  .do_test wal-3.2
0df0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
0e00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0e10: 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34  } db2.} {1 2 3 4
0e20: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
0e30: 20 31 32 20 31 33 20 31 34 7d 0a 64 6f 5f 74 65   12 13 14}.do_te
0e40: 73 74 20 77 61 6c 2d 33 2e 33 20 7b 0a 20 20 65  st wal-3.3 {.  e
0e50: 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43  xecsql { ROLLBAC
0e60: 4b 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  K }.  execsql { 
0e70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0e80: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20   }.} {1 2 3 4 5 
0e90: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
0ea0: 20 31 33 20 31 34 7d 0a 64 62 32 20 63 6c 6f 73   13 14}.db2 clos
0eb0: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0f00: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
0f10: 73 74 73 2c 20 77 61 6c 2d 34 2e 2a 2c 20 74 65  sts, wal-4.*, te
0f20: 73 74 20 74 68 61 74 20 73 61 76 65 70 6f 69 6e  st that savepoin
0f30: 74 73 20 77 6f 72 6b 20 77 69 74 68 20 57 41 4c  ts work with WAL
0f40: 20 0a 23 20 64 61 74 61 62 61 73 65 73 2e 0a 23   .# databases..#
0f50: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 31  .do_test wal-4.1
0f60: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0f70: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
0f80: 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  1;.    BEGIN;.  
0f90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0fa0: 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t1 VALUES('a', '
0fb0: 62 27 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50  b');.      SAVEP
0fc0: 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 20 20 20  OINT sp;.       
0fd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0fe0: 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29  VALUES('c', 'd')
0ff0: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
1000: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
1010: 7d 20 7b 61 20 62 20 63 20 64 7d 0a 64 6f 5f 74  } {a b c d}.do_t
1020: 65 73 74 20 77 61 6c 2d 34 2e 32 20 7b 0a 20 20  est wal-4.2 {.  
1030: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
1040: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
1050: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
1060: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61  ROM t1;.  }.} {a
1070: 20 62 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   b}.do_test wal-
1080: 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.3 {.  execsql 
1090: 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  {.    COMMIT;.  
10a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
10b0: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d 0a  t1;.  }.} {a b}.
10c0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34  .do_test wal-4.4
10d0: 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .1 {.  db close.
10e0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
10f0: 74 2e 64 62 0a 20 20 64 62 20 66 75 6e 63 20 62  t.db.  db func b
1100: 6c 6f 62 20 62 6c 6f 62 0a 20 20 6c 69 73 74 20  lob blob.  list 
1110: 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43  [execsql { SELEC
1120: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d 20 5b  T * FROM t1 }] [
1130: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
1140: 62 2d 77 61 6c 5d 0a 7d 20 7b 7b 61 20 62 7d 20  b-wal].} {{a b} 
1150: 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  0}.do_test wal-4
1160: 2e 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.2 {.  execsql
1170: 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f   { PRAGMA cache_
1180: 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 65 78  size = 10 }.  ex
1190: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
11a0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
11b0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11c0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 62 6c 6f  TO t2 VALUES(blo
11d0: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
11e0: 29 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  ));.    SAVEPOIN
11f0: 54 20 74 72 3b 0a 20 20 20 20 20 20 49 4e 53 45  T tr;.      INSE
1200: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
1210: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
1220: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  b(400) FROM t2; 
1230: 2f 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49  /*  2 */.      I
1240: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
1250: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1260: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1270: 32 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20  2; /*  4 */.    
1280: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1290: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
12a0: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
12b0: 4d 20 74 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20  M t2; /*  8 */. 
12c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
12d0: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
12e0: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
12f0: 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a  FROM t2; /* 16 *
1300: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
1310: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c  NTO t2 SELECT bl
1320: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
1330: 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33  0) FROM t2; /* 3
1340: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
1350: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1360: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
1370: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f  (400) FROM t1; /
1380: 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  2 */.      IN
1390: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
13a0: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
13b0: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31  lob(400) FROM t1
13c0: 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20  ; /*  4 */.     
13d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
13e0: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
13f0: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1400: 20 74 31 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20   t1; /*  8 */.  
1410: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1420: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t1 SELECT blob(4
1430: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1440: 52 4f 4d 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f  ROM t1; /* 16 */
1450: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1460: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
1470: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
1480: 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32  ) FROM t1; /* 32
1490: 20 2a 2f 0a 20 20 20 20 20 20 53 45 4c 45 43 54   */.      SELECT
14a0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
14b0: 32 3b 0a 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f  2;.  }.} {32}.do
14c0: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 33 20  _test wal-4.4.3 
14d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f  {.  execsql { RO
14e0: 4c 4c 42 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d  LLBACK TO tr }.}
14f0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   {}.do_test wal-
1500: 34 2e 34 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f  4.4.4 {.  set lo
1510: 67 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65  gsize [file size
1520: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20   test.db-wal].  
1530: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
1540: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1550: 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 3b  ALUES('x', 'y');
1560: 0a 20 20 20 20 52 45 4c 45 41 53 45 20 74 72 3b  .    RELEASE tr;
1570: 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 20 24 6c  .  }.  expr { $l
1580: 6f 67 73 69 7a 65 20 3d 3d 20 5b 66 69 6c 65 20  ogsize == [file 
1590: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
15a0: 5d 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  ] }.} {1}.do_tes
15b0: 74 20 77 61 6c 2d 34 2e 34 2e 35 20 7b 0a 20 20  t wal-4.4.5 {.  
15c0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
15d0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
15e0: 32 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  2 }.} {1}.do_tes
15f0: 74 20 77 61 6c 2d 34 2e 34 2e 36 20 7b 0a 20 20  t wal-4.4.6 {.  
1600: 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64  forcecopy test.d
1610: 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66 6f 72  b test2.db.  for
1620: 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 2d 77  cecopy test.db-w
1630: 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a  al test2.db-wal.
1640: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
1650: 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  st2.db.  execsql
1660: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
1670: 2a 29 20 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c  *) FROM t2 ; SEL
1680: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1690: 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20  M t1 } db2.} {1 
16a0: 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  2}.do_test wal-4
16b0: 2e 34 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.7 {.  execsql
16c0: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
16d0: 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a  ity_check } db2.
16e0: 7d 20 7b 6f 6b 7d 0a 64 62 32 20 63 6c 6f 73 65  } {ok}.db2 close
16f0: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  ..do_test wal-4.
1700: 35 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e 5f 64  5.1 {.  reopen_d
1710: 62 0a 20 20 64 62 20 66 75 6e 63 20 62 6c 6f 62  b.  db func blob
1720: 20 62 6c 6f 62 0a 20 20 65 78 65 63 73 71 6c 20   blob.  execsql 
1730: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
1740: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
1750: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1760: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
1770: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1780: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
1790: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  .  }.  sqlite3 d
17a0: 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 66  b test.db.  db f
17b0: 75 6e 63 20 62 6c 6f 62 20 62 6c 6f 62 0a 20 20  unc blob blob.  
17c0: 6c 69 73 74 20 5b 65 78 65 63 73 71 6c 20 7b 20  list [execsql { 
17d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
17e0: 20 7d 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74   }] [file size t
17f0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 7b  est.db-wal].} {{
1800: 61 20 62 7d 20 30 7d 0a 64 6f 5f 74 65 73 74 20  a b} 0}.do_test 
1810: 77 61 6c 2d 34 2e 35 2e 32 20 7b 0a 20 20 65 78  wal-4.5.2 {.  ex
1820: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63  ecsql { PRAGMA c
1830: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d  ache_size = 10 }
1840: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1850: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
1860: 28 61 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49  (a, b);.    BEGI
1870: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
1880: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 62 6c 6f  TO t2 VALUES(blo
1890: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
18a0: 29 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  ));.    SAVEPOIN
18b0: 54 20 74 72 3b 0a 20 20 20 20 20 20 49 4e 53 45  T tr;.      INSE
18c0: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
18d0: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
18e0: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  b(400) FROM t2; 
18f0: 2f 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49  /*  2 */.      I
1900: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
1910: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1920: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1930: 32 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20  2; /*  4 */.    
1940: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1950: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
1960: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
1970: 4d 20 74 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20  M t2; /*  8 */. 
1980: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1990: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
19a0: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
19b0: 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a  FROM t2; /* 16 *
19c0: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
19d0: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c  NTO t2 SELECT bl
19e0: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
19f0: 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33  0) FROM t2; /* 3
1a00: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
1a10: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1a20: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
1a30: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f  (400) FROM t1; /
1a40: 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  2 */.      IN
1a50: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1a60: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
1a70: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31  lob(400) FROM t1
1a80: 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20  ; /*  4 */.     
1a90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1aa0: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1ab0: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1ac0: 20 74 31 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20   t1; /*  8 */.  
1ad0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1ae0: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t1 SELECT blob(4
1af0: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1b00: 52 4f 4d 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f  ROM t1; /* 16 */
1b10: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1b20: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
1b30: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
1b40: 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32  ) FROM t1; /* 32
1b50: 20 2a 2f 0a 20 20 20 20 20 20 53 45 4c 45 43 54   */.      SELECT
1b60: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1b70: 32 3b 0a 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f  2;.  }.} {32}.do
1b80: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 33 20  _test wal-4.5.3 
1b90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f  {.  execsql { RO
1ba0: 4c 4c 42 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d  LLBACK TO tr }.}
1bb0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   {}.do_test wal-
1bc0: 34 2e 35 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f  4.5.4 {.  set lo
1bd0: 67 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65  gsize [file size
1be0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20   test.db-wal].  
1bf0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
1c00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1c10: 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 3b  ALUES('x', 'y');
1c20: 0a 20 20 20 20 52 45 4c 45 41 53 45 20 74 72 3b  .    RELEASE tr;
1c30: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
1c40: 0a 20 20 65 78 70 72 20 7b 20 24 6c 6f 67 73 69  .  expr { $logsi
1c50: 7a 65 20 3d 3d 20 5b 66 69 6c 65 20 73 69 7a 65  ze == [file size
1c60: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a   test.db-wal] }.
1c70: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61  } {1}.do_test wa
1c80: 6c 2d 34 2e 35 2e 35 20 7b 0a 20 20 65 78 65 63  l-4.5.5 {.  exec
1c90: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
1ca0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 3b 20  nt(*) FROM t2 ; 
1cb0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1cc0: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32  FROM t1 }.} {1 2
1cd0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  }.do_test wal-4.
1ce0: 35 2e 36 20 7b 0a 20 20 66 6f 72 63 65 63 6f 70  5.6 {.  forcecop
1cf0: 79 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e  y test.db test2.
1d00: 64 62 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74  db.  forcecopy t
1d10: 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32  est.db-wal test2
1d20: 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65  .db-wal.  sqlite
1d30: 33 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20  3 db2 test2.db. 
1d40: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
1d50: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1d60: 74 32 20 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e  t2 ; SELECT coun
1d70: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 20 64  t(*) FROM t1 } d
1d80: 62 32 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65  b2.} {1 2}.do_te
1d90: 73 74 20 77 61 6c 2d 34 2e 35 2e 37 20 7b 0a 20  st wal-4.5.7 {. 
1da0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
1db0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
1dc0: 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64  k } db2.} {ok}.d
1dd0: 62 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73  b2 close..do_tes
1de0: 74 20 77 61 6c 2d 34 2e 36 2e 31 20 7b 0a 20 20  t wal-4.6.1 {.  
1df0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
1e00: 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20  LETE FROM t2;.  
1e10: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
1e20: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 42 45 47  ckpoint;.    BEG
1e30: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
1e40: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1e50: 27 77 27 2c 20 27 78 27 29 3b 0a 20 20 20 20 20  'w', 'x');.     
1e60: 20 53 41 56 45 50 4f 49 4e 54 20 73 61 76 65 3b   SAVEPOINT save;
1e70: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
1e80: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
1e90: 79 27 2c 20 27 7a 27 29 3b 0a 20 20 20 20 20 20  y', 'z');.      
1ea0: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 61 76 65  ROLLBACK TO save
1eb0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
1ec0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
1ed0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d  LECT * FROM t2 }
1ee0: 0a 7d 20 7b 77 20 78 7d 0a 0a 0a 72 65 6f 70 65  .} {w x}...reope
1ef0: 6e 5f 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c  n_db.do_test wal
1f00: 2d 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -5.1 {.  execsql
1f10: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 45   {.    CREATE TE
1f20: 4d 50 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  MP TABLE t2(a, b
1f30: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1f40: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
1f50: 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  2);.  }.} {}.do_
1f60: 74 65 73 74 20 77 61 6c 2d 35 2e 32 20 7b 0a 20  test wal-5.2 {. 
1f70: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
1f80: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
1f90: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1fa0: 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  S(3, 4);.      S
1fb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
1fc0: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d  .  }.} {1 2 3 4}
1fd0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 33  .do_test wal-5.3
1fe0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1ff0: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
2000: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2010: 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64  2;.  }.} {1 2}.d
2020: 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 34 20 7b  o_test wal-5.4 {
2030: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2040: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42   CREATE TEMP TAB
2050: 4c 45 20 74 33 28 78 20 55 4e 49 51 55 45 29 3b  LE t3(x UNIQUE);
2060: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
2070: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
2080: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
2090: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
20a0: 20 74 33 20 56 41 4c 55 45 53 28 27 61 62 63 27   t3 VALUES('abc'
20b0: 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71  );.  }.  catchsq
20c0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
20d0: 74 33 20 56 41 4c 55 45 53 28 27 61 62 63 27 29  t3 VALUES('abc')
20e0: 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d 6e 20   }.} {1 {column 
20f0: 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d  x is not unique}
2100: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e  }.do_test wal-5.
2110: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
2120: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
2130: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
2140: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34  ;.  }.} {1 2 3 4
2150: 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 66 6f 72 65  }.db close..fore
2160: 61 63 68 20 73 65 63 74 6f 72 20 7b 35 31 32 20  ach sector {512 
2170: 34 30 39 36 7d 20 7b 0a 20 20 73 71 6c 69 74 65  4096} {.  sqlite
2180: 33 5f 73 69 6d 75 6c 61 74 65 5f 64 65 76 69 63  3_simulate_devic
2190: 65 20 2d 73 65 63 74 6f 72 73 69 7a 65 20 24 73  e -sectorsize $s
21a0: 65 63 74 6f 72 0a 20 20 66 6f 72 65 61 63 68 20  ector.  foreach 
21b0: 70 67 73 7a 20 7b 35 31 32 20 31 30 32 34 20 32  pgsz {512 1024 2
21c0: 30 34 38 20 34 30 39 36 7d 20 7b 0a 20 20 20 20  048 4096} {.    
21d0: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
21e0: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a  .db test.db-wal.
21f0: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
2200: 36 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a 2e  6.$sector.$pgsz.
2210: 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1 {.      sqlite
2220: 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66  3 db test.db -vf
2230: 73 20 64 65 76 73 79 6d 0a 20 20 20 20 20 20 65  s devsym.      e
2240: 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20  xecsql ".       
2250: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
2260: 65 20 3d 20 24 70 67 73 7a 3b 0a 20 20 20 20 20  e = $pgsz;.     
2270: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
2280: 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20  acuum = 0;.     
2290: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
22a0: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20  l_mode = wal;.  
22b0: 20 20 20 20 22 0a 20 20 20 20 20 20 65 78 65 63      ".      exec
22c0: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 43 52  sql ".        CR
22d0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
22e0: 20 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53   b);.        INS
22f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2300: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  ES(1, 2);.      
2310: 22 0a 20 20 20 20 20 20 64 62 20 63 6c 6f 73 65  ".      db close
2320: 0a 20 20 20 20 20 20 66 69 6c 65 20 73 69 7a 65  .      file size
2330: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 7d 20 5b   test.db.    } [
2340: 65 78 70 72 20 24 70 67 73 7a 2a 32 5d 0a 20 20  expr $pgsz*2].  
2350: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
2360: 2d 36 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a  -6.$sector.$pgsz
2370: 2e 32 20 7b 0a 20 20 20 20 20 20 6c 6f 67 5f 64  .2 {.      log_d
2380: 65 6c 65 74 65 64 20 74 65 73 74 2e 64 62 2d 77  eleted test.db-w
2390: 61 6c 0a 20 20 20 20 7d 20 7b 31 7d 0a 20 20 7d  al.    } {1}.  }
23a0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  .}..do_test wal-
23b0: 37 2e 31 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c  7.1 {.  forcedel
23c0: 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  ete test.db test
23d0: 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65  .db-wal.  sqlite
23e0: 33 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62  3_wal db test.db
23f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2400: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
2410: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
2420: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
2430: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
2440: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
2450: 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74  , 2);.  }.  list
2460: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
2470: 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  .db] [file size 
2480: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  test.db-wal].} [
2490: 6c 69 73 74 20 31 30 32 34 20 5b 77 61 6c 5f 66  list 1024 [wal_f
24a0: 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32 34 5d  ile_size 3 1024]
24b0: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 37 2e  ].do_test wal-7.
24c0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
24d0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
24e0: 70 6f 69 6e 74 20 7d 0a 20 20 6c 69 73 74 20 5b  point }.  list [
24f0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
2500: 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  b] [file size te
2510: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
2520: 73 74 20 32 30 34 38 20 5b 77 61 6c 5f 66 69 6c  st 2048 [wal_fil
2530: 65 5f 73 69 7a 65 20 33 20 31 30 32 34 5d 5d 0a  e_size 3 1024]].
2540: 0a 23 20 45 78 65 63 75 74 65 20 73 6f 6d 65 20  .# Execute some 
2550: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 69 6e 20  transactions in 
2560: 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
2570: 20 74 6f 20 74 65 73 74 20 64 61 74 61 62 61 73   to test databas
2580: 65 20 66 69 6c 65 0a 23 20 74 72 75 6e 63 61 74  e file.# truncat
2590: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77  ion..#.do_test w
25a0: 61 6c 2d 38 2e 31 20 7b 0a 20 20 72 65 6f 70 65  al-8.1 {.  reope
25b0: 6e 5f 64 62 0a 20 20 63 61 74 63 68 20 7b 20 64  n_db.  catch { d
25c0: 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 6f 72 63  b close }.  forc
25d0: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20  edelete test.db 
25e0: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 73  test.db-wal..  s
25f0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
2600: 62 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20  b.  db function 
2610: 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 65 78 65 63  blob blob.  exec
2620: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
2630: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31   auto_vacuum = 1
2640: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
2650: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b  rnal_mode = wal;
2660: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
2670: 5f 76 61 63 75 75 6d 3b 0a 20 20 7d 0a 7d 20 7b  _vacuum;.  }.} {
2680: 77 61 6c 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77  wal 1}.do_test w
2690: 61 6c 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63 73  al-8.2 {.  execs
26a0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
26b0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
26c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
26d0: 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e  LE t1(x);.    IN
26e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
26f0: 55 45 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a  UES(blob(900));.
2700: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2710: 74 31 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 39  t1 VALUES(blob(9
2720: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
2730: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2740: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
2750: 31 3b 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a  1;       /*  4 *
2760: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
2770: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
2780: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
2790: 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20       /*  8 */.  
27a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
27b0: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
27c0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
27d0: 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e   /* 16 */.    IN
27e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
27f0: 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52  ECT blob(900) FR
2800: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
2810: 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  32 */.    INSERT
2820: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2830: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
2840: 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a  1;       /* 64 *
2850: 2f 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c  /.    PRAGMA wal
2860: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d  _checkpoint;.  }
2870: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
2880: 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 36 38 2a  t.db.} [expr 68*
2890: 31 30 32 34 5d 0a 64 6f 5f 74 65 73 74 20 77 61  1024].do_test wa
28a0: 6c 2d 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  l-8.3 {.  execsq
28b0: 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20  l { .    DELETE 
28c0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f  FROM t1 WHERE ro
28d0: 77 69 64 3c 35 34 3b 0a 20 20 20 20 50 52 41 47  wid<54;.    PRAG
28e0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
28f0: 74 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  t;.  }.  file si
2900: 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78  ze test.db.} [ex
2910: 70 72 20 31 34 2a 31 30 32 34 5d 0a 0a 23 20 52  pr 14*1024]..# R
2920: 75 6e 20 73 6f 6d 65 20 22 77 61 72 6d 2d 62 6f  un some "warm-bo
2930: 64 79 22 20 74 65 73 74 73 20 74 6f 20 65 6e 73  dy" tests to ens
2940: 75 72 65 20 74 68 61 74 20 6c 6f 67 2d 73 75 6d  ure that log-sum
2950: 6d 61 72 79 20 66 69 6c 65 73 20 77 69 74 68 20  mary files with 
2960: 6d 6f 72 65 0a 23 20 74 68 61 6e 20 32 35 36 20  more.# than 256 
2970: 65 6e 74 72 69 65 73 20 28 6c 6f 67 20 73 75 6d  entries (log sum
2980: 6d 61 72 69 65 73 20 74 68 61 74 20 63 6f 6e 74  maries that cont
2990: 61 69 6e 20 69 6e 64 65 78 20 62 6c 6f 63 6b 73  ain index blocks
29a0: 29 20 77 6f 72 6b 20 4f 6b 2e 0a 23 0a 64 6f 5f  ) work Ok..#.do_
29b0: 74 65 73 74 20 77 61 6c 2d 39 2e 31 20 7b 0a 20  test wal-9.1 {. 
29c0: 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65   reopen_db.  exe
29d0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
29e0: 41 20 63 61 63 68 65 5f 73 69 7a 65 3d 32 30 30  A cache_size=200
29f0: 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  0;.    CREATE TA
2a00: 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59  BLE t1(x PRIMARY
2a10: 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52   KEY);.    INSER
2a20: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2a30: 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20  (blob(900));.   
2a40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2a50: 56 41 4c 55 45 53 28 62 6c 6f 62 28 39 30 30 29  VALUES(blob(900)
2a60: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2a70: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
2a80: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
2a90: 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20        /*  4 */. 
2aa0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2ab0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30  1 SELECT blob(90
2ac0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
2ad0: 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 49    /*  8 */.    I
2ae0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2af0: 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46  LECT blob(900) F
2b00: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
2b10: 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52   16 */.    INSER
2b20: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
2b30: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
2b40: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 33 32 20  t1;       /* 32 
2b50: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
2b60: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
2b70: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
2b80: 20 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f 0a 20        /* 64 */. 
2b90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2ba0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30  1 SELECT blob(90
2bb0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
2bc0: 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 20 20    /* 128 */.    
2bd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2be0: 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20  ELECT blob(900) 
2bf0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
2c00: 2a 20 32 35 36 20 2a 2f 0a 20 20 7d 0a 20 20 66  * 256 */.  }.  f
2c10: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
2c20: 0a 7d 20 31 30 32 34 0a 64 6f 5f 74 65 73 74 20  .} 1024.do_test 
2c30: 77 61 6c 2d 39 2e 32 20 7b 0a 20 20 73 71 6c 69  wal-9.2 {.  sqli
2c40: 74 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74  te3_wal db2 test
2c50: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  .db.  execsql {P
2c60: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
2c70: 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f  check } db2.} {o
2c80: 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  k}..do_test wal-
2c90: 39 2e 33 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c  9.3 {.  forcedel
2ca0: 65 74 65 20 74 65 73 74 32 2e 64 62 20 74 65 73  ete test2.db tes
2cb0: 74 32 2e 64 62 2d 77 61 6c 0a 20 20 63 6f 70 79  t2.db-wal.  copy
2cc0: 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 20 74 65  _file test.db te
2cd0: 73 74 32 2e 64 62 0a 20 20 63 6f 70 79 5f 66 69  st2.db.  copy_fi
2ce0: 6c 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74  le test.db-wal t
2cf0: 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71  est2.db-wal.  sq
2d00: 6c 69 74 65 33 5f 77 61 6c 20 64 62 33 20 74 65  lite3_wal db3 te
2d10: 73 74 32 2e 64 62 20 0a 20 20 65 78 65 63 73 71  st2.db .  execsq
2d20: 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72  l {PRAGMA integr
2d30: 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 33 0a  ity_check } db3.
2d40: 7d 20 7b 6f 6b 7d 0a 64 62 33 20 63 6c 6f 73 65  } {ok}.db3 close
2d50: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39 2e  ..do_test wal-9.
2d60: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  4 {.  execsql { 
2d70: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
2d80: 70 6f 69 6e 74 20 7d 0a 20 20 64 62 32 20 63 6c  point }.  db2 cl
2d90: 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  ose.  sqlite3_wa
2da0: 6c 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  l db2 test.db.  
2db0: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
2dc0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
2dd0: 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 0a 66 6f  } db2.} {ok}..fo
2de0: 72 65 61 63 68 20 68 61 6e 64 6c 65 20 7b 64 62  reach handle {db
2df0: 20 64 62 32 20 64 62 33 7d 20 7b 20 63 61 74 63   db2 db3} { catc
2e00: 68 20 7b 20 24 68 61 6e 64 6c 65 20 63 6c 6f 73  h { $handle clos
2e10: 65 20 7d 20 7d 0a 75 6e 73 65 74 20 68 61 6e 64  e } }.unset hand
2e20: 6c 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  le..#-----------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2e70: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2e80: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20  lock of tests - 
2e90: 77 61 6c 2d 31 30 2e 2a 20 2d 20 74 65 73 74 20  wal-10.* - test 
2ea0: 74 68 61 74 20 74 68 65 20 57 41 4c 20 6c 6f 63  that the WAL loc
2eb0: 6b 69 6e 67 20 0a 23 20 73 63 68 65 6d 65 20 77  king .# scheme w
2ec0: 6f 72 6b 73 20 69 6e 20 73 69 6d 70 6c 65 20 63  orks in simple c
2ed0: 61 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  ases. This block
2ee0: 20 6f 66 20 74 65 73 74 73 20 69 73 20 72 75 6e   of tests is run
2ef0: 20 74 77 69 63 65 2e 20 4f 6e 63 65 0a 23 20 75   twice. Once.# u
2f00: 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 63 6f  sing multiple co
2f10: 6e 6e 65 63 74 69 6f 6e 73 20 69 6e 20 74 68 65  nnections in the
2f20: 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 6f   address space o
2f30: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  f the current pr
2f40: 6f 63 65 73 73 2c 0a 23 20 61 6e 64 20 6f 6e 63  ocess,.# and onc
2f50: 65 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 6e 65  e with all conne
2f60: 63 74 69 6f 6e 73 20 65 78 63 65 70 74 20 6f 6e  ctions except on
2f70: 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 74  e running in ext
2f80: 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 2e  ernal processes.
2f90: 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e  .#.do_multiclien
2fa0: 74 5f 74 65 73 74 20 74 6e 20 7b 0a 0a 20 20 23  t_test tn {..  #
2fb0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2fc0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
2fd0: 61 6e 64 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20  and contents..  
2fe0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
2ff0: 31 30 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65  10.$tn.1 {.    e
3000: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
3010: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
3020: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 52 41  m = 0;.      PRA
3030: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
3040: 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 43 52   = wal;.      CR
3050: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
3060: 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
3070: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3080: 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 53 45  (1, 2);.      SE
3090: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
30a0: 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 20 31      }.  } {wal 1
30b0: 20 32 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20   2}..  # Open a 
30c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
30d0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
30e0: 61 62 61 73 65 20 75 73 69 6e 67 20 5b 64 62 5d  abase using [db]
30f0: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 5b 64 62  . Check that [db
3100: 32 5d 0a 20 20 23 20 69 73 20 73 74 69 6c 6c 20  2].  # is still 
3110: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 74 68 65  able to read the
3120: 20 73 6e 61 70 73 68 6f 74 20 62 65 66 6f 72 65   snapshot before
3130: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
3140: 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 23   was opened..  #
3150: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3160: 30 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78  0.$tn.2 {.    ex
3170: 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 3b 20 49  ecsql { BEGIN; I
3180: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3190: 4c 55 45 53 28 33 2c 20 34 29 3b 20 7d 0a 20 20  LUES(3, 4); }.  
31a0: 20 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a    sql2 {SELECT *
31b0: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31   FROM t1}.  } {1
31c0: 20 32 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b 64   2}..  # Have [d
31d0: 62 5d 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  b] commit the tr
31e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 43 68 65 63 6b  ansaction. Check
31f0: 20 74 68 61 74 20 5b 64 62 32 5d 20 69 73 20 6e   that [db2] is n
3200: 6f 77 20 73 65 65 69 6e 67 20 74 68 65 20 0a 20  ow seeing the . 
3210: 20 23 20 6e 65 77 2c 20 75 70 64 61 74 65 64 20   # new, updated 
3220: 73 6e 61 70 73 68 6f 74 2e 0a 20 20 23 0a 20 20  snapshot..  #.  
3230: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3240: 74 6e 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.3 {.    execs
3250: 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  ql { COMMIT }.  
3260: 20 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a    sql2 {SELECT *
3270: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31   FROM t1}.  } {1
3280: 20 32 20 33 20 34 7d 0a 0a 20 20 23 20 48 61 76   2 3 4}..  # Hav
3290: 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 72  e [db2] open a r
32a0: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ead transaction.
32b0: 20 54 68 65 6e 20 77 72 69 74 65 20 74 6f 20 74   Then write to t
32c0: 68 65 20 64 62 20 76 69 61 20 5b 64 62 5d 2e 20  he db via [db]. 
32d0: 43 68 65 63 6b 0a 20 20 23 20 74 68 61 74 20 5b  Check.  # that [
32e0: 64 62 32 5d 20 69 73 20 73 74 69 6c 6c 20 73 65  db2] is still se
32f0: 65 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  eing the origina
3300: 6c 20 73 6e 61 70 73 68 6f 74 2e 20 54 68 65 6e  l snapshot. Then
3310: 20 72 65 61 64 20 77 69 74 68 20 5b 64 62 33 5d   read with [db3]
3320: 2e 0a 20 20 23 20 5b 64 62 33 5d 20 73 68 6f 75  ..  # [db3] shou
3330: 6c 64 20 73 65 65 20 74 68 65 20 6e 65 77 6c 79  ld see the newly
3340: 20 63 6f 6d 6d 69 74 74 65 64 20 64 61 74 61 2e   committed data.
3350: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77  .  #.  do_test w
3360: 61 6c 2d 31 30 2e 24 74 6e 2e 34 20 7b 0a 20 20  al-10.$tn.4 {.  
3370: 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 3b    sql2 { BEGIN ;
3380: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3390: 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d  1}.  } {1 2 3 4}
33a0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
33b0: 30 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 65 78  0.$tn.5 {.    ex
33c0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
33d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
33e0: 20 36 29 3b 20 7d 0a 20 20 20 20 73 71 6c 32 20   6); }.    sql2 
33f0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
3400: 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d  1}.  } {1 2 3 4}
3410: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3420: 30 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 73 71  0.$tn.6 {.    sq
3430: 6c 33 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  l3 {SELECT * FRO
3440: 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33  M t1}.  } {1 2 3
3450: 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73   4 5 6}.  do_tes
3460: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 37 20 7b  t wal-10.$tn.7 {
3470: 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54  .    sql2 COMMIT
3480: 0a 20 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61 76  .  } {}..  # Hav
3490: 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 77  e [db2] open a w
34a0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
34b0: 2e 20 54 68 65 6e 20 61 74 74 65 6d 70 74 20 74  . Then attempt t
34c0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 0a  o write to the .
34d0: 20 20 23 20 64 61 74 61 62 61 73 65 20 76 69 61    # database via
34e0: 20 5b 64 62 5d 2e 20 54 68 69 73 20 73 68 6f 75   [db]. This shou
34f0: 6c 64 20 66 61 69 6c 20 28 77 72 69 74 65 72 20  ld fail (writer 
3500: 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
3510: 62 74 61 69 6e 65 64 29 2e 0a 20 20 23 0a 20 20  btained)..  #.  
3520: 23 20 54 68 65 6e 20 6f 70 65 6e 20 61 20 72 65  # Then open a re
3530: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ad-transaction w
3540: 69 74 68 20 5b 64 62 5d 2e 20 43 6f 6d 6d 69 74  ith [db]. Commit
3550: 20 74 68 65 20 5b 64 62 32 5d 20 74 72 61 6e 73   the [db2] trans
3560: 61 63 74 69 6f 6e 0a 20 20 23 20 74 6f 20 64 69  action.  # to di
3570: 73 6b 2e 20 56 65 72 69 66 79 20 74 68 61 74 20  sk. Verify that 
3580: 5b 64 62 5d 20 73 74 69 6c 6c 20 63 61 6e 6e 6f  [db] still canno
3590: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
35a0: 61 74 61 62 61 73 65 20 28 62 65 63 61 75 73 65  atabase (because
35b0: 0a 20 20 23 20 69 74 20 69 73 20 72 65 61 64 69  .  # it is readi
35c0: 6e 67 20 61 6e 20 6f 6c 64 20 73 6e 61 70 73 68  ng an old snapsh
35d0: 6f 74 29 2e 0a 20 20 23 0a 20 20 23 20 43 6c 6f  ot)..  #.  # Clo
35e0: 73 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 5b  se the current [
35f0: 64 62 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  db] transaction.
3600: 20 4f 70 65 6e 20 61 20 6e 65 77 20 6f 6e 65 2e   Open a new one.
3610: 20 5b 64 62 5d 20 63 61 6e 20 6e 6f 77 20 77 72   [db] can now wr
3620: 69 74 65 0a 20 20 23 20 74 6f 20 74 68 65 20 64  ite.  # to the d
3630: 61 74 61 62 61 73 65 20 28 61 73 20 69 74 20 69  atabase (as it i
3640: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 61 6e 64  s not locked and
3650: 20 5b 64 62 5d 20 69 73 20 72 65 61 64 69 6e 67   [db] is reading
3660: 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20 23 20   the latest.  # 
3670: 73 6e 61 70 73 68 6f 74 29 2e 0a 20 20 23 0a 20  snapshot)..  #. 
3680: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3690: 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32  $tn.7 {.    sql2
36a0: 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54   { BEGIN; INSERT
36b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
36c0: 37 2c 20 38 29 20 3b 20 7d 0a 20 20 20 20 63 61  7, 8) ; }.    ca
36d0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
36e0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39  INTO t1 VALUES(9
36f0: 2c 20 31 30 29 20 7d 0a 20 20 7d 20 7b 31 20 7b  , 10) }.  } {1 {
3700: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
3710: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  ed}}.  do_test w
3720: 61 6c 2d 31 30 2e 24 74 6e 2e 38 20 7b 0a 20 20  al-10.$tn.8 {.  
3730: 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49    execsql { BEGI
3740: 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  N ; SELECT * FRO
3750: 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20  M t1 }.  } {1 2 
3760: 33 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65  3 4 5 6}.  do_te
3770: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 39 20  st wal-10.$tn.9 
3780: 7b 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49  {.    sql2 COMMI
3790: 54 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  T.    catchsql {
37a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
37b0: 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a  VALUES(9, 10) }.
37c0: 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65    } {1 {database
37d0: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
37e0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
37f0: 6e 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63 73  n.10 {.    execs
3800: 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  ql { COMMIT }.  
3810: 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49    execsql { BEGI
3820: 4e 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  N }.    execsql 
3830: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
3840: 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d   VALUES(9, 10) }
3850: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43  .    execsql { C
3860: 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 65 78 65 63  OMMIT }.    exec
3870: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
3880: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
3890: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
38a0: 31 30 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20  10}..  # Open a 
38b0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
38c0: 20 77 69 74 68 20 5b 64 62 32 5d 2e 20 43 68 65   with [db2]. Che
38d0: 63 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 65  ck that this pre
38e0: 76 65 6e 74 73 20 5b 64 62 5d 20 66 72 6f 6d 0a  vents [db] from.
38f0: 20 20 23 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e    # checkpointin
3900: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  g the database. 
3910: 42 75 74 20 6e 6f 74 20 66 72 6f 6d 20 77 72 69  But not from wri
3920: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 20 20 23 0a  ting to it..  #.
3930: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3940: 2e 24 74 6e 2e 31 31 20 7b 0a 20 20 20 20 73 71  .$tn.11 {.    sq
3950: 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45  l2 { BEGIN; SELE
3960: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
3970: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
3980: 37 20 38 20 39 20 31 30 7d 0a 20 20 64 6f 5f 74  7 8 9 10}.  do_t
3990: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
39a0: 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  2 {.    catchsql
39b0: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
39c0: 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20  eckpoint } .  } 
39d0: 7b 30 20 7b 30 20 37 20 37 7d 7d 20 20 20 3b 23  {0 {0 7 7}}   ;#
39e0: 20 52 65 61 64 65 72 20 6e 6f 20 6c 6f 6e 67 65   Reader no longe
39f0: 72 20 62 6c 6f 63 6b 20 63 68 65 63 6b 70 6f 69  r block checkpoi
3a00: 6e 74 73 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  nts.  do_test wa
3a10: 6c 2d 31 30 2e 24 74 6e 2e 31 33 20 7b 0a 20 20  l-10.$tn.13 {.  
3a20: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
3a30: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3a40: 53 28 31 31 2c 20 31 32 29 20 7d 0a 20 20 20 20  S(11, 12) }.    
3a50: 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46  sql2 {SELECT * F
3a60: 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32  ROM t1}.  } {1 2
3a70: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
3a80: 30 7d 0a 0a 20 20 23 20 57 72 69 74 65 72 73 20  0}..  # Writers 
3a90: 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 63 68 65  do not block che
3aa0: 63 6b 70 6f 69 6e 74 73 20 61 6e 79 20 6d 6f 72  ckpoints any mor
3ab0: 65 20 65 69 74 68 65 72 2e 0a 20 20 23 0a 20 20  e either..  #.  
3ac0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3ad0: 74 6e 2e 31 34 20 7b 0a 20 20 20 20 63 61 74 63  tn.14 {.    catc
3ae0: 68 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  hsql { PRAGMA wa
3af0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a  l_checkpoint } .
3b00: 20 20 7d 20 7b 30 20 7b 30 20 38 20 37 7d 7d 0a    } {0 {0 8 7}}.
3b10: 0a 20 20 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  .  # The followi
3b20: 6e 67 20 73 65 72 69 65 73 20 6f 66 20 74 65 73  ng series of tes
3b30: 74 20 63 61 73 65 73 20 75 73 65 64 20 74 6f 20  t cases used to 
3b40: 76 65 72 69 66 79 20 61 6e 6f 74 68 65 72 20 62  verify another b
3b50: 6c 6f 63 6b 69 6e 67 0a 20 20 23 20 63 61 73 65  locking.  # case
3b60: 20 69 6e 20 57 41 4c 20 2d 20 61 20 63 61 73 65   in WAL - a case
3b70: 20 77 68 69 63 68 20 6e 6f 20 6c 6f 6e 67 65 72   which no longer
3b80: 20 62 6c 6f 63 6b 73 2e 0a 20 20 23 0a 20 20 64   blocks..  #.  d
3b90: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3ba0: 6e 2e 31 35 20 7b 0a 20 20 20 20 73 71 6c 32 20  n.15 {.    sql2 
3bb0: 7b 20 43 4f 4d 4d 49 54 3b 20 42 45 47 49 4e 3b  { COMMIT; BEGIN;
3bc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3bd0: 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20  1; }.  } {1 2 3 
3be0: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31  4 5 6 7 8 9 10 1
3bf0: 31 20 31 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20  1 12}.  do_test 
3c00: 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 36 20 7b 0a  wal-10.$tn.16 {.
3c10: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 50      catchsql { P
3c20: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
3c30: 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 30 20 7b  oint } .  } {0 {
3c40: 30 20 38 20 38 7d 7d 0a 20 20 64 6f 5f 74 65 73  0 8 8}}.  do_tes
3c50: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 37 20  t wal-10.$tn.17 
3c60: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
3c70: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
3c80: 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 30 20  point } .  } {0 
3c90: 38 20 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  8 8}.  do_test w
3ca0: 61 6c 2d 31 30 2e 24 74 6e 2e 31 38 20 7b 0a 20  al-10.$tn.18 {. 
3cb0: 20 20 20 73 71 6c 33 20 7b 20 42 45 47 49 4e 3b     sql3 { BEGIN;
3cc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3cd0: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
3ce0: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
3cf0: 20 31 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77   12}.  do_test w
3d00: 61 6c 2d 31 30 2e 24 74 6e 2e 31 39 20 7b 0a 20  al-10.$tn.19 {. 
3d10: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e     catchsql { IN
3d20: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3d30: 55 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20 20  UES(13, 14) }.  
3d40: 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65  } {0 {}}.  do_te
3d50: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 30  st wal-10.$tn.20
3d60: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3d70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3d80: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
3d90: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
3da0: 20 31 32 20 31 33 20 31 34 7d 0a 20 20 64 6f 5f   12 13 14}.  do_
3db0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3dc0: 32 31 20 7b 0a 20 20 20 20 73 71 6c 33 20 43 4f  21 {.    sql3 CO
3dd0: 4d 4d 49 54 0a 20 20 20 20 73 71 6c 32 20 43 4f  MMIT.    sql2 CO
3de0: 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  MMIT.  } {}.  do
3df0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3e00: 2e 32 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .22 {.    execsq
3e10: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
3e20: 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20  M t1 }.  } {1 2 
3e30: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
3e40: 20 31 31 20 31 32 20 31 33 20 31 34 7d 0a 0a 20   11 12 13 14}.. 
3e50: 20 23 20 41 6e 6f 74 68 65 72 20 73 65 72 69 65   # Another serie
3e60: 73 20 6f 66 20 74 65 73 74 73 20 74 68 61 74 20  s of tests that 
3e70: 75 73 65 64 20 74 6f 20 64 65 6d 6f 6e 73 74 72  used to demonstr
3e80: 61 74 65 20 62 6c 6f 63 6b 69 6e 67 20 62 65 68  ate blocking beh
3e90: 61 76 69 6f 72 0a 20 20 23 20 62 75 74 20 77 68  avior.  # but wh
3ea0: 69 63 68 20 6e 6f 77 20 77 6f 72 6b 2e 0a 20 20  ich now work..  
3eb0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
3ec0: 31 30 2e 24 74 6e 2e 32 33 20 7b 0a 20 20 20 20  10.$tn.23 {.    
3ed0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
3ee0: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
3ef0: 7d 0a 20 20 7d 20 7b 30 20 39 20 39 7d 0a 20 20  }.  } {0 9 9}.  
3f00: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3f10: 74 6e 2e 32 34 20 7b 0a 20 20 20 20 73 71 6c 32  tn.24 {.    sql2
3f20: 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43 54   { BEGIN; SELECT
3f30: 20 2a 20 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20   * FROM t1; }.  
3f40: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
3f50: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
3f60: 20 31 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77   14}.  do_test w
3f70: 61 6c 2d 31 30 2e 24 74 6e 2e 32 35 20 7b 0a 20  al-10.$tn.25 {. 
3f80: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41     execsql { PRA
3f90: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
3fa0: 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 39 20 39 7d  nt }.  } {0 9 9}
3fb0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3fc0: 30 2e 24 74 6e 2e 32 36 20 7b 0a 20 20 20 20 63  0.$tn.26 {.    c
3fd0: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
3fe0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3ff0: 31 35 2c 20 31 36 29 20 7d 0a 20 20 7d 20 7b 30  15, 16) }.  } {0
4000: 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77   {}}.  do_test w
4010: 61 6c 2d 31 30 2e 24 74 6e 2e 32 37 20 7b 0a 20  al-10.$tn.27 {. 
4020: 20 20 20 73 71 6c 33 20 7b 20 49 4e 53 45 52 54     sql3 { INSERT
4030: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4040: 31 37 2c 20 31 38 29 20 7d 0a 20 20 7d 20 7b 7d  17, 18) }.  } {}
4050: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
4060: 30 2e 24 74 6e 2e 32 38 20 7b 0a 20 20 20 20 63  0.$tn.28 {.    c
4070: 6f 64 65 33 20 7b 0a 20 20 20 20 20 20 73 65 74  ode3 {.      set
4080: 20 3a 3a 53 54 4d 54 20 5b 73 71 6c 69 74 65 33   ::STMT [sqlite3
4090: 5f 70 72 65 70 61 72 65 20 64 62 33 20 22 53 45  _prepare db3 "SE
40a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20  LECT * FROM t1" 
40b0: 2d 31 20 54 41 49 4c 5d 0a 20 20 20 20 20 20 73  -1 TAIL].      s
40c0: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53  qlite3_step $::S
40d0: 54 4d 54 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  TMT.    }.    ex
40e0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
40f0: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b   FROM t1 }.  } {
4100: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
4110: 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34  9 10 11 12 13 14
4120: 20 31 35 20 31 36 20 31 37 20 31 38 7d 0a 20 20   15 16 17 18}.  
4130: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
4140: 74 6e 2e 32 39 20 7b 0a 20 20 20 20 65 78 65 63  tn.29 {.    exec
4150: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
4160: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 39 2c 20  O t1 VALUES(19, 
4170: 32 30 29 20 7d 0a 20 20 20 20 63 61 74 63 68 73  20) }.    catchs
4180: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
4190: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d  checkpoint }.  }
41a0: 20 7b 30 20 7b 30 20 33 20 30 7d 7d 0a 20 20 64   {0 {0 3 0}}.  d
41b0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
41c0: 6e 2e 33 30 20 7b 0a 20 20 20 20 63 6f 64 65 33  n.30 {.    code3
41d0: 20 7b 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   { sqlite3_final
41e0: 69 7a 65 20 24 3a 3a 53 54 4d 54 20 7d 0a 20 20  ize $::STMT }.  
41f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
4200: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
4210: 74 20 7d 0a 20 20 7d 20 7b 30 20 33 20 30 7d 0a  t }.  } {0 3 0}.
4220: 0a 20 20 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e  .  # At one poin
4230: 74 2c 20 69 66 20 61 20 72 65 61 64 65 72 20 66  t, if a reader f
4240: 61 69 6c 65 64 20 74 6f 20 75 70 67 72 61 64 65  ailed to upgrade
4250: 20 74 6f 20 61 20 77 72 69 74 65 72 20 62 65 63   to a writer bec
4260: 61 75 73 65 20 69 74 0a 20 20 23 20 77 61 73 20  ause it.  # was 
4270: 72 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73  reading an old s
4280: 6e 61 70 73 68 6f 74 2c 20 74 68 65 20 77 72 69  napshot, the wri
4290: 74 65 2d 6c 6f 63 6b 73 20 77 65 72 65 20 6e 6f  te-locks were no
42a0: 74 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64  t being released
42b0: 2e 0a 20 20 23 20 54 65 73 74 20 74 68 61 74 20  ..  # Test that 
42c0: 74 68 69 73 20 62 75 67 20 68 61 73 20 62 65 65  this bug has bee
42d0: 6e 20 66 69 78 65 64 2e 0a 20 20 23 0a 20 20 64  n fixed..  #.  d
42e0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
42f0: 6e 2e 33 31 20 7b 0a 20 20 20 20 73 71 6c 32 20  n.31 {.    sql2 
4300: 43 4f 4d 4d 49 54 0a 20 20 20 20 65 78 65 63 73  COMMIT.    execs
4310: 71 6c 20 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c  ql { BEGIN ; SEL
4320: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
4330: 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52      sql2 { INSER
4340: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4350: 28 32 31 2c 20 32 32 29 20 7d 0a 20 20 20 20 63  (21, 22) }.    c
4360: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
4370: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4380: 32 33 2c 20 32 34 29 20 7d 0a 20 20 7d 20 7b 31  23, 24) }.  } {1
4390: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
43a0: 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  cked}}.  do_test
43b0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 32 20 7b   wal-10.$tn.32 {
43c0: 0a 20 20 20 20 23 20 54 68 69 73 20 73 74 61 74  .    # This stat
43d0: 65 6d 65 6e 74 20 77 6f 75 6c 64 20 66 61 69 6c  ement would fail
43e0: 20 77 68 65 6e 20 74 68 65 20 62 75 67 20 77 61   when the bug wa
43f0: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 20 20 73  s present..    s
4400: 71 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  ql2 { INSERT INT
4410: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 33 2c 20  O t1 VALUES(23, 
4420: 32 34 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64  24) }.  } {}.  d
4430: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
4440: 6e 2e 33 33 20 7b 0a 20 20 20 20 65 78 65 63 73  n.33 {.    execs
4450: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
4460: 4f 4d 20 74 31 20 3b 20 43 4f 4d 4d 49 54 20 7d  OM t1 ; COMMIT }
4470: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20  .  } {1 2 3 4 5 
4480: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
4490: 20 31 33 20 31 34 20 31 35 20 31 36 20 31 37 20   13 14 15 16 17 
44a0: 31 38 20 31 39 20 32 30 7d 0a 20 20 64 6f 5f 74  18 19 20}.  do_t
44b0: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33  est wal-10.$tn.3
44c0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
44d0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
44e0: 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20  t1 }.  } {1 2 3 
44f0: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31  4 5 6 7 8 9 10 1
4500: 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31 36  1 12 13 14 15 16
4510: 20 31 37 20 31 38 20 31 39 20 32 30 20 32 31 20   17 18 19 20 21 
4520: 32 32 20 32 33 20 32 34 7d 0a 0a 20 20 23 20 54  22 23 24}..  # T
4530: 65 73 74 20 74 68 61 74 20 69 66 20 61 20 63 68  est that if a ch
4540: 65 63 6b 70 6f 69 6e 74 65 72 20 63 61 6e 6e 6f  eckpointer canno
4550: 74 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71  t obtain the req
4560: 75 69 72 65 64 20 6c 6f 63 6b 73 2c 20 69 74 0a  uired locks, it.
4570: 20 20 23 20 72 65 6c 65 61 73 65 73 20 61 6c 6c    # releases all
4580: 20 6c 6f 63 6b 73 20 62 65 66 6f 72 65 20 72 65   locks before re
4590: 74 75 72 6e 69 6e 67 20 61 20 62 75 73 79 20 65  turning a busy e
45a0: 72 72 6f 72 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  rror..  #.  do_t
45b0: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33  est wal-10.$tn.3
45c0: 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  5 {.    execsql 
45d0: 7b 20 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  { .      DELETE 
45e0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49  FROM t1;.      I
45f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4600: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
4610: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4620: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c  O t1 VALUES('c',
4630: 20 27 64 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20   'd');.    }.   
4640: 20 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 42 45   sql2 {.      BE
4650: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c  GIN;.        SEL
4660: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
4670: 20 20 20 7d 0a 20 20 7d 20 7b 61 20 62 20 63 20     }.  } {a b c 
4680: 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  d}.  do_test wal
4690: 2d 31 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20 20  -10.$tn.36 {.   
46a0: 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47   catchsql { PRAG
46b0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
46c0: 74 20 7d 0a 20 20 7d 20 7b 30 20 7b 30 20 38 20  t }.  } {0 {0 8 
46d0: 38 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  8}}.  do_test wa
46e0: 6c 2d 31 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20  l-10.$tn.36 {.  
46f0: 20 20 73 71 6c 33 20 7b 20 49 4e 53 45 52 54 20    sql3 { INSERT 
4700: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
4710: 65 27 2c 20 27 66 27 29 20 7d 0a 20 20 20 20 73  e', 'f') }.    s
4720: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
4730: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 61 20  ROM t1 }.  } {a 
4740: 62 20 63 20 64 7d 0a 20 20 64 6f 5f 74 65 73 74  b c d}.  do_test
4750: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 37 20 7b   wal-10.$tn.37 {
4760: 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54  .    sql2 COMMIT
4770: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
4780: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
4790: 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 39 20  oint }.  } {0 9 
47a0: 39 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  9}.}..#---------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .# This block of
4800: 20 74 65 73 74 73 2c 20 77 61 6c 2d 31 31 2e 2a   tests, wal-11.*
4810: 2c 20 74 65 73 74 20 74 68 61 74 20 6e 6f 74 68  , test that noth
4820: 69 6e 67 20 67 6f 65 73 20 74 65 72 72 69 62 6c  ing goes terribl
4830: 79 20 77 72 6f 6e 67 0a 23 20 69 66 20 66 72 61  y wrong.# if fra
4840: 6d 65 73 20 6d 75 73 74 20 62 65 20 77 72 69 74  mes must be writ
4850: 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ten to the log f
4860: 69 6c 65 20 62 65 66 6f 72 65 20 61 20 74 72 61  ile before a tra
4870: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 23 20 63 6f  nsaction is.# co
4880: 6d 6d 69 74 74 65 64 20 28 69 6e 20 6f 72 64 65  mmitted (in orde
4890: 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d  r to free up mem
48a0: 6f 72 79 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ory)..#.do_test 
48b0: 77 61 6c 2d 31 31 2e 31 20 7b 0a 20 20 72 65 6f  wal-11.1 {.  reo
48c0: 70 65 6e 5f 64 62 0a 20 20 65 78 65 63 73 71 6c  pen_db.  execsql
48d0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
48e0: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
48f0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
4900: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
4910: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4920: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
4930: 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72    }.  list [expr
4940: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
4950: 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72  .db]/1024] [expr
4960: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
4970: 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d  .db-wal]/1044].}
4980: 20 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20 77   {1 3}.do_test w
4990: 61 6c 2d 31 31 2e 32 20 7b 0a 20 20 65 78 65 63  al-11.2 {.  exec
49a0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  sql { PRAGMA wal
49b0: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20  _checkpoint }.  
49c0: 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65  list [expr [file
49d0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31   size test.db]/1
49e0: 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  024] [file size 
49f0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  test.db-wal].} [
4a00: 6c 69 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c 65  list 3 [wal_file
4a10: 5f 73 69 7a 65 20 33 20 31 30 32 34 5d 5d 0a 64  _size 3 1024]].d
4a20: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 33 20  o_test wal-11.3 
4a30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
4a40: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4a50: 55 45 53 28 20 62 6c 6f 62 28 39 30 30 29 20 29  UES( blob(900) )
4a60: 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   }.  list [expr 
4a70: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
4a80: 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20  db]/1024] [file 
4a90: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
4aa0: 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c  ].} [list 3 [wal
4ab0: 5f 66 69 6c 65 5f 73 69 7a 65 20 34 20 31 30 32  _file_size 4 102
4ac0: 34 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  4]]..do_test wal
4ad0: 2d 31 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -11.4 {.  execsq
4ae0: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
4af0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4b00: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
4b10: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
4b20: 20 2d 2d 20 32 0a 20 20 20 20 20 20 49 4e 53 45   -- 2.      INSE
4b30: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
4b40: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
4b50: 20 74 31 3b 20 20 20 2d 2d 20 34 0a 20 20 20 20   t1;   -- 4.    
4b60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4b70: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
4b80: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20  ) FROM t1;   -- 
4b90: 38 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  8.      INSERT I
4ba0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
4bb0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
4bc0: 20 20 20 2d 2d 20 31 36 0a 20 20 7d 0a 20 20 6c     -- 16.  }.  l
4bd0: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
4be0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
4bf0: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
4c00: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
4c10: 69 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c 65 5f  ist 3 [wal_file_
4c20: 73 69 7a 65 20 33 32 20 31 30 32 34 5d 5d 0a 64  size 32 1024]].d
4c30: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 35 20  o_test wal-11.5 
4c40: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
4c50: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
4c60: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *) FROM t1;.    
4c70: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
4c80: 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31  _check;.  }.} {1
4c90: 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  6 ok}.do_test wa
4ca0: 6c 2d 31 31 2e 36 20 7b 0a 20 20 65 78 65 63 73  l-11.6 {.  execs
4cb0: 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c 69 73 74  ql COMMIT.  list
4cc0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
4cd0: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
4ce0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
4cf0: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74  .db-wal].} [list
4d00: 20 33 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a   3 [wal_file_siz
4d10: 65 20 34 31 20 31 30 32 34 5d 5d 0a 64 6f 5f 74  e 41 1024]].do_t
4d20: 65 73 74 20 77 61 6c 2d 31 31 2e 37 20 7b 0a 20  est wal-11.7 {. 
4d30: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
4d40: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
4d50: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41  FROM t1;.    PRA
4d60: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
4d70: 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 36 20 6f  eck;.  }.} {16 o
4d80: 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  k}.do_test wal-1
4d90: 31 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.8 {.  execsql 
4da0: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
4db0: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69 73 74  ckpoint }.  list
4dc0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
4dd0: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
4de0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
4df0: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74  .db-wal].} [list
4e00: 20 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69   37 [wal_file_si
4e10: 7a 65 20 34 31 20 31 30 32 34 5d 5d 0a 64 6f 5f  ze 41 1024]].do_
4e20: 74 65 73 74 20 77 61 6c 2d 31 31 2e 39 20 7b 0a  test wal-11.9 {.
4e30: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 6c 69 73    db close.  lis
4e40: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
4e50: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
4e60: 5d 20 5b 6c 6f 67 5f 64 65 6c 65 74 65 64 20 74  ] [log_deleted t
4e70: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 33  est.db-wal].} {3
4e80: 37 20 31 7d 0a 73 71 6c 69 74 65 33 5f 77 61 6c  7 1}.sqlite3_wal
4e90: 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74   db test.db.do_t
4ea0: 65 73 74 20 77 61 6c 2d 31 31 2e 31 30 20 7b 0a  est wal-11.10 {.
4eb0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4ec0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
4ed0: 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45 47 49  e = 10;.    BEGI
4ee0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
4ef0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
4f00: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
4f10: 3b 20 20 20 2d 2d 20 33 32 0a 20 20 20 20 20 20  ;   -- 32.      
4f20: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
4f30: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 6c  FROM t1;.  }.  l
4f40: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
4f50: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
4f60: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
4f70: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
4f80: 69 73 74 20 33 37 20 5b 77 61 6c 5f 66 69 6c 65  ist 37 [wal_file
4f90: 5f 73 69 7a 65 20 33 37 20 31 30 32 34 5d 5d 0a  _size 37 1024]].
4fa0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31  do_test wal-11.1
4fb0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
4fc0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75        SELECT cou
4fd0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
4fe0: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
4ff0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
5000: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
5010: 7b 33 32 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20  {32 16}.do_test 
5020: 77 61 6c 2d 31 31 2e 31 32 20 7b 0a 20 20 6c 69  wal-11.12 {.  li
5030: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
5040: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
5050: 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  4] [file size te
5060: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
5070: 73 74 20 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f  st 37 [wal_file_
5080: 73 69 7a 65 20 33 37 20 31 30 32 34 5d 5d 0a 64  size 37 1024]].d
5090: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 33  o_test wal-11.13
50a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
50b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
50c0: 31 20 56 41 4c 55 45 53 28 20 62 6c 6f 62 28 39  1 VALUES( blob(9
50d0: 30 30 29 20 29 3b 0a 20 20 20 20 53 45 4c 45 43  00) );.    SELEC
50e0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
50f0: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
5100: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
5110: 20 20 7d 0a 7d 20 7b 31 37 20 6f 6b 7d 0a 64 6f    }.} {17 ok}.do
5120: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 34 20  _test wal-11.14 
5130: 7b 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  {.  list [expr [
5140: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
5150: 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73  b]/1024] [file s
5160: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
5170: 0a 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c  .} [list 37 [wal
5180: 5f 66 69 6c 65 5f 73 69 7a 65 20 33 37 20 31 30  _file_size 37 10
5190: 32 34 5d 5d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  24]]...#--------
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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  -.# This block o
51f0: 66 20 74 65 73 74 73 2c 20 77 61 6c 2d 31 32 2e  f tests, wal-12.
5200: 2a 2c 20 74 65 73 74 73 20 74 68 65 20 66 69 78  *, tests the fix
5210: 20 66 6f 72 20 61 20 70 72 6f 62 6c 65 6d 20 74   for a problem t
5220: 68 61 74 20 0a 23 20 63 6f 75 6c 64 20 6f 63 63  hat .# could occ
5230: 75 72 20 69 66 20 61 20 6c 6f 67 20 74 68 61 74  ur if a log that
5240: 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
5250: 61 6e 20 6f 6c 64 65 72 20 6c 6f 67 20 69 73 20  an older log is 
5260: 77 72 69 74 74 65 6e 20 0a 23 20 69 6e 74 6f 20  written .# into 
5270: 61 20 72 65 75 73 65 64 20 6c 6f 67 20 66 69 6c  a reused log fil
5280: 65 2e 0a 23 0a 72 65 6f 70 65 6e 5f 64 62 0a 64  e..#.reopen_db.d
5290: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 31 20  o_test wal-12.1 
52a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
52b0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
52c0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43  ze = 1024;.    C
52d0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
52e0: 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , y);.    CREATE
52f0: 20 54 41 42 4c 45 20 74 32 28 78 2c 20 79 29 3b   TABLE t2(x, y);
5300: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5310: 20 74 31 20 56 41 4c 55 45 53 28 27 41 27 2c 20   t1 VALUES('A', 
5320: 31 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b  1);.  }.  list [
5330: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
5340: 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b  test.db]/1024] [
5350: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
5360: 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 31  b-wal].} [list 1
5370: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
5380: 35 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74  5 1024]].do_test
5390: 20 77 61 6c 2d 31 32 2e 32 20 7b 0a 20 20 64 62   wal-12.2 {.  db
53a0: 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
53b0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
53c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
53d0: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
53e0: 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20 55 50 44   normal;.    UPD
53f0: 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 30  ATE t1 SET y = 0
5400: 20 57 48 45 52 45 20 78 20 3d 20 27 41 27 3b 0a   WHERE x = 'A';.
5410: 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72    }.  list [expr
5420: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
5430: 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72  .db]/1024] [expr
5440: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
5450: 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d  .db-wal]/1044].}
5460: 20 7b 33 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77   {3 1}.do_test w
5470: 61 6c 2d 31 32 2e 33 20 7b 0a 20 20 65 78 65 63  al-12.3 {.  exec
5480: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
5490: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 42 27 2c  O t2 VALUES('B',
54a0: 20 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78   1) }.  list [ex
54b0: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
54c0: 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78  st.db]/1024] [ex
54d0: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
54e0: 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d  st.db-wal]/1044]
54f0: 0a 7d 20 7b 33 20 32 7d 0a 64 6f 5f 74 65 73 74  .} {3 2}.do_test
5500: 20 77 61 6c 2d 31 32 2e 34 20 7b 0a 20 20 66 6f   wal-12.4 {.  fo
5510: 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 20  rcecopy test.db 
5520: 74 65 73 74 32 2e 64 62 0a 20 20 66 6f 72 63 65  test2.db.  force
5530: 63 6f 70 79 20 74 65 73 74 2e 64 62 2d 77 61 6c  copy test.db-wal
5540: 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20   test2.db-wal.  
5550: 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20  sqlite3_wal db2 
5560: 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73  test2.db.  execs
5570: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
5580: 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 42  OM t2 } db2.} {B
5590: 20 31 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f   1}.db2 close.do
55a0: 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 35 20 7b  _test wal-12.5 {
55b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
55c0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
55d0: 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44 41  kpoint;.    UPDA
55e0: 54 45 20 74 32 20 53 45 54 20 79 20 3d 20 32 20  TE t2 SET y = 2 
55f0: 57 48 45 52 45 20 78 20 3d 20 27 42 27 3b 20 0a  WHERE x = 'B'; .
5600: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
5610: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55  heckpoint;.    U
5620: 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20 3d  PDATE t1 SET y =
5630: 20 31 20 57 48 45 52 45 20 78 20 3d 20 27 41 27   1 WHERE x = 'A'
5640: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c  ;.    PRAGMA wal
5650: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20  _checkpoint;.   
5660: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79   UPDATE t1 SET y
5670: 20 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20 27   = 0 WHERE x = '
5680: 41 27 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  A';.  }.  execsq
5690: 6c 20 7b 20 20 53 45 4c 45 43 54 20 2a 20 46 52  l {  SELECT * FR
56a0: 4f 4d 20 74 32 20 7d 0a 7d 20 7b 42 20 32 7d 0a  OM t2 }.} {B 2}.
56b0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 36  do_test wal-12.6
56c0: 20 7b 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74   {.  forcecopy t
56d0: 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a  est.db test2.db.
56e0: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
56f0: 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62  .db-wal test2.db
5700: 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f 77  -wal.  sqlite3_w
5710: 61 6c 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a  al db2 test2.db.
5720: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
5730: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64  CT * FROM t2 } d
5740: 62 32 0a 7d 20 7b 42 20 32 7d 0a 64 62 32 20 63  b2.} {B 2}.db2 c
5750: 6c 6f 73 65 0a 64 62 20 63 6c 6f 73 65 0a 0a 23  lose.db close..#
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
57b0: 20 6c 61 72 67 65 20 6c 6f 67 20 73 75 6d 6d 61   large log summa
57c0: 72 69 65 73 2e 0a 23 0a 23 20 49 6e 20 74 68 69  ries..#.# In thi
57d0: 73 20 63 61 73 65 20 22 6c 61 72 67 65 22 20 75  s case "large" u
57e0: 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 61 20 6c  sually means a l
57f0: 6f 67 20 66 69 6c 65 20 74 68 61 74 20 72 65 71  og file that req
5800: 75 69 72 65 73 20 61 20 77 61 6c 2d 69 6e 64 65  uires a wal-inde
5810: 78 0a 23 20 6d 61 70 70 69 6e 67 20 6c 61 72 67  x.# mapping larg
5820: 65 72 20 74 68 61 6e 20 36 34 4b 42 20 28 74 68  er than 64KB (th
5830: 65 20 64 65 66 61 75 6c 74 20 69 6e 69 74 69 61  e default initia
5840: 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 29 2e 20 41  l allocation). A
5850: 20 36 34 4b 42 20 77 61 6c 2d 69 6e 64 65 78 0a   64KB wal-index.
5860: 23 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  # is large enoug
5870: 68 20 66 6f 72 20 61 20 6c 6f 67 20 66 69 6c 65  h for a log file
5880: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
5890: 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 31 33 31  pproximately 131
58a0: 30 30 20 66 72 61 6d 65 73 2e 0a 23 20 53 6f 20  00 frames..# So 
58b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
58c0: 73 74 73 20 63 72 65 61 74 65 20 6c 6f 67 73 20  sts create logs 
58d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 74 20 6c 65  containing at le
58e0: 61 73 74 20 74 68 69 73 20 6d 61 6e 79 20 66 72  ast this many fr
58f0: 61 6d 65 73 2e 0a 23 0a 23 20 77 61 6c 2d 31 33  ames..#.# wal-13
5900: 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73 74 20  .1.*: This test 
5910: 63 61 73 65 20 63 72 65 61 74 65 73 20 61 20 76  case creates a v
5920: 65 72 79 20 6c 61 72 67 65 20 6c 6f 67 20 66 69  ery large log fi
5930: 6c 65 20 77 69 74 68 69 6e 20 74 68 65 0a 23 20  le within the.# 
5940: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
5950: 2d 73 79 73 74 65 6d 20 28 61 72 6f 75 6e 64 20  -system (around 
5960: 32 30 30 4d 42 29 2e 20 54 68 65 20 6c 6f 67 20  200MB). The log 
5970: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  file does not co
5980: 6e 74 61 69 6e 0a 23 20 20 20 20 20 20 20 20 20  ntain.#         
5990: 20 20 20 20 61 6e 79 20 76 61 6c 69 64 20 66 72      any valid fr
59a0: 61 6d 65 73 2e 20 54 65 73 74 20 74 68 61 74 20  ames. Test that 
59b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
59c0: 65 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 0a 23  e can still be.#
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65               ope
59e0: 6e 65 64 20 61 6e 64 20 71 75 65 72 69 65 64 2c  ned and queried,
59f0: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 69 6e   and that the in
5a00: 76 61 6c 69 64 20 6c 6f 67 20 66 69 6c 65 20 63  valid log file c
5a10: 61 75 73 65 73 20 6e 6f 20 0a 23 20 20 20 20 20  auses no .#     
5a20: 20 20 20 20 20 20 20 20 70 72 6f 62 6c 65 6d 73          problems
5a30: 2e 0a 23 0a 23 20 77 61 6c 2d 31 33 2e 32 2e 2a  ..#.# wal-13.2.*
5a40: 3a 20 54 65 73 74 20 74 68 61 74 20 61 20 70 72  : Test that a pr
5a50: 6f 63 65 73 73 20 6d 61 79 20 63 72 65 61 74 65  ocess may create
5a60: 20 61 20 6c 61 72 67 65 20 6c 6f 67 20 66 69 6c   a large log fil
5a70: 65 20 61 6e 64 20 71 75 65 72 79 0a 23 20 20 20  e and query.#   
5a80: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64 61            the da
5a90: 74 61 62 61 73 65 20 28 69 6e 63 6c 75 64 69 6e  tabase (includin
5aa0: 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 74  g the log file t
5ab0: 68 61 74 20 69 74 20 69 74 73 65 6c 66 20 63 72  hat it itself cr
5ac0: 65 61 74 65 64 29 2e 0a 23 0a 23 20 77 61 6c 2d  eated)..#.# wal-
5ad0: 31 33 2e 33 2e 2a 3a 20 54 65 73 74 20 74 68 61  13.3.*: Test tha
5ae0: 74 20 69 66 20 61 20 76 65 72 79 20 6c 61 72 67  t if a very larg
5af0: 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 63 72  e log file is cr
5b00: 65 61 74 65 64 2c 20 61 6e 64 20 74 68 65 6e 20  eated, and then 
5b10: 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  a.#             
5b20: 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  second connectio
5b30: 6e 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  n is opened on t
5b40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5b50: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
5b60: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .#             t
5b70: 6f 20 71 75 65 72 79 20 74 68 65 20 64 61 74 61  o query the data
5b80: 62 61 73 65 20 28 61 6e 64 20 74 68 65 20 76 65  base (and the ve
5b90: 72 79 20 6c 61 72 67 65 20 6c 6f 67 29 20 75 73  ry large log) us
5ba0: 69 6e 67 20 74 68 65 0a 23 20 20 20 20 20 20 20  ing the.#       
5bb0: 20 20 20 20 20 20 73 65 63 6f 6e 64 20 63 6f 6e        second con
5bc0: 6e 65 63 74 69 6f 6e 2e 0a 23 0a 23 20 77 61 6c  nection..#.# wal
5bd0: 2d 31 33 2e 34 2e 2a 3a 20 53 61 6d 65 20 74 65  -13.4.*: Same te
5be0: 73 74 20 61 73 20 77 61 6c 2d 31 33 2e 33 2e 2a  st as wal-13.3.*
5bf0: 2e 20 45 78 63 65 70 74 20 69 6e 20 74 68 69 73  . Except in this
5c00: 20 63 61 73 65 20 74 68 65 20 73 65 63 6f 6e 64   case the second
5c10: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .#             c
5c20: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
5c30: 6e 65 64 20 62 79 20 61 6e 20 65 78 74 65 72 6e  ned by an extern
5c40: 61 6c 20 70 72 6f 63 65 73 73 2e 0a 23 0a 64 6f  al process..#.do
5c50: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 31 2e 31  _test wal-13.1.1
5c60: 20 7b 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20   {.  list [file 
5c70: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 5d 20  exists test.db] 
5c80: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73  [file exists tes
5c90: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 31 20 30  t.db-wal].} {1 0
5ca0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33  }.do_test wal-13
5cb0: 2e 31 2e 32 20 7b 0a 20 20 73 65 74 20 66 64 20  .1.2 {.  set fd 
5cc0: 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 77 61  [open test.db-wa
5cd0: 6c 20 77 5d 0a 20 20 73 65 65 6b 20 24 66 64 20  l w].  seek $fd 
5ce0: 5b 65 78 70 72 20 32 30 30 2a 31 30 32 34 2a 31  [expr 200*1024*1
5cf0: 30 32 34 5d 0a 20 20 70 75 74 73 20 24 66 64 20  024].  puts $fd 
5d00: 22 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20  "".  close $fd. 
5d10: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
5d20: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
5d30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
5d40: 20 7d 0a 7d 20 7b 42 20 32 7d 0a 62 72 65 61 6b   }.} {B 2}.break
5d50: 70 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20 77 61  point.do_test wa
5d60: 6c 2d 31 33 2e 31 2e 33 20 7b 0a 20 20 64 62 20  l-13.1.3 {.  db 
5d70: 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 65 78 69  close.  file exi
5d80: 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a  sts test.db-wal.
5d90: 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77  } {0}..do_test w
5da0: 61 6c 2d 31 33 2e 32 2e 31 20 7b 0a 20 20 73 71  al-13.2.1 {.  sq
5db0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
5dc0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
5dd0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
5de0: 4d 20 74 32 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f  M t2 }.} {1}.do_
5df0: 74 65 73 74 20 77 61 6c 2d 31 33 2e 32 2e 32 20  test wal-13.2.2 
5e00: 7b 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20  {.  db function 
5e10: 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 66 6f 72 20  blob blob.  for 
5e20: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
5e30: 31 36 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  16} {incr i} {. 
5e40: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
5e50: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
5e60: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
5e70: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 20  ob(400) FROM t2 
5e80: 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  }.  }.  execsql 
5e90: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
5ea0: 29 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 5b 65  ) FROM t2 }.} [e
5eb0: 78 70 72 20 69 6e 74 28 70 6f 77 28 32 2c 20 31  xpr int(pow(2, 1
5ec0: 36 29 29 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  6))].do_test wal
5ed0: 2d 31 33 2e 32 2e 33 20 7b 0a 20 20 65 78 70 72  -13.2.3 {.  expr
5ee0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
5ef0: 2e 64 62 2d 77 61 6c 5d 20 3e 20 5b 77 61 6c 5f  .db-wal] > [wal_
5f00: 66 69 6c 65 5f 73 69 7a 65 20 33 33 30 30 30 20  file_size 33000 
5f10: 31 30 32 34 5d 0a 7d 20 31 0a 0a 64 6f 5f 6d 75  1024].} 1..do_mu
5f20: 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74  lticlient_test t
5f30: 6e 20 7b 0a 20 20 69 6e 63 72 20 74 6e 20 32 0a  n {.  incr tn 2.
5f40: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
5f50: 33 2e 24 74 6e 2e 30 20 7b 0a 20 20 20 20 73 71  3.$tn.0 {.    sq
5f60: 6c 31 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  l1 {.      PRAGM
5f70: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
5f80: 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52 45 41   WAL;.      CREA
5f90: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
5fa0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
5fb0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
5fc0: 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20  omblob(800);.   
5fd0: 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 20 53 45   }.    sql1 { SE
5fe0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
5ff0: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a  OM t1 }.  } {1}.
6000: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 31  .  for {set ii 1
6010: 7d 20 7b 24 69 69 3c 31 36 7d 20 7b 69 6e 63 72  } {$ii<16} {incr
6020: 20 69 69 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65   ii} {.    do_te
6030: 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 24 69  st wal-13.$tn.$i
6040: 69 2e 61 20 7b 0a 20 20 20 20 20 20 73 71 6c 32  i.a {.      sql2
6050: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
6060: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
6070: 6c 6f 62 28 38 30 30 29 20 46 52 4f 4d 20 74 31  lob(800) FROM t1
6080: 20 7d 0a 20 20 20 20 20 20 73 71 6c 32 20 7b 20   }.      sql2 { 
6090: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
60a0: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 20 20 7d 20  FROM t1 }.    } 
60b0: 5b 65 78 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a  [expr (1<<$ii)].
60c0: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
60d0: 31 33 2e 24 74 6e 2e 24 69 69 2e 62 20 7b 0a 20  13.$tn.$ii.b {. 
60e0: 20 20 20 20 20 73 71 6c 31 20 7b 20 53 45 4c 45       sql1 { SELE
60f0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
6100: 20 74 31 20 7d 0a 20 20 20 20 7d 20 5b 65 78 70   t1 }.    } [exp
6110: 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20 20 20  r (1<<$ii)].    
6120: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24  do_test wal-13.$
6130: 74 6e 2e 24 69 69 2e 63 20 7b 0a 20 20 20 20 20  tn.$ii.c {.     
6140: 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 63   sql1 { SELECT c
6150: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
6160: 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72 20 28 31  }.    } [expr (1
6170: 3c 3c 24 69 69 29 5d 0a 20 20 20 20 64 6f 5f 74  <<$ii)].    do_t
6180: 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 24  est wal-13.$tn.$
6190: 69 69 2e 64 20 7b 0a 20 20 20 20 20 20 73 71 6c  ii.d {.      sql
61a0: 31 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  1 { PRAGMA integ
61b0: 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a 20 20 20  rity_check }.   
61c0: 20 7d 20 7b 6f 6b 7d 0a 20 20 7d 0a 7d 0a 0a 23   } {ok}.  }.}..#
61d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63  ---------.# Chec
6220: 6b 20 61 20 66 75 6e 20 63 6f 72 72 75 70 74 69  k a fun corrupti
6230: 6f 6e 20 63 61 73 65 20 68 61 73 20 62 65 65 6e  on case has been
6240: 20 66 69 78 65 64 2e 0a 23 0a 23 20 54 68 65 20   fixed..#.# The 
6250: 70 72 6f 62 6c 65 6d 20 77 61 73 20 74 68 61 74  problem was that
6260: 20 61 66 74 65 72 20 70 65 72 66 6f 72 6d 69 6e   after performin
6270: 67 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 75  g a checkpoint u
6280: 73 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  sing a connectio
6290: 6e 0a 23 20 74 68 61 74 20 68 61 64 20 61 6e 20  n.# that had an 
62a0: 6f 75 74 2d 6f 66 2d 64 61 74 65 20 70 61 67 65  out-of-date page
62b0: 72 2d 63 61 63 68 65 2c 20 74 68 65 20 6e 65 78  r-cache, the nex
62c0: 74 20 74 69 6d 65 20 74 68 65 20 63 6f 6e 6e 65  t time the conne
62d0: 63 74 69 6f 6e 20 77 61 73 0a 23 20 75 73 65 64  ction was.# used
62e0: 20 69 74 20 64 69 64 20 6e 6f 74 20 72 65 61 6c   it did not real
62f0: 69 7a 65 20 74 68 65 20 63 61 63 68 65 20 77 61  ize the cache wa
6300: 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 61 6e  s out-of-date an
6310: 64 20 70 72 6f 63 65 65 64 65 64 20 74 6f 0a 23  d proceeded to.#
6320: 20 6f 70 65 72 61 74 65 20 77 69 74 68 20 61 6e   operate with an
6330: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
6340: 63 68 65 2e 20 4c 65 61 64 69 6e 67 20 74 6f 20  che. Leading to 
6350: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 23 0a 63 61  corruption..#.ca
6360: 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
6370: 0a 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f  .catch { db2 clo
6380: 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 33  se }.catch { db3
6390: 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64 65   close }.forcede
63a0: 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73  lete test.db tes
63b0: 74 2e 64 62 2d 77 61 6c 0a 73 71 6c 69 74 65 33  t.db-wal.sqlite3
63c0: 20 64 62 20 74 65 73 74 2e 64 62 0a 73 71 6c 69   db test.db.sqli
63d0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
63e0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 34 20 7b  do_test wal-14 {
63f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6400: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
6410: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
6420: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
6430: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
6440: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
6450: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
6460: 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e  domblob(10), ran
6470: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29 3b 0a 20  domblob(100));. 
6480: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6490: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
64a0: 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62  lob(10), randomb
64b0: 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20 74 31  lob(100) FROM t1
64c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
64d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
64e0: 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64  omblob(10), rand
64f0: 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d  omblob(100) FROM
6500: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
6510: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
6520: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72  andomblob(10), r
6530: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46  andomblob(100) F
6540: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 0a 20 20 64  ROM t1;.  }..  d
6550: 62 32 20 65 76 61 6c 20 7b 20 0a 20 20 20 20 49  b2 eval { .    I
6560: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
6570: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
6580: 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  10), randomblob(
6590: 31 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  100);.    INSERT
65a0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
65b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20  randomblob(10), 
65c0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b  randomblob(100);
65d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
65e0: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
65f0: 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f  mblob(10), rando
6600: 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20 20 20  mblob(100);.    
6610: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
6620: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
6630: 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  (10), randomblob
6640: 28 31 30 30 29 3b 0a 20 20 7d 0a 0a 20 20 23 20  (100);.  }..  # 
6650: 41 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 20  After executing 
6660: 74 68 65 20 22 50 52 41 47 4d 41 20 77 61 6c 5f  the "PRAGMA wal_
6670: 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 63 6f 6e  checkpoint", con
6680: 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 20 77 61 73  nection [db] was
6690: 20 62 65 69 6e 67 0a 20 20 23 20 6c 65 66 74 20   being.  # left 
66a0: 77 69 74 68 20 61 6e 20 69 6e 63 6f 6e 73 69 73  with an inconsis
66b0: 74 65 6e 74 20 63 61 63 68 65 2e 20 52 75 6e 6e  tent cache. Runn
66c0: 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20 49  ing the CREATE I
66d0: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 0a 20  NDEX statement. 
66e0: 20 23 20 69 6e 20 74 68 69 73 20 73 74 61 74 65   # in this state
66f0: 20 6c 65 64 20 74 6f 20 64 61 74 61 62 61 73 65   led to database
6700: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 63   corruption..  c
6710: 61 74 63 68 73 71 6c 20 7b 20 0a 20 20 20 20 50  atchsql { .    P
6720: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
6730: 6f 69 6e 74 3b 0a 20 20 20 20 43 52 45 41 54 45  oint;.    CREATE
6740: 20 49 4e 44 45 58 20 69 31 20 6f 6e 20 74 31 28   INDEX i1 on t1(
6750: 62 29 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 64 62  b);.  }.   .  db
6760: 32 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  2 eval { PRAGMA 
6770: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
6780: 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 63 61 74 63 68 20  }.} {ok}..catch 
6790: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 63 61 74  { db close }.cat
67a0: 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d  ch { db2 close }
67b0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
6800: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
6810: 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 77 61  ck of tests - wa
6820: 6c 2d 31 35 2e 2a 20 2d 20 66 6f 63 75 73 20 6f  l-15.* - focus o
6830: 6e 20 74 65 73 74 69 6e 67 20 74 68 65 20 0a 23  n testing the .#
6840: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
6850: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  of the sqlite3_w
6860: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 29 20  al_checkpoint() 
6870: 69 6e 74 65 72 66 61 63 65 2e 0a 23 0a 66 6f 72  interface..#.for
6880: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
6890: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 73 71 6c   test.db-wal.sql
68a0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
68b0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 31  do_test wal-15.1
68c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
68d0: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
68e0: 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50  acuum = 0;.    P
68f0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
6900: 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47  = 1024;.    PRAG
6910: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
6920: 3d 20 57 41 4c 3b 0a 20 20 7d 0a 20 20 65 78 65  = WAL;.  }.  exe
6930: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
6940: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
6950: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6960: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
6970: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54  );.  }.} {}..# T
6980: 65 73 74 20 74 68 61 74 20 61 6e 20 65 72 72 6f  est that an erro
6990: 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
69a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
69b0: 6d 65 20 69 73 20 6e 6f 74 20 72 65 63 6f 67 6e  me is not recogn
69c0: 69 7a 65 64 0a 23 0a 64 6f 5f 74 65 73 74 20 77  ized.#.do_test w
69d0: 61 6c 2d 31 35 2e 32 2e 31 20 7b 0a 20 20 73 71  al-15.2.1 {.  sq
69e0: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
69f0: 6f 69 6e 74 20 64 62 20 61 75 78 0a 7d 20 7b 53  oint db aux.} {S
6a00: 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f  QLITE_ERROR}.do_
6a10: 74 65 73 74 20 77 61 6c 2d 31 35 2e 32 2e 32 20  test wal-15.2.2 
6a20: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 63  {.  sqlite3_errc
6a30: 6f 64 65 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45  ode db.} {SQLITE
6a40: 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20  _ERROR}.do_test 
6a50: 77 61 6c 2d 31 35 2e 32 2e 33 20 7b 0a 20 20 73  wal-15.2.3 {.  s
6a60: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 64 62  qlite3_errmsg db
6a70: 0a 7d 20 7b 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  .} {unknown data
6a80: 62 61 73 65 3a 20 61 75 78 7d 0a 0a 23 20 54 65  base: aux}..# Te
6a90: 73 74 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72  st that an error
6aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
6ab0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
6ac0: 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  de to checkpoint
6ad0: 0a 23 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  .# if a transact
6ae0: 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74  ion is open on t
6af0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 64  he database..#.d
6b00: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 33 2e  o_test wal-15.3.
6b10: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
6b20: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49      BEGIN;.    I
6b30: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6b40: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a  LUES(3, 4);.  }.
6b50: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68    sqlite3_wal_ch
6b60: 65 63 6b 70 6f 69 6e 74 20 64 62 20 6d 61 69 6e  eckpoint db main
6b70: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  .} {SQLITE_LOCKE
6b80: 44 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  D}.do_test wal-1
6b90: 35 2e 33 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  5.3.2 {.  sqlite
6ba0: 33 5f 65 72 72 63 6f 64 65 20 64 62 0a 7d 20 7b  3_errcode db.} {
6bb0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 7d 0a 64  SQLITE_LOCKED}.d
6bc0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 33 2e  o_test wal-15.3.
6bd0: 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72  3 {.  sqlite3_er
6be0: 72 6d 73 67 20 64 62 0a 7d 20 7b 64 61 74 61 62  rmsg db.} {datab
6bf0: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
6c00: 6b 65 64 7d 0a 0a 23 20 45 61 72 6c 69 65 72 20  ked}..# Earlier 
6c10: 76 65 72 73 69 6f 6e 73 20 72 65 74 75 72 6e 65  versions returne
6c20: 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  d an error is re
6c30: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 62  turned if the db
6c40: 20 63 61 6e 6e 6f 74 20 62 65 20 0a 23 20 63 68   cannot be .# ch
6c50: 65 63 6b 70 6f 69 6e 74 65 64 20 62 65 63 61 75  eckpointed becau
6c60: 73 65 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  se of locks held
6c70: 20 62 79 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   by another conn
6c80: 65 63 74 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68  ection. Check th
6c90: 61 74 0a 23 20 74 68 69 73 20 69 73 20 6e 6f 20  at.# this is no 
6ca0: 6c 6f 6e 67 65 72 20 74 68 65 20 63 61 73 65 2e  longer the case.
6cb0: 0a 23 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74  .#.sqlite3 db2 t
6cc0: 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 77  est.db.do_test w
6cd0: 61 6c 2d 31 35 2e 34 2e 31 20 7b 0a 20 20 65 78  al-15.4.1 {.  ex
6ce0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
6cf0: 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  N;.    SELECT * 
6d00: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 64 62 32  FROM t1;.  } db2
6d10: 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74  .} {1 2}.do_test
6d20: 20 77 61 6c 2d 31 35 2e 34 2e 32 20 7b 0a 20 20   wal-15.4.2 {.  
6d30: 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54  execsql { COMMIT
6d40: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c   }.  sqlite3_wal
6d50: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 0a 7d  _checkpoint db.}
6d60: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f   {SQLITE_OK}.do_
6d70: 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 33 20  test wal-15.4.3 
6d80: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  {.  sqlite3_errm
6d90: 73 67 20 64 62 0a 7d 20 7b 6e 6f 74 20 61 6e 20  sg db.} {not an 
6da0: 65 72 72 6f 72 7d 0a 0a 23 20 41 66 74 65 72 20  error}..# After 
6db0: 5b 64 62 32 5d 20 64 72 6f 70 73 20 69 74 73 20  [db2] drops its 
6dc0: 6c 6f 63 6b 2c 20 5b 64 62 5d 20 6d 61 79 20 63  lock, [db] may c
6dd0: 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 64 62  heckpoint the db
6de0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..#.do_test wal-
6df0: 31 35 2e 34 2e 34 20 7b 0a 20 20 65 78 65 63 73  15.4.4 {.  execs
6e00: 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 64 62  ql { COMMIT } db
6e10: 32 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  2.  sqlite3_wal_
6e20: 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 0a 7d 20  checkpoint db.} 
6e30: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74  {SQLITE_OK}.do_t
6e40: 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 35 20 7b  est wal-15.4.5 {
6e50: 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  .  sqlite3_errms
6e60: 67 20 64 62 0a 7d 20 7b 6e 6f 74 20 61 6e 20 65  g db.} {not an e
6e70: 72 72 6f 72 7d 0a 64 6f 5f 74 65 73 74 20 77 61  rror}.do_test wa
6e80: 6c 2d 31 35 2e 34 2e 36 20 7b 0a 20 20 66 69 6c  l-15.4.6 {.  fil
6e90: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d  e size test.db.}
6ea0: 20 5b 65 78 70 72 20 31 30 32 34 2a 32 5d 0a 0a   [expr 1024*2]..
6eb0: 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73  catch { db2 clos
6ec0: 65 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 20 63  e }.catch { db c
6ed0: 6c 6f 73 65 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lose }..#-------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f20: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
6f30: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74  ng block of test
6f40: 73 20 2d 20 77 61 6c 2d 31 36 2e 2a 20 2d 20 74  s - wal-16.* - t
6f50: 65 73 74 20 74 68 61 74 20 69 66 20 61 20 4e 55  est that if a NU
6f60: 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 72 0a 23 20  LL pointer or.# 
6f70: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
6f80: 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
6f90: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6fa0: 20 6f 66 20 74 68 65 20 77 61 6c 5f 63 68 65 63   of the wal_chec
6fb0: 6b 70 6f 69 6e 74 28 29 0a 23 20 41 50 49 2c 20  kpoint().# API, 
6fc0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
6fd0: 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  de to checkpoint
6fe0: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
6ff0: 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65 61  tabases..#.forea
7000: 63 68 20 7b 74 6e 20 63 6b 70 74 5f 63 6d 64 20  ch {tn ckpt_cmd 
7010: 63 6b 70 74 5f 72 65 73 20 63 6b 70 74 5f 6d 61  ckpt_res ckpt_ma
7020: 69 6e 20 63 6b 70 74 5f 61 75 78 7d 20 7b 0a 20  in ckpt_aux} {. 
7030: 20 31 20 7b 73 71 6c 69 74 65 33 5f 77 61 6c 5f   1 {sqlite3_wal_
7040: 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 7d 20 20  checkpoint db}  
7050: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
7060: 54 45 5f 4f 4b 20 20 20 20 20 31 20 31 0a 20 20  TE_OK     1 1.  
7070: 32 20 7b 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  2 {sqlite3_wal_c
7080: 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 22 22 7d  heckpoint db ""}
7090: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
70a0: 45 5f 4f 4b 20 20 20 20 20 31 20 31 0a 20 20 33  E_OK     1 1.  3
70b0: 20 7b 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d   {db eval "PRAGM
70c0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
70d0: 22 7d 20 20 20 20 20 20 20 20 7b 30 20 31 30 20  "}        {0 10 
70e0: 31 30 7d 20 20 20 20 20 31 20 31 0a 0a 20 20 34  10}     1 1..  4
70f0: 20 7b 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68   {sqlite3_wal_ch
7100: 65 63 6b 70 6f 69 6e 74 20 64 62 20 6d 61 69 6e  eckpoint db main
7110: 7d 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  }         SQLITE
7120: 5f 4f 4b 20 20 20 20 20 31 20 30 0a 20 20 35 20  _OK     1 0.  5 
7130: 7b 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65  {sqlite3_wal_che
7140: 63 6b 70 6f 69 6e 74 20 64 62 20 61 75 78 7d 20  ckpoint db aux} 
7150: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
7160: 4f 4b 20 20 20 20 20 30 20 31 0a 20 20 36 20 7b  OK     0 1.  6 {
7170: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
7180: 6b 70 6f 69 6e 74 20 64 62 20 74 65 6d 70 7d 20  kpoint db temp} 
7190: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
71a0: 4b 20 20 20 20 20 30 20 30 0a 20 20 37 20 7b 64  K     0 0.  7 {d
71b0: 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20 6d  b eval "PRAGMA m
71c0: 61 69 6e 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69  ain.wal_checkpoi
71d0: 6e 74 22 7d 20 20 20 7b 30 20 31 30 20 31 30 7d  nt"}   {0 10 10}
71e0: 20 20 20 20 20 31 20 30 0a 20 20 38 20 7b 64 62       1 0.  8 {db
71f0: 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20 61 75   eval "PRAGMA au
7200: 78 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  x.wal_checkpoint
7210: 22 7d 20 20 20 20 7b 30 20 31 33 20 31 33 7d 20  "}    {0 13 13} 
7220: 20 20 20 20 30 20 31 0a 20 20 39 20 7b 64 62 20      0 1.  9 {db 
7230: 65 76 61 6c 20 22 50 52 41 47 4d 41 20 74 65 6d  eval "PRAGMA tem
7240: 70 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  p.wal_checkpoint
7250: 22 7d 20 20 20 7b 30 20 2d 31 20 2d 31 7d 20 20  "}   {0 -1 -1}  
7260: 20 20 20 30 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f     0 0.} {.  do_
7270: 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e  test wal-16.$tn.
7280: 31 20 7b 0a 20 20 20 20 66 6f 72 63 65 64 65 6c  1 {.    forcedel
7290: 65 74 65 20 74 65 73 74 32 2e 64 62 20 74 65 73  ete test2.db tes
72a0: 74 32 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e  t2.db-wal test2.
72b0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 66  db-journal.    f
72c0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
72d0: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74  db test.db-wal t
72e0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 0a  est.db-journal..
72f0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
7300: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
7310: 71 6c 20 7b 0a 20 20 20 20 20 20 41 54 54 41 43  ql {.      ATTAC
7320: 48 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20  H 'test2.db' AS 
7330: 61 75 78 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  aux;.      PRAGM
7340: 41 20 6d 61 69 6e 2e 61 75 74 6f 5f 76 61 63 75  A main.auto_vacu
7350: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 52  um = 0;.      PR
7360: 41 47 4d 41 20 61 75 78 2e 61 75 74 6f 5f 76 61  AGMA aux.auto_va
7370: 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cuum = 0;.      
7380: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
7390: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
73a0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
73b0: 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20  .journal_mode = 
73c0: 57 41 4c 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  WAL;.      SELEC
73d0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
73e0: 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74  main.sqlite_mast
73f0: 65 72 2c 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d  er, aux.sqlite_m
7400: 61 73 74 65 72 3b 0a 20 20 20 20 20 20 50 52 41  aster;.      PRA
7410: 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f  GMA main.synchro
7420: 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20  nous = NORMAL;. 
7430: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
7440: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f  synchronous = NO
7450: 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47  RMAL;.      PRAG
7460: 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f  MA aux.synchrono
7470: 75 73 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 7d  us = FULL;.    }
7480: 0a 20 20 7d 20 7b 77 61 6c 20 77 61 6c 20 30 7d  .  } {wal wal 0}
7490: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..  do_test wal-
74a0: 31 36 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65  16.$tn.2 {.    e
74b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
74c0: 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e  REATE TABLE main
74d0: 2e 74 31 28 61 2c 20 62 2c 20 50 52 49 4d 41 52  .t1(a, b, PRIMAR
74e0: 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20  Y KEY(a, b));.  
74f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7500: 20 61 75 78 2e 74 32 28 61 2c 20 62 2c 20 50 52   aux.t2(a, b, PR
7510: 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29  IMARY KEY(a, b))
7520: 3b 0a 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  ;..      INSERT 
7530: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
7540: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
7550: 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  0));.      INSER
7560: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
7570: 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (2, randomblob(1
7580: 30 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  000));.      INS
7590: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
75a0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
75b0: 20 20 7d 0a 20 20 0a 20 20 20 20 6c 69 73 74 20    }.  .    list 
75c0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
75d0: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  db] [file size t
75e0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20  est.db-wal].  } 
75f0: 5b 6c 69 73 74 20 5b 65 78 70 72 20 31 2a 31 30  [list [expr 1*10
7600: 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69  24] [wal_file_si
7610: 7a 65 20 31 30 20 31 30 32 34 5d 5d 0a 20 20 64  ze 10 1024]].  d
7620: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74  o_test wal-16.$t
7630: 6e 2e 33 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b  n.3 {.    list [
7640: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e  file size test2.
7650: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  db] [file size t
7660: 65 73 74 32 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d  est2.db-wal].  }
7670: 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 31 2a 31   [list [expr 1*1
7680: 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  024] [wal_file_s
7690: 69 7a 65 20 31 33 20 31 30 32 34 5d 5d 0a 20 20  ize 13 1024]].  
76a0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
76b0: 36 2e 24 74 6e 2e 34 20 5b 6c 69 73 74 20 65 76  6.$tn.4 [list ev
76c0: 61 6c 20 24 63 6b 70 74 5f 63 6d 64 5d 20 24 63  al $ckpt_cmd] $c
76d0: 6b 70 74 5f 72 65 73 0a 20 20 0a 20 20 64 6f 5f  kpt_res.  .  do_
76e0: 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e  test wal-16.$tn.
76f0: 35 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 66 69  5 {.    list [fi
7700: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
7710: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
7720: 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c 69  .db-wal].  } [li
7730: 73 74 20 5b 65 78 70 72 20 28 24 63 6b 70 74 5f  st [expr ($ckpt_
7740: 6d 61 69 6e 20 3f 20 37 20 3a 20 31 29 2a 31 30  main ? 7 : 1)*10
7750: 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69  24] [wal_file_si
7760: 7a 65 20 31 30 20 31 30 32 34 5d 5d 0a 0a 20 20  ze 10 1024]]..  
7770: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24  do_test wal-16.$
7780: 74 6e 2e 36 20 7b 0a 20 20 20 20 6c 69 73 74 20  tn.6 {.    list 
7790: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32  [file size test2
77a0: 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  .db] [file size 
77b0: 74 65 73 74 32 2e 64 62 2d 77 61 6c 5d 0a 20 20  test2.db-wal].  
77c0: 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 28 24  } [list [expr ($
77d0: 63 6b 70 74 5f 61 75 78 20 3f 20 37 20 3a 20 31  ckpt_aux ? 7 : 1
77e0: 29 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c  )*1024] [wal_fil
77f0: 65 5f 73 69 7a 65 20 31 33 20 31 30 32 34 5d 5d  e_size 13 1024]]
7800: 0a 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 63  ..  catch { db c
7810: 6c 6f 73 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  lose }.}..#-----
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7860: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
7870: 77 69 6e 67 20 74 65 73 74 73 20 2d 20 77 61 6c  wing tests - wal
7880: 2d 31 37 2e 2a 20 2d 20 61 74 74 65 6d 70 74 20  -17.* - attempt 
7890: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
78a0: 68 65 20 63 6f 72 72 65 63 74 0a 23 20 6e 75 6d  he correct.# num
78b0: 62 65 72 20 6f 66 20 22 70 61 64 64 69 6e 67 22  ber of "padding"
78c0: 20 66 72 61 6d 65 73 20 61 72 65 20 61 70 70 65   frames are appe
78d0: 6e 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 67 20  nded to the log 
78e0: 66 69 6c 65 20 77 68 65 6e 20 61 20 74 72 61 6e  file when a tran
78f0: 73 61 63 74 69 6f 6e 0a 23 20 69 73 20 63 6f 6d  saction.# is com
7900: 6d 69 74 74 65 64 20 69 6e 20 73 79 6e 63 68 72  mitted in synchr
7910: 6f 6e 6f 75 73 3d 46 55 4c 4c 20 6d 6f 64 65 2e  onous=FULL mode.
7920: 0a 23 20 0a 23 20 44 6f 20 74 68 69 73 20 62 79  .# .# Do this by
7930: 20 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61   creating a data
7940: 62 61 73 65 20 74 68 61 74 20 75 73 65 73 20 35  base that uses 5
7950: 31 32 20 62 79 74 65 20 70 61 67 65 73 2e 20 54  12 byte pages. T
7960: 68 65 6e 20 77 72 69 74 69 6e 67 0a 23 20 61 20  hen writing.# a 
7970: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
7980: 20 6d 6f 64 69 66 69 65 73 20 31 37 31 20 70 61   modifies 171 pa
7990: 67 65 73 2e 20 49 6e 20 73 79 6e 63 68 72 6f 6e  ges. In synchron
79a0: 6f 75 73 3d 4e 4f 52 4d 41 4c 20 6d 6f 64 65 2c  ous=NORMAL mode,
79b0: 20 74 68 69 73 0a 23 20 70 72 6f 64 75 63 65 73   this.# produces
79c0: 20 61 20 6c 6f 67 20 66 69 6c 65 20 6f 66 3a 0a   a log file of:.
79d0: 23 0a 23 20 20 20 33 32 20 2b 20 28 32 34 2b 35  #.#   32 + (24+5
79e0: 31 32 29 2a 31 37 31 20 3d 20 39 30 33 31 32 20  12)*171 = 90312 
79f0: 62 79 74 65 73 2e 0a 23 0a 23 20 53 6c 69 67 68  bytes..#.# Sligh
7a00: 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
7a10: 31 31 2a 38 31 39 32 20 3d 20 39 30 31 31 32 20  11*8192 = 90112 
7a20: 62 79 74 65 73 2e 0a 23 0a 23 20 52 75 6e 20 74  bytes..#.# Run t
7a30: 68 65 20 74 65 73 74 20 75 73 69 6e 67 20 76 61  he test using va
7a40: 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20  rious different 
7a50: 73 65 63 74 6f 72 2d 73 69 7a 65 73 2e 20 49 6e  sector-sizes. In
7a60: 20 65 61 63 68 20 63 61 73 65 2c 20 74 68 65 0a   each case, the.
7a70: 23 20 57 41 4c 20 63 6f 64 65 20 73 68 6f 75 6c  # WAL code shoul
7a80: 64 20 77 72 69 74 65 20 74 68 65 20 39 30 33 30  d write the 9030
7a90: 30 20 62 79 74 65 73 20 6f 66 20 6c 6f 67 20 66  0 bytes of log f
7aa0: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
7ab0: 68 65 20 0a 23 20 74 72 61 6e 73 61 63 74 69 6f  he .# transactio
7ac0: 6e 2c 20 74 68 65 6e 20 61 70 70 65 6e 64 20 61  n, then append a
7ad0: 73 20 6d 61 79 20 66 72 61 6d 65 73 20 61 73 20  s may frames as 
7ae0: 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
7af0: 65 78 74 65 6e 64 20 74 68 65 0a 23 20 6c 6f 67  extend the.# log
7b00: 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 6e 6f   file so that no
7b10: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78   part of the nex
7b20: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  t transaction wi
7b30: 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ll be written in
7b40: 74 6f 0a 23 20 61 20 64 69 73 6b 2d 73 65 63 74  to.# a disk-sect
7b50: 6f 72 20 75 73 65 64 20 62 79 20 74 72 61 6e 73  or used by trans
7b60: 61 63 74 69 6f 6e 20 6a 75 73 74 20 63 6f 6d 6d  action just comm
7b70: 69 74 74 65 64 2e 0a 23 0a 73 65 74 20 6f 6c 64  itted..#.set old
7b80: 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 5b 73  _pending_byte [s
7b90: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
7ba0: 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65  rol_pending_byte
7bb0: 20 30 78 31 30 30 30 30 30 30 30 5d 0a 63 61 74   0x10000000].cat
7bc0: 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
7bd0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65 63 74  foreach {tn sect
7be0: 6f 72 73 69 7a 65 20 6c 6f 67 73 69 7a 65 7d 20  orsize logsize} 
7bf0: 22 0a 20 20 31 20 20 20 31 32 38 20 20 5b 77 61  ".  1   128  [wa
7c00: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 32 20  l_file_size 172 
7c10: 35 31 32 5d 0a 20 20 32 20 20 20 32 35 36 20 20  512].  2   256  
7c20: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31  [wal_file_size 1
7c30: 37 32 20 35 31 32 5d 0a 20 20 33 20 20 20 35 31  72 512].  3   51
7c40: 32 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  2  [wal_file_siz
7c50: 65 20 31 37 32 20 35 31 32 5d 20 0a 20 20 34 20  e 172 512] .  4 
7c60: 20 31 30 32 34 20 20 5b 77 61 6c 5f 66 69 6c 65   1024  [wal_file
7c70: 5f 73 69 7a 65 20 31 37 32 20 35 31 32 5d 0a 20  _size 172 512]. 
7c80: 20 35 20 20 32 30 34 38 20 20 5b 77 61 6c 5f 66   5  2048  [wal_f
7c90: 69 6c 65 5f 73 69 7a 65 20 31 37 32 20 35 31 32  ile_size 172 512
7ca0: 5d 0a 20 20 36 20 20 34 30 39 36 20 20 5b 77 61  ].  6  4096  [wa
7cb0: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 36 20  l_file_size 176 
7cc0: 35 31 32 5d 0a 20 20 37 20 20 38 31 39 32 20 20  512].  7  8192  
7cd0: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31  [wal_file_size 1
7ce0: 38 34 20 35 31 32 5d 0a 22 20 7b 0a 20 20 66 6f  84 512]." {.  fo
7cf0: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
7d00: 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  b test.db-wal te
7d10: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  st.db-journal.  
7d20: 73 71 6c 69 74 65 33 5f 73 69 6d 75 6c 61 74 65  sqlite3_simulate
7d30: 5f 64 65 76 69 63 65 20 2d 73 65 63 74 6f 72 73  _device -sectors
7d40: 69 7a 65 20 24 73 65 63 74 6f 72 73 69 7a 65 0a  ize $sectorsize.
7d50: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
7d60: 74 2e 64 62 20 2d 76 66 73 20 64 65 76 73 79 6d  t.db -vfs devsym
7d70: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..  do_test wal-
7d80: 31 37 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65  17.$tn.1 {.    e
7d90: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
7da0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
7db0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 52 41  m = 0;.      PRA
7dc0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
7dd0: 35 31 32 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  512;.      PRAGM
7de0: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 2d  A cache_size = -
7df0: 32 30 30 30 3b 0a 20 20 20 20 20 20 50 52 41 47  2000;.      PRAG
7e00: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7e10: 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 53 45 4c  = WAL;.      SEL
7e20: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
7e30: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20 20  e_master;.      
7e40: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
7e50: 75 73 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 7d  us = FULL;.    }
7e60: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
7e70: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
7e80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7e90: 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (x);.    }.    f
7ea0: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
7eb0: 3c 31 36 36 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  <166} {incr i} {
7ec0: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
7ed0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 20 56   INSERT INTO t V
7ee0: 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
7ef0: 28 34 30 30 29 29 20 7d 0a 20 20 20 20 7d 0a 20  (400)) }.    }. 
7f00: 20 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49     execsql COMMI
7f10: 54 0a 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65  T..    file size
7f20: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 7d   test.db-wal.  }
7f30: 20 24 6c 6f 67 73 69 7a 65 0a 0a 20 20 64 6f 5f   $logsize..  do_
7f40: 74 65 73 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e  test wal-17.$tn.
7f50: 32 20 7b 0a 20 20 20 20 66 69 6c 65 20 73 69 7a  2 {.    file siz
7f60: 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 35 31  e test.db.  } 51
7f70: 32 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  2..  do_test wal
7f80: 2d 31 37 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  -17.$tn.3 {.    
7f90: 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 66 69 6c  db close.    fil
7fa0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20  e size test.db. 
7fb0: 20 7d 20 5b 65 78 70 72 20 35 31 32 2a 31 37 31   } [expr 512*171
7fc0: 5d 0a 7d 0a 73 71 6c 69 74 65 33 5f 74 65 73 74  ].}.sqlite3_test
7fd0: 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67  _control_pending
7fe0: 5f 62 79 74 65 20 24 6f 6c 64 5f 70 65 6e 64 69  _byte $old_pendi
7ff0: 6e 67 5f 62 79 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d  ng_byte..#------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8040: 2d 2d 2d 0a 23 20 54 68 69 73 20 74 65 73 74 20  ---.# This test 
8050: 2d 20 77 61 6c 2d 31 38 2e 2a 20 2d 20 76 65 72  - wal-18.* - ver
8060: 69 66 69 65 73 20 61 20 63 6f 75 70 6c 65 20 6f  ifies a couple o
8070: 66 20 73 70 65 63 69 66 69 63 20 63 6f 6e 64 69  f specific condi
8080: 74 69 6f 6e 73 20 74 68 61 74 0a 23 20 6d 61 79  tions that.# may
8090: 20 62 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   be encountered 
80a0: 77 68 69 6c 65 20 72 65 63 6f 76 65 72 69 6e 67  while recovering
80b0: 20 61 20 6c 6f 67 20 66 69 6c 65 20 61 72 65 20   a log file are 
80c0: 68 61 6e 64 6c 65 64 20 63 6f 72 72 65 63 74 6c  handled correctl
80d0: 79 3a 0a 23 0a 23 20 20 20 77 61 6c 2d 31 38 2e  y:.#.#   wal-18.
80e0: 31 2e 2a 20 57 68 65 6e 20 74 68 65 20 66 69 72  1.* When the fir
80f0: 73 74 20 33 32 2d 62 69 74 73 20 6f 66 20 61 20  st 32-bits of a 
8100: 66 72 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 69  frame checksum i
8110: 73 20 63 6f 72 72 65 63 74 20 62 75 74 20 0a 23  s correct but .#
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
8130: 65 20 73 65 63 6f 6e 64 20 33 32 2d 62 69 74 73  e second 32-bits
8140: 20 61 72 65 20 66 61 6c 73 65 2c 20 61 6e 64 0a   are false, and.
8150: 23 0a 23 20 20 20 77 61 6c 2d 31 38 2e 32 2e 2a  #.#   wal-18.2.*
8160: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 2d 73   When the page-s
8170: 69 7a 65 20 66 69 65 6c 64 20 74 68 61 74 20 6f  ize field that o
8180: 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61  ccurs at the sta
8190: 72 74 20 6f 66 20 61 20 6c 6f 67 0a 23 20 20 20  rt of a log.#   
81a0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
81b0: 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  is a power of 2 
81c0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 36 33  greater than 163
81d0: 38 34 20 6f 72 20 73 6d 61 6c 6c 65 72 20 74 68  84 or smaller th
81e0: 61 6e 20 35 31 32 2e 0a 23 0a 66 6f 72 63 65 64  an 512..#.forced
81f0: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65  elete test.db te
8200: 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64  st.db-wal test.d
8210: 62 2d 6a 6f 75 72 6e 61 6c 0a 64 6f 5f 74 65 73  b-journal.do_tes
8220: 74 20 77 61 6c 2d 31 38 2e 30 20 7b 0a 20 20 73  t wal-18.0 {.  s
8230: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
8240: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
8250: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
8260: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50  ze = 1024;.    P
8270: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
8280: 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52 41 47 4d  m = 0;.    PRAGM
8290: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
82a0: 20 57 41 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41   WAL;.    PRAGMA
82b0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f   synchronous = O
82c0: 46 46 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  FF;..    CREATE 
82d0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 55  TABLE t1(a, b, U
82e0: 4e 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20  NIQUE(a, b));.  
82f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
8300: 20 56 41 4c 55 45 53 28 30 2c 20 30 29 3b 0a 20   VALUES(0, 0);. 
8310: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
8320: 65 63 6b 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 49  eckpoint;..    I
8330: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
8340: 4c 55 45 53 28 31 2c 20 32 29 3b 20 20 20 20 20  LUES(1, 2);     
8350: 20 20 20 20 20 2d 2d 20 66 72 61 6d 65 73 20 31       -- frames 1
8360: 20 61 6e 64 20 32 0a 20 20 20 20 49 4e 53 45 52   and 2.    INSER
8370: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
8380: 28 33 2c 20 34 29 3b 20 20 20 20 20 20 20 20 20  (3, 4);         
8390: 20 2d 2d 20 66 72 61 6d 65 73 20 33 20 61 6e 64   -- frames 3 and
83a0: 20 34 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   4.    INSERT IN
83b0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
83c0: 36 29 3b 20 20 20 20 20 20 20 20 20 20 2d 2d 20  6);          -- 
83d0: 66 72 61 6d 65 73 20 35 20 61 6e 64 20 36 0a 20  frames 5 and 6. 
83e0: 20 7d 0a 0a 20 20 66 6f 72 63 65 63 6f 70 79 20   }..  forcecopy 
83f0: 74 65 73 74 2e 64 62 20 74 65 73 74 58 2e 64 62  test.db testX.db
8400: 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73  .  forcecopy tes
8410: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 58 2e 64  t.db-wal testX.d
8420: 62 2d 77 61 6c 0a 20 20 64 62 20 63 6c 6f 73 65  b-wal.  db close
8430: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69  .  list [file si
8440: 7a 65 20 74 65 73 74 58 2e 64 62 5d 20 5b 66 69  ze testX.db] [fi
8450: 6c 65 20 73 69 7a 65 20 74 65 73 74 58 2e 64 62  le size testX.db
8460: 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 5b 65  -wal].} [list [e
8470: 78 70 72 20 33 2a 31 30 32 34 5d 20 5b 77 61 6c  xpr 3*1024] [wal
8480: 5f 66 69 6c 65 5f 73 69 7a 65 20 36 20 31 30 32  _file_size 6 102
8490: 34 5d 5d 0a 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f  4]]..unset -noco
84a0: 6d 70 6c 61 69 6e 20 6e 46 72 61 6d 65 20 72 65  mplain nFrame re
84b0: 73 75 6c 74 0a 66 6f 72 65 61 63 68 20 7b 6e 46  sult.foreach {nF
84c0: 72 61 6d 65 20 72 65 73 75 6c 74 7d 20 7b 0a 20  rame result} {. 
84d0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 7b          0      {
84e0: 30 20 30 7d 0a 20 20 20 20 20 20 20 20 20 31 20  0 0}.         1 
84f0: 20 20 20 20 20 7b 30 20 30 7d 0a 20 20 20 20 20       {0 0}.     
8500: 20 20 20 20 32 20 20 20 20 20 20 7b 30 20 30 20      2      {0 0 
8510: 31 20 32 7d 0a 20 20 20 20 20 20 20 20 20 33 20  1 2}.         3 
8520: 20 20 20 20 20 7b 30 20 30 20 31 20 32 7d 0a 20       {0 0 1 2}. 
8530: 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 7b          4      {
8540: 30 20 30 20 31 20 32 20 33 20 34 7d 0a 20 20 20  0 0 1 2 3 4}.   
8550: 20 20 20 20 20 20 35 20 20 20 20 20 20 7b 30 20        5      {0 
8560: 30 20 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20  0 1 2 3 4}.     
8570: 20 20 20 20 36 20 20 20 20 20 20 7b 30 20 30 20      6      {0 0 
8580: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 7d 20 7b  1 2 3 4 5 6}.} {
8590: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
85a0: 38 2e 31 2e 24 6e 46 72 61 6d 65 20 7b 0a 20 20  8.1.$nFrame {.  
85b0: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
85c0: 58 2e 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  X.db test.db.   
85d0: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 58   forcecopy testX
85e0: 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d  .db-wal test.db-
85f0: 77 61 6c 0a 0a 20 20 20 20 68 65 78 69 6f 5f 77  wal..    hexio_w
8600: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  rite test.db-wal
8610: 20 5b 65 78 70 72 20 32 34 20 2b 20 24 6e 46 72   [expr 24 + $nFr
8620: 61 6d 65 2a 28 32 34 2b 31 30 32 34 29 20 2b 20  ame*(24+1024) + 
8630: 32 30 5d 20 30 30 30 30 30 30 30 30 0a 0a 20 20  20] 00000000..  
8640: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
8650: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
8660: 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54   { .      SELECT
8670: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
8680: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
8690: 74 79 5f 63 68 65 63 6b 3b 20 0a 20 20 20 20 7d  ty_check; .    }
86a0: 0a 20 20 7d 20 5b 63 6f 6e 63 61 74 20 24 72 65  .  } [concat $re
86b0: 73 75 6c 74 20 6f 6b 5d 0a 20 20 64 62 20 63 6c  sult ok].  db cl
86c0: 6f 73 65 0a 7d 20 0a 0a 70 72 6f 63 20 72 61 6e  ose.} ..proc ran
86d0: 64 6f 6d 62 6c 6f 62 20 7b 70 67 73 7a 7d 20 7b  domblob {pgsz} {
86e0: 0a 20 20 73 71 6c 69 74 65 33 20 72 62 64 62 20  .  sqlite3 rbdb 
86f0: 3a 6d 65 6d 6f 72 79 3a 0a 20 20 73 65 74 20 62  :memory:.  set b
8700: 6c 6f 62 20 5b 72 62 64 62 20 6f 6e 65 20 7b 53  lob [rbdb one {S
8710: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
8720: 28 24 70 67 73 7a 29 7d 5d 0a 20 20 72 62 64 62  ($pgsz)}].  rbdb
8730: 20 63 6c 6f 73 65 0a 20 20 73 65 74 20 62 6c 6f   close.  set blo
8740: 62 0a 7d 0a 0a 70 72 6f 63 20 6c 6f 67 63 6b 73  b.}..proc logcks
8750: 75 6d 20 7b 63 6b 76 31 20 63 6b 76 32 20 62 6c  um {ckv1 ckv2 bl
8760: 6f 62 7d 20 7b 0a 20 20 75 70 76 61 72 20 24 63  ob} {.  upvar $c
8770: 6b 76 31 20 63 31 0a 20 20 75 70 76 61 72 20 24  kv1 c1.  upvar $
8780: 63 6b 76 32 20 63 32 0a 0a 20 20 73 65 74 20 73  ckv2 c2..  set s
8790: 63 61 6e 70 61 74 74 65 72 6e 20 49 2a 0a 20 20  canpattern I*.  
87a0: 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  if {$::tcl_platf
87b0: 6f 72 6d 28 62 79 74 65 4f 72 64 65 72 29 20 65  orm(byteOrder) e
87c0: 71 20 22 6c 69 74 74 6c 65 45 6e 64 69 61 6e 22  q "littleEndian"
87d0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 63 61 6e  } {.    set scan
87e0: 70 61 74 74 65 72 6e 20 69 2a 0a 20 20 7d 0a 0a  pattern i*.  }..
87f0: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 62    binary scan $b
8800: 6c 6f 62 20 24 73 63 61 6e 70 61 74 74 65 72 6e  lob $scanpattern
8810: 20 76 61 6c 75 65 73 0a 20 20 66 6f 72 65 61 63   values.  foreac
8820: 68 20 7b 76 31 20 76 32 7d 20 24 76 61 6c 75 65  h {v1 v2} $value
8830: 73 20 7b 0a 20 20 20 20 73 65 74 20 63 31 20 5b  s {.    set c1 [
8840: 65 78 70 72 20 7b 28 24 63 31 20 2b 20 24 76 31  expr {($c1 + $v1
8850: 20 2b 20 24 63 32 29 26 30 78 46 46 46 46 46 46   + $c2)&0xFFFFFF
8860: 46 46 7d 5d 0a 20 20 20 20 73 65 74 20 63 32 20  FF}].    set c2 
8870: 5b 65 78 70 72 20 7b 28 24 63 32 20 2b 20 24 76  [expr {($c2 + $v
8880: 32 20 2b 20 24 63 31 29 26 30 78 46 46 46 46 46  2 + $c1)&0xFFFFF
8890: 46 46 46 7d 5d 0a 20 20 7d 0a 7d 0a 0a 66 6f 72  FFF}].  }.}..for
88a0: 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 20 74  cecopy test.db t
88b0: 65 73 74 58 2e 64 62 0a 66 6f 72 65 61 63 68 20  estX.db.foreach 
88c0: 7b 74 6e 20 70 67 73 7a 20 77 6f 72 6b 73 7d 20  {tn pgsz works} 
88d0: 7b 20 0a 20 20 31 20 20 20 20 31 32 38 20 20 20  { .  1    128   
88e0: 20 30 0a 20 20 32 20 20 20 20 32 35 36 20 20 20   0.  2    256   
88f0: 20 30 0a 20 20 33 20 20 20 20 35 31 32 20 20 20   0.  3    512   
8900: 20 31 0a 20 20 34 20 20 20 31 30 32 34 20 20 20   1.  4   1024   
8910: 20 31 0a 20 20 35 20 20 20 32 30 34 38 20 20 20   1.  5   2048   
8920: 20 31 0a 20 20 36 20 20 20 34 30 39 36 20 20 20   1.  6   4096   
8930: 20 31 0a 20 20 37 20 20 20 38 31 39 32 20 20 20   1.  7   8192   
8940: 20 31 0a 20 20 38 20 20 31 36 33 38 34 20 20 20   1.  8  16384   
8950: 20 31 0a 20 20 39 20 20 33 32 37 36 38 20 20 20   1.  9  32768   
8960: 20 31 0a 20 31 30 20 20 36 35 35 33 36 20 20 20   1. 10  65536   
8970: 20 31 0a 20 31 31 20 31 33 31 30 37 32 20 20 20   1. 11 131072   
8980: 20 30 0a 20 31 31 20 20 20 31 30 31 36 20 20 20   0. 11   1016   
8990: 20 30 0a 7d 20 7b 0a 0a 20 20 69 66 20 7b 24 3a   0.} {..  if {$:
89a0: 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  :SQLITE_MAX_PAGE
89b0: 5f 53 49 5a 45 20 3c 20 24 70 67 73 7a 7d 20 7b  _SIZE < $pgsz} {
89c0: 0a 20 20 20 20 73 65 74 20 77 6f 72 6b 73 20 30  .    set works 0
89d0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74  .  }..  for {set
89e0: 20 70 67 20 31 7d 20 7b 24 70 67 20 3c 3d 20 33   pg 1} {$pg <= 3
89f0: 7d 20 7b 69 6e 63 72 20 70 67 7d 20 7b 0a 20 20  } {incr pg} {.  
8a00: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
8a10: 58 2e 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  X.db test.db.   
8a20: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
8a30: 74 2e 64 62 2d 77 61 6c 0a 20 20 0a 20 20 20 20  t.db-wal.  .    
8a40: 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  # Check that the
8a50: 20 64 61 74 61 62 61 73 65 20 6e 6f 77 20 65 78   database now ex
8a60: 69 73 74 73 20 61 6e 64 20 63 6f 6e 73 69 73 74  ists and consist
8a70: 73 20 6f 66 20 74 68 72 65 65 20 70 61 67 65 73  s of three pages
8a80: 2e 20 41 6e 64 0a 20 20 20 20 23 20 74 68 61 74  . And.    # that
8a90: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 73 73   there is no ass
8aa0: 6f 63 69 61 74 65 64 20 77 61 6c 20 66 69 6c 65  ociated wal file
8ab0: 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74  ..    #.    do_t
8ac0: 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e  est wal-18.2.$tn
8ad0: 2e 24 70 67 2e 31 20 7b 20 66 69 6c 65 20 65 78  .$pg.1 { file ex
8ae0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
8af0: 20 7d 20 30 0a 20 20 20 20 64 6f 5f 74 65 73 74   } 0.    do_test
8b00: 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70   wal-18.2.$tn.$p
8b10: 67 2e 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74  g.2 { file exist
8b20: 73 20 74 65 73 74 2e 64 62 20 7d 20 31 0a 20 20  s test.db } 1.  
8b30: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38    do_test wal-18
8b40: 2e 32 2e 24 74 6e 2e 24 70 67 2e 33 20 7b 20 66  .2.$tn.$pg.3 { f
8b50: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
8b60: 20 7d 20 5b 65 78 70 72 20 31 30 32 34 2a 33 5d   } [expr 1024*3]
8b70: 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  .  .    do_test 
8b80: 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67  wal-18.2.$tn.$pg
8b90: 2e 34 20 7b 0a 0a 20 20 20 20 20 20 23 20 43 72  .4 {..      # Cr
8ba0: 65 61 74 65 20 61 20 77 61 6c 20 66 69 6c 65 20  eate a wal file 
8bb0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
8bc0: 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 28 64 61  single frame (da
8bd0: 74 61 62 61 73 65 20 70 61 67 65 0a 20 20 20 20  tabase page.    
8be0: 20 20 23 20 6e 75 6d 62 65 72 20 24 70 67 29 20    # number $pg) 
8bf0: 77 69 74 68 20 74 68 65 20 63 6f 6d 6d 69 74 20  with the commit 
8c00: 66 6c 61 67 20 73 65 74 2e 20 54 68 65 20 66 72  flag set. The fr
8c10: 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 69 73 0a  ame checksum is.
8c20: 20 20 20 20 20 20 23 20 63 6f 72 72 65 63 74 2c        # correct,
8c30: 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
8c40: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
8c50: 65 20 70 61 67 65 20 61 72 65 20 63 6f 72 72 75  e page are corru
8c60: 70 74 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20  pt..      #.    
8c70: 20 20 23 20 54 68 65 20 70 61 67 65 2d 73 69 7a    # The page-siz
8c80: 65 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  e in the log fil
8c90: 65 20 68 65 61 64 65 72 20 69 73 20 73 65 74 20  e header is set 
8ca0: 74 6f 20 24 70 67 73 7a 2e 20 49 66 20 74 68 65  to $pgsz. If the
8cb0: 0a 20 20 20 20 20 20 23 20 57 41 4c 20 63 6f 64  .      # WAL cod
8cc0: 65 20 63 6f 6e 73 69 64 65 72 73 20 24 70 67 73  e considers $pgs
8cd0: 7a 20 74 6f 20 62 65 20 61 20 76 61 6c 69 64 20  z to be a valid 
8ce0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
8cf0: 66 69 6c 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a  file page-size,.
8d00: 20 20 20 20 20 20 23 20 74 68 65 20 64 61 74 61        # the data
8d10: 62 61 73 65 20 77 69 6c 6c 20 62 65 20 63 6f 72  base will be cor
8d20: 72 75 70 74 20 28 62 65 63 61 75 73 65 20 74 68  rupt (because th
8d30: 65 20 67 61 72 62 61 67 65 20 66 72 61 6d 65 20  e garbage frame 
8d40: 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20 23  contents.      #
8d50: 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
8d60: 20 61 73 20 76 61 6c 69 64 20 63 6f 6e 74 65 6e   as valid conten
8d70: 74 29 2e 20 49 66 20 24 70 67 73 7a 20 69 73 20  t). If $pgsz is 
8d80: 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20 73 6d 61  invalid (too sma
8d90: 6c 6c 0a 20 20 20 20 20 20 23 20 6f 72 20 74 6f  ll.      # or to
8da0: 6f 20 6c 61 72 67 65 29 2c 20 74 68 65 20 64 62  o large), the db
8db0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
8dc0: 72 75 70 74 20 61 73 20 74 68 65 20 6c 6f 67 20  rupt as the log 
8dd0: 66 69 6c 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  file will.      
8de0: 23 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  # be ignored..  
8df0: 20 20 20 20 23 0a 20 20 20 20 20 20 73 65 74 20      #.      set 
8e00: 77 61 6c 68 64 72 20 5b 62 69 6e 61 72 79 20 66  walhdr [binary f
8e10: 6f 72 6d 61 74 20 49 49 49 49 49 49 20 39 33 31  ormat IIIIII 931
8e20: 30 37 31 36 31 38 20 33 30 30 37 30 30 30 20 24  071618 3007000 $
8e30: 70 67 73 7a 20 31 32 33 34 20 32 32 20 32 33 5d  pgsz 1234 22 23]
8e40: 0a 20 20 20 20 20 20 73 65 74 20 66 72 61 6d 65  .      set frame
8e50: 62 6f 64 79 20 5b 72 61 6e 64 6f 6d 62 6c 6f 62  body [randomblob
8e60: 20 24 70 67 73 7a 5d 0a 20 20 20 20 20 20 73 65   $pgsz].      se
8e70: 74 20 66 72 61 6d 65 68 64 72 20 20 5b 62 69 6e  t framehdr  [bin
8e80: 61 72 79 20 66 6f 72 6d 61 74 20 49 49 49 49 20  ary format IIII 
8e90: 24 70 67 20 35 20 32 32 20 32 33 5d 0a 20 20 20  $pg 5 22 23].   
8ea0: 20 20 20 73 65 74 20 63 31 20 30 0a 20 20 20 20     set c1 0.    
8eb0: 20 20 73 65 74 20 63 32 20 30 0a 20 20 20 20 20    set c2 0.     
8ec0: 20 6c 6f 67 63 6b 73 75 6d 20 63 31 20 63 32 20   logcksum c1 c2 
8ed0: 24 77 61 6c 68 64 72 0a 0a 20 20 20 20 20 20 61  $walhdr..      a
8ee0: 70 70 65 6e 64 20 77 61 6c 68 64 72 20 5b 62 69  ppend walhdr [bi
8ef0: 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49 20 24  nary format II $
8f00: 63 31 20 24 63 32 5d 0a 20 20 20 20 20 20 6c 6f  c1 $c2].      lo
8f10: 67 63 6b 73 75 6d 20 63 31 20 63 32 20 5b 73 74  gcksum c1 c2 [st
8f20: 72 69 6e 67 20 72 61 6e 67 65 20 24 66 72 61 6d  ring range $fram
8f30: 65 68 64 72 20 30 20 37 5d 0a 20 20 20 20 20 20  ehdr 0 7].      
8f40: 6c 6f 67 63 6b 73 75 6d 20 63 31 20 63 32 20 24  logcksum c1 c2 $
8f50: 66 72 61 6d 65 62 6f 64 79 0a 20 20 20 20 20 20  framebody.      
8f60: 73 65 74 20 66 72 61 6d 65 68 64 72 20 5b 62 69  set framehdr [bi
8f70: 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49 49 49  nary format IIII
8f80: 49 49 20 24 70 67 20 35 20 32 32 20 32 33 20 24  II $pg 5 22 23 $
8f90: 63 31 20 24 63 32 5d 0a 0a 20 20 20 20 20 20 73  c1 $c2]..      s
8fa0: 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74  et fd [open test
8fb0: 2e 64 62 2d 77 61 6c 20 77 5d 0a 20 20 20 20 20  .db-wal w].     
8fc0: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66 64 20   fconfigure $fd 
8fd0: 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79  -encoding binary
8fe0: 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69   -translation bi
8ff0: 6e 61 72 79 0a 20 20 20 20 20 20 70 75 74 73 20  nary.      puts 
9000: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 24  -nonewline $fd $
9010: 77 61 6c 68 64 72 0a 20 20 20 20 20 20 70 75 74  walhdr.      put
9020: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64  s -nonewline $fd
9030: 20 24 66 72 61 6d 65 68 64 72 0a 20 20 20 20 20   $framehdr.     
9040: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
9050: 20 24 66 64 20 24 66 72 61 6d 65 62 6f 64 79 0a   $fd $framebody.
9060: 20 20 20 20 20 20 63 6c 6f 73 65 20 24 66 64 0a        close $fd.
9070: 20 20 0a 20 20 20 20 20 20 66 69 6c 65 20 73 69    .      file si
9080: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  ze test.db-wal. 
9090: 20 20 20 7d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73     } [wal_file_s
90a0: 69 7a 65 20 31 20 24 70 67 73 7a 5d 0a 20 20 0a  ize 1 $pgsz].  .
90b0: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
90c0: 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 35 20 7b  18.2.$tn.$pg.5 {
90d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64  .      sqlite3 d
90e0: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 20 20  b test.db.      
90f0: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20  set rc [catch { 
9100: 64 62 20 6f 6e 65 20 7b 50 52 41 47 4d 41 20 69  db one {PRAGMA i
9110: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 20  ntegrity_check} 
9120: 7d 20 6d 73 67 5d 0a 20 20 20 20 20 20 65 78 70  } msg].      exp
9130: 72 20 7b 20 24 72 63 21 3d 30 20 7c 7c 20 24 6d  r { $rc!=0 || $m
9140: 73 67 21 3d 22 6f 6b 22 20 7d 0a 20 20 20 20 7d  sg!="ok" }.    }
9150: 20 24 77 6f 72 6b 73 0a 20 20 0a 20 20 20 20 64   $works.  .    d
9160: 62 20 63 6c 6f 73 65 0a 20 20 7d 0a 7d 0a 0a 23  b close.  }.}..#
9170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
91c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 2d  following test -
91d0: 20 77 61 6c 2d 31 39 2e 2a 20 2d 20 66 69 78 65   wal-19.* - fixe
91e0: 73 20 61 20 62 75 67 20 74 68 61 74 20 77 61 73  s a bug that was
91f0: 20 70 72 65 73 65 6e 74 20 64 75 72 69 6e 67 0a   present during.
9200: 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74 2e 0a 23  # development..#
9210: 0a 23 20 57 68 65 6e 20 61 20 64 61 74 61 62 61  .# When a databa
9220: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  se connection in
9230: 20 57 41 4c 20 6d 6f 64 65 20 69 73 20 63 6c 6f   WAL mode is clo
9240: 73 65 64 2c 20 69 74 20 61 74 74 65 6d 70 74 73  sed, it attempts
9250: 20 61 6e 0a 23 20 45 58 43 4c 55 53 49 56 45 20   an.# EXCLUSIVE 
9260: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9270: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
9280: 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
9290: 65 64 2c 20 74 68 65 0a 23 20 63 6f 6e 6e 65 63  ed, the.# connec
92a0: 74 69 6f 6e 20 6b 6e 6f 77 73 20 74 68 61 74 20  tion knows that 
92b0: 69 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  it is the last c
92c0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 64 69 73  onnection to dis
92d0: 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 0a 23 20 74  connect from.# t
92e0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 73 6f 20  he database, so 
92f0: 69 74 20 72 75 6e 73 20 61 20 63 68 65 63 6b 70  it runs a checkp
9300: 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20  oint operation. 
9310: 54 68 65 20 62 75 67 20 77 61 73 20 74 68 61 74  The bug was that
9320: 0a 23 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  .# the connectio
9330: 6e 20 77 61 73 20 6e 6f 74 20 75 70 64 61 74 69  n was not updati
9340: 6e 67 20 69 74 73 20 70 72 69 76 61 74 65 20 63  ng its private c
9350: 6f 70 79 20 6f 66 20 74 68 65 20 77 61 6c 2d 69  opy of the wal-i
9360: 6e 64 65 78 20 0a 23 20 68 65 61 64 65 72 20 62  ndex .# header b
9370: 65 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f 2c 20  efore doing so, 
9380: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20  meaning that it 
9390: 63 6f 75 6c 64 20 63 68 65 63 6b 70 6f 69 6e 74  could checkpoint
93a0: 20 61 6e 20 6f 6c 64 0a 23 20 73 6e 61 70 73 68   an old.# snapsh
93b0: 6f 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61  ot..#.do_test wa
93c0: 6c 2d 31 39 2e 31 20 7b 0a 20 20 66 6f 72 63 65  l-19.1 {.  force
93d0: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74  delete test.db t
93e0: 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e  est.db-wal test.
93f0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c  db-journal.  sql
9400: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
9410: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
9420: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
9430: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
9440: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
9450: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9460: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
9470: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
9480: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
9490: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
94a0: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
94b0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
94c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
94d0: 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 7d   db2.} {1 2 3 4}
94e0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 39 2e  .do_test wal-19.
94f0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
9500: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9510: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
9520: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
9530: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
9540: 32 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65  2 3 4 5 6}.do_te
9550: 73 74 20 77 61 6c 2d 31 39 2e 33 20 7b 0a 20 20  st wal-19.3 {.  
9560: 64 62 20 63 6c 6f 73 65 0a 20 20 64 62 32 20 63  db close.  db2 c
9570: 6c 6f 73 65 0a 20 20 66 69 6c 65 20 65 78 69 73  lose.  file exis
9580: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d  ts test.db-wal.}
9590: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   {0}.do_test wal
95a0: 2d 31 39 2e 34 20 7b 0a 20 20 23 20 57 68 65 6e  -19.4 {.  # When
95b0: 20 74 68 65 20 62 75 67 20 77 61 73 20 70 72 65   the bug was pre
95c0: 73 65 6e 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  sent, the follow
95d0: 69 6e 67 20 77 61 73 20 72 65 74 75 72 6e 69 6e  ing was returnin
95e0: 67 20 7b 31 20 32 20 33 20 34 7d 20 6f 6e 6c 79  g {1 2 3 4} only
95f0: 2c 0a 20 20 23 20 61 73 20 5b 64 62 32 5d 20 68  ,.  # as [db2] h
9600: 61 64 20 61 6e 20 6f 75 74 2d 6f 66 2d 64 61 74  ad an out-of-dat
9610: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 77 61  e copy of the wa
9620: 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 20 77  l-index header w
9630: 68 65 6e 20 69 74 20 77 61 73 0a 20 20 23 20 63  hen it was.  # c
9640: 6c 6f 73 65 64 2e 0a 20 20 23 0a 20 20 73 71 6c  losed..  #.  sql
9650: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
9660: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
9670: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  CT * FROM t1 }.}
9680: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a   {1 2 3 4 5 6}..
9690: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
96a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
96b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
96c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
96d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69  ----------.# Thi
96e0: 73 20 74 65 73 74 20 2d 20 77 61 6c 2d 32 30 2e  s test - wal-20.
96f0: 2a 20 2d 20 75 73 65 73 20 74 77 6f 20 63 6f 6e  * - uses two con
9700: 6e 65 63 74 69 6f 6e 73 2e 20 4f 6e 65 20 69 6e  nections. One in
9710: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 61 6e   this process an
9720: 64 0a 23 20 74 68 65 20 6f 74 68 65 72 20 69 6e  d.# the other in
9730: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 6f   an external pro
9740: 63 65 73 73 2e 20 54 68 65 20 70 72 6f 63 65 64  cess. The proced
9750: 75 72 65 20 69 73 3a 0a 23 0a 23 20 20 20 31 2e  ure is:.#.#   1.
9760: 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f   Using connectio
9770: 6e 20 31 2c 20 63 72 65 61 74 65 20 74 68 65 20  n 1, create the 
9780: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
9790: 0a 23 0a 23 20 20 20 32 2e 20 55 73 69 6e 67 20  .#.#   2. Using 
97a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20 28 69 6e  connection 2 (in
97b0: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 6f   an external pro
97c0: 63 65 73 73 29 2c 20 61 64 64 20 73 6f 20 6d 75  cess), add so mu
97d0: 63 68 0a 23 20 20 20 20 20 20 64 61 74 61 20 74  ch.#      data t
97e0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  o the database w
97f0: 69 74 68 6f 75 74 20 63 68 65 63 6b 70 6f 69 6e  ithout checkpoin
9800: 74 69 6e 67 20 74 68 61 74 20 61 20 77 61 6c 2d  ting that a wal-
9810: 69 6e 64 65 78 20 0a 23 20 20 20 20 20 20 6c 61  index .#      la
9820: 72 67 65 72 20 74 68 61 6e 20 36 34 4b 42 20 69  rger than 64KB i
9830: 73 20 72 65 71 75 69 72 65 64 2e 0a 23 0a 23 20  s required..#.# 
9840: 20 20 33 2e 20 55 73 69 6e 67 20 63 6f 6e 6e 65    3. Using conne
9850: 63 74 69 6f 6e 20 31 2c 20 63 68 65 63 6b 70 6f  ction 1, checkpo
9860: 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  int the database
9870: 2e 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a  . Make sure all.
9880: 23 20 20 20 20 20 20 74 68 65 20 64 61 74 61 20  #      the data 
9890: 69 73 20 70 72 65 73 65 6e 74 20 61 6e 64 20 74  is present and t
98a0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
98b0: 6f 74 20 63 6f 72 72 75 70 74 2e 0a 23 0a 23 20  ot corrupt..#.# 
98c0: 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c 20 53 51  At one point, SQ
98d0: 4c 69 74 65 20 77 61 73 20 66 61 69 6c 69 6e 67  Lite was failing
98e0: 20 74 6f 20 67 72 6f 77 20 74 68 65 20 6d 61 70   to grow the map
98f0: 70 69 6e 67 20 6f 66 20 74 68 65 20 77 61 6c 2d  ping of the wal-
9900: 69 6e 64 65 78 0a 23 20 66 69 6c 65 20 69 6e 20  index.# file in 
9910: 73 74 65 70 20 33 20 61 6e 64 20 74 68 65 20 63  step 3 and the c
9920: 68 65 63 6b 70 6f 69 6e 74 20 77 61 73 20 63 6f  heckpoint was co
9930: 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74  rrupting the dat
9940: 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 64 6f  abase file..#.do
9950: 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e 31 20 7b  _test wal-20.1 {
9960: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
9970: 73 65 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74  se}.  forcedelet
9980: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
9990: 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f  b-wal test.db-jo
99a0: 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 20  urnal.  sqlite3 
99b0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
99c0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
99d0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
99e0: 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45   WAL;.    CREATE
99f0: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
9a00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9a10: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
9a20: 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 53 45  ob(900));.    SE
9a30: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9a40: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 77 61  OM t1;.  }.} {wa
9a50: 6c 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  l 1}.do_test wal
9a60: 2d 32 30 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a  -20.2 {.  set ::
9a70: 62 75 64 64 79 20 5b 6c 61 75 6e 63 68 5f 74 65  buddy [launch_te
9a80: 73 74 66 69 78 74 75 72 65 5d 0a 20 20 74 65 73  stfixture].  tes
9a90: 74 66 69 78 74 75 72 65 20 24 3a 3a 62 75 64 64  tfixture $::budd
9aa0: 79 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  y {.    sqlite3 
9ab0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 64  db test.db.    d
9ac0: 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 20  b transaction { 
9ad0: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20  db eval {.      
9ae0: 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63  PRAGMA wal_autoc
9af0: 68 65 63 6b 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  heckpoint = 0;. 
9b00: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9b10: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
9b20: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
9b30: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 32 20 2a  t1;       /* 2 *
9b40: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
9b50: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
9b60: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
9b70: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
9b80: 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  4 */.      INSER
9b90: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
9ba0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
9bb0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
9bc0: 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e  /* 8 */.      IN
9bd0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
9be0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
9bf0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
9c00: 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20     /* 16 */.    
9c10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9c20: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
9c30: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
9c40: 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a         /* 32 */.
9c50: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9c60: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
9c70: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
9c80: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34   t1;       /* 64
9c90: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
9ca0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
9cb0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
9cc0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
9cd0: 2a 20 31 32 38 20 2a 2f 0a 20 20 20 20 20 20 49  * 128 */.      I
9ce0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
9cf0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
9d00: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
9d10: 20 20 20 20 2f 2a 20 32 35 36 20 2a 2f 0a 20 20      /* 256 */.  
9d20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9d30: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
9d40: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
9d50: 31 3b 20 20 20 20 20 20 20 2f 2a 20 35 31 32 20  1;       /* 512 
9d60: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
9d70: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
9d80: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
9d90: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
9da0: 20 31 30 32 34 20 2a 2f 0a 20 20 20 20 20 20 49   1024 */.      I
9db0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
9dc0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
9dd0: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
9de0: 20 20 20 20 2f 2a 20 32 30 34 38 20 2a 2f 0a 20      /* 2048 */. 
9df0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9e00: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
9e10: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
9e20: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 34 30 39  t1;       /* 409
9e30: 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  6 */.      INSER
9e40: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
9e50: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
9e60: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
9e70: 2f 2a 20 38 31 39 32 20 2a 2f 0a 20 20 20 20 20  /* 8192 */.     
9e80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9e90: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
9ea0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
9eb0: 20 20 20 20 20 20 2f 2a 20 31 36 33 38 34 20 2a        /* 16384 *
9ec0: 2f 0a 20 20 20 20 7d 20 7d 0a 20 20 7d 0a 7d 20  /.    } }.  }.} 
9ed0: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  {0}.do_test wal-
9ee0: 32 30 2e 33 20 7b 0a 20 20 63 6c 6f 73 65 20 24  20.3 {.  close $
9ef0: 3a 3a 62 75 64 64 79 0a 20 20 65 78 65 63 73 71  ::buddy.  execsq
9f00: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
9f10: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 65 78  heckpoint }.  ex
9f20: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
9f30: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
9f40: 7d 0a 7d 20 7b 31 36 33 38 34 7d 0a 64 6f 5f 74  }.} {16384}.do_t
9f50: 65 73 74 20 77 61 6c 2d 32 30 2e 34 20 7b 0a 20  est wal-20.4 {. 
9f60: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
9f70: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
9f80: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
9f90: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9fa0: 74 31 20 7d 0a 7d 20 7b 31 36 33 38 34 7d 0a 69  t1 }.} {16384}.i
9fb0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 77  ntegrity_check w
9fc0: 61 6c 2d 32 30 2e 35 0a 0a 63 61 74 63 68 20 7b  al-20.5..catch {
9fd0: 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74   db2 close }.cat
9fe0: 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
9ff0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 31 2e  .do_test wal-21.
a000: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
a010: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
a020: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
a030: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
a040: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
a050: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
a060: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
a070: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
a080: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
a090: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
a0a0: 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e  ES(3, 4);.    IN
a0b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
a0c0: 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 49  UES(5, 6);.    I
a0d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
a0e0: 4c 55 45 53 28 37 2c 20 38 29 3b 0a 20 20 20 20  LUES(7, 8);.    
a0f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
a100: 41 4c 55 45 53 28 39 2c 20 31 30 29 3b 0a 20 20  ALUES(9, 10);.  
a110: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
a120: 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29 3b   VALUES(11, 12);
a130: 0a 20 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f 5f  .  }.} {wal}.do_
a140: 74 65 73 74 20 77 61 6c 2d 32 31 2e 32 20 7b 0a  test wal-21.2 {.
a150: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
a160: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
a170: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41  ze = 10;.    PRA
a180: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
a190: 6e 74 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  nt;.    BEGIN;. 
a1a0: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
a1b0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
a1c0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
a1d0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 2c  randomblob(900),
a1e0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
a1f0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
a200: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 3b 0a 20  ROLLBACK TO s;. 
a210: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
a220: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
a230: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
a240: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
a250: 20 39 20 31 30 20 31 31 20 31 32 7d 0a 64 6f 5f   9 10 11 12}.do_
a260: 74 65 73 74 20 77 61 6c 2d 32 31 2e 33 20 7b 0a  test wal-21.3 {.
a270: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
a280: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
a290: 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 23 2d 2d  ck }.} {ok}..#--
a2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2e0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 72  -------.# Test r
a2f0: 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69  eading and writi
a300: 6e 67 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  ng of databases 
a310: 77 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 70  with different p
a320: 61 67 65 2d 73 69 7a 65 73 2e 0a 23 0a 66 6f 72  age-sizes..#.for
a330: 65 61 63 68 20 70 67 73 7a 20 7b 35 31 32 20 31  each pgsz {512 1
a340: 30 32 34 20 32 30 34 38 20 34 30 39 36 20 38 31  024 2048 4096 81
a350: 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20 36  92 16384 32768 6
a360: 35 35 33 36 7d 20 7b 0a 20 20 64 6f 5f 6d 75 6c  5536} {.  do_mul
a370: 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e  ticlient_test tn
a380: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
a390: 73 74 20 25 50 47 53 5a 25 20 24 70 67 73 7a 5d  st %PGSZ% $pgsz]
a3a0: 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77   {.    do_test w
a3b0: 61 6c 2d 32 32 2e 25 50 47 53 5a 25 2e 24 74 6e  al-22.%PGSZ%.$tn
a3c0: 2e 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20  .1 {.      sql1 
a3d0: 7b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41  {.        PRAGMA
a3e0: 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 20   main.page_size 
a3f0: 3d 20 25 50 47 53 5a 25 3b 0a 20 20 20 20 20 20  = %PGSZ%;.      
a400: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
a410: 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cuum = 0;.      
a420: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
a430: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
a440: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a450: 45 20 74 31 28 78 20 55 4e 49 51 55 45 29 3b 0a  E t1(x UNIQUE);.
a460: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
a470: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
a480: 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20  ndomblob(800);. 
a490: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
a4a0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
a4b0: 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20  domblob(800);.  
a4c0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
a4d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
a4e0: 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20  omblob(800);.   
a4f0: 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d     }.    } {wal}
a500: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
a510: 2d 32 32 2e 25 50 47 53 5a 25 2e 24 74 6e 2e 32  -22.%PGSZ%.$tn.2
a520: 20 7b 20 73 71 6c 32 20 7b 20 50 52 41 47 4d 41   { sql2 { PRAGMA
a530: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
a540: 20 7d 20 7d 20 7b 6f 6b 7d 0a 20 20 20 20 64 6f   } } {ok}.    do
a550: 5f 74 65 73 74 20 77 61 6c 2d 32 32 2e 25 50 47  _test wal-22.%PG
a560: 53 5a 25 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  SZ%.$tn.3 {.    
a570: 20 20 73 71 6c 31 20 7b 50 52 41 47 4d 41 20 77    sql1 {PRAGMA w
a580: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 7d 0a 20  al_checkpoint}. 
a590: 20 20 20 20 20 65 78 70 72 20 7b 5b 66 69 6c 65       expr {[file
a5a0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 25   size test.db] %
a5b0: 20 25 50 47 53 5a 25 7d 0a 20 20 20 20 7d 20 7b   %PGSZ%}.    } {
a5c0: 30 7d 0a 20 20 7d 5d 0a 7d 0a 0a 23 2d 2d 2d 2d  0}.  }].}..#----
a5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a610: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
a620: 74 20 77 68 65 6e 20 31 20 6f 72 20 6d 6f 72 65  t when 1 or more
a630: 20 70 61 67 65 73 20 61 72 65 20 72 65 63 6f 76   pages are recov
a640: 65 72 65 64 20 66 72 6f 6d 20 61 20 57 41 4c 20  ered from a WAL 
a650: 66 69 6c 65 2c 20 0a 23 20 73 71 6c 69 74 65 33  file, .# sqlite3
a660: 5f 6c 6f 67 28 29 20 69 73 20 69 6e 76 6f 6b 65  _log() is invoke
a670: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73  d to report this
a680: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 0a 23 0a   to the user..#.
a690: 73 65 74 20 77 61 6c 66 69 6c 65 20 5b 66 69 6c  set walfile [fil
a6a0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
a6b0: 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 5d 20 74 65  le join [pwd] te
a6c0: 73 74 2e 64 62 2d 77 61 6c 5d 5d 0a 63 61 74 63  st.db-wal]].catc
a6d0: 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72  h {db close}.for
a6e0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
a6f0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e  .do_test wal-23.
a700: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
a710: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
a720: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a730: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
a740: 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47  (a, b);.    PRAG
a750: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
a760: 3d 20 57 41 4c 3b 0a 20 20 20 20 49 4e 53 45 52  = WAL;.    INSER
a770: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
a780: 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 2);.    INSE
a790: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
a7a0: 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 66  S(3, 4);.  }.  f
a7b0: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
a7c0: 5f 63 6c 6f 73 65 0a 0a 20 20 73 71 6c 69 74 65  _close..  sqlite
a7d0: 33 5f 73 68 75 74 64 6f 77 6e 0a 20 20 74 65 73  3_shutdown.  tes
a7e0: 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 20 5b 6c  t_sqlite3_log [l
a7f0: 69 73 74 20 6c 61 70 70 65 6e 64 20 3a 3a 6c 6f  ist lappend ::lo
a800: 67 5d 0a 20 20 73 65 74 20 3a 3a 6c 6f 67 20 5b  g].  set ::log [
a810: 6c 69 73 74 5d 0a 20 20 73 71 6c 69 74 65 33 20  list].  sqlite3 
a820: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
a830: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
a840: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32  FROM t1 }.} {1 2
a850: 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61   3 4}.do_test wa
a860: 6c 2d 32 33 2e 32 20 7b 20 73 65 74 20 3a 3a 6c  l-23.2 { set ::l
a870: 6f 67 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74  og } {}..do_test
a880: 20 77 61 6c 2d 32 33 2e 33 20 7b 0a 20 20 64 62   wal-23.3 {.  db
a890: 20 63 6c 6f 73 65 0a 20 20 73 65 74 20 3a 3a 6c   close.  set ::l
a8a0: 6f 67 20 5b 6c 69 73 74 5d 0a 20 20 66 61 75 6c  og [list].  faul
a8b0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
a8c0: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
a8d0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
a8e0: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20  M t1 }.} {1 2 3 
a8f0: 34 7d 0a 73 65 74 20 6e 50 61 67 65 20 5b 65 78  4}.set nPage [ex
a900: 70 72 20 32 2b 24 41 55 54 4f 56 41 43 55 55 4d  pr 2+$AUTOVACUUM
a910: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33  ].do_test wal-23
a920: 2e 34 20 7b 20 0a 20 20 73 65 74 20 3a 3a 6c 6f  .4 { .  set ::lo
a930: 67 20 0a 7d 20 5b 6c 69 73 74 20 53 51 4c 49 54  g .} [list SQLIT
a940: 45 5f 4f 4b 20 22 52 65 63 6f 76 65 72 65 64 20  E_OK "Recovered 
a950: 24 6e 50 61 67 65 20 66 72 61 6d 65 73 20 66 72  $nPage frames fr
a960: 6f 6d 20 57 41 4c 20 66 69 6c 65 20 24 77 61 6c  om WAL file $wal
a970: 66 69 6c 65 22 5d 0a 0a 0a 69 66 63 61 70 61 62  file"]...ifcapab
a980: 6c 65 20 61 75 74 6f 76 61 63 75 75 6d 20 7b 0a  le autovacuum {.
a990: 20 20 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 74    # This block t
a9a0: 65 73 74 73 20 74 68 61 74 20 69 66 20 74 68 65  ests that if the
a9b0: 20 73 69 7a 65 20 6f 66 20 61 20 64 61 74 61 62   size of a datab
a9c0: 61 73 65 20 69 73 20 72 65 64 75 63 65 64 20 62  ase is reduced b
a9d0: 79 20 61 20 0a 20 20 23 20 74 72 61 6e 73 61 63  y a .  # transac
a9e0: 74 69 6f 6e 20 28 62 65 63 61 75 73 65 20 6f 66  tion (because of
a9f0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
aa00: 6f 72 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  or auto-vacuum),
aa10: 20 74 68 61 74 20 6e 6f 0a 20 20 23 20 64 61 74   that no.  # dat
aa20: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
aa30: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 66 6f 72  the WAL file for
aa40: 20 74 68 65 20 74 72 75 6e 63 61 74 65 64 20 70   the truncated p
aa50: 61 67 65 73 20 61 73 20 70 61 72 74 0a 20 20 23  ages as part.  #
aa60: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 69 74 2e 20   of the commit. 
aa70: 65 2e 67 2e 20 69 66 20 61 20 74 72 61 6e 73 61  e.g. if a transa
aa80: 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68  ction reduces th
aa90: 65 20 73 69 7a 65 20 6f 66 20 61 20 64 61 74 61  e size of a data
aaa0: 62 61 73 65 0a 20 20 23 20 74 6f 20 4e 20 70 61  base.  # to N pa
aab0: 67 65 73 2c 20 64 61 74 61 20 66 6f 72 20 70 61  ges, data for pa
aac0: 67 65 20 4e 2b 31 20 73 68 6f 75 6c 64 20 6e 6f  ge N+1 should no
aad0: 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
aae0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 0a 20 20  the WAL file .  
aaf0: 23 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  # when committin
ab00: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
ab10: 6e 2e 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  n. At one point 
ab20: 73 75 63 68 20 64 61 74 61 20 77 61 73 20 62 65  such data was be
ab30: 69 6e 67 20 0a 20 20 23 20 77 72 69 74 74 65 6e  ing .  # written
ab40: 2e 0a 20 20 23 0a 20 20 63 61 74 63 68 20 7b 64  ..  #.  catch {d
ab50: 62 20 63 6c 6f 73 65 7d 0a 20 20 66 6f 72 63 65  b close}.  force
ab60: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20  delete test.db. 
ab70: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
ab80: 2e 64 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  .db.  do_execsql
ab90: 5f 74 65 73 74 20 32 34 2e 31 20 7b 0a 20 20 20  _test 24.1 {.   
aba0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
abb0: 75 75 6d 20 3d 20 32 3b 0a 20 20 20 20 50 52 41  uum = 2;.    PRA
abc0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
abd0: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 50 52 41 47   = WAL;.    PRAG
abe0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
abf0: 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20  024;.    CREATE 
ac00: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
ac10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ac20: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
ac30: 62 28 35 30 30 30 29 29 3b 0a 20 20 20 20 49 4e  b(5000));.    IN
ac40: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
ac50: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
ac60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
ac70: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
ac80: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
ac90: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
aca0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
acb0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
acc0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
acd0: 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73  } {wal}.  do_tes
ace0: 74 20 32 34 2e 32 20 7b 20 0a 20 20 20 20 65 78  t 24.2 { .    ex
acf0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45  ecsql {.      DE
ad00: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
ad10: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
ad20: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 7d  heckpoint;.    }
ad30: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
ad40: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
ad50: 74 2e 64 62 0a 20 20 20 20 66 69 6c 65 20 65 78  t.db.    file ex
ad60: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
ad70: 0a 20 20 7d 20 30 0a 20 20 64 6f 5f 74 65 73 74  .  } 0.  do_test
ad80: 20 32 34 2e 33 20 7b 0a 20 20 20 20 66 69 6c 65   24.3 {.    file
ad90: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20   size test.db.  
ada0: 7d 20 5b 65 78 70 72 20 38 34 20 2a 20 31 30 32  } [expr 84 * 102
adb0: 34 5d 0a 20 20 64 6f 5f 74 65 73 74 20 32 34 2e  4].  do_test 24.
adc0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
add0: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
ade0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 32 30 30  cache_size = 200
adf0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69  ;.      PRAGMA i
ae00: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
ae10: 6d 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  m;.      PRAGMA 
ae20: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
ae30: 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73      }.    file s
ae40: 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20  ize test.db.  } 
ae50: 5b 65 78 70 72 20 33 20 2a 20 31 30 32 34 5d 0a  [expr 3 * 1024].
ae60: 0a 20 20 23 20 57 41 4c 20 66 69 6c 65 20 6e 6f  .  # WAL file no
ae70: 77 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  w contains a sin
ae80: 67 6c 65 20 66 72 61 6d 65 20 2d 20 74 68 65 20  gle frame - the 
ae90: 6e 65 77 20 72 6f 6f 74 20 70 61 67 65 20 66 6f  new root page fo
aea0: 72 20 74 61 62 6c 65 20 74 31 2e 0a 20 20 23 20  r table t1..  # 
aeb0: 49 74 20 77 6f 75 6c 64 20 62 65 20 74 77 6f 20  It would be two 
aec0: 66 72 61 6d 65 73 20 28 74 68 65 20 6e 65 77 20  frames (the new 
aed0: 72 6f 6f 74 20 70 61 67 65 20 61 6e 64 20 61 20  root page and a 
aee0: 70 61 64 64 69 6e 67 20 66 72 61 6d 65 29 20 69  padding frame) i
aef0: 66 20 74 68 65 0a 20 20 23 20 5a 45 52 4f 5f 44  f the.  # ZERO_D
af00: 41 4d 41 47 45 20 66 6c 61 67 20 77 65 72 65 20  AMAGE flag were 
af10: 6e 6f 74 20 73 65 74 2e 0a 20 20 64 6f 5f 74 65  not set..  do_te
af20: 73 74 20 32 34 2e 35 20 7b 0a 20 20 20 20 66 69  st 24.5 {.    fi
af30: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
af40: 77 61 6c 0a 20 20 7d 20 5b 77 61 6c 5f 66 69 6c  wal.  } [wal_fil
af50: 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a 7d  e_size 1 1024].}
af60: 0a 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74  ..db close.sqlit
af70: 65 33 5f 73 68 75 74 64 6f 77 6e 0a 74 65 73 74  e3_shutdown.test
af80: 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 0a 73 71 6c  _sqlite3_log.sql
af90: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 0a  ite3_initialize.
afa0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.